rrcov/0000755000176200001440000000000014201201363011375 5ustar liggesusersrrcov/NAMESPACE0000644000176200001440000001160614174335756012647 0ustar liggesusersuseDynLib(rrcov, .registration=TRUE) importFrom(stats4, plot, summary) importFrom(methods, show) importFrom("methods", "slot", "slotNames") importFrom("methods", "is", "new") importFrom(lattice, xyplot, panel.xyplot, panel.abline, ltext) importFrom(mvtnorm, rmvnorm) importFrom("grDevices", "dev.interactive", "palette", "dev.flush", "dev.hold") importFrom("graphics", "abline", "arrows", "axis", "box", "hist", "legend", "lines", "pairs", "par", "points", "rect", "strwidth", "text", "title", "barplot") importFrom("stats", ".getXlevels", "cor", "cov", "cov.wt", "cov2cor", "IQR", "dchisq", "density", "dnorm", "ecdf", "mad", "mahalanobis", "median", "model.matrix", "model.response", "na.fail", "pchisq", "pf", "pgamma", "pnorm", "princomp", "qchisq", "qf", "qnorm", "quantile", "rnorm", "runif", "sd", "terms", "uniroot", "var", "setNames") importFrom("utils", "combn") import(robustbase, pcaPP) export(CovClassic, Cov, CovRobust, CovMcd, CovMrcd, CovMrcd, CovMest, CovOgk, CovMve, CovSest, CovSde, CovMMest, CovControlMcd, CovControlMrcd, CovControlMest, CovControlOgk, CovControlMve, CovControlSest, CovControlSde, CovControlMMest, covMest, T2.test, Wilks.test, PcaClassic, PcaHubert, PcaLocantore, PcaCov, PcaProj, PcaGrid, LdaClassic, Linda, LdaPP, QdaClassic, QdaCov, pca.scoreplot, pca.distances, myscreeplot, mtxconfusion, sqrtm, vecnorm, getEllipse ) ##S3 generics S3method(T2.test, default) S3method(T2.test, formula) S3method(Wilks.test, default) S3method(Wilks.test, formula) S3method(Wilks.test, data.frame) S3method(Wilks.test, matrix) S3method(PcaClassic, default) S3method(PcaClassic, formula) S3method(PcaHubert, default) S3method(PcaHubert, formula) S3method(PcaLocantore, default) S3method(PcaLocantore, formula) S3method(PcaCov, default) S3method(PcaCov, formula) S3method(PcaProj, default) S3method(PcaProj, formula) S3method(PcaGrid, default) S3method(PcaGrid, formula) S3method(LdaClassic, default) S3method(LdaClassic, formula) S3method(Linda, default) S3method(Linda, formula) S3method(LdaPP, default) S3method(LdaPP, formula) S3method(QdaClassic, default) S3method(QdaClassic, formula) S3method(QdaCov, default) S3method(QdaCov, formula) ## S4 generics export(isClassic, getCenter, getScale, getCov, getCorr, getData, getDistance, getEvals, getMeth, getDet, getShape, getFlag, restimate, getQuan, getLoadings, getEigenvalues, getSdev, getScores, getPrcomp, scorePlot, getRaw, isSingular ) exportClasses(Cov, CovClassic, CovRobust, CovMcd, CovMest, CovOgk, CovMve, CovSest, CovSde, CovMMest, CovControl, CovControlMcd, CovControlMrcd, CovControlMest, CovControlOgk, CovControlMve, CovControlSest, CovControlSde, CovControlMMest, SummaryCov, SummaryCovRobust, Pca, PcaClassic, PcaRobust, PcaHubert, PcaLocantore, PcaCov, PcaProj, PcaGrid, SummaryPca, Lda, LdaClassic, LdaRobust, Linda, LdaPP, PredictLda, SummaryLda, Qda, QdaClassic, QdaRobust, QdaCov, PredictQda, SummaryQda, Ulist, Uvector, Utable, Umatrix, Ufunction ) exportMethods(isClassic, getCenter, getScale, getCov, getCorr, getData, getDistance, getEvals, getMeth, getDet, getFlag, getShape, plot, show, summary, restimate, getQuan, getLoadings, getEigenvalues, getSdev, getScores, getPrcomp, predict, screeplot, biplot, scorePlot, getRaw, isSingular, names ) rrcov/ChangeLog0000644000176200001440000006546714200564226013202 0ustar liggesusers2022-02-08 Valentin Todorov * * DESCRIPTION (Version): 1.6-2 * * tests/thubert.R - minor differences in tests for PcaProj() on some platforms fixed * Examples for PCA/adjustment for skewed data and PCA/percentage of explained * variance added * R/Pca.R: scorePlot() improved to show the labels of the samples * 2022-01-28 Valentin Todorov * * DESCRIPTION (Version): 1.6-1 * * data/fruit.rda - data set added * * man/*.Rd - URLs replaced by DOI to fix for the migration of the www.jstatsoft.org * to a new editorial system (see mail from Achim Zeileis from 06.10.2021) * * R/Pca*.R - fixed a problem when showing the percentage of explained variance in * summary() of all PCA functions when k is chosen to be less than the number of variables in the * input data matrix (k < p). The returned object contains now additionally * the rank of the input matrix, the original eigenvalues (of all variables) * and the original total variance, if available. 2021-09-15 Valentin Todorov * * DESCRIPTION (Version): 1.6-0 * * R/PcaHubert.R - option for adjusted outlyingness for skewed data added * data/machines.rda - data set Computer Hardware added * data/wolves.rda - data set 'wolves' added * Fixed some URLs, particularly the reference to javasoft.org 2020-08-03 Valentin Todorov * * DESCRIPTION (Version): 1.5-5 * * R/PcaHubert.R - PcaHubert will crash if X is 1-dimensional and mcd=FALSE: fixed * R/PcaProj.R - fixed a problem with wrong scores (reported by Matthieu Lesnoff ) * R/CovMve.R, CovSest.R - fixed a problem with nsamp="exact" or nsamp="best" * (reported by Claudio Agostinelli) - these functions, differently from CovMcd, * should not take non-numeric 'nsamp' * tests/tlda.R, togk4.R: fixed 'noLD' issues in tlda.R and okg4.R * 2020-01-14 Valentin Todorov * * DESCRIPTION (Version): 1.5-2 * * R/getEllipse.R - Removed the dependence on packages 'cluster' and 'ellipse' * R/Linda - added parameter 'control' to select the robust location and * covariance estimator to use in LDA. Now any estimator derived from class 'Cov' * can be used, even such that are not in 'rrcov'. Return this parameter in the * returned S4 object. * * R/Linda - return the location and covariance estimator used as 'covobj'. This * is useful for controlling cross-validation, for example. * * R/Lda.R - fixed an issue in predict function * * R/LdaClassic, R/Linda - use generalized inverse if the common covariance * matrix is singular. * 2019-11-25 Valentin Todorov * * DESCRIPTION (Version): 1.4-9 * DESCRIPTION (Version): 1.4-8 * * - Added data set \code{diabetes}; data set \code{soil} from package \code{rrcovHD} moved here. * - Linear and quadratic discriminant analysis can use the MRCD estimates. * - Fixed an issue with CovControlMcd(nsamp="deterministic") - this would not work, * because nsamp was defined in the class definition as "numeric". Now it is * "Cnumeric" - union of "character" and "numeric'. * - Corrected the code for Minimum Regularized Covariance Determinant estimator (MRCD) - * \code{CovMrcd()} - the step of adjusting the eignevalues in r6pack() is excluded * now because it has no effect when n > p. * 2018-11-14 Valentin Todorov * * DESCRIPTION (Version): 1.4-7 * DESCRIPTION (Version): 1.4-6 * * R/CovMrcd.R, CovControlMrcd.R: added Minimum Regularized Covariance * Determinant estimator (MRCD) (Boudt et al. 2018) * * data/octane.rda, man/octane.Rd - octane data set added * data/olitos.rda, man/olitos.Rd - olitos data set moved from package rrcovHD * * R/CovClassic.R, plot-utils.R: make the 'pairs' plot also * available for classical covariance matrix * 2018-05-20 Valentin Todorov * * DESCRIPTION (Version): 1.4-4 * * vignettes/mybiblio.bib: Fixed issue with building * the vignette: non-ascii symbols in .bib * (see mail from K. Hornik from 14.05.2018) * src/rrcov_init.c: Registration of native routines * 2016-09-03 Valentin Todorov * * DESCRIPTION (Version): 1.4-3 * DESCRIPTION (Version): 1.4-2 * * src/sest.c: Warning reported by Duncan Murdoch: if(fabs(t <= cc)) * 2016-08-19 Valentin Todorov * * DESCRIPTION (Version): 1.4-1 * * R/Pca.R, PcaCov.R, PcaHubert.R, PcaLocantore.R, PcaClasic.R: * fixed a bug when scale != FALSE. * Now scale can be also a function or a vector with length p. * 2016-08-05 Valentin Todorov * * DESCRIPTION (Version): 1.4-0 * * R/PcaCov.R, Pca.R: fixed a bug when scale != FALSE; the call to princomp() * replaced by an internal function (simplified princomp()) * * R/Pca.R: fixed a bug when scale != FALSE - computing OD .distances() * * R/Linda.R: added argument l1med=FALSE - if set to TRUE, the L1 median * will be used for centering the data in mcdB and mcdC methods * 2016-02-10 Valentin Todorov * * DESCRIPTION (Version): 1.3-10 * * R/CovSest.r: additional trace for Rocke S-estimates * R/Pca.R, Allclasses.R, etc.: Add the quantile cut-off for computing the OD and SD distances in PCA as a parameter * R/PcaCov.R, etc.: Automatic selection of components with k=0 * * 2015-11-28 Valentin Todorov * * DESCRIPTION (Version): 1.3-9 * * 2015-07-07 * R/Pca.R, man/biplot.rd: The missing parameter choices= added to biplot() * * R/PcaXxx.R, man/PcaXxx.rd: added a parameter crit.pca.distances to be used * for computing the score and orthogonal distances. This parameter is stored * in the Pca-class object * * R/PcaXxx.R, man/PcaXxx.rd (except Grid and Proj): selection of number of * components fixed, see Help. * 2014-11-23 Valentin Todorov * * DESCRIPTION (Version): 1.3-7 * * src/sest.c: fixed an issue (reported by Stefan van Aelst) * in computing S-estimates, related to improper * calculation of the rank of a matrix with q() * 2014-11-05 Valentin Todorov * * DESCRIPTION (Version): 1.3-6 * * R/CovSest.R, dets.R, AllClasses.R, CovControl.R: added Deterministic S as * an option to CovSest (method="sdet"), function ..detSloc(), * new parameters and new slots in class CovSest. * * R/Pca.R, PcaClassic.R, pcaHubert.R: the internal functions classSVD() * and kernelEVD() are replaced by function classPC() which is moved * to robustbase * * R/CovMcd.R, AllClasses.R, CovControl.R - deterministic MCD, with nsamp="deterministic", * new parameters and new slots in class CovMcd * * tests/tsest.R: added tests method="sdet" * * R/CovSde, man/CovSde.Rd: a bug, when number of variables * too large, fixed. The number of variables is used to calculate * the necessary number of samples. If this number is large than * .Machine$integer.max an error message, saying NAs passed to * an external function was issued. Now the nsamp <= .Machine$integer.max * and in the documentation is explained that CovSde() can be used only * with relatively small data sets. * * R/CovMest3.R, man/CovMest3.Rd - function deprecated, * replaced by the one return ing an S4 class, CovMest(). * tests/tmest.R removed. * * TODO: fix a bug in C version of sfast * TODO fix a crash in CovOgk with a singular matrix * * 2013-09-01 Valentin Todorov * 1.3-5 * * R/Pca.R - definition of a print() method removed * Use suppressPackageStartupMessages(library(rrcov)) in the tests * * R/CovOgk.R - bug fixed (Chris Green): a data set with 0 (complete) rows * (n=0) would crash R with access violation * * R/CovClassic.R - the restriction "Need at least p=(number of variables) * observations" removed * * man/PcaHubert.Rd - % signs in the examples were not escaped and part of the * statements was missing * 2013-08-19 Valentin Todorov * 1.3-4 * * Changes, mainly to fix warnings in packages rrcovNA and rrcovHD * * Generic and method scoreplot changed to scorePlot to avoid * conflict with package pls * * Vignette moved to directory .\vignettes, as recommended in * the 'Writing R Extensions' manual * * NOTE "Namespace imported from by a ':::' call: ..." fixed for all * but two robustbase calls. * * Packages 'mvtnorm' and 'pcaPP' moved from Depends to Import and the particular * functions used are only imported (rmvnorm from 'mvtnorm' and PCAgrid * and PCAproj from 'pcaPP') * 2013-04-28 Valentin Todorov * 1.3-3 * * SRC/ds11.f: Fortran array bound check error fixed * * R/zzz.R: on.Load() replaced by on.Attach() to suppress a NOTE * * R/Pca.R: Fixed a problem in pca.scoreplot() - the ellipse was not * properly shown in case for example of PP PCA, when the scores can be correlated. 2012-06-10 Valentin Todorov * 1.3-02 * * R/Linda.R: Fixed a problem with array over-run in .Fortran("fsada") in integer argument 14 * * Method getRaw() for CovMcd, CovMve and CovOgk added * Union S4 classes Uvector, Umatrix, Ulist, Ufunction, Utable exported * in the name space * T2.test() fixed - the F statistic was shown but titled as "T^2". Now both * T2 and F are shown * 2011-06-26 Valentin Todorov * 1.3-01 * * Fix for LdaPP() * 2011-05-05 Valentin Todorov * 1.3-00 * * Added LdaPP() and the related classes - see Pires and Branco (2010) * 2011-04-30 Valentin Todorov * 1.2-02 * * R/plot-methods.R: fixed the pairs-plot for Cov objects - on the diagonal * were shown not the variable names but Var1, var2, etc. * * R/Pca.R, AllGenerics.R, Man/scoreplot.rda, pca.scoreplot.rda: * the internal function pca.scoreplot()is defined now in the namespace, * help is added and corresponding method/generic scoreplot() function * is defined too. * * Data/pottery.rda, Man/pottery.rd: added the pottery data set - * see Pires and Branco (2010) * * 2011-04-04 Valentin Todorov * 1.2-00 * R/CovSest.R, CovMMest.R, man/* - added slots for the tuning constants of * the S- and MM-loss functions. The functions for calculating these * constants (.csolve.bw.S() and .csolve.bw.MM() are not exported but the * user could access them using rrcov:::.csolve.bw.S() call * data/wages.rda - Added data set Wages and Hours * R/Pca.R - fixed the cutoff for the orthogonal distances (diagnostic plot)- * univariate MCD replaced by median and MAD 2010-08-30 Valentin Todorov * 1.1-00 * src/ds11.f - fixed a problem with CovSde for p=1 (i.e. option p=1 implemented) * R/CovSest.R, man/CovSest.Rd - default number of samples 'nsamp' for method='sfast' * changed to nsamp=20 * Added MM-estimates of location and scatter * Added methods getDet(), getShape() and getDflag() for objects of class 'Cov' * C implementation of the FAST-S estimates * signflip and scale parameters added to PcaHubert() and PcaCov() 2010-06-20 Valentin Todorov * 1.0-01 * data/rice.Rda, man/rice.Rd: Rice data set added * * R/PcaHubert.R - fixed a minor problem - see VT::14.12.2009 * * src/fsada.f: fixed a problem in Linda with method 'fsa' - * number of cases was limited to 500 and number of * variables to 100 without error message * R/Linda.R, man/Linda.Rd, src/fsada.f - added 'trace' parameter * * R/Allclasses.R, AllGenerics.R, PcaClassic.R, PcaLocantore.R, * RcaHubert.R, Pca.R, man/PcaClassic.Rd, PcaLocantore.Rd, * PcaClassic-class.Rd, PcaLocantore-class.Rd, Pca-class.Rd: * - added sign flipping for the loadings, controlled by a * signflip=TRUE parameter * - added a scale slot in Pca class and scale=FALSE parameter in * PcaClassic() and PcaLocantore() * * R/plot-utils.R, CovRobust.R, CovClassic: * - additional graphics parameters for the plot methods are available now, e.g. * different colors or different symbols for the different groups * - it is possible to provide custom labels for the id.n observations * - pairs-plot for more than 2 variables * 2009-10-10 Valentin Todorov * 1.0-00 * CITATION to the JSS paper added * Rd files updated to refer to the JSS paper * vignette added * ********************************************************** 2009-09-29 Valentin Todorov * 0.5-03 * citation file added * PcaCov can compute the classical estimates (cov.control=NULL) * 2009-07-21 Valentin Todorov * 0.5-02 * Defaults of CovRobust() changed * Corrections in some help pages * Biplot implemented as a method of class PCA (generic function biplot) * 2009-02-20 Valentin Todorov * 0.5-01 * * Added Quadratic Discriminant Abalyis: Qda, SummaryQda, * PredictQda, QdaClassic, QdaRobust and QdaCov * 2009-02-14 Valentin Todorov * 0.5-00 * * Added Stahel-Donoho estimator of multivariate location and scatter * CovSde 2009-01-14 Valentin Todorov * 0.4-08 * * data/salmon - data set added * Added Robust Linear Discriminant Analysis: * R/AllClasses, R/Lda.R, R/LdaClassic.R, R/Linda.R * and the corresponding manual pages: man/Lda*.Rd * * Added PP-approach PCA methods PcaProj and PcaGrid (see package pcaPP): * R/AllClasses, R/PcaProj.R, R/PcaGrid.R * and the corresponding manual pages: man/PcaProj*.Rd, man/PcaGrid*.Rd * 2008-07-04 Valentin Todorov * 0.4-07 * * data/un86 - data set added * * R/CovRobust.R - function to select a robust estimator added * * R/CovSest.R, man/CovSest.Rd, R/CovControlSest.R, man/CovControlSest.Rd - * added two more estimation methods for the S estimates: bisqauare and * Rocke type, as described in Maronna et al. (2006) - thanks to Matias * Salibian-Barrera for the provided code. * * R/CovMve.R, man/CovMve.Rd - now the raw cov matrix is properly scaled by * a factor median(dist)/qchisq(0.5, p) and the reweighted cov matrix is * multiplied by a consistency corretcion factor, similarly as in CovMcd(). * No finite sample correction factors are used. For details see ?CovMve. * * man/CovMve.Rd - the search for the approximate solution is explained * (fast MVE) and the corresponding referecne (Maronna et al., 2006) is given. * * R/CovMest.R, man/CovMest.Rd - the default initial value now is the raw * (not reweighted) MVE estimate with the covariance matrix standardised * to det(cov)=1 * * R/CovOgk.R, man/CovOgk.RD, src/covOPW.c, R/CovControlOgk.R, man/CovControlOgk.R * Added a C implementation for OGK - thanks to Kjell Konis. * See ?CovOgk for details * * R/plot-utils.R - fixed a bug in plot(CovMcd(x), which="tolEllipsePlot", id.n=0) - * even if id.n was set to 0, at least one observation was plotted with a label * 2008-06-02 Valentin Todorov * 0.4-06 * Added the 'bushmiss' - a group of data sets based on 'bushfire' * with added incompliteness (MCAR) with probability 0.1, * 0.2, 0.3 and 0.4 * Fixed minor errors in the documentation * Added PCA based on robust cov matrix - PcaCov * Added Spherical PCA algorithm - PcaLocantore * Added 'bus' data set - Automatic vehicle recognition data * as an illustration for the PCA methods. The examples reproduce * the corresponding examples from Maronna et al. (2006), page 213 2007-02-12 Valentin Todorov * 0.4-05 * Added the OsloTransect data set * Fixed minor errors in the documentation * Fixed two serious problems in .fastMve() - there was a * hard-coded seed setting and the half-sample was hardcoded too * Added S-estimates computed by either the FAST-S algorithm or * Ruppert's SURREAL 2007-11-10 Valentin Todorov * 0.4-03 * R/plot-utils.R - "Squared Robust distance" changed to "Robust distance", * added ylim parameter so that two parallel distance plots * (robust and classic) will have the same scale * man/getCenter-methods.Rd - there was an 'unmatched right brace' in line 34 - * shown as 'Note' in "R CMD install" but not in "R CMD check" * R/CovRobust.R - method 'plot' - make robust and classic distance * plot same scale * Added function Cov() as an alias to CovClassic() for compatibility with * previous versions * Function and class Robpca changed to PcaHubert - Robpca was too general * Added methods predict, screeplot and biplot for Pca 2007-10-24 Valentin Todorov * 0.4-02 * Fixed the OO-hierarchy for robust location and scatter: now * Cov is a VIRTUAL class and CovClassic added for representing * the classic estimates * CovMve added, to be used as initial solution for CovMest 2007-09-28 Valentin Todorov * 0.4-01 * Removed covMcd, ltsReg and all datasets which were already moved to * package robustbase. Now package robustbase is required and these * functions are used from there. This could cause some minor * incompatibilities because of changed parameters in covMcd(), like: * - trace=FALSE instead of print.it=FALSE * - seed=NULL instead of seed=0 * - changed structure and names of datasets 2007-09-24 Valentin Todorov * 0.3-08 * Added ROBPCA - Robust Principal Component Analysis - with an * S4 object model R/Pca.R, R/PcaClassic, R/Robpca and * man/Pca-class.RD, man/PcaRobust-class.Rd, man/PcaClassic-class.RD * man/Robpca-class.RD, man/PcaClassic.RD, man/Robpca.RD 2007-09-20 Valentin Todorov * 0.3-07 * Added classical and robust Wilks Lambda test - R/Wilks.test.R and * man/Wilks.test.RD 2007-07-05 Valentin Todorov * 0.3-06 * Added one- and two-sample T2 Hotelling test and one-sample * robust T2 Hotelling test (Willems et al. 2002) - R/T2.test.R and * man/T2.test.RD * 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) * Added the L-moments data sets from Hosking and Wallis (1997): * Appalachia, Cascades, lmom32 and lmom33 * Fixed print.mcd() to avoid conflict with package 'robust' * (same class "mcd") * R/covMcd.R - the calculation of the consistency correction factor * for the raw and reweighted MCD covariance replaced by a call to * a function MCDcons() * R/CovRobust.R, Cov.R, AllGenerics.R, utils.R - fixed the plot * method of CovRobust in case of singular covariance matrix 2006-12-21 Valentin Todorov * 0.3-05 * fixed a bug in ltsReg (in the QQ-plot were plotted the residuals instead * of the standardized reisuals) * added dataset 'Fish Catch Data' * added dataset 'Hemophilia' 2006-09-07 Valentin Todorov * 0.3-04 * name the partial= argument of the sort function in covMcd3.R - * necessary for the coming R 2.4.0 2006-07-08 Valentin Todorov * 0.3-03 * Remove CRLF line endings of the files *.Rout.save in rrcov/tests directory 2006-06-01 Valentin Todorov * 0.3-02 * add CovControlMcd function and CovControlMcd-class * add CovMcd function and CovMcd-class * add CovControlOgk function and CovControlOgk-class * add CovOgk function and CovOgk-class 2006-05-21 Valentin Todorov * 0.3-01 * NAMESPACE: add importFrom(stats4, plot, summary) * add Marona and Yohai data set * add Cov function and Cov-class * add CovControl-class * add CovControlMest function and CovControlMest-class * add CovRobust-class * add CovMest function and CovMest-class 2006-03-13 Valentin Todorov * 0.2-13 * defined package namespace * added constrained M-estimates (Rocke (1994,1996)) 2006-02-10 Valentin Todorov * 0.2-12 * FIXED - .fastmcd and fastlts does not return everything * fixed problems in ltsReg in case of location model Y~1 (or x is missing in ltsReg.default()) 2006-02-06 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 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 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 rrcov/README.md0000644000176200001440000000517114174743204012676 0ustar liggesusers # `rrcov`: Scalable Robust Estimators with High Breakdown Point [![CRAN version](https://www.r-pkg.org/badges/version/rrcov)](https://cran.r-project.org/package=rrcov) [![R-CMD-check](https://github.com/valentint/rrcov/workflows/R-CMD-check/badge.svg)](https://github.com/valentint/rrcov/actions) [![downloads](https://cranlogs.r-pkg.org/badges/rrcov)](https://cran.r-project.org/package=rrcov) [![license](https://img.shields.io/badge/license-GPL--3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html) The package `rrcov` provides scalable robust estimators with high breakdown point and covers a large number of robustified multivariate analysis methods, starting with robust estimators for the multivariate location and covariance matrix (MCD, MVE, S, MM, SD), the deterministic versions of MCD, S and MM estimates and regularized versions (MRCD) for high dimensions. These estimators are used to conduct robust principal components analysis (`PcaCov()`), linear and quadratic discriminant analysis (`Linda()`, `Qda()`), MANOVA. Projection pursuit algorithms for PCA to be applied in high dimensions are also available (`PcaHubert()`, `PcaGrid()` and `PcaProj()`). ## Installation The `rrcov` package is on CRAN (The Comprehensive R Archive Network) and the latest release can be easily installed using the command install.packages("rrcov") library(rrcov) ## Building from source To install the latest stable development version from GitHub, you can pull this repository and install it using ## install.packages("remotes") remotes::install_github("valentint/rrcov" --no-build-vignettes) Of course, if you have already installed `remotes`, you can skip the first line (I have commented it out). ## Example This is a basic example which shows you if the package is properly installed: ``` r library(rrcov) #> Loading required package: robustbase #> Scalable Robust Estimators with High Breakdown Point (version 1.6-1) data(hbk) (out <- CovMcd(hbk)) #> #> Call: #> CovMcd(x = hbk) #> -> Method: Fast MCD(alpha=0.5 ==> h=40); nsamp = 500; (n,k)mini = (300,5) #> #> Robust Estimate of Location: #> X1 X2 X3 Y #> 1.50345 1.85345 1.68276 -0.06552 #> #> Robust Estimate of Covariance: #> X1 X2 X3 Y #> X1 1.56742 0.15447 0.28699 0.16560 #> X2 0.15447 1.60912 0.22130 -0.01917 #> X3 0.28699 0.22130 1.55468 -0.21853 #> Y 0.16560 -0.01917 -0.21853 0.45091 ``` rrcov/data/0000755000176200001440000000000014172553223012322 5ustar liggesusersrrcov/data/wolves.rda0000644000176200001440000000175514200705525014335 0ustar liggesusersV=SA>tAtԆJg$8p!Alfc.>RYYaeEe`GG/.af.Ǿew0ѝ~V.s|Y}ɁvX7[]׿:s&y]5RÚwbT|ޠD2+ s?{@I ?I1X .jx׭&xVh?dIm߄|7qWqLMo0]?FA߭4jmXr+F~[%y1X,O|/%ӤhCw| g|&dhtY*A:mPiF̏P(5~X.O -*~ᥨS>/uN~AQ>)OQ: HiI*ӐS)yҞ> 2U3O8 qSg4Z9%[uoTeGt9(IrZD djB !4UgQF&43mY'#37z6eMly7rȫ oPP%,Ui#n%7Aĸcxoe7l݁z_% ?~-K>2*{~P):]^LYRKImDjRڸ&6ֻ}1=!K薢}DG}R<Ǔyk薢1#>c>>IӮ5|9)= S {JaoLl ܿv rrcov/data/soil.rda0000644000176200001440000000452614200705525013763 0ustar liggesusersih\GeIK#GjZѼ,]YJ, FeW^ I?Z_!%RhɗB@I@-׎,ڙ93`Җ<{{Ϲ^HXq( &%_S/P~(qP(2^)M΅&?lV۵os_;CQ;]a_SاfaK=uϛfe݁<;DuEK|?~G/ޕG>'z_u2?$.vҴaw+UϞ_<`>֋&މWGM;yؕR|ܗZ=f3}H-4 g "i$)0_I ~2|kmM;~㟒q3zC?wG7yX_,4@cB? 掘&/8S֙Rg/Ӂ_N8 n=/z[;}M/1c;;,K~FR&xJQ\S>.ê2_8Ռv{e;| A֏,"I<}vN0yK>cv귱W7(:3+8_~X?tRKYg ~O kΝ1ߐHS_f/+Mxt>v:)8!q_9"| ]G˗},I3دnrq-uS ! p\u`Hp+UHN?DC}/yBTnPo:u v4 $`E? ?BkO!X髥/O!Sq-j^YAeWB\EAy(<\|_<٧/%ԧ)o~*//X2C|b'xkw=82E>T(|di d kb]'k xZ VF7[yyV>>>!ߴp$;OK|z4sؿM|6_l#ߓ[;ylMz_kz0ߤh#fxj`CiM;q&OgyuCN*{XϣW9)U-B|ۨf ~:9Op7o8ku##% o-zoW5y^gZ/z_hNzw^?nqzl'ߥocf껃Hei \mspHw~8XM _ipj|q\V9q|T`/'^o |+TcGkY}_ jė`wIIgl &=|)i#œe}J#T!}2~CzLt{=wwۢ[[H aKE1[Dѷ=(f{{m&zuG2^!۲ 7<ϱ6u88=G̡ss`w;d,mEm,L,D<;H#uuq2Çsԟ+/b9jzZx=Yٷo;w|v}Ƿo;w|v}wbYܖeՇ;*s:Fz={=CwsqXz-YvQ%ƒw|GQ^s_vQKQ}Ge=G]ewTsԚ%,58!$'Mޓ_S?쑥o#rrcov/data/bushmiss.rda0000644000176200001440000000216614200705521014644 0ustar liggesusersNSAG>H4M|.\AXjn +#"!D-MXx xs>BɜqsK[\ 9s̙gamekqnkN1!&cA<Sb6ҙyX)5BL>ד뇷tiź {St݆#oב#mL-"/Xݰ?C|mY!d_ns^rkZ^4ϱ(R#‹\yQ\ƋGq+/G쯤־R|8qv^IQ{?|hr=G$}_hM7}7:V:eT =Ryy!r/㼀o ߀ֱe7P߇u^< Q"֕Jy|?!>ƏjqU>.[쿌2R[8 =Pq^K ҏESt!3^C?2>--Gx2)YxK7hyf:YYm+q^~ In<2x}U7ӛX1ʹ⮑G vFS{*.D&Ѽf~i#>%//1`^}P.e1^!uKmG^>ʏuSJ{ս}'Rj,>y=uTK|ReȠS:,x/ƟTXtiXSX({jP9hDc9@O􂞖iYy5=[?i{-?g|͏߽?`ڒ$rrcov/data/machines.rda0000644000176200001440000000566714200705525014613 0ustar liggesusersY[G]~zDZ͓ܻ3%5&8dΌCv]RVDQ#C#$@H$D$|D;uoj[-Wթ[uO^p'.L(j@+F8cZ}iY6`&Q7QxIC p(_MBGԩ]XCDp `]=C]`G7kdW-g1!Z̿sC p-T ( Ng5؏#<1|0ceun,Q xƣא3Vz̘pnXc us|xBosKy_rcz8,kٸcL2ז1/ag抌mYjMcW}e}lԏdlrmM;ee Kc#cDrC^϶}cb%Y_s/߼|`X3Ey|-8{iO9eOR߬N*9O#C9U1#_hm;A@UrNىt=#AB(pP%HA_#K>6 ='kgsbB%FklXV˲Jm8@´Qþn]h3yM3"~˄u>W{H= .ono^"قyrv+cJG̀uYXȗxC\ûȿ;h^NHNuz&(~3$d^(`i #\xo; <Ⱥy'_0%9 & N6,ͅ:T;(iH黭sh.?IkX4.@ o/گB>:4|E8^3EXQpOyw~B̟Qq#d9Bkyp"';.bwF $ntAqĵ}}8Y(bJ#7dK\M(+JcC|![x옥X.axQv yxt^J}(Ğ{sppp+qGO*>OK=(!/.7Ghn.`<GXss8>?B(.Nc%̓_ O4IeEg7שOß9u>?#I:y4+9u:F,5rs\ڀ'grQۮ\]x{yE&uLAxjXvjșYVnSˢDQ t`C;1=UuNYΏSY o-'(J%ٍ~sislA`ݪUڭ6i߮$+ a2L}ph\rNk[oCd%f)W*zԯn4kJi'tD :xEn^q- %H;FS)K"RF/[D,gDDtѬ;ZP`OUwwkWIb\^x%X8f}ՃŮzoiw!S}s{=*.^۵V\yЎ.7Qiy۬ ;TҥVéw;fo{ NlCKgpMlOa2~3Ld2aF&bIf2Y[' 93^ 2La*13NLdDIlv;ͫ[[N7X W"Sus{B{O%W[e r{œ(YlO5'ȉx=;jцA7frZ"*5 [0M> e7pذɘ2 "Ko#hWv$۾\=/9'&+QL)KY܌,SM3a3LfĤIi^ɩe jTV>atv` ovRggn;gAkڳӥ{A'd6pj|'r:\CiHspXyrB7KemQ7F(z%1I6I5;I58թ(Ĝo  nFrbd2:pUk.)Lā S"4J֕Fщ):ӱ^d47QOv,/V_ge,&ɮ8-eb]aZ{Zy׺R(d?pOq$ggɞ|~pƌllQcJ4l,Vd˖ߤ({>Ah˜ x Qp%PuXg`5LapT΢Frrcov/data/pottery.rda0000644000176200001440000000154714200705525014523 0ustar liggesusersVKLSA}çRSт*CaM#Mi/tÆkb\aҸ5qBʎs`I;̽ޜa¸og_3 [vjV:U{YXwyo%8+<5!+^NjOYxcK|nkr>X>I<)qϢ ucO'^IP2|?,g # ؑiO; |C`oxR?>&Q7.܁zšDž+5˼۰]wk i!iZ7a!~`ox=w!ns<@>y0x E~;E-ohui,)[i#,VNk\y'fis{nzA82^} >J>\U|zKreω3D;)*~o2PVo !.VIzREf茚*NvnNt!g2e-ջ.2SeӋvN 8Jr` G8zČ|!,wPȿa)5\.ֱiNd N_nĕ7bgv(E+=BSgq^x1? y(7􋖸'蕮S @a ]_N3*\D3"a?޲v̏/z̍-` rrcov/data/octane.rda0000644000176200001440000012120014200705525014253 0ustar liggesusers7zXZi"6!X%[D])TW"nRʟ$T~u}}XM;0>\ԕqy*3M%9ȟ{>9UeOǧX!giuaI~}7)cNv ;y/7Ś滼fGtPQj,#O'uh5ׅrբ[$"0ĥsP04{zB &QsD(G|sܣ(GA @؍㪗hJw ȶt0# D.1պKhtyvHl|3 Ą+Х%ʀ$ 0oOZ1yݽPNZ0ڈӲLZGd5 89TfXXgwJTo2+3Q>h(0.w0]ksIBIJ}.L}|#G;,AJARe403sV9tEEtdǒZp%8rNۃ_H.r ^KX~vm o%P!GNlj$4 #YoM",m {?=^;BY Fyp5PsM;qw#I`W'ESp`.e0ab+3{ūJBxߍavn& RHHZteX \جI^*LBO&b2NK;ڼa3c:=HU\9JT}6d Φ}~+I7RkZֹwӸB~ 1^P=4l#17!ݼK{}99Y]\UR7jGC$ږ!kb&f6>nbcj302x?x2o1@*N΄V:A5,<5;ӸH_ K0 j4 ב6Kl!**y /6e{KH Ӽ֔kD\7s=p0KĂhl-k~)f-g EnV's:ԓ_sv!0B0aV? ( T% 3dDzc?'7{ٜ~TӇ՚/a)Vk?+\UbZSMg6Ea%"ArBm,#25l?hd0j313lC8k=?AyE2ep?M ٺr E ޭa-a@)ɨL^}b'`I˼9u?]_j*ɩFүg*폮>Yi!Cf{%1",8+ rZ*&Ssȑ+ݶXKΧ sב#s쫄>(-@B$^+zJ]=E,gQ4%s*kOf1'_0s_cɘ>`Xe 1 MR Z\QqO1)U-iq1$;`f"-EBIJ\ :;B+uw$us=vA?Udqrtqk'pg]Z\. "Ti;٩ꀭ^zxc8 xr.2\ҵ&I ln-lpMhѹUR҉n_ aM%10HXʵ= M'p͕U\׭?O}^+DoeOWb#| #[zH(b>ל88RBY t{#0=t 28>(?ȴBr.^ZsG@ek@(<:|&VqXRЃn~+Vub+y!IM>qם 3,'Sk!`%eE8K>]$~_ے9W4P''6`5 ?<˭i$kUvz^WQJ4M#g=2_h9Ea%/DRa뇯yT_C4a3#VN4ǹ@,6>-ky`s=E(ȻOAQ:1 qō"7oŵlOA힠@1ߐ٦7m8F +4/]%q+BE~S>3xRT16yq~F cFAS Rfo7H:?IY9ZxDء3QkVBgڛTt 64'~RPl^T ,lyܿ)3woqhnV8&H72ٹm':zK<#`k1WՈ2rrb\ ,tw 8#*0N1" UX׎)#·S%" !&t WB݇M97<&SyS,j޾8(F:;!?ryaaO-J7}oH ܼBvT7U@=U;3SYnF_cUɵxuga|3 00'g:y5'e"dIA-n Egߦd7&7(l ZO,:J;JE\Paò6/ v")R$pWk܁YVq=vI:tقX)xg3s=q[Z5I0꺩LA U3Jj:5I,l&`Xlڢ5-kϔk(IEJ2Nav#(6:UUI5 -MiWv՚DYG$U,n[h=ْ3vMȉfՕdkUDU32;/ 第:%T$o&nH%RcС/^D!uȀ49"x̤\p€J꯶Ӓ$)(fFy+`yOGN h cY5ihw*!DJ%UɁj }V83v&:sۀ/ @iOݓ7rr &(128F{C(l{gC?ZKVRfKqNߵiMϺt22*QPڋ{bE S9 ySb~Q9h Ej[i<>[[.1Ϊow]:ߜ>{m|IA'γԲ%|7.8jp#Hh.Dw+`?G/5ئ33Z@G՘ӊ)cAeW/GP bat"v߳#S Vq(AboDU] SG/ʐO6sHTnV̑;M`^ШW*|ƣ8 Ffɮ"4 nH]lEs!EZ [[M1dU1NEU&(`4Ka*"%44\ ,dulH9\#jJ ߞSֺAհ  BuO^,=W)-c `6VMb |qW@i|X-w apRJ3uc_mQI+.hd-U_dc9D+!f$t!a1!@#/ncDvR-G\Ei,%Q 3&$fA{ڞQrlϻ 愭\'oHe*6[.6}ї܈w2s!*<-mJ΅K}kB,3nUi `g&7bB[ oJ _q\\mnMțೳnʮf-n=;3n&T:8 >h*}qGFibz߭4Fd4`8' T8b;v̲f| )JKc[8F] Y{Gr"L[|نa?]$jx&,<Lgޑp/G[8CطFYxeip@.FHe/3-Q01'/]߀Ph! F{{ke}e]UW4$!vX&ZW>(g qOPJm%dDPpmU5z\/37-54@ ?1#[/dWDY\z{a[n7L2ڿ4?s˘L1LeİPj3xEΪԻN0rXӐTVϾ!-eӫJBshrDlԤvc[~W3ki:`~"Y؝ aa]]9cҧ4jFMY;(t_:m2dmHLmyHI]GM5DZjl%kD,6rt"U>@1cvE"E;_C`[֚(-Gd`&۞5/e. 3AItFF?G8U!*W՗#LmRQ*N^jʍr~SYo_U= ߺA~d3?J(\eoa S΢u 2n<=KmuU?|uw>Te)EaDJ}CtUYayxPq X(ˣsI̶&5Vv䮲K/N,JcO|Rtn3K4%̆9ʶ/EvsI 0Dд(JZRJN)U *{ b;!Z#IBD}{4&zBzG7.m jռ&g6) *Eѓ6;| O^~;05HrJ >R}1Ci$B%U(d"jjQs$h3|s˴ȕ<{ŏ`[ܝ}@%XPsKʳG pA =N8+g !4У\Sbhf'pke}7' ˉ}13w5~'P^p8__au} O„>' jr/r9Dm\0r1r}(2:1F֘q®cxnӦ?ⓣeSH0~|}bg3^7PB;f wzބ#F=57î1W(E~OeH> Qpg"* m-“8'|PW0bĮ90ͱ𪷱1g5$@/'0!j_2\_Ehӭ KAŶ!ܘ7j5ʏ7 NUU]⫻@zD&6<4E`m}+W$,A^K=5飦Zp'Ή-I%[aD"BRrhg<^~P>ĭLsOT9?3lI=@PjܟHT0~APٰf] gbR TrP&P*@,90&WFlw8I4$`-3Ci}*O-+;p? 2~'ʈ TP$9b(& T]/Q MUf ~\ʽE{ ^Vuqײvʘ Wni -*;"QѫJ kks"KDc~Z8ll^C=7G[^`i"T5 >*5۵I0fo1.p?:~O?󘹓K7 i w,}oѼ%K-2%D8,A܊ +FYeI㨅}謁ʨiA/& fu8kMyuu$g;Yz2 ngKc|uV"jBto}"7q|F5UT jr)ۅP,Daa@4v̎3w=]o"<)ԣOR t^g$[33=_pDRC29@xXoiˬծ$:d \K\  r:{I4o kO$p-Tv~a@G2ѐ ?TFBO(x;c 06GE4߱A\d'[I+oTXw>sgd\4WȜD[O8 ,0[fg\'rb=X}2ϋ>)4GQҸ{a8DVɎN̕Jw1ܨLZfw?`+  ŋSʸrd:F{`n &r2Ok6mBvr 8$W3K~P#H+scvB{Yj߅,KP}I$MKw^?XݱZyˊFZe5WR,$pf#:gnq9 = 94Y 6]'RDOmɝ:\B%`}B> ),=j=bE% 4䚋""ҮQ-I4u1x4`4BFNoVu%Գʠ7R)\/ m}snū@ƵA 邴Cyժ,1#_&) BpSk*n֭5LJK3 3|H~6;`GtPITnD99 ) .'gC9GXV!ޠù ps'La2*.{~prYM?sE_v#y-LÔH-Uϯ%n;Un=:$ƾ\vѴeLē2CBCHpU>1MfG52`6H;ԅWEyҢ$jjb\^޶qu% F*ݱ˖5 FQ?fq9+AIH cK TraFYDl f9.rvuJR(V:c}9x>F5#B.>4(?GHsqJ(t@0yM}Тg1S\d黉}Ggb D>wApe\;o}WEcz P}Hc + b纸6 !tINTPhr;ud3x6խzH kycK1au̢EXwp-\w1y\hb4OpΑ:= Qޛx}dž 쀛!< OE no*0BD7#6__|4HO{:zY/I3OQP7Ex3PY/W˾tH mҥ[fyq0$.!ƚ3g \A? {j6u?R)[>|PGiT:OvF_ԶD(~I B?(3F;o2'}{~q8</#IwcbwlR\EQ/MG;;Xj?H9-˗, hXXƫag~L57*}r}׵lj88m0o{7ZhoF?B!tϡJc9#͏.cd*3T%5MUR^)(-Kȶ;" wf :eE֟N>2bPm_[-jȾ}̋[B#1u' oԸODW}S܀K67<ˣ-!=פi^0NwqsgOb$`E*M%\b-=ƛZc*COh4efVށJ Hd&j^܄hjssf;t7!at?_k4ooh_EūRN"e b׉$ qwNd"tYo1N~[JW2\b0'qt%VIҝ+!wx=[9)!S`N\em Ėm]g`hhEEX/S9Kx;^LS g~Q]*5]6Lo^:sׇ!S) O 8mECdz%2E.j*Yo6X9q`\!M$VXBN)&ɋdE>~a "s ƿ! fM]^TxFxZsRulODqGX! GVue|2z uLIUl! >HuL1,_úY̸ep|x-L{>Qq-Di[Tx )瘗 #;< BO_~q*fK0)ĶVwM!X3@ї3d0g#+$lb]zTvYDGS cI#W$ÛulkŹc?Xi,Z0\T68a%6X%oܢ*r8RyjgyLyNwhxބv.rtW(y}.4yӶÀټP|YWncq1h)JE\ tH߱^^oPPq_|^t3m@"!!8.AE׿&GaSC)t ,иgռC,2\]+(e{&3{u-CD7 V8nFU'y$>0-WˇD@潭 ku;&Y/l-$c/%XR:hyMXI9J ",S"j3#"4r(~)[(Eu2Vp80]j\c:YUAhDZ0>+Hx9[ i(V%kLaJB%n6B=d/+ i7?[BصP:MWo| TT9Fsm׸)l`\*%u51g S'Id{NF.].9y2DMۣ #-h2x#WL>`-#/L fvU`?Υi7vZbhaӖYլJ 'y($_u夂azEd)*Qa z_\I #_L.'!vcZyyקE Ѫ7baH nn&>qݷMB@Q+%j{}:_W*|j09ZοFq~jY&rx.= `u9*-hrԘ{>at;yܣ'K >Beף| [ІaeؗTH2(p[c͖^ QQg 9_\ᶑ9RFʆ9R+<ÄPПWjaMO.:QӅ|\(/ئ/zfdVl - 5f.&낺,l^-6d;^b>[.Şjum4BG؁CGNYs.p߽B#H8q_ (Zȝ>t}VJ3a -D8dGN9')<%7.NWfr(VXb*ZŌu C51 ):9=BM=TKGL7nhS)K+CB8-Qh:(ZtnH:f7[UaEYjwonCgK_`rwGqpa2=5o)!뗛:.4۞-=*ʒu|#=$E~]̇gS9S2<_PJY=2P缰 NCevK皙J1!VmBX5\ueADv>bN?hhÿ ne>-e+ )-WM"wJ8_zW4#)n Cn t_V@a"iWg Qhmˢme=? |nT`mV7v`mw~ØF4ѱԲ0# d$]]V2|s 5:$k8B5x李7<]*$`<$%D]Z >Hk-Ɠ3̉7 㰅Jr LyG1nB\1]62z>#X;!6MDٸ^wf/ΉJիk*Al,cm~8>v>hA]u/"Cwy2,)UHŪ 刪x`jѦ.}#Ej?gBdiXs1Y;+ou88z1=>`d#yƸ tb3QĀ}kˋ1t'/ ef8OO:JL{qr\n:QцE2sC;+ 6@`qڐ` xI%KwUu՞!Є]?j~@k! ) {+ ;-A\X B0aߟ4 99n^?)v5*aߜu>8<9C[z/ Gm۞ &%̧3!qxlsó>t,|g*K&5L; m oh_n a#N"zX@1<&Iyc'*Iv_ElO"wa~{Z; 7P-CrӺV;Qц[2Zؕd "hyN+\oH7HdX8ڔdms7k^Ox dƔo(;`;j5[B(;gn M؎!f&w|5s]]1gA@`jyg>%a>c,5;,9YMi!߿S,x K[|uRE `;+s,q(XErU#/rv20߶NT"tD%M<ǤɜȢoUɭ,6{"avg-\oK} % 0蓳 0,uʵT<79lWX<.a ܱ ˭Vؑ3/u/@<x%zfx9O ՅYfw5 #ChEjQSW9G"t ͺޣ,Wku,ۛPÿ14Jق  /fgy= tZ\+RWA  {N8/gjߡsN9XcM܀&i1hJ~BMW jDy1Ӣ/:wT6LE#2aB6;֠;nE=o{j˜ƝW&Ʊ(*2QĥQv##'>X)"W5.v8$18*}[Ei0v7k}nA0.Je. G?hDN&V ;vu;uCLiHE Z -2|/XS\Exd؞"qIs'FzׯVeQe1oVzjovo1#mv17JG%c;h!G2A#%~`w3_@ĖTYHTD-cYOeŢy 4ʨQF)\qC0bho:pݿL紨vtvd D~Zq)F6YlF+s26z“Z2WB"N4u2WWNIKnv>%!mm;il0ș9ja5EQ BFy:4f xT<UO9EQOC*xg?5Gz_Nh磿/k"|{AFaL }kT~j፣} ̕,RE@9@C,YZCyR39~olntbp͙uz~Oh=u` Qi)+~ĎD`ӪC&x*5;@‚.ZcRzcY4WQNL^1A% )`n~VzgqL|ajzm& DP~ƶ#}bA/?P,>G Xڲ9B&2~ewˡe) ɢзseBmWHEā,{pl(\CE(1;}Pq4ȵMmӦΫMJyO-"PN"r#헸_0g6!35|{&^q#r1&~]VZ ED_{gxAF^W^f@GܖˤqmAtm/tq#'LcΤ^i霸:DM:tXiXs2Udf71KfYj ĉI^+Dd٩1 );˸ A Wu1_1μ: _nGTX#. *_̡gAp ڿ܇qry.i_HQ-"#JRW2rm*eq.VrV [|%{:0^R(߾B2!ߪ^`$|1Ƨ7pD+zsySleiڌ4f DR\CL`Q_Jh|9 0`cP 0#'Fu)!&'6FL,h8&Ysz$ZqIuX)vHI@_!K[MP+ވ 8[ow'љ%EA\krl/zf5B,Cx*T_.UD(vuX/im*ucqhr=XvSh{&Lx|'I+c=LjTjC C;SAFhΘ{f+ /ϼX0w݅DzTiY%WjAf7s?alRМ5r r瓹plrysM ?p նoZr7G"xF8x9 T=dxXr4N ;GFFFc uwo'*ms"m =Yod)A#qpQ0 D\ \Kf"V* 1ɊGH]^^P0g R!J0XcI%r)YK6*8ú,OA:#h٩8a" CtI ϰvuzkENt&~x K210ZL: EnR{݌ ~<#~ U/ZYh a%//@م [92jo>ң@q,h/ ?H/״>`3% d~*rr$rSSH=!3o)SL0>?x(V1. i0YH58U88|9l G>yB.Sc WW2+oz|j4[=E!zM $^F0Yp,$v::i"h&5'4 ` :“_37|3^߳#r%O>jwP ֱLjb=z\7PO*{򨋶%>^~C \j3j:F5rͪAՒ얣Z?nĜJNHI ɕ.>ޡb}_(t^_x65y$ӌb*nJ 59{q([w;d1Ƴ_Evӯ JCF5O.KHMZm"bRLOx?߈b8?#`hEX & VHt۶PJؗTp~5̒7$VΡ}X4[,ux+9j?⛨o YYgvCT/{ 05`RWj*9{Wܽר 3јi^P oؽ#IOQDq3b-n7,Nq&v)C8S {? <˼չR˜F.K_W VŸ:{Udd~_B!*w "L49 P>reR}XI9C+m P~*~3-({=(k]rM~sNz{W!P:jx$kgX@UBjHxbpe)J~TH;F-G=5h,Ŏ #l(7ٗE|ݩ{RN:p"+B)fP0KV~bn#i|%%Ia^ێPMOcT;5R D)  UQqG# NQd.%425lNvKNS!rKaUQA|=HId( G'3FTu*Tm#7 F9stZf XRO[wRʋ( #gs8㶣.R|o{"`jlq\d7- heϡ%%mS11SZ>pMpI Kwn#}Ѓ D&2]~?tVjldnmPjb%LYK9ِT5YNU9" v~#G8,J2eVLao8Q[<)yZ.(p€H٢w-\"zf'7X Щ \ G \4E=;~;)L$TOJ+t+ 3Aqu#33<9ksQB H02837R: MK@ e懓@@v9,gYć= }<{=Ÿ#9k$}x{ӾExr}g>jm@1svO[[#5}fSUFn>)VƋ ᇵoݗ4Z^(ڠWwf?v.Rޮv0G/xc>REP`KI8*P߱9 9ZVGFLFw^wMCkeh7uR4'H=F_^,+;Dizk5)v@LW .rJ|oܐ3sEOkbc.o@FŻEZ9tп41 %)B@ᙔv`<e}{[8ikn֕{Ҿ0VR;P nkdcoݾHq.:3 [X!LbY1cL4ƂEFl΁ΞKǥ>@fG qT|kQ FΥ>e4AnPW ʃb>irmT[ xnT鼌ɻ\|ߓD~pAǂ`팈j٠ Zȣd*4I!aݞYrnys@ HrQ%wTt:D!ꅕFu $zB0f$ soo]qrr++RvBVtzI ٯe֙8Dɤqe:SpǠpQEeGC# y9ngVP7TH;5 R3jpv }AHCNLs܀ IP(KڲMH4OR@&S\94!< s@۰1Kci5='%/1g%o9"m&}X#C$"1v]'魲+v}yjIUw1U`C}8Q=gv}ӻwLOA%3X7ɕ4q5H>pLDG . ֥/ σ,_:>p`O?D (2D7V;j.+.K@kpU1Kl@ I S4 p2s8†M2!ԕ+DJMCbѶOS1{eo2eSG$3!HN$aݕp{kD|>}zeyMFܻ@_Ԁ̇~x}{,,_rIt 7KcosKpxbM%%˟H95_~כ\ǎ5_z^[)jDFv.B,ӆ*u|p3Nb߄K9*<jkYGM.S%=l,6!_5U|I$$r jrG:WcC[dC+0b+s0XW$GlNA;mfNp`lh~-=˂!{]۝6^^.zQŴII:HCUzOF<j9טA4lj=b]~yr7y02uniUE~#SD/|~rլט;EnWr vƦ|-{fgOw )a0EBA'QtAZJGhcIJ#/l[N#aV 4?žW].)ü"{[}ĩXpz زUC;-OIWF7%wGW]o-8)3Bmo×:Fյz@ S"̰9q=4T9<D9UAym {٫ .#-8+೫0lY*o.C˕?[/ $N-,껫z)4s2\q m/ {Tr<Bu`ԢLEü"^cܝFO=T-z<5VIaA{K8֝du#2 eE]aF׹&}tvb(&ai8 r-qw9QohGS8): #f:Guʸ,evw@(zI$"THWyVݝ:z)$⯦%J28[3J2aηvՏ͵e}<6^W9ؤDϘqCU^Rd'W^*b#=Z AjKDJuBL/s`M9H;i\E)8k+y3؊oP; e|v L(OkN Wa|iY7XW I#@'?k;C +0˴u'f{55VlAD=j!cNKFN3Ďc(uዖkRjm§E2(+n[K &~ $j '9:nUC9)| G zi'oQ,L mFzUmj>BO+jE/h<+[s%ad*+,>m d^H / U~QsQAӮ*d#Kf_pĜ;j_+9MK뒽H6NX6: @8);,y|<~jǙfp(~lnŀ!glT2X HJ>iK8ϵƿ@Yq$%FpW4%B[ODCWj+`>ٛ|d(oN֤~ܳ#1BE݉jbq%*;9/ ™ {b DŽ`7Hd 6u_ YeFEUz؊N]L}=̃ *[c$2&t mcg|}k-ʼn?qn=W."O  kQΫ ,p[/)fzs[o&3 ۷fwO[ }`zc;r*kf&k5.25 F>͏pRO9@8ͺ_=rC2Qu;'٘rkd9NYc,ٙH>#]ʳߴFfK-|_WUN\Xl9w37L†nWPtѮn]YPg;ؚ?Tf 3xɗSCrV\b$pvS~~~uSϏNtyi!QTud=gSJKzG[\FYUѢCҵ$x4<ͬ$:(>`$!\qޘówa0,#f}wف7eAy Şƭyi]!&NUn` QMEG xiE ;v{RnZ<%b&?ɟOXn:uS›{OarpD; Iuu}WSbytƃA Ӛ_J1[|ψ+aPv|'K$G.z@8>]/D'+;oZLO)<Ҙ2>y"a:|5aef2mLFä4% ?ЧèǮq ljYR3}083ҝdg, /L.\q%釫!?&yjnP-:mpˣлWixSӃ-C[D#eax9;87)m{Bh#92v.W;s椄H٢$c]j׉{ -A(*tқR(qƔl$)^麴?!>7͹AS]sWQ2 :ͭr<.aZL1=os!np<4d3٪ sp60Pc.Λ6V1(p_TXǒÂr`X26@Vi}PиHp{r0vzl*%Njz,GfP{7Z!8kKL,Os&~c3ne~moiՏ׉EW ^IBNPQiɟ w8U?Kj:;TgvCf K:2%UgXh؜Csװw+LdyFȢ-GebR0':r=)Sק=6F١#Kw@`/M#0)TgPPɖ߶/m[h&v)(v8r-el{I ԁTs3@t?#4Wی^>LCfgS7jq>K!bPRG;+LWxHЦTjRj*̼]4X9z+~laM{f)/[..TejZU'½IȀm2c@)mFcmfT,6%OZ^ɉXe˰\y&~1FH*Cr9DŞNJƆac׭ct J]4>Վ&YJ] :WYc\4*x/tȊ;ᾣUޤcІH.̬ê|:=l?Qp8AQ3dQQbKV.yfsqP!\jfQW:#{jLۡ(mx ! "bjF"05E6}ǖ[qf@!a"$A=2oЦ3hƚ8o)j{}*}on7Nh׉## 2NxV'Pt:cm-M>fo>7Li頓q*'zWlfrslo!:w󭠔#:NJ@L5W_JO`B2 w 2gC(fF Wt RKm<0ыni󳅙b cjGx]'6D ON氓3ӄ Tjbi߅1xS]: :> .X0˦sw.aoeUt0DSwFɫQ^:]\H,X_wXrw0`O6͠?~?Jȍ?DuRXY:CU*0^[ ^Kf* W|)=IǖQ޽/ *0DFџKz X<+Er&Xw RMk4< |ob2Bc`K,RraBy!L(}qw}PjDX'M06n5={XᖓYa-;at~j%Q+j;L <xd3|Z Œ+pR nҰpY+L<:tp$Ы",-e9ÉΚʨ !wO94u8b_}G[~1T풓nÌ-6ȵ=n,V63W@ˈ:KrOL9S6=.`47'P+t'0|-}\h4ӔS87eٴ1'yM x'pVc PWe愶r?I[d7sl+ ] ߤ[/KiȹMMU?!nƲ lrzRcTsLW5&}g*Ƃ`UPWHW"2 ?IN}@$<ɖe~}ȧ/0|aK+LnA.%nLOv^^}k 3?d^nմk<%-HPS?`V!rSi4~~X.^(*5v3q$~$ vVLYo S炡WT("EGh+uHJv bwwPźmjJh5 n!UhRu?+rpNUe\.I8Aa9J;ڵD(oǎ.< ݡg{ hr䰪rgBX73wKd`iO{`$;amYj2zS氉/b2,FPWTi5wbbSv38s`͂QΤ^eFE80Q A8ޝNƗ/s}X MGz–110E*%VwRMK3Յjh"*^m 䴒y~ѯu=(6 ||baǷa6" 'v,\1-uD t_ C(Ĝq8®D'EDq}A#6!(|(B'1}ヶ“OGn w`,j&}K_O+"wrp ֹF^aԺxu2Yy`V=pD:(uw)nؽ M581-%sJAF3sL^SpA|0tk3( u׬N\N z72z?'sW0h(!J9]g?+ĉ[ϫ}' {tƧ 9FdzWѓ34oyȳNcΐ Jt6_M=Y&e X,8󙜮*O&/" AJ :<_saVd*E!X)ϐTXj qpƬE_#{ r03n zZzĿ tX$Cxa`LFn5xd: |ٚ"v ZG$ʭ⮉UN>j}[J宠PT޴xw3՞ qi0\&grcfaߌ;D̴;8B揹::};I?7)藆  dTŚ9JC {c'9RxQqhs".bja$|kswU(K-c u~u{Z;|˸pZi{J_[BxNk$px ܨIl6aY15568JƒPBTk#:+{ dCr`#B^yR3s-ʦE}ؔj~&K):' ~(U¥ DG9 WݥppO4m~Tr(_cƚ$ mUt` xIwuP{8&B2Hw;.ٵ`HDCB]vl&^W' l^tqm^N"|f 4H}D7Ąp.l~҉ℕ͊2w<щ>dU_bi;wf#N*nYPE|B {jvy~Eph7,rt _]%ub#/ UH*<-@%x,Ul3NދRB _/)}}%o߶7L7.z$,SDDtlPQ(*R9`q,n*n] (a9 Nxk͎{}KVN듉e`!~k%k r /ݑ#xP1uڧ ~".׋{J^j B1E@&M{^zbNN}"R4 K C!}!Un AmUVǁC4SS]~!#88\?Z~1XtPeFGH> (Sm2PDvNu8C)V[@#6,<%[Jُ#Q7 #-m[؉'؛z!ѯSՕB~ Add2t~FQ%cNxV*g=zG-7uxp+R΀'! 9FDˉLWsx9P_=s[{HvŸ61c_n-Zt;Hp*[θ"@'WYUvi袦&\\U|oGtNO©.9i5CV'任#7Q;|GOuܤM ~;dU EV\ήuW5$em~'Ҙ z@nrT8u_:I QҪNϝrLuN+}c X2^a?"kiNMfNtAeSҫ?Q!ƘNٓi:$aHZ8! ޤclW2FMVH2Pߴ2.C'jg؆ ds 3}*A^XoV` 5;Sa~{AJ\3,qoᖌicXg,_Ruvam_'.$Jpt)mgNhl_dGv mfgQ-PnW\1 jYO`\aAHOwB$ա&g4j 6[/.@=bT/eV?MJl| 2cpi`]/F7ĀT0g1ᙼH9işv>{R35lr:R O`綫<'2 y6}F_rfP8/Dy949z[iVExA򸶱P6Ge~Xpjn_95կ$96)f/ H("ېsB3YIK݅enK_QFi'˔ա:U9$z*ꦮ, Nvg1)a=,ѺLw;$; ;`t+oŠA $YUjVǗL[aQ~Uu:ѯY71" ^+Eάlʓ}K]9|XVGfuwrcp6Ίd2sh.Rnۺ }U1*T:&`M^*5DtU?g_(ietā1' g+b+W }p3-"3DGBкjrBlCRfm/8ؔ4zvlez_okLGAi=syxѫ7NM.MkK D b {s f\#X@tG#Z XSQ{K83f^ bF7[H"%Ik FA9q G[h?3SkuŷJcwCv``Fynޔ+IBVRsI`94Ҧ %V/ eMc&wcC]ۿ=GQbr_Տ*o#[me3Q*:O}` 8B&>> cۓ9_i ~JJ4])?+粬.@ˤڕgZx* uvx,~jO(j毜#P -w{Q~᱾wˇS/9@ ju (Ǹ9G\|EZ_0wgAAu:ŽG_7V5QX)^OBOA z3*UxU9Hq4D4: No߀m^ECZ<pY5qHpru@Ta+5`,yTbQd78Mמv^AXJK [Χ'Z8|Ur  "y9y~MD)о4l"^iX͌Uѯo\Lc /ܜ/g^)IyJ6_T\č-wӨD)ٿBZ (bo]@EI`UkR<=rVO0 yI73͆ƳƄ){y)ǭ4J79ȀcRiWi&Q Xä9,G R;<]Q<1lzoH+#ϖ%r26?+,LMlHSDw~"d%#;K[lIj!aXY/-/hQ<٤AUGm6WKT۬j48L];l:*hФkUMO/vXdgP Qnňǵ-)6"J/ =K2U|Ν% i7# r^+ <ա:ny6}JVnŚB/M? {"_`aD58^S]Ww8IW"}lQ錙D4,r/9>t\%Pi |wGE3Z=k[=RyљG|^rTN:|S3C'-mfh\ioo糾2Ñ!]pajٍb ;y0ɏGV, R%s u# $bN iésGn n),\ܦ +8+GWo^Jp U&  6F~LbF(Km|59?}ur(/*;VµLQ \V=%^_OC7e՟$}{쭲ÉA{=6 C&CLH;{=5"@/Ҧ~dWEe#\ќH 7իtM rv }+ܾ^eOt @\#+&OLI`{nV78[x{ʣI$b'غ qMpxu<$tzk2׆`4Pr.*dL6U3-%SN. 45C=$p8fLA8il}ǜB>[:`ȥ9WFœA1 L+Iim殯u8xg$K oz9w nVQMes&+Xwuw@dcͣG :g} zVf^1)X߭}?O> %;1PSԻ{à^2-Ck=7]V[Ft+@m` w!݉q$R*|(JETv$qZEo&Q'^fyh}` A2T\9SNs9di.&*J[RSV4pwz^"  gUD߰Wf|_ .Kl$53ofB1N{QV?]4}"JyN :Z\ ZCʰ@ NvSv`r#=O\'m2oհ ǣe8$Kp#CczA~PCMs7A]3"LuunB)$8`A'7БӱC\jpL1(r`(\a S:JF*Ju5{ N,rdaǸ@Ax-|ߤKe5GaJk#u9B|5Zk[?0苈VJRÿG$[(EMˌ 2wg(r>h!gw8`moB+`\9{ %[{Dq 0~9I"W7O(.4T f)#4}-0U_B KUAА,`IĻ{òiw.orU ~䙂y0g$}O6]sU4gn/kWŝw֋%M.PvÍϖZ@3N',m >02'OEL">UZeLDioAB%yCxN31ACW@ŐKF:%_M3n9$ϒ<@>CiNLL]϶W̺CAȵRFS>֑K1u35QH#&Ab]z.ӭ _>H}YO)D\9l ؋ئy$uɥ*jkcA%쩉Щ"_ƥxADtM+ta.ϭudi鋠fF}PŇ lnᶨe֡ZwnOE`N^8^.m)۪>loF28>}]$KԳyJD~fHk<"mgY\Iټݑ|!iD&uۆ&sM`r Oo~ 4'|V Tc9@]R2fG<*vN;r Lhzq< KUؚ/& Q@젣eıt8J:r\U"4|ƔL D[&]s `q c&Sx0}.dgCO,'] !{{]#Sl^)eY^zՅ_;^Ȍ/ٵҡOy'˶s9,Wjo(G}ZaET1/7aJ +ɣ*NOuI5'+&= +-ҥf|iwZ%@,.s%ؑ;F3I!X^ˁ6$X|oQ!i'eS`thO`ư{ ʐPap2`PD4~qZ6ya)gtdLPI*tݪhXM:H نT|Y {q;uK;^<Ei=n#\곘V0)^˾44:3f^ 3.; C o hZ74ye"N{l+ t<CôM10ޮCiLC㮬SwQc@4ړ?S`M)QԜ歬N8>  0m ~\"R~R qlL|fpm%wzj7&9 ͧ&?AW,*&оR?6VBQh ы,j ?jX/Ь 4I>RMfKtN4,D& c$״~,2|O/b\-c@p7 2y3g6 w/rA |MwSyg 0ŷe>Kj)^j6o2ѴR"pNnRu SsaO ub!b#{jJ?5칽B(x-yr(&gEe"K/f2ةga(Xe}eĢ!%=B"i& T\P{l9:loo H}*iW10]dmt7Ǩw>>P̘cEzZ˴"<5f1pA$K-VT)x̺z%].h/8h>{R  %-[:qrN̐O C aYƥ^yi2 am M @z/ÒkE(j^f,H*`g-#Jy{d_We/Td`.G@WSyI "e#mB?KD'>?وTdvY+ _gj_&(g5@ )Vxy|#wwdY?-+°[ϾSc.iI2¶+[{!| ; o#\k qK/4T܎RԱczsX#56eUsn^ΘQ Q%<Dt,}+lIՙ\ς M%ul@#hZRi(-ukZ6 ]Q˪C7huw%i٬ޑ66{:nG<\X))r Atx;C3IW"`⩥Sc!Uš2eeh3yPɆA#ut/ct5.SbI @%۳ڰm6mcGH(jX90 YZrrcov/data/salmon.rda0000644000176200001440000000114514200705525014300 0ustar liggesusersNQ9mEibbsȂ0*&DбJq:i*xi0ApK~ ʤk9\f:ݐLgҎ$T$_8)R8v+ϰQumx\\4ZmT#hVh۪? YFѣk!cG #ʯ*݁<Xn@q,aQBż;m.E/ OE᛼ ꥻB_u+ Wڶa!^OX8R=,U;KQ&Zl[q;!)u:sXnXͩrrcov/data/diabetes.rda0000644000176200001440000000325214200705521014564 0ustar liggesusersXilTUL*YMDj-h)ivZE *TQ5+.Q m"y;:|{w{_Ԃ%D=Pƚٳ*>/Q9<umdߴpc㩝j;L+ũh.gc~֕#~۶~sYn-biLvֳeesf,NơO*[FW~7׎Ӹԟּy֝P_GKvuA~syh=k68v)|unW'Z/:~V$07Ou~мy\ƣ~ xs`\OٜZ_z'sѺk*\ȟU]ԺZ_S_yI |k^5nf?u{{q M*fSq\N]=_\q)p06gp|9]IW Kr:+ џK_3{3'r0Ym.9OO+voj){̢4Yq%$%w-$gn(N mÖ=m'B~ <m d? nºj!p'p3p֑Co^x{"_dR@x!gvvaFd+\&L8j9ȕ-nݢqhOtl/b Sw8#?9W1dwoȱ@-rcw';zX)VЦ= 7ru ,3`qoQjw:sX =dVJO4{jKqw t<|Hg[:amϞHݍ9;w=7wmvEY2_kn_gߜXg:^t=y[60^(o=9[ y·ƸY.읾h/K4rmx6pq%omyӀ 3r}ɛʺOyg0Z[X{C!K)V/aަߎq<#z/3?[M5|>Kzs5o.gV#^Noml1{5Ӹ>zG8k\/K}*tww17L?;-`|#@-ރ5}-[͜H<;x~+X{[\%?3bwd )y\IUSpK/HZO\xuB5rIVrأ2P$tZUiHUpdBXe]6Qthu&[N1ҕ9"^.srrcov/data/lmom32.rda0000644000176200001440000000116714200705525014124 0ustar liggesusers r0b```b`a@& rrs<4 _SaTՍkܻl銈J;s7,7?hG)T 'c$j5i1ku7aWϯ-'CY>z?FPvW΀Y#I_՗ߴ_뜜Yu7lٿ1Qb@kqVZ'_ggjgFz6lPeU[Pw[`͛I5rZKuxTy봯xrTk]G{ԟdeo>޷7Fۭ6+8A鷿MX^y_~<40p?UnG^``JL.Tx5I_V kSdp_8iUG.2?"`UnDyXfKM-2 du|tSR"٥E%řhq!(`41` c01` sư2 ,C82L,S8 2,&9' WJbI^ZЋ@?FIrrcov/data/olitos.rda0000644000176200001440000001626414200705525014330 0ustar liggesusersBZh91AY&SYv`ڗѶBFCQ%$}ins˲7v+.FW]5$LEOMGL5O)ȑk +lpz{;1'A!Q88>-P)UTceyY+aPaz@( yQۤ(AtQlr@5٦HHu$$.bsA Cm2$9!`A-dGv'ug#Ix&$BUe“|WW4T@u}_)A%˜+,m{BQp xx;=Z)oz2lV vpqQ kIΗLXH,$ 6I)#r@)6iCh! =U&1#~rK *1 ػ@7nR5M8Uu؏Is$6<\ګ:~M%e:hEaЎS@g'MB66hQd{ :H;Bd ˻F-V KJP䀞H>F.uҁ6XT)%@}ّ$X ؤ-0-mXȾX]G5GˣJ0FB$ʺc)g(,P`(}*G-rir搂$ 5 öY\{/-P vc-6r2\i7Bq#ܝӕ{?=T鼃eJ3J뜢jRB=K =֟VQ K]R;;~zJQm4hH@LGrR5\%9JC>ª{: nM* Y_m8~z !&uҴPZN?V +;ŀ_B[~ƣsTb*J]_#Q<"^DD 4$P#9eqlw0`6G=dro{$OGuGo2p%qsY- C' 6%Cr'J'THG#sb70YvW3<Clb]9Gig35iyvqsg쳷{6][8OF$E9*""kZSE+JjQ+dy=cס7#\r_n[2wH~bP|dPJ6FDn b '{s4݅alSa<n~JE=v TZvzȞyfZ :@Xe_gj;-Kz] ]!\X!xzoߴAc3:nBb@Ή j0TJbg1,Ћ:wVT60 :֘.hf٢& '^>AӦD-9Vݛ@ V[ %*^˱̷~!WEJhb0ذE\imw/Aw hO"*#d)񾱉5^j8ۑ;NHUԛl_"iSz(zNRͣ8*e^i9Y9U2 jA9|簠Y|**c3T\Lt\ȕ{lS"{[u29 6)㒄ȑ4 V`tAC"S.\ Zᄨx6(׫%rP2gSZ<v 2,J%iQ2MhNw-V[.CÕ_jwmܨ&P^k>kȖ։ʝrLOQ㷍):,?>h]*F)cwQ4Pu83KB. Rs%7容>`.G$_8K] /XxlljP L&n^Ps!]&TaZ5][)ڐR| Z,kyd NuH%Dh@Ճ4apHc{H@L?1TK  ]H[ɫ;gXI OM`оHΈB%IŴʂ$+%5% п5XN=.N-j޸[MZ.QcmB0!f\]NB@+I66%K*@{7XmPwcșOF0wP s} c,0Q 5GD*3G`) -rˆX& ȘfBJA#U= ā 飹K,8|b[P9xo4}}BDyόosH. oY'Apd芰AKE3Q{kYaCjSI:H$[AC$ʫ |fo ƿf*LȨYI!QT\cF#IzAPO:M0Z3"wPws i H$("|Lhӟ( 7](D \Y`u)Y'_r4j..zCurRM!i ڗ:* 6`R BwgeHrEԄLIuꥁFID$VϲԆPL&d F. y64R"xQgpG5K~(\P~QG%H%:ƍ0\*Au4c~bq17p3\F հUВ1WX|.)jp&`UADC`EVRvIBb[f+KZa~{>ۼC#K-Da!ܟ"r*nWˡh%Snc0~. p D6MNn N'"smN')@Ds8)1Q!٬^2 z1^e3\]-|y7p?Km;*r⻺VpUJh1ѫc%a\7Q,ÉFֿch4КheSLjJj1hHR5+\i 1~Kr-䎽+"N,H]0S,-B8h됮Mr-22x!P!~D_"F9Vf5%9#9gC rc,RyGGD;[9" iJ4Q84T/Β6UYXCiRB%ZBIgCTc%%l/±dNr0EH]i<d@@Ei600mm1110q$A dZ 2=2W9H= E % QPiſޢ#7I'wsy*6"b$a8".$p3:vo#\gky=B(X2<3˷8rԌGoŰ,*qُ#~Qb6wwEntv[USu8 JJJNW= bDEE>X馼K6e.cöYkj<-DmF8H0-m !zV3:U!q{ButQEo) d)$hH!цmeLo3XVa +ZVSs 9I4xbp_)" ,@[pb w;!*"#&oq4조#yٞL@q!  ~kOOm -TE?;LlyV̹S>z`2dTzȏƘt pW;g`&9bs⡟]:޵F'5 j "d/}`he-9Bi_&UW@N[t %HPw4zxM(qIQ0Y9g! bYEgGHfC#xjI >L!!kS(C$'n%mRYq4ط%.;os/JFtJxԿ"f7]oj@w4xl5 ~섒hV6mC(&S1[g¹/ i}\M!>t.H@K'kj.=@ܙ Sqs>]Բ62 T ;MG=Vi@/u(u;a7YE2zeXүiv;Ckc~UFNRdhv sB̦nD\nR^UQ~HX"Rr%m0} ".52vj״ 95^kk$Bp5ӚvPm]eHJ:{KL7syxf0~#iqhm6"ǭU.d ʡ C{Y_?>ͱSЅQIIIK%si.'61Ik,_u$]4HAn8߰#cxm?10x-,[Bp$/'k%\ttۀ" #A^HgN !+bgcjsƱ>#-y @MA)kgԼe: zb" PtP)@/ 08Y@Q!Ou556JN  35jD*`HRd0WA mߌ3- I"i eꝍ@pȞP;o 7.X_M$L^\,Ǔ!p5Umc(m!, R_]^ (u2A:Wyc̒x H|W#[5""Q =ZGvrv:D*)V2##_9JթtuYMe'j0 PS+"ԙNk[e(E/5jDGP|p4L`ӄ,+;b1(M2A.]E_f^IDB/ !Rfk몖&E m [ɼ!{6 -a v)i^*g #MۛV˪l)':##$ o% >\D1@ ]nUWy6Z  ZTB iyW',z>KKgV A+9߱& puIrsPO`fܶ$WJאl^C[u:_k YAM%cI5撂:nymCsXa)E +\kM!V?k%Aljl؀T"C ez r4i(_?JwҞ*f6^L\S L%L^:ȍzvtf$+Jbdo&}QsyBM$ɐ$! BaP 9 WkrK~LPl#9AJwv%d!e|vMnҔot^-&bB u'_q, b+n%A#B]My5WT6pN#: eǑqBV*)H#SRm5B*ÒyhYNbJܣb&Um*Dil\6D8vRiJ満DJ |_AOg.VpvF}yGϰEgr5)ÚlܑN$6rrcov/data/un86.rda0000644000176200001440000000422514200705525013611 0ustar liggesuserseX{l[wvA C4mBKҬ c;NI8iC)d's^ڷi3M"T4&I `c0 iciYA h}ns}󝓎NLF@mV[>@M>O<{AjEI/,=)v/n?1}ftia@':^8udߦmۯlc6%=(ˣ+@|돖{}ᔈ>*ľ%=of<5Հ8'ǶP{ fW,7E)kqE5)Wt"O_ݎoFѐcRo1E\Rd*5oPIQ{a>SVѷ'̴];V|gV`g i(ƃxcUT 9osX֯!w͐y#5G"NTs= ^2 ۱'zC=Q{{#Z1#1 v>΋ vvQn*Ḏf=w27w?5O-+b z]@{(p+wvca:ʻq y Q1~Mz*r!z+ ˌ442RO2?# /Gc Lu1˭{@4@nzq .~ߨ/{8c_ס:D \<Hx |/B}3Uọh?oH^~бHw⭐fo :Amt'žO-a\E]";;m `#-#/2;88#*/YQ'u\WMoAhs+2u{7YK;lbFeOn%;@}Z~o^'n A:((;7]?`}ޞQcA!^"~k"{Or]Tbr:=zڤ/{'y#I{pO w[TDhL>MX';'ɯ2ހ^6MNN|['逈;{p|wI.} ?ףMd uZG8v>Bcz;޾äwه]T"]{oN~M?>7Cݟyy3^E>̿q];80Asx}8Y/:0.1r|}qzy~zJ|/yf߮猗s8^7/} ;9h˼Y  X90ŸC3^?Y{ü?[i'EË,u溫%Y$z4+mX6Fݬi,[XreⅆFbd,`%8E1 \YreeE]8`xBqi 3VάhɂiKwսN޲B73%Ҟ鲺DdIS"7UDir 8YvNJ;BiYc'Kf^*Yx3 +l v:2lM0leJawN2.Ј*2iЈS8<%/+U Y,Mn^,ٵ2Tԕӕ"HYQՐrUG%*HKCL͙gM94O1`\ҞWQ{1>#q':c[ θΚ uY=a[%33ϲG W%&RQ2Jq;j ,dz0Np&v} G֒ƭ@*nz!6h[qz}m[}z?%~%0kzTe>%;jho;L<0Bץ<]wH 6D0~j*":,s*H"3Y(RJX9͜Ly͡}a}_)̓KU 9':ƕᒠV \b(GB yp4H'?D'ܴ:{@&4~3NWh'b߼34J/Ih"k4R”}r硈CחR+ |fkUݪK^ QGMC^z[6dTƦC\[آ)^/ QmMhB_]xS}7Õhݐ?{爉+yc9H?({&!dU9[FeAAyV/O~<}_̕;:3ruݺ%?p 8,Wu=l0҆C^'>W%n\+}5&@A4cx-+̢ϻ/P =]aр0y'@ߔE6kTN| ,`/G?&J)lmM APjMH,Zsj!xo^1 pG4髰F=9 <4ՈvчW,/C%P=紱9WRN2_G -&IFDZa} ;"fm)lYc󗸏S/\,WHw }`ۊ̈́Th$Qρ_ZgO0<'Jx;Vyu9f r%Gׁ P,A*ǾG_hv?pA,ܴXGhRAhd_#/CAlnou;0rQ s~ {CdY}Ir/K5//ra[v+F,H[5C\k<`0@vyGpQpQd=X˫3$# >Y6:GXs.CMDLԶ<$|=4w)A lSc٦l ž6JC?-\j1/%'.XuEk2 l.2X`mh_9$cFu1$pvi$o %SB9 }uW0R*LXCJgږd<{|qE}uY^ 54t]M\D !a2\8ڌr)+ŭ ^&6:__g)P\LmwI tT}bDd%pii5жPxN\ejq- -p98:o?mDf)cucH0"K $lAHTR0EV\zuG59ve#}UF6.'9T *GnKԔ$cX#WMMӝ"-FK6&ĉ@ФL@)K6D 0#u )Đ՝l)ezMAR z8*ɕ퓻*"m0DM3MV'[ąYϐnLTV+n$E" QK)ovkd>u2#%8^I UtcFƥCLf۪u<՞;+,i61AI>,[˂=wԼꏉzyZ{FQ.<-f"U2r#4-ׇTVi0i[7ϸ9:$R'DZP\v0B% #ES|صMw⨋gq|F VNiф 'd2( Q/cJzBw L<--΅+-Izxnȩw}ќ׋AĞHJ] @.yֈh^-J^/ˬJIA:kKih?X:ի\ 6*fHK*TU0,j 7(>NJȗj^?7Qc)zPus?A0$(/˭Vgrڌ:O_u俤~{3BWˌ貼G<~a:@s)%/4f/UM$[UITj(kg\ț[$tV+ 6#}UKUx}1;PLG })MI&Lɒ%1h4[3U∢(b,Cz5iDa"jd$\0p][iM(,b;D-Y,-)4fSo9f-I++Ⱥ6({o'6re5:85kT^?Hſ >#3Ug!nn }Y_fKס҃͡!]6[oS{>(Mx&4O 0f3Bs$]\f^yH!uz# *8s {HY|:JꝧQPΰT`DJ;¡:˪ڹVFAƑFb"[H9 ʩPܵhh2tW^Sg{`GtC}xCBfv ;ra MFۛ9z!TTCG(BphIeW`dwPp:ga{Pa?\T#@y75n_zf2vMW$vU7pw܋Xd.>_^lI6M sL "186.fZo~kքf8fL6= ˕!S2" D_Ā:o<=q%}娓c+p3(=t#aKpHM =(ۿF?-uSd&^|A??eD }he|'Ku/slf/v/9ZZ>uٴdƆV(b͑%UI.V3,]lWݩVȻiH/]ZrCz7W?1ĸ)IbG'k*Y e0שd@ԖOBŀOڳeL tZNpGײ2Eg-t:0IL?S} `=?#˯|?:8މ]tPJ}+QQm]K%C_dqCO}LWof8:߇q .CB"^I%K[zw,{`z@A FӪt;7e9kz+OSmk9\xzpVgDkfnqTQ ˤ%Ёb*Viٮ♹9 %"2Cw2QKܲ?@@Hsjm'4[!,U5QߴxRxThd YМGX3`;'s8^E+]|p-:;zЗ+ <k2[%́s1cN>"gQE}| l|HQS%PUyһa jC[I }C9A]OsA-ħS[Holz;*v`ӝJb0"quw6OnU7\)qD@wc`su r}@+h`cW-LcF,lv@mz ܺveW~WY5]W~MlMeie3UEc$B?Y̓tmNZO Muwna>l!q|'~M}&UKk8ʏ(SiS5#h7=ɠgX)f.CNP6W}R85tlu.*YbRܵE7wC-\ˌYؠ 3ذވp452/ªr fwppԔpaj5MD CZ\k<:)Q/"7݇Gd2IФM~ \Xiכ&\jD]aTueH#m0UO#wJA".颥6NήAupA5_a }ҳ!Da9w]O[^3lS},eT (X+b^%XS[SL6B/꛵9fF24u>S>S*(U=ɆӾq{YڃT~ZD_`(yNp_ Ii,7k)?BʯB$8x?op0X]wmn``r Xɖ^:#ն@qRFⰖ,1*mP@S &岩{ڠZfP!!w'HP,@U)A)eq__?z'EoڃI2r@)4 |gٳ{D*R#~zހ{kk j n:(~NSz|aCZ.],=NS!FqԼ[p gOtWùt|v12kHZA +; pA.>&c$A2{ `f:J1z%ΫvZw鸞琲1W ]eN#[K:2NՐ.r`XOun&OuJw YeweUE$#t>,KT 38?`;?ЕiuG2[4*ɒX#^vưgDXsz1Ǿ[͠FwS4d\Vo>3Ofo}TT AacI\QE _fMKsz{!. ')hvUV1~$,6ˆ؀lGSE40Q>|Nxm%v(r7s@ǂ#^3Zg7rsRoFo2EYN&|WA~y2B<,?Agk+pRYM߾PLHFx?X0& [$ cdDS=MYui $"J/89J;Ym$w`p;47JU2nk%fC$=wQVi|04 Fb^)B"8FDH'{$lc/λ} Umݿ84fd\3wk 1 @|G:qmN >ywZ j6=G$XMbL)疓p^دe]ȲZ~sV#0[ !U^) &笫"ڑmM7%I V#t*?av_>Nl5'ߕM3]-k5؞=,[-b>Y{ƞ1UkN*e{}T~!;JobMt6nL.yo1UY_Qw7iaV5۴{{aҵ*&E.5~aB(☩f6fGW,86äp1?1x%2VO f/_s *6m kdMp?<!Viym?Psyo"RbgRE<,OJ> :N dsvVs|PԁUO)gp8|'FtQR Ӎo%J*k `KF\bַTxIaX‰իSTmrR$P8JxYHdVO^=Q0nÙ&'n[J#,6(`M\c]@vX%»5` .lp'm^O -_ӈ Pktښ o铁mmĥ擌jdeRdNWjY* d`ElyGqo9%х3|iH죠zAu)n^ ~")eka6'0/9ƣRw߫Y *s(LzT%RR gFټM\q-TR!Wjg-XphC xJd\}C_I?8bYT] eOqI6Ŀ:!YfWwY!x iޞIH+ѳm{U=RK26z(ńÌآb_ue?`ST~#0!:ljAK ӲTmW 'qU9LCZ7Ŝ5}.T eV`='$/k6__!x^ݤebZoVSVt{iQxJ/$dwfpǝKt$@ś dDf2-5ŧ'du1t0C)!3SAcx!>8DÈ^(b,P18~P4nEgd.CW~MԊ]-ggCZaP /h(zjiiΚ|T5W@(zV7q_#mA>Y٥>us*,fԱjB^AjF$;#eL nf*ߡyW̥#M#KR?tpߤ ( `xrnﰉNw-M<^VH)Aw[ig+6N 檸x(6@lP0k RMդpV3j7 ߭|ʅje,M`?h?[cV| ðj}NhHW3AgQZطC]A cZ|@B>lIbʪ'GfMc'B!2J6?%F6N1gW1*hel&lxZd9bIP0h;KrIv3Y /Vzɠc~ev 8F/)]x@Yxum u*_zQv> lMuqU{+Hs̺kՃp0~IX8N03@b; jMuT]{f[+i9fk=q1}_8 44 l  03zSOA&HyiU$ \w' !=5U09h*0]t[Ddւw YB_ZgDveDy_)j.J#wۄBA:_4w$u!}CFadȺ30R3vW7}0> la7ܖ`_|nVG+Jǫێz׈fp <[̳|t anjԶPl$AZ$DP7vl3րˇ+ -}B_矮n ` uZ&V+%zoPl'iIC6lh4L&H9wAC ER{yQgLPEavʤʨ; <}mhN,ji.FPy;#%@5l~'?n+ ~ @' C7"5cVF;B)kNJ Х󈊨e!|2±j{s/PZho6R]p_n븜?K/]|\ilnrEEޱ%kк.!zB2bpǶ[hIce+`9Q%uŽQ `IRI629xU0C(㴯e҅:QRYe$ND!C)1U;xTc ?'?"=i$Ճ47"O&wAD֒;ܫmeuSц ~R ){՟DF| " n6S,CKT$ȭ;W%YmuV|#O:jzL՝;XH׬``&_Y7 a d3DF0AwSKDt6p'߰3lM-Q D1=`mGmZ3Kmzm؅ç m,˄yk| YF4|gfǺ혆 DU/Ř]-Iaܫm$"N}P&KN6\C~ ȽmJ˸I+ڛ ޮ|正yRr%80$Xٻ׬[d'cv1n FC(%$< 9²X dQ1=7u[%ql1reQwjt'_Q"S AMW^,tNsd>MB-;+F:=$879j貳0} fH8b2&@$ZM4/4e,_u9>0 YZrrcov/data/Cascades.rda0000644000176200001440000000126414200705521014513 0ustar liggesusers r0b```b`a@& 9SR|> 7KL~{NF6=EXz!'[??]$~9K {|wWoOoSyngiUER. v8a˶`u.[]&(cV~Zgw87<>۷6՗_Iӓ~/Դl]Xڧ8-x$=wpW0ݱ_UE7듶ۯ4kC U~_~S'-f V?wj_>(vG@ޜbe赌.}—Rk?"3#=u*z@"Gwӓ'u `۹d;LGG߄]`a{I󚟨? lӡ8B-YsA | s[ZZ\.-*/,F3(\@a ghblij03BY#xFWtUdi@\S2~uEE<P6$`͒sj+Xs?ms&J5mβmzoC9,P*^z| Xղ}&$RE|}LK;pw['{~ MQec[/<ﮚw6*|X.I Z.H|&mˋ(EwGKDj+>+}ko~OZr}ي6:ڬD9yK?`}&NAM,[ FcpDt}t7({`j:X?"TVHb.n%/Cq45Wfd[%_ yk.P'݃D/܄)h(I :,ik& L;<$6]wXƪGhN`>뎝Gexs$ Yk^_R.V{g jϓ\k#Fa՟ѾQv ӗ4KIXe;}9٤ 0; ^dє.ѡOva2$N#b 0h&I@LOXF,0*{bLhc{GujJ١\*1Q*1dl7oZR柈8?쏀1 !z%bceHc+uG)|Ef;UXhcaT%D9c! g`{A~gs;V'wO4Ӱ2CaSeYҖ*xwSlBnpŽUWzi6g,Y2mR&4䎔ܕe7LsBoi!y:ܳѐ)#̀lDv%,f}N0I{fZBTG)p54=!qj}eWxdV~Wa:GgD7qx}ҤRH(ӎQ6j];V < "T %d^T%*V]S*R {e8\t+s2{o/lJ%^k5ߨowZ- RBE?۞falX ;xYez&˙ {~e*>ՙO]%﮽2[9['tÖ+pOίFxqPzW̮1pMB9ܪdf8LJ6P}Yl'%Z_y]֑Ztf! % FOR-U 8J 62˦ThJS-flкA~~LzzZ˺`0v 'i)rVRX(ާ/: *~J- I!ADnC2=WmrI{Cր?a{iGL74 V!DG-z߲>pQ$#hYצ.t'Ty\|eK;;'~{{ԩ2kFy4YZtxWeYG6ܯ3UGYͩwPRqYg7B Z:@;[414)wٝYWThY6]޲-]'sMDg9+P!/<(B+TXxq ^}+&T4~x1yuJq!Ox?zhiWAhvުv~E e݂qo:]ـ&J׸M-AU+gkb2YF|j=I潈`E\QΤ񀝙%_r31)D(=薾}6 >]'B`k,q@cjdv"ЉDfslu+3roeZ|i^clUV@+7R W=7|k vQ/$ r]܌.c^j4Pmג2RAZ1<m̜d+v~)9Iɒkè{ҝ\ %ĸԹ ]V`$G:r"7d+fb +"Aa_wU4He#8Rr<ͼ^9@7# (t-~B`":ԇY4AYg Ǿl)g' W\ c/, #Ơso\jgO^UO)B͇s\"44T>jYϑZ~εX "m<;yI`.u)Fz ~wi_Nw `ן;`GJpwLFa7*hY9uH}9J FxӾ FMe)QŲpT_ sL6,i`0qtI"@N…8{P!+ m.^dwz\e'/K*eڈw'ӂ4XJmޯɧ%u?VJ6j+ͯd^)/HNjbЧjr|Uc3|׸inqPBݦV!SjLk_+zYN`R4Ixr+JzqVc g>0;F.F;ٜLj> ^ Ô5bmB*s{V~zWv>I?H_[`[ʏ!.cl ZF۩\ _M[z`^Ng/kЩ-[~2lM;Z;&/ނjb1Q!Ay&*oTvu5Aѧ zjaەTQ& <7x_ì;, XH>E { ī'r?r}rT쏰]T8T[$(K1e EAgTt~Ɲ !Y++``O"/`u0MԾWJk7exj0anH ~SEn񡗛TefXU|vPcqF(U( n1J 3t۶y R؟uc7#abQ^]4˓ʔIO>o[|.Lz$ݡH d s;ti/7;C tiYHl }{K -|Irkn7ʋ$7AZ)e#vk)]n;B,!ۻNfNس9}z,{[=cJq^Ty7ZEV@md |?lƟQy >*h~Kd$ɟijGRפeSx*MbebD xg{+5!^ if+<(^)͡QC/6?m #S/3/ceIFGk%JxsJU_yazE/>7@sQ!o&ՕB5ZrlA9Nxetj[&"ƽ#i:ȧjr z6%& h3'r 4,yo z%rnS̉kCFbғ}}Cp2[Q'ĚN2§qj$adwˀGEV`g{tES8nbHjD}xX7BnA4M*6UFV$}8SEe RƼx}7|]/|MLo=(\+PT[ 4}G@[i G"u! 1K15ln6VײCÈ\yJķ*'Ԁ-s^$ yaG9X8vjL;BHxq2I<@+&3*B\p4ҷh'TVΝ&m\{q2ϔ/E&}b!YmIW(d⷇q -۱Z*aѲpĄaLPޥeoaȏ_=9s'`p5 (P`>_- FN>i -|h v3dհxoTP٥c0Pm 3tD:;{ΌĜp!xWdtV>Y/gA|ӈhy .^Ҥهlin= 5Z/ۨfE[JuB@ɒl+=.IDOdf.* ,L{]%@𻿢ZR!+aѨW2[Bwؑgl"eRG92\t"n?GbJ!p |wK*:t~Ci{t:+ĺV1Uq+>7[KU|`:K#G;b"JZJ T*Apg;TN00hF -Z$sfJSAh6=6ۭjO#ɑ3Xs{מufxҬw#iKGJﰿΟc-e O_F~+"b?mRᤅTQ [oYn1dZYSOm[vRhݮz1IdA|ZB@y ޴)B{U@ή渆wBLRmL&BXOTP7j[6՛} )q .2>0+1YCt]vOEMYI@x$߈׫S|MxtC]͕Wq#sC/DlWν97?)p%A\/AI1\^@v٫ 2[W[_lKx ˤ_[$+1)sҮ j{ZqN߹ZbKm 16n3u#ㅃf3!庬P蚱T yBm7Gh뾍6=)C,Abc#39pqL5ubs w8 dZw|l d@hom6?ٷx>I'[C&y=?yEj ZtBFFp:8Q0+tE] ٮlR'Ql3D+id-Äorit{s4TIt/6BaDHHh6ǁr*[Z.?dqjażn؉6J]ͮAHȬ wx/*G;i-P~KȇL.2(ڋT=Ӥ lR:zKn5S@DEɊS'kVDBhZz\RLCuOz^79.tՉzAXf7͎pC7)x;LdȋL+v}n4q{x)㥭BCs&qeH0zS~f.SWUm0?Q }"D~l@"8I~lBܹ߼1Ϩ1AD¢4nէLA?b9\b< vQʓ\̽kIЂA؅.E?cl.`>㥝yH ;ar=#$MvvROd!#&-6U^xZ…ƛ]+XO t J{*Q ݴ.#%'BN~[mq~t)( P̻fW[{Ph BZe,=W(KJ7RS S@emF7C˘Z@~w2$) TyBL7+wKbb';Ϋk~@g?Zr V!Lm]$2vq"8qQcj?Yj#˒NYx{keDhVaNIkjLڨ)~ťna95:r3< =q@Y^knE)W9v/mg9@^3F"tȜMxj3(A;%7Yr" IR5_6N Y8*4#"7 ķ}_@5rh5%7tQd5m/ +g48.0ϫpj%gdzo "Oo͘ݐfIs{<h  bd$1/8K+]Bf(g.™Lk b0I a\tdFL4+ XYC3/qD"X<ژGh;56Y pO}|ݻ^1,`ҍYmNI4#z KQێ@}{uJfZ3b7'ԄUnc\n$؇do06]"4sq5K*=3OTMp6J[ф튴\y q&E/"ưxe/H}9V7iQ{$}( e_3}S&g D: Vr/^_WEDZ|!;.Mc (E,`" Ȏbߌt|h!C%ǹ<؛${m :.]#oMaZ$z@,ȵyQ0e,.W‚^ \o\3=}M,)XK$Xۑ{@MQ_wx *V%8\%BVhXYIV8 .kّdPr{qFI#nBgvOȇFrG+[l[<|&a-/qǭ1D= Ȁ B))&[$ftqss#LëuبMo_D&hInd44wM$)-) '. Q`deq_Cz  BKSԯ%uc?E%i&tY v W6!fƉ=?ў cfep߽Nߒ= Sx5À* =m^l}D Ll濢̽7 B} γNY_隄EE-gX2?1 :y9MG~Y:7C*_IsSMCuF{R}?/@e[d]ըOA^nd$δ>ZcT&<kU`^\XѬ M1kMlcKW]7fO,[)h߼ QH*[k?A;D U'hOߟS}EvH}y罨UL'eB'NXz+N*(A `r=Pˠݲ,r'{N7;wx,% 21,^ 5E@Fi8b*ޚӕ(_ J:ң*MF m=|bW*5{,Lh F7M|__'',̠ؕ`<%kmuA:(b ظA;{wKX!_۪؃5{R"vPta)<ʼn0VD-wk~mXlHTO |L/J=o`p1p ?DZBH?58zOpmatNd܎3*\۽ i5VEf%#{U7[h(NAw⛖bchPj캝sZ(u.}8v9; ZڜD-_pFglݢl!\RCxʐkg|d+C e" 3/\5վ5Ȑ~SR NwjxATKO$}?=--,wD+uiτ%m^ 3fR=1CYsb3Q 1uHuQ`&C !6HpŮMj>jn67zToZҩҲ7[%)^jX!1wUhn|'j2479]{G;oRjQtlXSe选 B<ף;u}xSZ)TʙHs&DW! +n|Gj$v9kw\Ao (>e("Fmy*!%  1TuxѦR9W(WeiO֊PXqH?SX `.?LB )άq*}x#M2?\(oxӸt#CȵC]5vŊ'H =H=2|>T_&M×#J-ҴnV^-e8N}r% mgdvꏊ 0JRqR;%̘ɽ*Sxd&՞LM4.g)Ua$&c1(GY &rvN{9o[up4 >^śk6 tC>_CU)Ғ7I*kaAQXT4?gKf4% )e uHeOcL=3M:>c3Vfrvޱ񵾥R_3%2.P7곲V2yvc#H%ΡZGsynI;U0D!Iv%Q=dxUք]iᯱBڴU58n+?n3apɨN:UP<;չ|H_C P\Fy k @m!Y8LL.1In$<1l@ux3(fn%n#XAT*wyUx 98˾ߑ3d霞m[ڈGt%QT6<Z>e5xӷ'lݞ^$rpCh۽QH3H 8ٺᗚzPe~[|WFT%eW1s2  V4zJ&"` gؠhBԤ{gx^Fi{sV8y^,ځ(ԏܬn>R V'W=&:@;&]*i:1긾IRIiy[,4ٴgCb^<Q/d>=9LG Ѽ?@soĒ!H#cPtDdƨfYT (MhtPdD-K=ȖmPpפ\T`?i.oY19+O QoFEX*33ċlzVy۔˰G3 iMWIdp~)*9PIelG FHhv1bpGvk~Bpt['d&Cp JzV u)=%W7K])@r Ab>T|^:tKgȜ5wK+D*v_9_Jt!:HL @+RF?Y:6 OlǠ UUlN'S7|1)kP਱R/Q[T_rvwMECLa3f$Z̙@Tk1bb,2(;4eqD}93p w'd).dC?OILJ#ɪ)$FW$ʡ&\A$ʺrP~Rgxwa n@%g@&BFƒC|f6_=rW :0 J~Dq:r0^sZvk?iv(*GIC/UefWv GEJ?l9T_E}Y,8 }eT $;<\Kdarl/gF!"N 7M9ˁ-L,d٫A ('tىǣsf]%N-'HD /]ũuQ3#T*dSJѩ8L̃glN&6VWƍ7KO~rGDB1h؞ uUDj=əhp)^c 7u_ׇ' lG`χs1.ޗU8,qNem0nc:PpZdu⳵k"VuezT\ ȉVlkl(T C BC%k C4 .xL f!s~`luvMاŜ2M&En[ߦl4){}O%FD6UPpgOV'єϮ/aRypoQ!A. '1!l2){p:{F[*_`r~jqfc mD26pLF4nL9 oJ_/EkA5@oo+(NUk hSN.܈ɋaݿɭlj疀i c*[t!'OsRU!i9F唇DMo' [iܡ7ČpΪ|~a*AQE߸>y_R|U= ;œJ=< Ӱ\Ƀ AZ7;1dnI%ID=H.Y7Op;Z;D%lv2[cB7[.%`HtoY,@ϻGP}!&mu @S0)=xHeg'43pNz!Y)gxNPs"Hw='Q[z.Z_s[Z:ePQ!uwfE&mp&]t0];OLd>Cz'8E2I + )%c9tGoOk5x߯Yܚ?0~ϗկaIM䏡x&aX"jkּnݦrG-_0%{.eXYLEo9m@U+;&@=*|>2&6sEWiD _6H;Ͼ![KuxiPc'cv\,#t,hXbN5q-!H׃֩UϹ&.ůE#&@WFW@tphܴ'*B.$͍D$u'՘Tc?Ҽ,h !$/r1bHX<_ׯ՗yiH-L~>/NvB)xy9⓬|f\>ҾQQap^ nEe 3artd2b5wd]L,:<1#Nɬ5\ Sp r)8+qr!>zbly#wK*"n⳨ҡ43qǒBZ+X8WxtXA)B0?2^[QjND2֮TDpnƗEr#[sS0cᎨY Gb(IXcp! ABCHC׈§p_ޣ8:~'FpjtNJ!@2J0EGn-›MZb{G5=wR1N@J "%ho뇝Pr{O>O-o4>Pf^>. r[ޮtDҠ%ϴ"vX=bobCY梩1m|Yn YT91OGA~좣q 6 w縰C8w-aO *'fm\`53i<~t-VK2$?h 6C煷ʁ s~; Nۉ3%1WFQ([.A-ದuûGקw?RitSzq..b33 2Q3%f;e a"?~R>Ƚ1C0!Ԩi/,O͟N̍uͮ`ej *82*Z^кZ$dbHĎIˤ_ p,5` 71*Õ8! :o`8p]U^ i_7iz#KdY#27ŁTjv(2ݦBp>"BNp!=5- _f"O l3.2p9Қ ^47=p5f% _ËlaU߹o$I`j{zUzގfPs?dA'C.R./Vq"FyM3ZFh]mx>yv?4ADd1Q@!*I**Ewn7nl|2 @<G>k Y5}3y| D[XxVEuv9/C?tr˔ g*0BȢ @ w|v zfJVwGPT_[}}did~^ee4Yog 8ӮB*`:)TYVw!ɗ kA{JVNt gfmɖ]qH7`Ӕ1bD?i愺_+U|dvJb)|=9#K ],yp7=ɂԟ[,ohrby}Bbx'j3+D9q*JS=]ȫM5ݗ>``XJWKܣ@\񽝠) ((2 qF_fIQD#x^@yV/!m˜Q bVzrϝ^Vw$hYF#/Z=&?THm0_sI:ͤKd܀ׁyŅKdo#ah]%~<-/ْ*dySykXwߝ޸KEq1|9;>,I'bme(9[4Y=?.Q%ąl:h4iW7U|#P!uR֌uB Yxl< R}{e溍ˀ Oư8Ҙ r Y`hQĽrTI֭ ]o["HNr"my J { Eۇs  ?*5;"U[(~!~BHt_@oqqͳs| |C5ua@ `"xGX -iޣtͰ^RڪRI-8̑, kМΣus`1V gI~K~ګXqcp<`GD/Vsk~Z Ɣ8 0YZklå[9u#h&O{\~ ̳Ɠ(sV!O7ϔcb8|C᎓Xt/A7u@'gjpa9O[l?P=<tK'@)"k1\R !M0<IiCiGL\!/ 6lmVrCa(w>wt7yzWf -(4;K1xO[{E 0=Op^*( vu]4#.kګNJ1Sʶ21yzqFXah92;${8m>?,ݏ b5ɿƝGApu6$^ t2#Z 4Ug5WPgk_m[pZ@_p00$K{׬.` ߀m-#VKf{.FBPmLZt'! z}ԛe}mMJt6LKJY4jz,Nyfae=f>&ڑ좨 kC'L.m} fͰ12G 2u !¸ZKb,Ix uo&XNQG99 ^•#X9r{`w<?4瑩uo:Ky3 2@iӧ;erfkQ DzUXͼNSE?6$aţl]PoF2lфǺD|QjEXv5Ӌ⟫}}ѻ{2jv_veF1 WB1;|@iCԞ`2*7 _+kKTݲ2M2aNsOB|+cҵ/8Ά_i)+<4DD,pjFBko% `&]h!*j&-Bc.L \pz:]l^2szfvć!:F\Kso(QCkdRv]+ޝث(]-#OL)vUӚ-x>:R$2Ӏeq&^m]S52^RM '㺡WnLxg}T5~,/>Z^HVAd¿G/(aЄmNN:[>'P]nI,k˃"gohgKͽ\`ShSz: +]O3o%]A`oOiA 08oau.d˓rP3K*5p V2QɣmU5}3C~BvUgs]t1mCB嵸|gIoh񎤊,|p`+$}\ghwĠزl=;$:7~`e$B>>1Wx.~nB,3uyDG,ud)_;1& [V'b::cI<eZ~Ѳp}IvJ"9 G6ٝ.)c^/>KF0U;qis_3.PYPTQ0< LG{úŎ 1ǵtD2|cV'c5_=WN)!"3~E ˟ܗ:\Ν HDSo^tXU5HAK&+U3KݨmpTJEٗnWޕ` lʻ1UwH>0ΘaӗRQdCN*aЫ&h01W/Pg-KN C'bi5/}FJ9PElL:9S]\&CuoV%y&!&>&U2t/NgZP'Opv~4 J4\ZYYLJx!|<.Ff\W(k0n#$LFe&2)Z>sنR'؋9ӟXy`&/^GGhǭ2)င̕ 0%U]8"OKSLyh*/#'W3Br%?c dLJ8 wU2!(>D`%y0 HGQs)I-4,|B$V`ßzDHv[(sGIy'?8 2`R 0@KpoN.<, rs ]bqq$t.OgAÚ8QֵW^ ! K K٠g `xyYҘ'6瞂Ŋ#^p1'6q|0kLxbܗko;xyZ8 %R}BUSuRjPr!"A#ə$]߰b7~fљpALzub w)$R';"ӀY|f6OpD)͝!t121T:S>HTFI`Ushl4wKU~DN1dƛw(N`^4찥LTf3cciW Օˢ\`f(ad!D 6zS%׎~(MH ڠqd^[j&o}z&;)60чkU?K(7ߖQqf׽\]:Md&= @JWR37#Q%#~T!$b[6̈́%gS4?ۯP])]#I ޢU_#=l:rNRO5o?rȢ?]0b$ hC|?6xT+9eIBli'}ΥE]dR`*[Z4Rz0jo 1ڗ ܢKe_,艣ww7_2xTf!#5ߘPJ!`zI%[RXˊTˌΥdT׋su 7d^ )f.>*ge9 DqK/l;]_Eݱ+\EЅMLpI92uy|[5J,\f$D/+[Pvcܺ7I6WʖYvg{b,݆ 8F;\zS NzVQ.fs0͘Z*k0(ro[R/$My,/ 虈Moϡ yq_*|_^⟠7w)$ =HT2yDaK(J-Z}ϓ$HJ\nv/묆W۠r0 N"]Z&QW7ArP}nqBPv2 jYB,sFw<ɉn!C;){!^_vTDE-b]B8v6w}5amiT-! Xm/WmbܺM=+>e\cY5'Ej8#wJ+D۩i< K)oſ$~a6&&oW~>Qb!+FQoc!-C,ف^@A7HUrC'I'QC X<y):F?@]QHvFl3D7O E:~_˼Z~-èMp%Gۮp85^`<9З}Z8V(䕚& 53lB;vn=y-{yz`k"#`~>R]>j.Q`d}ßZy/w/2]R%P%ʷ1誕l*8hM91FG_ǻu&NK[VؼL?n ZHn(U'4|Ǭf\\AϤrWy=4$ ,~>8u_ʗl[5tb_V1h#.60s&M0ņM!h'j`ۦ(k3`U ~MgN# D<jE+b>52}flt+ )30-#U /1=le=9\GX@DE=2AK d|K3.'LMt` 2B'O]_vW@&'n&]nQ9]jWw[`d;-4ce;Տ@qn6d)a8(a(%Cb}q-'$Ŕo%H̀Pxr=iM2( ~#"{< a*cI{=DY d4$@^k^_%U(6Əcgl'`CӀڜx:lURc#F I*P\jXlǣ-,ŭ-]? ,J1q{86MpMg~c8%Aĩhd8( I>BP ðOT2`OӿQi, ]othʇo](sI /2;@3nJ( udI0kmcUֽNV{qAeM:'qWu=hjF s2JԒ׎?aUՌjK%e+.,~$qYUs̪Vs;?Cc,40gjXԢ *wܔŽ:[@h o7!?g˅>VWSu$;8H[OtR0?_8.-@v߶0bEk\܄)ȵ_xSzEJ1zuꥭV#>F.ńڤ,;\+u|ܳا oŶ3hVq27Ɲ.j,ͻo7K}3׋mzCkpHHvC b"T/N/VBͼu&JKsy-g?+CxoZYF+,X"4Ļ ?ԳC~?^8G:ѡ͜Ru3,% '3ԣỳ,gT-2WH;1N!a͔ կ0ˣ`}7siW[9+]x7ԭ>w݅\)+{7ZG.!a 2,~lcЍ}$x1QjK^x(ґb?f% _YcDs]hPCGBFX$i@i[o,xn Fl$d7pN :@StVC9vR@AiXnHw_(\}Hryq[%!+Qcbc"_^~'λxApUon{إaġ(s_jt`G!S\Kq7N3H;.Ee(&*Mn|QU@z=ԁ}F&lƄ(80 'nТ]78poP(tP4L\!kY*`3_S:>}󧃣@?lY8!uMo>I; Jp]xTˋJtvzsE@ i!\-<ԃȮGvς%h{xr)zaV]kTٗ% rh'EDu?CGLȲ攈ނsZ ӰO h_b*px"_|p$ ftv Bܗ\d[Dw\lpr=m(Ĵ<<5/E)_@Nݠ)d 3tY[P_CT>.cZ)c)ѧBT[8?섶foY̖p[yvYZ1 ]0-99[`[yp gdTotZ|4n.9`G.Pt/RS}x_"J0=t3{v'q'ux4NB9zo޻"[W?-͛oGB, x̻$}|\ATtTYHH. 9>2^f@ƞ黿ÞkEXJQL,<,T/&WX;kף^Dv$V}xC" # 8Q"GCjdd Хh,"N\&9 wKYZn^J`{ *"E,L'td9~(cz_B`QO;󀦌CC9Abp[O{p V %A;pSjP$p,]nRMJ2Xofnhق|_Mb7f,`HYSQ!PL5{;ب7Oʏ<˭5pSV@\Q'Z,O] /پBB`vOfR;j+9 L|HQc^[Ԑֵ (ÿFj, pKd֨`l˞>_L 4ſTam07οi+a4I+*!a:^ZL1z4!v *m^U*<8QzX8ׂٟ&fr)! AIﰄ=>rKlpgc6NGH0FmCgp2u I뷣u.0KSVa n?{B14yq|Mŋ4;`H-cG0Yö!=GpWH\~#B(Wu9sa-{">@W鶵$ TǛDF'h/cf|n<)zh >ف!\j; @3Κ wȕ_`:]k䇍$pֿch rGM&Q/21 G_#4ag7?.H]rN*݅G(ks6J W+vPUZf"R V`/hCYr yW|</+و 6:=jo {hO^{`{2 )ߨB>A9DڄSE~fr.qLՁiyޜ:+,@9[w݄%۷v b1-Qz_)fp]}|^%tVũH\\AҨw)hRY9KUY ~ C -ЦY۔ߧ7VXҤ-PanW={W_AkᚙH7ۅ3'/iD8*^$(;J< 4n"'ԑ0a5:.`r%Sd}qXSb/&$ ̯z%N7+ 5W]HK*es3bwK>~gWIȳ?ް7~\2h A*䐊U'Z dEāQ*־XܡίԼY-6~49׬(60,>mAWyNnUZ PJY{FfNFҐ;d~]M+g_%b[ 8౺,n=dc]}$/Fz LM^ /;úKE톑ze lP)y85*C }=T"=y'mqvKT9b?RObآ[Uȍ,[VfUiSO?RJ-~|eI+r8/gghuP@߁YH D=6Clmbx bW[/8'T_q;B9<d 9 &nt|Phj4pNe"AjO8SrLW!̈́Ҙ΋Pkb(K˿qJh9P^SP{]s3uB"ng. #+Gq45c Ty1RQY¡/3 F=" `i -SƃkB' i:}S\1ugCv 3L5+8Zm:L~}+ mQ>cЏ٧2G:NaRd 1P[Gqt^lEt?hvu6sp'X3\XjVc-2v>jz\GV=mS+CmǶv'jk̅xE| }OB}5[n󙩛 (BBnͥˌ!4<z.Ya@#93SNԏ%fjFrs/D;ev<ߺ/> y2̙~TQ-QqA):㈉ՕMGj[_9}, ;̐B2˗G,} UF lG=o^w3Ќ4$eV2Oۦ .m%zu(/-jk-?=Oʤ礏tUh[lZTTaFzOFe_`ۘ"QGL_;\q$*sE@ˏ4)'WܠxL Oj»>OyįyDYƛ-U2Կ[p,jԹQ VTroRdk |N98* ׿Ez_G7m2itַcp}(?Z(~.]UVw8I/!}RpI]JK=0sX4!RL `R'o 0?~E.f9H._&0]䚐LEnX.^^??єj:8hU J>ZZmX̌Zɟv6R7(/dwB*<&t4UB\r;o#mi*M7`d.ߙ}/"4f.0o]=l>9U-h%OpJؼP@JJBtm?C%! en}UYjV!15/ l-_>fbfU26lY^hR\/&?L p̕DgeT$hC(2鐗_ouE¨#.06g_JSv7[1z+< % i͕-V~EV-pS_ؼ]5{M2t] cB eb9nuf7˕igij'=fZčfAOnk{-XLZΕCle6Tb 5xAmȉuqAEU=؁ dQ7ETat{"F:.l ͑&SXlߢ~p% q:Kv,~,(t> '5?aR}K į:*觇Da1U_)O,c%#Մǂj,sO(>3Ե |cyYRla;A';͜oB<; $m 4J*j@AZgpC+p<'3FH\G{YJnEBwoT HmF|DȬR }К:E@, X ,yg?TdI݇]Xf2%q08_{+fs`>, ),G{As2/ߨ]K>VE_4BET 3 ^"Q҃sմ÷B)lf&v@+c/8 b{x? f< ٰҹ9ʚu+ D> Tt_2ŘQڈ7L$~ƙjFP(-ŠvٚƐ N됬*P؏*PNFctdkEt==?gX\;GB#&-NP8_oEa}mqr2+@X8W7qG}J5>rz׷djYcy𳽀HKA;( ".RjBtՆ$ɞx6ď\B|{OVyDNMGly# =paȰΝS90;z]y7t 0`:τT2>Xtyvk?9wu51 ===$V|({7!AYB l_S9\HVxޅ5NAvXc/ae<זz k ”;4GԸGQV^1ԇH:h"̓Çm~ Ťf/,~C@!OF ڏa&@MXvD% >,8]l[L6:n;36q<>ɂezre}`E5/wD7k:_Ml|ca3 x_zKw 55TKj-o_,2,4 #/_[ғz|%oZĺ X)j_Iyz8iؘ1|};MȓlW;Ϣ1ylC*DiOk!Xʓ:5vAp+HgtRID'_K 7#{F 4'ys7VgARgeHDXKD0YIm ))״m{)_6ѷCoʆ~yb{nXA[42(o9s@{5bowĕۦX(],Y@Þ[%0*< W AL{R5䵞Bcb[))N9~tнIKn/˝lM)4/%eT%p6wuj8]CF~`dwKqI4L^vy B ?>,ӫy- ޺R_.~MҴ I~>Aqv#z.Jd.gd*Ax1YFp:OŠ\?='Qt:ٽC7QT;j+=fһ5.q.I ̠"a [!&c4V(+7٪|ycڥ?D *A>!e|3[à\\!D K+yWiP}ShN*G6LƑ3I0njIZċ* urFe+R4 ǛZثN@m#f\l=r( ])v:bR`]0!@5SZjy5ˀY7;ZТ׻$Nٕ8gzK[w sShyB;P3,Tb BU1lnA?L)<\'Xxa?U UJ=R9!Jهq L6ܪqIdtu.fxqOOzw̧²fN,B_ҳRH ΔK#Ј2P+Ufկl>YfNjY'g;!q¹{)[d7csL[,;,Cg +lL+J`O-SʪF7<b?>xcNhEïQK +W{qq8cK~dXAEs|e :Ux?~cenEI[Gl-7me}Oj(; x G߬2zf ) =Fn*yy}8hte$3[unl^*:؊O`9pA5m݁-ZX"+?DA{"}|';d^F #8/#iBƘH4ɐ256w[J;f y{eR"DFZn=#+$b|kX%/ΡE8Kkg~m{m\<  $x|,?xޤ5iM:KC,`% zx\$afvI^YIwh5p1d=^"4U(NSgN7ذ~0:ͤxiG3,~<%G"JmE5.vs[x-U"=4^X"y-RH){P\l6ˢdse;_ 9kW@ K*#TX׬uwcq}Zk&-Kg tEa bYj0BƐ|_L]F٩Q4}ҷH@y!.;s |7s<.Rx9{sPQ/ȱG6׃-*=Rhq3OȗfVmDGԟoGcG  ъ9Gξ^+?47J>8gve-[HʔH-A/h{gq6۽Mcr-hvpvSi;_dٵ113\9uYN>W W;Ҡ>GȠUC ~$+X9 %tU,a >U J. Z3 \Cu~|*$RU+ Otئb&lR[9xZ^ %<l`[ *8ӘN '\gC~t:(6%xeN[ C[[͔0Zk#ul_Od-zjM+ &tUkuO>z |gbtf滌|Gף w υ?ǖq_GI}Ns?D,!U + #*MrdqT:G6]\8>PrP3M0z+?|i.Z⤮_ c()Ofʲ%;&F,fUc6t$jzfi^p&~=snH5iS)k" 3nn %U6;,+/Sk+(z5YRi7c#bB4hԩE3c(DKt+@kö́ZgPfȾcLR Xw.+ YzcG|2 eB"E5paQ\?`ȍh+Y/>16Pp0bu J!{?hs4! S' 5&gp=g}]""#e.ۉ)}7:jmwdPXBG V.$ıHOM[N |yK,M;^ "ɇQkk΀2y?wreMRBHG]./ʆbuM7Ήq˷6۹Tjb*nq)pCM[W3=5i0Mi#ĐE[_NYt:|G޼L0ҷ4Rt#9zVvo>s-O4*HeO)ď8ܒ+xLD͉^x[mW< BJ> s;udcD@5×h;rOkKS4(gzo\YK'n%U5}'᜞k$U؃w,._3y| -MהJiF[{\sS&ed!C0D L:D?bR.UpȰ΍ Ң.%iI6:Eru*v$2cbQ%k&HM(n[K<·Tz!"3KhwM:hrcYQy+. QΪ/%.803lu|! (Gdp^1g8 4myJ/='=AG%><]"ƕRJbEt \H=FKWE>944]v'5IR9l0pP$F[pa>njHי5QfeLj=A]u`Okh# \DN AX'w!M!]B'bsaPٚ0e hF7?+C ll[F>憨؂"ɽ˒ua7z=qṕPp!X6N"1n*YhUbü]wLZzyw$`qW~^uGqDt Zl*=4}'re Rt՚ ΥCj^Bj%b$wsIK*tw6!]dFl~o3_Rb0Xajں ڱL@GxLbTVYtUK퓧=#sv;w;V3{)Gm `m t\ dI Kme o"l (eW;72̒bIBDoh,hUSr;'HӚ",)4B@}7#d λݦ >2j'kO,0s[KTny(w6וq- VXͱuT^{tlxKt#BP8-\A$u/>Fw!(SLC(#4eqP)&GNSJ#SAsC"D_Ctַ :21 vI q1@)}]y~6l{[%@0oR n-N&PuY|`pv lRhxg[bG&r@=H s~ĩS TYp i넡=ќթ`VN|mb= Dd0r.^[g T쟯o\hk/R*?m'bpkgH:QՑ] }nc|Q!lЛHԼ)p+3g5(5L{؀+D9-qtFĂ /vY|=9#"G|Dd@tk)it8l@W\#h/J K22Λ<<#m@H':]F'_}7sUN0ESuъ>q,+=2/2y%|T_ov TحxBqd3OٲtS=OIfEXxܪvKm%aE4L65defzXMe68K֮ W\>3қb/!RPyy-sӮmH$f(yU DgTkiE h)+?vč)F(XZbP q|>)G^ﯕŃX(tN|=NSENl$ysޚ]/\ v%άqR|=e<4vS&)4b]c̣ ,*C#kUhs,3iEhgAۀ6^Ӹ'Sߙu'Ovxs32!;F/_;O ;\hN߿+4dVlCd23JVI!Kc-%у4JUQE?yG!vhi '\{X流|cmt2dڹ2de\#VzQW\bh `nLsʸw2&ڃ9%9k54[a0ej(;,X,-e6(Z' C@_Q\C6^~E ZHΡtxs"齃hiu)SV=R_p;tp&qvMx|*C+rjhh\[Z[m Pvs^ց-{R.G5Ta|"wMƠ/îm(~Vn mKT: n+Fp{ZRо@rѰm :3IoN 't>ޝ!aG_(0.( S^1Lg?Ͷpa')xUȒRYmj+J1+CH:m .@n/ȚsT#HwCT!#7W(-vM22J2FwhUg@E;2e-'spAS$._& *NR/t --:KO{TAAvYI(*41_"JzPT&p/| gjѶLx\D*m IKu2_̜zL~ΕdJ[/:, H°t.$A2B0HL WJ8D6 36~%7LyvXDO;/Ypi+8}]=O;R&ڲ+/x<(σ}Dzr/Jbtf`}-lOx=EnyAT̮3"a7/ <,{Kk֐uܯ+ & pC R̦CٲqJ"6B*}XmG"漵\y1mwLlESfS`C2!0 ŊLI(Hgt2"W&uJFEXG/A.LG! L9 ]\Bl/ 05C]]VP^b `skcYC5ne)䑲[ZajOO&>O*.լd/S ^{^qausZҰ_;8CcB(~KS=SeL4t=hّUB: XkX,^ꄣRH̱c]y)([mNY+|Ju96%D4;(R8:Wtf@TmnV3)g+ KF+; Tk>^lYN{|-I z0Pv}gJWf/U^WFBH4*T$AP15CQ?Dauд$.UA ӆW]6;'^,emv.x<ވ6OTXDk(.VMŻA ]7zKZXMqhYIA5 +*w}5kt)QzryE@LHtLf;a2U~:ez䈅bVNQ۷JwTi|6"Z_{leX fD2M1S`WhXmTevbڠ)*&l'G5)ւLcYx` s5H2$xA%4,Gx!6:'| AiV'-"nMxJGWEx>ok#-(cՂE}I?,Q_4=3u5Kzn\2x^#jVWGd D'bbO\}uzQu Gw͊4.ycCX?|FR W}I43n|:Fj L0I #*PEo,=_swJ•4&om ᆈkMu^ϐP1a 9+FJ/%zs{ Y "F O'pިe;NTiyKDh0_(ۃg.S[?]TSsg ?mR5pPfRgA DqJ선8w% \SUH\.=dGV !7jzI>\̞<*WKu CN/$[1q a\qq(PDqχpV +g#r҄/t L'L$SԐg7 =`yզ4/QR=Nm#=L|2:3yv# `zϙ Cm_u@H!\؋ ;Gj{{Syl1Rٞ^r ~$24m`nʋ~>E7UE@DD$M34[{.Ajl=PHUlXv@!FS`|kZm cᚋ^/oc)0Կ(ŋCũKU C?IXaBEWCU}6xz*ZN΀O*Rf!t`drӁ-ovzYzkaY s}QVSb:_씈^u@ C" {hP6%ȊHNufAy7KRTGyd.!(I\QY<(5@7|x#˽1˫ q("si7L 406EW{֯%3AԖ#o{!򐿟'U&iwjfx9׉6ˁpDQq Oۇ>[BJK`|T{'Cbp&@骾TW-e ,؄s1f c{Fu522K"ҥ~TE;Y/I,+~y< ݛ&Xʌ!A햇zSL1ޮ!9< h:(5J7u$;@Cy:W .C!0U_d͌#;bHTa3֩3s^) @y9tLCEOQ؍n&VqhKJ#)UyP,HS2U1.فGmrٛ&]a2C]@_v)riZѡ2Gb!&Js, GԢN+QtU,{VU0pi:=Ȳ yU/͞c)ȥPR tp/k>h@vrph+qtƯ;pi[HkhL~_cP|Mؓ4obQ p9.Jt]~j*Xph(b\gR^D]Î4c;k8n ynrM?z"}OљW6朅f(\%sB <w #̷ o;N a{(xH=`8P7#aJAGL 'BA@qPAT;ȵw$țtx^R|q>Пo ,OʥA֣M=>6?$XJ)GRԸQʾBMsư8?Od ~UPӣ옭SR;zS#̀ {P w4`^Ԗ~*\TMaלAg3*Pl[1)d5g]DqTp <I!d]tJTIf;ZarO"P~J($ W/Rt@B)x{b{!M6.' ֞ S)_qib.Ҏp7$bmS)Cێt 7:ud`x"Z<%^B} | E`/8?A$.iMѶ?U;-À/t o%}peB 7;?U{@.-Ri($qy&5 ZK3 Z9]}HP+('AqHeh@rwq_G@߄[rgI4ލ؃MX;[G e#)e7\mfCg7oGn~x8'gjPds˚Uz"/؞}GEV9O|@ l=)]?KPR##Ň:Aݾ0A=f4Nď#Lխ2) )âD+ #WMgl[Q$Ӭ1/h2OB)H);,zn/0[n@3|:*mH4lkջ.wȗ,mT/+yb N+zm 1HGV0u' %CyC yZ٢$^qhgۘ;,5zO,"PH_P ƺBZYy<UVy0a>[]6%4_Z@y}[1`ʶ{18m!N k >jU>Z##zէ%s۾Oy u{lQD8*ԠboѢ( ԄQrV bts)~њ!oE=j$Ͻ'36$ܢX[ @sZb =ɻGL4s9IFv3S0>`_=&+)[l֦:]^+5lqg3 [Zc<:Lo瞼Jn0攧\:FOXd=Ipǝ )e#MߠT^e&s~cuFI8!&~2}'6H.WܹXW\bMH(VhA n&`Iu݈40Ţ& /hPvg\sШޅ_5چ(A|]:>pbm^5,.tg6kDxs=n0GK߿\aybXZdRV5L(xf;;$>ALvA.#LCVk9>3ɴsêS(᳈g#fިv7i usN @!dԝi[TVadEm>ދSUDQNVO%t!Ѱm/%JE0T ET -wa8ko^+=ƦXlp}ٳ؟${q`vPB\ SW&rq-A?۽v#77vW-el$D{'?=&iiر`iWj|Ҳv݇1 dTn[T˵}b }h⑉ _/4FTf#`Wt[4⺬ܳ@xΊr3aO\"`~EPf8D%"%II}HT@ н ,_AC 1)x<SO6웫1~65OY!n^)JF:j`.tԋ̢ШRTֲӏ/[ p&ky䧦 X4P&g%Pϫ!ӸOIC!3=RmR QQL9S:QtN9ve-+۸XcП1׿ɧd.q]ss;)F+{G@JWd-|,U:5Q d#1餉fTe+tt{o-l$2&2iL,Z$Dq=ڠ=FM<' פh=jW e URQYS3M #Q ~e&=Qpk #zk$8!;'UB#(|DuTb,\]<;),[݇s#n'3HĚQ'5v!_KPt|<>C/7eNO&xW5&aڄRHnim!m#cS[ ;J5 KDEKi)?;~[^7Dߐ^٪[. V,u]sA_: v~R[aT:B/dUST9'Ӥ` ->PRcxF q~w8fx-RR (p?-~,{#zͪxylb (Nf:N :N3NM6N%%nf!a[Jy044pw!3((m+iӖIg !x'j7g4ؔ\_7(oZԷ68y}+VB-&O(Yescuckįxz7M\`O 2ktglcJ C}oAbV eڌ?l薙ك^T"uE/ M4:?KK/mߚ4pr X4X4fC\@8~۪c 뱏tw;@iUmuVXxa?+E3/oF׻+G|QowK ڮ܌4yt/fw1.F8/>)n]@rpl9n 1a3{̼0w~V*%`?" O!h`w6b[ d崟U?W-.49S$*"2tƕLaN{]`Lqݼ{; 6Wg%P3}I9#lu('&R;- t.Ya]iG(۝jH_N 5ՅՌ;'ùY`qT\Rvd=ڙ3ٜX''iCxlC ֮$C}:>i5+!o`z;nF܊;HYjfu9]|^;N֔6AxkA<y;W,zЃ̝!sjx:F&By߄'%F' BZ}IKLJ_!3q[W}\uxI K {o1dSWE.7ޮA|F}jEJ.g$Y١ Dԙ_'TOP0$imߙվ4CW4cO 9^Zc:u]DHnxKOBE jqg03WBTr"XS.2jicVG;(XW!(? Jq+t#0},׷m0|_\?iB`ɟm@9/Jk L%Nb8T'< C%$ en&L!q?9q.Xa3B3K}!R#beKP.:$7!WܰK$pYS<`ԼϪ Yp-N/z@aC* /*.X6KSqU^7GUB282U&9Zv).γCg,Y}{ڕOL3q}i7B~ .F rdp_ۖ@4+[ {pAQCz3 X_y2&L" %޷I[%8 '=ghgkY>t'@0G9'gFdH.0/;KxPC-Ոsɶm A-dׅCw4bҰ!0<|ɽ'$𢂳SX&G 9'DXެr( 6 ?(g`]ie^43vuLdJ3P**g Nf5taT3Xj< A`(σZ 0bo7<b/ўo,K7WOo,NiaCIYh&y@ՐYYyj:yOAhQ-Hc{sEOՍ96yH=0ee9W{=w;T.dZ(u Mz$3 &RJ~98\iH^Ö: 5ȚUhJJD 1R|ŨƎ b+#LWh)dSڏECeo仇=Z\NW-8KUK N3*bBnG-0 \% FoaJ\up9bS+3(@. o\U$8(LըY$Y3ZP"z8/z`6h~b~3SW"L`"6>S{0зҐ(p E>B6vQV$m9R-Iܩ_gKCc.:ɫG _-l J^A״q;3 _sδv`6?לmtT m1|iRT&7ϓwq(1FߧP ׮jZ\`mI[3U +3|0$!%Sw5Mo eQ6=>_H 5aɜyFbڮP;F>AaeE%">W8\M~&bJ]}wSe=ᬗ ŝηG$T$;k>ͥ8$}=c4ivXd9ߘ<-JָF)͖/DVYqӧb!]vUyߗڱnTo3:˰ DSžs}5#^kIP-߳DޒOGNxHG[Q$vyrh\=s]DjW ;-Wr9I?}¶"0y*QX>U+%f}="S*&%Ko n[C@Sm;]Pl[zx*u?z%cBn d2{Uoxu4лQ﯈z-׿+b5{>ԓnDYҼAC~2huz7[Z2Τ@O6c>ZF$u)J G]5{(&ª yS(<&2GfoL'!D?avOϼ'`,gYU[*Ic QF GNJa-$F+x/bq8N!z,i1EsW ayA(N{i?/LkoԬ` kEB7gfy_,u+MRwGT=$}]?lN+AéޚW%Rq@Ա|5Xno۰T&:٦=gh[%:&vZ'[իQxfaq;:Ҿq8|gMCʏ@_|#/ނ. EnH.aH<?;%K_PE2@O)^`8c^/ z'bV8zSk7\K'~v݅Xn7z6gne=ɧSN[aQvб݋\HBQJcoAPz/%`v2wTT%ˋK\>omӈØC)7F/,ؤp솹in9ue D]򀗡rhbAV p4k1o'Lf?8Hkԅ`$S,bpKF~qږB&㥊r`8a"A Ad͎\;0wb/3a\ȬJN hu?5*R@SNf9e!Uk,ʙ˄}.t"8dÎf v pA)Ai$ס˨S@F'p& 9E 9Sm{GTn;JQ/(qSLrlL;fWrB?bD0Kef<;=*1F+#tX-k}, A:%^xv(W#/g&=Q]vJZXpL9/werw) a+l h& 5O<7|5V_B+W+ZWZ7]UMo gy.O'Y,dv0T$`y$ppm7.7aAiCtk]ltlٽ~֛jGz}TЮ$o@OQM|G,MaA݀ dQrG(Tu %ngMe3ZW2 SRKA+#oO4 U"tN.mtC/i רxT>zRZqę?RMCz]Z[mh#lQuKs|H_ӧKx!p%['8j)^"¨w&,^xa{``Rve3:؝aڈ\0v1fr\>\(04k۷ItQx(ŕF~IRH ?Cʁ%  #%W)>͗=&[/٢ƿI3f%|L{NۀQIʣKC_G14}<[^ v+#}1_BBKj#8 ۚ\!K]Uۥ߳=m;JjUS qµ^WYԥuಬ;_ޭƐt8n iڂV9IߚRNMIZnNxz$"18J9~ڜ>WOsaff56|Ssđq\,:!ryDf9[fVs6Tvc3t6:DATMJ$ nw7g5#>aUr+vyU(w);gq5sOBN9teܛZ&Wb~kH@^%#Z‘ha7AU` !@:bE_mD#Q^p}q%2;ՓXbU4IC{ 8?ܢC u$c;QfF|H7N CoH8l$()*:=kr Xݸɏ?Ìώc!.3\O|~ժua| Y6G t__3@Vͮ<&dYpe:#U=NfP}h`V6tSHw=:C@2G^FH"!2 jj»yaJA"Gf~ x 5k둪4^2i@=f~rD" ʡ'~+(P@/?aVFY`R@ك.WHlWэ&^]^!>Ba i!CwpJ,)l!p*+ ,zb_%gw>'E~> }g0N1?,q^([ =궭qd W4X|ida!M".DML//5҆z&Yxo®ސgf?FupP6Wxau>8vr,D|h{B=uy7P%(n\%=rL2>#[WMTZ3VΗ] G[BS &=0MNt9ia9x?_M]"а]|y{ɽ|q(o.}=K/!O}2ʁ*T(uq=zK">)WS m*WJpX]B(1m)eNz_cʰp9rht7L!,P&)`qTk;&-QPX-Z4ݽGy 5YzgC!ɠrC4Ǖ hq(5а V *Y9P nzh6%&Ʋ6S{t4l+{1MT/4yX빻]ui;ׁ9+o}-ӺO@jZI/\ִhk-+ `i5a|=TcJ\Y5(v;E×b*˛eici} } ;ᷤ'K Nj/u{07kxU <v7۶7 3mp aANds%/J$8HH*9w16_nknGjB]F;@x<)T".wMz)u.8%U!/Q͵ إ;{QD%Л4ki^S)](wMjWF#a,IP|LA>gzZ8)Mhz5zfO=d0T /uLrnr9Aۭ}YRbz>mf92w޲fD~-R ¶~be&&B<{0+f}!]Cv)(M%9R L5pA q;Jm>6H\4?)5 wfF6|&Xg i]у!^m[c]Vaq=[uYr"׀*^Kl+>Ь'}NgNQ19#5p/$( OZ-WUNCVo2޹UU|n  0 SMBL58Hr`n>/R%@ &^<Ko)߃N!<}Z~EqI5aTp|qr`r9t!貫Y=jikjY/ '\Ʋ1e֠ӧLRx;ˢW`:bV8EIAf>䬕Rȧ×g&P=_ +%P FU6m\7 f=@nܼ(um%,I9#_t[i~wD-ODhv W[>/ @Y[)7@X5ہб5*kJ\NrS蜍ʻ:|.ܪk摂tHfF2zH;nej-ƆA_@Ktwo[Txyt%,#,h&8n\ǓDFV' BK˶G/ Y-aj<7|ef?UCYaԿxc  2Bx =ڼoGv\Z|P'1% xpOV;:m.B 7o '1WӋ7Bɠd\lKC#6gyXFl+xA8'h,h[Km!C9o9J/YFRēJVCW*MYUtApPx@NM?;0$:5];J._VEG'l 5HsY}I5G1WV!֟lC8 oݥZx5q -$;_!xcZ#Բ:<'\'W%h )t>4\֙çӿ]D:xk@Wx4Rop%g6֕xzi?ipHhq޹P15y=ń?S=EKFn_5cc`8?ot@<ށoZr<Qާ% R{RM-\٪znkiKq@FPk3陨|TQW<^zfY%fy8I>;Qk֑$ᮼFy [B)%D?q8v@MTv-bzH 1"ɉ0vGTf0kc2hz3vepuɰ-HӯYa[2-.yrײmnmdGg\B,QdU.~:(*T Iۭwo-/6ERn`@DD6e0JLbW -pr?A#zGZm^uЈKwQb>\yX~F ܹ|3*>*f6 tth{<5py 99Z'g L|$D0lR96i'mzMFeֲqf9 婦Z -=}l9'PdXS c~lUKfX3,%l;&+*UO˖EGVNȳxb?nwW7]&0 Yτ5검7[B]TSBQJF ק͹k( j|ZUH,, $ְLx.1 e3ebb*BXf2.H6)NaFk }Kd* eڬw|*mFQ}@<{F!l )U01+Zb }Ή"F d"l~e\LǾ( (.<|B! {A{ɥq7{ A<B4P2DһW/Z)vh(^Nՠ6hÅRf4ptщW@uAtNS{/j?DV 2腯Qp^ڣ HE[ȁd\xOB܊1yBJt̝5j:Y: |#&h:U\TX馀 Y-)#,KNtnp5)l`yڀj-E+13DikTZ!Ab qԟ0ID6`Pfhw8&Omr\}@$ 1fkŶ.ԡ!'gk&3Qڀ .}ߩ07*TT72+Vd֯B~͏ e6J1MBΰ˵Y;]0n]*!aq~F?B?Lbdb<1vIqf~5DQ On#JxbF Z%!6|BԺscAxx8uAbR H0/xlkWv@\]轤y(/ uԌj\fwY1|!!\R2:GWo-vdv#fX'}7`qa-T7 i)dBmI @;Ot~AL伓.vXvycdg5eƗ#@9fwp:`Tm2vT{*07\ )i04COpézLISQM#XKWېӀ& 13T;ci$Z:`;? ⊼|Ozfz-SO=L y2':L Ǿl4-biUQiR*8œhIQ4ڴ0mecUߨ\̟"%>gV+kb >w-jRUʰ3v߂D!#]$Lf~:Q ݃*L~mmF:]JZ6O85 پ4K3rӴ7# =귑>=%wH #9RzO8V" b2I4U vqIc~e @5<1wuo<ҙ/ " 1{t%"X>qNq-rIq"AOGcd)j2Ā`~@nNf ڍpnNq5D"TMYDa/[cP,u߼Q b2LͺkOn_xEjJ&bW4wo pCIťqJh$ℍ"gD؊I PMvO{BAxgB.Vsk?Zv 334ӡANW20Ks;OpV%ޔm4|5C 63PcWga Q΄`#  g pw{c\Ue)Oye%Z}'q1VCuuLhŽ@6 sk5ĄB1#a:`wAKS]Xtq>ߛU rl@"Fv,|jC7,w ޙrO*}7E50XV#)\SAUt}m!C ttv[~X,MB"@1S[{CA~O v輙W~ mȖяyla dKW) ǜ[RE~bM 7̀ A;G|27%?#Uѕkj15K鰔04o&ˉd%qbޙ/V%^l9HLUb-(NgǤ<1_ +H9Q&D׌WBԺA!, i.R5]K]/'R;5J~鎝ۈER˷=w^UWzgs~Sz~" ,Ў5 i|rtlWkKt@㾒㪅*e#ifejpy0B\áfG5NI~DEaO7.hFhm$LNaW"ծI62z`KL+0Qnn+OB"`,dWYͬѨd |m{@NiwY&,w\F1Wq׆ P^ &% vKܧ aAN8w.GEl+,UT.-ZRN"gv}e^.擒30']deF)~J%j, ~;rݭVO&<"ss({gf:>ps37m 5nfR{bi{-S*>$"n37T;;~bX]y'mAD~PfYbծX anp;YM^:WPx$FcUb+,:Ggd+GyO44IJLOP ư̖%CU}/4z7{Yd6MX1š[Ot- XΠײ?"*OP`yQ?wةPq e+A菃ɧ ɻuf^rkhw ΢en:;xlxk+5"jnt_&Dw[.F3І=@VE"G;Ż*JЂLׇ{T! Op?LJ}@CamX!E+lw%hn)TI/NQI/iI{SdG7&G_+ h7T8a۰ KTJ YΒzctOuJ̉t-qҚK5OhqKo,T_jC7UU V&B:0,@ BtzK59u~3u;tvb2~zs[%`Teٜ&ĥp6,3\$Vc"McRM|H#j4*vå20G+X> wzMO=Sz6X߮T]Ź\И'l}#/{g;fGR(%]LK,L*=&Tر8Zy Y.fB =}>}Gb̪ꆏ) qpQPDHckiun=p?`Ɂ]06^KYaKdM6pLdU۫@*K'XMMFgօ5yAmem̚M($U=z^39^hqQ$Ho%qp#Mx싷Ӿ0,! ||U ^eI<Ҷ5#JG8径Mت2!1Rۤ>.5f)@%e/鵤zN21WZv cfl5f)3Ϳi!la+'gBPִqNq?b@\f.S5p [>zjB*_s[AWۅb ..\ +3veiRA+ͺEIEhX7*M,ۿґBh 1Zf[o#wޗ! 2&KS߷b3"O SPpO7B! q7$_.)Xi2 7ʯG,B6#48 9}vV"5:~MgDtkE1}4MiV 3H* 꼧Z}!& :/&1<ðbVN .li3]hscF Ωxkj6ya1i茶2wb梼;a&d~:+(Nn}}{:B^PCA|A8obr-%y_e,B%)n QDR1&N6CI<"#Rڑd}gn(lkc4 ̻>ZE{0{܊oʓSCRf@M }-,' RX `Ul:~>N:SNҙF!bUMζJAD95JT|;H sL1g$;c6'p%4+ٕ|cڪ'I1?V KJb/>]%^E GS&eE1@m^Z9f+H;t|%@ .ac}5>MiX؅.#iZ*':?P!y;d"ڨ]"u*_j `[;ja+)X.`tVw̾N ̥J#>D511gҔ[hId-]r~jƝEU&SBYo)X*8T^6b̓-@Ԣ^wL.H4 %j48]S%6 B|L],ިz8upkڝu 1[ =&#aKyWC"_0Ooy:L@LZʹ҃ح S 6mb72}R2eϩ os =y9Ye+ʑ<^ 2djۨط}4+4%5ImI3Nb^W>Ph P>AqX{#NMa fGjhsDVTvpM__yגF¥?Zv=Rl?!u+[?7SB.-USz(y2 nuR]ʇPMZ#~ˇ(Rb')glK`zY)k9,mNJWw`'eGۯiHl(㐈fC@8\FIgx[;vyPɠ3=l{m^ MYHl ޒA/)OoAb4x!6yy}s},ku$dq{ݺiTgpX4^؝kc Am3W>To8Va W%[rMafgEa @²ܕyף{Ś]p yB8% \Dk=QI#.Ul;DLU)ұ6E'b+pj&Lw6>sc*7PI2(Qmf}9 xf-c)e_(8Pe,,D@Q&G2)ܖޢ8z.O[ś,hǐ!YCD~_Qֹ~uaڻ>M.o&Q|W0r-f0>kyo߳Sw:]0as*M,} GNd@Ƨl{ >E_\dz c:0~\-V+'pJXJ Bό5H( H$ 1 I09'I9zڟ?~qzhѠυOʉq(oq: /nmvSLwZƋfF̀ 5?fyA C"t0/$]۟Ӟe;ctovfg| &>1SKK)QZ'wW)FQ(F\=vA\46 NJ3X؁: :W"Rk5xQ};n+~'Mo QA,+g%pWQH-$83Dž/s[i Lj(F&@z0G7;_q'cm  bG) U PFmzn:7DT:إt%x8x2ԠփgqW*A@NԴz 卪aG `-MKZRaH_m[sH&|5U2R5%JčVwx=qtU۪ TduioVakxLuE VMIadc_b)(.i_5Z5{ <wuNqk`*8"=i&7[j){@BbMzx[\o T׌lg=A 1L|c|8,t~H6tf+\ qU0?F|ko\Рp植t& r=mD1GDʧ˿2͌ަ3Fd ިrxKUo$Tz/( }i٢Mq0zXypahv.;41KORqݨ,r'm*T:l7^z+?^!NoTO'BdW d`L EL:UA &|eܮTE׾rOefǩP# 1y8(0G"?ZH_S]H`{>u{?JXmcqRԲ\S[*eϥSiDbWs qD9)z Mྋ=}x[0 pa:ws-ϨnHZv3}cnLiyeS'?2$UGKI4?yŭf R `i2*o5JɽZniɓh|φ}35dn' [fPk83wy .;\J< xygո2~z_vPJfۃÚ sK88*8ùGa^@:8ZdKdybSsNlgˋOO/=@٥+I,U-&3Y :Dx-rӾP*w2Q˸lw60{T:sBWmp4 =*!L`%P%>+^4*E_bD΁座8'8m9(jcvVPBHM,ez]Co?&,dyG)o' uyY*\=#^@-4 cqoLmE>b}M:MhuQ1KA.l&=k 09zWEhqQ䋉l)2 {F#XbXq6JSF~eƤjq8hRkܟ:MJ_WbBe'jU,RMbməJ+8,O^В ->/aYŠG.:DXkcUs4\Ox~܊KIo5@Ni<ΫGtf?-OiFw=@@0 $Fwb?^^hHhz_4ibVqu^XB܍O69P^_ t\ ϣ!32rKql3l> ` m]yZ/PDs=pe%a2S_fq[w@&ŠE"^bQM'%DLg2lBfץ&d N^8pk0n5 0gXأ0+1hT4pEQ+IBeڥrnVc$AwL/!]KYT!Fm™ eMzFz ͞]v'oz_G E;i<2Qɢ8o0ӏ3n (g->?%4oeK$=C&jt&s8^R߫5,ښt ?\O$he=ρ- Pʧ+zDxE#){y\J[;X孑Hӻ侷v꼺ص#el7Aʱ ZG=Ux]E{خ E6 #pI>f}]~"[?a\A ɾ*VQ/dFn +FbRR,>l^-RYm3rD!s̨`u;mGOMbuKw/zz?j;4}0PJYiޡ$:$^7Jp]QCfT^US !W߰DŽ,ǵGA :-:2J:_zMyzO0?X6[r;kaOK\e-}a;ڜH gqq<=KW,.:Ei6+y3_ڒLHڋ.J*G-G ;+TrÙfEcWS~^0ћO J?u㓡Dl6md&^,/ CeyfF`t2,%ûG61+6tUiT`\K9$g UG۹\U'GbKze8ˁj!W{ ֫QeMd9R t#:K>*tͦ7yF)} 5<7VCsHNzTElkO+A " *IQl&]ўX*W%PHyaʓXpE5^b3;>9x`o`UiilldzSϓ~o|V,W?5Of~X`AVx0ٱ]t (mMQ8%EkXdDQAÀm$=\*?zE$OB ~o5=#|%SpSKF_< yE%!c&h@q 9ٝdv!-IBi#)'NB'c?7LFwu418ڬe|ŭC3jځW&j`/Wr3\ob%wHJ^ș^ҏqup!sS1( ׄOF[a8\C0{&A]JS#۫BR wH(Z"-ߛ v 0U:zJt?!i e(Tpeu =NXz.e}5vP3T~ڦԵ>"$g|-5ŦN* t„We[knp?+4&@ԚTp6!iF3_H۵nAh8zfA=}^w&?#3?[z<]bATlLE\;l%W?? @&' XGBSdPƻh2MH{p҇m0beJ' o#ꊫX ug@Nb++@ZL?7ʫ*tf+7ԝf~"rV( ǹZ ܮ ΜЕ`J;.ycR鳟ל@09ԷӝN]qd< :4̱Ep\H>|NW7S󫭮4_[}FI]. jO{JBs4Yj*^>1-'2zf1%V5XόWd>;4!l5xz5)u{(V [{G(AS6#,.F pt]'AxctI _r c-F<^]CKص" z^_Q|\Hތq\Y30W՚me܍mF23T'ޗ+CQsPh_ֳm&rKPn#e hڝ\W&CEG“a5tLv-!D:3a)ozo3Hbǩa\p]D"8\tz-<\u\p>hΌGp "+R!g'·D,u% /)~iyڴCŀOed Єs5 9bQY!Y58y,YmwFe,'>b$F<œ+ꀄ3D8F8dZV/s,YʼnВKtw0CcxG9ceȑ 1*-vȿ'M:څN TNB[H|)[N,kCC{y'=A&p\刺W\*E=\%}r02yL?vKU؝Xb\Jxّ,&kʏ?Pрcf=B͌H j4\ nSUprt޶-8ٺ t,n=NA5d,Ycɵ]4)7˽SMz*u]MVR$V܉nu٥B]hpYb!XLsG/ϥaq<`$w=~b^1.v> z/\@@J/k΅C9|@s"uPҤ IhX_[`GG-2նmP6 ]HZ e0MRU0JjnB/a OKev~\=<mw;[xqxȑ:M2`k:kG:*vANM0rR~=X?n258# G4"e=6.DNo;,D)3'f^GQ  սԔQBb(j.;GHTY 0f LgjDD#3˃VeΆGtQ@H(㿩3e^@,Qi-_Ϟס:[3,R/j^Su(]^$~ 1Add# Nq@=l&qQa1y3`FiMYPhuji5q{o5Ƹ٭(ӡ呻hCtGF/7+(:|reCE t6 Sn1u k&ӵvgoEt~P)Μ`@DN"ihenW̉z8}^}!V*gn{Nt لCJ\j1M34[LY?˵#L3sT2X!P}3n(<2B|Lw|~368^\5_"/Κ2bGnC2 _(oRT@մ}LZvP؜AvO]6xO?ۿō5zݡ/Qo)n>_Xu}F\8O5Xrof8섹ӛv  ۝dB󺂘N`E /~i 4ԛT->ڥ-< ?˰O1=[.cxw(miGy_ny\ '67pX@"XD1_ø_SPs]ZPq7J1q5}WSckY%<$FG0)ȏ(ק߻ φW0ū\7\wP.uF`r)W4,*d-V"@Ўie0EGK|R}@rjH'.QUneHRt'@*SE'Xk!hwCzK^. @# B&*; 8 U 5R|&*q>.>+4+)RQPdeS?]hE=45{+ 7Vm(W Ib9 ;6L\▢b ">9Ƕ0 KY,Pe旑6B0@a2zn\'ՏyE*P0t+f sPN= GٖC)y׆#.{bǺ<4CbN4N <LDj -TJ"*KΆId'QOr1(4RCzi.AxfIOnVnN{|cA ÍՊ98;-GevfaXb:n@(0԰a5[`}[2ļ+ȳNpYQJVAz*ݶ+DGAy/>[QB(M-l.9H,!w -E] pu=1r[e',3*it%)ͪZw篍vNX"'oUʉ/Ul=c$k-"6 bϏ;g-<]t %skchSAcqFs{Tzj^yP]f 2łv5uN1t~;#EK:P[FV?;Fu=n57íQ̾'(A{$6A6!uPR*y)*!hY06~ՏQ)}ߠ`X܃dg_ʖfL׋-,tli|+,N6R>5;^Xyn]6fRhɗ+уcTn:=QEeb4)'%3Xku8+ӄC$A.T۫Mݾfg/ͤ#k!Ɨ'XB?f2K4 ܑ:I4Km8TG#өRǤyp& UجiFhȡy4>Rv#5Erv7 K6޲:љm_P hp(UT?ߡJCjKynd+DqxQdW9R?2^h$qkI%)͌}HK4^,lUUeY):,>ձ]\(E8?xnF2*(v 䲭WP{6L4{{Lwr.*0W׹Fgc\DOJ,Yr?,U~v ffзnɭ9%gZv ׄӏᓉUjήxV s~ (k4:W$0lZA%} (\-P-'?};~2V|KD]=zu E[ZA5ʔe'')ȊS^ؖG\ZxPr顊U ZVzHuErԷ_7+uYDlմ^{d_}`Ը1KJ̾i' Ҋ/Fp .u\rgI8QvW:H?돁u !0^wQKl;Lsd *-EZ'uzw)% r=[ ruxGꐊUӳ6GVCQrlڭv&`m"%œJK(O+ Y.g .ܮ˫}@-.уkvY䐌/0:3i|YU \2=I;b@Hi6rl&(,cg%1GRΈW/YC[?^Tyw5+#NJ:) Yͳ{E`Wt/Dۼ˖ݖ̿hvթڐMY0H 0dIZcx9Px2V Rj(m=@dk{yUm4 {x(4hS/'nE;#񓌙}eP헺=cfx\o 䟸,I 3tt)Z=fTЩ)^r~`&Y@-/ǔS,1ihOkF'7P𑟽zƦ?? x1$s`aۓr+xp?- 2ZT8p),ʅpj:ؚ=:Di#jlM{_Fϵy w*~{Ƚmä; >OUOphG+9a1 R1l/mHxgA* zb<7{[/t7(@Idu(˙=A&R^ˣƁVHIn^t%g#cLddf D3-/|[Jhsk Q2_'aߪ] ghBݹu#/yz>?N|4`)AE@~@zAJw÷8(<Jt# {(B 3,@*wq鲺6H zv%!VT{}P#È)EO:Zg_ϥF2u6E9~E KUUuMN&T6j}#%jwV;ނ$J]Q #1G݂I{Շ A$$@f Y:4׵M l@ ӅqXOV}VI)xRi +G49Kٵz_wt*dC*;Jr&}v! oJ$ܾ8ԃ];a{=#h>"3m]ʝ0juECG SG;zsކD~6NBvytAҘv$a[ɐo2g&A则XGp!Iɲ[ aLcʍM˒z^o~]UL#7뫎y2LFvcHwEj:RFȦ^1/1[Ug<X2;#r]wTXJ<,N>A-}i@G--KގF \4A4cRAM=Ê6mgLItǾЋE}4{xVe`%r2wAT|6Y١ [J~_$2ژk l=U>{9?+ѽ 亖w~Sl~rMF䄔=yΔABFQs^F2Aw>to2w^u[}J?"^ (* 2vyǼ'#v3]?HЮ-`Q\d͒j C  [ @2l(iӏBwCMMDd (m0fQ27 iKf)ӢaY (E xn"FcΥf˞kRec[LT58ǿkzx 9 Fl* ^pq5mfd 6Gi͏馏Tido ڞlaf[ACe}n"T&q;9-׎zu2H1sQ7^eN*\ eGsSub#0dhgOzw0h8o%ls%Z.LQzJק1ar4aYZ}5/,\!w7n`68,Q"&Pwjcݎjh.k/eB"B˗fl9-DZؑeb>=w:mF%\WjzC{tn.Dt_5,g"F7z ܳWjLLJ}?4xr%'.I6sFq$tk4&0=5B 1e{S1י~"]LbGp | l,RLyzDkVF8ß^ӺZ-&j)O%3=ޡ?בJek3VcOɸL-x hA[T ֮~`~䃼۾c>*"p[i%-P}`QdkZeP(>6v['wSh-Y£#ߔ%\Q2!T +"bLJ8l/[j< fL{o*b63CY4d.#ed <,u9nKu;V̊DV96Z [FGAQW7uL:jK2G]4m):Alr|)m$c*>~kT$t{mcgVщ:{nݨ=oCvb;o9/k")Ơ[;S y pCf~՜ sK)Q@/Biқ$z;L^kFIjsKc$|O8,HpvQ*z$u BM6ȡm١mcȝG甊7Norv$ULȾm c4l?l_6m_=WPK[P䠬wt3ljLv$HLV`ihАZc܆ P2xPO潮%XMkνRҹEZw (P {)I^T\AԛSϚc7z"Ƌ8Y;,ˤ}ZlHLH^HMJ{UJUV(M$%` <9]^ܳ$WQBQP|(T RlR/@m$xGA3r\Jc6's RVe,TPB'Yύ;#VDžXvFCsPdNӣ٬vQ&aO|-p%݀ b9wE- OZhST2ZKUzCvr|uzlIۈUKB(Iѓ+LBzd1psABM :Aҥ)̋EK!7DwH"0:NJ]8#MM"c ^Uظ5Onq_NdCӃ 3qŮ1)v-lH:AkƫP.T+oUȉ{[#-r!σw77okl.Jfrq2bUZl6yI૿_Wv2AE4><ƇHxv_^>1GQt-$@WFA|ߛb]W9J%Dq@e"TWXLFkgdaf#R;XrHIha3F--+wA F-7=JKO0YCm)j6NAv w51cg=3ʻ>Fl= h 0`t,nu @2yHؕ[@*ޥ`&?ǿ8CB`=!~RU@)ϸB^wDo-ߎxt|4/nP-_ʯ __}z_8B%v]#J<8 d=L}*.V7#z!SLrM~ {"ˇ`U^f+<\Z<N) v^LD*GXG;+LscƝB7ĽA8[;L ;V1HG/*pȇ=9 F2?T Z?MV%#gauxa/7Ѽ#pOPݣm. +6D::GT?Ziܻ*ۑ^N~ZkA˳9#sB?%D!\Y/k?AG mDTz]C #+DY>Uv#K|j~s'wmlDUEy |v+4fRkkMh^$ŮپSI*+O³Rx?sbɋSt  w+ d?o7>OO~h`weG_Ҙ8{=:mK@/iFA ]6B"!# h*%x.,{k|&ѡ{n{8k ǽZԐ/X=xLğUE`$HF`z췕1/IxtPxHԞaz|V#DN^4q4'X8Ūr5Yr0 w φ$d7NB'FŅ*oތMg TVvcz| Ohކ `gzn<]~EϻծP+cl^,|HK7Gמ|(y4MGNoRˊKiLo\| 51R CV&ܡ"Mi! O$z>Uy'yEخsxf(&+5.OoF?]Ӓn.sP&OW gǏck5|<ݘ{26 s=>ȨN\ eB-#ү20ƿӶax;]vVh*nʜ '0Z4"4$b2xSk+y=pb!t:Ov^\Gjb}K{s™[x fH 5 " iЮnwMI2*uu]l_=1&AxG=QggKr#5{F٤xPgrzyw>J07e&(9!GwOo ~&W$Zx#SL@][**8;3*:1ͪTIMڹߡ6bX|UC26q>kqL ꑢSqUB~Q>3| %сƑAݒ:+ч/]frS( DB7,uxX4aN15L pxm-E.ȴT.wG >Р+$=@5W5@Lp/ΩKj'4*dQOި [D@jy3MH³jO#F0HOMqN/Kz$t0>e@r"8PRW.TRmŻ9c7V/y3u8 :U>9i]E z&$wpDTO|a6OgDf7+Z~ ]=U3oT\G ]_ )7}q*_6ųUAqqZwk`kyO@k)eOV4ގ ur;' ݶ(ܥ%xIyoܣ B8Ӕ"j/o q&B"HSΘ^1 av.P T9`';t^{9\G~FVHk'n?+]FAl 穼PۀcQ:Ӽ#5Jf"O0#I,Ϳ r׈:U\ >36 &'2V{7,Cz be5юsqy>0U蒥>VE]=?|zTŜqŋc*ԥ hܷـNsGnU#`1fμ9특=zd5P{7sK^(LJa·cڦydջdwnYZ=). U$q޸wcRYRk`9+%nUM܊>!8>Ra1a+gnic#d楞u{j阩=2ZMcoA A;iZS5z /4N'`ghgK2>vJb.s:WIḠɯ@Y+rCFCD96_mAʏ syEDo?0v6<*>4m,6|Tmٵ;G檹t6:{KJLnЁ[Ьbq&5uO7|a1霆7owh蒔lG!li<#pg9o5\ӝȫfC캧zBڛgf_yp+ d_\}Y|w 4} ΐ7 P" $wPJw 9p{YRpIJf%IMqrx+?㌼nB]]4_ִ|foˏU{#a!^7'Fb5'hjXwvp%?(SkG5m;R4YW4C*S`Y58ҮZɞ@:X y+QU] Uzk pM.+eWX,C?\b[F3ƁHoځ0rxrwCU7o820ϡB>O]rBSMY0E%4N%aj_ˮ“ %ts 6wNFU{+؞0m^!M7\mǘLEIiV3 bh>y`*'Ajy!ΏWG)S 0㐾s^ڸS ؇/}EXUK%hGK1967JAlIto RQgrzrE[ a~xgԸK/4k&r*Q#!9hP;Eh1(ITcj5X!G55Cfvn<R ;`\&1(- Cf߯VJ3%dyNK Wi_CSAH ~p)G f>Hبv=Oʙ_Ӂ<\O6`FVI_"Q~)[⊳sǚ-dSe!(.̳Qc}jGKR]VRt4M&Pro@%Zq.!a ר]ew8:~0 v=3CT-Ͼ}O ufsi):e [Oz+g@|hұعc7oXaK /%Bv_xE [C~#I9UQV+a裄n`iB]ԃ04%sɫnj\ߓSVNN՞y™R'ʝ<"bKds(M.ЗbMe%O"qseW[-䩚iqEgNm߻! 4{LiԾՕ?v1@Ues}vIx"<3Yߌe]n"Y:Qpe4sh?t2q;62h߸7kJ2wG#$'.x7Yq=сɩԿu5- I aa?o?zBFwqkՂLS[ZXޥH ď9y^hM{"Eama8{i 6Z}tݾHM+ 4wo7Z$NT|E+d'~T<&bS4h\cG 8#Hq\ڟw?'+O\4X@gǜ?e܃ $r^%ߐ0JjuۅPnU&i+'fv`>EiFE&&[roMOHa!я_ןe,Ϸrk>tW t8 0lݘ/@3;?{wSRṅLyUD$o4,ǔ#l͏sYN ZKn_̺ȼh"Q\aJ,,JG䱧fAk~6g'Y6̥誹="kMĖs2,ϲ?xb7l6@@A3=XۘSch4?S5TWڭdq#_S6{}sH کT[^QogއJw]rC߈M bB!O Ÿ2 (\ 7dgt^#vQϝ.vX9Zڱ'8RFG+t&Lm\a}+q6CbG:H1H++?E- X+)QGЇ>U\2*5䟭Xp?b291OvPu/Z\Q^9 0/2%P9 ܻC 2-$jv$]1sbL@ţ԰ BuX`Ŀv#%ߴstzbtA.kNm{I[F*sq֢2c@rx4- f'UJAP|1'&~Aj>0kHgCD ?—Yvh HB2=aCY [w+$ %u=R$:s0v-Mw ֘=dM;GV˄;٥2qɔ\v_s =ܾ+S#ͦq>`F{,Q|z}1izUuHK93IQ,,噄9]c1PPPWl-%]Y~ ,sP,f!&fӟ_kDX[Yc^m1숿 VB.?+hPp9ωL7 tb~Ibώ0X?%ͩkA5A-:nqtp_M'k_cZJv<4Ţy oϴ`~Q;vމM z1gPRrvK4J5`WfM 컲Z; s:Xupc3RpvԄ& KȤdMfz5 fF=dχpŸz㑆::ӜWKL-ų]띍|Mti*5tļ 1čy3,onaX*>{j.sDO]8}GO*go情ɶ|jV,ec=fгA'ND Xd+ׯgxks3 \RLI&9@# +7o,aݒQJP^G!e{͠"س\X({>a0K|"'K4Z^b&>Z1lɪK?1oS"mcܥy߼-QfCJOōcay`8U[EȳfwͨŞVHbH6SHӠ\stq^& UITx2N!HA@JK/H,xO F/f*a]{"T蒃9eGSwvJpro;鼼kOSJ!9M4+/2j5 iG1^;`uapj7w+Bh2g"Y7cEA X vFay% {h&Z3x@ĩ6izy埌gik/[|T֣~x9pAYnJdp/(}d\(`vK eȎd6?U;`Q|+6{ha*8)[=IBe=P Cqr# D=vrWs) eIFK.qGQhXB[wѾ xdV qU.*yqRakVzo#U1qUg=jRO[ H #},j34!؇XA|#i;[?k<,ڻɢPtz\.[QLVUN4"NM`IQt|ACAlAâ?*kǧT6+DR}ˮ h~Axsgy,LP22ljòu:P׵x\yT=>2R͊g:TDjNߣX ր-AOELv["J\`bneŜ3&&gp8٩D ӔkN=\y,ynÌנ9*#&]Z[OUH#3tk%vd>;م tqZDXSxP M^1z<\)-tdsqs+*P2C|\St`f' tY;l R#Çp;J'::k~ZḁSkEpwK=~l8MgU+ٌ0toV076*;-+A|&{l)rxIU'N,NK1{9NId:Ә릡>z#Ճ\]m 곬\NHJg?8n(_^)O``HZsٰRm=>NI f;BIg#r:<.SX:0:!EtTmw #(%`>/)t-컋:rZ̤v)*מ%Gp{\W?pB1s~ҙZ:^zxP3X'X>Lra6~ IrX5+MPb5*3\i8b9t]% 'DMC27$O?z4XR|<[G2:|R2Ơr+:إ/CdV xNؐtM .IgMNgg"sA&] J!G5S^0؛n4iZ@&Jd$P,ȫnJWԮiW ogMߦs !xZH:ʟrwd'[Yj)-űׯPbv '-@ d*[ޅ*U)K֚,:LwӇX!ҾEZ{b*L+*n C쿖үD`Y6L.3D13 anoi}f]~:r"/ ZNho&XM]|x Zלhrݙ" xl`p }+S?Szq*؇W% Y^>my=Nھrst~ N9I1&-JtXtJ<{LOQe 뗨?C[WC^xXs'i Z(7c$Σ0Ag@2a\߳*Z4~ںqX"U`KB_8HϑJ^`]?ϝ5jTX8"[ҘݹF<b6oS.d:G>RiVWĮbsRͲY_;>( ᄃ'-* ,}w'b5l&84r^rɂՓ]#S,VYz74Dh ~IGjBzx É@'LçuC߾X|ݫ6 I=ATTl|GQA-2ngazz/oNEQxcTYV+)(ۢ0}O^zCքsB#)V+iii>WBF6 3 @>cT~Va/})r]b`p%z>9x#) <7"GH309\XzhCӝQUv<%B4蹷ݴòOЍCrFXdd;x4~[M/4qHY͝n˜{HQ nUsRJNO)z6 U\_:UԬؚxBMDtŝr\kσmy  hzyXWֳ=W-&y )oS̠<חmTSBcpF)i"&<"\.3<񅻺*6?-234fl~Xm :.Ͻ$/5Cx"gZ˲d0ɝuf`Fv"0N]oz` zNh*  { o{S3}ge4v%Ne! @*˻ 9t/8e8Ow#ٱڕ\}+4#gHϳ{9 !iE ǀLAZFHxi';hIBׁ껾fjk>c.$_N5gQgt4 ʞ]qZ#ĵoD3O1hΜwgA0Ig}GЩm8cXмScnC@pvoW|B<*`-dIx 69&`95h'NG(FX+Q\枡:${5P|%õz |z!BĜnX/uF2[6Dwη/#MNY/RقXXi GPQ߻Ej,qFnM<@m{7ӱ] &p5*OU =Cu-?xV+AY?#ETn@wK2GSC2$/ЊY^lBh(cxܣwT-MB?.Zݭ2 0Rk(`$ݶ xwcy5[=,7D@W$ў^Y;4>וih릜sBnLi_QQW4a+N)Qy""Qsi]|q02?+@E^'Tmz0ܔ~;Ԍ鮕ìSA𵒺T]텦-3M7b< n  q;m"nfWBrfTƔ{4=TKS/[ ]n~We96z#Ǐ#|v/J4@9JKdվhi l7շf\ݢ垾+d{B@>R͘Nՠ/T,Ђ~J,Qѩ^T.+Ri|o}t8?X0MQMd%)_f?dA6{oy}X%%pFcw>DhԦB{ʺEU[ߠ=Y; ~u_7HPa|-y ரخ D>?R'-T?Akgax|]3X*]"<&HQs*{եޛP9臄K958$CBLc1JW@ 2Mo2-m^aqϔwȘ@~o?lW, @ ~\\~`@fHr\8y9;"=F<ca\ &3ݜ˞ nX /Cdͣ1jIu|#MsheŊ]%d._Ajࡡ bYdCYs=R'F^Cz|Esjy&=bJI_pmn Lk ӗLtC}  $QD "7u}LU-D߫*1 ;/F2Me g/.*"ph@N$SFݗ9MnYSfq,u?OjvĮiD=EYQSq)ݻ4^|Ҡ ~dQ` z ^V{ѿ,xqY"%|0=B<[iY9g4!܋߾mDlY.,?wN3r=}(:75@BIh#;pZ'i{ D;V2W9~EAH=SoOTvi<Y⩍'adJ~3̄KCYT}:gLQIٌ{e c4cWl]lR(5Al1Go_.ޘ~ [;@zC| 0prƾM/nwwE 'jVo!pXezdB-gwJGAFc)MH%{iOpoMQ ^qAvEF hdC+pD`̠;'hs"y!=0{b1WE9Nˆ^X/h9FK䌍(;>'W2f};`f9"]pOߞ]Xw{F_S|L^Hhe=rwWh,a \ S [IsҲd\*uFNIh&{~ƻELѨByyl:`sD( f6o >6ևć5ȸUI!^L44˸If[Ž^k†ؗ.s^1.&K.EL}RGu_ vU!#0^A&wҍb5EgfEHރ` b?J [8-]_Tos9${\NA8QŮWmzwO?o$Cp ԑ<-/mRNt0tANær;Z<1u XrG~TZ,V 'ݒtaC!S# m}] `GQ oѠ~ؐ'\D ŒsL ϦtW="ŻIV"IDҐeqˊ`Ny/~NG" sŽ|5Mu`,ӏ1JWl]>*(>7 *p$ ;,;xե7^6s=N$?n}i (K/Q)ЩV3w0Zx@/v˽>p3PqOQ"䍋/Yk*GF@9 fǾ}_q@P 5Q`T{b}^}݆4 4E$cC i}<΀<钸ݣ6m:kGv1(~E@Ec5L^:~ﶌƗ}+YgНeN~eoe]DԣԻ<)^v v⨸qrKLdz|ɉ_;_NxaҔ(]1K*|Cuzji zo@;SO%,7k՘(#EθO+@ )W [U2^@ob} @qT\ц_1H}a1t6ؑUh}'q~P2Rr9XxnD"WÀLC!87Y)_}Wp;;|+]3g*"j%l%j*^@Hw&/FM )+Kq]*5s<Ip[_ɱlmbn˙h? R:= `BJ??9[ϒG[ժ6{bÅ>-zbe٥L7C͌|C $|KHb-$MJH6W>r+~ZKʈG}cWoA22r 0kxjhKLUxPE߾w:ME@U-8f$OןGM |1;A!Q{J=񀯱 |rp]-@('n<7yݖHF?)P-7gek(3\JVTEtF>UI,DhɏDD)(J뮧Rfm+pF;OXG'#O=׹= $E)ƈ[áRsA}VcR/"fsC966D@)$ IŒ|w bNCK.PEVDHKOe}N 1vF*Q6?#Z[;SË@B-*̛;F$>Ç{WIFdT 0`t:K8K+[l 3zx^LQSboZPth i ) JV fD"a [IC=[!?"XʼnYi'fJ jIGJ@`(R]*1ïd1ML aeidJP- ۄѝ ]%*4Ӣ6f.fK]MT=Ԩc&sZo ?@aHacuL<;FmNu솎#*2GǦXksӕ} ;}1%]4TCvlc 0g<<9 +# d&ytqBWrޠj3g0bBb$bzUL2(O4U:EЌ0O@bTWINQf_3ԟ G}e:$ūˡ׏;d/sKypI$B׃.f%Yfeb!YUly=[ `h?7|r W W%栔P+]zwA\mbd2v&71uCKyٔmp1iW] z\ mC]TwWk]0"I;.2W2-Z$[ř3<`b%p`J2RpjhA)-8sc-|X>cs?)녆@:rE 8RuE@5&`w"]UA=J\e.s"EjYpt(h(|xZzGDvN "pm" V)vS"m8a35ጣ%ϭޔk^kI=%*8$kz - VTY(W-CzNqsc$F9BkGĚ=cEuڱ$F^}fVjzUA&=>Bi׉KR wUԙ:n4>4W^$&cGƀVvamnbk^P<" 5&i$0 \MDYt%tz}&\TRH#5 *dždALiӔ/ 'W/EϓMG(F(݌/p44s$ o9e=f`ȅQ*V[ x/؃IPuSh\ϖf}UyM 0Г{IMmsTv)B!]C 띭(?(|B1M)ymiCi'Ǘ(k"|/VhT ;H^B;t׾iǚ+՗k' %k U= mûnyӍ/G!nLAumyK`f#ݲӤ{dAUbk{TWoR' gڼRN)(0&S dɝ\银l 4SɨuͨH1n7{T/NjÆ?Y!OPuO97bBpy0XRߍ" $D,RN1K^>`az}z‰5J7Q0DjA' k0FL.0^Ib]L*b&$o#v|F'+,xl;s ~.V jYK4w~*Ӏŭ)δ!J[}/)u[jG% ,T^Apno5)|-]x9h{܅ns*ŨdR^yH*XhGǦ=$=jRo2(b(r,ߚwN*,GjtNx2f!H~Os"\Mn@+A>b!!XL ?q.K_3ws-q{[m$ L6k0AUThgy~WN\2ѐWxde+^#'=mĢ`]{3D _4v-m<Ƹ1 \+ VX=O{ܽnm S %WIPqI`M\3OY-ymb-ʣ2Xԛ 1 C OW u|{7sOH75NXC"uD)ӫ F#r2{):)vQ12]Ȯ)'1-j}IpK&\ۨsҥ= EA^.>.u {5l!f &?Y>,4`&|F$F $'sX@$&31 {mk*<.d U,ſ8i%+5\O"Ɛ19bG+j"էowDF#03I$8Ia 7t9Sz)ءVNoaV8a1lׂ7'dh^`۫6ؘhzfgAW6*.m2٬|Je6GOucL-U L+r0=hwk\:ݒW iPǓR}#DIO6-qp {1bsNsphPFZB"r?lq8G<;fEmr;PEWNܹ#:΀ъ#םTPr/EZM lA΂e7ȷ+%z@YTgҫ{$I6\㤐M*חSX8RQ-AՐ.&:K{ČQ5ڞj|%" ~{ّ>\RLQ4] dA-u^~yr=>4byMNl  |H4̵ ѯ΄x_?kjeruq%]r 8^1X V#N3t3Ÿ3yb_Ž`dy S'y5u.ۣALO܅l8 L١Y>q0@-Ef$Cw۶da'yg7b6hNUdAhY NarsOHQY-mi Vą^r٦$x/gfr!#KX%>eHxQAX<^`FYM<1W6dhE9M Sjntj zd%# 55 rrHeZa aQPMUy5Ց9["nTNwk([=F7L_Ǔ_"ëơYWpMXhemPb0NԾNFQDuF,+G^7bGꙨHL?>աGrg0mRlWÒƭ5s79o†Dud} ^֐X/!jgf?:bέ[ɖ^ S/Y\Wί{.(jFvK< {!lRv eɿxԤ$l9 %as$)zߘ8t53E~`b{Qǎ+}82nj5ێGF9$ƬrT{T QS-"P+ږ1]`Ab'qvqZ^rXI'KSޅQJ{|&;+?ρ6 I!\a!Mo?踱rL|H k=jsRNdOD^\!2=WOxJ%|쐒<"j;HEnذY'[MN)dkko$tM.!e% zǗ6hV3(42fr$OTAzC&;OFX;.R|rQOXUfj]Yns=Tf;ho9L:ؑn!+85xk!,d+2RWv΋N.$.\Y֫ ckIy ^z1!=LYV$*Cb0jv/pb~%_gN!Љ,g,HDL`ѢMhAy >q]Ȑޮ_aX-{X&'[ ÏafVz j]P0EY:*JR)㴌ޒ<8y)&>P UG&*ܔw v@9QŲz xG";Z[B)7m I3V-=1GA$i!ve-ײV>Nt`o{zM%uj*RĠ:Mm Y&J Z&P8;M7(@-A[/PЦz_ָ@q1:2 7|| ח!3i$2S@UΑy(ϫ뮵a@zRԽ5fT6P0 F5u_k D6[ $]Zj@96rd)ܾ^",4ZB-aY‰ ]hdHoxCwj7AU0]#àS#IUBveWyt q M\[0/ kdsgoxhof( VTϏ8+a;DW աi*h!fH;5 XM0y` `ÅIwMn#o^[{{h֫a.Q|h+JVBX>6]%EMꀐMxG_fZ~LX,:^A}dL8g-`OX& fD޷%IBD11:T 7D_b>VvL<~/hH1Ձl 3ɻfINC8[5gW(J*3BWseqrĠTQ'rtqS܂be0)K8jRRb.k=JEy 1pӐ`^"VHJK]~<@rk-Etgd ܴ=pA޷է(>y21E'Ҥv[:o <:aIaC7ox2{&Zkm;X'MH&D >4eY9=*m/FsO; ̭i+ݺi␹rTr*-&pxmcu>QsN@J!:/5;tk._[Xu+/1H%~^ӣ?sش^'D442^?A"U@7Kޅ5O`uo܍Wb}.m8 =,ZY1ى?Fܪ;dW=ڕB3|}Zc!ƛ15"AlmGapA Xh;7^AϊyE՘?X'\|afz{|LiTOpOCc;&w^t-OAq5we'P[ughRxJUe;UI>H>Z1ŌR6O8BN޹;\S$0(y=2e.d7 cϗt9#f I2 b]%!/5b(_sKKb'm4h(\^WC5\@ilq9Cb&,y5F~a ƙE}pX5Rv%)Jic4ȴQt`=ٜ@Q4L=VR%W4;c+LP#p/ ¾KayͦIW7Ἦr"07?!Өh2XPMj&9R\+YGP[W!bs]wnVW Ѫ7;wљK{@^eNL?z_YVp>;wrbjS G6yʜCQuE;߯i78q=]A)߷fn1znғ3f N?$&Z_@܏ؼLvPnN/a%ҘJp@G?_ 8`76.":x q^YL&mE]Ĩ ;fiw;- cn;zP^Y"y\[U#̰߭j᎙,,P3" Z HjTPcXؑ-(α^L[ĩW5P[eN)Mx !P;%U}%F"<bzg+0?'G)9%̤G#;?'nDx.ka.#u;⬿svceox2: keᕨBIXf|؂q[\ O Ms*5o52q<)FHEб5NX2':∵D >":(g41$J! v._1Pz?BHJCl_"^֘*Սl5*!Ú&AmtV q-PhD.\gf"Ttq|a@WD#\=$JF85ZtDJRG.jZ k;bY"rU:yz`hnO!AA4K~^J0bX5=N!3]ŊnFWl,ʈ Q7j[8.RD-k#r(])CWҿ1h)M)vR4=!1>4qUq<`Rp{<4w>)Sp`iߖN@GHlMѬSL?<5nO'ML4)ġ 8_ ;Cz_YȓfW&_,XSlk ]r8I`~\{QNtLg(~zޱ* fJ&NkoeiT S"&n^G1?{&Ⱥh߰.]~EmbM ʢ¶_t7j ;urj$ѰJwq:(TR-LQ$l =N[ف Tr寒$w59pZ4[.@9⵩ѣPY7j jHJJ;tS%= QPN{K-ո4I7W=Rnpvab0:fl^ Ⱥ< ܸvDn+9d-o+A,rc.+++nҾl$x!U^F~sCL,#KhqrZ"]>.F%D ئH["V_lк 0)F?Mch>?JQnfGP]iS03xm.E 3olWfz\N >l't,Q+(&݇&*6\9+Fr\J?E=l0 QziV;{essAH]1+\B?Io⊠wC[ۊ=1!ZxTʛ p,CǼ[܇T'$bXp”*=eYNvFOjp_AcnCyb8[ZMiϨG"ZeDԻv2|$*&PYH_g$kQ)X˙C[Jkq>D캥O/AKsB2Us ҕ}Rh%wځR:Ih _]2{,7A*YOZ 3'3#*z=#s5EQmär 0!O7V:L'rZID|N X2H6 ~(]|@3dV\ &]!xܦӨ68lƉ6S׭)v Dv'k~;1S:E@hݚsLZ ~ r5HTT#CXoa FJ"5IXY:3S-{P"WӨIXI8Qv;pRFh(scAZp/cz9i)=2gZtK|uU*HEAFQ\|JWCLS8dZbu(SL~rHCH`ݺUk3[ouj|X%mB_u:S ;#&q.kA_Pvofx &2*t:Ȥ][dk7 7rO8: , p%Zdg{v#W7Ss ŶBz{9ˎStzaGX|b/ gafhg|/<)g%xu:).db.PP1̱r։݂˫OVA[򯷕o9%8NMǠ OiLOG~kxy7*B;$?$̾>`|1Z[zD$.j(3$R W)! Nj}Xu_U5eg'RN2m(<0b &4]:ecUԜѦFxaDLXdX߯1Fc$b l{az4[ !%b*\%ɂ\DQp mrwO11q_i*kd~0wj@\ 4(E|w85ٗq-Vg2mq:mRIU;V!VSBkVzŢxO$[]a @_-2Yc%蔁y=O nD # yxU]6|jA-)1!? NPwW*ހ dV7#*<*t$2O2 HHH”"NL0.GYYʐr?ګ33=mǮnfl\%nyf}ʷU?G[nX9W&ϘFR{H>'+Ks=Z!5 ` מּxb`BPWdX_9o$!;ȕQbKTM ,X neGO*YMRqSΒG֒X]9Q3xH'@!O |e)% XD:eB0WɌd*ӯ3K U{h\u @=]Q"ڲ -w^|c"$Bf$kҀ1ِrY8~> eě4QkǢ; 0˰ѓQAwݡp%`AF 8`^L`DQ~ 6{Bm9RѶGzT%*nٝZn=Y]>Q{=T@}SD_ W'"xId M#Pk…a&.UPd#U_`i)Y֜wCUVP3A 2'hm\x¶{#UFk{b*LJ1g .#>RL\hɴB<FgE2>5k LQc*$HzP\hu)ݘ%8ª&Eywx/[ql9<:M1GF(U"z5el4a;>5$A)4sLxhiq692ۘU(g1=W~-AȻ*6Z mfMsH鼈yvx~=3ԓ^ Hx*rcN .Z0?(ʢs}7ZcHM38bS(o{ivBEI+c$/,V!خ 69TCR΄b>^Y?Hx\Z9`,YVlv8]l58*k|\&|4\d[FtW6^pxX!~ Rye] 5|n5`.q$ӅKHrLjp9W7[ݺomT҆)Ͳx`eA0ծ<KNV`nh 틫| L+ 9"*(R,hLs=pm*GdК10u Qf}=N) $䪺p%6MKPUvc2DcBF(!RpM9MCP*!JnTj)*ZJ>|Y>si]}m ݰy*0n<0L qx3QX=W.w7Dx-t*7!Mk/OQ)|#'eMbg/=b/`y}~X ({ q){Lf@_RnM+T4ca"㹭6l]e_,Q"G-+;V,t=E$@0Ӂ2c 1Em[Sݼ0!E$,!_"01Dz>Z&q!;&BٿvYxcC D/aH10nJ1\ܟ:@s_b=՘A@vR &Q h'jP wMY=T v:UpD1{b^ 1mE%9o*epOhE)er,$)e7<2'OW@{4 ghWo﫠ղ)5">72 $;w&EF{']JFp4ѮE%ِXՊ5&!Z56BJ?wHSyL|6t f 򮅫pkIX.WK?DCiOLԹ#-<$?rLbᗷӼ/qVFrS5%qWTv5>X Z=Bk8T/ Ԯ9:&Ғ,>YN(}&UBĦEh=` ӏk|X%3w-y c{hpO!&wM6އe^ҙ&N!a'^4 iaާY?j҃Z7Q Yɳ!O(ڞK$sȑfCkc{7wxxz&:v@z6MtOYF65}&jFvM{xǕ>q*$~eGy>aV *՛ ΁|t~Q?mYX{nՠsw!:qsh 5n.҄]KbJx$ؠ+%IQ65GejVi9 ɾ[,;eP}l1O3HCc:2-%I@XP79O >n)vyzzM֨a%L[L&zwѤ49$a|#I֚FT> c6]-DzG%-fTjs+7/IϯBgސS^sX8Wq>ixY$RwR4}zBa"FoT.,.P;g1iq8bAYE7f~Il>:"X0r(Sj̧,Bz.pR#Hܔ9(=T wb+fAjgqvr1 -(8rbcf r) ڒ:::^PjUbMDhuP3yCJ1?<Ȭh7҄ J3?r}(,:d1[=g.!;%u'Ԡi` AFԖ.?h.L8Ƚdi5+u2vEQf(8q'V.x޿ @DKK㜻p+Py'6zsmA Džհ(&&2Qr;½5ds w E2b@ogZXy-gRǮ&G\e 3fVL&0|PdֲĽfak,|EP`P~,b:8>[z* **?PѣKc{f8k JAymSĽUbG,Qeʨl4a#e) $;DIb<)A #{W!V+p1 P'~8z{=8EvFv^i?L 63]Ʉ}RYF/)qabj^ {&IcźsغWfJ=XdC|LߐY## !oy6k1@~#sb42J<"`t"_N\ PWWr."nHAz|%$_=L^K^F* Dcw:K9*ZɁFB@&ۺl5,):23t,XӪz&.܏8v~4&2 `pJ3 U^OH;EAv1ﲤڙSȎg+~N?&j`#E)((|,qdIWsrV5֥qoǢ>8D veO9[1b^C!M٢4-?N:Γ{"gP\>? 8I\m[RpwozC0cݏ7?ØNa qdKuD<#Zcq^˱&I㠬:R;c:2>AsrM@Ac[+7@#e#RmDt i89HCiG=R1'ȩ$sTP:y,~,Gtɏ.j% yO VmI!~:(B5p7u)mؚtL"X73Ҕ}S^Bɯ4:K1~JZl'^x{H7E,`we"3a&ff~vIq#e"KW2N {"lCQ֞{A]-W1O{}''[=t( !fbSk(^K+7R꥗h?B@~mnOT،F$0O/Cb_FJ^~QdMt #J6&), 9g‰Rj5 -ՙV@:W+4{h_HVT:*$G ]L/ڋBm:* jL XYeCQby![Λ:qc? B[R::Hߩݛ:)|VI߭3%no?ǝ81n*[VV9-kC~?R¢u I zW]bnJm'Ƣ<8vdnb!~E0FPgw/i69wHjVJșKZ5 nէxE_Ʌ0]5Ty9J/] 65|JfA|bM @Cd0=aF6o$q χän*A)N"*f2pwv|pmXǮ)GQHb[P+X}dC灚,$6< ?D9H[-/wm y1d{(d m1=R u?f^dᧆI<湬;׬>u4}(ٷtDs_1?>3*@{R .pΉ&EDMI9¯EoQ-_wC0?DXqf4ZEQ偣h"I ho.g }2E{ȳT]K $MnOÁEih[T׮l4ٵ)W RIE x^'B^9}tIFli>z^cvtoSo [ Jd,OݨM5,j`@l\U6`z-Wy8y,M>~TP OZLz ry;QFi3 "nŅiVg6OxwSQ)S}ʪ1hޛMYn0HWsKы| RjliQkq>** ?QH5-dD0-=kKe+0 Ίtr~f#nرjɶ{:e}[$+k7BEQ|77]S;k! I2o~B[d<7^83BXQ<Ud,X"A=ݢmԢ8#, OnW^[9ca2}GHSG /&l' OS·44G౨uAíJ4wJyIs.QXP0DSv/vzڇGI)صT(fw)A*iL"Cjc2}< Ŗ=m R62DE9Ұ7a~ߩJxCu7O qoLOrӸ^3ݔCe._q)31[36;@kU1RVemT #β^9'X +S%kiaMCԚMDG@r*  jt\x'w^0?3ׄ^)؂LI,Uɤ--x/Y/!:}3 |Rj hN#Ǽf4iNVqda ]7,212׍%q <׶ťAue.]` 3LhҭDUQ8fxY}}M5jLpr1stK R'^rYGF?us╷$4(r+a>&$l1̭m߱Mj  4a]e#4:0Fl./L_?bTtVvh- :bO[^;w A;H2 0sG9(&Eu7n*Gc DnXRVBliC,:}l:FQ~{,0 WȜ/_tŞiqeΎNaDϻdoÉ6^N,xbWlu:.Hсekc;;ڠWLͳ4 KڅM3k. Wd. KH Yi]g,uULaI0BFIt-qh(@vz)}&qش>ZWRmw1?U]{V4l|Rtpƭ*|YPgQFv&Z. q87(\Qmm[x]hL^dˢ!ЪRTgP~dNR| D6 ..ϟ_҈b\N~YyV='1_.,f1DbA%SUP'o _,F2Qje8Z[ Tb*؎bVVc|3<;xqV P8âoHTE{EHP @UVFbs]8݈Nm4MEݹj;g .U^"zdW:dF@7j |֊Z. Y>yHN?jpMxİW}%p3N^!] DPRuVbEVMYN2 imeM8۷w~;9BYZmH^EW.Ɖ}U~:a4M㻝9zV޲wJxpA40ezu˪N l,h0ayUvךx#S[!*(e_(ԭ .lc ɥȢ!^3f,1fIdKǁ:@:$Exf%te"#`YGK!Krw*NG1 ~@Y|nZ:C6N^G߼ub0enPO))|:D}-Qub}BWґ%f[ NBŖ 7}lA-C=ΐ =}$޺bI%X׍L+=~D)756^J-Q][- p|땕Ӝ"1`46bb6Pό45#H6VDל}W E\ꬭ{F@Vk/+#~>Zr{5j=.e=h" ܗ bԨqk>8V@P .;K '1K`$>W~:I݅"dBI|s{( 7-c>8HJ(ުA{՚8b,rsSq0 T>(6J.7b`n[Hu<(៮dc 3C2,,9E5vWRSYl3-q PLtpKD]oÌR1-,.dxN#\X:/LYTxܗ1@ڰ&3<󮠟roeߏ蜾$ *:,4>it*Ϸ9 dEudES#LѡFk%\saȩBl iim.@͊ \*o%1nu}zЮ%bvj+?ݱRAw塈!0ysd!Yb@yw]&cŽ}遷:u2$ugZtp#_X޲A5X$rjXhESPTK7DwXv p0˄O;$1̻ЩK#| DiMrZ^i(`05]a7Hwja'8=GMW RU ٛ,҄b5I]'+EIIMS2jp6vZɢ*ÇӂeX14 !c"@H # 5!)G`Mefܺo$g}du2.mV菉F'S}ҝ35W`iq8u鼞S1o ԁ;}4+\+,` =Gp7.i3%Bt;4S%n JQ V̳yj^2!lº~Y6ZvB'O j"-p:)1<xonu#1Sg۫.Lѷ<+id&K+筮k/ƹ/m[OBC5"P uj/˧i 1:y孛c ݽ .m (L9uHOHF ca/XH ޠ/Y-hхfGt@VZ0)B?%(i"nL& Ruq8ʷō zת)So,Vg .FZZKO|RA|cuoԡPXsym͚*c}msh`ˉ^iQyNU! sPNC Y;G DK1~RNXRƗ]~cCW6"Q~I@Emzǧyut6|[ӻx0džm0ψ{1$u։g76`TΪ/-'SɺBHv=4\ŶyŨ_u5!#MXI^ӵs偍HU6x [Y,58rЂ$ R 7ivd" %UBSl83QZ0M3uWw3MC}j?' V`L4>fVt&9CXɇu*GNf v"s۸O$[(_}F{`}+WgIȦuZ\0rdFHP]G;euue]`?ro YDgˌV305%TͶG@6GƻAfG`Q6*3$"Ey G[c޸I#FD¢37`8^ K,&0 -e[w^NzeΫ@Iwgj>z8GI [c`Z Rw:T8 A='5d[rġ'|ݔ\rq*o44a^,xqsX^yg²HK%jBʈmr!ViI|&(ٱ{E N1-;kݎ_͛XTh:Oy;uҤcg ~q^'==saT.#lW@T4uO@Z#s!% |N7K9V7mXjѩe Q@DG\d Iw?~ WImGI NcE @Uε~]glueL2+7Vk=ElV>" CkʻܯnJqvwz\ߜ),:ȵ4r }cGoK\+j~a:ZI5ȜS96.Af(0`&O+$u'ge6{G`}rr1ɤ.j m˄й~Nj:" }׀zyCbFMFtN8a(;虎RI0XDϓlԥ6׽Q7isapxTA/)EW^$Y[ӽ5XbAm9Nw}}]2#UCDKjl_՟;}\zZCU]y-u_ {Qz5HwP0XCFj\h2i&fuRr7rߊ1SC,n䁽?<9Im) B4NSX G<[X0L=6yD]&MҲ67|22#V91dSv=0%*ށMLK'tI 4i+J=uX 9.=m31: 'T',lc2ls,5@aY a"XIa1/ !%M3CM$LYaaШxbp=H^k6QPÊ~K97x9BMTmp<-7˜EY^Ѫfgw g w& yp Xr|kâ TiPfImn?6Ώnc3N5L*E0hOoߓᄌfQOZodտnЯ^y0 .ZoGUEku`s=K.D+Gj{prMm jej=TFE Ipj΢, X\$6ESdw^ cJ@& 0C'e$ѪLX|kʒ7VD[88{ ފuc{yG!_s9W^uh>g8ۋJkqb )F1(.s 9IP+@7.\'5Pi bd=ainrscDe,`sE_GCN1%S;t)™? WY7M!C /(:̹)A-]&1mBS&?/<2GYxf+pVMF|[xH!j9&R.s%D= /?ô晥u@iZ/-3,;e%F[%eR'WlhB3 |`]K)AV2K7L/rh-SHPթ۴g_ӣ4ӷ.԰8X[`3 My Ssլowf rhqRuCǴ@MN4"B>fy\O{ChޟQ0:ڕa^수k+0?o*&dɰnCXkJ>c,/M q\ F!I*G! (` 蔿"_VgmU6Ю'.X"yzv2dx"%*-kk}T,U~Lef߱;8F`w"]B1.;z{xJkY*?x{=\<߇˨$p^lg}k{UCL[" ~څE+WU4\Y=#.侚DU哗,]J42 ( \6bcYFt.w~AGk~hDv~,7f-:]MVFe[aų $R[0] H "ޥ6x x3+lVa+ၒsͫ! fO/)1 _0W. RS@gvz""hj4O\>F6dVT7 r#Kv`,PT'I(+' O* 0\?U݇QHfq4xUe \WѲǙ?c ! Ġ]C] 38^;P(eJ/3*5#R^kN>5{356j )-r{x *xE_ш=Eќ1sVI۳,r@0cCtŪ!CP BI=t˚!"[wF@Ҥsq}iJ殇F<8%y8o +qgӾOM6yfz̔~P 5syp ?,%Dyw;>4Gר/–U{ ŃtW+5 a p[̜-kIyT m7oA%X] o?-2ڣ-&ph:)c,Cb%)qf/ Ukq8~-eR Y~¸Cv4ߕ筡6h=ѫ _ԏڑÎy:K=|v _IB:}7Y682TҰl{%H>OvP^' PϺ;+yy҇BCD6-,O-Isn筪 =$6[&yOYJÑ1͂_R奊Hwb+;x R2ʦnY Ej0bARA(WqB` oRkg![&*xXc`=q&~SEjlR`]^#j4!Iv 4:׆y@ȢǗW}v"*vQ{KO{v 3\ ɴ½ϫA>8~@e `e%1] h3jC, \ :o{FV#8{ \;U1 0)kK'w%tݵ!$kch,gEFl%٪7ZgAQ0Bz:!L6E"䇝OjטbTԐohVjObsbk J%CAF7. %itf9X@wV TfXZxމ <w[#kҺ0(ZF$ G>&Er̩-JR'0?./i wt'Ѷ,mS45ЯpĞ{{D2싃r|͉>)AgФe5iե^GJ1""LIat"R,wPoS8A[m)%E= fc$r]m. S%cmw8IV`1k 6gued$5oL٩ / R VKOx~6ĖlU z҅7wV@?#XR9O46Q"I}*>Uw.\]@sE[''w$Yqp~AZ$KÞv"h?X-%$H(Nl~ s""ؕ C;UL3uZ[FcoݣNJ0]oO'$zWJgqVޮ?oU}l*/x, n 'Tڽ\fIDk᮱$ ;SǕLYR2XP.p+'T/Ft 4n<p 9LW.;Vߚjq[u̦QkFS |N_LUY<?}~= ኋ9b_%Z`h!b  |He# -u"stJ(E XbX:lH$}<CJcίW3'.'a[Eߛlty4NIUa"cL[m\xIFm8 ,\s;f%^ {@xkGF-d/W3 Kv;6}ao NOX̰NT!%R"m1lWⳣQFfZG)aihC5ۉ3Ư`t2ܙ}χ5=UXS*{%]Tg8-jm1~;DHCmONy2?7@cwYZa9HK;XwPYz[[Z ^M mbe GElΦ#ďC '?Y_G32F}<}j _zU}KB4HQIJUe3;{IQf̆mDW;0Dԥ8 %"guhuhiʄszFEo&d=4MH O &h ?cV1KM/VW{Mxv_Jʃ)xGph2޽efyߠ >o%,X:VWbuۚC4/6uT{d#о$k&\ova9_#|.p1>7m/3r m @4rFPٕ3}ώ$]rN5F7z~HjY4SuX&:x?r jեy{&_yH]<˭OkӹR|8x a#4-ģa\0$ջt틝oM?Ji&?zQẁxFxFNa`*3}ۚVQXWf7pPhgnpWq̷AJ+ q~4Șn rUk,@nʏtS+yK2)̔.wCȪDqtPɼ yn!:>1Nm ?QMVkڲSl푊:nYôA{lBAfXw7 (Rz\gk*ղ+7ucI+4:3j6-FnX#7cP=nWE٨$)(V3LpPCjԳ)$&,d&zۮ:ۼ+ױ>c|U/x ՘@HK_D|`qU_ '+GNJ#xN7֠N =n2-S!YXR5Ua.XB?GԬCtZs껧yd_$S /X OZI&|Lm*CRU7۩l {OԚw=TCl2)XD.>҄7HkqR8EsS;Ho乹ʽpK`L~=d2enmq<~9~q^и92oz,Evzgs_W*3%|IԼQfy9 ~\ĚvPdM8v$-‹rb n}}ִiu6%NpMOh q"Sj.b5 _unR(i1 sPL(_NbX-2iiĽĸy٭lY \bgb`|6֍5$Kck1ƣ<MHBwl9I nάߥ{7=.`C+:,Rǯ\@5$OWPxVG/>ĒҖq&*ZB%FO^y}BB64.i]M$3>e+PSQ:,:~SE=?"wj_MUzZ522Dam<]9(๷М2~|~TxaZv@WbeNTE} "A0_Oج~DGzxۍ. "*,t\g}Lz90x{k x\:g5~ |AJ 1<1f"sP_ο/ڐ:L>!1@_<S t={=F_J~)dw0ƴ;% J:r6J z&R^FWcM7Іk#im0ǎ'G$qmU2OGL)\I_X*npkSV~A@/./s׍sEQ&e/|I\[#9EKjf; \y%yL8ZSu> 렘1.6 -K^FEĺE#j~KGbܛC7J5ߡn{\GӖ0M+ITT̅5wϠ$ľHY[CKҾ;䗃dMDfF (w#_6˴9B7X:v>~$4)jX[, LlP9TzBՈ*x@mna&p"_ȜHnYP~$8GޖGJ='g|!1n5fc"n!O{X'|UMßa )r*&"^= s.AYe@220Ml!”BEVOmZЍAfb'G<> z&7YvxLF0"> x@*$Dh @@ 1.J"%#o׬K3XBpL Y¹1>[<ԧ X۠Zx֕A~[_vj9ʙf8EZ]D'%]Fi%D4Eڡ LSoSz_v(//XdOϚqT>|"m&68zuEU `ڤ}x&gW IdtnqN~y};p!V!U+)?!͉d\2;JCM~Oz&ڒ2AE{hh[{tfuN"z]j\DNM}{Ur#[ rS z٬g-UW*gux l 5#T'EnFHII ;7MVйQJSS$Iԕqs1Y8mLS&$ Rc֑Tn{y 7o<@ų]v[s*uNq|eXh*P0f|//nԣ̢3W[2.O[nTw@CU3M4<ԍי̗+N"? h;OI}b@R8'6Z+m! *]F !,Փ[GP#9TCA:\ʛ5taVCsݖ ֒JAXf^؅LؘfiK$T'M]tT\!-f{,Q &E\V)Rmq]81\cqi)Cd0^^a)GE]ۃ}frz$c&pބ5_0? pp~ğ6V5*GXOՓ7@!q ;GY7uؖ+5? Hǖw3G8Ar]̉>|K ,J-}^w3&.a8 koZ5 9sd31I|ME qh#bO5?aH@bg O#2=F pkc:ÆC:n֗fG-h:0$ Y)pZ:ဢ8S '1*Fn!1qa5Be-7OgGۓQ+;lKbu_r#nvr\GQ tv6]| KMgύxً[@RVG% B u ]5 Fp9?c-k,CycWPwm)1ڵ] \ .5)J%S0MjJՄ 1T>˃K vKOl _%=Z`k}Xj]ȝrO wj '򞞻-1tZsM#akbxddH7if[2atBg~d|6aAO4r&0Bn-鸾Yg[w@8n<\9%A g)_jAtדBF6榃[]%^xmc& :F"-́2-P֜84MݳIPӈ4O=A4/#DəZc_Z൪h~aF8yY<-JlĥI$ ?0]J 4?52☇}uO,vnY;;%= E h[oBrTI S*p@IrB"F/dGB|AoES}cԥ,ȍ|>Ez ˝4p=O:n&s qC}[zGǟJ i{yT\qEɔ)-7W]̪N%luZYW#D4KU%ګzf] ۋ!FH(U׵ ǖVBXܲ%Ce|}@G0g@?:kE*d?f6cDآ`tã3Gnח噏(9@75 YS5cĄk|cĂoXse{OJn3:__L\d4lf1\%~А??vNh%cg+_!yO)4ikAM9g5ŜyWVA9aޅ)].G.|{Bzc6q'|Ee+IG+PI)jV7Rpf 9.#/Y\LVl Tʍ+JXy<)Г CJPA)LBghiFa%,;gهW;*l7]l ̟9r2a?r)^ (>e]Vh8#:ɢjnf |үcOhϡ5V^O[Iұ)蛲}"gWvㄥ62>8c}5 /Hy$gޫ8IH+Zva3x08c2͵ĔUW3*EdlS{Ƌl?1, \$;Ktϟ=6tר@L>}Ȝ^5Ⱦ,PWY.\).]&b) ghSA7)cz8akjG'efAq]oy7,ҙuG=+򅤍OX̞ԓݸ*g ٟw|`(]8?P07%ZzyU v؀2wС\dBR˄FWJȑpN]"5V 0>vg~54#~IRDbF >v O=?˄b7,#]뚾/.'fKGLz ݫp3eg 68.tL; zZ2B+( hMoWg%?|ik?ΣDub.uMXئ<ɺ1ڋYPlJ[vDV5稘m8UN F'>k%4*]~wD{gcJ2Uo>0޾ҮG¿riNe 5<}x &f3!#7Ńlh=bN BiPɄTʨ,6c$e*˵ bFJojx CRvY!GrR†~6mƗ;/UW|-+;" ɲx"[#_ nwU\.!Cyeٞʄ80Bm|Qڄk2WdHg!4KEC`:XF]?vѻȏ*BLY~MEy pɌ~|zgk*oX4ehd'އR7NSρ *'C Ã:,muo2 Q\_O("ꐆ(׳O33wbVq4 um.(KC"N9nkWBvpWbCرpSKVƹIgŽ4Au%;[?XAm&/ד X P+Y{ ;.r`Q4Ͳhxc'i-CC$? ,fz:rOn<˃gϕB=BJ/ѫI" S[K۠X r2DkW9%է7'fpCVdb_עB@6rLVlB[>Ww* RoEilBULr䈶o(/lg@Ӹr'lo`qGd~?ٲ乄-FJI*vNJU E4/ᷛfNjROa,&Ż&~Mߖ'+"ݙ-aÛ~+__4gMإ^6>5iKXa)RtX=MAS\HhJRk{w|.3 pBChYȵVqpzj1kX4UHMOi /K>x>_ @ΜX:$ s?`8 ҪQ' +ucJwR4XVI}f*I-W=%ߖm*l1n4x=RcZs5+r$P >s`B~n"bbIȳۿDd';J1/koӊX$ Pz$[%b@Eh3C*=$DVv+A67j=bo8t/]D⮌kj\.򷧁ZIA)Q" ibZ1{ؿ72VWpG!W"!G(gl)Zlh*a5Sb$BRZF|HZ] iRZw a̛M׏$?P2Tl[ yA0-C'QMge`;qPu(U>٢Cp<[rӼ{hz:ebDS;rs'^I/8=+-@{y+S!"G f5#珻 ^"`1 y'y?JxbV+ᇈCܓGU4NcV&y{bemVl{%ޜeJ 9d!>j&hWȍ.d@u65Kv޾@gdE{{Ȫ}!:YQ9ۓd"ph@Y$pwĖ#VR~9\"krӖ8> =2,xz᧺B ]EFѦtD6`!BnTH],4r/2n$8KGta++_ ntx㌤TJdBo3s1@.H۞n3ո[{@MRtH%()z%vK Ҏ-L %:(J;+9gF5'qmiO? 9TWpG#( iNVc)+LU)jieFk{r;, 1Q@ؕP Jpgd KWIƚ.`lnMXx PMGHJtByъ5 k]XEEꃒ=OQnҮXO)K#0yOA^K,"5֑O5 ?}4>![e-u6Ex\V&^a#f &XޖV3A},*?x1a/Z!˞5CΊ)Oc^ p y n`bBq,͑X1 fY'Ts ]hv6' DCB ꏄ0]ӳos{w⡝:ϋnmtr/J>xp-dy$ϫm RUJ@ӣϣ_I#h:#tG-yC#ق8gXyq~fx֎ntRx֒ɣ;4bDQ\j}fT>xi1k;-'vMYuSȔ1]Eń&@fKoÎDM/Dy;Lۘ}܃dbcxz U"3vv[9l*9:$}Zb$g oj#-׋9[{">X(IHv.ECv }Ǧoj3Xmy)h/lv#kM`Brc_xa͹MM̗q̖<4Z0Jzb[_Qf^T_'-%*tMl#e8u\o6m"{a'@-%]oK>MhZ9ց#pE)HmgÌ$##hGcG\)3rA+7zK5HB^~b cyL9Ʒ>^?>ByۣDS_z.LJv+o!2BKKEaeNUۆLEҀX{Gwpm`UP[6_5΁]aqXܺ"֢N&w0S}BPO8򲂿CHGwUcL6ǂxABHGxomn5XSY4W 1޵!yXI?Bk|˻d(qUТ u ?x0֣\g^b"2ޢv륕abo oYBU; }]d2Џ2&},G,hۡHrh+vLr- SSiVxm7QF;.$=I[y aj67\ Y *P|X9Q"'QA*K YY>Ǯ\i(\R6k+1%('-Ml=CU<yO}LvIew+4SK}mA0j;8jpINHC4c< Y jE]9m-S]9T,,Ep6Hgawȸ{Qs,b8谛"GOa45C83g]]˄ >rѸMG8$ii:[z~/)@ `#='=N "  ̀LzAlV Z^踆V|ր` ~Gd-Z'Y9_ # \{ƶ{jW_lx2mI [/ja wa>^vIKDSkEr],|BmNوo+,c-?6mшmuZ=ըӌC'c1d$Up=,P452r\LAb1.S.1{6*8#L" X,ͺBmdmitY,'lCJ܍=>]5CD RS<4 @ZNT9Q u}U3!'b124RŜ=W 4돖c:;uo5IȜ6J!ԩ@F@_'_ {.Q~K^!^y!R$*᤭"g47]TRחPu ߡiOHB1rl%:YxD)7`F49F0-q{0jy^W{x3 7"F ɗqBJ 3@R*fe~rA4bwMAY#@s,T͗$C2Lތg.#yF.E,\xE@ROg 6մ7A+<況)3,ZڛQ5 K<>{w3pՊ,.C}Y. z<8virQiq_6ZPKjm jVBl`4xlu$CrVBH9Wʼni%PN(Y"l~XxpE|Jv4?] PΜΘuq+tO\`~4'Yiu*-[(%9wٚ[ZHW>P@lciʳ(QS3ߦT3\bh?ޯ ASy8Lu jzwh`Fuav' Tb2??b~= ?YYU4w/y)^NVmٮ!)~ dEZ|fHm# /⻷S=wXא+Rұ48fFqu0[)=MUQ1%2ԜKBq6: ω>&777gj{L"\t#k~$%U[wЇa.ƁK?HK8|.>Zp 9&KIQ p% ;`{0Psq* :]B顔@\Q(^@ ħgyܣ06VOG)"ja-U3=5"6Eûm qH7kgOip@ܺo#G lppS};.b.q=yO~n~g8RY<' DKIfN#ztD>;R~fG,yZWdI885q}\(y{ebnP݃F;xڴ̨ep3:5xQm2;L~X[A0.ŜHPѿ5Vƣx-Lr&J"Vz 6!pKmȖ!Զz[cHhzKm [3i‚ž X͏.{ZFJx?z9X/QX;t\A'A-֋/ܿ(1 7 1<Ǿ̡XjE_s;.s]2pO .W&5 $ %}BR5o C]H씛.m3ۭmНDp8"UqL~Uf)_ 4gк8Jȓ!q~ixȡ:2vܿeQclݧ)O >|-kt/J_\(U`x=ȝ53Bo9LJ_ImG|}`pl$ w-F9|KPu1TJspHY'IvPGhRHP9 #A+Zn E P5د->m)wɸaLW2Z Q%S׃XP9Bh3ma)`<ùHuVЗb~TlUNlM6po^d{K2980jbVψ0DU_bj};Dk{Qwb&(;JXTgp^۪/[7wq$պCѥdRӼAԚ+TEPD9U/o,*_tϙR3T^Y{%+e“9Xo6B?AݘMEVu -A˰}4" }R1q}K΋a0bi4Bl'L1樞*j]u^bƿĀoaZ䃕 *\EPk;;mĚ3@Pu7 5y]j$壚 vFcM"1`SIL7͗0ψ9,@t\6@6GuKmܭdD9kP0 k+Zeɝ3mLJKjpf&jJXE:) S"ȉkUK]?)/Z̥} NE |08/EotF2 E}v{2gϕah2(%LB45Amu/5MH{`>6#B"{]=v-7˫8`?u+7N_2rj T4ڄXjWƞNS{47MI }w{4.wRŴؽO,A|o3otbXݯA&"o yevBpP~4፩SK#$A ZcLԮg+-L Wx|' @y*Ve'ZM"%$=\+ rs;ᴒ,,࿝7e7+'o**Wg1N:Gs<'z]IdXj%īNF^}PMf6#c&p8޸"H;z;kJ8"lSM6PDZ/ވ!JXESf)sUFj^]buEO8|EۙL7;Iy10#a(~2xb:I,"FpPWmOߺK<7Fi1 #B2hۭA\Lw{B.K|'3#Zkף iY#\ܷ݈?—aEv/z:Hni3:()lZ?X!/CWo|ԜCga櫀} pq_eyo7 l,+Ǖ_q¯.O P7+>@s]F38r M d60TD-+̐@UT{Gm"EC f׶,5!tح CI=x2[x:s(CR| 'u\-Ctr=0bUɹXZ1 qSq ^#ˢ#)h!RKJf8˚Ù]o{($ ( fQFMgPʊDi8j/V̒MB/$_==J錷كWHƦGSBN ol.X<o r!V{[TrI"pcYz -9Px 8{6 b;hKsb2 SS2hzUOI|Xb/0GJ60Y2b'hSfg,$M37r :Q ƓW+q^U D =ԗ.vJW㪣#j;2WN-ꉷfO97uZPcG"D/aGW |ҭq U }=袠yI 0qK1`+>a>g߬1+];U$9EXAGk9s@`HdHCh%3[d1XVG9prj [NGD}yn9l~\0 k8kObl~>~yUZ~h/a\SuXT.t߬#P=*,]Յ+!).nEr][Y-+o }(gN+_2>%p{@ID;ɑfxn \MWhH)eO j_摉O s񲎎|<{jP[m(ۛ@>!ځM:tHq?Y z^wtJ-1gt0|F +T1Gm1 *jSQ8|3BvOSiw? YA*b׶\ /{9=&'L6Q:%jxWTW, :XV!NC, gH9p#M<ԝ[Z([ 6NbScRX~pE!~. @WQ%ș,.'']|}N- OW{Q#R 4RjMG"5*u Kr'y}oJ+1Cap #s9ؗ:47NX!џ O;'..f3ԣLxDB(Ԙ|{t@VYj!}e!,6a6R 6g֖PU` }իNoEiFڊ p\aw:&b*5P#샌 Ml B%a@.QXY("wI(Z\̥nn0{LwYu?[p=X_D!q(r>'hz`H ծA_?7[V9QU(A̗7'Q IMOXW2 `cmEIe 8]DZ"2 KAD>^ h>4֞h,B֩d/}8u`Pn[4.$vfi. kuhyo+! ~Fqm'GbĠ~'{J&:.EW/u? '-Ṣ~ Jd XI6'>XEe}Z:R5E:mhϒI_r<?è,#9$ O+ιh"d5Jw A_¶MG6 ٲɳVCX7?9P1zA1f sDP5&|4+}3IɎR 9Ҍ V:ϝY#2$  S2>ܝLoHSD80;h!ၿ5Dh4g-*jj=Q:N{f:RiF-k"}F#hYo9)ef0d5V_ln_ېRpUMl2 K%U&%y>vJUfs9pHVN#Nώ]^|pxEl?r{Rͷ=J;izg >w!Kefrs5w}% ϭW |4?YWB;[ ]HW֦/ sTpѭ4(\$.$".}/#wMyuԱֵ!KL=c*wA(~GʑV2 X&/c,0 .]6j|aƏΰ(QLؽNsMrA(hQOanS{[ex+&-2tgC/.GV{xBr6"K`sf"B~H(\y=m0@UFޚ~&]O*moT2TͰpV[ޣEj~EZ],N k} "+jnM^ {;^AƄoz;FBA¥4~21G @ Y7<V=LRwX\%eS꭪AZc `-Zolя_DY\u dzGgfl_6C2DwSڎǬ&(hpt!8+x~S$M} [PZ M*Z"v,O>| \)xJ8W][^oՏҪ/Dv}}DWFẀ7Ɂݨ a$IBt; *We0U#Gz&^65 Iet}X%Vk }݃xXz̴% /$f$$')a_>U'v>I$z\kSɓ oezT2 CRXliPB)' ޤGl2[ "d %(5*Z+S/srT'p/5+(*8&vF"ُ-.7Cŗ {GN`(5,]JI,;ܫs>n^#vm9=(JQy?-3 {qAKjNvrSYRBT8Q+Jrc &p )T2:E!)-)$ !1Pvex]J[NS+ ӯS6S?ÿiI`B.q=㾟,=ARPI0dKXL eȎYy,2vdHUV,ULvwTS=H9%OkXe8LC, =kL5 FԯĻ'YOnF b!ՓpXOù4$\s>Ӳ.m k-31cL?`j@wUP/A d[ 3tq fÉ2F/l94(J F[ 'P\$yCENSpa<qjA@C7\ x S֧|jjTb1 W7CZxAmzh\8ZOJ6.Dk1O؄[[sjl]S6\ǟhBֆe.ᴱSoDg}1sHA컗*$c9IiI 1u),]-Z.'~xwQ}8W%dVp2$=ϑKryy HQ~64}6L?) *4 KjEpμ`I}"#y#: 9 .R eu>|,Ǵd 44OO2.-Ȅqto̞Q,r̴mR6b(}qMI'ou[[wk.\LH8`(_c Y2Twd| *7ܚv̔ Ikgd̫.i?'ʾR6GƟLu}7*f)\4k` y.-zQxvNMJ|y]+Jv<Y>$bn4O?N}ДcfYF7vq+=%v=w,̧*>q 'lf-s;#l;8#(r~ jalaڥ2#,:\gb3G 9͔q3 wNZY _xx-t] U-N* LGFQdAG"2=~X[/)݋`:2 'qajH [ܹ,: YqнoZK<-'O,dY bM-ga\s&f0]M&wP"o3h wIq r_ EOzeQB=ZZ81~dKiN~5y#GePhQCtJU !(դ!Gf'hm`]mU;Z͡j[զܞaSp}z0*Z|ذ ǥpTT'hߒe_xc.tԍ_ [+L( TO6MCȯi^t<U(\ Tf=p@*vykK?X5!PąT^ "Īاwf0Ay/vwC})E?KLrTL9#$3T_v(*sr5إإ. <-_O>м 3TiSUlFᑵft1(7&j0_݅jNqci`iF|]d.&z Z3$/ ._k]!HԣǠu:9 ~Q`8j*8.Ce*" ~|ebM_- 4%@]8ruʦn8f7JØQ4>GXKCñZvX9*WLc;1zAlKVj<8JO2(ǢʣhےL?K7l0*$({t-ܮ= D/.-uc *Hs*\\-nAk9 ~sB0}C[ͱtdP2^}.nES'XM {ؐlugWx!鋇){H@#G3)VGLhQgDwX[ң=SUQ{|_krQō<0(@tFT8sHVݰ+KW3O֖u?۝2M#.>8`WzȀCײ[kH'*KK2ܯF"&w5uT\sR.7+ Fj)[Յ=9Ic ~vZz/ C~ L;MP߰PRln'ĢXV$ 7„t˭uXMNR57LZnŘcq^ӱoܞ@rj׬IV!(E8Yy,Pi[!l7L'_ Ѿ,xs aNiϳFcJ5-qRnl+up Gxt%-f^pyStm4ޗ,o>a0lsQ.z}+NWJp+;5%O؏Ip86]NhGx BfpA6!ʹuE 6Hrܶ-+125NYI0wnA~(tjHOZ:I1JMVm5)}eo妘7^xu~w(dFӾF_ĮFޙ!G>Dݱf{􀵹@TW"vrG*+ƾkfNMKִxms@8TΠ=^[Lwp8{t&{.-h1`\Ӡi?[w.=D"*F))5a 7}@XUK7<*#x`sW.3WÌ8 (~K:L֦2ECՐ7eNsnP AHSFH*s>H٫gQ}FH(tۭ GeAbơFI@5WƷۛ\Mc'Z;6\;&e^=M;QeG0A h" AGm\ xaD&Cו}<`-bt,+iU>Pwnpz?J0C"rEq)p0Qug7:PBVS_^,cE}`OZ̺ud0 _ wvV7GOo+e?eVoG;gZGw}c?L殭`-{ >h!ݣ)NCȨ~@$j(sS:804f-9ONBz،^j-61΄sP;Gkz7"\&3Y rN6Dh/L˥H hJa[9ZrW[Ft[y hVU!Qμ1LC$uCEWkl~<!x?Y;)&0w$"a[41:Gl)/{~K^у,"~A׸'վyjs&*BPOd~)iҋl0.7gj:˸]ZFGc ޣ;@vѳ&@frӱT[1d#8%TLUa k'RWLG2פ e$2PpzרAS9j-fkm<wy=W&f]dkB-'0ܔRTO kܬeCaq?c,,ށ&B-/63GPV]1(:H ۝/ «nqd̵| zUDuO hR1$c:[Xuǵ )W~d5S`0uv9Qj)Bl/ "T{*(v vN] ,if$mAEv; ˬ3aiaDq>,] '+ЮG5jl!OTކҢFr"][N=)Pq[n`:d0ʭ&uUiBpwo?NV6Ӷ&ãqYծ_Բ= Q +gi:9(Cn̸'Cе M.[zc1擪pPyWJ;y l &uޝJ_ܛ3 $q8l7EU-\Z$FǦFz ?TE_rB83nV+ VYGp]1εRy 0N-]9讞E *ywuaYGV`]]VM$%.3 b l<{݅qA[z 8 s5^1&2M v fkBDR4.;Ւ:)5!TK!ۛ5.wP$_~^h\TZUz]̛彚 vǔ2Y+8pK5bQUB5ÿ*g=%; B٘ ̬ĶTCb'NsZ$&Em&"Tc=9k0W&C1Rp@Kz)zD/5"|됫 7XmӸi 5Z00#$,>]>,|C;&@&yoLYUUK22 ה 0);4fڀ+]{pBnXA@e_턘o VYͅ-N/ @KǐyPL@j &4r*)]KjmA]]Cu_)(3=s"m7g$V┙p6 $/!~O s[3?~Zm2Hfy7bݥYM意uȣLY%NJ.e)91uP@ӌo{Ai! a"DˬaI՛2 ꨻va)'q97^ENDFYI7c9Z.45s0" meK%A) 6Ej=kدGS-e}*X̑m t]g^jaC4@sP3K,\L4(`{[RؠįyVJuyv) H$$_"pJ`HS\1JVsKVϒt[ ƥ'_m)+6@64T}ϲ(X-ƎI Pf|lXR kI;9\h|}]j}3&nÌx\ˡg!Pش,b+bS ~;373-~_{C`{f6A +pil< 6d W"aJ)r,BP90=w}5OG;"vw'^0AAQvi)>JpN ݝ4D`ʓ3!+!2r. C~ v/:g~na⥏4KFY~U X|Z݅ܥϯ'?;ca^G?< tEFc{Keu7-["Q XJ.Z$g[Cs# ᛷ*x-"h3] `)e,@?h! -Ž)'x|D }dυQc  w (BBeG@[gAmK6iO]*9莙66ud25ڿ%^@c,T>)\ρɳW oX!_&cd*FыS:7 kev;>p4_wA*>zZS T#)8/VXf^@ޫ^SXNX;!G ;ixܽ:i%2f}ŭf@WĘdv沂oj6]a'EL[ R-*S!iab-U0j {a!͐;kYf60 䝥!Abi;EQrmQXXR`P[Zy攦SO?wy3CZ=p(d=~'Ui+rSڦkz*. |QS\#d{:4oC'*Es=C\XAn$S&zaDٸx4eƝWRh^ p8b^P ~Q:jt0ؽR8v炳Ro(hZJ+FITL ix-\qpLS䶀_q.f߿gɵKMҎ[JtẌ́P]`-,# R]t3l*ݓ^W)˗Э*ԩ:*gu==I\(ON{^-wِz#oW.+]nOoo;;䵗/Vn}A2gqbatc0Q8y-}kȣD^D[6KɒK>bt$箑irtFS͑0Х>r8?*J޾GRj58;P I1#9>÷ t;W n׼p,zX׿6.t`$/fӋy;) g̊,ZOX$ᇥ&DMJ c[|5e8 4-ʳі-n' AHr53ƤŻcbj t48ϺX1e `l#8@;]ڑ"ݝªeS`~Lm4$E.hNo1u4#q4 ޱY8ByFN3唥]Nm|IS 0{%4Ms5^USOsWP$z Oe9ia np^%sܐ|ܘ)[Ia>6EQS2nKտGDnֽ=_4C%wb5WtK3BD /~& yHQ8_`>bgdEx\Z3DI4d|S=ָ'!jxqԯe% -u"8-hrvԨꌋ2*1ژ(^HՕp5JȵpF 3b9Tx(_I=VNQG~*hJz Կ90Ye2 *uIG_IK"SXLՇP Cs*rU*i$1P3wc*6rz]SK [ڭv <7|y;1+n< vueCOƐ6}pJU(THo":\Ig*_R[Y呪L͋Sd>iϐqkCu}Tl@ >F$ij6D4 Ձq$ :ez{ 6Q Z߱K^Y XĭHӨԥnNo:ІoLckL~+oS I k!qCg.Lڬ*r7C?W:s Нf66bÁDΜK/l8M9t)z`c_@$9p)7"X1%Q c-l| -)P$5pRnW YT<>o2D79ekɖJ?Q>jW\;RgVg?k)}?5+Irvq,q{@׀T_~J  [?>DP25aDd@ªAC/0Hv|a(div@ .o3r c*l{W|rvRW :R|O[_ [Bj)x2 >WΊPf' O 9`Ly/,r',(t=\Y$RbZ~&HCr{ڰoB[Dc ۾bE޴1|kCbGjeJr;itO yFr/35Â]ʁ 7k':0I[+_n*$(X&cstəMO<N$B|-O}.'& $\t[b+SD^Gz> NymLB]n"F'z2u٪^^`XPHwۚ3KMSRե'.a)yZ_B!ɗ!&,yHܿ| KKkU軯AKa1'oLR˭\G5B\4zeDwP` a.дakrzi)u?(*}5PCSZ ӹŷM/ 陨_”/sB{B8˸FKj^ދ^ ^kG ]m&!Ok͌i+_^J̞ q怕e&'EHVZs uR A^)ߟ-'W@&*E3md$DZ瓷&gPe=^nҥڦv2?aCAAj5)}Z{8xO/JO.'Q9=qș8!V1# 5 ;MbQ>2Yy4[mփdo <*FlL/Z~Qr1qE 9wt^`HԘqvGG/j?/ܨ :N*)UI<]%VUvv+IkvݑS2:lP:#随fMK=52<ߴYک² r?k^gF7a~Ɋ3;] ]ֹXg _ w-UNVmx_K'뒩joWMD5T?&U] `LM@\yP%۳BJ52~T7aze#Ο}}ZIJ($$(8E3*/= &*zJqkH67/WoQɐB3B'i],WJw@qL6XLȩSRLn1] ey& q_1Mr3L*'ޠ?kݟ)%ryrk8ű=vHƤ993jIOY4R75D<02s^8FC} &'DP hFOG(t=vlXWM!3nx`ǯ+n ѩJo)5oky͕P`!#⠪{t˽Jw({/i\.70/M8Z)H&S~@ӴurjDdC$uP.yv?*m-5$Vv &Pkza ;w*'pAzȂ~7 ""oi~IQYiOٛOgʼnz0nyaAo:9$=^h޼t_a4A·k}G-}<툳ݔl7uhY359i-n*3mq+Nu4@jQuٍ I Yb_6$b`?w^|E=,xvy6.GyYmGa1)kf^X-(zv!@YToc`*:S?EEҼcC[jGG>; CoE_ɠIgLÇs[7H{hBrKp1T7. E櫐'h~Y՟ʧ) ZB#?0:Ia˶%:\7Z0#ʬԄVIV!fN 4r088; n-tI9{dGQgQ䉣ѯ >'ݫ!v!=d-P_k>6sWŗi  3(C-q0@9TRQ/I" &  E`8}w%j-!hBs)ðH:_ЛURV< 3ۛc.34X:KGhI0}}滕>.:C=4I ^ 5&8G4\BB1G/h#ﮌHN?jŶ%TJaWjDdNTi%5P߃۱ c PSG)2rcTw=Fjq;dr9K'P0`DBj*!0GwZA0FހqP}Zixh٪q.urfSZ "ca2{Sio5Z^y\yZ0Vd@.A.Y`,40rz)o\{BwEZy=8QCqID)=_k-9%[ds=ߨr"Cmnsclo|BK;?4gĉX /FmICEnJi %ëz]+3FEA6 AA h2obMxj!„B&}4BK_d4c+<ՅxY*U Do8[sgJ2oFgʜCMyAx=djV#hlT!0ypf6vY@lP ekɾ#]vT&O3oR ,j%BW&auU\dǕyUXVx 5hW3bx'Y !\m6| 0|#72P5 dpFJ3mr(4l,УRQӱt6} %з0q-52q" s峗ޮxEG8_l68ydPJ]`;P_a-.uOʖDڰ/s~2隣 .3)=e7ƭO&l0ۑD uѥjڨep+Tq_ ÿ#:c0u@:Rf;'gc:2#-;`@'3aH `}t+h hZ&h{ῪV7C@].YN/-Z '9;6h漶||ϑ] Ͽè3Om*ǚpӯ[/%_|ItMw`.;!oTA`hȧ3?3_*tMntZk܃eKyP;j%$EWz.n5_XW#y1]yq{b.HN IP=uwݣj|a Xbus+(̍nWKĦFэLDgܽN!f+(s:Q^Enʲ#WMe ahH>neeVb\ %.zďtz`DX˛)+b;'G#;z|s5AΡ6H8B$S]{<."r8 y9Eꀽn0'Kwά1DRwzcXuR%r6LBzQUv>Q׺ hKzRbOw/jģ-{*=Yq+8\/MnKڒVAmu%# ><lE Qe?y^>,}8ic$3k_bBEY2iu^4^qZȩ/ U8QVJ[CҔqы̄㬷W4HVbbU)G=M;!R304i+ODx2G h2}O~ d'dzr‘Zf {=X([uJ} v ]#~]3k2oɍP(y0bV:R>Hc#^mvK-זaK$!mnԥ!S99)4N2=(vK/ߤn(Ǭf8 3aߦ̀'-}b89;1jEKz'6)ψ~M$bnzeS6k͸aky|[P np5.Igݎ;1jVHAҲn-xpz8V y z$oԚ?h$t-Ŧ" u< M"uT')w4:ѕ6)8yb]Uf-Qsyjb4䀀jdfW iomk#D|RO@DL6Seɉڜۜg8S xaaՓ^#}.mbiQHXE/(" N.41L>eSg!lU6݋s7:4nng-w^qmqAK_Ҁ(Ÿ=?ػ6&pTf籿-G BM1oa_RL >.~!@=Tgz(60,[Ֆi73%sNs1\ȣ 5e^/5!,-Z|WAu2 +sBρCy/,Hүc/‡'3YUccıD84Mb/X؈ׂ7j Rnx| ǪrLLʈNlAv *IS4nyf ! EJf.ɣtj Q,I=>C3/)F;6.o~U!HV_z@x >86Pb<$YP>@9[v_AQv|1Gtشa|hnT['26'҉yĸ6f1_a-z ?L32:m)lj ?W>iٸ0!ZYݦlEsP#tϺ#*%7y1v3$ vP804Se\<3lBs7쌁[ݖIGRxzȨt<֠hg?䪭Nr]HPX\Z-RmCgL΂+B?e+_NOzLrNgM>g-g~UE6'f(;q1q4R߶o I Ͷ(3ph+2PaSHYks.|#xnǖ XR ]ʘ]A'ٶ @7v ӏʖKUA4aAflyŪQ/E)(yݽD`kYyeh0qܖ%/liIsb ᐗPԀ!5C\ W Y ]"OoGn35/}uCjrX*6-Qu6(F ɼ6jp@1OTأ̓]/,҅ r'1a*芌5$SwGeupTa{aՃgbgZ/v3D<'vjy7-aj\nQ^{/yefsȅ\d0f띷^gefb EVD`Yu}1)zo-}{ޤ`f90 !YT,ʹ4q۵=/̠FkNܹ$ϗ7Lu()Nm1E|bZf%:U iM:I$8㴿=7\+ *_~0)b"[&zߍd;5pѸnq9ixte{ 7B(nOH=H{BOT톧g~i8cGW70iaDq7#"=H/t&˩+C^g]LyJdNgXn1bo7'ea6emmzZgn~v+Sz#bOJZF^%qtuR˶twI:!DGœb-DٛO[vm#!uˊ?HA{ݏ^B2;o+\jRT _D'{l!80DypbkRs mCP)5 FamG)bVri[s`'4uufe͋:(~`q2ϟYFVbދ=r_㊽7YQB -+żPu~E>0k옖S>ktA2m $p@W~tM59 F1:tуL _8X.4G@[ O0h`-1NWž叩wxk/' =̵eisBLb5h.>6Z6)˵HmRfԛ>lZgJ&::&׹Fj/Qz D_A^\+Qwt`>5ܳuM=VC; kS7D|+R1 |tp[]HnfigCNȱNG <cY)1JNҍ膮&Z? t(WYeW 0W=Of9 .*6 v RYLrPQޗv dC8IhR̨J>4\û'.ShH4WGʸ l\J]sVx{)ǀ^1nH^^Nϝ|$GxުYGovP/d;pIMos =r$y-, 93S)gqt=Zl2䡨ˉ=tѓj'Debg܆(G3_[jzMsE `1T<έ0R%&TQ]ѩgTmE.z+R̎sv<ᆙj ChTdЈuZO9e}QhEȶWzZ Z@,"*n׋ .d.fqLGyJ\$!B H>[WV5 Ha%ex 5+g;@=0O>0:; L9\0?oFul ^Nw.iK:|uθ@Y̸^s0Dt!՞!*z(xv1p',w(]jyYzB;%_؇U_df󋞆(\4ixC (2OB%{A{}K0NQƩ9cS(=a%6tB+b2ZP悵x.xAlgTTU)"bVjV1*R2j+q0Z!WOwu\^Dhs v*mXG _/vxU3腽ؘ>1 F@j+'cexj'@ z?cTJm{ ̃s`q\Q܋e2WIMN-ܳeJ($}iR /6)?LAc( =$ aymO^ZSOv\/;ȃX x#4\JWBMM! ՙuhdY;۵B9\ioߓ3jD]!XOꀿlzUk ;.b0ϧ  l$r%$:bKYGQ ;uȅ9#S ӻPvXZhAFo2M/l?C9g+ ZUX&.=r2r)Ж;0W܁*B(u˸~.~*g`8ɇ3D4W@/=Ӕ(-@!1*`vBVN^HcSyHeCt  zA~uFbFTĬ͒#+hjh3=ظid#R+#-sJVjAcvLU@Ѭ+KmEC@g\VMޙ׳ăt0!z"k%!ڊ:jo矟,Q‹'tVBbȉpNm`zJlhNݢ0.H zngsJʂ ]3&OawϠ?I2^=޾ewZ <R"İgUПC%B"аct{H2}#. xu lF@%`Kqb~ݩ_A:SBS_Q.HV#A^N}Mw xEd]ODNT4n<7?i̎1 LAn ?=yT.Pj#HoQsIrKPwL!*qOd6*[T-'8)U@l?ˠ dP `›L2O{},,SwnVC3JFx򕀎a$f`e4 JR*| ~@N9R".l+t%sr 2:2L1D9wKΉ,c:%ip̅ ퟥ%M&5 $>qx*>(`,,f.4KǠq\ _39T n9!+ Io^{&@-SApyBQQz~BƱe&6@6r*{nzC=S@Ǚי'!v(#r߭OyaSh s7|*]p^?[#faFh?"\=.8gf4_ D$QUd*?kA4gЕmTmEFZ* S@[P&WT!Clz(=F'! i$)f$thJ|g&0piW%3xnZAve{UU,0:9_=.٦3C3n3&Ȉw $(UHJу%Ym _}JD!:ļаmZm6߲T(k Y[K RDmh<)f"5oxkp \ =,֜aB#wbFzLIGM=p}e)^?^l-ʞo8~St%l& ZWH- Tĝa;FbYtS;xmJ)k0wOQ 15qRB"RJ@vRʶι!li9]*a-XU,z_P㼲DbHSD}T2M%–C= )BS\J8?^ؿz0EJUA> G*YAkbs);׾_] 8@'ꅌl37}k|@$.E.?IՌL,1LV8#Q_$ӕN~3I"WHՒ3RJds<Pf-j(7$%H[;){**!$N|N.|dĈMV.otE]El \ RWsȠ,߾d"`B*!t=q4,Z${㽼k=4%i I*K82泰僘k"}uf|U [O Ӄ[: I7 77zRs PW6 26Dop$T򮯯92;\ 9+VsIˌ60#x8*!W}jx+ˇmrR]5E@6d`I>xQ8^f8p Sbd#Y\"fȥS꭭:$m'Qy|ΐf)`]%z&ZCAgڱ|T@IBSbFŬX'&FDڝi!49b` :S &)F&!ԃsNI *ˏ>?+b~F/5"MKL.YpDVb0_+S {ɐ,9]h=n#Bp#\ݶMD( lz)!ҬkߞST 1m.X}U 4O'=ؐ~\Iyff:":VEϱyf;Tټ'ҘcY* o#!]4ޅ:Ѿ/y($Yo/kkσ-M3b+wS#(i llCh{Eдt0q'uC4GۈGM-B?M(ϮkuXdt lu'o`)H6!sl"ǐ#sw¨wg3θ*;ZxͻgDG*O&2B@@,d|+F)J.YwǣecHR Q[=\fK8MB\-M Ũ+3]0J(N Ƕ$o4pti׭q ag?qH)w&V@n!?SxŦkJ~!NoY%W/W*3?&IVyQ#;XG6$e c kѻ2Z~*̩ha Ĭ{FoX;aC*sxikAS4%ӄD߹;V7eKRĹ5&c,I +ܩNz<::աdi+Β]оd.ʽOzTgre@0zA6Adx#BRI\X 9qw-osoۑQ-.>̜VMUQf^}X84 g {ZX~6 r#b>n Ic^qgKaI/@\z+vsi/]I]S?)!|t|lPCFQGoM cpe7uv'D1zzKVG{juhrm0z\Da، wtI6`Ab[]`)sr9 =,c˖]k1D"$SXhPhgkdZ& zS!>.?;MOp J<Į:[M@P 1KhU;KZkgÈu[V0& iw/y˔ 0L ~ ,rbubk1wjUR"'`H4yE.A /@!X1iܵ^/1 zhmGJB룂4 oG_P2FPhVl3DI={JQ)֎FWXy('{|:'Nӵ!F0Bˆz-I+d3:jr,Tk`Rb^}h@r(KW孈4A0͉`ᣈf $j/+йNSNxOߖT2XUJWb"?3+oz4YW{NqjZ ,z/Cazf̀Xlͳp^r3 >c75ة ލAava+/(4|VxsicV\Mڪ7 7y G~ ܒȫ` Z]R N zY~ &ngJN@$CS"ԲrP5icS$ ^)ɐ4W;㌓Gl z6bP>NO0*yIl[*GThRp(6A.ֵ  p5KN\X켘76u.RfDҝXz.7T`\jzt啠9'񴂧@v+hKOh:]rXcr nqbXM%hk+Cz-ª^/^ո@l|NȂOʷOnSdPOT&n)$nҤm({^'õ6hyM;L gp1gX3#ܻ<nճENsmЖEm@9V#A1c?e+ _'i1?f*J,v|ET?Œ%騖^=0 X ԪK U5zwn# V&r~jڜfpr-XUeW3\j3ug4Pɖ9zȦwϦ&fGU.Ж'n#Qd<1% }4ֹ?(=H3Ue9$ drt62'ƕfƌ5V,6z JM>xKqd:kird#+%JN}ΌH'x4с u"ADDa ʄtm5,*?6> $BU\1|p/`Q͟N$ 2Z23S[@R? !IJNc-~iE ė[ ޖHXVHs(.ϓQ1kOȠw2O Z31[v4O$H%0sjkƋ;n~Ú[YH-qY ;rk_QseB_AН l87O5Fgj&`^=݋+%aeJeFl‚]6kc ,QM˒r޽g&2(1L{AOŔ/Ѵ:iⰬGFzsè!qPl9vrȒB\SrWRF98^{1a\$H.5V80$8½]H1WZaɥ5gŮdUbkGtÉޭit݅B#s·ِTOủ^d~p8Iw$I{x~"2lQtDenste5yJP?2']z]vTxym"??8Öo Γ̧h %`h*%Nb7// #ZMIBrNtz0D@tE(6IʘAQ1@@8|.s\0LaC6#sQ[PwIBn)ĖDfIrI&#n xM}8;UR[qSuٸă'wO 0Nd>Jݐ3yϖυtO;p+Vb}A*dwq[~ ̧C/cݬ$%Oia HG? H&i ;~`Tսx'Y|ٹ]u:ÑV~n^Sq6H!!uVR\rګե[IWexuGIOj^WmZk dH #@r<;;S9<8[16'T9x2B% ttt v,kRɅpv]%$)yt(\i,[7p9%o8Ժ[]{/g8o1*j!ՏbjִJ֘8B Oc' [DrFH9IMSJ5/^V< `(~/^ njvs>I4eHNqC͏ռ9y." Df4"VY`vB4@̔q?'_G( By)l:_3$u}usV'g,:7ڡlN<`3fƑj>j3(Jڗ47(Ud@ Op'"W#حj(s&GG4tkwHu 2̗zO C!͕hvÌClA氞}F!Fnc\~اf-S>^ĺ彷gdCPqGhyU .?%-V53-"E~ލu]ap\~Ee&ْk~'FX}8lؙ#{5aRH6ͣ8zxSg\8,oȏVr[I!ur\|T?Ju'@]1uiQq I 1^hEQWS dў]aK6(n8z0<՛8Gx答5qOCߊ}dd|ѲHҖ1)B~CBkC Lv1a hLApݡ8\\CTn\A gv?|U d}S]x+UڤdsSh #z@ut<ԇ#:F+_y'"|S6NRpJ ) K"տQ4 &&EҚbBʯW9պ!*xbH~?)l1vK$gP"|A30M GFX0Cd;x[*f/rk#i/o_H:7"tòYtW>ѭЗǍ~sEIۇ;.Bij_pʣW6ǟ%N]7nQ2 rf.>DH:+su䃮O?zzfJt3Z=^eZNlRwطŒ0foÅ6M $J 7*"v Djƀ|˓TQɤΝFNɕD \(pn"q1*HqpF6*OaV0D0,a{kX\kuʿМ}C걘VoјL=u\NIv o.=YI+Tee%(O ,%,pobW}W0'^s-,ՠ0-E8dF5Hfj '"Xr4 ؃mdWGT^Aߏ';k0fZpq?DMW0i}mϑ%M6ߵ W7 ІNs$.N-ah#c]zev%{gd>T`D:]x,Qm5UQn?6ђO%c9;@3y3E}* Ep͉OTaT8m*wU1BXCBOq FW׌|0ь65WfLHfjdjb~I "QF6g(U [(j6%0=wN?$GuRzj}q%ƌ[)חO2drz^bTsuڕwOSq!Rn*J9Шv> {:'OBS36>+o?iEo:^wRuP-qִMIZHq_i;4 km.w AλDU5i$7X>15M" W~4[ ?%ț 3x|f>۲dm:iD=y݆Oޡ)d29">hU3 gS#7 PnX1P2.<|ŷk8ڎ!WZؼ ;K #?hC^f ]1 WIJ5qd" m.=7#C}S-Ҡ`kAs>#'''.18F٧wM\'( +dmeA$5!;5׬ 5@ѫn^W+tΐMPAA)Y#e)) v=-ȏXKOâ58a kBZh"5Y66ST5*ʦޝNS+<65sm$Dz\~"oԹllckDiT@%טN: YŷI-Z6bSCwHEN}M4uLdJ!ԨbD[XHkHA{N.ٕ=TE^}g)a#uUgySaQxnnyK=ȰRiF-=98)D*ÌYP^׽khH{/Ѭxdo;K)$s஢pp ˻ˈXc?f3Dd~IsObe.s SyBK.wVjbNYq]S)3|v_A'/=g]>Q#]'9'S{dͥRj2r>i[Ƥ& >/cT6zr /"̮p9)\FvU4 UejwlIT́)KZQJn]qW<RƖƁ67Q,O}Ipؐ1++ko"Y)Fh"ڋiG*PlkḪNYb Yxl (bC ۷CԮT7(!E؊A1*|ח>4ݴEo-x@$i`5ٟb`嵖ۇG%8?w/ f3N~D%܋ N1;Z>M*L*7dVhɇ8O>]#;dSi,ӫ0yD'0wj?@a.Z󁑙S?E*NZ4k@cHԕ brC 0 Jr\FXf<:2## zA56dno@9 h&:8j`qEpkbɠqt7J+;sP½?TWi8oiNG9mpF!7iKMTv2d:(9E~r"TuݼcpsÂ;%I b~{&r/Q{6?M<;L ~\`>˛&B"CИLMWfp1e &F6M.(L1`[pB'/q:fFR|N*D҉?iA#A-Ŝ$^@)UP[c#ywq+(Y D:RΌP}t5"2ދ}y+&"Ԃrb앻}P85 帘M^S܅ݮ9hfb~WV1+ m-J9 e`1q>9ks3_5{>`aM4m x qBƀN{+W孍wb9EQ/oږj;B(p;ɉUX9_V"nv*e,Ͷׅ#5>Wt2!C?E_A0.w1+% ٘B1L5fKl詯`;Ҏ& koOukm)\8L⽰"`f҄AeA(2\6 J*A1C>.!y-z!SYL'QG`3O4O\-Vu@ϕ),𨿊9*pӳnԆBy(s^_H h x[8KAЭ/pλ(2Iu;K4zX:kbe z Jr' ¨iZݳrmUDˋ(DOE< =Wq7A8i,Jka![l[s+KU\RU` o|C=$vGDy*-ju P+7Z21EqpvM Um2,WĆcoBҠ|R'J@:=,%moRؑ|:O4VOMiqdq, ľ |cˠ266۩ {.#fc!覼cxXᄠp/v,^ҚPO 1 tyBw Wȉ>[d+=rA0ϒ~`>$ߐB0%!⥗^$^K\eB*f9.ђ*.!뭶GY,Kӎiņz'Qfo~T;{XdQ0x=Y,cE;1OzũǕn? 9~eB>y7׈I]{?Kj~˦!׿cX/y|}vt&n.͊9ň%}S;)~4CX@bYJ ~U"pqM?$}S(9=6 'gciE󨎍;Ex\ OK" ,kc\>8E ߣm>[6s;|ȩo߬yg/?sȹI fx ^=$ճr,W!>tl\ O,⨉*~m+hN:ĐmD7" 8FYT8'r$y=ĎHpF iIŠZ4z] :3q'x$jBC=y?g ?%ΜrYxL*ۡ yFt'-\X1hGaHyXcZAZ7 ^8\ h޳wi̖G-g)B/Y s n*ˍZGz;Gr_lgd~&BLh4gEpNn,' NsۺI8$WIZʹvJ/9E>eIE:&ã^n!h%pTA ZmW#Aj^kK._7*jxz-)8n2HS ?.`X:gn0szS =y|WKĮ:*̈́&Wvlqz!nAۨ4=]= P "2SZb=B# w7B"0s`tyA~K/qxR+I-;/F&.eB{uԳj*| lrṿ׽C>U|L^_|aHBYͻaIb{!:Mp+Ԍ55@Yw?6 B'N~oߵmBD`_"f{%|@lPA5L%nJb@0LE`|~ЋKqZ'FJ "t ;b.}f_̒;|`/T@sD( I_n`FM|F*nvo5w7\ E-@WE|LN8և j{Nމ+Ih%va;('I2^hiSެ ^,[t8Iѧz}U73iaSʛeB ;[[6zxoLOUDA6j!rHgxRpwu"pepT(e2(nT{ifJi`qG`5j\g 6K1y~}}^Ϛph*oLGv&E)St5+wp<4N\YW.'OXdDW]-K{ՕT$Ͽyc]jO6K?pQ$M-);fw# -Y]$Ѩ[ ~u{81!:ӡ&}Yv.5Dmb6bՆpȍ7H%[pYR pXRxܛiX:@a,H@uA9X10'Hcv[M3x+z[ *c;2i}6?J^j a2xwpܡ|@|"/~(4>%()Njd;]@?meUpėO+,d[A4=!}ѫO9-1/D`OW3GX:3HLkrIg|`S~vcRS3H<$e {GoC3 4q+&c5Ȧ,H)` &BT3D W?ϯ) 0rN=OeHS3t3}O+q zb`@ b(&C@a&ѺM3WXG|M@*W8@mSZ(rW a'#ymJ N";=ʝW98 Ro^t9Ss\orQ-2@e";}&a~"&=0mbw, ̳ 6VqlDbAY*<~P6BìIlL2WČ2ț)&!9sZ\Ĕ3Ƞ2߾gzM2/=I\Va/g53l5+"g,P[ gbFJk D%"vM8b;lQ2}cluC 26dNDB9wͲΨJ7na$Y[$;YeQpj&҃v,Hid{jk݂[#ѻR E=ʠrvf1fˀԱ5WuRl5Keou >0⣀07HJ8LT)%g.#8×Pn+?Xg<[r/6hُd'xn9:E{UU3n? ;n…eَQX09͒n&8vAny5ɦhxAaZF̓D5;1ʼ7;6˞I׋<*%a.uc߽&ZpWB_)St|B;-.ZYQn#H*kެN>X=wM<# ӯA[x%1,O,ôͥy5E2ҷwT2%{@NNiEۡf3 OGlXK?Z}U'Ħ/<\,,~06(:zgy4վ]@|ګQ巒+hVn _6)\Z5Zf6]h83 V<e(ˁihf<9  gh; 06?Ek~..saC>NKp>^7+|N^H4EY̭ &kgg.3 -Ny-"M߅ɗbTTIo*|Px4dNI P4C=t-*qJYK4i^D. #8cΩJҭ+ {r!𴣹{2{티+9OK}) ^LHnpmmm?c)8'E9'TLLfaU XSBEp{=*g;'sdOmǭLaYS8 {֟ZƶKo|1aC+ϾS{zGtUÍDb1$9Sc5A4s!iXD&j;Ȱ (_\ӛ;g1緭O^czfd~^`JLҶä<ʑ<eLV8U||f)T5I |P(5F }'xҕZ [54#l7Y<÷r3=D:?ġ{x" 9Q>C?וzR vbf5"ُqSFt0e_h9i Y;_Ywzlȑ͋O1S9obKd/w$1m >[C`l KH(y,`or@A m?SM`z\)ot>i1^0uUNXٕ0նtxec/a3(7k4~|a qheR*d`39S*wc>$8뚸74OONQ1+pHNH`i!Ǯ޼Oжgs-&ٟHדp,F+Qx'xs,P1,Q6zRr X0NfS# gZK8V/5HB 4!(,9<'<̟|-쐣 66`fmRnXҊ1H(3HD53> ?@1?%3فx7@Yy#D0Z*z*5-OjB͜辆IfȤyrY]@WL:,fI ݕ6%vt;h=Ga=Ѓ ĨY)/0. ʈ@8Zُmyi6fQ8mˆ.cNU{7uϵpRQ޿OӎNDB*B06lDկ4Xt{t9lx ղcljFCgC;Ξ ˞MׂǢH%$MrN!rXYNޫ3i92KZv𼃿W~hB!-~g)*T7ք.gpSbKb#hls밨)9Y-x6=s߫/<"=*$^tHD3vPlhˍcXA\9c2;@5X۠B`azar>ס^M-A/2^tzCWϺ:!e**joL@fI4fF ,@fgSzvE8#?9|pæJ1S%޴MC9 Tl7LrJA:~#GFhDؗӦ*dOFV 'jz=Ój:7 MJ :r|e>.X%=:&niS}M]i2sNzD; 3.rDfyNi#.ˠC^)F_!2շ@GIJ*ٛvkm+ qg((.C]Tf_ϲ7ɷi$7T{aXT3F7>0nƜiaP)vt\ VT25Ic&NlJp ا[;Ɗ:T<7S?l> nRA1ƍSJ9ϫҥ(l  П/TF%ͩ !1h!.YocQ?9= Xd=Mlڍ<&_΀G2%PkȜtwPe~ V:mHdG^*w,EzC)!3=VgPa%;g@a9XpQk"B$4@]}_G=nNs?t8gJȤ3(:4ԝ6D5x:\|sP%Ȫ*=R2,"qؗIH-"xvjKĝ0Nڰ7;yBҜU-0(Z*tw1(/gGH7.Az]zqmςdDMQBb9dXt^^ПskbHȖ9Z|dL>]?ERin*XFU{瓜ɒiaLWU!ᇊ/,_/:]0GP;jfW+,l jYpcp&|j:MC՞6OKB&elX m\X@EoBc4SVp*uU6\9$@fo8 C# ,Yx1DpuuU8|PvfIbh@hp_gF^f d9zWxo R~{ͷR2Texxvomw)+ɽҴވ9ЂѮE4gs8fy@vL.AaD{,S,5L&*Gh2 Yᖫ /$ )]|YEZӽ2m9 d$T*k/9 dt[q nKita _?V`ᭉzNn.vpbߴX+͖XFUUa┏ZsQtL/p7$tߖ+2\g8P]֊a`L(9V)/#5cC9ÉK+rۗy*GA2$`^l:~ˍ:LhQ&鑞~%"`T)(v$4Eɯե~DÕ)'oU䫈'Eb7k*nh:geOIeOSﶵ(呱L T}F-Ŕr Cþ\Hϑ֔)xRO ^'&ND|4ӿ@`hl=q-H-!Pp"}&oն~tW?d 3aEбM9͸kljq):A<+-N} 9u?ቸg y d%2(H>LW$YM4eH-u[TQ)T7V~;mʼnE͟YtӄjM;3@vg. Y(<:o,㈙ A bR!r|tj\+ퟮ Ag)P` (mszm+RʼnӠd\Pz.r?v^I8;)'ݾ#0I>c5 3l0N*7 H$( `=7 r{r mSk5 3kdDf `ʄ&˅ d=V UWxwyޅ`Àk@P,$ٱ匉 F4Wa&}N.l+Ho蟯bM%1ȇytXnaaDh^ pЍkXn L'[Hփ1u@9mH`JGACxnYu"LRZ ˾1/ ,ܖVq`dM =WWiŻ؀Oup|\39WtE tެ)Jy_R=){l4/T7x%VǭOav^ze''_/~+)c@@e4O33|_qŒ4|O˻ޭ)|TtC~I\k`;zmic_R2%O}Ii ,ZAԅ\lflm#j \:PȬ9AE~ +rq k)+(2oB4aX"K ؂Ǝ5〰*(d؆A[ cB۞s)jV~)1amޏ@Y VM#hGTx׃rSKM&R8x`U/H=D(01xbRYw#ᯟ~i^YtRa[W 3v(),ŏ̜M*~$do UĢ]T3־8ch b|qoH[^'pDxx>>yՠ>aAPf牨\7/>hyĘhY!.q-<aF;6J_=-GM%}5$q4.#6:-R2sReaQ;-V$oRo[.D!g^jmn"ɚ\f(b4q4{8ZR\w)Qazd P)fx)nUd써 p}_3ͮyX4rn@ӰX%dZ oHHz]onBgVTi}[HjsȽVd}!؀aGY1Yd+la` w*xxȰsJ%p嗊\EMaZ3 u`Ci3~Υ86  'Ba ZBUf2T)l˒)lx¸ 5h;%kޙQ7mn{zRփ 0L^Ww@j?7iHmwyCUjQ? Br( Bzs+%|c ߴZbCNleaՇW>}0A&wOHdɔ m >Qƴ9LAYdB N`)fc^JURp̾/1! }a;#rW;c- _H @n߆ZWKN"(,esHݖ.uK~Eahql]wN$nU-҅ kY,PB {'o)Z/zA~D.'#F+"l0G8?;¦rl ce\͖6T%.A EQv X&#Y/Sӭ"fJy 2rX \ho$*A˸.Ѱ j?FIU_z+<&rKlCo[y4[2gsOi)ЃȒ/44 C щ4^J*2Ze<@ijDd6kcyγ (`퍇 *(չd#CQ[VMeZLqrx }rMx&BJJ1'`ŀgf0{!VB_CFwhNI8_7hו6qC:aS'kK 5u~.&A6=!bϏ2^OxK>Z6Gk&]\BNLp mc_]ǬW7)7QS_2`jE; z ̱ya8f5&KW+܁h8t&qmpW^d~=˹޶GHd>o,"8QEL ..dTw!AP>u3Ixf5UyYj ^:fBư%/aшYlli^ u$W}AdҶOylΜYj1|Q\CKg×NCOymx9#~G9.}$#D@CZ^Q@ehduEXϠͶXAХS?EK+$:! bTae85aS4v"GF!H"%p.{gL},+N6IEgE EĚ 혺2a䪬tKrbT{!KߘeD"R W28# &ojktdŘI5ZP*˞r=`'Ѷn4뗀j04LH-χe:tK@zS>/y $8"az`.KZ`Gp9y#!yQ~Fm{fgRF2ޡ U<7L9)x &83#v|w1Td`y>V6 \#~틾V]Wb}94f/`,#'!D!~G}ٯ;:q͍kWyY( Eغx[t%ۧ %HAsYHr v j+92FQ7G"eW7iԥDZh= )Mmf@R.s[e^Cơ~7eC s&M^{gʝ]V kڲ:c-#vS˯7h53h4ZiS$w:J&?.VR}Wx@{#Fk:h>KW]y^LNl"g.xYh$ !q,PI{1Fy@ z!o'2]!Fd4üg ,'CYOm/Q,Cm%$4'|D_36<ӸK-Ƥ9jVMV7j<|ɀ%HfP-'|ߤ w;lj5gVCm]5BZ׹H+^`أ%\k_?i!-^ʴo#N]v>nl!V]XJD2pConO1:e$ZOճ Z4+M̼aHw2K-~J(o 2LN+  B˜.|rY']@2hՍ!u4#g#$[!xݑ(IdMw6D { .t\5XOo@Z6c_G1a(K}"&:2ɥ2}i=VR1-}'ͰdQ]P#m5}TѪl~l&`Ο߱F BȔZdϞXs0ϻ onFl5X}Y\saݐb1I=Q#^)!>c0* Az꽹T0/Uz2WM s 5dȶ1Z,܍_^+s9!><ڼS|h8rR[/͵M<<7rHݤӨ>oo:SQz#= *12/j 7'&jOD 7R6]ҔaQFFMN'yP@$vΖ#SG" )Ea0[hf6k|Ϗ,I>I(%n4S e"]]Y&*bd g,=άκo,Wȵ98ɺ%'ț g.k-R-;*;]zԆJ-]=>!zc@D?^]GEx|RDq5Ga)us}ER{_g"-…Dc4d"G?qMn @op 3Z,}s/rg_M s{}p3޸kr~#anݧ{YG wwIT)+_w{{AB@>/aڅ 6 sH2{CoA+cCkk,nR0h-`*]gdܾƺ !Oy7Q$d5`l~ FB$dwLfw$TKXkGc}>:1dnIij-̗c*Hm LB=)}yK!,s=d覟*]#.]L^`}!Iao?JcUҊ1,uJ#rEfpJ $Njx}f}I 1`{3Ʈ%uu>AO9 ğAӦ} ӂ-FޙA3vak z9I隬T式s.~^* H`Ƚ)#y)p'HIT=Z 5綖 R: FPu.tcͽpcf Bq|)oҒ wf=D&Quk g Bx -@RYz2x>yr[{IJ\Y֏!~I;*zqxve\O{.17YWf߄G)kː[qg2R9%BܥǮedgdfN?h}E͇[$ee(Fظ5NC5aԲZ9UAsy q{2R:Ơ(D(<{hFhѵ<x#. E#xǗx>M$ Q q*ݞdڷ4;6Z|X0+0 ~$Jeǜ*#p}0 ] @{D\1ӯ{~XD^dnJ|8c =/fM,ĂGȽAԇ؟Sr(f˸qZ u81W C#voڲ9>l,6jPO~u!K N^YRʘE@bq+!$f ֆBb m/re? C>`iaDL\-~D?(L_Լ*GW3=@{VDXūO? 1dtR!g 6:0<ԿUR?bq/Un﮷v`A3/&*ZD%wc1MD-:Dv!~8("r?ѩa C=uppml5ᔸJ)Ws M=}IIwr.xMMq% ` M?cW M@74G8d8=jzEd~^$禾@.]AdM-\-aDHyaeL&q\v$Vgʂ[)ͻ.n)~'_gl}MuɩygZlZ$y9V= vkZL]])ך=Q݋؜R ynxle*Jw!5dxe~il x P/(H}wA탂 ^hnsR@l j ԨIV%@"Oc`tz[3p2"- wn 1s~=9UbiNӝUe;s˰r*;@#m#=eQnE%/YMdCe I,wjv;O~NO|~,@Y[7? enFs֐ZGWNJ #TAŸ4CFIsmCTk+ס_ڗ)7[tDKV7 ba JDƃvw,#s頒QPE`4.^*C< Bj`p _V0|ђK.=ENrJ[KyнA&f:Lk?_ _ 5_%@cAmpphs:r,9]/(ycbzeSM4D bVYpՔa&kj3c{S7@Qk͵˸MNR2^F }gw@74c$>V~1.9&  Ĭ(+ Qrjz$]>=TL ?fT C+8Z;CclFFI$ҷ{v{vh[n,%fNlQ7 L 6h^&ʶNI*ɇs5YMBc`\G YNVϣ-=K$[?qdfpO6hJF l5t;@}| s$pjN{2Wp/Qͱ |(vgfG=O.7.hU LgSRE81&?hjf&YKst~ĕp\?.gC.2&v(\D-RgufYsM:x9r=TAJ3ZG6!m_#u*Q©(nl9hdpC1z@b์fCEJmԅdx7fϋY3]Lw-l cM~2OX^te`{c(kb`ع!dL=/fGt<cSvnR Z|WʌΤz\x*K;gBU "֥V<; ~i;n.$+QQ%3' F+mVklrbH*8,?W;JKPй&~9;N\ JߏYAXg\4k`ԫy7R*%jtX%լVw${Q \v)z,<~ɸc ]qP{TgA㟬F 7nچebi %?~n(&ܿlU+BoFPΈ^9**T{"P;+R)~ _yVZ:iw)| lZEGs+NpO˥(Z9߿^=l|jsb9L^[!J{X3o=E;y*K];hU_t5 -7rtOxyFI[%ܟ &]/r̆ $.\Tskn}%elrڹH/PQݘzw;oE p4Y+*)s@ kr 8#BE#"[V`huBe]n/*)u#ͷ;08fB4S IoCƞAP0PUr3_;&{rDOtR^]M[gI ,lG %gAAE{/Tt$yP#0|mjct^OէAuBr88%Ns_xU֩S;@@U!q6 ®R F@_֞2> zqU9}t3M8=m $Y a¤5VH-otُT$pHQٙ],e!v9AA0@tODT.7/L28O~a'rqPJY:4J6GXiE* ˋ< &Z=y*Py[ߕEX|O RWox, TZ$=J؝ݰ>|nV8Hqbc PD쭄e` U|)NÐaU`9񳎬~%gTT/pm٤ 7$ЛԅڡUJqeds V-Ȗ3rmݖcZDMj+%WZyX;bX(˃ѣIu+j3X N|af#Ia"Ayw"M ñ 0()ǣAVΉkw7-2 NJca\Fq bZTKa +5sXo~*ò#WՄ~ܥQFv~SM"$n ަAeaGVT#6„7po̠ XF%a\p#ST4O^]yFtEܻOv1s)ݐ=w.D,95R ؝=y$Vp{b_Pa%ejbg/o+"Ks =7GgzW{gknDޜ-`wtTG dzPoo~袹zVnRU;tvS5В穦Vp=ѷx|}tl &iHW3}F'Hns 7FPE{7br|>Ip[[ e8لPi[;kccTmSb.iaf\E Ċ=n8B!ŘC'7FF8a4*>c;[jC@3_?è6/$4z -ƻF8Oz]05YZPfM,*1|[7ժ*Oy 8pO`PZSk]{5Y*FF!\q-Oђd>C+\<@+,d7M4޼o̕搌|͘jN}˯' MKYFjsNҬ+ vrMeǃeIYe(#f8Ak@⹠Ӡ R߮a/:P<^nXPjiZϽF=?ݗ]:% nÉV8낓zJ*/yf7)f~!ڵ_ ԍ\}" waiqz]Mp C?\ÖlaW u$&[Ahp1O[j( FvMXL{S[c\b> Cjozn<a6Y0,w^ϯfW[^Hۥ t; $u_iƁHQδH9|iY߫>BFnn ]Nl@ѿB^.U*ڕd$c7ZRAdipƸ/m$׃%y$Gxt©l W=ۭEZSR>ӋKL9H;-e}Xsw&˖WaB)ۮ89;+h+[Ӱ ,L꿮@l.B/| sD?\(K~hZJcÕ/P}0}XwbXwtXpOC*K[5.^q+H&bڒ̀XaG 4 Egbӱ$aFk-HgXbXt29bvz:R#[bKlH7Ɇ:gD!KC/b$". ,Ϳ@ڄI}~cank\t6`MPdlBu Sj:=9?pd-U6Ii,7/Kň>l]&l2|U9p 0:w BG#7}onuQ!Lrq+qJ۬T&9aTʕI{*u .ZrGeQ#~r,b 7*@PbV ;EOy*\q{/|0͈= IsvB-1;פoc8OKLJX?O`sQRI*egf^Y՘f2  !EJsgkmӻw=}k1 Q.E&%V=_e2:X~)%dE Rt#ޣVQe<95,N]=I@9i1*ҟB[Ѷ_E9a3k \`Ver9h%xFmj%R+Bzj*pEnR#0(rTR]g/5^pXg2V(cx (o]CqؼTPPBզq>Gۼ"`Y$c`AYd.Ȥ41oޛAj5o;Yڎ2X/oYqtm+7AԨ0P1.nfn0!Kg |rE/B/AUm;!=o/-毯*P@օ ̑r3rT A1U1 ^`_5] ;lenT.gT 4ȿ@/fm,̹OtDs3#Zd4I3Ml%Mot$?= m:kB8-\N5&ѦX?On5ǫUd/$lP-Q ~BKIGȔ;X -5 mZPҡΒ3^Mw]g`2䥻VR0"GB);J,hB?UERi쀻\5%.3XH^/b]7lC-zJX]>w=U*6ҊaD?fI趁*PuO R# 3cH}"?ۺ'3Q۶@W9'Q3=9cA$KpHQ~\!19]9 RM&a9Mm"_qil<)3-H^r [^ɔ_%(jJP(;( ?ƨr{r*uV'wѸ˚9aB*kс*t,k-sy4]gI /o{d'@J5<"T~acvW}њFiyӚ6o$U "HM qa)Ӓom8oZmK?ਔ$oz WRW?~*cadA9_9P#O0*~ւDsǷ8bDfz@|)8T9';ݰ蠴KK@s`G |V.j܏K%~^ee,ڟJ΁@?>q(kݕ)eݺ tD}֞p 1ݪ絨]ܒADLM[E L[h !MHH^! s,WHnNV6K*LO7?=R~LD FssC7?\+]aUxU8'o uw%rN"V5Q&ViǠye6 쏊 P؞-L5R2A#UPMA |Js6$oϨ. Fd4+HBkN<u5HG$a ,t_.cTomFTip,_N2wNHH/{Vf7>'hʕE;xXW6i 2I`qgkise#[PSgք*Nn#i{zYC-%=k`}9]s푀}Rt``2$w̓ QM˃aԭ [|ԑhFv ǰNiO64BHFO~Rfd8"m7#gr~&R4uQKaQmS^,ajg sD6̮kJO: Mn53"7;=ƪbQi9֠2h[g!ռ=ױjm>#ё.F DX\{萸B2~}j 'io:sHJ:ց'ystIr8Py{JVIysyqI3m~wki/\ۈˢ:3Yg .+qCA Qtu7Ήgz7_Q gio ]cSG ; =-w՝+{3PO !l\|[$5b?]sg4,DGua][k9\C{Y)Lr">.'_ư;\օHe]AB{h?ZK#hVqh/"X wxj +S|Ua Z4\!Fw ٌN-j:m{oVs*"'Q%yFۖ%h|5P ux.xi֡˵vk<6҈*Q%j:1T^}(~GvSYw4",69\HfOjvm MtlO o-srY?!|k|BTmVUn. _ lR|>TrGM }e;W] D *+QJ<]?s^yQ>r;JnQ#$O:h>5A:GJ%3gUצkx2Q^-UL\3fըYWjdԯ ;ak6ZB8XHh/RZ/?DV`%P(_x?7Y\J)jb 3,T_ۏ1.&#㓚}(^sS#4ű hjrWɭpG$lX`&m܈$Dw{*RyzVKLsvZ)BL QlUF{QyU֐ur. sM4yρn[1\Vjd_ CfH@w(pXLaU2U`ncuohEU\͔}O5(GpE0ᮍ1#MC>iv# UNNIWW өzE/̋7 !D+aPY5lͽ\XJc\mO3>lKx>pWh/pR[?j\l']![I ܛ1 6SՁY > {](J^k[:p{MkI#_SC"ѧj7)[0=sp ETLJU:d+Lzu%$%?jqwhGq܏\x~,RK(wlSo; ;?. 7p%KԴk2Ǵ -Aw2W` 9g"WF*ORu5_/-龯JcC:^5Keogm]͈ MD7d!֔3{>Uףg)z3x:w3oͭĘ~X/T߈$]s<#[SXi3{)ތ^nf`U%41Z ؞p IH{ʓ50h$Ź0Qq9-+(, cUǨC% ^,',O\+8Q7[ދ0m[UB'@v'ߟ-]cD>^Vx7NyWo gN>bTvu"&/Ő[7(̈{KAe4{6a[P X*b&/,j=N  8 htΒ[^ꒄt.CMN nm$ ?Ǚ;4Gi$!2@cDRkƲ93{ٙ:Dߒ0a̭v%Qb IdGҁGNњT&lUawTaWfH&q.:cD NB32#Zk|KBkӷ?+G{uSE-# qC?wO}@@=g,a3lcj DJZ-KҾ /--H{XI;$s`nyO'Q Cܷu^ |qz0ቾC% Hw{puA7Rj'P>X]s\NjP-;ff;kղ,mnag1x8?m?~s!Ot2g>@㏣W Lv U[{Bt3<} Z5w}Ro%ZB;_8Lpq*5 Vp(_Rw! ' st!-\{kv^S:\_*FܼbS9: \y[iy}@:7(9ƞ t~y[75oWҨXS2 #09,Sgs*: !(;{:II)v"#xD!5 / je| [sUSPC"wQO򛩢QXy5Mo<ޜT\++`\<"zGxXL42Hh)̙ȓMxLZ@^t+KT6N\RvϺ+4$Qo}EwlQ@p]#őԁ>%:$תA[eQPlML3xFzp0P'C{C%1Un띘cB'9]yFµ7OP +c%FNŸ@ds 5Nk02\}^!Nu ټf90 oZk鶃쑫qr駗UYz.na116 jZ\U;b{x?w@PcNvl_-V-Ɍ@,iJEC\c3-U)J4tRz3M-[\!13|R:Msw7O1y|PS˻$n wxFa_|׳Sڨѵŏ㇘U0.AYipd]Ph1IeB: \\7]r2!*\Q1p?q,GWP\!3AOƧ 9;tq0Z W.IhSxỲ.M$6_ׇopYEy/k27ax݂D!r}Kn2ԍ|y0^TgM.T}"LꙆ|Woyؕ5DBe\YJm~6#_I[+GT+ƒb,ϒIAFTER3)J2U'0ط#dgG2cGj=؜l$\G+cpKDvڂ.3E y#R][mWd/%-])VH̀ɌQT&l,$ľe?#ޣuMV;J+K{=37.ۮ6n0䃢RLH qϤ$6V@z+O7^H\3ˆ,gzш|2yH~P4.CrVGJ{WCVziJDz:dYR}juWpcݔ=͞yqK%?M<\}hr{6t dFo*5XxU$; hAn]bm-{3I0# Pf\uS.A@\j`*YL`_ĒS)R'yc;$ncP§yKG;%buC׼2 sRL}閄^D!z!T=@-Ua'I~@qzt^9_ޅYm֢\~նr$bHFQIu*>z qMe[Qa2>~)-MU\,!z}mN-I(à(qbB gDO`-U%ACӱ6A0~F4 dcϊ1Ca Wj( G jk[ =p CAكU襫KhS%A6c9ٍJ1yltLaW(G8F\QwC)$(tpr?<u_6I&7/3ڀFAO8Q,So9ֿ蟕&я)L`_J$Iw?+JV&xqAW{|ߓAH!I5pIA2:RZ7k#}!S9.G 3af9twlͅxҠmI ЂJ&P,,`]Wfۿ朇E#l݇kªx,P?{ntZFUE@r#ơdTO >C-|4:n1D)ҵ%IBn_۞fL? "cc͔38'@91ZfQ QS8slزS:¿YI4y9Ì猍trv./1omwH%R(Z.d.HnHF:WD{X'=toB?v |c]=X@[9$:bc0 ^ZDž̔(J`J^o;gWg.zhlϸ}?+'p^HCw*g h+n©)qoky͵޿5Vk]T 5 Ŗs&lKI"8E9]koVBUگ+2`ێ]=3 !=;0퇻Lj605bxDı1q 6 ?JYҪdO/RPYVhkK Objp eFa תPSj*g6P^̲.ojf?idй鈸f% +MY"Y?.s0 V z:%xBmsSNpxi(%ҞaX%$8Hэ G-_o]Mן,j (3Twoxa̯r@ێlɫs`gŜevyixs..]l PQnUS&XuI9Ҹ6*:ȷcpt Qz&N[ :sȹ]=*~jT{6eZVXby*UeQtu4s~9dnap,ehb<KHpYZr2+2O$u=ǸiCѻ[S 2T<>[6Uٍ "^ IY +jA-:,z4̙hun~ҏ{m>Y4 t6pQ:`-XlL,ZGs8H JvzD A9rAs8 CiMաWI ^məO:u3Ɲ6Q(zp1Hނǰ v|1I}}jV`gxbm[|a!Uqf8ѩ :#Pui_~B:T+&^oDIm\9Lw_v3G7%h^!}}CGQbS(x^D ,(EPrjR8+,2,HmdL I7@G3.h(.)k)T_&cL/ { ٨*􋔖h*=V4W˗6@DFSޜ(1ҥ[NC/Ij@@uU?wNt&K({+o^~2o8qhMV l9*(Pm< 0D 9OZ@w(c}6.* voE1CQ\1x'Gc |bPgI rط9Di/IB")ӖȌZIiZ]4`K;tF:r+W^5;f@5RgQOT-H0Sr54#' ǎp,+BAh8QHVvkH/#ڃ6.W`?Rf~+ݱ:e/xUA~q(4[jct,6#/།t[,.Zt0Rk,BX0b S}UBmqL;"i`:? JJZHp .UϩcO`(@SE&),>{Nk'/cV 5N':M8T\ D.c\nz !{ڷ(_K*8a{AVgתd/z|0j+4緓haKaniRQ'1<$A Q(߶Lގ̉r=97\ 2;[tl}  C~釘͘D/p-\E?G;Y!؀" 7ziS ]_~_#!mX5(Iѿ@0Աӭ0A%}sAZ_9JH#uVL`uu(AxWzIurvЃ+j 2q9[ȉ>dԝT]Ąį7.pYzQɱ=J̬GV*g3N_qmo˲[0i+ h-T Β"xK1W!yˢ ]ĭ<׈oBh=^@Cr1M&kTjGY%'uMX~)5S݋"rIfp1X~X'fIi6*ymB5^l` "#sn?f{0LGG"sx(Zp+&QcG2LWEJ"Sع*Juw)I*ѵ$D!), m,a_O DAQJm>9a= NLt;N#<찰?S!o043[nC'"_]C҇tb5F KBΩ"f;;@"HFҝ)іlV&>0sǖ}E%tӃn-t:/9|6$+-ID:L MPJOQN657A54+Ȣ#UvLMG!3?_# W޺~+Y,`ZԦT ؂lx$Ɉ&#r.@ ߶q8(2(&H9@Hg|v(BGxĎQF޽%䮚 #fىn /Rh#9ƕ0n )&f e2BK߭p?Ll%7&ò-tJMHAb4OPU}KdT'!ʺWM3Kx dR*LB1D(dTL$b5% EL'¼,pǶ9H&bW>yiFCzk3R#jv-ܒaObK*ׁASZ6IT&{c\7^]IF C\LLoƮz]d̛\=Kߙf>SrJO8"[!Y2,Z' nɫ)K?oB9,?~H(dZrq\rCxs4)QČoR-^Px3;Ļ}SLF;m"8R VRR 37wSe2oWWA jujȝ ԔxZ,slSg~b߶tT?&~R.2@qmP'(%xE%Hv%OT`Q4ZGw _l f kbV~"ltHG"[o-އG]:Ev飥gGYdiӥ@X<'\HH[@ۗ0ĆZFD&>wnva/ : hhFFɩVYQ 13,/޸' }$*'݁M68'ԮmF+@!eFk"hRڣrbZ=pNw=q^2gl͎e5H=o %.n8F, @Lr5RG _R+$zA)3H`ؼӂĜݹ5]}¿7)Dcɂ_ %{LdeKhm?>sPgڎ!%bqwD*և$'rx%BEQIHВ'# vAEٶ >/#b+̱ '/0C~fYwO𬓞(h&-94Nl!f_4"_2xgi ݺf 󈰖jMʞd~  BWC)_o$=X lĖԳ(QCpK6 mYY>Z=9NJ6}-@YV68Y˯yd(3S(N6֡IHUH(44JTnF&o2UB^\dž Qiȷ{~m8t R`?K'A*i lm2# &g+Wzy΁1 G /MVfNӹ DV}K42wHm]D>6$ wG`g;W%_GVO.Szv%VLhmjxݟ oKׄ&J .upyA7AVn^&]Aʠzx9Q[3,̜,<̇g`ExTa^O'!$Ҽ>[XEQ5֕dM,9#jeht>;:?Z}7uMY.ף Nrݽԏ"ݍ~ŞsNjzD; 3pe oEVԖ3ʋ-p攏Ze[+O&m^=}~@PBDM/mTÑ$ z/AWVOvb: ~!V?8XTT۸9눦 ")-2|_\_-dlT@J@,P|GI3߻PSГ}_/ o ĽysXh͆H:? 1vŶ  όO.7^1%2NN&{zB]E:*4Մ`ATQ]FY+3Xٗbb9KVWz1c1D37_\MhV a& 6 ͹>qL n~'+^~1!YOC-nP| j-QFZ '3=j^G΂!gpq+1/Z <)qLhzѝ%‹zx>@ѫ8c)3PphTip{GfYib'ifvdL6VRn 8$Sε(D ypOL46ꬪ]}ltgRP/+RĆ kK gks$[U nϬ)n<1i-:gXV8vIVVV7- }vV)f=Gl@@+2$rl"M xm؏ ~Mٻb',CGvE%ey.YI EcE/Mbeؘ᧴+1 ]4 eq hsg YOꇽ4_z@t.}n@!Mxv,-̿KK~His/{ \wHRs| Sw{逑?;v440y( Vl*0Oc12i!Yobihc>5B6JDX!bA1]zV|u}'^2d:C|ށ)*^i->C=U"5ĭ/dg% _0Qۨ*[vY” |aAvVCJzD&v @Ro>v KiJ * 3(# pot%AH$<ǜ}Y 4dd&}a*GM#0Z?M*Imf-#]sfb9 轕=܋1$~tkYj\$@yZ?B>u-/+Hf_N!1@q􏲄|?,Rߨm_ؚ94 C梈4sWxi@gHcJG+|R4]+(kkZ!ҵY ^h%Ac_b5ZI*"@[;ɀ}T $-EwsX ɾ96Yք7&}E~ГAqge[` OGdT]Z|2>x[tƜy.Cgܣ55RW%"x,=rJĖ׆Rnv -\~Gиی.'KG_.+ijSsY :8Bd% jDέ;,J0, ~wޮ\U P<5t3@6?v0jcw'B#j,d>pa_1/硎Ӭh7txוr .㘅wJC2$ZeRhL hTt_kB!u^ĽlWDN+Z;|QDZ_n$O}~Vu$9+m p96?1')#t_k~f*t9{}87SH9Tk]&Kzʂ{1ZۍN.bOЯQ } sh0qO5qzt|OqlZD-CvKH://ϦJ _D`_ Wl#2I m,Eƃ0冘d]5OX]ބ^ _m}kS+Lr*m?f&Q,6(),8!fDVi%*u]#L DE03o H#G>F5-7&}.dH_A"GWG1>'^:rLPwuw Z=W~|(h="4DtO8ʛ)ڰD| f}g*G̐y7.tF?&M'mwg_K" 8NžL$dUU^,*LZѾ)1BEzi,:Qņ>< >Sr^DH!w8Apir@ .`zĬF- 1B^E:Zz/Z6A|Nm@|ia4O[]lpH<^eHHϤz8s[{Nzs0оgX [}ή=[ُ3$x?5zE[6*=>Ka,(9;t?loDpq3xAX-J3}sch2*%%f\5Cg bUoϦtV oIE, ƘSהkp㏧G\ZNJH58 K&C?bRWoUg!'3cF! ϻ{{Yϔ2YDDO1\ [ԻpuƨP6[(~CuIeәj׆ϞF} Z~n%MTIn aҘ$:?D{P]XrPq ~lL@bST/T%Mi}B/n@< jt4KvJZKp BK_,y !4;eQ#M a4Rv#mAųEƍy1!FJ+ߊ.DdV1:{P&?!u syPN zR}PtF<`KiL.vs8_՘d ?%}R&"'ȠOfL@a#i/q6^BߒXAnɚtVbNI~9]5<0o.R}fR+yW7!y G6 :$lvي(# srn45?Y7ldܫCyV@ކ{NwnD-ǣ}@nnh%w\4m/'Q<RɎ5Ѵ3[Fl؜618<jgY%4dO f4rzpk3_JTqG-;ZR{|_Cs)暸n|1|AX0uơe `KuJ :]fGJf~yWNJFmQD8~7SWDa=ػ}|**s*[epﴄ.j7qYOr\P xq+#v_Mkya[w <;J~$7;X$]Mp<2.2wѣo?P9ΞB=>5߲Vv+Fl='J&oqG[ &0]!rE-cihB$Ĝm,~N"Fkܮ0ь\jN5> o.>hNmR 4)tI;t=EiS.p%0 dLXfejk%Ҥn IbUb;[{5 "3 *C؇}L0ᩤ4#CC.~ȟbυ4wI~/@` cF>"@^&~4TaJ;lY} )x͏T9Uas d2(4)]"a=G- [68R>z7qVn.2^ q೶QQ>nvϷD@GT7<dV:V#"3\7 ePbSS8 ;;5hyTW 5Us 0He䴂*̄lA8Rh1-13=c9C9_|xШ\퀫O;Z;s=< ;>F?^ab< D Ck~Bl4h˽x`2xFz/떊0+kA'}ZKٱիΎ9:q-xV1v\D̀)(bn>:]B;]Ngp 82!#O*f{"+N$}o6KV2O70&UŭNJ< MNQ^܎/ȕJVKT >xwO7u_ 8i6n¤\~ aޭN<,å*c(Y9K%+Amtc7slYeC4(w8qb "Õq$߰\`khhcNw`dtձ+-30ċTLžfBlj(}}6 AB5d~<ݠ%̖G\٥\>c7Dk;l%N&4^i+ל @O8dgvh鶃>fQ肛`pc<*QA4DDFGޛ7(9IߑP(c2!OG?gLnoGiB'BBqZ"vBCw%w\v5 0SImw\0ɢzŊk!s #P9^|>V_ȟT+&?@-T4;b4 ˁ?噷! -w@+(F\y:jj/ha^tZ9ߘ[lҭдؼ.N.({}Ifh1s0 >Ҍڑs t?0%hð*RL+,/_{UԬu@ؼ`jh {elw JVs`2v{m(3g3թC.w sA1ZԂeIȽ? =:˥ِ9 %#X lF}.gԅ6|hd'1ͳLƷzyYukQ6Jd N2"U 3JARQ͠{Wji'$!j<>0EvnzQC\E?9TĆ r5U858l1:.o{ X] 9/~i (x1ރc `kDВBLgfȋ|wꓗy\5F2lpBbq *E"E ?&7P1|UN(]fP> UJ烧sڰ'I[0@tD˰M9ݯjV'`sm@3@>zZrFt)d`#bwl-Dd|5H+s_zVZ+\N߻bom{+ۭ ((Y䪘gA8`$:VyVPHfQn@}5'>w'8- vMzWne.SoUYky)ҢaL1Gng?#[LvnGW&]7 2)>WdV ͩa׆ݮBPi֐ >޻^]^)<ȋYEtXM>|!xח3tŧNޏI=={ x:zI(O\Frr/uYe O1Ƙ55ň-桭8e+(%B!`{]9o'_6įH@h7[Juɂ9oI$^QnI mO~rPrpm׷z$IJחrȍmh ~AOO,~f[җ9hqC(N!|TMճ;nU00 `/$ockuBĉnl2 ^S\&\ pa=iR1-ӵ- ]>eaʨHSW!xc- 7VJ,ctNHʉ XwR%vKC‰א<.k1V{R0FԎ.1z`|Po{7bOgЇ6j|0{l{^\DdG(:̣±#e"?4T:_B5KgퟵtkUn$qr^h $O@4 b,B[I6."1YѺ!|İSBg7[|3L.r{.J g'HN5 4D-w\AA0t̋|<\MYJb_)TpM>*3숑Uø zaX[&p !M=pK4t7rM-zgm#ӆ7Y2{3hvO&49:(~f:$>ڡc}A[zUlO %0w1Bu||gAg*1))Z9[Zu.?-ӡa&U8>.ZcaH9ܸUwڂ*ā⪣{p=uQꦺ bHq,<&'T / {Ȗq{FC) CnO)"В=u,x!T81=b- -U(ٴŦ yKu$:2j7O O-9*EQGw[1#؛`\] ~6C ޸csWTzt5r Cm9s[,ʘ> h^Q$P⵸sU(=G49x<ݤܙjDwo"*mZ8&sߙO-;1!K~2%ev|;>^X=@l\o7{ RrNrZJa` (//DGT=^{&uupSbZp)Vw%33QF q%Ϧ1XO[fLuz?! Nd뚆+_HU\/~'4KD6O;@5_89*Sq)wy~5+Q\ i!?ͅJw1GOʺ=a%}Jnd՝sNg..F 9?zI c̴}A EґJoDB3SZaX}jJ9KEۇ^{_1p/TAH jSzdR ZR$8'7J)!Y6Ü } -9?GT<7СƸz!bVfyUO?ݝl#fz:͛TjF/8d9UssInN$lkk0n#ͨ\hiw] z+>ThJfyZM7gq8 ${BI)R ZVj&YȬ!"Hr%HW Nubӊs0㴩Ir;16']{+y#坕?};Gdk*nN8x5di&0[z%Jw)Y9U4ۦG  G&0\g [@/lu) P3q:um&@1f7Q?=n򓺟vkQ;GaMx0{5 3Х(k݋~̂!7N-2y8HAW3 [YhY{d grc@AU'5=7fIɎSMҡJ@-ca%Jf$c"ÚȠ@nzKCԻNbF H|j0*o(H/DNckܼWJ. zYtRyH*<8H-G0nIatT+`e,7P5CI%,5j5ބ7S- N:=%!r# bɸ|Pryͩ0ADfjy;K:߂rPDGLF@X!qִ="{͙lnasR%†{J1rd,դ?`㌩wtяB.D> $R#2{7*I 2ۜ-ؚ$"RFm!TËբcvκ^ߨy<)DyF&?^;B(.gE ĢuQϻg+2ϥprWh( k2S< >)d6MV^W=v = 5O&Tn\RGz|$T}W7&z ZL8 Nh\i<>ʕЅ[YHdH'tqf:>e[ nģ3D 4rXncy^,y$p3p5px2dk/mHNX#6ր ƫCHy:s;gs2^㍗co. ʕoR''ofsIGbJLB/Ft:˥rJ]Ʀ$`}L7pr>)p a,$-jDhUH' 56M'Exx#Eg*Ͽ+k5ߨ~ƭvW 9r}>[[8exDwP*Uތ#7Aȵbh$=) 7o-Sv>k 8ME>XzŶ aҪ'o}20,f!OScDbn2t䢇8;W"^R(hNJ?@;Ğ_N \;*uu|p(%E ;>%Vgbٳ1EtEIZpb=xPu}H _/:J ^.4;:u*d:%^`8Xgyf:yNvZ;9{'ǖF96 Nѹ9IUסcs{gmFcQ{%LD@O &AIK:!M">{ڤcvÚmr{Ѕ6x Tf^bYGѾ"2q<8X s8-b36 5a`>[c7Q%e29f*97#{TLyrV\ aI{ŷaկPfj:CB1'x56qznuVRd:KP'HmK©'y'΢")蕺!:M̱.`Lm_GZާSem6)Y-sdžY^l*V?>`{W-tc(s.=Q&hpeQGwbࡹzҌe*qfӜ=r"muU$ Sػ/SѬ+fVTdє#l|gR{;s랍9COzOA ָ|q zgQ >`@zPYN.஄efpbCU"PgIe3 4j첼qz4榌ԮNСY`퍱 V ciZ[jʓ~:Q)o24UK,j,.:扁'5HZD>Nhߖ{Gkgya$p:U&Sj`>hrOói\mNrĨUݔ'S57!Yڈ6v0^uR{չL~DZOG:&gg6N;rBvc<-|n`bL"5 JJZaPk31rhbFHcmxH%ʶRc!Yp`2$iAi _c/Y*sOUoFLftQ*°aoK`G⾠'#wuN?tcdFzR t4%DAHuY(IgWL ƆNNܥ+%"Y;R/pӍ?,Nƒdߵz"P}aDcbD8V H\O|ȷkn{DYMY,嗍j%QM!j&vhSemg 0D0P^V_%&^FC Q-T څ.ɝ;/ FBs;3!ʄm:7]\HiʒoPQ:#Y O~]QYN lj N "9ɯ)x`ӧ:Zjq֯qt>7zחF j(p LK\Fu{6y;~b;>Y+ebawC$7iUeT<G$}ֽ9Yu'rՈ/TbVײeJCL.P`<60B#~u6:/O]yltK'LqJd#: S毵CAW.dwW0MR8+A4A"a0 ^0K0~}^T?IdGVbFDNm `'{hQWT }GK,%(O͸˒u|D]:٪AŒ8 dٌtǒP6]ËԦÛJIܝyEOCʷq`(% ,ro sVʅBXuf:UwtĎz+)y'"HXV,5j@ݎe\lh2ζ8 ۣh7JGJ-W&u4Mb69>nvj>+#;O:d*KVHf"eAF련lλN^l@p 7!(hm\ɄenV痾U.. 6>囪܂O= 5eRc7[0/dk|p~WY:QI3Dx"_I^ ɝI4>yQ Rƨ};jiMXM:o\&k!n:ׂWQ=_MwECbOAO J5I~Ɩ/: BNZ;qhDվ)a )F`cDɱ˷)W#ꍀu2,nyQKDl_,;%S#SN}jyi"MIi,PVsߛP/ `(Ebo]S+#vjZSO| mﳚ%?MOE[+1ڏK 9r Vͻ:+ md o`/|oPZjr ޤ~1eY?aUlE&I?eеT{Z,,]cPHYCN>hv+p൝ztTxlhm.Յ܁(}NaKI?9XpH{|jZOrhu6s,m3H6.vBsO_4<$/afުxQcJY]ri7IP!$Y LRHx{,)u}6"'=u4g"rJUFuv!hucEf0I;jL!ߞ({*-zu_K(e*uE"089gLr@+H'CT^Qp[0&Re/W+@lԨ"h@iTH@d&'1[!OH=^} )>B& { Är&0bbNFTJQ؎սg2(,|Th.3# y+|@ xk2a@=Y o@$33UAjU϶ u+9?7( [qy.’?;jstPL@FmݾMoX ET`m8=*{Ls.8 uEb+4VN0Uf^?vm wW)l|4A &cvK0FF5R;֚IQa/R-?Aff=Sn8:JJנAl &}ZMDs dh^8f]l}}z5Y(@4<A4M8&uJK Hyp4 >F6JiϒSrgߣp'>a# 3O)l 6V"1'Yi[yFeB5M5Y!.EN7QLjVW::e*~KR.Ӵ>0ؚN]2 &}v:&izb=ck3y03#3+HLx+.i*6C?~odiN,YВ*um'N$:okgX"jjYY#?}5خQ|QK]$;I[RJ( .@bV s EKgC|U}^h-~24ѭTtp~}mʢ=)F `+]+>)FvbU#^W᳤<2;;{u_5l[9_#M|cXA L≀M ʠ眐. մ#<*uԭjH"㼒mzF*L)R*0 Nϸ@ MFNI.V'kg2R[_bvKkEy'"mԤC/ (b|C]@(-(ZN<; mEF *' jbd!*-k R Pygh=afWڴbíT'Wro6X'1}l/W8;kxQ ,ֿ;DȀ8"c1XERLXƴ#WE/tZM(D#`Շ^ٴ}en<2 (JEtH4).pLcA$32Z!*DwH0!RިgNQC"MM7 KjǾj:_w!W}1%:uuOUIչ@Һ9 [L<'(>2a"0x !كs-2ɍc._lox94S` A_sq2ǰ{x%C+j]G :+~ϱ\fgMU9!\.)nNs:E)u.uYA[y\dl7EWEz@m0_v_׹i7.<'Y: S"X오D^7ʞTR?INJ Fudne^]DE)+s(h.CG]!Q !Y| u K~+vu_yٯ~l6Vlцs&T) E`fUmY|Sa%V5M 원2vϲ\$؝ExP}4B^EmC,S3 q&!qASc 1[HL8Joph (y ?t :n4E:T[ {- fװ>?+:o@&UÏ< eLjnOrֆEpM>Uⲧ66~y/olt^ׯy6:\= &9̔ 0 7l`Zf3x5(FY5IivfYw'ugdUlGol-1`c^!"\ІΛbikk>E!jodO#ǰғ> }jUJ F`̆7Ԏ* %1`F SJoom*׺uyy;o)i)l,(Ԅ#8t[iS-F(זTư$$wt<%4p]phJfʾW+wYdF+` eQU%dpRHZ;ݛ5kx)m=6]ޒ9kՍ[&$El?#J0(JLz.- B?T!V+ *LȻdL}fLO,r%sFg_⹿n$nNN>r M:KBR-JXbCy,g]rۀ'xp &N+zi$~x ('G&ibʅPvܧ2FY*ômAȨnotѲWrOzm?ͳ:Yθgqf)njX j\ dKΛ٠WAǼ׮5"S ۶L2"hEBKʍal_+*'qǎ3+M<yѬ0Xf$;^8KK’ŲwnY0 _9SA\u~=ef,ȃ#۷rf.5BC=yN}>*YTXAj\]doaKm}JU_z:NetP\ZhH\vxhVb߿@}p++8a8^ūCVRVK&@ي~iQ RAP]1cIs\ 7`pᲕ̦41r9l˘ɞq )kYjhvٸ7qPz7wXhTO=r[ѹ| Iؿc &s 8e<}fbFy7pX7E}+qjH ]GS)y[Tc/|D^T(U|pY^?@`U0@@,>3?_F."ܺaʄJR~ _QCXO_hYpoʉF赝{ E噔ulhY?䅳@@hVQF&;R_e!b.t[]nH~92Hc{rULtdg.i^VBTr,"/Tʨ'HV\ym`7Tv[?890)t嚙!%{^ZiY%Ughf=%q7%2xSb/\qD.H-ozFfʪWQM/^~f*RRu1гB3c"E}Qym!av꿗*Yvy B|"Xٶ X$*[g+<'NH?PnCKay~频,[uҦc=ɬϖTq3V"Cƈ?눐GL*RNYvR0|0 Ԃ(ߌ<#2oJ`.Q?r}?{3 pgB\0SVazk)1-6*¥;ڮ8HcӰ Y#=[4<>>vD=6-Ngl39Dfo"/5&`!  ϫAT ޘED  _'dyIXeO\ZK~vL8؁iM,eY!Y}<qO0>rߦ-͠f-'}M^*}xxeE !ӝRL -RHHlhq6ھn0e*lBaN''l {i&Ֆd 7T2Y%-ށZR'}]I6D:gs̛WM*d)uG/d1 gm8FN0LHmm%_ 9xt7,,`%0jx3#&G5;"v?5t ! S7lCĈgA`U!RoA" &_97]LQYOzjq6>Yco@_^eѽ#"agpo/UQV`pZg(sAӷ>x|))c[]Gq:FV* 甲,}hhj:4єg 1E>$\vBY$E4-`WBfX~wД.d` $.,G܏_G'xc.K~.7PY6)[2+D,^ ?ہO׫j \x|a5r @lXW9irXԴn$ǭ Q;Y(@L>½Qdߋ]7+88HCa׸_M{&ҍyj l.y%06\4֋ʖƞw&*j6VUZ}zHG yl;"THSeTŠ{J(d:"ĂhMrPavqT5)$.ǝfk!w :U@~=l^L}N&Y$l35va,5n{^#ye'U}`';Bd%XXQؑHJPGMdGZ""}_a~xAHOƗ?;b\cie{mnP=IB=)oH (cɚLɩp˺u&i.]7$CPYWfoq-䞿*X ʆ."X醙xv~o@p)IIz2Xr4i|UtIfOdʽͬ5odGxڐ Kw/͊b!Rr#O1G0%rHCuYi,`Ю#YjuihAp*<džʥy#PN3"Y(-ݭ)&e/(ᜀx5Lg8rsFs.2fNCߤw3Ȋdmu[P C7zupTh kΤmao9|@}iJ}U%Iמ,Mc٧֞5$P txN!mW. F5:t^k7h`TVxhg1cr 1 ̘,z‚$*Yaa,tTt[IU8`J.z ІP#v w_=  ЬE˛?3jcdܽ=6w-1@0 U+*~M qu^@6J [ O`Mx"-QD_|R䁛12COO>X.JzIsi<%(xk_]psoW֞} 'Kx@q{N.ժ@w) #ю܃^G|S- 9=v񙉅%r7d> wܟ=t~;$r","8QHxuS8?,MnMY}*9^=/PgeaťvLi_6P>lͽ.43uz۳WxDN= $Z_Ħ]CvvJ`_k=XuV9p:riV+0Y`v\g8JN"]09T--7u8d׵A{5~rN c38z~/HĢxң*Tn,);%a'x6=@l}U>lhh9UNo}Wt2{  lpY 5u9GXټ%C16 1k*dC,S ,HL6j *IWL8m3MXIo-{#9Z,P ,d@/"jkúˬϷ]E5i}Xx{coY= '菓 uV wmh('-}WƵ|ڇ(R –>a ~)$oAV^jDS{Q/|KCGϰv j2&K@(oQ1;_zԓ =Eel}i 扨h :3 p`mnղ%V[t >?C[Őo S7BpOdkKwScU }MªT6G˄ H("#l~+wPVƢt> #?1c;m%e/ݝЭqsngQVx'I NIy%|D΂M,6CTt\>+pPin*; )߯a6VT$]KՎK%~s[=JzYV-3,UP~5lvv:s5M8O~LNce=ȡ?uXbJwʭ*. $(HMsEhzGުj"ǖmr;v|`q/.CT]\<$Z{; >M=T7TKrg>LUdSS: M9'T%C->( >GC^-NZd QR)Լ؉c=궸X(ijnrXW5 xxd|9g[|N 7ˠ[JJK;3)^V~ʟ]%3J [$Y_ IgAJFN7}Wcq/*{mƿl+#0M`DrJvmz+@9G-ut&H^YOoOӂdMdiL|gV~ AfIN" Fv\x2WYEYX&3&V5ˣOJ@_m"p;VEHoj!}ˆv_*@5B a #yB}66t2byE)yIpg7UY۟YD{;l|vog5鈞ybAcAv7ld7H t`KبǠS;aE9E(CM(M7./n< .?u&KDw+'X..U0ISLMWYǫvSiQr8/=mz,J=TyRQAO =7:9i>QUر:X" Op`<})ùP l}T^Q˚;'hQ#vk)~Au(Qժڔ."i(D4oc|!/ +`IOdSΆY" ܜ$fH7f]H6ѶRi0L ^MK'$ [㞔DŽYf c q!Q_gnsNWzP-݇ˀfZ92erm"'Ƒg2Oi[4{2f1'):#m/XM;-͠c#L~1HnhTiÿfp=꯾G-4NގcwA  N,Jw6i&xANƉy#q[KyͫT2Sm%5( @X\4͝,bm+OR*Df:jG8SSt O< j'{mb߼\k% Y3V 閲U<3UTw"#@ߧy;3c rI.3㶐‚+ArtKQb<--`|}uNN=V{W;m xhr2Vq ykw1Ĺp-8'fB1£/J#1G #II3:+&LjjlT׉#Dg)uFEN= ߮\#Z ?awJn J31pseL莞=QRo Cz.&: 9* 2[wUT˳sH=?o|!>׿] T vCyBbKZ%< 4J+*<>3NņB%^b{ƍr멅}A^Ty\mI167 wNM!NFZuw i⍓Js`JS $@#l`^m[ԄRl#_NGR ;]㫐r9ɐK<9(ƭQQΑxm(Z org(?$dz`:Bcb.nv؁Fbm#9oXsi6%A#1.GilVJ963{ [HF=т;z@αxޣ>k^ ok+E9 å6v#VP0N3(: ȸ.y_Qy k!d8eqs՘E9wiӷi` =/-MvCӪp\6n05J%puK!^{,ww ;^y^arTToڦfouhLcR1)()`(Q\fxe8:%C]'ﯥS|02HK{/aFV+ܵe0?RB ,TDZ5E}k_ׯU$b)bq_4Y))sw˱#;gJEEͮڜ^ׯڶ#cͨ`R(&㩑6yn&ЏzRhyscД%B Fz.;sx"oax *h'5h3lQZ1B$8t/ԍ;Y]a2  \"tʺ+K> 5Zu'>&G{0uaSm#ޠ;PWǧ%(L?Z*{%r!j !/Io$0+xFE:g0Y(Q7kAֳ*gAuzx04Zx6Nؿ#yY@V7JQpџM3чͰy ErB֟4BhFawi3j!'MС2fQ)g#lq6 ɸUv+=O맦"ݴv7f+EGخ>w;4'Au31(R;0M{Q6 VKmL"?[!@8T3U8 W耩N$%GE(6Ƀ 'd>Iޭ̈́-.}z2] z|Fj|{M9NQ78LS\^hrBI0BM$ z ?ڜl#GHydR4dۣFvYJmק]!<.`ޕuѦ:jw(|}4`O`*GU'$wrWAhH~~Ѧ4vtX.ڟB sTKB'f rUDx:w6w 5\ɔ⺝bwS@$EfeT*ZDWXT$H|qչT CW[3IV`Hh0 P,6[8g=]$.|YcuE~߀1l4Y-υNWA81;D&ʑjlPU>xdDj ݆;uJUO "P<^#\Q_ 8Fa'ދ|)#jUdrUǥh#hS'\dlVƬ{a qB&;aȚ4Ono4@yYڠP<ޯQF|9C1YkNg9-%pbbܻGi*fd5\`[bŁj7} XIY7 ,GpO&_ h,iU¥Gkk&y!t l&8K'Ykyb`/]E)VAq\Zrh3YV "qozo-wo77^8`tZ{苽q "/>;砊Of"p/FU -Y_`rPfݱ9l/suSpH^%$m퐧:om23۵EMLoA\~,ՋR*CV?Tz]񟭡 ѓY{'>N6P CuCsx%޵5pL^$ y\=Lp&V)C;2+q+Bbdges*cWceVcܕڳHrgVpe/^R;Y8&M[Պ?c ~Wݡ;R>uc \ՖYQrժv>[+upn͇ᶖʆ; )zIC:*P2cޜ_I,Y~FnjK(vUs.Us0J"Z~"k@lD3+iK WxBQk^V';xo>+Cjb;I{AlhT ²IiK s(cz'o΢AU̅3)`Mʖjd/ 1 #RIUsE: c<:\x|2=#kH0J"ǃAD߼ɵe3h'DdQ6!i٪63!DdKE` QTq/K1s|%]2@zE}G~L›%P{L~-RmODҌcJZnR%QWzOACnyk'. ܳTqGnnIB1v>Voh i2 a.8~rjIfRcK<w|$1]t 6dYPBow j'OB)\/RYhZ\-nmcA`l 0i%)3lTr`udJ. ]\9p6[KxӾ& Y(^fd&j4ܞ$!^^p\$S 9Ħ/FOݬ/DgCgLrL`Т`7A_ao>(R& 9O‘e, ] ='% /Z~gG(%1r@yXU[E쬂f|oiNSikT.jV[С GeR+TYy /1һ|1;(uXF5 ^1z̭7ܪ~yUA<"I}Y숋% u.v|}luJAʐtrjqgW$:mnQ_, ;F ݱpFf=/5*pSR%T|̶]7 _CǧY]x9-N'ۏ< [^1FLyJ6-0=\ p>FHK-0WVSmQ,1qjjK!kHlBR 5eq]"#CFv̥20Eb8d$ou4&1/׈b}HF 8M^ د=ei/CV^K‚UkG_jF9QFQM\r|]Gv2gkcތn2m/ɓ c3ȷH9׈͜jٓ7So%`ubb[1TEƼ;7(TqA rV5p9LJpm|LB= W[~-(#7vQ?Gi(Qw=ޝ*IP"M7;v=3m\%wPzӰD0roM?c>/t { ̥!3WACQLx)'PP;oxB9SZ݂z$8G?Yٜr>kQQB(eiNb@TݹQwzu?m viGZoŎ68 v7匟hRi.'RK#%:g?082pwMpt+CTHYaqhoS16E{u\u<1F=U2UTZq+&?qCelַ {Mcv1UzG/T$1U;B CVR*"+uH8 RjP4wu+,Z~+n; JEQ)%`Q}OpSNVD7s8=13O02&@9Q\^wᕚfO0 =>M_9bc5GQL ݥw)WoZyH#0m8bLHx4 ja-ܽ ?GM%x$<ҿo6 ĉt*Ls#9fSggmLcm=^/\D\58,_8{r&GU~٭D.Ye<3;AF!0&N9#ƿH٢yHYMUB+HAT@g[kh|r|dAh>+՟!A ʼnE ByMq"'5g->ssxJng}!ˬZ _!7L䰷狣1H,ڻ n롵ņ5O{}ʨ'lf4H_lhS]G iTSrZhɫwkʿNN;Jymk1c 0"6jk Ȭ4`ޛ" 4K~4)>yD"tf#B瞍k󄏧a op>mMkrSR.*2|YC6U+uᒛuLtpx4/UR|T_n(N2A+Φdvn &_dʢ;3Xj jO`~r g؈8<4eFإ10u/6l͘ (}zB_(&`ME Q-njl@Sh_[h5t|7e'O -'YNXpA^Hu13KrJk?5I̘[+ '}6a`5o@u? \rU5qZedZ+w -NgHᐸYOj;F 2T_kmkL鲗XQ|ISa|<ӛYS̝hx|.}4IUAiۗ h`^DCbǜtGcf K^5T/+Y =EჲY|%Up?VSF'F@HnJQEenyIC\@:R*o,SjIBL57Z'ݐt 'ژ|!ݕ+JuOl##Dw+-|ƑEY@\3qlh"J10ᾶ z3A!Ou *%$@ڻ { h:SH펽Otb^;ij.BtݙF)KB l#+TƜgfL6(r]<=Nߤ"+mUCn&"wh`yopv8IIW܆X0]q׵a .z o(ـAH8.D{IUCz뮋_mt+ Lj5Wdͩmq0gg.0/@9^Šި ё2})9Xb!ӣޤĂ5Qfo"pia Y<.懫nO NeZ<=f]u,4nd`GH&BN(O]6aU<[@i[eow8E1KL=J60v[j`G3qqѱuO,7ʪbhҴDRź={B&OƁ'I-:rRS$별2}95W.~gR+&}P`>%)#d`j+n.D#'h~{ٗՊ\Q|YDF9˶qbx }0x Xh0`-4}s'EЙl2A6? -MrS9wǯ} 3b*m8ca JrtXW"uwY"ol/ƃ4s4j X"mwk~yfU*X*ua5v9.S@ <i2 篷bװLԾȴ"D>z~z]XaAOȥ4CTC-6FxvM&r [R3li=[L!HcEv 2wFnZS ߝSf/dӌE~"\kNԏ?5+XVjʻ?pAȚ˸CD[ZL0xxvoHkKHf:JyuOz+ЃaVWB!d@ׄG&敃%U@m} jĢ& }6«J۩7Vev$=lBs.rTI UGo'ˆFlXP҅ @)e˒>͊rjNбLia7{0ztωro\3p|yvrV +hAOhI帮UHi 5.).{DKi9RlƮLRhx?#cggnUgE\¢hSqyH_4Íb(ދ c( s0]9kag0mumk.!<0UM[iGoZ'f70dקtR|Vi5~U8%TNA"LG,;:XDQ\V.߇Լڶ#ҋ)\H eKeؕ>(rEwd 9k0rpGO-=7;Z5O69ۇ2nx` 'OBX'7';Odtgn6Ԙ'@ ~+5)ڳބgda@tTDXؙ߸RD/ 0G=FjY\CFG 7PBՄ='xq+h5˘8Ӯ4QϮey}[G[KCx&DSJ{?Kv35±b-7Ð IL ;/}uI>Z˳5Rt`Vc~'IH(n =SQAr+螂Xv5L{VO"p5^uBA A7/]w ܗʰ: v4"C6NwB'jqi\S%0Xgא 57\A1v6AQ,e_0(;ƨ/R<\' ?gW‚2\S1McDo $2 "OyLCf}rf[Di-gReE^A~WE[(;,Ig,f,+5mlL0ﺦb* &3؎vm;].qxfGU&M퍦|.M-i+D#ew3-6% yiCxxxoZ'*8 EȎ'ӿYjn1a`;qw$IuQa6e=&eaE."BG ]ib+8d0+W19{/67zrY/]nBǻf uI3. ̔IQQ@v v4rp1|G;'3CEZAA-'+0­3w9nBXSfL2c]ZZuY(_~Q1w&ni\L+݀I@}v$)TqJyc9j5ږ;r 4 o ZR3(zѐQfkW?7*K@sM?F|λAmGJ <LGY]Qy~dx9oQ襀ӤJQhFDYZBШ7cT(s{s7hP`&_|(z+Y(كaZimuK<Zr#Š-fqts,KX wgѩ4/)x\9hæ,+QUXLr;tĦ shӕ| F$N}ќ >I: ~㑺ũ%U#ܱ@:„Gpx/$̂h@Ic$D )*E`إژ57yK8V g-XF.9stjOC%mo2=C$"POF* gщ1VJ}KiA~y֛kϗ w<* 9֠!k0`k](N zLKtȹȭu㢤Ua'+_ǥ7HE!Q8vVW1;wV&:B a9]j'{(SA9-.b)3`%.RȄxBWb`+K~4 ^{,&#J^8=_њ:">yb,tja+un hb2Ovz,mYuKpUE\:,L zWZ`H;5LediWJ덳q;:ij;Z)Rd|9)̪׺Ȓ|;@cf1ȳE֚VӰz\/6[Q2{U 1M23 f NP`5M})as=X|Cthc=H7MdG)3Ϟ jܛ4:ͿOin?lj6}f܅ i+n]֗${Ʋ^c)9Y}. "o4724vWՖ=Tb24bcF nʧIFSB-d][<}Ɏ/cw#1wmitpK1ҩc8 -׿{ea}h_V9 ;pGACiYB1F-6=7t%W*< Ӗ295+!bSI*xs)<~cG2O(@"* hn`5-ƽ%4s_q|iv %7ϡڷ .5IX'|~(`qv$AdQڳ$*ܪ4wWo&yb{lԇd -G҄OˀS~MK"PԲ(퇦/OCxXT6\RqCߪxzH# ;ՙH$,ʷHtwCr*M|ꇚA dNv"A<ϩP.~ GklJ/Eۂ"y;+SGkb9Hg{$ڗR;ٖ&BfIE57f{Gz/z౮00Ec8M<,ygƵN:jL'4%swxPAAd`tEa,D :"(hΣet4ێB^CEqcD`[si׌!I=Z /{: #R( 81V //:t.P5fU׳;P1IAuֆ),뱑=cTB87+G2oy&z7 ^_0)NvV;+N`cǂcz퇩Vc{ǛTmūJaOpG I{]s+˹KʂRr\A+CygѸ˂'!* 'n9c7iݵKq|qC\D0Z{չ6'![?ۉԭm ˢy胾*cQ΍Y(=`6xLnwVŀ EwS1yAP培sv<b7I/b'nm9,KI}>oi i6 xLVVFOndqkl[|Jg_ &ڕnj8NnsC[3 ۋ!QǩP")ym*Hd¡;Mͭނ.'E[>4cZNcyvрN>$zqLe#hB RMk[6Kb,">δa}(1i7)wf?cꚑq٭FŅ^t蚍9Zw c1a`$N2R(2 پkOC9\rO+U6.fY~:E#7c ֪Y&6 58x0hbץMY3nEU=pn.a!!d\,\>_pJz#p׾iT䅥W{)Qt ԥ` 5+Vq2Q»b-&[\ $m[\ظbz۴HP.d|y8-,ecI>q t`{|K#ZC~dDǂNddT?5}rE tiTtHݯ%^$]&NF<ܱx!JhKed_sR;s./ ]Y:Z*?( >e w'6%*qdeѳ&2Y!\!1>WN;+$+ l#^q ˓4 ocv8!SbB;&Lk6۽1ZR]I(}G~,kQ._{Nbݷ(WrӒVtax "X iC2ʶ#~`R`E}m-> ]%6 b3~㼛-Rtl`v ~2!0Xb벺r`&|<Kc=$SeG<ɵ7pqc(k{_ګVi0RvO <#-)IIUDr+ $"BMadIVxRX#zs Z_RoDafҊ/=tV'Bn5"N[+#U ZԜJYL2 -ЃM/FY!fd 8ÝuW7lܟ).p{$ѺF/εM?>WZ.?"G Bt!#ŁiRU{5 m`{uD+'KYHe 3gW<(?B=ŋ(#!aӋ錦Dqu\wS6d&4$szڿQwqYsaĔϠ*Ec_9n>NJ?!o/6"9BXւ" ?@MH|3QX|Tj"{su QuȵZQ,ʩedOO(| Yv?NSi kWNƚw*3D oP!pڸxQHJe 0%77%#W_0!SfREbZsm!ݵ` 8R[nHAnVE~r=xյ%/ m tUMҝin@=qkU=P7ChLϺ 9ZFFl8=nI^Lᕒ*[2PCG03omfҀJPd%ֵ q/dkƍp[kjc鰻0WN9} C1x>}]{%_9GCʯD#rN ]7oe9zl&Vȵe/e߉=,IV ߧlX$ِ:I1cOu"5\$.R}8KOnr<; 9,#`2]UAU{!s( Mybrz8ч%|J f=!DZ)}qTgFχIpmOafJig`CS>0 A^ۂ"Sx0/:T!kC|hZ[S)p3\gaܲu}/q<7 ;ϥ:ȍΏi&p+pĂ# }ذӾ-ࠀ}ʂi𔑨 X]֚;v`-qDbay1o~lr~_sFؑRp A( \L4˲SU{72M܍ Osn{|ˁTDNy8FIZ4* J,'dE%2JA].;&A0hʜ zX[2+wAS.0?~ Tn22U,uq8NG-# ޶6ZG䈋N ˠΗt(hy0 / L*yNCHc(f-2!1],4qF.)ӡ1x(^Έ0S5H+YOinU5c^˒ll0#D/A،ӨcԠP,鸡&% k9!Ht*i-l{:']e{s zm﾿E CsU}E2.--cnSʪ]QssN^Xx&bRac$|f.c XҦu Cz &dz<&:YH˫ v eDcoSGԥv3yT=ϭerWZCs#< SZ6SP>j!½]BWy)|s䛺S Bq8ϱ&gPe|:o/-9 `R֕ ƃW-E)""FQYhlxeT+.XG%1(M]xϣ@eF2|65GX,ۢfa}C1y.Sh=~A e?oɭ)n>R!܂B9#/Ю^J'*kԨ@W"hs%9i;fon^t,kS5^P.D=T^H0d/UcuѻIȌN`7~20R6kcWl'){:2p)ùgq%ń0r|GCk2Mb 5,ھzl>pK=ӂ! \v[p_nS'ɂ9Cm|.`4$rt%DRQ^hٻ[!C<h]$})_@iu~/_w:z8F^"{glb@W Mp*Ap8WlYbMA0n3Oi0JDR$S=\D`i_SƛqΧ(۽2wVaʭԗ+f3 d=fyv~o ](\̒#NWJT)2mIe5Zqx.ǣ/Gs$HiX~% g8.YMK݂X+W.X fڪpGC@v2ӫ,ȢF(3J:-}4z-7ʎcnŹ2k'_NA2lU{fIogkKp_.=d:D)5EoH8)=$* =&߾f]&wRіiXi6ʅ>o z VѴ9>\ވDuiCײ)mwH0TΡw~(&s{®9%X%3FMu= 67-agU>S`B$~Jv܀#\fGE;|I6L7'ۼT{C߰XAE);;˻TB A=X%~#PMʉ7 TԄGbÓ֢[BGuE;ƗUÓC<" 2(h^h--w;0XCȾPvL'mfQ ߽_@aS" lm0^'2=םF UO哫Pm^f.o& X˰j'ۆ0@r M HrJؾNĹ'0GHO+_Ps*CF(S@NOLso.fA׾t8T..AedlZHUg\L$T--篅\]3QHC7yj#MKq:TR?Jo n2d44\MRhT5z$\=JfUgf%sY*`)Y\ FQQ>B D5<Gq7%1I &"^dx]'ft[^g6jji)͘2(*ׯrc<x3Ok^7}{/3k >@6PXId_̍t +K} [y?~mk`]ߞ&q9]x-okcA;W:Hj? ~ϳ捣jVf&yN'ErD`Žpk*r2?'\{(EpӶ0K Bbc9`s)* w(eeaŃ*p|1-[lM釹zl1bZ"V=>3ӏC9TVp_`1tyE~L~CtRF֦qK2oRc( Qv9Ǩw`b&>%ؠar&s Iv5dGTBu-Ni!93bYҤF:8@:xr  аi22;Bsm)j;?#ski].7fIAԾblS(;*p؎4 AdH3}<9k'><B [>)O#`8Xrwi:mJaRb>iSvd#湄ltTŚ"cjP !!+ߠ&z򥼝0g;IG/EU h?\_˟݇īᏧR;p=r86,JnkH4ډ&yD[[A43f {}l@^KT!wNjn~aW~f@o}hLUl+ 8M͜".x0vh߀ey՚&OO!ʋ =&Ctmf2Ώy녾RN%s9@3;#IS|穮QBGǶE +M lEy 5-Hpb (+a&r݀f.t"c,Lb4l}&g) 7XRFr*O܋ς(l)?6<[#cȴ"_خSGF~Sr:rgn)7}? \#,cDhZٶRr$>>B2kJAUl[xA-lO4ƾUfܰP]Rw(؍rrT9+Iݰo[kX3Hkj>.nBcj̗1Z] x1yErzHTĢ W a8 b #qN]碜^+E]K_NdsAb){0g Z(e.. 6!YmkFgbSxB⯰_ bFAFI5J{x X4k- DFP2K#ਿ@ʥR00yB->E0Uh,/~Mz%;;ߙ+U;q.2/6D/n2ϰ\nP~jڋ M}* +֍VD}Cg6I c$c?t2K`ȶ)N/c=}.&?OB]\OL:މx B|A _$ <B/оNSV9|'<*ZĨ =$݋ 'eąASz$SY0aN &bnKň>IJELrތBp]J̤D!\<(^&:u"rsKIl4ڛ~s$Z$mr3!^'v^Ys)2(4bAWBYnj0ֺ_azJP>4V & ʼHֆgЬ;!4aPBnViMO#/Є* :=eݵ(4%Nz*mMȧp _߻R)4{t կ-5U f!c@OtIypW?uLflkq)4JC(@71UTF"7I*u ;'_X:%MmGF4v]<}*mZ6x DX@,k׆ѓӽNvA׉P|r!^73OL)ۭ_e.}l ~hwIr{Bճݗ/]ə;hJ8/ElڗDj6d۩qVԭ2C*Ás5T!:(]݀A+#1Ӕ{1aT}c C S]/V$#99l{APwj>ʂ``.|1#^\Gc 50# XUxZ@U/1?_eGVFWMa[ 9)Dm:ȁnT|,5~aFG0z([ |z-+h$($>'T[A6.?S'?<'׾Ȫ]]"c3  |*uvAi!Id=&tm=1)&zx)5R?_a2s*_BhKS`Y)o]ەjՈ)u}}Ehzp66=pXC S мWIo\[*qӊs'c#\6Cq?9R|SUtK>[o \;-[>OzX VP?ؤF`4҅sE0y:Vtnkv1O ݲW\{R|ILJusFmST|#lA5"}'dHR6,¾GQimoۡBY"f{ː2ϣ2t^Nmu !9nrAn4p f#% Yʭ0{TiWK6v ~Lsn."D[t2-$aJn !޲:'I#V2~\jsO]؂bJ>G1GyY i8~jǎ7gF'uKPpx'iWq5i+3rsEgS#Aoa:zȥD{'_R_nлMl[NfVp da͡:;rIf(+\oI7!% g_1|5ޟ& $Q3vMm:weDdeL}qޅ{q~-#$<_zlbG$n@>ɯkT&rD4fIb3q%UrUN 6,Vֻ\,t Z9'xf`Oe#S)HPYb:cifIZٳ_8ڛ q:N.Yo[?/%:j| u*Ip82HמV8/+0G.F`] KjbѦ4;ynqC:VO>.=Aӗ7 Xq bjo6 鲹>~l`1~Yzu\; &>8E\g7*`hG>}~2z6UQ4["YXv} g)'߁Ể߅ 7)#^NtGRvYbeLԇ4W.@xf Netߎ/5h8cc. P;R_3t/BP\l==f\/| /=eOJr%O]]SoϷgKU$REo(M.EEDXlIvP< HR A 4X,xԃ-1ȟ8CV4ՎOL,^ʠkjDZTPd ,`Ib^šQ  2V$@x㠷l3X- qF6ubIQJyH.G7W뒩RS 9XzܑG_>/Ê|W'DzAr &/[Ml &Q56PR4 S u69ENJ<,=plT'B͓עAfO2bbaRNf%g/2ث |ĝy.T Xn lU'N]F~T~%d/o{ ӝzPKvĒ:,iu 3]^E81UǤ몜{ceq湶mf^-"p}rI\LJYQ3 8#D -Wkڇ,oTjGSEWR>+cbr؅^AkImCq0K3*Pm. yB oP`rm[ yKxߺtGe fB. o4 dYcw. Ԍ0Íy9onrN9z7־O2wwF s19mq-}[Ap])=/T}ax>a!K~E5xkޫٌ71>Njx|Uh&p_ `YDqB:9HP*OWsh^][\z)톶 J|.,ΪE+QڛO_4|,Tgo" vzp*y'?&1P8Y2x*|UM)XƴF*+$LDC"Y}CFDf(n Jy F/~OLO!2uDÞ~V )n-ޝAE0@?XZKr0T,zR 'Ȉ0Z968RpX#L,dd1|}%+ђ%h}L-ĄlEQWButj+d8rhcB-22BMeh"K HվSۨWIFW !#HvYErmE )7gV 0 ̚*W>M AO{c}mVQ>WTa]__چOh&B|olQRf:9 -FcŒO,mWW"Q,FBX'$_hI MXk;h1h\\:l}߁{' ^#j /jلI jx81"5ͦSWW3̡Uȫj4lFѶҹ飢I{%lM΋t'I k_,\[aKo1MRTq,"r^eB[}HBKKWݝI-7ͽpљL#%0c|l&mJv Lۢbɇ1!zDNrzx#w",G2LP纴o.=B8YП~Tc4J#Zd(2/;=<]$J7qB/kZ*f y,̲ B 1Vْt5i&}PgcuĈ\e.U3X8.Q 4JЦ#kzLr'S+|WQ-Ƕ?ŕ% p`ľ >ƍgskbŁU8YT^"5 $ [l"$U ]414wUX̭{d{M^9> Y- zܫ›i(GWѐ2U)B;ɼkh1j:Y#6UHgh)PS.JbٜEj:`Qɴ&3 D" NwҨR>9ES觯wV/tGo骬y;sq :<IrD%;ܲDFoy1(r8*G.LhўcCǂU86CP˯4);!a{+̵@p\rf41R{koo` U®D+&=yc«2\?%P ϗ,7<%3 [/u͑7.1=C(3BuR(-IumDuF^iVf>ѓDx+2X{}`Z^O5`FԘ^dE! 2^2[ϪB a_[nCkIC1FoKj ^! zK){cC2Y)y/1Y]|V0}M˭a t7p\T$tr%9| bOSi\c(v Ls$SOġ⃣꠨xs-R8^'},z:b-RcWv pe\; Oԛ,l-:dI'61&-O1 9rJWI9XOT7f7]odMsvZ*bG\^{WĨ\q>P4.!E,Dh1BMHy2qRКlT/_a?aĩ͗ʿDg Q_Gbrx?KM9 9SJCBH^yVpXy%xq]a,5ʚWW쮺;=^.EW$ih|++;ۮWas~_d \hOF-~5֛N b"^_@vj~?N1͍5}^F~O S8wC\k &)u 6.;|1Ia (_LI\~f_޿ _DJ^XwU)Jq`Lb^g OW$lTgޗTJ`b5&߾|Hq׌NPfxcerX "kor_KUjS "H m>֝MOLězR*NTs\c1'eȸ(pJyBf[Aj+ TId+|Z,֗"ԝjP^_%'|;ϾVA 6(?ݱ )aTzjӇME kvW :2bq~mfBa249/RFFܑ21)+h$T㿛Bvڋv7e g ;vO&_B8\4ޓެwJ$fI8`JB~WI$j?&Bcpݿ==̹{o!{wZLc;!o' &18\!!:Ne*#2iQud^YQI,>ru P|AlkJ E DqY؇O?d(8-ON(m/2W 2b?mSWshO{m>["H1qG)pg.><=18iue= )W ̪` o ;Nxq0$mb\lv6q*۞ brf%LĊ)'}-`Yok(1q)KݓfbW@$QzEf|_=U֨;R1|qM_zIЧYοc%}2z=⌺`OB+ajoָB!ѾbN1ƺ4oo@ =8p I,kDl^[%#-,=Po83|P7@I)5)ojj&Y{jG0~ۇ>W;p]Cu ყkFg9" k׺RR9%+G{"'Gѯ-~JYUNJF[(U!Te#*WX T 6ü 0\!i uʅY/%X|(\M)S4 grGS) O+Rе %PZpbx;xqQU W׵gj)04#Hp}~u)4ʸZ_sm^K[2+O\G-3!#&v|7c<7VٶR0LD]517gN^|u:"`AGyѼ:F6Kƽ?;L9#g⥑^$Fp:Y1z>/wXTrl[(PDOeLtY/Ҝ սACr<CֽK(e,vq,؟> c*,͘dĽ^xqfm}{dR=f9 LJ^pmGD KM $JH?{QnSsrh c&/AhTEn{1|q@6|>>0%]3ȓH( ø}]1wkh>I%qmy8_IN YUpˍ ]qiz U" pCA̲lh]ۣDX[mL+/pMSt(/) c#Y pMM)xh6sU-W(yn8aӉĦm^d \b'bDP":J%FdbacW.z(1i>}uL+&K*3R j3f+}VGaT5Z?HOWs!Bt;-9Yp3xM72!\D Vo%!8z k*pQ',t* DQRꕿ3e'uGSЍBڎl=F&gQ&\L9+(HYI;IBH"j+XR:iE1zw,~k5=8ٽEiSF97LuU{M?}'- P%M;6Z +T &&n%W1i[`zOX.(Q95 'q#Uc=x7aSt%}KZNve6tQ6r-e5p7W+ dվ[ʡ|D3ӬT]Ip-9=qF9\6XF2tX뽕8.`Ks Ŷ"H1g>CKBB$}~m$dCh[^C⪽6ڡ§cbDy} X1yEd?e]ョ`=KHX$N^& * •y#[cOXldU BZUkY { M SeƚN;la[+z/RiN7^ 5 ̇ *7yH-Ч&ko٭, h^ż3QQݯmX'j: t4v:\><#ВUw5Zݜ/)\7FLԟ M493x+Yg)Qk[8נ5Oڬ3(50Q 椈q؆Qop֊M%6$w7 huʒ/~n2oIિXg_ iRD pJI|2~~ϝdP+]B!;q_Z88 e$N{Z@Zf'c"u]1W2C٪xM W4^3f#J,Ekd@9g^jR$fulʾj[Q䇠# 5Ke+΄Z7>Z[K`Nc邫2>C5Bv1*~O1 c[6k }o*(8x:ae,N&&tұv/O6nm+C- WC)jiy>.ʎ#Z|hĶj(ʟkP/urwu {dsjLx ӜDGjst8,4G^4-,y#8D-(!>uBoKg>{?AOOJKrOO[>\K oo '|0@}oaDZe޸op5Y KΊ )0bSyJ30PI{{}qMU\-|. $R Y\>1͂H#b01 G\Ly:g[zbNh|I =v,ٵ>B2mi,\lB .'smw:ӬaSY'U?,5x3tX&Ɂg4 #o1t:/>Ol)||ٓ }c⩿#G#7z_0A6x:dWCSBd0W|4aW˙38_P@+3@)R){ 4oU/2O Z9/ɐbeHǎ;PqPNw[6FH,7w39::joߔGXs We] :eq-C;A_- ZU ёmF}3Rq82cG:IrU÷Dýr(mӗ P<>GsBw6h_+vTל]oD}#9߾Svy4&{ ]:cv#Y#GOLsBe_5^Z7,6 NKUqA$son7H9 t\3g!"p-aOXAmDMҏEϵ6k 5<ao5yEK3OoX VW|}a [%+j}HP-6?bvbĭ/Q/@I玫ߊL=m]+d|Eu?-F,cegh2ФFkAƆp$ẓ!U B$c@iuJe 2;\IH*6 ](k&?tD)5; da͑-I;+<~O VT?UH<@@9[&[j{NG# 2,rdCYխ.l[t{3D.Sg &]bҪ]uWtZv?aLbyF2R0yQDXMI⯇_M{E)޴9瓷p|U/=FHiϟ U;^3^@EybxʹsҐ|9SA|s餢8sax, t$5Nu/;J{*l^뮢 ,4,kH  TNYVoGZ7!4[ _:^*/q:x|GMGRA8#!򥤦+@OLgM#~m#@E -:q5\ _5J]k@C;'dap0D]yt")x8l`g+gտ浹易՝} 1WgC3ѭj[ 0yڕ_%ҍlaZt/*F*MlI?z)׻|AR+G}Mls[A XHm{/"K%lG;'=?) 7J~ qoĔ87:w WhM+Kj7GnOJ d'٬D\k+Q 3S)h{r3B4gBq\vTD1/M,rP5U|Wc ~mZ. u_uf?y,j3~L' Jk/`ʗJ._5CnG[8}0lA0<̫ߢgOF a9:1ț5k$o怿=-d6}&&KýVl'?e  tq 5jfI.yߖe{({z$]6Ł0 ^_AH5KHE9 )Mm$ *V_Ƚ@dGζ̼VN<jqFQ5Ց;D;}]Ԟy648,Ջ9{ڪΊ\Ng>'JbqbMV`hm{}HJ-Aa>߀ 92Wγ%v,HD)#5Ǡqmεʓ}42 aaOHաm +0bbCIe- 4M(f5M_h#-:MNa(cTFbIEZ~!~I5Rs;Ge?.wj,#T4w>9 b|]l`C02P XZjBFӰ˺QT9C(sc4{ܖ 0 pWp 6*-a#J=ZнރnY7a9=O7#4$c:bё}YB$`WŨ~6w܄iz?zbt6 cS.{$2C9{a*ǔh{P֧)&Uʊ: NƢM|tl%KJY5]1Ӵk j^ 3dQ@脩6"v8hEHj$IXCTec-X8m۲_NP..~)ap[V/I䒼V~@'c'$Iǥ{ x~c⤡#: }'cy\ꮗ7YH&bHmEFfrX3<ߐ Ӳq`񨃆۬?Wuf] Z\Ù:9lm8ɓ"V긢mC֜~R~1̾nJt3?k+C TOߕ>)x>©"ŷU,щKnRI8d*?$ĬQBuom4! LU{HfّrkR^άFg/-VP58>R?MDM+'ëg'ӵ,جQV@/@[Q1 U]ex mLN ^Ǖ5001p 3+=Xr;`['ە-K_ T_ڛjhǑ'DCpJ*ڕO*9zrdIT1@V.-"@{`iH' Za>90=6'q{Ub4iGv-ڧc׼o+ &@Zm_ %R -m]p>+Iz\#zKXSCԁ5;10 '{j2e:$yòfFj`ՕC7F}RyߍH%ۖ,),+q£'g0:]}YpKdߍ8qg :-re; FςT/y){أ]>М5"kv *XJudp;7@^ IQV9g:-᫾;j-cE/W#Yk$3W|~ AǙDšIzV=n^S]bzrTa!GqjS}Aw8 `>Qs!C۰ ILvӒ@AO)A9 qbBH *Q_cNE+q7Zp8whl4H9;ud;ei6ߖHN' F[`>u&Ff#؇#2uz溳3ƻ!P$W,Qb]閈ϟي N܏|YZGm:b<hkr#{c+4PL ubD $Q{) O;ʿxcs{QL,Um@}-WG1h UnY&s@@b/')#֮n؄F&¶nIyGvX3j :u?0~C w4R/|;n /\`w$u,aڟ4{\xdg4 RجW&Xں!OyMڢ5a3"Zn2Ze_lB9,2ah>Lq\#Q70&U*1f &Kqʶq=FpaO>k8[t@MP0F^{'X."Y߿ Y>mفuݍO,tk4[dtG=m~f`K&"~!9Zbj*~s ţ'L[6~E-c,. gw%i‰x<[8kc^N,L}HvMHnDxBFU^?LnDkpmJ;c/-K{> Jwۍ+񋈫y+5`߽(8YkRO-o`jڣkva_ b M.v_ Aq8ƒ$dc=>R-D0 n<70p"v AkX"1ZON9yexW;G_1٪kZ䮍lEs<ЛEwZa 'XfոZLTzkآfF[;)':y`:Sn}^Hq6ڹƤug8=,@x|EHK$lN8Ag`U[;xd0lyяvR~`Qf/>vtoȾ(lQF;P9!J=z {U&\Sr` l `]oF;}wNPYѫ&/S)rNb؂/Q` 6KHc>|PbLF(ny EokM42:Eѡm^Wz-ASsR1Ҳ1,r[j,ê/#;$5_1xm.C \f_'Eawj0Sy/#2g Z.[UQO_i g$-KZ5[)硋ʜGjG[$#j,ﳗy8l L˦I:v@xL-0dY8~w{paS?˵(Q3H& ga!ӪڶegSU~@H_޳!0 R#<mT8 G%rqĕҹ#*t&:#KK5XcwH Ey"FDžZV4<'Αxmiv?25gzlCá:>?!AQQҚ^o}Q#4OEs|7ݛLP=J'{zZfQy6ݨ% fOb7x@S a"V- N@mu +{%f>@&l²>|l!lu"JcQ |V"߻:/#l[$1AmЪ>DRL1Gs"JVO$R{uazB=Ǐ x_5 [ d֡?&Sou9ç]BT 1H71 W7,1P}@mI kG"@)lӤ$>"%6S_y6bMTJ+郻T|]Oł{S.0K Ek\\57늺1Z _Sz~Tš ~Hڏ,H\c+*`#vBXY_ް솜|bch| ,9Y5 =9n6uuuG7-y QFX65,UM}㈌.1t!CFZCܟju,%y1 ep( .vё(8 T ڭRSgHyP{ﻊ J4 Q^pax^6P٠ 䘷tu29GP:OM#6鲉[ly :Z%s %g$c)"Jϕa"-:1QIz"sٝ4Ctt̠ac #|m" d/$5E;95Odnqı,KjXtz͛/-ITrՍP[=Ě@d&U2zC:ߓ2G/)Ge7D5CMs)˅ɚ eeo1?6Ǐ[vֳÑj2dhbgF(JA hㄚ9<)W3;`wi3ҕ)+VCfUWQANr_]Zh+X:XUl\d7#_zr/G˩nvӀ~ ^L5a^zCPZy?vM)DQf 3A_1]:hfyT$TN=Es.~)UcA;}'3oA˸k N0e&c%]7| իtoxB)]kj8<V|ڐTGj`I NyQWw%@^$MCvTz@!^&'yk=6_,lfg'vg 㔵eGGoO־Arkͯej+LN|j!6SdLh76}v 1yʵ޿;)|YGJf+x' kC^fTeJ&>ܞ`&X,r^aϹ6(2|sIi5w!% 䣞J+L}&pvϳ̏.5?*<׾WV-*xkH `U<-{Ila͈m}ljN;o8JJaϋ]mWa¶6ƑVd.2%5:c8+tpƇʇN~(|xt)ޚvܷ^EV]Je+T$o..Z˝S v͑”:NP||zD1?ʤ' 7XIX˨V߻1+JAKYYo*{N+fcf%"04f CeT@)uMtoV􅒽_Ѡ/ W.kytV&bx,0W `WfTP6̶B<3Ylf 骈b@4@1[cn2l~[.kIӹzގqTr]"}oikкE1\}Do<1e,gP7Ro\%h'ER;%5yJz(NX1b[ĻpWAJ}5nY[rMHרl3D63 9[!~n%PSffOdvrloez^*;cM Tl(L !(9F^ l)~'F/FPm ~i6aQNh_UgM.=Bk>;$DžF[ׅ]qqx57Cdϒd'DUՅn AR9@rUw*Bl 8מAػLbX2a,޷LDb V&'}J[%r!X>8*s[0 wK:KyO r3;u\EӗUU@RŻK(BF1G\m nCެޒr O{tsp?q{>j;Ce%Ort05?J* Vm̴U"cejb/9쟛ި _bb?o˥qLrXs\B^9VcυY]ĭe#1 )gzѲR6Bo X"o, `Tg$M;Yۈ+H;YZyqӅx;k8ߨZRjr~M+R!&k^Zɬbd#c48e6yjR *v FS%^Y DYW)vV@ }v<)!?eSW(^$fFH~-I)#w-C{ffL64\hmxP'Tfff~;Ex/ O䈚M$>^'=l}/BB1:Y{@bn@#K\w*IaT~:u Ѯ`$(# -NNzƒP!4TR&Fx["fOfga-\*%}q·@QKlKaד |~ßUEPj*p29Fyo=w7lH"je81)e}gƯD4glZ|GB"ǁ 5 >AFݳX5ٟ<Ywղe:*S}q5QS-f/>~%Ťi+0_)x\N-ؾ6R@&63w}¼m$Zޝ=)ևݖ\-+[ՓZZx+]ȹ{ '~ލ|{@=sӞH&ƪd(<8hgl]R#W^I_į,j+EmTWm@ @ 0,ĸ e0XrEѠhyQxVMwqѷ!2{=aM9ka6Or 0*Dqr 6ƠT`{P!Mڬ㋞W#M QL 1Vr6罶°M ڨ Ko#ޫhpvk&?Uw%YO=Dp.dܖVΘ#-zI'&'VJ2G5C+oS-O.>4 A^JX_5T&NeE5 N9l7:Kؔ녹V!giӓ9*_ݹ E??fOa 7Op,Z0dʛͻu%-YCkbmVWYlҔ";bP$ם}Fy)/0IA# <hÖ2>C\m [s;5,s`=̏EI7AEG=- BZܻ袹bG 1c]#7zytmHËy8f40vf2rT;s_޷ƾ`K|m۸#Ge8Ds`YU]N$8)$J 3 װ_ke')D0n>&ΰ>,C (@toGa6 Hp>J0 8x $ڼ18̕lK:Oo4P*e hve wϯ>:#UƬցv, \(=}#moU̷S}S>>nK'!uM/Z@/dvd!Q;x۸aѲZ [r/Lh!2z, Bk@ :ihL Fg|xX+.\.ӾZhδK"~Ú)*yUI';(L\VxdDI׊-2ߐgL6Xe3w-zݬ8rH)*;.,.Q,p>MFȸʢLK>2)BJ*;95Qe:oz]Š-IꓪRX56of2(a@?D!$(TSݒĞ/hwWuF*oPjb;F ,1;5~_sw^_q=0>[i(ۄm-_ˇv ,g,^ϰтq [I~8g!쵟[433}lքkj>pdz2 H|30|L9+`` 5Yn«`\<Mzt~=LiwyH4{{:eK9Hw5u[E5%!ecw5gf+ =@YﵓDtJUѺH1].{7Mz}g8HFwWwXޤ!T/@5=mOè!i?l4vn_m0AF̪82st^!$o5 %jKh5>EG`}ԏ%Yj0 -xf6'O1/aUtb[H %p|gJ"hdnqh]E(^@\m+`Y=KS˂MG~ s|iR2n42)M2<[h )Ͼ-h TLwq,kFÃ[Kxkƻu@{B_%௖0EwB qƓk4yҲ{ޔIWM%lHDO(f:Gbϛ3xc,2A51Oeg8P%j}MF˸}Le,(qtQT&9,& =ϥxE88#-vM$zZ>>a] ꭐjx?}8)^?qxrulZCzd^ÆLc 9P2/7\9^jOKE:mE&Wռ*,5ƽ{H g Qf7D43gX[MW׳OuXpg^藯<.V 3#(. xb<NjZ`eGwe9~RPFݱe^cǜGZ럩ϮqzFW'D왗v{ Չ I-pg['`ÂJS2hDEzκ7&IZNerg*) h2 bP,V&\V}.Xj6q .7wdXFd{JtgDz { 2ٖ}2fՈ9 5Ӕ"0!G%,t;S פR ( +fCdK ;X࠮b5I ${6J}񊎮^PTTH;TNL*$h2k6j߬_#~.a5Q!騳o)ά"/4?brҭ;.c?2̄11Q]4;sf1H  qޫ|,X5<9t f.vE#w^u}) W9_R62ШZ3Bt˼j(uH啋y  ^K [JVny Dns3fgwϖ8pK_ԟvM|J}ˌv\(-s1X8Iz\KH3Yo74槯yi1?Xc.zOQ5فDS4?p}>~wLǰG*#qP6k$UNJۜ \ ~<\}~B{:) ݥ~ .3sX3ѓÅU8R;" .̀N-9"0 ~ൌ^MUZ~3xzB)g#?e?f5iL{8Ô@[wmHd\}.(e¾w:'>T1"HŸ˰}՞s)Wm׸D!ipDdzE}٫I't'LϓP|j̨'7̯TuXY+=P'i:nS%g>^6A؀<=BSZN )-# ەy0ʹ)|OEDs3N8CFC^k6i/r^<3kXzbQﲁ { ءgbS7S5уO`o{|$6m\(e vlD.e*ȌRE ċM+5zf"wt`$4j/s]3m8'73i]ߎJ,Њ(Cuw.\W{^zB92-aO> +FU؋P$%; Y#E]],H%5dR¶:G  -޺=,!'3lI*mbv>dD zfo$7UE,C=,U) E đt=ѵ ǘ%}(%u6_`=u՜w#E:Wп;~ŋ8a i<.ŠI,@JHN-DR\`:/ UΒ/KY~ 007g=`?l |'4hSaNjq'~.8C$S KcC8Xx]5v@qJ/t"jP&`p rfWWlˆJ]ulDMj=t!6v{j.p4LL ihX]Dd֍|u(bg Cָdi'c-$ Ձ Yت<&Ջ縄u+זF1눳zk0zN:;(,/l B}T S/5nCgƛ9#s/3u+8K~"q8 SB'|D0'!A|#')I;wZr uV!;GmșЬX_sԭ~ޘ9m|iسr%W뾼d7A oX1?dhZLѵU͹ @bj7eETpW"u̡HFX4UDdВa|Ji:WC/:=! qp+7C -6YJ?u~fU*L--lz>aBQׯ;x x£02El .<}-pXph̕պBv,RW4Dt8d#ϙBv%pZM4Jaws]KCrgDv0h{p^|._"zTN7RjW |W _'SQ۽|ڦ`AfEB]5)Od_%霕&EL`vm|FAMuغҠ]S"(C=#gTH٫Yֆ wG$d<>WKڔ] ":qZkq)Uԍ q roʥM/#]ƍcR :s-}X/ {5KHֈs ';y 8^gKW3r zWx*nհ{\[ǯ/"A6u^KQL⅞7[t=q|_M^N_iR}RX_O໯9/(VDuy"44MjEe׀(DBe׆s#rrHPO` ?Z"rVe.HvqmYCj{~-31`#is|F[>.ź*>0}26[""q`˘ݟ, mjGBǗRqA^Q HԈD], XlJ,֒`w@axFlƤ P0P@go+*SjXSg[֕^lk+w}, 2UuQ4ŧ{,Ln%mâgX`.- XbPMc#:!q$'g^FӘ@t%6Tz{~ | ĉX1.rxN{>6cKe~E@J {fȪف$G Mc༽-@=Cڕ0@|;v6g^lVVftͦ]G;.'g'^r'3, U6əm,Sj+dUHܫBT+TdqshvSD9yJOrE[ue&2 CzLU"!m gJ@j0͏Tt/DO9]]W𬟫+tGPlr9[)us+J Se$sETFuF+d`_ p596nV{ q^VX`[/c̍32uXzg:] n h ],а-I%@cΩ].VTsi @rKa.i+qQieAPjn|rB)"$tZcr-rJg@0Y?r1[d5r8o!Ohy1@"o@oڠL$A.b9P,!Ōߍ2E]Tr)ÖVN Jw/OP<0G DfcXҭo ҺhӌTc5pmMPA.&-$WRb-$z?AJ9eRy|MlufcۃMC"r Uϰs-9EX~B]G<V BG GfPtd [w2#%V3?9jq>"B[$ W *$1 cR]ZMO6@Z\Ou1b~:C>a6HլWE2nP EMu!Qgz' e|uB}:D.ܤy^pP_@KЪ)WѠ>;LxBJ*^52r:MNG̠6?E\CUqi^@F`8/cE߷VfrO-vx0)bYp ";%p}R_Š17h1ȏ骒]F?bIl( ײ\*@C"Z1@ANg~?`@ɗGZ89{難fbDmڑXV`-*Ʃ$ս-=h1}@qdɆ ÎKc^"s_w\۬>1c,&GQ"}ǿ\7ϱ@Гj=h޼(avU?~frvhgtY(Gޞi 郗U9!`.\nv#݂U#hy{\k{z?B5;7yEt6b/pqSEfrv:~YM +^uZ.2bA!y"APdVYXJT6F)k /L~nb$lվOlְyoġ#e3}n])J>1o~f[h6{`sMȉ8 燇~Ta>Q2xDLG-ᓹvj58g  98}qP-5D8Hk8Da @` *\rX0:՟"ˆCC:8ˋ郞 γ`м6!%My'cq,Z5׵X3fpo?QQ"`vШ~`,$J) ;Rr4E*v cEVa ?#p-$M`K3ŸfT(Ա}Fg\5hE> V9+^|з*. pFZ2* pI02amڭ:r r6Xr톌ڂ3}/JQ1=(FV̑nLFJ;0{tni a"Lϕ́2FYaiD$)}d]}@[D  Z9cUsƾh[Z?Pɣ!L  GbL{ZVDu>v7,T6'xZ\q JL5*$-< "!dΕeQ=Zw#o]Alվ况 D|w*C;I +Y=,p/zɛֱʩK2m\RbڇCz@~ZX#ѱn ;ʨr 🨛=]IW=Z{'5]F.;gH:&?,U!.N^[_& |DrMzDFoav5NKՊvP"-t MmZ?%w 4`s3 (3֩bA[)f & lPW} 2I{3 z5 3(,j)|3Hz?9묠 '` ´G{Ca]LeΨ=Fg< )3\8oUӬv" -Fe7 < 7P0pNUv c3,KI@=“jpqm[BbIi\5vFQݱZj7Tx `Z*~3reꄥΜx1V˰2Z!1FB!`Hs0O#|@ك0^ܯ>\X7ܜf$!(oEWkr;ߏ\.>]Ҕ[T .n+=[L܍$@WošCِ. ֒:*c|?I mԓ xd!2e=ؚ ubO766`oq] mU◪0|w\AehrA=nf 0EP/:j Ux#!&ImՇdſG;=;ZLNdC mêT݉Aumϝ} \z}l/9N~&'6+M~;еzynv!) h"6yOEQT$DC//: ǘ&XVmzpCnxn(";x\7!B-! 9dS̎tY 3EP /4vȈ*7zRq#-]NiU ] $FY)_jp \Nsvf!}=\Љx2;E~'riطlWH#_cozDXIR~4Q ;]8whf5G] 0)`G`,RȅN |}%;݌ vFZ/ Ԟѷ~ҰoU>6_I/0iϾ]{;_q f;t_*9IDa 4g%^"{$r-}ɗ01D82&=m3J7Zpن6`A&_N4ȥQ[^h) Rȯ 8W"0:xk$ ]}UvJ"aj\i iÖdčͷrWO7*I@cc:)E6 z2z֖m9LLWzUIDԣKٲ P-a> P XD&QDyae4D[bKj;bt@ 0.m?N{ٙ: z%zK G<@2'@i! װS Ccr: ~M R HƵDP(٭_(l2 ױDB` ݿoо"&c2d#ױWX|٨PVc. $K~yvs|uz<:,~AkԄ*+Z٨jotQ܀ꆳ/Cf\,HK!Wig@ n{8;%nbyχŅਙɗ>1Lc3Μ R\l)n|.𒙐ٴGQ\ "! KD~$VDEX['0R"'T~t{g)u:\lyJޔݥ,!0Qp6 IMc)m[.A@SɣB(HޛԷ{2|Bd91kOΆ=蒤̩ݷɂ%a*D )(1H4fy*of}[#V U瓁K2k*] Lc)*`CP9Bo]k'7WgK[VفCG0FAvhxE>[C28oB(N +|c+BIpZr̎hٰ6::<{֫LLQ~3ٗc{t5< wi2ܫ]%y>s:m[K4ԏҰkSgk v;eVo17/"3&r1&NUm崔n×,L0-nl>E]o1d/_(E/X/OȨX&J9E.?+A+q-"q zbլznKEwwCu YTzhI=j߱kl.]Ϫg^wGt&Mё&D|m]B(ɝNcRIeS!ӁkbU% 3{4hw=w ^%!neCnf@OGpc/+Tp~̏~=E#mR_KdH6(jkQq%Ypa83e{vOCd,SH֛cz##z +hwnԟJ5{^3$eDXh#E@Lf8>ʮx޼IA6kfT:-ϑ\er`TgS9Z72 4.l%#?c='R7~׼47^8|PebR>2 =#ßx{R" 0Izli#2zVFXUÙ$iuȃS0E&Fl3R{o΃{^u٘ms$ʶ3Q7hԳq»uKBye>L&yoQ')Y HbMS T&ljM7ipd.<^#Ai&Tp AK^iCsHC\xeΖ\8͎ zRiv?pwyþ_#g[2; <1ju<tvHjfg<'{\' R{ưٽ&T xtJHb! gP69x&0 O{H{VXVriq {/eXZ 3 smR 3P69{Wh##FaIT.yt|vȎHRFHa7:^BuB42ٻřY?ipB]kμu8F L^YKŎkQGT53m+ǎksBl.!EU5wIRjpuݑbypg9^iFpӆqzӒ[s):&vLt%An<5G܎*,b*za[EpP;MU|e~b> Ҫ:2upc-΢Ȋhh^Zǁ 6t##%L;ʧ-c4Tb]m'j:0yr"T "LsnN:`~|6c &NY8v>{9l>:/,!L+hhr P=Y|ΣڔH?Nd7&a"bM(žQx[[ї7祀zIx̟T~f2!W*`T7ڟ@ېj m5Mי6ȕ?3ΰ]#>^ Q/ vdGk7nrh>hR` GߨF% ;jZ0=RzSnpb3ң $dR-'V<{CՉi=LlB=iӎr' l6f׾pz*YĔL- V7A851q B7Z9;<1g \֗<ؼ.^NF"a_l.FxՠВH&hpf?o R!}arRFhi-+R+rc K 4"fR?a"/nIWXbxSG%qQilFw ev0}n;_E_s.WWz%=feH'T7x͒Ņnص౤j65"<_sg ؜h(R"Z9]Ǩ4b$rs|7$T40.Ȯ哃=f#O7-`eh`@ڦ qk5'4)SV熈%Ar4Lo7bŷ[eD(tlݜq[3R~GMpVjZ/?tx&4~VI躍o#YV;Y۾Cu6q=N̤CK& f*[{T{ hy-!9ʈ[g' *pApMp'J?^ňۗk]Y8H"/Cd%]^ZrsqQF swy]l\W>8w] 4)+q-uذlճPržòFuXkֵi<, 6hJ9E=vd5@P=^aIPV^Z}91.0~Q3hM$J'TG T6nf66UpH[/h(}.}N+:Fjmjd)ά!r$zͬ\&7T<%;M{_ߪjSNt5q[#^ᨀ,;F)u& Fyrḏ8w5H@vTL[hyBv3d0IF HPKk^H_)\%&v%9ԃ[Hg"DO'kHH¾۽Ht ܙH.>^"ZhiuL6o?0P#|2vl5]+2Uʼn~QuPZ0^?={x8Xa؍+œq]d{eXkLTEGxE 3!kEu[JTL+6v2 P C ߲W l~ EwXwg/.Ӌ;cʼ@DTLΩ!}#\:-{I/ANOitVB{w^yqz4&P˱I:c{ :UJJdV 'jD2 '|wZzJkr QYr'~ N-1[q\+EMctlNBӨ/'rZgLci>Ыb8-ظchHK9,ـ{5TL]/beƔG䣴}~*48xC|p7\y)ɯ&3vr,\FO&~j/W|M?㤁~9l=\+&}vBv5]9;H43FAʦow{ yBGo!KT[.)&MSrKy\2=ErW>M6]O8%*c 0ұr*zAdcETFYoW]t`Ed j7E^_kʻs|txmUbťb: /[u|<1:n54']j^OQ:)G&}FHm+{piPm~ YGy|J:Rh?r2Nt{)D~Wۅ x/n@]SNbpV@{j6:,Wm  E``UPqZ4>C5a)ō49=^3M kH㖭rre(gT2 '>I㓴"qebIFE$K'a+g>N#m'4iIׂ.4׾vOݥ/+7O=Pxr~߀AMyxM &<6E/Rv7&\p"3Ζ({L밸"[CxTbw gp"BozÖ)hIL2G]xb@&k90yɨ^0 su^ :siDNBm5 H͂-HoD_8o:t[w4n쩁3Z_cjhai!{Dm)Z;ܒv<ͫ qMſ*GC88@v3EmxI.7ue7gV D277<{BĢ.ZsPjr_~DjfMbpY/8e[ږm u>Ytke3BY\\yHi30ĥsEމ5 UdByGL@"{8'o3ɯeV5aU{)Gyȗ | $ Ќ Ӈ*H|NT74+Nds0ukQHtҸsz,?PjXR`䌖gbHR}OY0GbyS(74KaoBEZA[&nHE>~Ž#}*(JJp ncP]3R|rA+=(O`A/0F^f!<ܩ73G ןZt\ #W%o+ߥ]WUL%ZC7m`J"pg;oۚHClȼ xm5Uv` ހka˖RڗJqKY; SÙ0 (*O34NuFb(3q7/HlWf"qq^Ұ MC;`[rLEX=}OrUvj "%w:UH~g<9E"~BJu>˼?sJ]:`@,;|!N.PHg}i (ŭr2by·3~q mS*uD}FS"9$FQ9&=UЂ sS8֤+v\īfb[%/Wz#-qf_k *tW-o%u劻}43%#WmT#ۡvA:+O"ID%%o^*)Y_W+EǚWGy&1|,5vd%pƂmuHMM@~l-LW#~BcЪH夏&Jw v~LэGh?|ݣYwK kn!?\ :nEb4AbK0\|t|Ն7Nq{(9MHMEY|G/S į"kb.WdٍmMnyf@Kx euw ;;|n`06):-%G xWx#:ۂ*9lTRk,"cr6JWpQۂ d{:R5 E)%BnpA$ m+ج«ZOo7N`K}*Lz1T*;\ 8pp:T)J\1molv$'jLExߋ'>ݑ縭BE^Uy  pK}%n(wXG qs8Biw6'T i/6llǕ*,Bg 귽%+dm0%#G[~ WcX d o˼fX-DQDx_iHk֛ '7yx1_i/d0I:0 IJ=Wͬh>ۭa҅97soYjt,ݗb/eUrȎw_E@ Fa鏉k~{[0,Y}`r:5e0!HdX]{^s,T0>[iKl`&("$vz5k;(>ce.gÝel f ڠ& 9 $D[8O`ks =̲& scښ'YFIU3\䁃3b{S4,_m;ÔxF;i VcҾp0ּ/6uls)H')fcElPC*Yb\jX.BS71)amk @/i:o=e| ?)aЊ V@WTZd 5-^A;  __8NXbXVt&b3rD'?SHp} t;"! C*Dbswѳ,)C&]K84?Vy4tI_*蕸ZR)Od<_ao4%K_֐;$ MZ%b)q. +^ZM,ɞ$B$caF8]U>_jub4?:*d[7OO8̯2cTO5FƖ/tA*e!2[+_b0xB=9s` D)WfSS6^XyL$5oĜ-[NT6Dm AȎ׳Y-תf I!e քπHCr:쩀>XiˊtQ"\8+Y@iH-~tLYKޝQ;Sm7PG߃8&d/ZZS(ql~ =-fÄ^ʸ!_*3S_j&{ZWb5?VEeօKe#12RR-cu Ltư?EG;ׅӃJɩybR[{o($8!hrlX.WO!c,ã7~!,5aHH-;^!E. =XQ >uNT~깪%[8m[jl*k[.sc,Z۟BiS8N:DPN3x.VeHBZhèiĬneѠGVON(ؾ赺![R*G oȴxXUBR5Ԯ`+B `ږ )Fq{cI=|ш1Uy缦$/B ~θR`V&ݻ ~_)ANoh3sjks>.w IPL)]T[ sZg"9Q+ϤHD5UiE%t=?Wh/!y k;ô2+ |$5Af=5kAĒxtFtuZGt )+y3Id$ݤ-;=[* ū'mɬ'v*ﵦܮWBįqAȓs-)7V6ύ.Vr:~$x&!ϑKLtdt㧓spz'mS EzlՠbrF~1IeDe/9ܤ>lexuu)<R &D*J'7v4qšW .LFöYq-)-(LOf!` -Zwg{>oHs@G.Q*b| zEI8-K]N~)b&+kT6m!,nٓ(bݎvu;,\>6g O֏1{gYsBNr+,5xRnWq<[b~UxVALI1\ C6i3y5ldaY,.VJJ>Hսׄ$LᾫIAp1 HtȾǹ֮> Z)p9J9,AW]Hζ7wc2uOGB>);57vqT\FaX9<#rG;qs}fѾ3x‹"ݲ6XUw161M`v#8HhАl Nx잊Q唨s|tȕZCX4W2 H[02Ş^NƼU"b="M+C|4)a󈳖\<+Zl{UAzPxXa\kE)sz}%_FX cB>O>Uf FDmIB~b 5A=k/iZfժ\K0L,M5Vkn@*t-Á"dLz 3{s@᫝~GUO-1!bwEIo0 MnE\ l.UbNa#d<$as%ÈYjCG 5A3T_%wWHexthߨ4`ch;M0l&A \Z|Jxݑg>Ч :A/p.bX~:;YRbiQ'wtr9/p:=sm3~е}VkѬd^sX!_2VP^xS:sFJ1k[xq]~%W\c!- <@ 5VY'\ =L2Uٔ&Z{ a{BEG4 GUUUpZXYX-G]@N(q-YIA/A="Nh0yo3ÎzmlQӀSY92v.vo0-w2b$t ra#V 劍3W9Z;?vBJ{S$R9>nD|a DlM͆1w5l TӒ] #mR$dNY׆= %ӯ$ ?Z@N;yFx{i|Q k)KAerX;vͅ{y[K,&NeHBM݇{zC28L/B幊_uV/fƢьcr! }JlǯeYʱz gĜ UcNl~X˰,Ǹ{g6<oF 3 2GmDiHDv2t ]S5pPB*@@W#]IdĘ1vo3,c;c"bןxs9+}W<E_&]}'K[F.t)ʘ%6HJI }U6>ڏR5E;Wޤ'/lI_W@fSO!u@1¬Gxu%6^6i;ʑQ8Q`EQ.Ȫ GO/yj/H{)[],%luK*W8)}1~ %OGs]~W|ALR<ǧj3ޯ/~tz!/Ya gdʃ,|Upʧ{+qTa>[k ^X NC@&*s=%yZ8ck),67*)r#`9FM F.U/Ta7ba)ܯ$}v֤,^?kf.ܝ7d {ӑ6Ȁ@K86 5mI%oTكk[Ua'-P͊j`I-#Mh9ɉ6S(axRiSndf~V :] 6>_O2R+po*O–In3@ο$q_R KLDq>¶ꟃiU{2:7AH|騕~؃AdF,iDqZ~1ңLn›} vd5#dqnvM'"tǚRB^bR֫`Oq5`j\$R'1ϓoV\8UXY |Ւ'6VǢ[ _ ݳ qgl*oJy*B?FcfVF$?3GseǷ/w1$sаP2:? Nf~{%V'0N[:dDS8w@_@N ٳuWaf~ B2&+{A~i'Ý,Ӄ!oڪ9KĀMiU4ȍ8a5JX8CDN9{f!zw)AXo m OHw A{" 3P<ހSG,'^L0 |F'8 !z8*J=P=u.NP.dw?ؖRUˠ8k3W8n3_&+AWlX$H9*( > ^wX#s@ #FBh8h*?Ҙ tלHspqۄ{ZU̵Aܢ)!ҝYhҦythoػx~j;Is>wí6KT{]|P]"E,uQ*)[`^a=i6eK iZ;.ڀ5Sb3 d*sZe/JM=O}JMnaU_ѷELudEJ{u`_^co#ZIF3[d>ߑܫʯ)A|2ׯJ(C tVҖR0{FeV?f'l-[{۶oZ"S& ԇU|㞬|ON=zS:r.\/ѵ~3W5}FDH8eC5߂[g!-UOJI{uCA5EC룓aJ֗;c̃)ּkx1(jj6\z!cf̀@иTƒ!oz{͇J*oTWͻ U])bE{5.{=Bp0Фc6 $Ev9Fٮo{Oa"^CjS&Y0 w"ыc!/? VR rfዣ}i&[0_c8^nJ}{ tB[_C)9*.b*Gp/?1!EͱɌ8YƆ`6H稅6 ,or\I} XJ (W]W)!9LJ84MQ>cK~B%)eB"w ,(% ):U"),gLgf ZF'z3ek_%ٮK:ʔrp5,z?!*9x4ƚ[a.V6P}MJE-p5'߅-˧RUh˰=|楎śm=%ϖ'O6y/xi(Նb-ZDo,R@bl+sVR9M7\6s WCzϜ4 PoRLm8[T="i\ _ `hS(b㠛><}3ď>~*P,QqI"JUT#aQF1T֒\B2Q=Ԝέ8s|' M8|ɋ~;=&h7='BdsIȶ@:S_^zþă1\j@/$1(Q.wLL_w|->tF9(mDxFZzTX?[÷9"PeCU1Y][u,զS5HFx~]C# fvCş?̍V evEYzmMTӽlQ{i i}M~xcBxͣ.W^=5;.zGuJ :vÜxxbRjmrɜ/q1+5ěK1JOmVufS9![}B~0;gPh GgvC1ٟ2⯛nf7^MzT][7a ( A /|($,e7I8B+)44Z]|t 8 6a('a9,h ^r>pdB<Β;# n;̚C,Bܛa!?'m}뷪SR>%9I9;wHlSok00Ѯye7V&LĆ^-v,CeRj;a -D߸`\5inU9GQ=N#OlFGS [|K.K <2MpaJ.njO›դz J ٧tLCzYނkqLiEA)1 05x54 \[:QnD/L&mtub 9 IS}F'Xa4Ocp }>A5D409a+nk dO6|*xؐ|LuĢÐH(y;0_Y(p5RR+Yf4hL.3vIIt;tzg1QC&&JjR-;P[(Q/>V&^ W6"q1._aE Sr~OlJ#sT+*8TIߩҙ7iW (3ulr/"rStd6TAI,5AO1Ƃb,n&u,3kb:Ҹԗ K'm0^.Ί<ЍR,,DM! 3L(_"_,s(tp3G(ajq.;3s=,uxj2?mN/r(0VU<] Yց"n5OBPb)MvXV*p\ʵF7Rw{.)w XWJ_.MxsVH62I Ǚ'8EnX|oqئ' Ir6Kƭg lta8db0g2S_Y

߃lنJA$ˉUΉR3f]UZG_[WVfg'VOvRb1,pv:֣Q<BՒ\nX'؈dWR>DŽ6Y6MGsʱ[0֘9fE=@ .5dgܲ"Gt+4ҨC`^>c8b#-j3D+v+s], 6^?R@ԥ~S jbqn P叢6ŲdU \wK4̞1+q,·>?<"_mF)nL]1Ha]:% 2:hLWq0 5f **HZmԺN; TɗbCcn== T:}`\}ͽ\k6u M,7߮ܥ j^JVJ-&Hqj6?GpͶ+9Qmme}vw}@H;GB\nL4I4er1TU|򌭼Lɷh;IW9:\n Fc+@wbzTYGp+Jyx3̨6Kg͝nIc 0ek;Am ͆Q)nA,{?Tid= lBXr虭Ֆa$ o)9=ujHXŨEW Cq)UnlW@7;w1/K,4z %DǾƽc=e[|`^!z:QQ75, cQ-kGEPNqfsŲx!ޭڭ}h{n]oz MS߬H%) d"ד̡rp,q-Øؓπٴt7; &%9S~_iv% NE;̼vj\ Kd*8L(WԪ<'vhhr׋!g>saM(TP%dcbiFn]~0җ S0oD6]&q}N'U%.{`yp>\$,۾W Q VR~A]ڪm)F+2:ʌd]TsIZ_6:y8T\{<8#O=h@eOU9ԩ fҕkhl#:0;-8 kv􃻔'zN4-Ipb`,yjCDR Dy)SNq bI1]yBoO&S1g@heR~<$$ ܕ,뤉gJ B*αG>JnT70KX ƅ(aL7p3urAne, dy|Wz#Bm@f^V~L0}FZIVSxفyR<_?6q%*Z8svet03t3'{RyH0"Pge;{z$f!VI7TD| KZ\C7%X`_ EÐ*J}?HΘxք#x8ȃ#(PVX҉k 8PHY{6uȩP_dO3ʄ50ͦ ((ܜ%C2*g&!7 9Q5KUf*X:;2 4VaCyBKVCЃ`+++@~L#}fȾ90e{?L}\ҍZ` :d!tj9`Ekb$T ur3dWTv͐= jbҖOQAߨ砽܈&'[ܒ [) ` =E?S1EԵTƮBX`Y`tuc]^GqFJν(O VH,Dm@Zݎ j Sqw8o4VG]0(omhBI\kyM+*%s0.j˺;UO BARSk$\),-h3wn{D XzE ',q('? ;3|rF =fb#FT :Yb &؛INS3χ=|J"[lUA7m~V\c1A/}pg#q~x+( VM@]X!`RhwȊ|^2ĕ7 VD+(wϧCӢ) OsoEq BbktEq0B6D.o?0aRdxx1'_y˺3+tJGco.8 U󉆅G=Mæ{dCvP߁Hce5A[Y*WQVݚ(U׶=6HJY^qa4%Lj8>Qn{ 5U_{ F=6JSA Fs,R6YS8'.!0d9ma8&A[鯷kϘRdlBqAۮO֗ C~'RZ6n `λcVuaF<{,廁,m>I f{w^È| |"_)6狿$ynʖBۺTtQ Bʣ 40 Ӊ UZui3yʃECT|49_YViroO<Tָ _ȲG/)([L*=M,TY]ߗ 7fo5S>y& \Y0}יNi#|i4𻜱-`Hze 轷jimhQ淘rQugŞjB\ߺ]@̸P,^®4@.~J,Dl4[*"\o~%'j̻5}Hߥce{p)XQOdM< z脥kŮMEKWT-i ^)و^OOv֣omED'FtvR[."=>g{ 7uZ"7' 4Dم5#Ă.'/cev&9E{&Zb`C8~"NW,F8&XD0/;Npfeվ``YJ*mpXU_VXi PKDfLG"5ҳEiTtSbq ;Ե1 ܽ{izcjhV45̌SÑ{]U+~ʕ:{5ѣHTA'} 96I|zñ%V6ArWW-4*L|J6O]wTTpJ$1HBPuX-k?E0+bXs(}SFaW4i*7f3`\[pT}s9NPlYWf^ӈ9_-3\O)jٱ?X(#"]a媹uWBoe]>p.Xl~( k Y1Gd'::IB.$$"TιŰ:T}HAg JJtp`JWKX!Dܔ玟8U.t7+#ֶr? 0G"pߴcΧNK W_y3RD(H܅d[Cx 9W.Z!Z]mtFM'ӥ #"t\v-کk*AYs-׼ergй#(?snڻ''lJYVu,uBT@;ަ$tܑ{36̱j%F;dڪ;T Qw4{XE4l],UJu" (]#HvM痣sZbm]_ޯVC6*TAx0kNꀲf%>0k/u"z 9c8,3,qBKQ9AmQb?Z9Լ$BGDB(ٚ @"M!@X0a=o, o 1_6<qŭTq+a˾ٔU@2#_Ȑxʀĉ3/!;#/S$b-j|[~Ь'ɄtTXPL%v~h KU p&[,2gx]1iEНN-7; Bnw6l_>!3MkP fc¼g+۲pC^D՝n=#2 <.H—.գjNɂsvkB9/B@E,#m5tߕv}j^0S9_ XB(0R =MR!R צeՌ }^J-VQIY{1}1SQ @e!ȏV\ ӝ\$zQZ}Xg;\YԼ;V0qV̨ 7i,c. 4yV_2+1JR a3 Qh8x; iW-[ΏkAbPߚ, $#"Fսow.LL{3LdpkO.le rm]V`(i'A1 nUo|Z`D:+6 eEvSg  v ZJ2 uZ AR76حg{-Qr`Q%__d%C+, #Zy⣰E(2gDWi9@˝;M:rOJ?ܶCdؓsSPsST\\'^\1 @fV֦z0ˆ" GXT&+G a?G^>p#G>!}q'p~L S(3g.b*~u;㌖.r- jROsd_ v0̖ߦ`jcѦ%65POa7yPUn0le:Rص$6`dӾ:d%7~`O,e8m>ߣ1(HAD٥UKSe"![ٖ@0ߜ^+bu(tIz.T(5u] @\2N A5vy\a7; t\xt9υhp6MmO,ZpyoIAM8I:q۔nc!x} ]8EM=iJ5bɧT6zƹ[S?W uDIɂ=? -\(Q\-&kX-$JK{Ʊx8>H{IC|^ءٴn4SUwY@Y~F'ľ!WODi:zt 7LVHoqu/ߝfܛs<ң1^y0DBz8gXl3lĶ Ff't2Fq%iG y!]&aՇ;xIQ>)Bs1 :Y`!SX뛍i}YV78Ϝnn_v3"[Bzݳlu9晦`XigGCVA݂2X !r~bT cęSkÙQR'U5B@P;-aʜ8*yMvVhAB=z*+\z7odToIe{7Pb)>"=^0^1 ؽ("έ֯,~:y&w)?WY;WVZ_Jr%{.;35?韗C}F Dzxȝ-ƽ8J[>[o__:K3d8] Qqbߤa4Dԛdב|P~nSNO ]-Дj-)",-&oS%`ij?D{@wt:,{(Y?ԑ=|zI|6c 1ۥ?\!ZH?&r ;<{|K # ?b;87 xtqB`>[uDXnS0n#7J|Yŵ2s@v " : Q@2ZѬA\4Mbz*h 2AF9HJf% MEMz֊TѾ` Tb3u-R):owis=-G=$YF= :%3DAޯQW+;o"Ml*%tLCn Gڕ滦C k$6uэM/X5v*7CQYIid[߈"Fkvʋ-t+,}L$k*R ~WUY«z= @h0vnRTWBZK1::;znXf6$3[QzMF* ϝ3g,wv.3f.(8sGa]eHױ"b7ʩIbJq Y^ǀZH!+]E9w}D(~r`{*T>o|F AVqZ-CeCe)ס BJȰ3ɶҘ{{h<14-P}o]G1J)[\YZ<;=OsIe'M$w 6%t EΈDT^Ђ "#ƼlB3询e"Y1BL 0JGt/MJ\j`hH+p;IsfZ l(ɂ[^hjZiC?7~[db24ć3)Xd#p_He*< i+@lw ?Tk[K\hm}/W،kSn@)Uߙ)V}`iئGn,Z @a%h4N(:2tXYػ#SD؟9Xfʹ.q_@!xzyiD Ô{'y~-`HjcH~k6NTl¬,n CG C&3/. x"<I#>8wWCj;6j/镼1pUK15w qHEr=+⬘O7TU3jͮd %saZ*R{,`FNͱ$K6o0$ץN!6Iࢀ[R"C# ;.}SV}+xp"FmS5>C?eқ jԓ uo\e?{; ՌU)aQďssL<``޻ݷJz#"+8qALJ6.N~f5p2 ɰ~ 5(dMV"]I33 v*_/eӥg _gʐaTnǶCes.Tˁl, VDӷ>=H@` +tƍz"2y!R-^sz} ի:$.*> zOFf(gw7cKF׽XZҧڑMʤ~R40U& ZwdH>s1)vʊc߷B-њL#{͐iŠ,1])NBq}(gi5SfC^]v-z =ߨɅ9jEUHxXU|Q>8EDDz>?Bt\2P˅f^*ufT\X9!!,!$O@׾wd/Ϥ]cp_;׾,3;iAUHܤVQ؄ )AtZ v^@ҫ F5 Ms$gv$T @vn-3"ymjE YA|k8P+V縭4;R ~6;JnL7o˽)V)y4\'M¤; Epc)-rR%M͒۹;o>1{K!׿K~T!PU朖")pK=Gc-E2?hݦ:!9MvG0egd s% xKyjOcd1,A)0HՎJ![aگwť!/SՕ~K\?v6f`KXq_|XZ)C)(ecZi=W+ÊX:J'}ɂ֤\EB^Ъ~ BwT?D>R)_qTJG MQF}_(z?rǶDm_neA.Gdm=.%bV]RDZ;6b'N@g:w1AFpQC+_euc<7Mh la+#o}2x+Fh©J} s%HYlsLpw (Am :X0doޚwd<Bu( YgaT$4[֍sl=.Tb)Gd٣I>(b(zVe8i|uZL4gR( I7eU)ۿp!iSx!0 @dM=P:%t0οV-W9w!=S5l-vE*Dq4 4Zյ[vxیxFDv/h nM(=T=eD*|+KVҧOZn,^+4`/D"nV-xg2K'WH`7FX?⩘𥲓}8drb&ldYk۽Z04zn_\B0nڛAS*`Ϊa=X7'W#G6,]V"OU րkǎc)`1H0%[KTÊcHޟ pZwԚK29` {J*.愡 'pT!j<.7@ehQ[^"LTL*aCDg$=/gj6W,BP ZHiS6 U9Nѧŋ\$ zB5{ެV 搮g*wgl ]w{=^S7}gVinEtS 2r|+J0]A 5iL?KFO|)Ru^B%s^VIdTҜxZ58IJ2٤Vc`*"5աX;,yVOO*AE)YPf9}B <0溘zy^>[BTrҐ g~SWPRcϒ2u \9eZN,}>N+#H<j)5?ÀnETÊ|@n3CRej!E] OBZٴSȳ9 N>417@Am=r͙"w2?+bH%`er1 ,Ԕȝ`'r0J5T?H#fxJ4RUAФ. \4Wh7ZSۋŃF~\&.,Kxs3ewx-A6*ojV o:`V~CG4ܬ5E,5ך}G+@_*Wҩ&Cm͉}{q2^zU= KA U;O w? S`8 &eO/'y@:;-!CgpTBf\%.Ӷ͈8{ܰ0A8a"-NZָPwݗO[&?,IY+%~2f8#HmpiX%x (s:}) sd: #(׆vfx9*oضadK6D,Qy^]~b^F!EBkM0C!_^{v9y>U]L5@:qwpļ:q8Ĭp:ˆD#!C+a|6q."EYESzlrZ쪈M ,PΥ4Qq9QosI.^:-r[V+!6I6q8!\޷hLLт,|AC }Du_3tJž-,kXVL%G{h<]LdUv `Ò洤YaΞ[@4Q%$注fɨ+ |t1ql`N~uEY 1:~f TpR<^M3yͦ™;Zan@+'oVW˯DWW0{WPB46R)Nwg8`OU-FB`rBю;ǝ;ǁ 6=FaT8!jj#."kŖ\`= HWkҒت= (Z!@%e>>*e3RA'Źs|}ђ~|&8].86c~Hʯ0A̤6+b)U=6W'iȹ0چUfx6buDd1Qȑką3ncav磨~ʠjP\(uv'z]5USP.g6H5''7&LJ}^V|{yl1gzZش k1I&b4l7"x(&a`4q]D gY R-c+bH**@wkBmΒv&ṅt?y gpgDry$R#/vM{͏IWyMߥ\54u|&6a9Xs}jMĴTxo,vեby! +d4Oqm5ژbۿ8}A;e R!S|6y,ZwIw., pSޛJnoh8frVOn{]8GApXcHdq.E8K:Wx.кJ̃+ɉnyw=TL&|ϣcW-̸tg=*l zǫ=U" ~kvNMCȬ mCNkmAh k5+ mfK; B kK`Mn(ж7 dF}B]=L'*X&slqpRⷈYD) N}(Þӥ5,@sZGew?dr8p_C޼<|,Rg-® O^hCWDqdx檪:_B . '|9 6L3g&!P='>@'#FQQ >G&\b'to *+-󃀁R-iK i 1*ż- g):)A3&2jRN=5su2-Ur~ 8,π!zFQj*e~tG** ?dvحXZYAJozܙd7}8ݚ`aq{h ;k 0/ } A'`D w|`AJbzlzbY0E%&!9F&#zUv,6NT`]2yl9$7qo`45$@]BwAt|/ˍQ$9ؒb:n(;kp) ]3:jL짼J5Gc)qոٙʃF;ԁV6M܆LuVHwv< ?0T Rk'we=vVcQנ{OzRd_uЖ/PALXr}mlY C&t;Jéx)&3s-|7tW5 6f_Y8t)/{}f+d˯5jTfM?Ӧ hG*:щ5G53uDz#u!9>oϙpnnP/$*PpbQQ(I'ϸN(k+Pk tI) $+ ´ch\dAbP|FV͔砗ݠ3+\_FSxRxBs0ص0GyOa{ȻQɜ'P6oP61"`%O'Xx rZI)$tVP<y6v{T5QMhFfMx/& f ]\N:Lpk ~4 hvQYT(,bhtjQؓ2(uCd$s<;matUs1‡ӏɔHrqѯ@`\*m3z@93Ii*Φ_v#=eaa%,W,_8gu jN]d}*?A ׄ]Rm(2+XN>`Z6r,\SNCvFHʮDyhHVRZuW?!ـaz{l/Qb^"Jqȏ̓'W9Bٻ pC6{)f?| M]2,k5Mx1'7C nQS2#J&TP:<:%4Q׬-2Fܛ> /cSȫ?_\F#|I nTpp|'_oUKƱ1%1Nm!Tc_Sd`W`x*E}/3Z!41<G2Xa>qpv^Px8*bu_^-uݫD`YjQŝ,@5i"lm:'rB7%3*ջ]v9F2-s^DJz (F3\*d8M]{ټmֵFɊ(UD\=C8B;Rts.*@gP7 eM?:5:K6BSK7⵬Qp#N1KW[fbko\\;AcD]ceB"d,SI~ 6*s-fl]iF'OzH(&e}KB㡦8-pNcYQs-/Oiγ).qFsHgu#UoWE0*HљH{1V푙1MƺJ@j[w|jaىU6j_~|W,n!0@3Y>OqCž}g!޲ֲ1/E ʎ<N2Ro!\#l_Wb&uu}6 AWCahq""VaEXYx  KF\arGnDІ>egLNC o"PW;O*e*7_ UaN GT{Mby5ٖUpZLQ=^wX i׮R_cӐ>k2’ٝ f6s.iVMz H+` *7FaAeVK4R B|1lts C?pv Bk$:׏ѾReMM;rRUN&6窱 d\n]iw9xH'q0@ţD?6i_ԗio:ַ<d W+8^PL(Qc@$! .]_{Yy?{ آ5W ;s<[F:Ty4V̏dbc4e9Zp@5̋TxwHzuW!o)Ư䠺 1:[qksgRTIutx@v#x6GXpuy^93rFhR\1)I`*JU1iSrRN`jE ^U(Mc}4?V2Yܝf|@G9$:c:A* zuzw1j^ZdiqM{ ܦ=ƟU؍G2CdC v.DV7lD>S=u돵2Jb9SV=U u1J}UOBŽrtEǢC69K_6C_#5ކO \:ȳx&lbA]+˗{9p \Ä 27 5㍛R1tPPYL*|/aYN#TÙpBA0ʬtKDEM{#n>%z|e=Ks?=4# i-Δؚ+Ԑo(h4]"w# ~J7$r ei6D5A fWZGj q%O*] l")/Ugu`7a>Y)YPS+j5=F[0){n 3 (_GGKLFTQ$jfMVڻY gkɼuKO Wo;P;~S!3xɐ!gC=Ds9?ل7z 5PJ>\Ke{1τ2m=ur^kڬy(v\ [+[ӌj~NjhAr}HU__W H9[c 1tVhoCaǒ\z eMQPk?_H#HFUnpF h;η9JL+MBBJ ^ `3A 샷\3%M?| PB4{ _zȟ>,w0GRPs3kO@:I-l-Қ6V;])'g!?@,n*3ٽ#>.3K쉟^!v)ٓ"诠ń3~|/USgR̥(69P*_8]#{ Xr_mH` O-'uXh%!EcyD-jfun0Q- l\Ff QJpvR_: ىÊU;API/IMᯜH7V='\6~#H%jAtJZ,R(/ C^ 此{\b7/<`՜kU$:aQW+c3B "X}0QXʾ H!$ cٚf)B9ҥlWΜؿſR9.Akjgdí+Kx8׿`{17'\T\_免\V Ӭ+Crf%!:Z<YG_х9p"U愕 n҄zå&~:fXtrX*aaXP4 M1*wBixn cM 7WqҼP%AspmЀPrZ, Q3ݬ? =X<]Hj+)y)YVeL?Mg Cegnb~i1f* aXYyP7 P(toC˘άX+%Α"` ?1{csl<$ IG-jύrdm K*v74HGjOudU9K B;bi3Yxfe4pV%UØ^U0񉃑i^dZ~ʿZٶ2lR~`6]G0Wh}#E`Gp?MiV߹@h"'>tTl f=swAw4V!SS ,h8&yܛΥMPZS@Њ(Ylm(!#|%5.وpa#0J}3FXx'1h4%!a@a4"-P Ri<14d9#A}V&#В'.M?zh`gG  c8%T,,.F#*~A/ѐ #mRM QqjǯeTL}ll}cDQ;鐍 O{ T*ס OXH2 vi32AH[HՋ)[OLB@jmkOj F=/ 6솹r""Ѧ*;К ?6<X516p҄P +KSPWXՇs_m".5NN)ylꗆ^Zw'L؍9Ͱ\Hp酁 h.yiP Rm&X.?#~ێ󮯮&<ڶ= !a$4tfT\mQ^h* 0Y-J_z'-)׋o_O gk w? ~@o 1ZuBHl%eDKV[_Lۯпcg4(2-kHݰyJB`h[aG25wgӶ;t.8*^^373ާ,ۅk3]a \ڰQsDUxb[&̍Jڐjdw4^Ld%mbǴe'#nKA;aVgk1\EdʙZ?o0(!ؿ7WmqO֌a=ht%-c'AXΆ ̾BǜmB!Ὸ'# |D e^sk.?A7{6ϐP6% Bt+zy`V>K{L]2UIHhZaQ$.}zNVMfQd`" u/I+UL۶SltN[QtP ))נ)(ðd섨'$H7AuT9Ȕ!&Υ]N'm1ǧT{p*xfy<Ĕ䨻8>@LEa%@P80jo 7u4 ܠDkpG+eQrS%s~ ~;d KԂ)sҲOLzRF`<& xה+tac*AFncz}J֌cS[1\GlFh+l= ShgϻϠD+>9T@QY]AHqqRYY,;\|k2Xޤnƿ[ANU\&g9.dA [ƥA<#`vL=H$/V`OŪ`'Eŕ1㻄.D͑H->C[*aso-S-Zp+Cg#k dYRlMA *Ԥ4{<"j1fGJy t=~:@'<Ȥͤ@?5uYG UD4o2|:~ൃH*4Z]=ή=PnY7O=O 6G-b,ϭɤ<]~A/ͧ>&n5… wc]-|ag$ %ߒR|8GRt[ҴD$VYӒL{*P62qmgKRZ!ޔ759-;@ddƕE ,ޫbU #:q2Ŝ?"M"qMB"~XF'/ie^0i3|lm|js EtʵJƼa6~5 Fi9ac~1}# ִ0d?n(|'(qnLfikPr}E|Eڃ\_F8aPD,7_JF=E&@(=:M*"E~c}h{>Q~e2S|s:n6$km:^*&~;<&(kK J`1?3]g*̩{v~ƽgEzĎj0Lh,  M{~Zw^~i97XN HD)6F u)EZc\: D (‹w'߶ [09tF2&8T:MZzϰKwnHX\l wM/'^gq/DtgD  ut S2@TrDA9}"F᠊¥5s$,Eߔsg6%TYF&﹠yE"pg裄HN2R?aei=ݚ?yOd`~Fə97d(RtpٹԐn]n)PSҙ$&xh$A`Kc\k#7![b&N"EDVB׹v},xdx±d q`Lk}YS>C:#a]=01z1q\$i$axܡ9IH FAiƍ]{C+!_n݈EӷqP)p1ok/OF>A>E;1軽 R@wE H u;጖L)|eYW|~ Lg$ٓO#56=<=j3FX9%0qwx_zݑoO?$+`}b˗z7U:`/X<{C߽o.re80F0_Ө~A0ĝGcTmlJn_c.C0_@+:@DaPpϋOCM/*>gȡτ؄UgùLjcZ$_W:V/C*`IEeDR77Dpɺ$lGxgvJ7P z#ð4.ZԐ 7aMh4pcɿMTuT{cڀ3}&YSe_^8vAF,u0 SSIm>)O=17OdTI4}:rCj|˛W. a\~AY;Mcia/[)9{L\"^H:xa'tgMy&ĝ?AmbIa-q>hعT_-K&,8׭]d2U!JMX`N8''yj>a&^XFhٲhtFkfuȊ`)q /VWbaֶ& _cskat2NG阾hodXGLGSAN2|Þ(,-a5(YfEԢb7:0=:]xɊ>ϑ.gBuCqr]D4:<7yjuJ&M 9k4(uCZd0LH\-kUp+W+ =] J\GT6M*|},kk3fn9^3RyaW+ּ4tc'`7rdU-,K|Vg0N:pgMI%xi{Ѽ|Ȝf3_?j;cX]CyZm5!HJdOZK6nSfL] 1Em9,]ntbKj7xtt+Wrd),S܍G#$1IS%6K#,ixP0`lW%!K~{J";:> 2z9?fvڵ1*kRb.gH(lBoX U TTVPr|嵩9$K9ۣ"JOZ_d-!.8]^eOD *iuY{_t,@rӗ-ɸ<8kN )`2ΙIz'2ZMk*F4GWr{'׬h7JIztW^G@ň) ?;o/ӵre;A67?TQy}zZQ|W|5]?] ?捬䏔˖PBdiEpd c&3ϴj<"epnnTX|w.{rSvb \DDU-ӟņFmKgM@ ݒR#jg#9=*qIxh8i'|;R5,3fEwpo{6kc^"]avR}augi%L~&Qmc|vg( Ѻm#2j$|QB\8 U:A?5R޷ۭV<Z{5SIz^}H Mr|n">s0 3TUjXuuX&4*/BQp> 2)Q gg1j1ڜuOPUm93~04I [)sYٱ-F使3`1/#O)kVvҫRXKhSE'Ǟz\WHvS6Wr%  )|B s6,.p:?-.zF _)W"v%}n/eQdxo G!S6?яjK}Ua=f@5˫ƿe\&}PC!=R4-xc;f+o9Q.|˟I{},4݀KܝIV/xC>ÔD ש/DoB V\[J%P|֓^`AhLpP.秴7~"Wy{hX;PK{j6sF{\g)E~!'0w*M}|sj'…;>^A[v~.j0G194j*CdG+grFltFrCnV9zAl}X֩ pPJeMT4?9(ܮ[ϵEB:gD5 %_N4叮齗A ĥLgukq0歕' f& Ӭeлrt:*Z!r{~x\dxE65ԴxvDtO8>b8 Iy1NNx^|bTyt#M3<@oJ9ןh Jgp*K~i)$`uhؐGP;XZl*S<}xSmgxu" ZskY%U&8hn-tJuFǽj Aybv8dV؂k,"Y~UTSMsv=7* 9g .?W U‘0 ]՞pnao# r@]@:Ϟ؉$m_.= n&Y@CQ~׈prITNmz]>PX!az$FmIC A4Aw?TS_sPϞ` a, p1[c;aDVCR{qfa uRO7ak҈`x=hIv,23GDw̕ͽۗfaY3LHf)JidMɕMXG;B4F;V^Dk5K^W `g#vr[FO"^x˴(28MKv?S%FG'N>EO Ιk9}9[=6eG]ZN\i%"tE^oFh~@x{VTMpQ)tzj܃~IQTr[I^M :S+n(4LԌɓ)dUԔwM+nJ p.8񕊳augdx_qnI @-c F٥Ӱd܆ 5`}}eu_‘}dOc/ Υp< 4@"ꄎAHS,m?u>U0b>"³'1i}lITDoL~U/JMX{>+1yT }FDzX؃e)S\$l[C&G#is5پ_#PuК? a)j]Rs =b35&8ueV?\jNF( skV(H@=,1'I2G4Fܵ>GƱO  "EL:B+\z\7OBPf+f.P7&8s! k8Xo7̝k\Rgm1! P]?A"!/夽՞y1qT ƐZFmp+߯;/AV9+_-bN,g4nj?+n$j|[{p${2 습u|% DIf]c]VdGic(צy6pFlzT7]*혿OT -_ JD}`IoKb)T U#m%cРk09Ȩ 2<17017ђ BeSpEj8|_>Q_1EKZ _zftTW-f{[D<̊ꔴ=b8I"[,* iB4sl qF+';jw 1.O;㾞L1^VR?ji&`3&RA+rp}tvgk,*("B }Qgj6}#BV]by|3g^=ӽqޘJMK)b(4?dX! Kt#CdD}mقffn% 0Ouh@-z"L8ձp^S(s/BBw9]Lv8a0:dw,?c׺<4 AV1Hyw?47I4e$N*xj4&>穿O Ob=LDžO$[ﶧہ@չԶG7 }\=f>eșjHg'i3̅}q1ήc5iĶe=&¯dGϜh@'>ga7Rgiv JB8SYv]3k1}RH?DDV]'6  ZOl  Y;}okYT=j"2}"dx~d@w}zlW1 h,xI㬹U-{O]v[I IIa/fw*kћe[ 'M.Q۠+e9+ViCc]__pb)FLml/ ^6@ord]5'Jlx{w2F@1AU[_']fҿ}_$\F۶-?VЌs>]SUȒ8[Z'u,lD ZwtRkD)@n]Ӝ&@ۊr`#UQe5w{"s/X?x>&7} i"qLZ̜oL9Sָvk#'7&D,oq!=!9 'XB M0 xN)迲K?P6^ɾr 3kiN埝Ր2+BQ "M2*}@5qÃ+T^[&4DT| #%$4#ߎq1RN(gJ3gﳮfksVU! hW֋* (-p/z[RAwU 1drElf4zB#vZP,izSʤm'ce  (RkK꺾\C 'S-<_#|S^')o GgZxWhLܮ?G[ G0XD]n5N a/Ʉ}rL󽁵`ksbuP="-6(J%Is(?99 yYf[v dαf̺G_ mF` MAl.}o @jض7>V-K [7e>voef_*|L鎹3IT3jQ*v6sqҀ+n±Ctڕhp-t¾@:3!Qtgjw;`x][~ګ^ɿjZ:HWORIxq6 udTeͳu?ոG]y;MI !4t_0 !ŒbY''B5"X֏u)¢v7uǫxa[݈ Ps9\ &nbWznƠD|0ՑZJގ$$9b쏋LixOYw^%r.l9,vsd~baNJ/?/.(MDC< 3fo ,#4Ϧ %yC@h2D)@:ygp4\BQse Qv(\>FQ s(篛X$! z멜>`.?Bk_mHe >+%}ˠJouPk"]g9wpw9#^a~4M WJ>*$*&YC:sӁ6M dA##FFxʶ{-᭪T۴ s2)7xQ:]\NpRƘܿ%gU? q8wRy+yraݫ1+=VY-(T)$grl+k+U@l,G"UE6ӆ\B2P>&Z*)M{7 dh|yGYm@%YO7=y_,8W\p!K8^#`?0Cx9f*.6w< +iQs)  _%[F]t+Ԣ ϰ!SДWI7 +~az7+F4{S)Y/r^DDpROSrW7UxUVJjOYInVA}hLF&lrqJC!&n s]#uGmafOHbAC^GC*oZЪ=Fj=?a4Bp5rs9pw[y\肏zs$߂SUƕt),vD,0Fskeb8>G(2TPlNꕮNdX_ު3bU[TUua8ĞtxcoJ]O7r՜s@v{;_9 kx@. ̉S{l0])l CNMa%`Âk#;Z v\WJ>[7T&g0 ϴ@$rov=>`Sz''cKpw01}) _X}-ztKIp.ቖ9c$i Ė+9 "M)kKa#X0[V{qeItBТ  ۳IR_P^,ɓw4z]oNe2#.uz$%<ɾ5NttZQ)-b# a#h@G߀:5PG$s+^rTkĭ;K^ =—!œ쫐HeA,M aĠxaN.lARIS̬Efz֒S<ҷׄhg kx͉Wx%h0vFw?ԞZ' 1c l1p}5ZAREB˒vV1%C-sqL;mӂwAŧ046whBi)gNg|ѐO܎2_Yv7G?FvbkVxƆBrL,=ѩ6ՆpPN`uۙR}ʹ507h,q%j((NJ+`+߄>k^J"V@I0\9ȣ #nU8U+AOU0%}lc;l0 qE9?gQ+W39a\3 ~ }詍d?nsh@օSUD7 #4 "P5W{tG#~aSLAD˝z> zYfڕUx_%5'DFa]8OM$}rЊr{":OqiMEɿU]̱9U-R$4t*=!<~4@xeړ9@cmͤB1+JI Vt&[Zf/WFEO)ns>HEp#RH3OϞk[ͼoݏ#xII=@odIRuœ\ taVtG"2I@eYɔ$nc~MaN \rM,}aҭ EҘK /_`!&i0rn ߋ3Zt`FX˭G ~rT6fIZ4Cގk^9Ψ{ԈGEfdO:dH[%uF?YhǏNfTA>=a;Y{O7{^ :ٻ@i5qZjsHeM|k0P$xf#t&':!Aةw{Z"KLye$#J姇[7xd*uW^,\ξy@I.CBL;?$q_V^\cyLS3W贎?nY1uA)UdSOa”p$~H]𒬻u8e9$#܅Gr0իmفYd)i`ULd$mcؠ,+DcN+,[i]<}*=)@罤44~5$*A13>E Y Gr4Ȭ]VdA~%8l#&U!-JFXXWL'KRX`/U%&c2Ҷ%=Wx~U?΋k > D6sK)MmTPXz`B|E.xgx]z} %EV bLi[2j/+"d,)5;Hܧ=U< i_='nˤU&;DvfP'R = T{5W h'0<{j8y)lQ]/`]1ʗ]WL-qOa3 \~! [F5$vW>zsX3/ȁ:2QrNo%l/qmAɸuI`7,~+Ut\qex!X#{A&+dvj-ɰsTI \/AC'n,YmQW; 5oN.(+v'&V.2 /tNTkqɏ2sd;v]VTxUl:d{eem#NH8Ǖ;nߦM7U2g!%|9hIjb]md<&z6Q'`Lʈ = h]žQL;kINke.u!Db,aBaVX)jx1+dra^#8VZ .InhgSIF4iRMArVe U[RJn?9jOTڊѫv凇!"kg7' a)~I-䰀1djJbQsZw.7)Lh3gC`gK΅s4]d)_ 9n^U\~ΗmdC36s%eҸvH+ͣ\Y)d|Ja;%.,8 AⰣHqq-%S7ipq00`@mk !_.E+l5x I WOCX;+#-j1C ٱ$tL:O5ғb[8&6"Ot(7O$f%Rq5P9M.-'7f>jkk*ԜKm( l]6wjTkB1T0= hVcw{XV@ӛgxAʛ CoI/@5oV(Zt, ۂ/rsfc`4.qTM_Ly9  >`k䷈K0Zf]5H*Vz+cݜ[I[ 򳢭p(4G;{ ' v `B?HnJ#Vٶ*}5d4aD !#`\9d |Q&Pwk1؀ T=ULs8fOrTMiMM09Ey_ٌP%T@gn6K䤚!kߧD{R'ĹH'9qW-K{p^fxa$Sa;X>eU ! `&/:O| t/ +;rv-u+p᝚SbaȒ V)]!8d'!!CrLFc~`0ɠPNGh2$PF+8A Z I2KYdN>w[ z[7 ,(W7Qn(?PʡQm] EA7.`A6CH蠈 db~ \-"l>@w'Vs!%'b#\Px?5zgcIݽcS\WaymJ<3!3E%i#,3$Z4!BDs"zAO̹Yర&#9#J>MEQ~O<`ǤHL8 +CqɦE:}nwaLњ:,aID3 k7ةoJr"e< 9= ; pXf9Lyu[eFQ9V,J-ĤHo턑v+s8Z?#Րnxizf(9HA| mraLi7G8ƝaARxgMb%ehQVAP>Qc.ns>Ҩ3:A-hqţ\E4|'č_BFp58:F"ZaPY%˳bCߪ%,Dõ-{b|FR #k"{.VXN|&.F ?'Xn%;ΫPv郄$jE $þ%F0 k 3-+Ǽkʨ/4udb݊go[6㕪.'FFľ'm^Au<.ك!3FЄ)}rG>b Hk@2#X0UvyOawQzH@ps+c+_? !7 &Opm߃S|k2@q ݀4̚ʚ<) FNVn:nylV /{$QC(&߱vhR"/6l%NwqLtD;~gQcj&UGksY7];԰՞Gj 3ApѬo{(w Z ҽſ|<9+YZh) +q̗}% -2쵸i5icnٴͦ]L&φT~%QZ@:_zP;S OXj Oax#V#}_7*|Z"(VuO(>g}z 8[*W 3(O'J3o2 ƠmKC'(\tJ4H\bG#{Zw讲zܰUy?:CWީnMuh`8G `8lVSCcKQᥚJ{a7`0uL|rzйwI"xo1SWy~"hģ>cwd{}24ɊU,X6}tJT"2Z.\32Om%A=o2jз,P=Q$՛D,X"(Lf +I>TߏHvs 賗X[* k^Ľ#&|0T6zOsT +F.*XDǕ=>=gim>P}3؃d"}ozZڅ0_J(Xy m=FڻmDj$2-䷛נ*2 4N.ջ:wS.:sDwq?/gb2ݚ]5)W9c--w>?R>*pס&l1gYL`**7Et=ytdAR SƠM"ۢQo:D2\y5C&q9(T0uWbsiWOY o!a?Qq&@&^bHQ̊ ;u6ąk0 !fk(0C=JQd5~֢pS;i-ꛋ*1ވ=sh`Wi*9cFܢ;a~ =;KR-b']2fOX4,u\@E Xbw>4h~ǸCѸ-OnCo ,ȁDtfҩ+`)ݤJǾ^Seh@b݂m0 eC=ѐ2 D+sE!iZF&| A]wtPh@t$Cos7+RCO l^Af-:(k6d\yVt<#@S1rFŁ#MJY limFV:yHb_CI /nՀPe c*Wz O _/NamCm7AֽZp(Ep؆IwsV۰Q;S~A4xv^/GNKm4NWUwaAkTfi8B]6s'r9!ժ=I5 R:0&Kp_:Uv?vKj%!AD½6Lkpgs =z f’T^Ģǿ(~a[Y:mCmz϶ˀ pe?Ij7JE'U2F%,ĵfr@:K0(ҵ~[gCw6{kbO5-kqHUDtH! fB}> c .:~q1+@";S(:pʞ.6,f'oP 4"T[X c() Mc3cL҉1/֫os|)liP,?vS+WSx@wٮo=6ZIy}rPMP g=co,BOnAClTgAdO$ivP(uJXpV\,?vsxX&EqC2jXVKűF'X\24ȝHtٍ1{lZ_y@(gofLD j RoXA Q!clڣ9QfW*Q)gZ4 xewDxʮ#T$Y|MUm2JXWCQ\fNl 0<_;rF`:kGCHf$uXiᑷF1ӘUpq8)9;{(9S7f) 5&̢Ƹ>^c S*eD <D-~'N=:؀^2%@3$Χ/ݲ-Nű׿ |&]c+R mvtV!esl&xo/ZaH k?n1̓lTá'-~WHq\T1`U+ {5bg;ȸ6~ ^n' A.Ivnu}cb֘Go)fW@L;&0g HK-'IbݘO# v[)m nUx`Z;#U<)]XBGLBէ0 %nR^"Kgh 5]$eXR!QL<qykXB 0ECmIu۹,t[kq;cŒrK%R0`-:߄yNug%rɺt3^bt #,T5e~ Q懌3oH!@j"\oF&!15r|81;GYs|ZrveBv7,.Ya|0k,%؝3709iQl &gGBV \d54P'WոvmH 6`ֹmG[%hzJO%a9ޗӼf+,CI_)0"62I^4P »m`G9%G~EAaDl}dܑ_ڞ (d+6ȕ|#3W41EWʪVt<>iYFGEnP_8+WҬ2qKS9vW7Sg}AV(gE!e_maZA>}֦SZ6R[\eKCr^f擓{H1W oƖ?ixWQ !1)jk3{S#=]+t,42RNcnU O~^g}igf?tACu=qD #͚y.Je\r4-sn` )3&`g4d\~raVDm 5kؤ60l&|>ӂPxJ" O1C dʱ4lhI52f9ȍ2;P[%65! a2( (5p_ -6` >K*Y `73ASL.dc}3@!AocpVW0)b@u~⩧X Cn,3||yU/!=#0:h] ]}jv;B2۴{Ĝ \BM@ wL"!=Mii|+Tƌn\]5&㦐d*ۆ%b$<J7= L2#;_>YUV]7n|hk7 'W,'aKAOinb#hQSV´..Eq+4U+Ȭ`C,8 [y41ō^Ͼ#zoȴ)*E2WO`5eWI 5<ٖgeavNToL bDNeeؒ1P1Ao*SoUGD R41/qDGUhGTt( \Vn^,aޙxYp\lc,IpLY5򐹄 a픷@ˬOPI5 λ.<\o6#zLPЗecMp,6cp(kC0,=l%o(0nY.COVRw9N6m Ղ̹ϮOK 3.j* \‰q.{{*&GE*>?RXA06+#4ըSP#{Li#4G{DIRET`P wA$,߸4hY v'K*Y\ 0 Eu},C^`w'!OB!8{@MBƻb_wXq#)5zYSٝ@J1}b72kȞ~kJA& ٤4r1PT1 ]hM*V YgrӡgI.%G(уe먾cñ˿EQ)^,'21kz<֎OuXM^c#QШ8rؖoЏ%[G]j˷j]Pjr?\惱ӎ%\a? EqѤ%Vu MdoD72JP%s#'1M3Ramtrfkqiwh ]Tŗo$j9M6O|W}i+ҳ &'G1=K9̻G%`VG{`/nN|`;yÞ K@72&/f-b2h!)V0F׹ C&dFY"#$C \DN"`$ze9I%kɏ=yq/z!^;^0 j^,"3r-J:[k!D[Y(I.iùLFD?arr_M:c!4;Û$vڒF/ ې]q[mGfW#zhqݗ~WߝOZ L> `C{jӎ:Ri,NL((_桌׫rd1|}/=Cu'MȺ_imB^էB^x+~I"wG" }W\^ HP>jӾzlD/#܍:?C_R^J\ߜ_Ye>B.Z|md&yXk쌇x%K1P ^yfъb+yЁH?~!yF閬1R) -hJ7q.*g$Ns΁(B  NX)=3ضL}͓NTsM&>=S_pҋěf}4| t^lR_߄6CFjlWs׊bLm^(Vݚt6"AQwU%^tמ/&sxPW"LUg0Cx@e?{=)4BlBy9Mk3;1ؔcZ Q+y悭ۀƻ "&ЩYuX B9g{E/^ -#WE80ǃoprXa'vpzQy#vzJ\]=E=CN/zk,Q ]ǑvMBXfqܓ>ғuWVWcX \Sl0wtT.5čZ-G C8MOQ3PnKl;AϊpbB-4VB <K6M& Ce\I! e6ZR$ҵfJ#0] uG VO *5q(1 v{IA ";4֨7GTJˣ\$‘7h3۶#hҝl}A3'^9ݎ؝sHԸ̘f[? Uhk|OL|/*G8LnW}4c2LD(FMo3JGγ91Ş<[uD=RԑnZ%MKz'|pc}Ƭ xqVّY++ۿ|XO:WC{U'8/{To{췑WΥܜ=Xxk%n2. eJD|U vhOTunOj"n?9G Wdb!]1V ̲@(iOJ7 6ƧNm0|RtHI$Siب x<m!ȾxXSeQJa_9 }0.:Sr[49O8I);$H%SAڋ<ЛS>\ԡ i_QB}WyݧjcޑT`'z$FAC98nZ sk~>6?"ZzQ9Y5$OFsq|0= _۝x*ܫ؀(}[W.a`뤭\{V<̐* t3`diHsNԝg05UJOD 2[k93Y&k,oib&U0hCao0RFB_Jqnb* @C}nWފaBzc6zL{@4-kɍɠG[cTe҃wr`zo'+9i;)[س@B|bfe;SOY%Z!9zzR΄WgiBVr͏*cJsi Pu\O0-3~3G^jEh$7LAɴva,ָ˱*ԷI;2kjZxכa4cݜL1/$(1,HP+| QJX <1WpP`Hsojs~"/jSmog/ p=>ӗ\_P\8lf^W)$@| rbWXcgN$7Gud#pԩ}oX{ j}NEhܭub[EJn.ԔJ-"$[ nqŧW޼sdgl%)X* Xh r~TʦEn0JB $S ߎ'oQH{d&.`hn pqOJ]ܞ$Jߪ= Qcxx?`%F׺Zm@|6lwvU*Jl?+: <,n7<lem8_{}@BC B5~Q(~݈{r215RtES59AUpYp՜gU~joEl,2fye̟s+M)D# ӷve'!"u-ꀖ[E=qH]Ms@jF:<kR d T[ߦMa[(;vEMC?3O#*Gv$&(Ucꗃ T> n O@O4`; = ?'2Iǥ")'%N$aH=vM9&3_e.vaл8>@`o_&ވ#Nϔsϯ˛ :}54(Nwa,@'Z$D|&LB lhj?B"ƉK6ҝc䎭̀_е'|;𙗃J|Q;}3y\~q\ދV1wJ+ ?:bU0I3q1l #wu)WGN,ħg萐UH,f#Y/k.e+ZcÐf2yd~\ٶe>A"&&&oZ=L2tT9: Išood~[ū5d0v;36UJG/VL)uY<)gWlh ybGCX5H׈Us'׈I^ >,QAӜvۼh769cƟ ,rw<̼]ʵ쎐4Im«#P^.m2""f]+oV(p~*^xj]_qQrelv8[ =_1X7m w>N.(VSiSŀ܇u8ㆡsN^ do .YF1(Vɐ#~Z`؎,E$@ݛVo>f7+n%_ U,Of0vVq}TI]TI'h_#E<#jMfs)DHy29[㈎tl/zI-(.X9s xf `wN pլ|QYvsMϝeFm)Ǝt3=G:]i;bΜX仾e&fq:B*4] ,wFHK@SLH!\fl Cٴ$0 ط+?%lcqE3A)osw[W \sr^U2^ޚF/,ZnliҪm7MAӍܧs#H+`x3kT$VgSNaV5;{.n4 Y5dzZO3un`|]X#8L:y$\_*K]Fx/dڞ?V+5Rĩһ*fgh!t׊=Y׊X 2 |ӵ;ɞg(Wᑲaf S((#7O[*Ѻe|"lHAN0wWp!w-0 @mPᄛ ~.Z7`LFGx }x??^6XP (cQf'HƤ&ݝyf 9 !avlEMr3KGSP|AXk誑{a?RyT;tP&U&9ҸIKVdKGEb.h2iU0c>|n<{mM_c8/u C9w-5^R+?{)M HqAXo lAwV|^6_/#rgoB2ԮA誛Z$]}|qV$/㢱Uܧpsn` L@&G/®K`bEcH AĪ ?!h]pmI@zwyea}dUԼҪo\~k?dʍ_ea)pvQ<{G  Ogjpn}`n.KC݊)ȵD((V+g>^Ԗ_p'rM=]'"GvO+U]gL:v̜P RxjfH!&̕P{%:oj0:17ruogsbLYVZ,p֟ dzqz#0z μk, -ףY%AD]•OŖ[sKٰLr8Ib{(_wj5arQsJܔĩɔgjÏ~ޯ(#f(I7MFuڛ=\ON<,ȴ;R8Ia9thH%Za 'ܺUcүF/SZ ohd{_s}K/ )&#k[ $=9pL>~C՟rG[fH"3؀lͿh#DtAP*f0%w;6+Ya6:=d.= @{i}Ib<曁-d#':$.%GGVzc˛t(3IͶC(rluVvtK9jZzDXia[dA1W+lM#5)/NA31csZ| ؛CVK{8M֞~uSVhh$Ik&x:6 s蘿!+GŊ9|Ep}'%G;g.r2ܬM->!fO?H@I-]w-TTL}>3((,u'-OVțKR˩)v:en#4e hEg-U<^1q~_0䈰I ^IcG#0 ? yqHʓ(:>"I$dV%ҪtvJ|m"3K1Q /Vy M,%(Rw|agQibZ%YP[zX%*XL4|>l5 钣G|h,;zI_r7zzBo~pe+D..ϖc% \. 6?BP}2;YHl#w^^t}t=x򁲟C뢽1V>.݇q|Ԣ*ݥ;a ۚ:OcsP\q*Znw<յ!,XĶfrm݉.䷷ǰŘo (>`vA/Mnvkv,E-/(7&Ke.tn{[S&3qjEߣsinџSڴpHsk#QO"K DE TgB1 W-Y*̕HۉPcn̄:l:5Hކή7P0&iu7b=<He]>a5qE@[:j\mOO lKyVuv7ܐ2\>/@E}#kkShe$Tv(un{v$@`Mz{R)}+vOGYz ecK͠mLVgXŗl qCa] ھf13rQG\ǁ7sd&RT('y"YZ.>o'g4q7sw}CBYN XG1Ed;#U|  9 II$Aޟ(Єtjnz+yh>Zo_vg<##,$P4GoCdS?PUҳW_7)`G I\dF$b( l]_aw %Js”K Q#vxTٕ}7:yRįjqÉzҬp+(vt@4Rb tx퓲#, `6 {Go21FqBBc2sբP΂#<6wFc;aMϭOWJ,C*"ӚGqJ ^iY?|\ #34LFFcٗ fnh+ɤ|G<7>;*nX'T<BWlQܮA9xGWRv [H@&@HTb PUkFb,c35ejc$o=Or9>7 R۲v8PW_*if`\3|K8N}'T `Ș}ۘ1n=RޓSNZ+5o*9럢SZ%x߻ 4d-ʠ*a5,/"J/Pe &͟b)aerzl٢3c+MщdJDJ\.Y<$hh_KYXL\>H;s>صG{d_,MY^м ΏK}CxMMN Aoqwtutxp y˟IS- qʈ1w#Z:D'DPR;D2kQ͵d6Ka*U_|%xj( PGz8e PDkBBmwNw볝c "EB-S 8n$Xf~F8` j9 F8dٲ컡9fAAE+:~x*ǭ=nfe%>.=8ۤн eXuA痜Q)Edf0^dR"paK'Vsu=~n)O(,@R3.lTb{CfcJUwS.hDK/ufd q@: ћU0vla%𮄾#U$WA|28MQѥ[at iL҂ѣyy+G"z֒O ـ-;`i&~!75kC^cz_/Oi kTvټ$1̹7rCUfxDs,?5Z?fxvfΌϭ?sRO:*2ʃkdi|.ųЄh$z%FL?pQNE:wh!csrn09||>qf{Ia+8T m ^0V=h_.xV۷-XX֢]$} ?"mqsƢ. T:=$ve[ 2O};$孫>/O!c+T= ߗtv#bEW͘/z>^tjϩec\^|W:|~θ_ 5m`k ATe٣YVC_$^owA#؂靾JĝTt!A)>-|r(j:GZCB|^C;wURiK(z2S͔Jyh!R[QK }:($ܞo]Zx ]DU@pǯk lpX{<} pQIRen86]n$s_]EzrHh^Bn߿9I}({*].#s%-1VڇTՏJ,!N\T;UY?~Ξ>k m#n-f<L )pVKKDK_aRi'9X+HA=>#PSdGkRlD.-ʉH :h5NA3X;EV;*$CSJ$k *U Id @[ ɚ;л۫FMfOAbE>~!"z{pM XᾦU>8ϗ47 &[yiX8 2Lji @{dK|v.p|出$Hk*`-h=Rm{[pj6'@,stzTคpӎk4~a[PΗKZ}t=BȆҽjVK;ĹM&ߐ6 h$б\Rr"ۥwY5%=D3U-̫]xN gI4'Z cgMo<]Ycv|Npcr0å3苻ˌ'͛SN^[(n&SaP :x2>Ng?~Ԡi:Y7E4c"'}p߻?~ga䰃9a^[^rhJ=fٴQP+3 uz U66'6c+;}8߀F }k5]5n^7j=,ض ?`|4ia϶_.&DJ;s2 Iߞ˭^ e+U1wn瞴79%Ӝ{wbgɘSӘ['L8Zf"~䴴EB` 6Н.I QyN!Vhm /xާ_J26e8ͰENTtge{wصWV]8jR&ͮL vZμeT)lР5,Cݿ8}$M-냜1@))\e89@ҷU ]ɹyR$0`09VT{s,zj72ݢ tEgtbz&ۧ@ F#9Swl ewHbEY}%q(kKuP 4Iz@YxT۴4'VbԪZ@RW,m9`04}t~ GG;J(s?/׽fcmQzUĈKEThW l(5Bq=X#-"a{ 9&X5)]ZY#thZmxw6V fy)Odz+BXLFӕBrdm}UWǍTRzI7iGe3-?JdP&_-`Ҹe\t`Wx~3x+qC+ X5N^<4`^(J`Z`A&F'MLE2ݓ01)LfoD~L :wEicoLt;0T6~ϢC5醋(ٮSS]S~FJ(BoX\3zA8^2b p:\ZuRBQ3ܟfPr$ښ:)i&st \SJ5^'齽PxȤI7I`1]g\&iR |}^Kݴ"b( YUtq) sW:u, n&<TPf!EfߙڔTg&+ ޝZ>1qba6j=' zIs+].5m(vdxn/j!$ȫz8'V`Zct(w0:#TEe! 1g㞐F'bt𓆕6^SfyQW  0[Yc'j }H-y'#Μl j >f=#RFoġ `Rz߸H>#42mi{q)t};`NK.`dʧ`HsHcBZ?R4㴣X6*bKu.!sK{IUi~!a^#jϢ O4[#6`ic`"?cQvZ8AX[ o_ ߬sd9Lb6^ko %:[6I r0C/V5x7vҶ\P0J%PJť62raGUr(6 HT be@eN0KH̩9sώK;ռD}i,5yJIaWîd)Zhc|zP&D#N1~UE)ʪ`>qAIдÂ䗂~BH,_25FU-Oebh-gVS*A,3 b} {j++lӂgΒ&KPTSKZ?͗ 3+x  |9}ƌ هo|{f{fྷu^TJ'nMު3tU)Q}lR=z8/tcb؁fMhr:Jd_HPi8b8a|Y>-I2))$;4ҩ`dpu_DjlMgcdtDd8}Mw X2v) +"9eoiy5 DJfsIj '[gyM0N>PKQ(|活'W"F^"A+9 G⨄8ߥJk9&7QJ}i3֭vݖ#}8@ou#.RA0L $(κ?LeBXmOc#oCq8#N%{CŔ'& !V:)r`嚮W+<*@7^$:s(l~$w\ۜa_|-4R'O]9ZMYJS5XA2BZ#SG-Xm/+^ zdy,O{DT7}%_BNˑ"M|‹3^<QHCHAgsϛa}͖*ڤ1Hg$O|c~DHˑ#+rQQ0KwXEg\RESʺhr;ejN|\[1^A${*f12ܞ0kp:E "I$ȣ*O%;

OmG'V0ة/{=uT&Ҫxi`߈Gϧm3R5 !L2]P!&w$N% r*c:|y-T2AR$t7h\DUϒ`p0w@"_lT'JM$T*)"`~4rD#,D҂mnbA'U_ ;;2 jF4 j)|(⼭a}=C% ֖xn9Qim0*zѢwwOذܐ +(0՟ rK{O4C*)$X3#G5ȏpɢ1&\uٻ*^0-UuQfjMuHy~]y\!Zi{.θ|qv~/ȸ>~95Y j-teg> "ƚtjьwyܩn볆Kz#'M^|m_F,pN3w'8̭i}sEe]FU0xylDaQ VxbCuJ3-uᦖ]ejjĥTJsϬq~2e? M}-1ZB&Dn-~ >?N8AecGS ?~,QBΎZjñ)p>rH@]=^-U&HXTTk{Nepf%"7]6纂,I (ᔍg`(+-wZ:c.V}.䐙[#( {g!.')zƠRmq,VmXɒDԎG~Nnsx&^@ :ĭpH,9_Zcs\O:RbOqNdPjy?ļCr(QQ[N38\Vf(;(*yUR2u$2ϝ!}!ysGIwS?Pg#hOC>. oZ8eMdn4ڵpnL"Azsb57PNM.7syk&b;vZkP(v}^%6} /MxlqAhf ͉hii@idmdZ(_Z86_u_z;tFtnNlVu\c~;'cgh+eskQ 5#Zrx6P;/FAE7D@*UƵlf)%g횃7F+{iI ;-n]E/e+/;W _ wbu)T$Im~rec=%U9439v=t@v8S)Iˣqҗ}l,wZ9aU`yhڢ09K;Pp>Y T2VC7 CJk7GE0I_kl|VgKE'w'29uŗ\V=9by*_ ,%+C =~3IȮˉ5 ~ gO qr /^5n 7@µNgjW|6|{ %lJ9t?z Sn"lt2|`q c!6ܣ&QJ>D xӎw Ї,GwY}q·G$>w`Kdz}Js7|",iEڹ:~O8@l UeM>q/``9&6yߛuդs'#0?$HtR- TW (Bs@Vm$Bb: *S{x~p`x7w'k8>l@9rOeG}&>Gg%nbyqFAO$% v\Ilb\ī+5/O*rWؽq-=q!mjx\7tv0MJQNsXg< GSr57,l"ao詹mh=g|gѐ\x!4-^dn_lTzp-ٺ\I<;َ F/;>xoV[ `t|⑤~=2 FdO,M 1/lHI?Ca@bT ߇Z *(p-O~y.OV(K,8T sgru+"?;^ +ZiڹFN;|NOm)x. q9 }OVsKv5˧*J6Oѵ$:4e>d{% 'dg2+Z[uM; b- 9o8;d# JWo+뗈>1Cu r# r7{Kb+ͥB)l`- `>FmE и&I)f{d#$<,B2Z7j@p'LS۪HOD2BTZMl4@:t˚¶޴Od"ttc*MǝSG.MYQOIAWO0D)=BhrL8 +!-ѰpۨfVSVRc9 R(a"Ȼv z4=##)Q[tw..#)vRqX .B|N#JQe`%h;PܬL$ۈkiT@s%b7LsOYhUAmgFy]PiGOf?rQ 噭̅]/BV8:K0:Qz+!K Ťҷ(pX^yd') ]R#)2!.y{ `0@¤d+fl1nX['Z'@Mv9c j9p*[Gs걒8;n'|s{iVαyS. d0h< -)9A8!< dA9US:rEXg`fs[P&ɑ/SIW^Y6?.j[i-VN&;|0 @lN"=U[ķI0~o%!)$y H1qnKhR_t*CZx۾̰+`ږ:'z4㠳suY-HB;!`_0'}X,q<˨N]*]r<Ւ>myz (ێ#O"4/$l?{U&򩊁xEv@5ohqpJQ ŵO FzE2u}lϳ}ynk_!yq4X%m̝r~̦t}Ŝ}sLCjۈy)"A m(iZDtWl]W)ӊ mQ\q0Fh"?tYeiwfZF2H"QI<1_wײb>:4Qbo 4AldNMZ|ka|U{mɆ?"-Gp;iSNcSexXX]]̯_wY4A]IXzvػ\]-Ft v>ҥz* #KFIuD p'unr6A:{iJl2Ax̳F@VJ*̐9Sg?Zi-8ߊ1DoNvOla++[3n$k!cUwmjHTP ~ߐS;4(n:@ңG]҈5Xn8DQޏAAU`cs1!u?U_ 6,hUgN$ "jv7?Fy+3 RT:?Zta*zYxy0mW;=lm7}prʌYlsW;"‡r)ghŽ.,zmZvHuّy!E˧ZP程=[ʼn(=#˝1[W(h& ⯂ӬɵY}U.)yQPrCM B3\I)}5#}~ r 3{Qzt$'-Xډߊþ{+;:d[l_'_.V幘UNJҒdjtͤ@oV롄yLQ&b^jJ*1DžBTgri'f|T+}DEZKK%M~/);ЛF!=D04 ^7[EjaLem@'d rX% E-շyrMD#ye   iR8n ;,%LiD>6^X"XE/[S:Z7%b#e%q ¶ނV`NHܾtvjPGF.5 lyh퀎(.3LOPl-m[q mBoŴMrQXm [qEg^aϗPM p7UqHTZat|ˑҦF V'c3WL)4iyz,-R0*~`.Ż+/٢gT5}hc7 DoH*IyD5(1&82A?po2aa@$rӈ5rY+xaV#O@DH&{œz5@֔6޷OcMwĐN2K:vXP<uDcRBn8y/2ZJgH](Ԉ8?^p3eZ_^g-B]hzȦHTƠs@JrjF%Wܻ|[5X$z#ap:OCOUVMֺ͕Mb*1ӜNљƔ<'TPl1n!հOkPOQ3~S%< D"ZS਺˦/ >vdy`ygX]$/zf,"I3!^Ûe 0'Cȅm^|nrmZDrCKiI̦Tb߯Т <^fX]E:>0i7_Yc.R ͕gPĪ>H3wEH\{j# aYٚn]"m}  jV=I%|t }-zCbTv۲;iܒV΋-=6AXk;Aa^$S>c݇*i)̪w -x}0;;>.tD II- 2H)VƜ||m Vuk/{9ƽ (0ip[,f't/zCbSKˀkBL!:G 8t%3q/EЎ1>K8(UI(}W/55ZY~GNӂSF g=~=HN*Ck2a z(P_RxʠSzg;#irCK qǪ\"8x?=rVnn0n@JL5?݉{=q̛ĵaQu)v!=z[PȭmB ?[V<8~XK=h]ƞG!Q#6j5Lf e𫐛;0Uv޴myaݝ1oo-kޭ:ś3;m 6YECgg4m:`\JkRK=1 ~~6.4OG-tA۲z),xWrO"oZ%x5rT+Zd4`TaxIȪ?bDc>[Ly0[eRYh+麀E$b?tXWƾ@FwQ jJ XBzb[e3hX^ o~ea'EY@ "pDIXpnߥSqIɮa;C/@r(`IH3Fh<mt՛RVA u:1-RXZx ;gwwf1o4X10{ЏKYi1L{N .z[$X`$0-ŏ E9,IʘV3j%^iyg>$u  X: [aBn70v%۾?@DIvxHzW?=` [06LGBթ{POS Ք/\I#f#^:0~0]H}8p!'~(ЭJ_eKHh}X9CbigKCYfCs#11(1Jm2*T;4 %DNC^"8J8y!Ϡ=?h.|cL$3>Xqo!ֽAh+ͦ+jI# į5w5[ 83J O3JfKM *Z՛{9ȫc*;Z 8x,|n/.T_U.`'3DЧt\%yXHb@=Xcb;@Rn+m~#\>pi4/<=yfȪ-c3$6. 9pet8jd0#}jn)x!G-Rf bմ'Sދ**2$D}|>}Yˌ:k_Sfqњ٥jo'-'I֕>KUSGPUs*8te`;ueUItѶ Ff5۹S]pv! s}AnoFjf\d'%.j5ZZڊ:+C[to-$"UHN*ʾ%v_#1Y`[ZńNEZ,43#@$:y@kO ?T\,J\ӺbN++kF)LQqݰ]T4 7Cl#5GQ_[X}ͩ`ֱO+9H,ːdXr›IVSfH{I9֟XO w PJǒaW"M(8_RvF\ˑ҉MBaAOsbɃk4fqOBl)B" >lW=m~'͈ `"WhHY]ǭ Csb f[J][lKI ")QgAmWk?޹+%هf+{YCBBBWÀ`}}! F3Qe8;1]G;b_Qk0%G6=x%3HWkN ^5,Gbӻ"X|Y[ݨ^?Mk$섄1Z ?ՅH| lDNɄFp6Os-:rgFBx;Ş::mr66T^W`$lIȯ7VXD e:bW@Įk>:/98_&d3zޡSN\Pқj H0$kgXmJ8/bc *^.X!':ХJ4tEtȌn![=81nc4xj:҇mwN'lNks@b\E=ZGeBd9S{MoMejM*^֡|}9ٮe;`gS %[A[1 OkSLztD !1L\jǕ=pf n C_*PWFTcϳ|Cg}sdm^#×Eݦg탺+&%E/HϴRr'eX%j}y:q͡˜1 c#)^2Ir6 N *-LK ™Jkdq1%l#'lV-(d,ʆ!vlt_XbRULe4>ң 7VJazH% M.`pv р]BeXfJ_%q#c.ms`>Uvґx@-wdK#FɛR+*=WB%>a ҄7Aߋ4L曱g4 O[?!+V߼哎S42I0뗍.W``~,%J2xwgB&[J^(k<`xKJp^qo[JRΐNʪ}|FncWl3?jP _PpnSC7ʮYmpfx_&ESY3,#ϱ%Pk0Vܕ붠mă5Ob~,O&8VaIn())UBݥ04N !3In@a7"vh0>?-Ϡ! &vƼiU^1"N!U ajI.CX^2F+NpÂãăZ%N~[ BܔY{zrqtcG& Vj1ʣML\e5z]y)=n%^Zw/RH@=!:Lub$kRo nb~^תЌ86>w޿1\c2 /6&XT0;"t~Y=`;Pn#v&L`~v.ީ.@ކ=RD썟*ZǩmSmWs)ESPbT\ } 9v(*̩3nrD6D[w7)$^;m|UW4 JC BZ ~=~AHȃl3J{tLbm_`k(i ç%cEP rͤ֜U,1N;vUyK |?t2.,>s; 7} )%{U_3g{dlR͚=D0 -%fs 'vRZ݇6=-]En{xrQK+ydŝQ~T`TPT2@&Фb]4]x"pxQmApVZE[\/AԴ1g;$'K+eaiO&O%mj{KMKsVw5xd"j0SUa__jN(y$f(D%0MXGV越Fדk^o [Bqƛ<:d =>>\1Q 2^M| U#ZTDf,"AP/]QAPGRj#=6A-K?b6$$`Kwn^[A}yەCk$mܑ?MayC|ڃUSq.2* xsMڐ6?y| h WTV P-g&xcTV`Rx‘kӥoeGP.ݺE,={# R%lS87k jҺnZQ*Sn^ ]'P(+~[ou@&/D脴\2.p֎gl2C6f')q:1W@EYZ }o2)+̬%EHV48X<_l<`+óWf9g' xnNi]?~y(hL]Gͼ,J#g]xR=0)Rj2Ƥ?֗[KĝE6@*˘ خӑ`6-n/1u!U>|"1;篼ߩĴE h(RL6qiFN6Q0yϜ\ۻ*#~x_kbf;Ea.(r_!fFWñy `t 6mmEu #{$y}L$Ȟ;sT9i?gKYLm -qΓ\acEb1ʑ*JUjS0F9&6}K(23a2M!}GF=ϤK;2+>y/<8ұJ$oK\oX>_=aJl5,Х']L'۔s0rM(4N P1n^cߦGleղ8Jcaٙf ,eNIQOPQ1e O`A28ވ@KU"w6gfW6l=7ES@2DϝB[ JNy i ߀v[$;r_'f>z#)BsSRc%4BN,c3qqil@Lr_j"mU:E4d";"sm%A.98@::uq!/y^zCn^$S/ uraZ`vС>*<[@&ih?]fC>2 k)C%3fO:; gE·L;a!էdYFS`1o$5F01[DI 4>G?h4:b.5 mug bF^EM7!PI==ϛ{Lc _~գKa?-04 *""Qt|upEX'Dg%UD)Ūe԰AB,, =Ԯ M9\aJۯZ<.qO"g*p\^̌fb oqǨё̳`;W%!66V̵90E1 :S:l}Ȑ uFNmP3a'JQQoa~/0/~Du^[R}7E8lNgc{QЉ;PUϡ ,m啡 N,8`,ծAvzu)sG`{[RF\B&!|܊rOͅY4t)Z՟ x'eD. X-z8 ;Tvd60mlV!ZSzztZ)fEp@S I#{4_83dQm0l@,_cKQ!fhx3[Y8KW15k{ׅA%HD_~K /J ^`䜓7ۭ%]k3݇2o,mN(߆2ϲFjݼ3]r W|< QfD'tz^,4A4zλeI{z: Axqf1V "j$qrM C-'0U {!9 mk5?F=)_E.YLYI` #I9y@ćl(Vƹ!trY%gLNS UDncs2Pji~M.X3"%16 7s-,}bD@7dFyì{v%Ȓ"P1y 66w^#~Jl).ߨ%)Jd`*o $a_90D޽ĂB#ZݐԆ ŝWf()T@ʵ8IƦYOvڔ䖸, ͠~UW'dͳEGX=*:Q(afWwjlJ+MUpqĜDcM*rht,ub[] y^}E]e=uCg-^4^ېOH"~Ag(%H^aڽC,r0B~7LeMΔv#K=-ԪG9ߐr犓+I)g$NIqF^I#5މ,dDhdpaV!9 wuViP;`yT΋{aH ÄgCJ3eGV_hѝ$zI,FTAΝ9 -r'> g$: d# ѫŹlA#:E 8G^g0S<nͪܽ#MiyoE+SW/p}GLSgC e^#C!$jNNǗNAvD<\fX\XcCg$ֶ2I>.joO w8SM/@M,-[Q v,,b~ΫqyGO:% 2B5M^^w--ݡ+ВWV.1.baU jCu`>!1Y31R^lR *5])j>Wb"}8xLcb~ϢNe QSIM2vxOXqG :z:K-K@f(FәuVI'Ab_f?uǏG%abU6+3GbHx #@mJ\|bf|\$.8 a:ǧ[xz!waf%-ۄRVc @xo(g3qG<뛈{b9Jt(B md8J| +ǝZM\hB8vɝk;'ME&9@TzDo<_c^!b!|nbaQhRJ3~e~ )RG."&}xb߼>T h0QPk&: BV ^ «e,w7xm

!W)A&*/ưp:x(* \ňYY}QǠ!h "KATM/JZֽ#7{65Z+KK-UCDijK{Yˠ<-%}}v'ʢ|>+AZLv SrJqFV[v6̟?7x=V8o&f"ٿS'.x<@Z`ǁ}\/OCxSN΁opHB-KҒ!,uS9S=,m-[}Hw.?~ZP3ajP :SZo"!ņJ7 \>$._vTZlgjUiCx d#x;K\44 NW{MJhMq]3VS(NBYãkCP΍Ja We`/ן&vǨRr4ǍKS('iaK u 2ñpb3h ~zߗK_;Z۱v[0榖f5h ({z/7Y'| w׼Fjv hIIRH5"aI= cQ;5bPhh@ap|$ /us:-iE Yu՚^bXW_|M ّՠ8iXj zQҞ*O,1@%o [E/YQ|Qa0&:5v5!m=Tm[,-?o!5 Fޛ=~R9`Db]h72T^b <lPN:==b*H'-,콭EpBOixU>l%| G5#= V>C/A7QΕ2b0 l@RZV7/n~vr2RSh-B6~@A*mb2;Q-뙝 *LF$#lrEQU5l|7ZW`M|_ sRͺHL'崕gB=3,t]e+{&2cMdVY,BafgQQ%\c٤ W: m/>9>%X?ҁ!Xߡ>}Vy%qrR2q0 NH \f75TdmN[N *lsE)Q z1{?2puGA_\] ˵g4B?9KGdĝS_ Z<4Lm^z؂`9QK1|-^4<}l36fa]lRJt4x;0pAD#EnJ[蔗.Rn;efTL+e'3n`ЭD]n&p \hAF[q߮Ji]Tq',Metj&v"Z:Y%CaBNgYZ}r)ZG<1( ̃ V?es Sw2 Tiȥ,ݢրO8&Ոy*">+Xjg t@nhȻ* aR1iYdEMQPÒ-ioaQX/EwUؔҢ-0$Gdan )˄DW#sSeoMKn#>"7pW18*,,H)VG"uEdZRѹkAS-. Eg]ct7}rK Ccpn&k^sh( k21W|&=SV> * \ W(QS6%[VӞ '8x&04O: 72NbHJBayЖD8IW? E2b"b 1r.{A&nOZsM_ℏinav`o q߁/N( b2 zR/ihQA\Ǭ!LS1=nC C]21)DS\4S>?uSpU~;O;.q" W<|s[ƃ1"ȿR m淳|R+Su˯6Q1 b`ckPQj9 4#_<,k N5z덅oeGa&47?i.Ђ bdHiQ3ˠh9WSR=&d 1^ױ {[Jr 9G!eX-`Jk֪QQcO=M]OYy0tՈ!y0 >_*ۙr?2fcZWH3p%i8O_8~bb oVޔ/~cIϺ 8vVEFRf3)j%,6SuO$Ll+ j#ΩGMMBN` Wz;uοR3=ʌ }pxuט㼗%:F)mIRVhD( Np<{opl )ve_(qP][K'$tZPSQx0Y#%M>wIL~;0%W.H0q :lؤ|{+M  /ә@D m!M;wB-; G}(E%axIkmJ>1c H.,q[^BWp#eŽ@Z,K|kKGj!V&Q,Q-.!CGmGz#Uq :Vo? ˤxw*u jtaB#N 174 l:> ZB] c@tpc^+BR`%6Q^CZiTʏqY{]٘ؕjd旨-ѪJ'}gE22#QzWw# »Y`+sTۣʏE=`d8-^1)\=_ RYL<^~B]^⍄Q< ; =fWX퐐ȵ1%a="+TR)|ȄDWv:} X_oQA2J IE% RbaKwpvD@~cș/*J&L8{pv I'{pk۰{r|/(f[&^Ƭoj[O,a鎎jX, P+˹r-Aon 9+HdH;0/2헬[ ]"a'Ԥvs+,{+-#Ϝ$xfsf.TlhniWn,K 'VǕ;n:>ΎS@{Ɔ+} ޕ~,6.m."dAe톇+r$X2;O~ Ok9g ?N+2޸BrgsN#8 hEiJQbrv<גwvp~+0:ٽf PWYt"#l㴚49)%HKWO_78J׏vӀ^^7m|#B%Cs klOҤ[ز/̋QM#ƟPɼxBmN~KrLz[K1l>;!HAK86#}ɏ͡ EDo|acCy\$NA1u%sFs|1r&K(7iANXu )4пɥ^Ts )m؈e/]Kv5ݗhFkRbAQS%N `,Mϊ${ǘ16Dw5jg"+g툙m69Or&1Dl6ײe<8Y1J[*/(8汦$H"v?8%vu;z*N"4T4RD[;c)ـBP|2p^-ˡЂ%Վn\e I|[ *]ay_ID^7G%³&j_FI82=8܈:h.qJw ?Pđ y^vG cӝj47.D 9D%V|eC +f (_3BJaQ_A5(|5LsP+Y0f5#}2=λ7M|5Up\Bі֑h0 s,kb9:S)y7sCFם6c %*`͘9~wge_>BQu ӥ|g; m{n7F=ۮ~JP#0| L/:!Rphp$#9[渴 T|mR^++v<(3 (oeFހ 4ڤ1"9R_HdNǦPl :5DRgχ>w$[2rLV 3:>, +LێeCf^U f ၰlAEO[@+v*YzoTUfC@_,s'gG#OmE!X,OKh<\Lt65+޺mGC![؞dǡ APK$l㿧%u̜VDP`#( ^%AZG^bIroVGݿPr|ҟ\n%|<: inEzCC1$骮$}Ɩȥ`ߐOg ,4l/GY #Ws-w w|@YcS?wh)q[15fΖ~ں=D`޿ G|b׸VR4"JPO| E8ӡ \§`S@h"k)@]ZS㋾ 0A-+,coۤ^Amˣ]ЮIa͈Mx%oW%0j韛uyrtut50#DL0\}-܏8P]^d:+2ͪ0e}BνxPp:A|/~-xF+Nyv̲ģ ;ke\$`e+Hh$FZщCpCo%n ]a#[,x%Pҡ.OW_Mqa8x3,z\4oExWeԠ\g1h듞@iB~(wO1[g>\+Dr@d̿@+*٧u[Lo彘BߕFo2b~by tѴ) uV2pd0LBKEtg3\Vdߒ^yQO[Q'mݢ(mĻ]z)[I|RI;YYs2,\Ifޝ~oR PH$3ghFiNنFݧA6,N57``Y}Xc`2B@D9=T=Cv2r,gj2DW%.$W' 7E9f3&V&zc"azpPfP(PVQ?&w F!$pm}1_4"ySL9-^FQ_ܖBupH<-ļ7KZG  BFNޭ v:#\^Avi?_xe({v;I+Eh0U*̥Eݧ0m_{b|o;Q좄wkf, QtuzT[4s0Տa` :^+Pw 0)g@^/CČBھZR0D"&0G1`PWUB 0uhyMErs)=#Phz,y``& x_O(q`Hq#AX h;.Xy<I18l̖5FKWQ]eM29dm^cJ.ץbꉶ[˛^0mxsr`f3v %SzNSiPoя#@քPcۓE: MpFkeLm}^{}{ǦY{nQ<6km'L:^} "A ˞y{w]3!岽Dk ]W3LfEd~M8,qlĺN6ߒ=̂B(LHOg5ci~\֐*j+c%4`7' OLZ3ǻ合C\'za;a}\V"VJkz+p7 RMڅ\de/ir @zДٕF'aB`QhvlS꧕Cp>9XiQGV- ½0PY: ^h_>|"L t?w,vSv!̭_mb †>UU6葍4Q f,.MSOlq; _E+nMz+[ggrGH ( 9RMB*WnxJcLsv/[N }[kUMK1<6]Ί2b#TRAzA;v޸ EBڠ,Ի0Rmr?7G Y!Ҷ0qqo)5N0# 6>vWZyF^G Gkg6_ 6Z!2|ϜHZi^lצk̮\ALgHU`bAyOPJ K~+2m֓KhsGښ_R[LD ~+ϣ{¹_P :Z&_{]x7~>SZq Yg#W7J/,;$Vew+(*)m LM(ͻX84ِ׌N_Nh7sw1most6.POru08tmϝ?$|4::{ Inz!iD X?"61қ@3$ɘ4 "DGI:'9}51cTp7oc=NxGt ɥb!?bR2зޢsVt?'0n fFFK 2[)Ojb!-=_wVj9dIa+P!W=`\ѴtKHUY:4?Ҋ-$& R uh@_w7kYRd`H$]U5%uj R ȏޛeJF$[$DQl1c+lQavV;7{O_8n `ل nN=K0N5k{c1$7%n~r^DT5\HtѸ?sO3vqo/cJhPjbFݣ|pōL\G /nw~-hX0g7*r͍W9p/x)kSyU7cq["]|>! kz ,.y%Y(1wC,s#:4E3hJYk$gFtb$wRa덧#a='.WRRSKK"r9z˶9ʗEXAۃs/p/~;;Lqۿ+Jvm erZ%ʍs""9:+}eF@B_ D'1ŇN=pILU>()"{-aL&asp6-CtMc^8ppۿҪTuzIG:nUh;qO'IV*QpBDd J4P#5k?--ApjoLc6C,œI!i'wipPbdrd=h,b;ki7 AQLW⥁Ƃr 8mx!칰1wv`#$Q:41%^'2Ң)z:(E *`1 ]{0;VB,Zؽ1 P0LD66M!Pr}AaJ_DEaC d2U +v]Esk+j9`$|/6'}i:I6O\XP$3+ NA![ei 4g3hgpOb1C8dݕZl)4wQi7Ua ӷ GYT0Uݚe8 @']_^5gm4=m c-iVN$H8D$ؔ8|,]^YzFqQ^9?43yl,AuO(^I{7\ĀrjיN'4nv&Jnu0$,W TwvwE|i:G\Ck)e茂=}ك2=-/cΖObe9L,AMkr^hRzc>c/36%OGj*e U2V\Fz^V^H8`?I5~-Sd8,U@Q3BfɎ`M 0Xݐ#C[J٧o H!H,8_GTM[= lL}rQK_+ F8 ?n"@P F`8[_AM:c!:NZ 2F-ɬ#NgQ5J:F{Ub9ϑ/WPaV]Bш1io.p A/WMV2A*xrەb9ČvR-?/Џ'>F PƇ2NxyӹMd3v~n0ﯜWZtw5uȏCH(\.^װn80x|XFpmTRC 2; K3F|;S/ ' C1Mv ̯w{ysŇBzB%,- c/MéVlr[ˊnc /jM  ],M8CvٷORopޕFU5G&tn,!Notٝ~bGB?è]9p?R)= W.σxk^ua4w8(~[g| t `D559u{z|b%G)ےQ[Dm4̟ĄQ1J&MO1tٛh\$f~/W $FMARw]tiгۿ>W%OO7J$aJ%]zfXHmC\;Ɏ}LV4iA7uTDuHfm [^|b*Za{M g**a%Ng?!D.C(0X-/L267$T$(X`+8B93q2C["yC;48ƹ#]5Y\h5~5-fdW<3iZbB֛[-kG!.{xlHXk=hp!.wcЁ~+' +7Q1(הPE.϶-л:]J]J)`œi Yϔcɝ[O;k1F1eshezRJ~(lYǏ 5Eo`Z c&ԡmau3#ֶpӢPG'ΝIi]@")s}/y4z e_[\$(V;~koD]翇W7hMk~b䒙D{xḧr O>8O#\?D $ ģ!hݵ`6p&ABmؒNux4|e t XX2@sɯw( @Ib=\8m-mf Z>]+c1_ٔ@fѯ_yq)=坻XúR-,%6kա8}^ilh!G#F)?=)én2ڏ ]w~? {S!y%r+OYQb9;}gVaw^R~to΂T+6?b2fnt1`MOe4(z+i+0Q0^ZA.wOjPA7u\2dCťE- 5Bpb-JCtQ@(0/ޙ! 8Wq)H_mS]vڹTC UFT;0LAF68S]Ju\ݦ[K˚_.ݼD13oi{6':cGD*bo$Mgp5|榯(9ݓ J1HBrF&Wz$#}@zw%8j1#ͱ9ʓw^T !,\ۙ"mrXXFirԈ!fOיvsoz&NY5+;o~Dm:)]ewCCZ1x?>mG*45 gHq9c8#GYXi"Z6-|`mU E6d^$:eKM^o5F :k`cxSSz'G{̿* s,<,^DJS&]+AD|'p~EHtZ:H :Nٖ]31Bs/"nT5]BYm07iCq!H55qK8 jH(}1zXy9h@>{O,t/=[g&8* w{#dJHe`tҞ%+ʺt8HO`f6ęV ]t*"n D/\3BW&n_UǐoYH٣,}5DZgJ2z/0cmʖDI0?=}'Bbu㖄Ku*Iք<j#]҂]=*H֮ MT!yMcᅜ"rIL$5~;_ыׄ~c4FusVS "'qk.BZhf OV7% L̟Z@u|y4{vt\b l[H@փ~?߃vѩNH}UӢ2Ow 41_G(9m+`=:mVtiB: ?;6γ!G:~aa7:ޓnj QN:سG7M4@Q;Kp'Sz< ;5@"BPss1&a^&DփWDa{]"o4'J݆RWa/w޼ƪSmY%vUgv 8:U/| ƔZ}d!_MG $Pb깵N?Im8!5R!Z+TJט)i7;lX VdAF-QfuhrXƉ# k(k.[Z Of}8,4a@#]خRFXJ;(a*F2R/e=jo>q&QϜW椴`u߼acbgm.bLI,Q~̢̜.W]H|{ Zڽ4me/0.}?aC'q8s:LKvGR}=zbQJHg ꣲbUyJItMr}bz4jdo9,J%3?FC==蹍53ic˷;L.O:w w&眲7@ cCMMWh= fYRW9wÙ8cǀPcڈxd{FY3pĨX OcTzGnөE"F)~pv|ʔHR;%}SstNfǎ->W"[Wس;[ES4I Î&<#Hkvio$h}EjW,"LA% ~NI"?>Ӄ۬^{Z,^";0 }2I[OfH&HգЬ/(FDr|m_zi0e/Ƽw ǯG*NXnOj)oG MOhBxx`5NMq)P^w:#ºB`VFF~`2.Drƹkݴ$mf֏sz]^-?6*A*eͯᖾldъk8'kz!h~k=K!)o-c0 =kBAKGoR)5@!OFy#4Z5uml}_dE16K?xE46^ UzFq5)BL+dZ!&O6(t6&D  <'ң$Et! +.XKx0 ܉2C2<(?hpZ*KRT6tگp"YY*)W*j+ܿ-I,2ϕG'{ PkXoTdwYkBߤ+27U:fo6WS`jsP*h`7=7mx0k;G6șkғC  a/_^}ذgMaC[mɹg:Z|{71n^ZDo՜:PMIu.ѧ  fk$mKӾ8*M2ΦamۊMi$ڟP sCN[;84'R̹}`9i?K*RX }A#a/ 6 S,7 V $)s#DaYMcwIxb 57p̅dgK2z S=ൕ(hM1.3]~27F ] jdrܗ͑>TZH.=xԶ\ 裏p9 $O' մMof<52?_Ce4`U_x"Ipɕ!Օbi4M̚jV$7xf2j0{BəeAl}f%d~*uI>ik;xg"S']{Xx|57b'ЫAQ zhtNu8;mv[2S+|Y[yX)'/dHBP.-^ K5S ~"%Y=ve#> ~2h_L:u#E"[d{제AQ|MwZ$SֽJ6TI5 =++$|nh'ꊚ[rCu\#E-0YT/on WI_mV{&Z«[]* 6惮y,q| @[hԕ[dK8\(W |Σnr;tc B9CiIN}!::zvS)pK$W6ğWcg8 b-3Ê>L܌&}&3ZJu[v^l9W;@*_:q[H c8fIPҀ +6SSM8d g!~UGjyk]?A܈Z.7W%@7ܪ+`h"g¸{P964V⇽{ҦIs9ƒ x& Y&ٶ|p6$b/vA [D5e4ɧ4P9idQ>ӤfaӁcUݽlD@TSe~Kf sgs)O*_ja!na<֔+{0" Œ]hOAWVZ}na[PUZ»C:O96ft tB YʛxoGU?}i>0+aKhEE^nK.x3sVh6j$"Z\û2rVwEurmS\5} =k .1ܩS1Sg'\N3$`WB?nvʡ /ףL,yppս_CRF!`Sx5hƆCL"u.͔e/vwz7=t  yTPN"Q(f[**3O@ԥb"tٹ/4tW]> W kRqsj ;e_U,$(zlf^~w&,Sƙjpw/;d$T24WkgN K;kA~98H"jI@Q0h,RjTA!OS9KF12Ik"ǕdEx/%hÃ?ZUrM\nfQ266jBvyW)Vk7Kj'%Upu LPH;y*,q:c E3zD2E4W5 t}#ܪw_Az۩0VdS@j:0}p9:L:dc:Fi)U%I cgcG\TbpT DŒéIB\ O}$ %xAUbbUBE9kԀV&P}d em{I`>>sYeYN 1lVH?R7<A~^l}R9@/Vڿa$+Oޜ=X=ܻl1۹&E0!cz9MVHݥ(l*G#ݦʏߺ)lCvT]aJjC`MTwql172~)r qR@*is_K vr݋`CvYJZHdVEAd:zhvSF&`1Ѓ^йBO*22CF 4RhS?Snm/ @!B#?s7ꁩWN:bKbId3mLx}w ?_Ri>o@-86-TRE- KdMI:͗x. &dx̟ewnU+4;Ù"jLoO-rRhS 4T~%o"kk({ nIi_G @.?c";uaaYeٍ+-ݜh=K9j,Džt!Ԓelr4뢰G_0٨$o QU<>2euAY]1q u'wc/Pw4kn0%#LԭrLjqtWu9L_kH7k$z3&v1Ӽ&h#{J/p*bpL Y,nE$E|zm6635RE,bLL[6niZ'>u-9i6c 8ӊ-%y-.}VЯYkK"\TDŽ \u`_&;uOk"kn=`{  o47 p)rn}\&hm*#bk7|a!khz#JJCEcA=;e[\)$0rm*4ާ='1$wA0aJr!$v=}4ɹ͖rNlpߧ,rPb j|d DCiI) *ĆMADAt /8n;u$Tga92躧NSGW'ɰr\Cv-c7C D[Kk;/N(N4+Rʁ_o g_,5jxׅkڸNN.wNDhz--."1^ft;?<CI" 6<WSM^qrS.~@c5f)q-P/8D~B!( M[Mս7فm6nɼ>y*Y=,4hC)SW@%`w/~K,]*t6/R2Zh˶ !l4pݝa+TG׋G֕boJփs`AhD[;N6t3k=54T]&/KEo.RREC]KLՅ~@ ~f(K7yȐo^~|ec 4U$xjCH\+M%9klIr\"G T˗|Nky4`sA*w6xgW7Ӓk3!d庶B!M] & h ? <ɗvcZ_8F˄G >K&u ^!300X#Ա:8ZR.Qtc_wy`/=9)%jsnpcDZ.13|9Ag/J2&<):|&mvV@^5te 3ȗ:C@y9&bm3+P!$z#Fg:jbXQ@aU^*Ԏ+vY!Vܪ}a<.3)> vh⹩b弓czl K+~ w2 _YTy`%|{kcJJ D-},?*I 8>̧oT}{-VkTT 7PI-5D^AN#*<'Y,Uc;ˍ vS-U au qA45{=_oT{x=w@w =7c _–>3|'Ȟ+{v-LTbڕ9<#,D's$?Q ʝtyo8,T];t4a zfY@#F&|%荔蝹-bn͢j3ZG:3 Q~n$N)5LxT yƭ&2&zU?{RNrL1$t#IJ=q1!P z|շ"1B3M><"+FF.ARlнRRP1O67{d Vʜ2,6_qG@L4 b4 k_$WN"Mw-4@2 |aĄlvS,VS1+GxVvEeb!1|153E~ZZ ?SKfrYK~)ߓM Nx5,2w;OQ慈JkRD4^5]23i~1J DUh@Jl!a)bf+߶씵] c!2y` n1P]"F#+X}+7J5 ̓\o l QۊkBm\A'Ҁ}xX2b_k<66CA܅ ﲃJ G#D]JbSY>M;5r%a+LnbVb9_լ$!" 7ηzi4E+BYR -!C8%shcsP`U= KQ$FJFd%$[;i1#Ro˕jUCax9,Ě mG6jOμΣ~Pu0t۪$Z{M[O׋3i.\]*+v1sχ=X/scku[ޮl̋b&M\wUH-ד9(H|/[? +>re2D U䑾iW$'{'}# 3/nT c~$]e}i?,LyN=L%q; Ql ûW -/1z/j^WB`y`BduOLESnyY{mDgx to͇geH`qsw l@s8MJ]9 IbF;ÇtS`TB2)>,qܴ0Rz<8E*acvez`Z>ꗔWեϳNVsc,8$נ6o_uj5;"ߍ|ݰ;?(@߾ tY<]a2R%w+#`?e#jb^R=?[$g9!S{WliW ._b#06$9vsȫ^7܆7~3VHc `0t gUI&_1 w+$EGړ֠Qk3oU>"1 Z#WphaD*_F̨0P+ `sxSlB?8X}VKcD&ꥂ٬q5޾h& =#c!Q٥FE._ rrFbjF#0(}uZxQ@AY>QU1b>ă:iڻBH#.̿dU[!X-^ HDYB"VC1ɵE0ֆxAJz?׍h~S؍0k^Luk8d] Pi(F Sa/> ozx֪):>:鳷 X=%e愨!~`:Vfedz[gQ-]4\Wc}16A,O9jh 1w0B5 wRľZ@!l-kk",C 1Y.j,Ğ"oΗ l˃ ݎJ$:89KI|Hl(k?ۡ7ㄇRu p 0eԩvK/Wh &0n74›mlӴtɉ6m$ЦGUUVwZ3ϒ5oWhRz+Uas'1{tSύri<Ж˺$xn*mXvvgMb -@XƬv}g` |u. w8 ч.j$N7|k̛W٧?{ZFxhA1gjc6h@b#"ӣd9-<ϕc:+hD%~]]GvBJxK:%2|SPb%Atѵ 7PY@-M eri~Wra:` ӽ[lO}sO,wr*cU? rcy^? p T"6ءM1 K5"O '=wg+Y^dh-3L?Zc+&FjVoN3XUk~Y&ښ3q`"ANY{d=Zvs1 ޡ>׀2~Ac+!4Pl¼g@d`|c c̚ #\:42t-<}zMo,RC{\,h~neÉ):!ІMz?T81f$ז#u)n$E͠E߻YUm{3 ߘ ̃ =_ؤ`*Dˉ# br6b7,`Ҙ Wyy*W"H/Pre֌]>nX@KxQ}i/u}l!k=FR+kdU7щ_OⱮ'"fN7!'1y좻ooiG<0H:id=%b`}q\Y]Uu= LxǺbd>J" nvqpb"_"˙c[7_T qYO?ꗦE-. e7䋜2O}Ӏd1AjvBfT)ZBQ}W5z@!av_"rfbx8߁Ql(i4lmX,n1 Ա7녞/ '09.i7t`QѣЀXhM=OK2~s,&=u拙ъ4&)_1?{!DRH !2[ 2`}VZ-oB!ZhD{Ө2( J_UYbݼu~zI'8,c(jqa]Fwd,l鄵So=Kg0 8*ifɉdru%H3;8Ā|Y2.d,a ) ҵp$ v tB " (I37F[Uo'Kgbs==+&0~18F |oJVCA4)`XJ`> ? !q٫[,k'$(?{h=}8>WJ̷03R݇dA'nu#e􂏋kG ݃wۂd_  kbT2ZuG LMMik^ G/b*}=XH%b9k&]b.8~+YĮzZŊ _j`!|zm0@T߹Dwm Q؟Spߖ_[ (>Y6GMV2X|XӪ$}Ϧ<Ll"L;{ k~x4ʦ@ڎj t]iH? _~G ,DZiimh/rυ*.69fPFLۮYlrf tyW IBndE!hKͩ\= ''ɹȲI:%M]luEgv/`[x V`lMtSǖ.̐>na~;-~ Mħl<&;DO̸A|Zv3i87xH!Àw>6=G=a7F{v/(ٜJ`c(C/e*v7l:L;OrJck*%ղT/YA|wuk@Ҹ1LK>:>.utARǽK ~P,b-;)~Klk ^Г=!3y@AF@q4tcOq2w#|К㓋T3_:~#GM,Yp%_T \qI>xrܰ~({|i4X`nֹ1q DEP&kޗ3D}"Q1NaCc_ܬvA.oj:dfirUwr cӐt] gc%VҟǑyﶁ7W_g^Le߄nƯcBh?>$BcYsF^˾A_bz^0‰50%L`\|E٬m4ip:f' C><$mHŒߕ^Yܽ{t{-Dl*'7 ˡTLujEE6fΰpZ;3{V^R=m`%po[ d~ޔʷfi_ Ev(F!'#3"a"L>dj(M2²2}g)jЕ+'GEb [%K }>Y L7;O='W@f-xD 6֞YQVK>KׁRƉߐㅶ9OTz\6~2Ťs-\OZbL5B@ZU$|ڶ"Ư֯+8Lwxaj[ N|*t& әD^y` 5i2`Zjl®#!bKŴAdsb@AB?hH2{5Dݬs^1%؎C-jU+Jgݏ _?tfejA_%Sn.QsP1?L44H$Fl8J[KfF$8Fi@5J7̽@"G.s= k[C53ށw0X{#mTC(ːg,Xm='=CP}+[eF*_]]nd;J/뼄n{uzx8l*u^ 6wI]ܬFz鞙v_?l0YfBN=~B,b?OF6 ƩERdUQFb/hq,Q! ѠrOy@Q7KG$d q qfu *Wpl Kעm׮'UT!?8=^ۏov, KxülFQ zsRo@3^$m^JҨSf}b$>;S_Ysi.\@%i1։,;":̖D+mtu،4Q'n^c:gL}~3KGCӒd5kC]]m(>m?TܺR$X8~KU@|O“;Ð %ƥ(y ]n(N߾vZv _/-fg]'UJs&t9ݡc8{]}^-qHu}ƭet"ԓ?i~~0ˏ@ȋB̑ ]m5AL0BoiqQ.}̖1eFZ@uXɞ{7-eCS^Aw!u zPW0|qpĒ BǩʠR4Sa qH D]/$eӓ$HUȽj jW+9燴:(V]熀 usxU/Pǁ7f/-xZZ =^6 7<:GIցJ͜FD -6 /[|[QBwKea{CDΚS?^v!33 96ǩ ;w ZJjXXfIGo>]'Ԫ~ @/[O쁊rPc_?69a~K}9~=$&Z(9ѭl|ѓTUc.6NӌLdjܦ igՙ߂h|H\6A$ F%܎K8[]:Kgz2T՚sɧޠFmvbh)KeܫECj"{sրB B.]K qzBg-ʁ&W#ä+p*,7X}+_oLZBx`\\siLez fy ^t24$6đr 03{W/6Ǜôn2`mS}UKj46ΦLv]j5ɈUV]8R6^{m{O;;Zy #vP*aTGHp,tͿv<_DyR4ߋ2pH"LԞyծX w|e /JcOlё`A.ll3Z>`?xU/,$S^h_oS<.O\UD+'=(s+ H ktvk&N  ܹTb ϥuU"GA3[C4-ŜSc֛<&EqaIѓ+L$Hqzokocl:+f}QdV)t{bL<%':@8 dwį]Cœzӱ?)=%(J0ĩPm9]O.rCl9\񱋌mItKrD?Vv;`tK&~%ѩ|'|wfe(n N`%nʗRItD Wd8 )f,hAϖ(0"ĒC%!)R"?X #c)@!;{:GOFARj1$DwN LJ Ynb*)j*w9!1b8 /%؍8OvD(ڨ|ߝc_)N%Sٹ9'81>084݄FD *XE%~WAw xCz~Iyl䕅1H=6uTHUOtw] Fq M# &W;ټ})/g W2TzQ\BwgD X\.!@MowtPk lO8ZqjM0j= ,AMhMP=d2qd:fKַC#b>+{0|O6Ώ8LcTF݋+{M~2b0/7T|GJ1†IJ)As d,e?]3ڙ*]rT$#[%_D\`JR/r\\.ܤ9^ 㕮Λ:$pLx&.UVTĒFH)I1Pr| S,29BuBv-AٶƣŶjTU037#&Þ婵uUo?-ɒ]qjC @`׿}ÅoxQޱ IA0%ccҘdڞ"4u7_-`$YU^2Q޿.hkS;'Hώrvc-|}{-(Y\p;XX S,>r7%98\kkvUxt>S`O-E"|d$ kT]%䎥0[Nɲ~]#Wqv8jv½xBY^]7wt۶F#a2rT!,ECl8/(]mwz$ȼ~S)zp9Do'%BN|+k4ނ6~2n`H hv(ҳHxJY.)ر@*yxwFlTdu:(G2-QpjVRc>88ZW]Φvnj5t[#^P[X&gT )@d==:m#c{J?)|.|G("3ӈXmv9)YfTFd'{s,.ȳ+8<C?Jg Wg k^F$4g;{'pqZȦ {cHx ~1wRqmVSIS\.zA*f5jInVc[PHauQ|tErDϬ 2F;6i(#h1pu5fU<),m޻GGY$sҾ9o8 @zIE!vzѬBTJRsj8gY?O-OsT8IΜU5*GZ$Lt!h.-h2R~QuVFQT滸wkQAS/)󵉇&( Cf-wGu7ڳts~SYrh [c DmҰqI`/1uњ3җizPԄ|?ѹ=>U$W[%;{,#R?"/y.ahӞmt=Z_vk9vvI: h]3IB8ω 6DC]6]Mx5~ⷲ,1 Nr6͒AX"6ݝ3U ͬQwr`TL/f̀7^~SrL OR=E,$|܄\q6X[Q|/FՀu#pG3łT+ļ}SKM>?;`mSYŔJۂG}V"%NQ0ySbnQ/;6ZT Zji):q)f҃V!-0]QC)6XQ&&>eԤѯPS`;GE(4iwYxڥϧt GDj$`Oշx?K8~1_DUJo{WuV`Ja b:{ۣ…dRL@$@m+:-ofP}GCt|;0`'{{zǝ(yޜK MZ<l@Ycl84-$>8GS,c + qwnJQ 3i;w0GTSsp-FW, dh>C z懸 jZ`ΓQɚDyX^ <*\lh񇈉s@lWF)z*_KMUϵ>~[c2XX[ōzB I̒:ܭy_%qR7uOn CQL!:2A 8?&p.@ Db ʈyP(e!sY9j(׈$TNC֑L[MfhC6(yhDu@<sEw Z(nJR2p躜U.7e:F}vћ . 6~N!v 5F\!ww -L"[j=qRӾ"E*]l$i aqdz1[P@* L'Gq ~r A 2o~I,Ejќ.9+ ,RSN6ojJ?3%  @HQ3HҁbԺIݝTJ]k Hnk²y? t{t -S~1 ɲɟ\]+"xTCrv=؅RQ"EanuSvVD}JG[cB@̭-brmXoo"wTNuidƃQSz"?xJ; -FĎ&'h?S &٠PE IhU?œfm$~SV{~ [lΛ0&{;D*JEN庎.hvγ 0Ϳ}n^7(6a9GLKbU}&u98(cI= pحFNI-h.F2elUrh\e+sfRЋū^[S+zKؠ@?G)ʖNmlFK]DoAk|4-zZ 7`W%*)*#K|ͪeUN{dMub *R?"`wƔwO'^X=}O:Xݳ>U"ʰ( ҪqӞf i~sڈEK\ߊhЍu%r7uxސrPEǢ޿Z~Iɉy"W71]=$uEBڼ6&[=ڠl1_ם*E2}TE&#ߙSV2+O誼ywwR avtf) PXN%^dy`^aJ=C ܮt{ԄpY>$_\t5f`^X j|2mN b;6"=?Bd:{N_&W*Q]ȼu!.+@bp P~^ E&/ ٪e\dևO$.1AҞ~\Y*;ƽp[7Vy2#Ε:7ކxLw8#b]0+-Uo v/ށhqߺXԂ 7-lBmfԎQgfhp3t"sP`_<{&]DzL7M c ?$`!A"uPLI*snf3+VC*?% دpH/N?%5mt:m2uhcS'*!dXՊ>0ԯ1o9֬L|֝D{Z zd(X?T8,'[%F>ϸ E~fl/%2H"F{gO透@_iG*[Ͽ 0[?~aKSu\]` `ܼƻ.ː˂ FEоQwpq:>,d"[%@vZsJ6@!@4$dE{e1R(A]ά:8w "\(~;86p%f /`ţ'w{lrʽIP~CBj5EVo˲vTX ֓e2~ҙTŗvy6H:jr)S ]էεwxpf<W`3T)47W0ЫL lB"-$M-ԓ}BkCJ00'|ڮY9,)L^jXxo2T\v`{b}'Ld"{ה~oSj~1.}V䃜4>swUl3V|3Nr!*7.y -2nCWtO*TH%Y"<.Z:MD˹+vA&jJҎUYj#HrYW6DKY>?s*jZX5IAEJ8<.ʑQM܉hj3`;Yo[QphI%];.ggW|;PcXǫc\~SSӠdKޥKw<#~ p i#+hMC>F.r0PA<{|  Dzl `ICe: Qs1Rē듘AQK =Ʉkk5( Sp%6+ww2 ^> .cz+fgu&һOrʠw4QXaֈϣ ftXc5ns<CM5Ł~pX5h@nAT 7 ׺""lBly7aF@ }7t9,-*VRp2Ho%d@w(K:tp!=g)?CV[ Jf¥dְi5lz/׸UgrT HFvC|bnNW(o[O;tsc!$PFƤ7pM=u_ _vQr8/Nrt#R¯ +  PH@[:9n?e Lң">\q0WqBMXV_ ` 8 5J7߇vp;& \nIQDծzXЛ .vp^ 0On -h3Dne ;[$1Im'6SQ^kX6MO*'m|,rC5pG0V68`w>?/XKA##ipNP#rฤQ)4ANoO߽= M'!o\Egr%GltI9L ];zeF2s`ʛi~oEC/USgmM!x' ]9މ%CMTڤo⡶MifV$oی 0`=Iwߝ)PiIq/&ЉkT:梻4uǘCaHkN4R:I &zWMsB<RTlC}K!%[pHّŞhƦtK#|oJ_A^/`fUSقDbbf{[w="x۵DIW+?)#6N~~9~9'*MX!##ݱFPCQUĝ p)QzmB\V'%ۈ`nkPrcD`O2 8[0 !Aޢw *c?_\mV/WI69v=h`2NT7F:dos5= Nȥr"V焁)nEȸWH,\5*#]XCm][; Kպ` Ow&?Ȑa:f$՗SQC *5Z/b`,\$j)U= cPi[ f۴?.VX IRtjqظVFOXZ+^L2x0*b j()$YNa2UgA]GK}d#uH)t*bm}SJAȪ}1e ^cn!Yb1R0qPu'Uw5Ĩi&ԊYǖ c-4M~jP q-M@2M_$熖%#+uR~A]\߉ҝ?K)LluRtXs]jwx2Eb%Ju,i g"^1Ͳ BnLJChY4v=xmO:-KwĈ*4EI:"7|ǖ[E!{FncBUrj#AK7.ėѢ6D[~i6@ocb[bYNۄt|y a؂Ϭ F|+m-R_ k㊄kji^ ?i/kE2nF9C| O#s+"@s ̋όl<]|zun^/q|ӘDL1܃߀j5Ā J':hI9}mJ{଺Z)>ZƱSqy諢ǝ~_.XɊJ/ռH dꔏ49:f<=$%(~w"@P:#mh"dϠ@i\B;]H4e[,rTtz fwv kF:ISN pa~U!)VʕW릋Py;$uz!ߙpB:9u5HtظB?<|#%нp>ޣS_}V[a~Lj`t/,\Ÿa4`3B:U`Ϊ5F(7&JK4.8c*_TUOq?[lܸԒIFR{2[@U}o}k.M?W$UjiV{'`O3RS_4`$Z[ 7]C9:ﱘ|~Z>)AR=s ö "Z"ڠQz;[ Rd!+3BlA7퉇{Ԋ/ЮKo?W51wldj_k(lTRV}[?Ub ދ^1g*4S1-k[EobY #-Qd;nXи] r=yU'n:w#&f >[,S>cj`D#{ۈ9s38Vr+6ųS7w Dh~ J"ΑM{9=( QIXp6(mo=sRxi3 -oďL4$2?BQjn_Uiƒk:zwH9b쵾@h Qk?~O܌Ű!)!a7MRA1  Ʒ,I=~\cLaD ۜ p.}~fB kr Y׈Dg{A_LP$% }؟p`cs#3' 8 dxkBsh  z:젞~]Pu=tߪD/ ΅Q1 ޝץF F<[eU=hnw1ɸ$f;M,@(EeYo<@USg+(B=KR- N箱^1tDžI?hP0CYeJɴ(1=_]9^~l0hM/X3U}kNt+vI>Tf=p=Gm`[MK3g.;vu}7qf B̑T+d~Ws)X V d6T7ENpkK/ WCY(SEl9_/ԟ,O+2 Z1 !3> T.TtHb:*N)9jI4AI2*pײpē ƾiȁͧ.^:'@/:C5D#DiT_>' -Gn(p!;Bˤ΄qMWx_bA3CE|w ǣj0,^oRqT`-09cBZ휉.'72)2/I<؏|T2pMf:(7@F+rdcx8"x>bؐkleKOa6ŐXZ,ՁdSd Fɒ>0CvԎnC4PqB9AN>9=uDs%mOqޟ>_Vʖd54s 't@\pe{&&Uѐo(N"|{(G-J^q.z$[[%fY|e Vc۝\ j{ *} ~$Fx-%#6_Fcb+4tBZ^$E*eqZkGnct:_^|򹞎7N$mu{-ߡӲwU +kL.lsb۫1^ e@h1$`.oqJ LWS%h'T)]&{cN8C|(LR]ѝMH"`2˚%GH=J6o`ҫA}pKǺ/ {aކ!c<{K"Riu9'7ďB֩{|V0(slni(0H R  p #Nڶ IiP"}*/|h׋];F9͛k8WۜKT2_zzĴ_8mAHaSš,UIhJ.>iXkSD's>/7uSm'Xh!BS .Ez`uzO 4^NP5HRp!|m9.Yϋ_Eg\8sY[])gi|=KMdg8?(Le@d>}{OvFT .vf[^<+#/er?mv\/,mpx <is˵窃I3i ̾U>K$;yRcfH\ޓIkf17mfS#xX@gYr: 3wz[IaqMx9! k_PV2_[# (Tbk&|Y pefZ-(m._0de)Pph"g+Q[ yWSrMr-U\!]l_wtT&u툐;xw&dCe}RTo8&ޱb)a0cagy I}9dq'lF]#<[Q6m.WM2YjlF֦<ovQ -Un%j4sht E$BC's ҫWsBgAQ`Q;@ aKS*t<1:Vb0[iPUu ;u0(0]qxU-e(!;. e얕{N>!jfi1◄r~G@[)y/i)P&Hɽ cQMyp:"/pv9'z&@JFS9.[ 7aͺ&UB]gnRsԶ|5 җJ" *6J9Z)|A@q!y(UgA}Z'cIr2*(^­:JL|e8U/L\4uRn`1h 8f+S @m(7Âyu4bgN Oǡ|P|u+f%/O=c<,ÖOW= "$8 *7-kgt%;QS'~*/ceC 9 H%ϗ2p8h*\y${Ȋrv<8epz,TN VO". "g|[>kw[ :s"ߵLN$Bq×w4 c]A {efɿ־Equ,5Ri9-D fE $]n {Q knyI+61T\:Ų8#z-vkc~32,|:Nl DBeDv8/d}in=WҝIήldnVTBE8a00nY}e/4@͊yCrw|\P*gb'9TZ'G̐U^2!XI/7+6JFjTt3Jg`S暗)YM[r\6Gxa!Zs-b|\,1tX2B2[1 gPcyV!"h$I{ȉBc^FT8q>`E M;1OYdNPiMk>\Wz]ֿƑ1$~'AyI9M[_|L᳚1lYü̻3Tc"rЩɥ6iMZk֓о6̏'CÔ^4{%gy."~_yOnFF gUC{Cϧ!7Dt",C驭`d🠟D| h6c [e?}#SNP@WY$)E"a%V Aa((;?^La0>LJ|")=D aCȗlk$B3)o :fznx߾Q؍+K]9G;[cSZmZ\jWlÇ4R //?jpHM3×&JGKè&Y\"m笒`8!g?ު5FnJ ׁӐ^"1l1p8ܖ3_3+4kVu=q^1 S ۱4;m_<ߝT V07xGTXGĩ?^7yrjeu2BM;P!=F, 福ŲVpc}m2jzS-lr\Ȼnt!Q'ʸR5Ԗ] L)peIq%DJf_?ZNw tOd̈́7[aUg)FB"4f.,&w R"xD== |T?k(g͔SMd >7a)xlXӦM/80!~@ SjXĒNE/B~['KKEyN;Q4p)a$of}s+Y*Zǩ;gVt@Oҿ`яeF\%Ydf`;)u `pyIIX.;3*sj.tGmW$*+,! 0O>dc,oZ;՟p.7PrZ=ģ_큣Kj,=j^βGdǡX ;Pj+cD5%^'+_PJݛ-/AyT4 <}=I_D R&;˘p.NoEQZZ@e~xLҝGD-縑R'e (6]_C10 Mmp &bG mnǔY(SfǑarOuOi CG-Q%isedf"H<wP{'LJBf+1_B+ 0y6%>ڷoE?X|qW%Z9BgL&|"Q)ngrzJA^!=%͛ZLmsIOYMtmhDC hn Oڌ =wEC!ϯ~{~a('hj<`ΛjdbZdge\H,GfLȜk N!댶p Ѱ^ӆI>5 9QּorPԾgs9GuJԒAj|47v$_Fqy8>x}~wD3פY;!ћG}@بalI0/"U6^ ⫚mg& 2%ԁrB$w34ۙf$A9Qna| *SAPҾqw<-H% /G~LЦLY +>Nz^뾾䲯^E{z6$`@1J "XLخicΨa 6H=H_f %G aGʙl:|ōxZKLCH]-+I/تah@):n9IUHYpOqÀ5[:o{^ ?'+&eiC=/K 'CLդaf91SIxqMA `FFp`ż MK<;\܆I)B+;Iњ92=k=oXn%7mӕjW 40!qH~〭?1z%Qb4ԱL=2@vm㬕|&鹥;`Nud%"W %,uњgH@-UHK|*̶fC&<["@Il i zG&Vpl<'I gx8E, *WܷS|w(!bTwkV2, ;h |:.{)vgX!y=Ѥ3/2^noqOAsz/"HG^(*@w 2(aaR ne8ԨQdG8:}T\ =Gx~qQA0L,8C$J-Z gMZi;|2zp9z\ 9ŊTq?Іb]×\7aƅbjje5de4Ć$*N>Rğ%_&Uu{hΕv2\DdLE nr;Xocy>%aqqf/Pr8g5lOD3QdF8k{_+Cs=Jq1CಶDc̬țs -4tf(uYYɒ_A0%9zqEU=c2P!Ut5a..س%Ǵ=L.TΛ:&ZPBtt:ĒZy(HmAQ˧_ rAPݨ 5ݔdl_kӻ3?Zۨ %3Ba)DLI<95-p\(Đ\!CånO!a*{n6 7ƑC'1 >7&]{2+Qq"MsY0sX%peӴnOi!hiojBP,/jȊQa '_K*\wkԝ5C/=Eԭllc/Y ={5Z svr>JPϋ;݁ nud]1mjYz6O0ɠ*-'=~G}p#J4 "}$56w 8p)@&r*mu%S\w#g!au^|JvgڪI%\s[RzeqIjw Of~/[RO]Hbꏾ[#|аh(Fzr{FZ+-ϫ}fV U}@7ZwN&2;;sb{@>x87^&=t7轑7Hf hkbJ|}w%>&6yH:(F/Ir陯r؋u d<ϑ'V-S8yׂ+C?RT?OaKf7d!_nuCȰ{[d9+pO!ccŧE%mZtˬ07`U,{ޞݯ:#M~$wW{bvpтpPՏnL ߚf1,4'DDGK\"+Ԭұu;@oGn){_Daj Eneʝos0c0b.jš.+eIy) Uu؂/*1jJ.ejHϻB5GaP WG2:,C_}t$n}mrQm}gEn;pэ_I]oB+-{(S$cn2on#fȢ,VMwWCvz0C.= 䔮B+11&F*^5s`3L_眗$I ;9L@ &ҁbSUw6UUY @/e5")d+aAD>L߻ S!%"\IA,c?6U9ك֍mrYVG,y:qӱ4d!i<#_ПW±Ep*vH@-+8j\?S3.Gxn%5<)1o"+ jth׿{ijT@`Zac1Bt?h4fy{Ye;\p+ 5I^3Ffʺ^MnS=A l|j%}Og vh\= 98J4+k(zI[^摬`8JwCWp]xg<+r/h*O*sErͿ!THwo@" Gi?g>ިtUv4Ȩސp?'CLQY]v= OXf$ GۥgIYWERUM 㟲>}|"G,b}}3Z=rS/:@ `6z>`&PE(8,AYqFAPͺHܗBdQo(|Y42mm/Rd^L|#Hx}&I?DŽq:mJRCE]1̾{d(V4ET>5[T4޲Ci!)uT?慶 ;C%d#7?EToNuP7ܧ:t@+8Pɧup|`F^Gև^|V{2$q}O. :IP8{P5ewY"2Z*;$ɶޣd2ㄘ[<-Ijz;@j0 {UPa HU` 'lڂ L,Biؔ45Ywa|3|Ϊ ݉Fvֈe>y/ S3.+={&?mSkT`)N"Amé'Z>Qʣ)`dI(G;篩vVbfM Hn7Yfkb0KWDl6y Mz _4fُ001CwaHڮE䲀aT;EV"1A5~-XXKK<0Fe P[x!:?,%I\eu (d!d [vǖ '&ʯ .tE5m#L{cLĮ )34Sa#8| _wO[ь˘XQ/)ϲvrM/9NA#aG?Մ)dŻIytopH2>1qz^siǕ#{Ч>ي9R`}#䀬\B֏$<'cBގN ӜE`KTmӉ,p3WrY.([oR|&TA$yNXv1}wri5yOdYUJ})֧$PDvO˜ /*ZT4Vr@i,d" 3e;oI@ A}F{!<Hq|q>*hhߞ,=L~ΈjlfBIi ܜ`Yd XA)C, }i^ J-ݮtRA9=:Oe6wW_f owCoWhmXSL|Al O[F7/Ϙx^ >oeBC˪ MI s&xp5 :Wq]_48?~;+R=RVgFKeW18.v1'7?d艡u&ę.v z{H0mx-KS s g?'vmƟV[>Oٶ o6 2\sqEY4 j*9ݪ3&ߥ[t>c9vq?*l]Y-isΕ҉/+zbK[BR[~/{!e1hP7Fp:xB9mWӖtY:pM[p'ͶMmu7/7gVLR }K&Yɨ.w)D8҃Z4e#@$ ,/FLC) o}( "[η 4Q{_~: h@r7|9skRH}تXx0Pk&_3b,qʱw9_:8 ,ẠWt)ށy QEwVV_kTGkc3w A?-Ra-~|x3i<ń' Ֆڼ ?.ɵFY3P(O HTu)Q)7:/cQO`@(V8hB =-q$ sTާam/Xfe񹌪Nvf:Q&$9<'OfFx(7f[ӋS ǃB+b20AWYtӈގ><”Rqaݖ3բdHUz(9v> yn}@g |;G:S6p}@lZFQ@\ Gʡp>?N44@]Q2 D~a֬.7e64 .5hl3ydQd<#rjeuEq*i`vDt##iyE%o<~/~iN:/ @m?uTڥŖfHFlN_fh}%0_uvVW7kvq{e8P(?s"!tV˩YyK

AZ 9r|ڞͅKh]0Ҕu ,``wQA=|hd20Ӂ cD^vc)1o K>]PJImyV1y2ZWݜ9Ua˄3.ksS(LGKgӺd9vmke? p>>l/K&F:+ONu\GA2N9T͟z/C͎s2%sAlC(#)X<խbR-gߐsL]~:p2'.Sk?3;c|ed3}E}=2k h0O1;Hh"mIF#\Oˀ G#*4k'}5ɚ,1a$y%|댁fdH\9)4mHQp:eN<DZp`"  eT$@i@I؟Fua$.t^=ɬ!jix뉿UZ ,̡+T؛9g-bi1as󈡽SRpi 1еFxC9Pl, nK )e[Z ʑi61@#:j32n,v;)j 7 >S9B$tL H8xdHr> P{YddSAф6Ȁ(Zh|eȭ?@V3G̲Q<*g>]Ϊe U#: >qW\ez'u&3e[6p=Brsu؆+{mInQBdf{?.WGhAsPGXtLXg#;B:4^wobY?:!haLN [Zz-QJ6KV{_7.F2F@b)a6R˅N&IkIg}2}] 2:†p=͚﩯>fe nn-,韩;LfZOq&8ԭΈs呚8v;u9/ qlmE+@@}0ϓRG 娀wˬ?d75z2]qb md"fH# "TAgVH>w_4p@X1Z14~›:=b/2\RokAJl HK {KO-LU QۼNg|=SxF(d26+H!TWȐ* Z`? cTU("SA}uNlL݉Yz6%ܫr)5>§bgx hj3Z^9.|_Ǧ#7K\ t\BUczuj$;&.1ֻI\3+N&,C砋oCa/&Q8Bt6% v%~ I wV>SGK1!4')G<%E$ *ÛGO{fS/QgH6}C7 eDyS3Аe#TΏ-MU(syU{V@ҟy$_IgJ 3J^s, 5V0% ݏ[({~!Wo\NX_Y+'KX'0~(Xm `@^!𛫧cDi%4n {t'%{rXUNpnL ( 3tQzD͜\T|+.E Xĕѝ/yf`65qaLbtG E+9~!dļ':o~ֲF !zdre,MS SԘ |G\׃<=o9q/Lgg0Rn.TMz[^Cave-o>2+e` ~ N#ST/:ҡ(rʛ"t+';9z,5"8l;y)b!ecG|ZZk17v ,zŞ$V3ϽV!\Sa"j>q&|idŲ'Vo_FiL@_3|^PZMA#*n_έ}w,<=NZ qxK Y+ĂMBP* $5/<a8m WG_wJMF +%>wcXRWińHb]`lIyKoc#.l]>ҕXj&5&7,ߨپ4f:"wx񂲳t ,fz5#DGuucO}dMW +Ml"u m7k؉1MFtI >ݮ,F@~^|aA$7t] {EO=(uYi-N)2Բ϶~@z ma?Ncx޾C`3ҫy1=S P4|40SCu'uG'u(4'P@s\@'Kˉ@~ܛQ@YZrrcov/data/wages.rda0000644000176200001440000000257414200705525014124 0ustar liggesusersV lU3;.ER-Ohb.P(m6H Z cCB *Q~P1RE@!@LL%H 4*Zϛo'9=޹yۭL'",=XdQ28iQ #t ;DY un*Ri"]|7|}@10^q}m@/M?X Xfԗjdwk=fzβ2ϵde߸dq{=X2!mj-S {~u-=;.` 8lGw>:= պ=E?E;.bkKEGf+&fcS7g08/*ފè`9-adS7p OfR;c/}A-u 䐟;)7:تG聻`U lGoC@ 9 z }C4|ς@`*2t߯"FN}eM:wVqGF>0F@\X;eFc9^.=fFʖfL_# OB,6Q2U?7wq 0N \@;[z\7iq7" &sqO)mUw,[6u~ycșDKҁ'wnW[g|3DYG(;=3z ~c>p&"6|6N3}Өѕ+[JW^%Cyb.z J| OKΣ_O;&by-noS.r9,~a'rUw|CΠc= НaLP3"l&jMaXM'2]&-F.j5j؄wv\UxKM:N|OCNJ6Ť>dy4l&x';W^368s';= 5(TҲ_4㘮}|X-On#˾ǝt<ї=i}%X R7ZN.~ҟU!I~_Dq@kΑxZz $~P8WAɓ'qr}/9? E?( ˉ?fR?(2WUU[Vhmc]UUъ*,8e#'jo,<2i3颴P?~@\ԛ` Q Bk|3vv˃(H64= 47ݨ$Pd˒1`l>7w+y0ؑdNP8oC@WAeUlp|2-gBFSE͹*G݄ =fJy}(A ? }>!/?=|!Q %4an( XϑF~s*/u;ϕf'?d7a c݇%?^YsS͆S )k֮MO'Q0l {IYyޜ/^ q3x@ͼNPASQ݂p_pyJrzP z{5Pܯ8\w57,6۟Jm߾,ʷuB9Ͽ9HKiGi-P9(0\tJP8D8{?{CV B4aGO'J|_ +U@ uDh94~;neBhs%S|FU-taGar9/Ifԑ,&hr@v9{lȾI*E8'j)e.|og݊s{Iޔ;V1(o+rLuvbrmNjk""{uT!d Է?n*}݋1PͥM"eZlQ3[ ~%JRiFoC)ns@MPLc.KJi5l4{n]DhtXXfW.u!逪axh AtӍگ!uᴠG#'.1S\r=ǁD` *67 w RѹeٹDz R6LlprR躆ԏ)~sRH7th䅿8@cј zƄ\^ r2p1(Ed+ʈe{ 3Zg:cz&}|g*##Vt*:>",$4cZʘn]|fYH͂1 Yfor4)fJEšQQyB  2d0` A 2dȐ!C 2dȐ!C 2dȐ"E ,2Xd`"E 28dp!C <2xd#G <2xdȑ!Grdȑ!HE E-T)40׿Dz rrcov/data/rice.rda0000644000176200001440000000456614200705525013743 0ustar liggesusers] l 4fvans9f[ 1yPw)b`s8Ìq qLe1-P{rڞ9NҞw}9ݳy+"EdZdfdNxڂHd'׳yzoF,gzywo|.O/o7ƴo}R/nYΔTqts޻oLhNC~vw|N/=,'E^3]f]{lZ[|G.Odgn?6x [=<ݻtt+Z_e;\ YE04~cj_m5r,IMm,rhmx}:M5npIb??kfSe='m76m.ŚXtyX^Bt 颜us:Zmy/B\gs=Ro˛e!-^mvY4X&Q;χ9Ӿ0Z? Sm)Nj"WO!_=.mPZo$i%oo9: m/S!*5!NvJr! II/,_gB]yNCVv㗌[;>]VG`5WnE#]].q?RwM8e+顮8.q9>*G}4e5 >̫}C; z>I@m?oz)\9VN#ᷞgi YtV|$n A8 u[r!o n='/1sh Um終FC:|Gb"LVůMi=ZtFƫ\=RxHg };'{M??1c2j"[c9*{*LkU"cN~}GNVq%/} 5tѵ\9?I{W ` ;eK=o5ez#z*1|g.M+Я)i:~8ƾ>z+J3'48 o}<.#r~<KtY.(,BuO0yyLXH n `xJ)CzVo8gz$;,2/oϠvO_Ռ~Q_+>%OX__36ti>!ǩ_QK<?.ӏ^9)_}:郷g>B?au _9ބ^6'gDOE 8WjG,8zcq/:z2tqpjxu{4O 4۹:ǩkϻUt6~b#9Nb=>Im_Wnk;~ _S/%_GSvnG𧜾UOý^<Ȃc賟SbɼOMi8k-!ezYV 4t a%ܐƇ1=7x$wv+)a=O t)gߗuͣ뷕~ЍO?⧥?~7 G߇s =R]/2~W<Ƌ}so?QP~7o(Mޒ +KJ|}QAI YaO \P_XKo(6%> ac?^xoxv'_6<] /rrcov/data/bus.rda0000644000176200001440000000767014200705521013605 0ustar liggesusersBZh91AY&SYFDG2{\DUU@@@@@@@@P@@@A<`)>>c@ܰڅ&B&@hԛLɉmFɤ6PhCCM$HL4@ LFL&L`!U*i` &`0IPhR# Ѧ2hmOHd1$54i#MM'4#4ё' 4bSFOI&d}jyss9p9KrF9r."uu]:bsӜIw]r] r]ˮ:v9˙wF]9wr\vp빸u3+g;8]ˎuwn2]svSw:r.w17Aیn Q<"x %j.: Ya4¦K /)7Q)lˈȃq@c"r31<9ea*K$XiewFX@Qd$n )4JI#i1XEx-@YQl3Zu3'8H F, iLtBdT+mfHcj!46a0ǡE7P&|b5+E6HX"bCTUWx&,_ݳY BHR]H(!˴)bG4s 4G'!rqZBZ'B[L'cL7# K";(\XVtIS 6n50%(̱$!Y2EQ0'MTcW0 ˈ6L0p[RAATybL(BSœ82,5HlF&pnf*OZk%c1b&DI6EtxP9--uQ)a9(qQA PG .ce-BL %ofhQd>5M],0#?TCr#hr c![tr (bИ=56qbܽ*6~:fl9مٖ`ٶ7.|+=)F۳f)Y,%1O t&dқ&{\lۚ5qov5^uQDQt4𙙙Y ADDB*TvqAr*c䌕E2ajju2kQ"N,ݢ~WhdD*H0{n ;5NkOVto6ok0A%vڇkN!ml ՚ferTb1Zic,7n_w%)HK袉k_;Y/ ]2BT-U(URT2$@ ;D@2W|.6wyHiMdQj$-2bP"ChU#{wqcygj?-BD5 , U@Kͨ8IeϜ!isA>.fKk Z'U9lABPNTt\/}2jCг3HII4,m$EDP:],M&רl\ޑ0x|ޗu|C@H>f}/DrkrչmZwjܵrmm\_ůQJҋW5oUFTK@B覛!Mf3&4R BD4,ʊ dD)0hhPY"X Ș2gw(@LQiL&hؐ %HQr KI TBŌ!A$@"lZNrF)Aha ō6 (Ble(,j4b(&600ԚBF4666LV1!b%6h!*-!EA%F0EDlFwLUX$Qkf- PQQʋFK5Q1&EVѴmhF؋lV66wkQEhXmF(RFhMEIEQ6 " [RUԑjdFF(FILf*!DE n: vPL"i>C|< 0ȻVN\s.hv1ԎLI:vC`2dSP TvoJOi{߉va% E&&tv) <0#g%2: ~Mˆf@8̀\PHA;U"*l`;&]JkxrgLo|;k+笻ɂ" X)E]RuZ%ITTĢjտrF9H (ڵ~ "JR@Wsjy;11284'!27iZ%V,DK[[c*4+E+%` J!#X$ 0FVAKJ $hI U)A6-+aD1K)(@X,ai$UZdVBl"D"PQ"H%"k Ml `fdGz#~l#ZMN5xjjGb݇c,.*Nf3vŪ իeoϟ>| C!ikmlJ"D)(JYd)(RQ ݒU ֵ\p6q(mR`jVĒIRv$}Q A| ,5mC]!-!G24))Ӫ*R˱xحm’^erpÔ)yۤCmp"sJRmˆmNJNs)JP4ԜT9Ҕ hRi%r 0]u\[+i9)(9ޥ)J[DMI)I/Ibŗq+yҜNgؾzOU>nmPP)XjZ*6Fg̢UV*5)Lȋ"Zݡ,! m ؑIe.-˘YUN)ih.0X.e11`eu%t12e6V XB`pnԠnRȭeݬ).lV*Vae0rw34Kd.v!wQnX53GDar$"YdHŵ6*!I,YHAP, ,ALɭ,&xL$}!<r̀m!hPrvl给@v:ݛ'^|J*}Guz !gjf$:h8lfgdGoGmm~lc8YaXAY :"l;qcxC 8s?u6+G_xe|Y3KA=HH~ʣ7Yi7`O6:x`W94і ,䞢Ӵpܻp/BTz^ fs'llxBv7X.Exy7zrn*mk(xy]폜G—ׇ CnГΤ{k ,(A*B i/:GoˀA'Yyg 4Ƿ ټ l+c*+zidBymVRn[z5i%.wMKe'l#agۛGB+"˴mG@ޓq~p^!l@U:}빎gk9 1JӀPN2I3-Qr%S4*+(eL>*HڬP)W7-\F w9ϯ,ѫ/G5@B"!km_BP)DhPRsy_p36D IWS%"Lnh|\EL,V֬G 睺s`3u~iO}W_$-. ;P+%k%@䭧}Ѝ>r!X9P^JW7h&8\"bz" 1#-~5y a~8߹QG?_ZDŽPL#j"ݠ~9"JiS Ub|z?,PK̄¦clШךJ^Q^/sB!ֲB@/uPwH [ ^!Ô.;oI S;v3U1uBasߺ%/>ߙTCaUuh놧qhq DY+y-e|uɾ <}KC.e.1ѱvz) 7˺\ GO/8l3JmԂ{ea=G "#.>B/JR#y-b8{ cӏF.QgGnfjn9ܯ\ʜ:D7i")yCQV.l aN Rn~o:TxS >WP73;&_t6,ʷs׎.ESg~ u|pX*pv4 (b6h)fW-`Y X]~ח~,ʁܾvEhfv[>Az[ loB|8@>^Y}8T$G YƏC[v&P b%E|U:5L갏g/c;^i6wZM왳2͓̜$>P]#%%94ԊPŵzJjE^VDq(sM^p($hL4hZFhGzu"4 P CFQhKϡNY:"`b8ԉkt)zq$BZ0h$ d1_vQ1}F3"F(f"@AA /^LAc"0$xdЊP(NlBh'@V1* %kŨ bTpЪiPhQ5& Ф :ZZFZa+ "4#MV&a^ R7tr-4.#\qiTY f']rrcov/man/0000755000176200001440000000000014200564164012162 5ustar liggesusersrrcov/man/PcaLocantore.Rd0000644000176200001440000001252414146467556015047 0ustar liggesusers\name{PcaLocantore} \alias{PcaLocantore} \alias{PcaLocantore.formula} \alias{PcaLocantore.default} \title{ Spherical Principal Components} \description{ The Spherical Principal Components procedure was proposed by Locantore et al., (1999) as a functional data analysis method. The idea is to perform classical PCA on the data, projected onto a unit sphere. The estimates of the eigenvectors are consistent and the procedure is extremely fast. The simulations of Maronna (2005) show that this method has very good performance. } \usage{ PcaLocantore(x, ...) \method{PcaLocantore}{default}(x, k = ncol(x), kmax = ncol(x), delta = 0.001, na.action = na.fail, scale = FALSE, signflip = TRUE, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaLocantore}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, the algorithm itself will determine the number of components by finding such \code{k} that \eqn{l_k/l_1 >= 10.E-3} and \eqn{\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j >= 0.8}. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=ncol(x)}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{delta}{an accuracy parameter} \item{scale}{a value indicating whether and how the variables should be scaled to have unit variance (only possible if there are no constant variables). If \code{scale=FALSE} (default) or \code{scale=NULL} no scaling is performed (a vector of 1s is returned in the scale slot). If \code{scale=TRUE} the data are scaled by \code{mad}. Alternatively it can be a function like \code{sd} or \code{Qn} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the scale slot. Default is \code{scale=FALSE}.} \item{signflip}{a logical value indicating wheather to try to solve the sign indeterminancy of the loadings - ad hoc approach setting the maximum element in a singular vector to be positive. Default is \code{signflip = TRUE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \details{ \code{PcaLocantore}, serving as a constructor for objects of class \code{\link{PcaLocantore-class}} is a generic function with "formula" and "default" methods. For details see the relevant references. } \value{ An S4 object of class \code{\link{PcaLocantore-class}} which is a subclass of the virtual class \code{\link{PcaRobust-class}}. } \references{ N. Locantore, J. Marron, D. Simpson, N. Tripoli, J. Zhang and K. Cohen K. (1999), Robust principal components for functional data. Test, 8, 1-28. R. Maronna, D. Martin and V. Yohai (2006), Robust Statistics: Theory and Methods. Wiley, New York. R. Maronna (2005). Principal components and orthogonal regression based on robust scales. Technometrics, 47, 264-273. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} The SPC algorithm is implemented on the bases of the available from the web site of the book Maronna et al. (2006) code \url{https://www.wiley.com/legacy/wileychi/robust_statistics/} } \examples{ ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaLocantore(hbk) pca ## Compare with the classical PCA prcomp(hbk) ## or PcaClassic(hbk) ## If you want to print the scores too, use print(pca, print.x=TRUE) ## Using the formula interface PcaLocantore(~., data=hbk) ## To plot the results: plot(pca) # distance plot pca2 <- PcaLocantore(hbk, k=2) plot(pca2) # PCA diagnostic plot (or outlier map) ## Use the standard plots available for for prcomp and princomp screeplot(pca) biplot(pca) } \keyword{robust} \keyword{multivariate} rrcov/man/pca.distances.Rd0000644000176200001440000000335214145003447015173 0ustar liggesusers\name{pca.distances} \alias{pca.distances} \title{ Compute score and orthogonal distances for Principal Components (objects of class 'Pca') } \description{ Compute score and orthogonal distances for an object (derived from)\code{\link{Pca-class}}. } \usage{ pca.distances(obj, data, r, crit=0.975) } \arguments{ \item{obj}{an object of class (derived from) \code{"Pca"}.} \item{data}{The data matrix for which the \code{"Pca"} object was computed.} \item{r}{rank of data} \item{crit}{Criterion to use for computing the cutoff values.} } \details{ This function calculates the score and orthogonal distances and the appropriate cutoff values for identifying outlying observations. The computed values are used to create a vector a of flags, one for each observation, identifying the outliers. } \value{ An S4 object of class derived from the virtual class \code{\link{Pca-class}} - the same object passed to the function, but with the score and orthogonal distances as well as their cutoff values and the corresponding flags appended to it. } \references{ M. Hubert, P. J. Rousseeuw, K. Vanden Branden (2005), ROBPCA: a new approach to robust principal components analysis, \emph{Technometrics}, \bold{47}, 64--79. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaHubert(hbk) pca.distances(pca, hbk, rankMM(hbk)) } \keyword{robust} \keyword{multivariate} rrcov/man/getEllipse.Rd0000644000176200001440000000220514177776410014561 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-utils.R \name{getEllipse} \alias{getEllipse} \title{Calculates the points for drawing a confidence ellipsoid} \usage{ getEllipse(loc = c(0, 0), cov = matrix(c(1, 0, 0, 1), ncol = 2), crit = 0.975) } \arguments{ \item{loc}{location vector} \item{cov}{a \code{pXp} covariance matrix} \item{crit}{the confidence level, default is \code{crit=0.975}} } \value{ A matrix with two columns containing the calculated points. } \description{ A simple function to calculate the points of a confidence ellipsoid, by default \code{dist=qchisq(0.975, 2)} } \examples{ data(hbk) cc <- cov.wt(hbk) e1 <- getEllipse(loc=cc$center[1:2], cov=cc$cov[1:2,1:2]) e2 <- getEllipse(loc=cc$center[1:2], cov=cc$cov[1:2,1:2], crit=0.99) plot(X2~X1, data=hbk, xlim=c(min(X1, e1[,1], e2[,1]), max(X1,e1[,1], e2[,1])), ylim=c(min(X2, e1[,2], e2[,2]), max(X2,e1[,2], e2[,2]))) lines(e1, type="l", lty=1, col="red") lines(e2, type="l", lty=2, col="blue") legend("topleft", legend=c(0.975, 0.99), lty=1:2, col=c("red", "blue")) } \author{ Valentin Todorov, \email{valentin.todorov@chello.at} } rrcov/man/covMest-deprecated.Rd0000644000176200001440000001216014145002417016163 0ustar liggesusers\name{covMest} \alias{covMest} % \title{Constrained M-Estimates of Location and Scatter} \concept{High breakdown point} \description{ Computes constrained M-Estimates of multivariate location and scatter based on the translated biweight function (\sQuote{t-biweight}) using a High breakdown point initial estimate. The default initial estimate is the Minimum Volume Ellipsoid computed with \code{\link{CovMve}}. The raw (not reweighted) estimates are taken and the covariance matrix is standardized to determinant 1. } \usage{ covMest(x, cor=FALSE, r = 0.45, arp = 0.05, eps=1e-3, maxiter=120, control, t0, S0) } \arguments{ \item{x}{a matrix or data frame. } \item{cor}{should the returned result include a correlation matrix? Default is \code{cor = FALSE}}. \item{r}{ required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is 0.45} \item{arp}{ asympthotic rejection point, i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{0.05}.} \item{eps}{ a numeric value specifying the relative precision of the solution of the M-estimate. Defaults to \code{1e-3}} \item{maxiter}{ maximum number of iterations allowed in the computation of the M-estimate. Defaults to 120} \item{control}{ a list with estimation options - same as these provided in the fucntion 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{t0}{ optional initial high breakdown point estimates of the location. If not supplied MVE will be used. } \item{S0}{ optional initial high breakdown point estimates of the scatter. If not supplied MVE will be used. } } \details{ Rocke (1996) has shown that the S-estimates of multivariate location and scatter in high dimensions can be sensitive to outliers even if the breakdown point is set to be near 0.5. To mitigate this problem he proposed to utilize the translated biweight (or t-biweight) method with a standardization step consisting of equating the median of \code{rho(d)} with the median under normality. This is then not an S-estimate, but is instead a constrained M-estimate. In order to make the smooth estimators to work, a reasonable starting point is necessary, which will lead reliably to a good solution of the estimator. In \code{covMest} the MVE computed by \code{\link{CovMve}} is used, but the user has the possibility to give her own initial estimates. } \note{ The psi, rho and weight functions for the M estimation are encapsulated in a virtual S4 class \code{PsiFun} from which a \code{PsiBwt} class, implementing the translated biweight (t-biweight), is dervied. The base class \code{PsiFun} contains also the M-iteration itself. Although not documented and not accessibale directly by the user these classes will form the bases for adding other functions (biweight, LWS, etc.) as well as S-estimates. } \author{Valentin Todorov \email{valentin.todorov@chello.at}, (some code from C. Becker - http://www.sfb475.uni-dortmund.de/dienst/de/content/struk-d/bereicha-d/tpa1softw-d.html) } \value{ An object of class \code{"mest"} which is basically a \code{\link{list}} with the following components. This class is "derived" from \code{"mcd"} so that the same generic functions - \code{print}, \code{plot}, \code{summary} - can be used. NOTE: this is going to change - in one of the next revisions \code{covMest} will return an S4 class \code{"mest"} which is derived (i.e. \code{contains}) form class \code{"cov"}. \item{center}{the final estimate of location.} \item{cov}{the final estimate of scatter.} \item{cor}{the estimate of the correlation matrix (only if \code{cor = TRUE}).} \item{mah}{mahalanobis distances of the observations using the M-estimate of the location and scatter.} \item{X}{the input data as a matrix.} \item{n.obs}{total number of observations.} \item{method}{character string naming the method (M-Estimates).} \item{call}{the call used (see \code{\link{match.call}}).} } \references{ D.L.Woodruff and D.M.Rocke (1994) Computable robust estimation of multivariate location and shape on high dimension using compound estimators, \emph{Journal of the American Statistical Association}, \bold{89}, 888--896. D.M.Rocke (1996) Robustness properties of S-estimates of multivariate location and shape in high dimension, \emph{Annals of Statistics}, \bold{24}, 1327-1345. D.M.Rocke and D.L.Woodruff (1996) Identification of outliers in multivariate data \emph{Journal of the American Statistical Association}, \bold{91}, 1047--1061. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \seealso{ \code{\link[robustbase]{covMcd}} } \keyword{robust} \keyword{multivariate} rrcov/man/rrcov-utils.Rd0000644000176200001440000000413112763517421014747 0ustar liggesusers\name{rrcov-utils} \title{Different utility functions to be used in rrcov and packages depending on rrcov} \alias{myscreeplot} % plots screeplots for two covariance matrices \alias{mtxconfusion} % computes a confusion matrix %% %% MATLAB-like functions %% \alias{sqrtm} % returns the square root of a symetric positive definite matrix %\alias{ones} % returns a nxp matrix filled with ones %\alias{zeros} % returns a nxp matrix filled with zeros \alias{vecnorm} % returns the norm of a vector %\alias{repmat} % replicates a matrix \usage{ myscreeplot(rcov, ccov) mtxconfusion(actual, predicted, prior = NULL, printit=FALSE) sqrtm(A) % ones(n=1, p=1) % zeros(n=1, p=1) % repmat(A, n, p) } \arguments{ \item{A}{A matrix.} \item{tol}{Optional numerical tolerance (compared to singular values).} \item{sv}{A vector of non-increasing singular values of a matrix A, if already computed.} \item{rcov, ccov}{Covariance matrices.} \item{n}{Number of rows.} \item{p}{Number of columns.} \item{actual}{Actual class membership.} \item{predicted}{Predicted class membership.} \item{prior}{Prior probabilities.} \item{printit}{Wheather to print the results.} } \description{ Different utility functions to be used in rrcov and packages depending on rrcov: \itemize{ \item \code{myscreeplot} Plots screeplots for two covariance matrices \item \code{mtxconfusion} Computes a confusion matrix between actual and predicted class membership \item MATLAB-like functions \itemize{ \item \code{sqrtm} Returns the square root of a symetric positive definite matrix \item \code{ones} Returns a nxp matrix filled with ones \item \code{zeros} Returns a nxp matrix filled with zeros \item \code{vecnorm} Returns the norm of a vector \item \code{rankMM} Returns the rank of the matrix \item \code{repmat} Replicates a matrix } } } %\details{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} \keyword{internal} rrcov/man/CovControlOgk.Rd0000644000176200001440000000621614145002130015173 0ustar liggesusers\name{CovControlOgk} \alias{CovControlOgk} % \title{ Constructor function for objects of class "CovControlOgk" } \description{ This function will create a control object \code{CovControlOgk} containing the control parameters for \code{CovOgk} } \usage{ CovControlOgk(niter = 2, beta = 0.9, mrob = NULL, vrob = .vrobGK, smrob = "scaleTau2", svrob = "gk") } \arguments{ \item{niter}{ number of iterations, usually 1 or 2 since iterations beyond the second do not lead to improvement. } \item{beta}{ coverage parameter for the final reweighted estimate } \item{mrob}{ function for computing the robust univariate location and dispersion - one could use the \code{tau scale} defined in Yohai and Zamar (1998), see \code{\link[robustbase]{scaleTau2}}. The C version of this function defined by \code{smrob} is the default. } \item{vrob}{ function for computing robust estimate of covariance between two random vectors - one could use the function proposed by Gnanadesikan and Kettenring (1972), see \code{\link[robustbase]{covOGK}()}. The C version of this function defined by \code{svrob} is the default. } \item{smrob}{ a string indicating the name of the function for computing the robust univariate location and dispersion - defaults to \code{scaleTau2} - the scale tau function defined in Yohai and Zamar (1998) } \item{svrob}{ a string indicating the name of the function for computing robust estimate of covariance between two random vectors - defaults \code{gk}, the one proposed by Gnanadesikan and Kettenring (1972) } } \details{ If the user does not specify a scale and covariance function to be used in the computations or specifies one by using the arguments \code{smrob} and \code{svrob} (i.e. the names of the functions as strings), a native code written in C will be called which is by far faster than the R version. If the arguments \code{mrob} and \code{vrob} are not NULL, the specified functions will be used via the pure R implementation of the algorithm. This could be quite slow. } \value{ A \code{CovControlOgk} object } \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. Yohai, R.A. and Zamar, R.H. (1998) High breakdown point estimates of regression by means of the minimization of efficient scale \emph{JASA} \bold{86}, 403--413. Gnanadesikan, R. and John R. Kettenring (1972) Robust estimates, residuals, and outlier detection with multiresponse data. \emph{Biometrics} \bold{28}, 81--124. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlOgk", beta=0.95) ctrl2 <- CovControlOgk(beta=0.95) data(hbk) CovOgk(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/PredictQda-class.Rd0000644000176200001440000000246714145004112015573 0ustar liggesusers\name{PredictQda-class} \docType{class} \alias{PredictQda-class} \alias{show,PredictQda-method} \title{Class "PredictQda" - prediction of "Qda" objects } \description{ The prediction of a "Qda" object } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PredictQda", ...)} but most often by invoking 'predict' on a "Qda" object. They contain values meant for printing by 'show'} \section{Slots}{ \describe{ \item{\code{classification}:}{a factor variable containing the classification of each object } \item{\code{posterior}:}{a matrix containing the posterior probabilities } \item{\code{x}:}{ matrix with the discriminant scores } \item{\code{ct}:}{re-classification table of the training sample} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "PredictQda")}: prints the results } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Qda-class}} } \examples{ showClass("PredictQda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/T2.test.Rd0000644000176200001440000000732712763517421013733 0ustar liggesusers\name{T2.test} \alias{T2.test} \alias{T2.test.default} \alias{T2.test.formula} \title{Robust Hotelling T2 test} \description{ Performs one and two sample Hotelling T2 tests as well as robust one-sample Hotelling T2 test } \usage{ T2.test(x, \dots) \method{T2.test}{default}(x, y = NULL, mu = 0, conf.level = 0.95, method=c("c", "mcd"), \dots) \method{T2.test}{formula}(formula, data, subset, na.action, \dots) } \arguments{ \item{x}{a (non-empty) numeric data frame or matrix.} \item{y}{an optional (non-empty) numeric data frame or matrix.} \item{mu}{an optional (non-empty) numeric vector of data values (or a single number which will be repeated p times) indicating the true value of the mean (or difference in means if you are performing a two sample test).} \item{conf.level}{confidence level of the interval} \item{method}{the method to be used - 'c' for sample mean and covariance matrix and 'mcd' for minimum covariance determinant estimator. A two-sample MCD based T2-test is not yet implemented.} \item{formula}{a formula of the form \code{lhs ~ rhs} where \code{lhs} is a numeric data frame or matrix giving the observations and \code{rhs} a factor with two levels giving the corresponding groups.} \item{data}{an optional matrix or data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}. By default the variables are taken from \code{environment(formula)}.} \item{subset}{an optional vector specifying a subset of observations to be used (currently not used)} \item{na.action}{a function which indicates what should happen when the data contain \code{NA}s. Defaults to \code{getOption("na.action")} (currently only "na.rm" used)} \item{\dots}{further arguments to be passed to or from methods.} } \details{ The formula interface is only applicable for the two-sample tests. } \value{ A list with class \code{"htest"} containing the following components: \item{statistic}{the value of the T2-statistic.} \item{parameter}{the degrees of freedom for the T2-statistic.} \item{p.value}{the p-value for the test.} \item{conf.int}{a confidence interval for the mean vector appropriate to the specified alternative hypothesis.} \item{estimate}{the estimated mean vector or vectors depending on whether it was a one-sample test or a two-sample test.} \item{null.value}{the specified hypothesized value of the mean or mean difference depending on whether it was a one-sample test or a two-sample test.} \item{alternative}{a character string describing the alternative hypothesis.} \item{method}{a character string indicating what type of T2-test was performed.} \item{data.name}{a character string giving the name(s) of the data.} } \references{ Willems G., Pison G., Rousseeuw P. and Van Aelst S. (2002), A robust hotelling test, \emph{Metrika}, \bold{55}, 125--138. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } %\note{} \seealso{ \code{\link{CovMcd}}} \examples{ ## One-sample classical test data(delivery) delivery.x <- delivery[,1:2] T2.test(delivery.x) ## One-sample robust test data(delivery) delivery.x <- delivery[,1:2] T2.test(delivery.x, method="mcd") ## Two-sample classical test data(hemophilia) grp <-as.factor(hemophilia[,3]) x <- hemophilia[which(grp==levels(grp)[1]),1:2] y <- hemophilia[which(grp==levels(grp)[2]),1:2] T2.test(x,y) ## or using the formula interface T2.test(as.matrix(hemophilia[,-3])~hemophilia[,3]) \dontrun{ ## Two-sample robust test T2.test(x,y, method="mcd") ## error - not yet implemented }} \keyword{htest} \keyword{multivariate} rrcov/man/CovMcd.Rd0000644000176200001440000001404314145002542013621 0ustar liggesusers\name{CovMcd} \alias{CovMcd} % \title{ Robust Location and Scatter Estimation via MCD } \description{ Computes a robust multivariate location and scatter estimate with a high breakdown point, using the \sQuote{Fast MCD} (Minimum Covariance Determinant) estimator. } \usage{ CovMcd(x, raw.only=FALSE, alpha=control@alpha, nsamp=control@nsamp, scalefn=control@scalefn, maxcsteps=control@maxcsteps, initHsets=NULL, save.hsets=FALSE, seed=control@seed, trace=control@trace, use.correction=control@use.correction, control=CovControlMcd(), ...) } \arguments{ \item{x}{a matrix or data frame. } \item{raw.only}{should only the \dQuote{raw} estimate be returned.} \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{ number of subsets used for initial estimates or \code{"best"}, \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 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. 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{scalefn}{\code{\link{function}} to compute a robust scale estimate or character string specifying a rule determining such a function, see \code{\link{rrcov.control}}.} \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{seed}{starting value for random generator. Default is \code{seed = NULL}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{use.correction}{ whether to use finite sample correction factors. Default is \code{use.correction=TRUE}} \item{control}{ a control object (S4) of class \code{\link{CovControlMcd-class}} containing 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}{potential further arguments passed to \pkg{robustbase}'s \code{\link[robustbase]{covMcd}}.} } \details{ This function computes the minimum covariance determinant estimator of location and scatter and returns an S4 object of class \code{\link{CovMcd-class}} containing the estimates. The implementation of the function is similar to the existing \R function \code{\link[robustbase]{covMcd}()} which returns an S3 object. The MCD method looks for the \eqn{h (> n/2)} observations (out of \eqn{n}) whose classical covariance matrix has the lowest possible determinant. The raw MCD estimate of location is then the average of these \eqn{h} points, whereas the raw MCD estimate of scatter is their covariance matrix, multiplied by a consistency factor and a finite sample correction factor (to make it consistent at the normal model and unbiased at small samples). Both rescaling factors are returned also in the vector \code{raw.cnp2} of length 2. Based on these raw MCD estimates, a reweighting step is performed which increases the finite-sample efficiency considerably - see Pison et al. (2002). The rescaling factors for the reweighted estimates are returned in the vector \code{cnp2} of length 2. Details for the computation of the finite sample correction factors can be found in Pison et al. (2002). The finite sample corrections can be suppressed by setting \code{use.correction=FALSE}. The implementation in rrcov uses the Fast MCD algorithm of Rousseeuw and Van Driessen (1999) to approximate the minimum covariance determinant estimator. } \value{ An S4 object of class \code{\link{CovMcd-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley. P. J. Rousseeuw and K. van Driessen (1999) A fast algorithm for the minimum covariance determinant estimator. \emph{Technometrics} \bold{41}, 212--223. M. Hubert, P. Rousseeuw and T. Verdonck (2012) A deterministic algorithm for robust location and scatter. \emph{Journal of Computational and Graphical Statistics} \bold{21}(3), 618--637. Pison, G., Van Aelst, S., and Willems, G. (2002), Small Sample Corrections for LTS and MCD, \emph{Metrika}, \bold{55}, 111-123. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link[MASS]{cov.rob}} from package \pkg{MASS} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovMcd(hbk.x) cD <- CovMcd(hbk.x, nsamp = "deterministic") summary(cD) ## the following three statements are equivalent c1 <- CovMcd(hbk.x, alpha = 0.75) c2 <- CovMcd(hbk.x, control = CovControlMcd(alpha = 0.75)) ## direct specification overrides control one: c3 <- CovMcd(hbk.x, alpha = 0.75, control = CovControlMcd(alpha=0.95)) c1 } \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMest.Rd0000644000176200001440000000307714145001663015377 0ustar liggesusers\name{CovControlMest} \alias{CovControlMest} \title{ Constructor function for objects of class "CovControlMest" } \concept{High breakdown point} \description{ This function will create a control object \code{CovControlMest} containing the control parameters for \code{CovMest} } \usage{ CovControlMest(r = 0.45, arp = 0.05, eps = 0.001, maxiter = 120) } \arguments{ \item{r}{a numeric value specifying the required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is 0.45} \item{arp}{a numeric value specifying the asympthotic rejection point, i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{0.05} } \item{eps}{a numeric value specifying the relative precision of the solution of the M-estimate. Defaults to \code{1e-3}} \item{maxiter}{maximum number of iterations allowed in the computation of the M-estimate. Defaults to 120 } } %\details{} \value{ A \code{CovControlMest} object } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMest", r=0.4) ctrl2 <- CovControlMest(r=0.4) data(hbk) CovMest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/SummaryCovRobust-class.Rd0000644000176200001440000000263414145004134017057 0ustar liggesusers\name{SummaryCovRobust-class} \docType{class} \alias{SummaryCovRobust-class} \alias{isClassic,SummaryCovRobust-method} \alias{show,SummaryCovRobust-method} \title{Class "SummaryCovRobust" - summary of "CovRobust" objects } \description{ Summary information for CovRobust objects meants for printing by 'show' } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SummaryCovRobust", ...)}, but most often by invoking 'summary' on an "Cov" object. They contain values meant for printing by 'show'. } \section{Slots}{ \describe{ \item{\code{covobj}:}{Object of class \code{"Cov"}} \item{\code{evals}:}{Eigenvalues of the covariance or correlation matrix} } } \section{Extends}{ Class \code{"SummaryCov"}, directly. } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "SummaryCovRobust")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{CovRobust-class}}, \code{\link{SummaryCov-class}} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cv <- CovMest(hbk.x) cv summary(cv) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/SummaryQda-class.Rd0000644000176200001440000000216114145004110015623 0ustar liggesusers\name{SummaryQda-class} \docType{class} \alias{SummaryQda-class} \alias{show,SummaryQda-method} \title{ Class "SummaryQda" - summary of "Qda" objects } \description{ Summary information about a \code{Qda} - Quadratic Discriminant Analysis object } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SummaryQda", ...)}, but most often by invoking 'summary' on an "Qda" object. They contain values meant for printing by 'show'. } \section{Slots}{ \describe{ \item{\code{qdaobj}:}{Object of class \code{"Qda"}} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "SummaryQda")}: display the object } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Qda-class}} } \examples{ showClass("SummaryQda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/PcaGrid-class.Rd0000644000176200001440000000325414145003652015067 0ustar liggesusers\name{PcaGrid-class} \Rdversion{1.1} \docType{class} \alias{PcaGrid-class} \alias{getQuan,PcaGrid-method} \title{Class "PcaGrid" - Robust PCA using PP - GRID search Algorithm } \description{ Holds the results of an approximation of the PP-estimators for PCA using the grid search algorithm in the plane. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaGrid", ...)} but the usual way of creating \code{PcaGrid} objects is a call to the function \code{PcaGrid()} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}, \code{center}, \code{scale}, \code{rank}, \code{loadings}, \code{eigenvalues}, \code{scores}, \code{k}, \code{sd}, \code{od}, \code{cutoff.sd}, \code{cutoff.od}, \code{flag}, \code{n.obs}:}{ from the \code{"\linkS4class{Pca}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{PcaRobust}"}, directly. Class \code{"\linkS4class{Pca}"}, by class \code{"\linkS4class{PcaRobust}"}, distance 2. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaGrid")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaClassic-class}} } \examples{ showClass("PcaGrid") } \keyword{robust} \keyword{multivariate} rrcov/man/Cov-class.Rd0000644000176200001440000000723214145001046014300 0ustar liggesusers\name{Cov-class} \docType{class} \alias{Cov-class} \alias{getCenter-method} \alias{getCenter,Cov-method} \alias{getCov,Cov-method} \alias{getCorr,Cov-method} \alias{getData,Cov-method} \alias{getDistance,Cov-method} \alias{getEvals,Cov-method} \alias{getDet,Cov-method} \alias{getShape,Cov-method} \alias{getFlag,Cov-method} \alias{isClassic,method} \alias{isClassic,Cov-method} \alias{plot} \alias{plot,Cov,missing-method} \alias{show,Cov-method} \alias{summary,Cov-method} \alias{Uvector-class} \alias{Ulist-class} \alias{Utable-class} \alias{Umatrix-class} \alias{Ufunction-class} \title{Class "Cov" -- a base class for estimates of multivariate location and scatter} \description{The class \code{Cov} represents an estimate of the multivariate location and scatter of a data set. The objects of class \code{Cov} contain the classical estimates and serve as base for deriving other estimates, i.e. different types of robust estimates. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Cov", ...)}, but the usual way of creating \code{Cov} objects is a call to the function \code{Cov} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{Object of class \code{"language"} } \item{\code{cov}:}{covariance matrix} \item{\code{center}:}{location} \item{\code{n.obs}:}{number of observations used for the computation of the estimates} \item{\code{mah}:}{mahalanobis distances} \item{\code{det}:}{determinant} \item{\code{flag}:}{flags (FALSE if suspected an outlier)} \item{\code{method}:}{a character string describing the method used to compute the estimate: "Classic"} \item{\code{singularity}:}{a list with singularity information for the covariance matrix (or \code{NULL} of not singular)} \item{\code{X}:}{data} } } \section{Methods}{ \describe{ \item{getCenter}{\code{signature(obj = "Cov")}: location vector } \item{getCov}{\code{signature(obj = "Cov")}: covariance matrix } \item{getCorr}{\code{signature(obj = "Cov")}: correlation matrix } \item{getData}{\code{signature(obj = "Cov")}: data frame } \item{getDistance}{\code{signature(obj = "Cov")}: distances } \item{getEvals}{\code{signature(obj = "Cov")}: Computes and returns the eigenvalues of the covariance matrix } \item{getDet}{\code{signature(obj = "Cov")}: Computes and returns the determinant of the covariance matrix (or 0 if the covariance matrix is singular) } \item{getShape}{\code{signature(obj = "Cov")}: Computes and returns the shape matrix corresponding to the covariance matrix (i.e. the covariance matrix scaled to have determinant =1) } \item{getFlag}{\code{signature(obj = "Cov")}: Flags observations as outliers if the corresponding mahalanobis distance is larger then \code{qchisq(prob, p)} where \code{prob} defaults to 0.975. } \item{isClassic}{\code{signature(obj = "Cov")}: returns TRUE by default. If necessary, the robust classes will override } \item{plot}{\code{signature(x = "Cov")}: plot the object } \item{show}{\code{signature(object = "Cov")}: display the object } \item{summary}{\code{signature(object = "Cov")}: calculate summary information } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ showClass("Cov") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMest-class.Rd0000644000176200001440000000424214145001704016471 0ustar liggesusers\name{CovControlMest-class} \docType{class} \alias{CovControlMest-class} \title{Class 'CovControlMest' - contains control parameters for "CovMest"} \description{ This class extends the \code{CovControl} class and contains the control parameters for CovMest} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlMest", ...)} or by calling the constructor-function \code{CovControlMest}. } \section{Slots}{ \describe{ \item{\code{r}:}{a numeric value specifying the required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is 0.45} \item{\code{arp}:}{a numeric value specifying the asympthotic rejection point, i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{0.05} } \item{\code{eps}:}{a numeric value specifying the relative precision of the solution of the M-estimate. Defaults to \code{1e-3}} \item{\code{maxiter}:}{maximum number of iterations allowed in the computation of the M-estimate. Defaults to 120 } \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlMest")}: the generic function \code{restimate} allowes the different methods for robust estimation to be used polymorphically - this function will call \code{CovMest} passing it the control object and will return the obtained \code{CovRobust} object} } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMest", r=0.4) ctrl2 <- CovControlMest(r=0.4) data(hbk) CovMest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMrcd-class.Rd0000644000176200001440000000562114145002006016444 0ustar liggesusers\name{CovControlMrcd-class} \Rdversion{1.1} \docType{class} \alias{CovControlMrcd-class} \alias{restimate,CovControlMrcd-method} \title{Class 'CovControlMrcd' - contains control parameters for CovMrcd()} \description{ This class extends the \code{CovControl} class and contains the control parameters for \code{"CovMrcd"} } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlMrcd", ...)} or by calling the constructor-function \code{CovControlMrcd}. } \section{Slots}{ \describe{ \item{\code{alpha}:}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{h}{the size of the subset (can be between ceiling(n/2) and n). Normally NULL and then it \code{h} will be calculated as \code{h=ceiling(alpha*n)}. If \code{h} is provided, \code{alpha} will be calculated as \code{alpha=h/n}.} \item{maxcsteps}{maximal number of concentration steps in the deterministic MCD; should not be reached.} \item{rho}{regularization parameter. Normally NULL and will be estimated from the data.} \item{target}{structure of the robust positive definite target matrix: a) "identity": target matrix is diagonal matrix with robustly estimated univariate scales on the diagonal or b) "equicorrelation": non-diagonal target matrix that incorporates an equicorrelation structure (see (17) in paper).} \item{maxcond}{maximum condition number allowed (see step 3.4 in algorithm 1).} \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlMrcd")}: the generic function \code{restimate} allows the different methods for robust estimation to be used polymorphically - this function will call \code{CovMrcd} passing it the control object and will return the obtained \code{CovRobust} object} }} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \seealso{ \code{"\linkS4class{CovControlMcd}"} } \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMrcd", alpha=0.75) ctrl2 <- CovControlMrcd(alpha=0.75) data(hbk) CovMrcd(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/OsloTransect.Rd0000644000176200001440000001160612763517421015103 0ustar liggesusers\name{OsloTransect} \alias{OsloTransect} \docType{data} \title{ Oslo Transect Data } \description{ The oslo Transect data set contains 360 samples of different plant species collected along a 120 km transect running through the city of Oslo, Norway. } \usage{data(OsloTransect)} \format{ A data frame with 360 observations on the following 38 variables. \describe{ \item{\code{X.ID}}{a numeric vector, unique ID of the sample} \item{\code{X.MAT}}{a factor with levels \code{BBA} \code{BIL} \code{BWO} \code{FER} \code{MOS} \code{ROG} \code{SNE} \code{STW} \code{TWI}} \item{\code{XCOO}}{a numeric vector, X coordinate} \item{\code{YCOO}}{a numeric vector, Y coordinate} \item{\code{XCOO_km}}{a numeric vector} \item{\code{YCOO_km}}{a numeric vector} \item{\code{X.FOREST}}{a factor with levels \code{BIRSPR} \code{MIXDEC} \code{PINE} \code{SPRBIR} \code{SPRPIN} \code{SPRUCE}} \item{\code{DAY}}{a numeric vector} \item{\code{X.WEATHER}}{a factor with levels \code{CLOUD} \code{MOIST} \code{NICE} \code{RAIN}} \item{\code{ALT}}{a numeric vector} \item{\code{X.ASP}}{a factor with levels \code{} \code{E} \code{FLAT} \code{N} \code{NE} \code{NW} \code{S} \code{SE} \code{SW} \code{W}} \item{\code{X.GRVEG}}{a factor with levels \code{BLGR} \code{BLLY} \code{BLMOLI} \code{BLUE} \code{BLUGRA} \code{GRAS} \code{GRBLU} \code{GRFE} \code{GRMO} \code{LYLI} \code{MIX} \code{MOGR} \code{MOSS}} \item{\code{X.FLITHO}}{a factor with levels \code{CAMSED} \code{GNEID_O} \code{GNEIS_O} \code{GNEIS_R} \code{MAGM} \code{MICSH}} \item{\code{Ag_ppb}}{a numeric vector} \item{\code{As_ash}}{a numeric vector} \item{\code{B}}{a numeric vector} \item{\code{Ba}}{a numeric vector} \item{\code{Ca}}{a numeric vector} \item{\code{Cd}}{a numeric vector} \item{\code{Co}}{a numeric vector} \item{\code{Cr}}{a numeric vector} \item{\code{Cu}}{a numeric vector} \item{\code{Fe}}{a numeric vector} \item{\code{Hg_ppb}}{a numeric vector} \item{\code{K}}{a numeric vector} \item{\code{La}}{a numeric vector} \item{\code{LOI}}{a numeric vector} \item{\code{Mg}}{a numeric vector} \item{\code{Mn}}{a numeric vector} \item{\code{Mo}}{a numeric vector} \item{\code{Ni}}{a numeric vector} \item{\code{P}}{a numeric vector} \item{\code{Pb}}{a numeric vector} \item{\code{S}}{a numeric vector} \item{\code{Sb}}{a numeric vector} \item{\code{Sr}}{a numeric vector} \item{\code{Ti}}{a numeric vector} \item{\code{Zn}}{a numeric vector} } } \details{ Samples of different plant species were collected along a 120 km transect running through the city of Oslo, Norway (forty samples each of leaves, needles,roots or barks of several plant species), and the concentrations of 25 chemical elements for the sample materials are reported. The factors that influenced the observed element concentrations in the sample materials were investigated. This data set was used in Todorov and Filzmoser (2007) for illustration of the robust statistics for one-way MANOVA implemented in the function \code{\link{Wilks.test}}. } \source{ REIMANN,C., ARNOLDUSSEN,A., BOYD,R., FINNE,T.E., NORDGULEN,Oe., VOLDEN,T. and ENGLMAIER,P. (2006) The Influence of a city on element contents of a terrestrial moss (Hylocomium splendens), \emph{The Science of the Total Environment} \bold{369} 419--432. REIMANN,C., ARNOLDUSSEN,A., BOYD,R., FINNE,T.E., KOLLER,F., NORDGULEN,Oe., and ENGLMAIER,P. (2007) Element contents in leaves of four plant species (birch, mountain ash, fern and spruce) along anthropogenic and geogenic concentration gradients, \emph{The Science of the Total Environment} \bold{377} 416--433. REIMANN,C., ARNOLDUSSEN,A., FINNE,T.E., KOLLER,F., NORDGULEN,Oe., and ENGLMAIER,P., (2007) Element contents in birch leaves, bark and wood under different anthropogenic and geogenic conditions, \emph{Applied Geochemistry}, \bold{22} 1549--1566. } \references{ Todorov V. and Filzmoser P. (2007) Robust statistic for the one-way MANOVA, \emph{submetted to the Journal of Environmetrics}. } \examples{ data(OsloTransect) str(OsloTransect) ## ## Log-transform the numerical part of the data, ## choose the desired groups and variables and ## perform the classical Wilks' Lambda test ## OsloTransect[,14:38] <- log(OsloTransect[,14:38]) grp <- OsloTransect$X.FLITHO ind <- which(grp =="CAMSED" | grp == "GNEIS_O" | grp == "GNEIS_R" | grp=="MAGM") (cwl <- Wilks.test(X.FLITHO~K+P+Zn+Cu,data=OsloTransect[ind,])) ## ## Perform now the robust MCD based Wilks' Lambda test. ## Use the already computed multiplication factor 'xd' and ## degrees of freedom 'xq' for the approximate distribution. ## xd <- -0.003708238 xq <- 11.79073 (mcdwl <- Wilks.test(X.FLITHO~K+P+Zn+Cu,data=OsloTransect[ind,], method="mcd", xd=xd, xq=xq)) } \keyword{datasets} rrcov/man/PcaGrid.Rd0000644000176200001440000001030614145003654013762 0ustar liggesusers\name{PcaGrid} \alias{PcaGrid} \alias{PcaGrid.formula} \alias{PcaGrid.default} \title{ Robust Principal Components based on Projection Pursuit (PP): GRID search Algorithm } \description{ Computes an approximation of the PP-estimators for PCA using the grid search algorithm in the plane. } \usage{ PcaGrid(x, ...) \method{PcaGrid}{default}(x, k = 0, kmax = ncol(x), scale=FALSE, na.action = na.fail, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaGrid}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, it is set to the number of columns of the data. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=0}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{scale}{a value indicating whether and how the variables should be scaled. If \code{scale = FALSE} (default) or \code{scale = NULL} no scaling is performed (a vector of 1s is returned in the \code{scale} slot). If \code{scale = TRUE} the data are scaled to have unit variance. Alternatively it can be a function like \code{sd} or \code{mad} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the \code{scale} slot. Default is \code{scale = FALSE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \details{ \code{PcaGrid}, serving as a constructor for objects of class \code{\link{PcaGrid-class}} is a generic function with "formula" and "default" methods. For details see \code{\link[pcaPP]{PCAgrid}} and the relevant references. } \value{ An S4 object of class \code{\link{PcaGrid-class}} which is a subclass of the virtual class \code{\link{PcaRobust-class}}. } \references{ C. Croux, P. Filzmoser, M. Oliveira, (2007). Algorithms for Projection-Pursuit Robust Principal Component Analysis, \emph{Chemometrics and Intelligent Laboratory Systems}, 87, 225. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \examples{ # multivariate data with outliers library(mvtnorm) x <- rbind(rmvnorm(200, rep(0, 6), diag(c(5, rep(1,5)))), rmvnorm( 15, c(0, rep(20, 5)), diag(rep(1, 6)))) # Here we calculate the principal components with PCAgrid pc <- PcaGrid(x, 6) # we could draw a biplot too: biplot(pc) # we could use another objective function, and # maybe only calculate the first three principal components: pc <- PcaGrid(x, 3, method="qn") biplot(pc) # now we want to compare the results with the non-robust principal components pc <- PcaClassic(x, k=3) # again, a biplot for comparision: biplot(pc) } \keyword{robust} \keyword{multivariate} rrcov/man/PcaRobust-class.Rd0000644000176200001440000000516314145004177015464 0ustar liggesusers\name{PcaRobust-class} \docType{class} \alias{PcaRobust-class} \title{Class "PcaRobust" is a virtual base class for all robust PCA classes } \description{ The class \code{PcaRobust} searves as a base class for deriving all other classes representing the results of the robust Principal Component Analisys methods} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{Object of class \code{"language"} } \item{\code{center}:}{Object of class \code{"vector"} the center of the data } \item{\code{loadings}:}{Object of class \code{"matrix"} the matrix of variable loadings (i.e., a matrix whose columns contain the eigenvectors) } \item{\code{eigenvalues}:}{Object of class \code{"vector"} the eigenvalues } \item{\code{scores}:}{Object of class \code{"matrix"} the scores - the value of the projected on the space of the principal components data (the centred (and scaled if requested) data multiplied by the \code{loadings} matrix) is returned. Hence, \code{cov(scores)} is the diagonal matrix \code{diag(eigenvalues)} } \item{\code{k}:}{Object of class \code{"numeric"} number of (choosen) principal components } \item{\code{sd}:}{Object of class \code{"Uvector"} Score distances within the robust PCA subspace } \item{\code{od}:}{Object of class \code{"Uvector"} Orthogonal distances to the robust PCA subspace } \item{\code{cutoff.sd}:}{Object of class \code{"numeric"} Cutoff value for the score distances} \item{\code{cutoff.od}:}{Object of class \code{"numeric"} Cutoff values for the orthogonal distances } \item{\code{flag}:}{Object of class \code{"Uvector"} The observations whose score distance is larger than cutoff.sd or whose orthogonal distance is larger than cutoff.od can be considered as outliers and receive a flag equal to zero. The regular observations receive a flag 1 } \item{\code{n.obs}:}{Object of class \code{"numeric"} the number of observations } } } \section{Extends}{ Class \code{"\linkS4class{Pca}"}, directly. } \section{Methods}{ No methods defined with class "PcaRobust" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{Pca-class}}, \code{\link{PcaClassic-class}}, } \examples{ showClass("PcaRobust") } \keyword{robust} \keyword{multivariate} rrcov/man/CovMrcd-class.Rd0000644000176200001440000000520114145002713015102 0ustar liggesusers\name{CovMrcd-class} \Rdversion{1.1} \docType{class} \alias{CovMrcd-class} \title{ MRCD Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates MRCD Estimates of multivariate location and scatter computed by a variant of the \sQuote{Fast MCD} algorithm. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovMrcd", ...)}, but the usual way of creating \code{CovMrcd} objects is a call to the function \code{CovMrcd} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{alpha}:}{Object of class \code{"numeric"} - the size of the subsets over which the determinant is minimized (the default is (n+p+1)/2) } \item{\code{quan}:}{Object of class \code{"numeric"} - the number of observations on which the MCD is based. If \code{quan} equals \code{n.obs}, the MCD is the classical covariance matrix. } \item{\code{best}:}{Object of class \code{"Uvector"} - the best subset found and used for computing the raw estimates. The size of \code{best} is equal to \code{quan} } \item{\code{cnp2}:}{Object of class \code{"numeric"} - containing the consistency correction factor of the estimate of the covariance matrix. } \item{\code{icov}:}{The inverse of the covariance matrix. } \item{\code{rho}:}{The estimated regularization parameter. } \item{\code{target}:}{The estimated target matrix. } \item{\code{crit}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class \code{"CovMrcd"} in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMrcd}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}}, \code{\link{CovMcd-class}} } \examples{ showClass("CovMrcd") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovControlSest.Rd0000644000176200001440000000433614145002247015403 0ustar liggesusers\name{CovControlSest} \alias{CovControlSest} \title{ Constructor function for objects of class "CovControlSest" } \concept{High breakdown point} \description{ This function will create a control object \code{CovControlSest} containing the control parameters for \code{CovSest} } \usage{ CovControlSest(bdp = 0.5, arp = 0.1, eps = 1e-5, maxiter = 120, nsamp = 500, seed = NULL, trace = FALSE, tolSolve = 1e-14, method= "sfast") } \arguments{ \item{bdp}{ a numeric value specifying the required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is 0.45 } \item{arp}{a numeric value specifying the asympthotic rejection point (for the Rocke type S estimates), i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{0.1} } \item{eps}{a numeric value specifying the relative precision of the solution of the S-estimate (bisquare and Rocke type). Defaults to \code{1e-5}. } \item{maxiter}{maximum number of iterations allowed in the computation of the S-estimate (bisquare and Rocke type). Defaults to 120. } \item{nsamp}{the number of random subsets considered. Default is \code{nsamp = 500}.} \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}. } \item{method}{ Which algorithm to use: 'sfast'=FAST-S or 'surreal'=SURREAL } } %\details{} \value{ A \code{CovControlSest} object. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlSest", bdp=0.4) ctrl2 <- CovControlSest(bdp=0.4) data(hbk) CovSest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovClassic-class.Rd0000644000176200001440000000470514145001043015601 0ustar liggesusers\name{CovClassic-class} \docType{class} \alias{CovClassic-class} \title{Class "CovClassic" - classical estimates of multivariate location and scatter } \description{ The class \code{CovClassic} represents an estimate of the multivariate location and scatter of a data set. The objects of class \code{CovClassic} contain the classical estimates. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovClassic", ...)}, but the usual way of creating \code{CovClassic} objects is a call to the function \code{CovClassic} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{Object of class \code{"language"} } \item{\code{cov}:}{covariance matrix} \item{\code{center}:}{location} \item{\code{n.obs}:}{number of observations used for the computation of the estimates} \item{\code{mah}:}{mahalanobis distances} \item{\code{method}:}{a character string describing the method used to compute the estimate: "Classic"} \item{\code{singularity}:}{a list with singularity information for the ocvariance matrix (or \code{NULL} of not singular)} \item{\code{X}:}{data} } } \section{Methods}{ \describe{ \item{getCenter}{\code{signature(obj = "CovClassic")}: location vector } \item{getCov}{\code{signature(obj = "CovClassic")}: covariance matrix } \item{getCorr}{\code{signature(obj = "CovClassic")}: correlation matrix } \item{getData}{\code{signature(obj = "CovClassic")}: data frame } \item{getDistance}{\code{signature(obj = "CovClassic")}: distances } \item{getEvals}{\code{signature(obj = "CovClassic")}: Computes and returns the eigenvalues of the covariance matrix } \item{plot}{\code{signature(x = "CovClassic")}: plot the object } \item{show}{\code{signature(object = "CovClassic")}: display the object } \item{summary}{\code{signature(object = "CovClassic")}: calculate summary information } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cv <- CovClassic(hbk.x) cv summary(cv) plot(cv) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/LdaPP.Rd0000644000176200001440000001360214177775670013436 0ustar liggesusers\name{LdaPP} \alias{LdaPP} \alias{LdaPP.formula} \alias{LdaPP.default} \title{ Robust Linear Discriminant Analysis by Projection Pursuit} \description{ Performs robust linear discriminant analysis by the projection-pursuit approach - proposed by Pires and Branco (2010) - and returns the results as an object of class \code{LdaPP} (aka constructor). } \usage{ LdaPP(x, ...) \method{LdaPP}{formula}(formula, data, subset, na.action, \dots) \method{LdaPP}{default}(x, grouping, prior = proportions, tol = 1.0e-4, method = c("huber", "mad", "sest", "class"), optim = FALSE, trace=FALSE, ...) } \arguments{ \item{formula}{a formula of the form \code{y~x}, it describes the response and the predictors. The formula can be more complicated, such as \code{y~log(x)+z} etc (see \code{\link{formula}} for more details). The response should be a factor representing the response variable, or any vector that can be coerced to such (such as a logical variable).} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{x}{a matrix or data frame containing the explanatory variables (training set). } \item{grouping}{grouping variable: a factor specifying the class for each observation.} \item{prior}{prior probabilities, default to the class proportions for the training set.} \item{tol}{tolerance} \item{method}{method} \item{optim}{wheather to perform the approximation using the Nelder and Mead simplex method (see function \code{optim()} from package \code{stats}). Default is \code{optim = FALSE}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{\dots}{arguments passed to or from other methods.} } \details{ Currently the algorithm is implemented only for binary classification and in the following will be assumed that only two groups are present. The PP algorithm searches for low-dimensional projections of higher-dimensional data where a projection index is maximized. Similar to the original Fisher's proposal the squared standardized distance between the observations in the two groups is maximized. Instead of the sample univariate mean and standard deviation \code{(T,S)} robust alternatives are used. These are selected through the argument \code{method} and can be one of \describe{ \item{huber}{the pair \code{(T,S)} are the robust M-estimates of location and scale} \item{mad}{\code{(T,S)} are the Median and the Median Absolute Deviation} \item{sest}{the pair \code{(T,S)} are the robust S-estimates of location and scale} \item{class}{\code{(T,S)} are the mean and the standard deviation.} } The first approximation \emph{A1} to the solution is obtained by investigating a finite number of candidate directions, the unit vectors defined by all pairs of points such that one belongs to the first group and the other to the second group. The found solution is stored in the slots \code{raw.ldf} and \code{raw.ldfconst}. The second approximation \emph{A2} (optional) is performed by a numerical optimization algorithm using \emph{A1} as initial solution. The Nelder and Mead method implemented in the function \code{\link{optim}} is applied. Whether this refinement will be used is controlled by the argument \code{optim}. If \code{optim=TRUE} the result of the optimization is stored into the slots \code{ldf} and \code{ldfconst}. Otherwise these slots are set equal to \code{raw.ldf} and \code{raw.ldfconst}. } \value{ Returns an S4 object of class \code{\link[rrcov]{LdaPP-class}} } \references{ Pires, A. M. and A. Branco, J. (2010) Projection-pursuit approach to robust linear discriminant analysis \emph{Journal Multivariate Analysis}, Academic Press, Inc., \bold{101}, 2464--2485. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} and Ana Pires \email{apires@math.ist.utl.pt} } \section{Warning }{Still an experimental version! Only binary classification is supported.} \seealso{ \code{\link[rrcov]{Linda}}, \code{\link[rrcov]{LdaClassic}} } \examples{ ## ## Function to plot a LDA separation line ## lda.line <- function(lda, ...) { ab <- lda@ldf[1,] - lda@ldf[2,] cc <- lda@ldfconst[1] - lda@ldfconst[2] abline(a=-cc/ab[2], b=-ab[1]/ab[2],...) } data(pottery) x <- pottery[,c("MG", "CA")] grp <- pottery$origin col <- c(3,4) gcol <- ifelse(grp == "Attic", col[1], col[2]) gpch <- ifelse(grp == "Attic", 16, 1) ## ## Reproduce Fig. 2. from Pires and branco (2010) ## plot(CA~MG, data=pottery, col=gcol, pch=gpch) \dontrun{ ppc <- LdaPP(x, grp, method="class", optim=TRUE) lda.line(ppc, col=1, lwd=2, lty=1) pph <- LdaPP(x, grp, method="huber",optim=TRUE) lda.line(pph, col=3, lty=3) pps <- LdaPP(x, grp, method="sest", optim=TRUE) lda.line(pps, col=4, lty=4) ppm <- LdaPP(x, grp, method="mad", optim=TRUE) lda.line(ppm, col=5, lty=5) rlda <- Linda(x, grp, method="mcd") lda.line(rlda, col=6, lty=1) fsa <- Linda(x, grp, method="fsa") lda.line(fsa, col=8, lty=6) ## Use the formula interface: ## LdaPP(origin~MG+CA, data=pottery) ## use the same two predictors LdaPP(origin~., data=pottery) ## use all predictor variables ## ## Predict method data(pottery) fit <- LdaPP(origin~., data = pottery) predict(fit) } } \keyword{robust} \keyword{multivariate} rrcov/man/Wilks.test.Rd0000644000176200001440000001523012763517421014527 0ustar liggesusers\name{Wilks.test} \alias{Wilks.test} \alias{Wilks.test.default} \alias{Wilks.test.data.frame} \alias{Wilks.test.formula} \alias{Wilks.test.matrix} \alias{model.frame.Wilks.test} \title{ Classical and Robust One-way MANOVA: Wilks Lambda } \description{ Classical and Robust One-way MANOVA: Wilks Lambda } \usage{ \method{Wilks.test}{formula}(formula, data, \dots, subset, na.action) \method{Wilks.test}{default}(x, grouping, method=c("c", "mcd", "rank"), approximation=c("Bartlett", "Rao", "empirical"), xd=NULL, xq=NULL, xfn = NULL, xwl=NULL, nrep=3000, trace=FALSE, \dots) \method{Wilks.test}{data.frame}(x, \dots) \method{Wilks.test}{matrix}(x, grouping, \dots, subset, na.action) } \arguments{ \item{formula}{ A formula of the form \code{groups ~ x1 + x2 + \dots} That is, the response is the grouping factor and the right hand side specifies the (non-factor) variables. } \item{data}{ Data frame from which variables specified in \code{formula} are to be taken. } \item{x}{ (required if no formula is given as the principal argument.) a matrix or data frame or Matrix containing the explanatory variables. } \item{grouping}{ grouping variable - a factor specifying the class for each observation (required if no formula argument is given.) } \item{subset}{ An index vector specifying the cases to be used. } \item{na.action}{ A function to specify the action to be taken if \code{NA}s are found. The default action is for the procedure to fail. An alternative is \code{na.omit}, which leads to rejection of cases with missing values on any required variable. } \item{method}{ \code{"c"} for standard estimators of the mean and variance, \code{"mcd"} for MCD estimators of mean and variances and \code{"rank"} for rank based wilks' lambda as proposed by Nath and Pavur (1985). } \item{approximation}{ \code{"Bartlett"} for Bartlett approximation (default), \code{"Rao"} for rao approximation (only for method="c") and \code{"empirical"} for simulated empirical distribution. } \item{xd}{multiplication factor for the approximate distribution of the robust Lambda statistic. If \code{xd=NULL} the factor will computed by simulation and will be returned in the value (see Details) } \item{xq}{the degrees of freedom for the approximate \eqn{\chi^2} distribution of the robust Lambda statistic. If \code{xq=NULL} the degrees of freedom will computed by simulation and will be returned in the value (see Details) } \item{xfn}{the empirical distribution function. If \code{xfn=NULL} the empirical function will be estimated by simulation and will be returned in the value (see Details) } \item{xwl}{the simulated values of the robust statistic. If \code{xwl=NULL} the simulation will be performed and the calculated result will be returned in the value (see Details) } \item{nrep}{number of trials for the simulations for computing the multiplication factor \code{xd} and the degrees of freedom \code{xq}. Default is \code{nrep=3000}. } \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{\dots}{arguments passed to or from other methods.} } \value{ A list with class \code{"htest"} containing the following components: \item{statistic}{the value of the Wilks' Lambda statistic.} \item{parameter}{The corresponding approximation of the Wilks' lambda statistic and the degrees of freedom.} \item{p.value}{the p-value for the test.} \item{estimate}{the estimated mean vectors.} \item{method}{a character string indicating what type of test was performed.} \item{data.name}{a character string giving the name of the data.} \item{xd}{multiplication factor for the approximate distribution of the robust Lambda statistic. } \item{xq}{the degrees of freedom for the approximate \eqn{\chi^2} distribution of the robust Lambda statistic. } } \details{ The classical Wilks' Lambda statistic for testing the equality of the group means of two or more groups is modified into a robust one through substituting the classical estimates by the highly robust and efficient reweighted MCD estimates, which can be computed efficiently by the FAST-MCD algorithm - see \code{\link{CovMcd}}. An approximation for the finite sample distribution of the Lambda statistic is obtained, based on matching the mean and variance of a multiple of an \eqn{\chi^2} distribution which are computed by simultaion. } \note{ This function may be called giving either a formula and optional data frame, or a matrix and grouping factor as the first two arguments. All other arguments are optional. } \references{ Todorov, V. and Filzmoser, P. (2007) Robust statistic for the one-way MANOVA, \emph{submetted to the Journal of Environmetrics}. Todorov, V. (2007) Robust selection of variables in linear discriminant analysis, \emph{Statistical Methods and Applications}, \bold{15}, 395.407, doi:10.1007/s10260-006-0032-6. Nath, R. and Pavur, R. (1985) A new statistic in the one way multivariate analysis of variance, \emph{Computatational Statistics and Data Analysis}, \bold{2}, 297--315 } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMcd}}, \code{\link{T2.test}}} \examples{ library(MASS) data(anorexia) grp <- as.factor(anorexia[,1]) x <- as.matrix(anorexia[,2:3]) ## Using the default interface, classical test Wilks.test(x, grouping=grp, method="c") ## Using the default interface, rank based test Wilks.test(x, grouping=grp, method="rank") ## For this data set: p=2, n=n1+n2+n3=29+26+17 ## were computed the following multiplication factor xd and degrees of freedom xq ## for the MCD estimates with alpha=0.5 xd <- -0.02162666 xq <- 3.63971 Wilks.test(x, grouping=grp, method="mcd", xd=xd, xq=xq) ## Now the same with the formula interface Wilks.test(Treat~Prewt+Postwt, data=anorexia, method="mcd", xd=xd, xq=xq) ##Iris data with formula interface data(iris) Wilks.test(Species~., data=iris, method="c") ## and with default interface Wilks.test(iris[,1:4],grouping=iris[,5], method="c") # hemophilia data - classical, rank and MCD test data(hemophilia) hemophilia$gr <- as.factor(hemophilia$gr) Wilks.test(gr~., data=hemophilia, method="c") Wilks.test(gr~., data=hemophilia, method="rank") ## already simulated parameters for MCD with alpha=0.5 xd <- -0.01805436 xq <- 1.950301 Wilks.test(gr~., data=hemophilia, xd=xd, xq=xq, method="mcd") } \keyword{multivariate} \keyword{robust} rrcov/man/PcaClassic.Rd0000644000176200001440000000743514145755062014476 0ustar liggesusers\name{PcaClassic} \alias{PcaClassic} \alias{PcaClassic.formula} \alias{PcaClassic.default} \title{ Principal Components Analysis } \description{ Performs a principal components analysis and returns the results as an object of class PcaClassic (aka constructor). } \usage{ PcaClassic(x, ...) \method{PcaClassic}{default}(x, k = ncol(x), kmax = ncol(x), scale=FALSE, signflip=TRUE, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaClassic}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, the algorithm itself will determine the number of components by finding such \code{k} that \eqn{l_k/l_1 >= 10.E-3} and \eqn{\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j >= 0.8}. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=ncol(x)}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{scale}{a value indicating whether and how the variables should be scaled to have unit variance (only possible if there are no constant variables). If \code{scale=FALSE} (default) or \code{scale=NULL} no scaling is performed (a vector of 1s is returned in the scale slot). If \code{scale=TRUE} the data are scaled to have unit variance. Alternatively it can be a function like \code{sd} or \code{Qn} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the scale slot. Default is \code{scale=FALSE}.} \item{signflip}{a logical value indicating wheather to try to solve the sign indeterminancy of the loadings - ad hoc approach setting the maximum element in a singular vector to be positive. Default is \code{signflip = TRUE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } %\details{} \value{ An S4 object of class \code{\link{PcaClassic-class}} which is a subclass of the virtual class \code{\link{Pca-class}}. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \note{ This function can be seen as a wrapper arround prcomp() from \code{stats} which returns the results of the PCA in a class compatible with the object model for robust PCA. } \seealso{ \code{\link{Pca-class}}, \code{\link{PcaClassic-class}}, } %\examples{} \keyword{robust} \keyword{multivariate} rrcov/man/salmon.Rd0000644000176200001440000000206712763517421013755 0ustar liggesusers\name{salmon} \alias{salmon} \docType{data} \title{ Salmon data } \description{ The salmon data contains two measurements of the growth rings on the scale of Alaskan and Canadian salmon as well as the gender of the fishes. There are 50 Alaskan-born and 50 Canadian-born salmon, and this information is coded in the variable \code{Origin}. } \usage{data(salmon)} \format{ A data frame with 100 observations on the following 4 variables. \describe{ \item{\code{Gender}}{female=1 and male=2} \item{\code{Freshwater}}{diameter of rings for the first-year freshwater growth (hundrets of an inch)} \item{\code{Marine}}{diameter of rings for the first-year marine growth (hundrets of an inch)} \item{\code{Origin}}{Origin of the fish: a factor with levels \code{Alaskan} \code{Canadian}} } } %\details{} \source{ Johnson, R.A. and Wichern, D. W. \emph{Applied Multivariate Statistical Analysis} (Prentice Hall, International Editions, 2002, fifth edition)} %\references{} \examples{ data(salmon) } \keyword{datasets} rrcov/man/CovRobust.Rd0000644000176200001440000000536714145003047014406 0ustar liggesusers\name{CovRobust} \alias{CovRobust} \title{ Robust Location and Scatter Estimation } \description{ Computes a robust multivariate location and scatter estimate with a high breakdown point, using one of the available estimators. } \usage{ CovRobust(x, control, na.action = na.fail) } \arguments{ \item{x}{a matrix or data frame. } \item{control}{ a control object (S4) for one of the available control classes, e.g. \code{\link{CovControlMcd-class}}, \code{\link{CovControlOgk-class}}, \code{\link{CovControlSest-class}}, etc., containing estimation options. The class of this object defines which estimator will be used. Alternatively a character string can be specified which names the estimator - one of auto, sde, mcd, ogk, m, mve, sfast, surreal, bisquare, rocke. If 'auto' is specified or the argument is missing, the function will select the estimator (see below for details)} \item{na.action}{ A function to specify the action to be taken if missing values are found. The default action is for the procedure to fail. An alternative is na.omit, which leads to rejection of cases with missing values on any required variable.} } \details{ This function simply calls the \code{restimate} method of the control object \code{control}. If a character string naming an estimator is specified, a new control object will be created and used (with default estimation options). If this argument is missing or a character string 'auto' is specified, the function will select the robust estimator according to the size of the dataset. If there are less than 1000 observations and less than 10 variables or less than 5000 observations and less than 5 variables, Stahel-Donoho estimator will be used. Otherwise, if there are less than 50000 observations either bisquare S-estimates (for less than 10 variables) or Rocke type S-estimates (for 10 to 20 variables) will be used. In both cases the S iteration starts at the initial MVE estimate. And finally, if there are more than 50000 observations and/or more than 20 variables the Orthogonalized Quadrant Correlation estimator (\code{CovOgk} with the corresponding parameters) is used. } \value{ An object derived from a \code{CovRobust} object, depending on the selected estimator. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovRobust(hbk.x) CovRobust(hbk.x, CovControlSest(method="bisquare")) } \keyword{robust} \keyword{multivariate} rrcov/man/CovSde-class.Rd0000644000176200001440000000313714145003107014734 0ustar liggesusers\name{CovSde-class} \Rdversion{1.1} \docType{class} \alias{CovSde-class} \title{ Stahel-Donoho Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates Stahel-Donoho estimates of multivariate location and scatter.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovSde", ...)}, but the usual way of creating \code{CovSde} objects is a call to the function \code{CovSde} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovSde" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovSde}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovSde") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/fish.Rd0000644000176200001440000000554212763517421013416 0ustar liggesusers\name{fish} \alias{fish} \docType{data} \title{ Fish Catch Data Set} \description{ The Fish Catch data set contains measurements on 159 fish caught in the lake Laengelmavesi, Finland. } \usage{data(fish)} \format{ A data frame with 159 observations on the following 7 variables. \describe{ \item{\code{Weight}}{Weight of the fish (in grams)} \item{\code{Length1}}{Length from the nose to the beginning of the tail (in cm)} \item{\code{Length2}}{Length from the nose to the notch of the tail (in cm)} \item{\code{Length3}}{Length from the nose to the end of the tail (in cm)} \item{\code{Height}}{Maximal height as \% of Length3} \item{\code{Width}}{Maximal width as \% of Length3} \item{\code{Species}}{Species} } } \details{ The Fish Catch data set contains measurements on 159 fish caught in the lake Laengelmavesi, Finland. For the 159 fishes of 7 species the weight, length, height, and width were measured. Three different length measurements are recorded: from the nose of the fish to the beginning of its tail, from the nose to the notch of its tail and from the nose to the end of its tail. The height and width are calculated as percentages of the third length variable. This results in 6 observed variables, Weight, Length1, Length2, Length3, Height, Width. Observation 14 has a missing value in variable Weight, therefore this observation is usually excluded from the analysis. The last variable, Species, represents the grouping structure: the 7 species are 1=Bream, 2=Whitewish, 3=Roach, 4=Parkki, 5=Smelt, 6=Pike, 7=Perch. This data set was also analyzed in the context of robust Linear Discriminant Analysis by Todorov (2007), Todorov and Pires (2007). } \source{ Journal of Statistical Education, Fish Catch Data Set, [http://www.amstat.org/publications/jse/datasets/fishcatch.txt] accessed August, 2006. } \references{ Todorov, V. (2007 Robust selection of variables in linear discriminant analysis, \emph{Statistical Methods and Applications}, \bold{15}, 395--407, doi:10.1007/s10260-006-0032-6. Todorov, V. and Pires, A.M. (2007) Comparative performance of several robust linear discriminant analysis methods, \emph{REVSTAT Statistical Journal}, \bold{5}, 63--83. } \examples{ data(fish) # remove observation #14 containing missing value fish <- fish[-14,] # The height and width are calculated as percentages # of the third length variable fish[,5] <- fish[,5]*fish[,4]/100 fish[,6] <- fish[,6]*fish[,4]/100 # plot a matrix of scatterplots pairs(fish[1:6], main="Fish Catch Data", pch=21, bg=c("red", "green3", "blue", "yellow", "magenta", "violet", "turquoise")[unclass(fish$Species)]) } \keyword{datasets} rrcov/man/PcaProj.Rd0000644000176200001440000001036614145004174014013 0ustar liggesusers\name{PcaProj} \alias{PcaProj} \alias{PcaProj.formula} \alias{PcaProj.default} \title{ Robust Principal Components based on Projection Pursuit (PP): Croux and Ruiz-Gazen (2005) algorithm } \description{ A fast and simple algorithm for approximating the PP-estimators for PCA: Croux and Ruiz-Gazen (2005) } \usage{ PcaProj(x, ...) \method{PcaProj}{default}(x, k = 0, kmax = ncol(x), scale=FALSE, na.action = na.fail, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaProj}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, it is set to the number of columns of the data. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=0}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{scale}{a value indicating whether and how the variables should be scaled. If \code{scale = FALSE} (default) or \code{scale = NULL} no scaling is performed (a vector of 1s is returned in the \code{scale} slot). If \code{scale = TRUE} the data are scaled to have unit variance. Alternatively it can be a function like \code{sd} or \code{mad} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the \code{scale} slot. Default is \code{scale = FALSE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \details{ \code{PcaProj}, serving as a constructor for objects of class \code{\link{PcaProj-class}} is a generic function with "formula" and "default" methods. For details see \code{\link[pcaPP]{PCAproj}} and the relevant references. } \value{ An S4 object of class \code{\link{PcaProj-class}} which is a subclass of the virtual class \code{\link{PcaRobust-class}}. } \references{ C. Croux, A. Ruiz-Gazen (2005). High breakdown estimators for principal components: The projection-pursuit approach revisited, \emph{Journal of Multivariate Analysis}, 95, 206--226. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \examples{ # multivariate data with outliers library(mvtnorm) x <- rbind(rmvnorm(200, rep(0, 6), diag(c(5, rep(1,5)))), rmvnorm( 15, c(0, rep(20, 5)), diag(rep(1, 6)))) # Here we calculate the principal components with PcaProj pc <- PcaProj(x, 6) # we could draw a biplot too: biplot(pc) # we could use another calculation method and another objective function, and # maybe only calculate the first three principal components: pc <- PcaProj(x, k=3, method="qn", CalcMethod="sphere") biplot(pc) # now we want to compare the results with the non-robust principal components pc <- PcaClassic(x, k=3) # again, a biplot for comparision: biplot(pc) } \keyword{robust} \keyword{multivariate} rrcov/man/fruit.Rd0000644000176200001440000000340114177776410013614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datadoc.R \docType{data} \name{fruit} \alias{fruit} \title{Fruit data set} \format{ A data frame with 1096 rows and 257 variables (one grouping variable -- \code{cultivar} -- and 256 measurement variables). } \source{ Colin Greensill (Faculty of Engineering and Physical Systems, Central Queensland University, Rockhampton, Australia). } \usage{ data(fruit) } \description{ A data set that contains the spectra of six different cultivars of the same fruit (cantaloupe - \emph{Cucumis melo} L. Cantaloupensis group) obtained from Colin Greensill (Faculty of Engineering and Physical Systems, Central Queensland University, Rockhampton, Australia). The total data set contained 2818 spectra measured in 256 wavelengths. For illustrative purposes are considered only three cultivars out of it, named D, M and HA with sizes 490, 106 and 500, respectively. Thus the data set thus contains 1096 observations. For more details about this data set see the references below. } \examples{ data(fruit) table(fruit$cultivar) } \references{ Hubert, M. and Van Driessen, K., (2004). Fast and robust discriminant analysis. \emph{Computational Statistics and Data Analysis}, \bold{45}(2):301--320. \doi{10.1016/S0167-9473(02)00299-2}. Vanden Branden, K and Hubert, M, (2005). Robust classification in high dimensions based on the SIMCA Method. \emph{Chemometrics and Intelligent Laboratory Systems}, \bold{79}(1-2), pp. 10--21. \doi{10.1016/j.chemolab.2005.03.002}. Hubert, M, Rousseeuw, PJ and Verdonck, T, (2012). A Deterministic Algorithm for Robust Location and Scatter. \emph{Journal of Computational and Graphical Statistics}, \bold{21}(3), pp 618--637. \doi{10.1080/10618600.2012.672100}. } \keyword{datasets} rrcov/man/CovControlOgk-class.Rd0000644000176200001440000000530314145002154016300 0ustar liggesusers\name{CovControlOgk-class} \Rdversion{1.1} \docType{class} \alias{CovControlOgk-class} \alias{restimate,CovControlOgk-method} \title{ Class 'CovControlOgk' - contains control parameters for CovOgk } \description{ This class extends the \code{CovControl} class and contains the control parameters for \code{"CovOgk"} } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlOgk", ...)} or by calling the constructor-function \code{CovControlOgk}. } \section{Slots}{ \describe{ \item{niter}{ number of iterations, usually 1 or 2 since iterations beyond the second do not lead to improvement. } \item{beta}{ coverage parameter for the final reweighted estimate } \item{mrob}{ function for computing the robust univariate location and dispersion - defaults to the \code{tau scale} defined in Yohai and Zamar (1998) } \item{vrob}{ function for computing robust estimate of covariance between two random vectors - defaults the one proposed by Gnanadesikan and Kettenring (1972) } \item{smrob}{A string indicating the name of the function for computing the robust univariate location and dispersion - defaults to \code{scaleTau2} - the scale 'tau' function defined in Yohai and Zamar (1998)} \item{svrob}{A string indicating the name of the function for computing robust estimate of covariance between two random vectors - defaults to \code{gk}, the one proposed by Gnanadesikan and Kettenring (1972). } \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlOgk")}: the generic function \code{restimate} allowes the different methods for robust estimation to be used polymorphically - this function will call \code{CovOgk} passing it the control object and will return the obtained \code{CovRobust} object} }} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlOgk", beta=0.95) ctrl2 <- CovControlOgk(beta=0.95) data(hbk) CovOgk(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovMrcd.Rd0000644000176200001440000001357614172551647014034 0ustar liggesusers\name{CovMrcd} \alias{CovMrcd} % \title{ Robust Location and Scatter Estimation via Minimum Regularized Covariance Determonant (MRCD)} \description{ Computes a robust multivariate location and scatter estimate with a high breakdown point, using the Minimum Regularized Covariance Determonant (MRCD) estimator. } \usage{ CovMrcd(x, alpha=control@alpha, h=control@h, maxcsteps=control@maxcsteps, initHsets=NULL, save.hsets=FALSE, rho=control@rho, target=control@target, maxcond=control@maxcond, trace=control@trace, control=CovControlMrcd()) } \arguments{ \item{x}{a matrix or data frame. } \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{h}{the size of the subset (can be between ceiling(n/2) and n). Normally NULL and then it \code{h} will be calculated as \code{h=ceiling(alpha*n)}. If \code{h} is provided, \code{alpha} will be calculated as \code{alpha=h/n}.} \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{rho}{regularization parameter. Normally NULL and will be estimated from the data.} \item{target}{structure of the robust positive definite target matrix: a) "identity": target matrix is diagonal matrix with robustly estimated univariate scales on the diagonal or b) "equicorrelation": non-diagonal target matrix that incorporates an equicorrelation structure (see (17) in paper). Default is \code{target="identity"}} \item{maxcond}{maximum condition number allowed (see step 3.4 in algorithm 1). Default is \code{maxcond=50}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{control}{ a control object (S4) of class \code{\link{CovControlMrcd-class}} containing 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.} } \details{ This function computes the minimum regularized covariance determinant estimator (MRCD) of location and scatter and returns an S4 object of class \code{\link{CovMrcd-class}} containing the estimates. Similarly like the MCD method, MRCD looks for the \eqn{h (> n/2)} observations (out of \eqn{n}) whose classical covariance matrix has the lowest possible determinant, but replaces the subset-based covariance by a regularized covariance estimate, defined as a weighted average of the sample covariance of the h-subset and a predetermined positive definite target matrix. The Minimum Regularized Covariance Determinant (MRCD) estimator is then the regularized covariance based on the h-subset which makes the overall determinant the smallest. A data-driven procedure sets the weight of the target matrix (\code{rho}), so that the regularization is only used when needed. } \value{ An S4 object of class \code{\link{CovMrcd-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ Kris Boudt, Peter Rousseeuw, Steven Vanduffel and Tim Verdonck (2020) The Minimum Regularized Covariance Determinant estimator, \emph{Statistics and Computing}, \bold{30}, pp 113--128 \doi{10.1007/s11222-019-09869-x}. Mia Hubert, Peter Rousseeuw and Tim Verdonck (2012) A deterministic algorithm for robust location and scatter. \emph{Journal of Computational and Graphical Statistics} \bold{21}(3), 618--637. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Kris Boudt, Peter Rousseeuw, Steven Vanduffel and Tim Verdonk. Improved by Joachim Schreurs and Iwein Vranckx. Adapted for \pkg{rrcov} by Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMcd}} } \examples{ ## The result will be (almost) identical to the raw MCD ## (since we do not do reweighting of MRCD) ## data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) c0 <- CovMcd(hbk.x, alpha=0.75, use.correction=FALSE) cc <- CovMrcd(hbk.x, alpha=0.75) cc$rho all.equal(c0$best, cc$best) all.equal(c0$raw.center, cc$center) all.equal(c0$raw.cov/c0$raw.cnp2[1], cc$cov/cc$cnp2) summary(cc) ## the following three statements are equivalent c1 <- CovMrcd(hbk.x, alpha = 0.75) c2 <- CovMrcd(hbk.x, control = CovControlMrcd(alpha = 0.75)) ## direct specification overrides control one: c3 <- CovMrcd(hbk.x, alpha = 0.75, control = CovControlMrcd(alpha=0.95)) c1 \dontrun{ data(octane) n <- nrow(octane) p <- ncol(octane) out <- CovMrcd(octane, h=33) robpca = PcaHubert(octane, k=2, alpha=0.75, mcd=FALSE) (outl.robpca = which(robpca@flag==FALSE)) # Observations flagged as outliers by ROBPCA: # 25, 26, 36, 37, 38, 39 # Plot the orthogonal distances versus the score distances: pch = rep(20,n); pch[robpca@flag==FALSE] = 17 col = rep('black',n); col[robpca@flag==FALSE] = 'red' plot(robpca, pch=pch, col=col, id.n.sd=6, id.n.od=6) ## Plot now the MRCD mahalanobis distances pch = rep(20,n); pch[!getFlag(out)] = 17 col = rep('black',n); col[!getFlag(out)] = 'red' plot(out, pch=pch, col=col, id.n=6) } } \keyword{robust} \keyword{multivariate} rrcov/man/PcaProj-class.Rd0000644000176200001440000000332414145004172015110 0ustar liggesusers\name{PcaProj-class} \Rdversion{1.1} \docType{class} \alias{PcaProj-class} \alias{getQuan,PcaProj-method} \title{Class "PcaProj" - Robust PCA using PP - Croux and Ruiz-Gazen (2005) algorithm } \description{ Holds the results of an approximation of the PP-estimators for PCA by a fast and simple algorithm: Croux and Ruiz-Gazen (2005) algorithm. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaProj", ...)} but the usual way of creating \code{PcaProj} objects is a call to the function \code{PcaProj()} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}, \code{center}, \code{scale}, \code{rank}, \code{loadings}, \code{eigenvalues}, \code{scores}, \code{k}, \code{sd}, \code{od}, \code{cutoff.sd}, \code{cutoff.od}, \code{flag}, \code{n.obs}:}{ from the \code{"\linkS4class{Pca}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{PcaRobust}"}, directly. Class \code{"\linkS4class{Pca}"}, by class \code{"\linkS4class{PcaRobust}"}, distance 2. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaProj")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaClassic-class}} } \examples{ showClass("PcaProj") } \keyword{robust} \keyword{multivariate} rrcov/man/soil.Rd0000644000176200001440000000370613563577062013441 0ustar liggesusers\name{soil} \alias{soil} \docType{data} \title{ Exchangable cations in forest soil data set } \description{ The forest soil data set contains measurements on 58 soil pits in the Hubbard Brook Experimental Forest in north-central New Hampshire. The excavations were done in 1983 and 1986. The soil samples were analyzed for the exchangeable cations of aluminium, calcium, magnesium, potassium and sodium. The pit locations in both data sets can be classified by the type of the forest: \itemize{ \item 1: spruce-fir (11 samples), \item 2: high elevation hardwood (23 samples) and \item 3: low elevation hardwood (24 samples)). } Additionally the degree of logging disturbance can be considered (all 0 in the 1983 data set): \itemize{ \item 0: uncut forest, \item 1: cut, undisturbed by machinery and \item 2: cut, disturbed. } The observations are expressed in grams of exchangeable cations per square meter. } \usage{data(soil)} \format{ A data frame with 116 observations on the following 7 variables. \describe{ \item{\code{F}}{Type of forest} \item{\code{D}}{Degree of logging disturbance} \item{\code{Al}}{Level of the exchangable cations in Al} \item{\code{Ca}}{Level of the exchangable cations in Ca} \item{\code{Mg}}{Level of the exchangable cations in Mg} \item{\code{K}}{Level of the exchangable cations in K} \item{\code{Na}}{Level of the exchangable cations in Na} } } \source{ Morrison D.F., 2005, Multivariate Statistical Methods, Thompson } \references{ Vanden Branden K, Hubert M (2005). Robust Classiffication in High Dimensions Based on the SIMCA Method. \emph{Cbemometrics and Intelligent Laboratoty Sysiem}, 79: 10--21. } \examples{ data(soil) soil1983 <- soil[soil$D == 0, -2] # only 1983, remove column D (always 0) (cc <- Linda(F~., data=soil)) (pr <- predict(cc)) pr@classification } \keyword{datasets} rrcov/man/wages.Rd0000644000176200001440000000415412763517421013571 0ustar liggesusers\name{wages} \alias{wages} \docType{data} \title{Wages and Hours} \description{ The data are from a national sample of 6000 households with a male head earning less than USD 15,000 annually in 1966. The data were clasified into 39 demographic groups for analysis. The study was undertaken in the context of proposals for a guaranteed annual wage (negative income tax). At issue was the response of labor supply (average hours) to increasing hourly wages. The study was undertaken to estimate this response from available data. } \usage{data(wages)} \format{ A data frame with 39 observations on the following 10 variables: \describe{ \item{\code{HRS}}{Average hours worked during the year} \item{\code{RATE}}{Average hourly wage (USD)} \item{\code{ERSP}}{Average yearly earnings of spouse (USD)} \item{\code{ERNO}}{Average yearly earnings of other family members (USD)} \item{\code{NEIN}}{Average yearly non-earned income} \item{\code{ASSET}}{Average family asset holdings (Bank account, etc.) (USD)} \item{\code{AGE}}{Average age of respondent} \item{\code{DEP}}{Average number of dependents} \item{\code{RACE}}{Percent of white respondents} \item{\code{SCHOOL}}{Average highest grade of school completed} } } %%\details{} \source{ DASL library %% \url{http://lib.stat.cmu.edu/DASL/Datafiles/wagesdat.html} 'http://lib.stat.cmu.edu/DASL/Datafiles/wagesdat.html' } \references{ D.H. Greenberg and M. Kosters, (1970). Income Guarantees and the Working Poor, The Rand Corporation. } \examples{ data(wages) names(wages) x <- as.matrix(wages) ok <- is.finite(x \%*\% rep(1, ncol(x))) wages <- wages[ok, , drop = FALSE] wages.lm <- lm(HRS~AGE, data=wages) plot(HRS ~ AGE, data = wages) abline(wages.lm) class(wages.lm) names(wages.lm) summary(wages.lm) wages.mm <- lmrob(HRS~AGE, data=wages) plot(HRS ~ AGE, data = wages) abline(wages.mm) class(wages.mm) names(wages.mm) summary(wages.mm) } \keyword{datasets} rrcov/man/CovControlSde.Rd0000644000176200001440000000472714145002203015174 0ustar liggesusers\name{CovControlSde} \Rdversion{1.1} \alias{CovControlSde} \title{ Constructor function for objects of class "CovControlSde" } \concept{High breakdown point} \description{ This function will create a control object \code{CovControlSde} containing the control parameters for \code{CovSde} } \usage{ CovControlSde(nsamp = 0, maxres = 0, tune = 0.95, eps = 0.5, prob = 0.99, seed = NULL, trace = FALSE, tolSolve = 1e-14) } \arguments{ \item{nsamp}{a positive integer giving the number of resamples required; \code{nsamp} may not be reached if too many of the \code{p}-subsamples, chosen out of the observed vectors, are in a hyperplane. If \code{nsamp = 0} all possible subsamples are taken. If \code{nsamp} is omitted, it is calculated to provide a breakdown point of \code{eps} with probability \code{prob}.} \item{maxres}{a positive integer specifying the maximum number of resamples to be performed including those that are discarded due to linearly dependent subsamples. If \code{maxres} is omitted it will be set to 2 times \code{nsamp}.} \item{tune}{a numeric value between 0 and 1 giving the fraction of the data to receive non-zero weight. Defaults to \code{0.95}. } \item{prob}{a numeric value between 0 and 1 specifying the probability of high breakdown point; used to compute \code{nsamp} when \code{nsamp} is omitted. Defaults to \code{0.99}. } \item{eps}{a numeric value between 0 and 0.5 specifying the breakdown point; used to compute \code{nsamp} when \code{nresamp} is omitted. Defaults to \code{0.5}. } \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}. } \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}.} } \value{ A \code{CovControlSde} object. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlSde", nsamp=2000) ctrl2 <- CovControlSde(nsamp=2000) data(hbk) CovSde(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovSde.Rd0000644000176200001440000001112214145003073013624 0ustar liggesusers\encoding{latin1} \name{CovSde} \Rdversion{1.1} \alias{CovSde} % \title{Stahel-Donoho Estimates of Multivariate Location and Scatter} \description{ Compute a robust estimate of location and scale using the Stahel-Donoho projection based estimator } \usage{ CovSde(x, nsamp, maxres, tune = 0.95, eps = 0.5, prob = 0.99, seed = NULL, trace = FALSE, control) } \arguments{ \item{x}{ a matrix or data frame. } \item{nsamp}{a positive integer giving the number of resamples required; \code{nsamp} may not be reached if too many of the \code{p}-subsamples, chosen out of the observed vectors, are in a hyperplane. If \code{nsamp = 0} all possible subsamples are taken. If \code{nsamp} is omitted, it is calculated to provide a breakdown point of \code{eps} with probability \code{prob}.} \item{maxres}{a positive integer specifying the maximum number of resamples to be performed including those that are discarded due to linearly dependent subsamples. If \code{maxres} is omitted it will be set to 2 times \code{nsamp}.} \item{tune}{a numeric value between 0 and 1 giving the fraction of the data to receive non-zero weight. Defaults to \code{0.95}} \item{prob}{a numeric value between 0 and 1 specifying the probability of high breakdown point; used to compute \code{nsamp} when \code{nsamp} is omitted. Defaults to \code{0.99}.} \item{eps}{a numeric value between 0 and 0.5 specifying the breakdown point; used to compute \code{nsamp} when \code{nresamp} is omitted. Defaults to \code{0.5}. } \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}. } \item{control}{ a control object (S4) of class \code{\link{CovControlSde-class}} containing estimation options - same as these provided in the fucntion 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.} } \details{ The projection based Stahel-Donoho estimator posses very good statistical properties, but it can be very slow if the number of variables is too large. It is recommended to use this estimator if \code{n <= 1000} and \code{p<=10} or \code{n <= 5000} and \code{p<=5}. The number of subsamples required is calculated to provide a breakdown point of \code{eps} with probability \code{prob} and can reach values larger than the larger integer value - in such case it is limited to \code{.Machine$integer.max}. Of course you could provide \code{nsamp} in the call, i.e. \code{nsamp=1000} but this will not guarantee the required breakdown point of th eestimator. For larger data sets it is better to use \code{\link{CovMcd}} or \code{\link{CovOgk}}. If you use \code{\link{CovRobust}}, the estimator will be selected automatically according on the size of the data set.} \value{ An S4 object of class \code{\link{CovSde-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ R. A. Maronna and V.J. Yohai (1995) The Behavior of the Stahel-Donoho Robust Multivariate Estimator. \emph{Journal of the American Statistical Association} \bold{90} (429), 330--341. R. A. Maronna, D. Martin and V. Yohai (2006). \emph{Robust Statistics: Theory and Methods}. Wiley, New York. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} and Kjell Konis \email{kjell.konis@epfl.ch} } \note{ The Fortran code for the Stahel-Donoho method was taken almost with no changes from package \code{robust} which in turn has it from the \emph{Insightful Robust Library} (thanks to by Kjell Konis). } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovSde(hbk.x) ## the following four statements are equivalent c0 <- CovSde(hbk.x) c1 <- CovSde(hbk.x, nsamp=2000) c2 <- CovSde(hbk.x, control = CovControlSde(nsamp=2000)) c3 <- CovSde(hbk.x, control = new("CovControlSde", nsamp=2000)) ## direct specification overrides control one: c4 <- CovSde(hbk.x, nsamp=100, control = CovControlSde(nsamp=2000)) c1 summary(c1) plot(c1) ## Use the function CovRobust() - if no estimation method is ## specified, for small data sets CovSde() will be called cr <- CovRobust(hbk.x) cr } \keyword{robust} \keyword{multivariate} rrcov/man/CovRobust-class.Rd0000644000176200001440000000533414145003044015500 0ustar liggesusers\name{CovRobust-class} \Rdversion{1.1} \docType{class} \alias{CovRobust-class} \alias{isClassic,CovRobust-method} \alias{getMeth,CovRobust-method} \alias{show,CovRobust-method} \alias{summary,CovRobust-method} \alias{getRaw,CovRobust-method} \title{Class "CovRobust" - virtual base class for robust estimates of multivariate location and scatter} \description{ \code{CovRobust} is a virtual base class used for deriving the concrete classes representing different robust estimates of multivariate location and scatter. Here are implemeted the standard methods common for all robust estimates like \code{show}, \code{summary} and \code{plot}. The derived classes can override these methods and can define new ones.} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{iter}:}{number of iterations used to compute the estimates} \item{\code{crit}:}{value of the criterion function} \item{\code{wt}:}{weights} \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{Cov}"}, directly. } \section{Methods}{ \describe{ \item{isClassic}{\code{signature(obj = "CovRobust")}: Will return FALSE, since this is a 'Robust' object } \item{getMeth}{\code{signature(obj = "CovRobust")}: Return the name of the particular robust method used (as a character string) } \item{show}{\code{signature(object = "CovRobust")}: display the object } \item{plot}{\code{signature(x = "CovRobust")}: plot the object } \item{getRaw}{\code{signature(obj = "CovRobust")}: Return the object with the reweighted estimates replaced by the raw ones (only relevant for CovMcd, CovMve and CovOgk) } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \seealso{ \code{\link{Cov-class}}, \code{\link{CovMcd-class}}, \code{\link{CovMest-class}}, \code{\link{CovOgk-class}} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cv <- CovMest(hbk.x) # it is not possible to create an object of # class CovRobust, since it is a VIRTUAL class cv summary(cv) # summary method for class CovRobust plot(cv) # plot method for class CovRobust } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/PcaCov.Rd0000644000176200001440000001154714145755144013644 0ustar liggesusers\name{PcaCov} \alias{PcaCov} \alias{PcaCov.formula} \alias{PcaCov.default} \title{ Robust PCA based on a robust covariance matrix } \description{ Robust PCA are obtained by replacing the classical covariance matrix by a robust covariance estimator. This can be one of the available in \code{rrcov} estimators, i.e. MCD, OGK, M or S estimator. } \usage{ PcaCov(x, ...) \method{PcaCov}{default}(x, k = ncol(x), kmax = ncol(x), cov.control=CovControlMcd(), scale = FALSE, signflip = TRUE, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaCov}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, the algorithm itself will determine the number of components by finding such \code{k} that \eqn{l_k/l_1 >= 10.E-3} and \eqn{\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j >= 0.8}. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=ncol(x)}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{cov.control}{specifies which covariance estimator to use by providing a \code{\link{CovControl-class}} object. The default is \code{\link{CovControlMcd-class}} which will indirectly call \code{\link{CovMcd}}. If \code{cov.control=NULL} is specified, the classical estimates will be used by calling \code{\link{CovClassic}}}. \item{scale}{a value indicating whether and how the variables should be scaled to have unit variance (only possible if there are no constant variables). If \code{scale=FALSE} (default) or \code{scale=NULL} no scaling is performed (a vector of 1s is returned in the scale slot). If \code{scale=TRUE} the data are scaled by the estimator used to compute the covariance matrix (\code{MCD} by default). Alternatively it can be a function like \code{sd} or \code{Qn} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the scale slot. Default is \code{scale=FALSE}.} \item{signflip}{a logical value indicating wheather to try to solve the sign indeterminancy of the loadings - ad hoc approach setting the maximum element in a singular vector to be positive. Default is \code{signflip = TRUE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \details{ \code{PcaCov}, serving as a constructor for objects of class \code{\link{PcaCov-class}} is a generic function with "formula" and "default" methods. For details see the relevant references. } \value{ An S4 object of class \code{\link{PcaCov-class}} which is a subclass of the virtual class \code{\link{PcaRobust-class}}. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } %\note{} \examples{ ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaCov(hbk) pca ## Compare with the classical PCA prcomp(hbk) ## or PcaClassic(hbk) ## If you want to print the scores too, use print(pca, print.x=TRUE) ## Using the formula interface PcaCov(~., data=hbk) ## To plot the results: plot(pca) # distance plot pca2 <- PcaCov(hbk, k=2) plot(pca2) # PCA diagnostic plot (or outlier map) ## Use the standard plots available for for prcomp and princomp screeplot(pca) biplot(pca) } \keyword{robust} \keyword{multivariate} rrcov/man/CovControl-class.Rd0000644000176200001440000000210314145001414015630 0ustar liggesusers\name{CovControl-class} \docType{class} \alias{CovControl-class} \title{Class "CovControl" is a VIRTUAL base control class } \description{ The class "CovControl" is a VIRTUAL base control class for the derived classes representing the control parameters for the different robust methods } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \arguments{ \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}.} } \section{Methods}{ No methods defined with class "CovControl" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/bus.Rd0000644000176200001440000001233112763517421013250 0ustar liggesusers\name{bus} \alias{bus} \docType{data} \title{ Automatic vehicle recognition data} \description{ The data set bus (Hettich and Bay, 1999) corresponds to a study in automatic vehicle recognition (see Maronna et al. 2006, page 213, Example 6.3)). This data set from the Turing Institute, Glasgow, Scotland, contains measures of shape features extracted from vehicle silhouettes. The images were acquired by a camera looking downward at the model vehicle from a fixed angle of elevation. Each of the 218 rows corresponds to a view of a bus silhouette, and contains 18 attributes of the image. } \usage{data(bus)} \format{ A data frame with 218 observations on the following 18 variables: \describe{ \item{\code{V1}}{compactness} \item{\code{V2}}{circularity} \item{\code{V3}}{distance circularity} \item{\code{V4}}{radius ratio} \item{\code{V5}}{principal axis aspect ratio} \item{\code{V6}}{maximum length aspect ratio} \item{\code{V7}}{scatter ratio} \item{\code{V8}}{elongatedness} \item{\code{V9}}{principal axis rectangularity} \item{\code{V10}}{maximum length rectangularity} \item{\code{V11}}{scaled variance along major axis} \item{\code{V12}}{scaled variance along minor axis} \item{\code{V13}}{scaled radius of gyration} \item{\code{V14}}{skewness about major axis} \item{\code{V15}}{skewness about minor axis} \item{\code{V16}}{kurtosis about minor axis} \item{\code{V17}}{kurtosis about major axis} \item{\code{V18}}{hollows ratio} } } %%\details{} \source{ Hettich, S. and Bay, S.D. (1999), The UCI KDD Archive, Irvine, CA:University of California, Department of Information and Computer Science, %% \url{http://kdd.ics.uci.edu} 'http://kdd.ics.uci.edu' } \references{ Maronna, R., Martin, D. and Yohai, V., (2006). Robust Statistics: Theory and Methods. Wiley, New York. } \examples{ ## Reproduce Table 6.3 from Maronna et al. (2006), page 213 data(bus) bus <- as.matrix(bus) ## calculate MADN for each variable xmad <- apply(bus, 2, mad) cat("\nMin, Max of MADN: ", min(xmad), max(xmad), "\n") ## MADN vary between 0 (for variable 9) and 34. Therefore exclude ## variable 9 and divide the remaining variables by their MADNs. bus1 <- bus[, -9] madbus <- apply(bus1, 2, mad) bus2 <- sweep(bus1, 2, madbus, "/", check.margin = FALSE) ## Compute classical and robust PCA (Spherical/Locantore, Hubert, MCD and OGK) pca <- PcaClassic(bus2) rpca <- PcaLocantore(bus2) pcaHubert <- PcaHubert(bus2, k=17, kmax=17, mcd=FALSE) pcamcd <- PcaCov(bus2, cov.control=CovControlMcd()) pcaogk <- PcaCov(bus2, cov.control=CovControlOgk()) ev <- getEigenvalues(pca) evrob <- getEigenvalues(rpca) evhub <- getEigenvalues(pcaHubert) evmcd <- getEigenvalues(pcamcd) evogk <- getEigenvalues(pcaogk) uvar <- matrix(nrow=6, ncol=6) svar <- sum(ev) svarrob <- sum(evrob) svarhub <- sum(evhub) svarmcd <- sum(evmcd) svarogk <- sum(evogk) for(i in 1:6){ uvar[i,1] <- i uvar[i,2] <- round((svar - sum(ev[1:i]))/svar, 3) uvar[i,3] <- round((svarrob - sum(evrob[1:i]))/svarrob, 3) uvar[i,4] <- round((svarhub - sum(evhub[1:i]))/svarhub, 3) uvar[i,5] <- round((svarmcd - sum(evmcd[1:i]))/svarmcd, 3) uvar[i,6] <- round((svarogk - sum(evogk[1:i]))/svarogk, 3) } uvar <- as.data.frame(uvar) names(uvar) <- c("q", "Classical","Spherical", "Hubert", "MCD", "OGK") cat("\nBus data: proportion of unexplained variability for q components\n") print(uvar) ## Reproduce Table 6.4 from Maronna et al. (2006), page 214 ## ## Compute classical and robust PCA extracting only the first 3 components ## and take the squared orthogonal distances to the 3-dimensional hyperplane ## pca3 <- PcaClassic(bus2, k=3) # classical rpca3 <- PcaLocantore(bus2, k=3) # spherical (Locantore, 1999) hpca3 <- PcaHubert(bus2, k=3) # Hubert dist <- pca3@od^2 rdist <- rpca3@od^2 hdist <- hpca3@od^2 ## calculate the quantiles of the distances to the 3-dimensional hyperplane qclass <- round(quantile(dist, probs = seq(0, 1, 0.1)[-c(1,11)]), 1) qspc <- round(quantile(rdist, probs = seq(0, 1, 0.1)[-c(1,11)]), 1) qhubert <- round(quantile(hdist, probs = seq(0, 1, 0.1)[-c(1,11)]), 1) qq <- cbind(rbind(qclass, qspc, qhubert), round(c(max(dist), max(rdist), max(hdist)), 0)) colnames(qq)[10] <- "Max" rownames(qq) <- c("Classical", "Spherical", "Hubert") cat("\nBus data: quantiles of distances to hiperplane\n") print(qq) ## ## Reproduce Fig 6.1 from Maronna et al. (2006), page 214 ## cat("\nBus data: Q-Q plot of logs of distances to hyperplane (k=3) \nfrom classical and robust estimates. The line is the identity diagonal\n") plot(sort(log(dist)), sort(log(rdist)), xlab="classical", ylab="robust") lines(sort(log(dist)), sort(log(dist))) } \keyword{datasets} rrcov/man/LdaPP-class.Rd0000644000176200001440000000663714145003503014521 0ustar liggesusers\name{LdaPP-class} \docType{class} \alias{LdaPP-class} \alias{predict,LdaPP-method} \title{Class "LdaPP" - Robust method for Linear Discriminant Analysis by Projection-pursuit} \description{ The class \code{LdaPP} represents an algorithm for robust linear discriminant analysis by projection-pursuit approach. The objects of class \code{LdaPP} contain the results of the robust linear discriminant analysis by projection-pursuit approach. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("LdaPP", ...)} but the usual way of creating \code{LdaPP} objects is a call to the function \code{LdaPP} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the common covariance matrix} \item{\code{raw.ldf}:}{a matrix containing the raw linear discriminant functions - see Details in \code{\link{LdaPP}}} \item{\code{raw.ldfconst}:}{a vector containing the raw constants of each raw linear discriminant function - see Details in \code{\link{LdaPP}}} \item{\code{ldf}:}{a matrix containing the linear discriminant functions} \item{\code{ldfconst}:}{a vector containing the constants of each linear discriminant function} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} } } \section{Extends}{ Class \code{"\linkS4class{LdaRobust}"}, directly. Class \code{"\linkS4class{Lda}"}, by class "LdaRobust", distance 2. } \section{Methods}{ \describe{ \item{predict}{\code{signature(object = "LdaPP")}: calculates prediction using the results in \code{object}. An optional data frame or matrix in which to look for variables with which to predict. If omitted, the training data set is used. If the original fit used a formula or a data frame or a matrix with column names, newdata must contain columns with the same names. Otherwise it must contain the same number of columns, to be used in the same order. If the argument \code{raw=TRUE} is set the raw (obtained by the first approximation algorithm) linear discriminant function and constant will be used.} } } \references{ Pires, A. M. and A. Branco, J. (2010) Projection-pursuit approach to robust linear discriminant analysis \emph{Journal Multivariate Analysis}, Academic Press, Inc., \bold{101}, 2464--2485. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} and Ana Pires \email{apires@math.ist.utl.pt} } \seealso{ \code{\link{LdaRobust-class}}, \code{\link{Lda-class}}, \code{\link{LdaClassic}}, \code{\link{LdaClassic-class}}, \code{\link{Linda}}, \code{\link{Linda-class}} } \examples{ showClass("LdaPP") } \keyword{robust} \keyword{multivariate} rrcov/man/olitos.Rd0000644000176200001440000000453413372265724014001 0ustar liggesusers\name{olitos} \alias{olitos} \docType{data} \title{ Olive Oil Data } \description{ This dataset consists of 120 olive oil samples on measurements on 25 chemical compositions (fatty acids, sterols, triterpenic alcohols) of olive oils from Tuscany, Italy (Armanino et al. 1989). There are 4 classes corresponding to different production areas. Class 1, Class 2, Class 3, and Class 4 contain 50, 25, 34, and 11 observations, respectively. } \usage{data(olitos)} \format{ A data frame with 120 observations on the following 26 variables. \describe{ \item{\code{X1}}{Free fatty acids} \item{\code{X2}}{Refractive index} \item{\code{X3}}{K268} \item{\code{X4}}{delta K} \item{\code{X5}}{Palmitic acid} \item{\code{X6}}{Palmitoleic acid} \item{\code{X7}}{a numeric vector} \item{\code{X8}}{a numeric vector} \item{\code{X9}}{a numeric vector} \item{\code{X10}}{a numeric vector} \item{\code{X11}}{a numeric vector} \item{\code{X12}}{a numeric vector} \item{\code{X13}}{a numeric vector} \item{\code{X14}}{a numeric vector} \item{\code{X15}}{a numeric vector} \item{\code{X16}}{a numeric vector} \item{\code{X17}}{a numeric vector} \item{\code{X18}}{a numeric vector} \item{\code{X19}}{a numeric vector} \item{\code{X20}}{a numeric vector} \item{\code{X21}}{a numeric vector} \item{\code{X22}}{a numeric vector} \item{\code{X23}}{a numeric vector} \item{\code{X24}}{a numeric vector} \item{\code{X25}}{a numeric vector} \item{\code{grp}}{a factor with levels \code{1} \code{2} \code{3} \code{4}} } } \source{ Prof. Roberto Todeschini, Milano Chemometrics and QSAR Research Group \url{http://michem.disat.unimib.it/chm/download/datasets.htm} } \references{ C. Armanino, R. Leardi, S. Lanteri and G. Modi, 1989. Chemometric analysis of Tuscan olive oils. \emph{Cbemometrics and Intelligent Laboratoty Sysiem}, 5: 343--354. R. Todeschini, V. Consonni, A. Mauri, M. Pavan (2004) Software for the calculation of molecular descriptors. Pavan M. Talete slr, Milan, Italy, \url{http://www.talete.mi.it} } \examples{ data(olitos) cc <- Linda(grp~., data=olitos, method="mcdC", l1med=TRUE) cc pr <- predict(cc) tt <- mtxconfusion(cc@grp, pr@classification, printit=TRUE) } \keyword{datasets} rrcov/man/LdaRobust-class.Rd0000644000176200001440000000342014145003374015451 0ustar liggesusers\name{LdaRobust-class} \docType{class} \alias{LdaRobust-class} \title{Class "LdaRobust" is a virtual base class for all robust LDA classes } \description{ The class \code{LdaRobust} searves as a base class for deriving all other classes representing the results of the robust Linear Discriminant Analysis methods} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the common covariance matrix} \item{\code{ldf}:}{a matrix containing the linear discriminant functions} \item{\code{ldfconst}:}{a vector containing the constants of each linear discriminant function} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} } } \section{Extends}{ Class \code{"\linkS4class{Lda}"}, directly. } \section{Methods}{ No methods defined with class "LdaRobust" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{Lda-class}}, \code{\link{LdaClassic-class}}, } \examples{ showClass("LdaRobust") } \keyword{robust} \keyword{multivariate} rrcov/man/CovMMest-class.Rd0000644000176200001440000000414614145002474015255 0ustar liggesusers\name{CovMMest-class} \Rdversion{1.1} \docType{class} \alias{CovMMest-class} \title{ MM Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates MM Estimates of multivariate location and scatter.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovMMest", ...)}, but the usual way of creating \code{CovSest} objects is a call to the function \code{CovMMest} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{det}, \code{flag}, \code{iter}, \code{crit}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{c1}{tuning parameter of the loss function for MM-estimation (depend on control parameters \code{eff} and \code{eff.shape}). Can be computed by the internal function \code{.csolve.bw.MM(p, eff, eff.shape=TRUE)}. For the tuning parameters of the underlying S-estimate see the slot \code{sest} and \code{"\linkS4class{CovSest}"}. } \item{sest}{an \code{CovSest} object containing the initial S-estimate. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovMMest" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMMest}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovMMest") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovClassic.Rd0000644000176200001440000000244614145001103014473 0ustar liggesusers\name{CovClassic} \alias{CovClassic} \alias{Cov} \title{Classical Estimates of Multivariate Location and Scatter} \concept{High breakdown point} \description{ Computes the classical estimates of multivariate location and scatter. Returns an S4 class \code{CovClassic} with the estimated \code{center}, \code{cov}, Mahalanobis distances and weights based on these distances. } \usage{ CovClassic(x, unbiased=TRUE) Cov(x, unbiased=TRUE) } \arguments{ \item{x}{a matrix or data frame. As usual, rows are observations and columns are variables. } \item{unbiased}{ whether to return the unbiased estimate of the covariance matrix. Default is \code{unbiased = TRUE}} } %\details{} \value{ An object of class \code{"CovClassic"}. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} \seealso{ \code{\link{Cov-class}}, \code{\link{CovClassic-class}} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cv <- CovClassic(hbk.x) cv summary(cv) plot(cv) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovControlSde-class.Rd0000644000176200001440000000450214145002224016271 0ustar liggesusers\name{CovControlSde-class} \Rdversion{1.1} \docType{class} \alias{CovControlSde-class} \alias{restimate,CovControlSde-method} \title{Class 'CovControlSde' - contains control parameters for "CovSde"} \description{ This class extends the \code{CovControl} class and contains the control parameters for CovSde } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlSde", ...)} or by calling the constructor-function \code{CovControlSde}. } \section{Slots}{ \describe{ \item{\code{nsamp}}{a positive integer giving the number of resamples required} \item{\code{maxres}}{a positive integer specifying the maximum number of resamples to be performed including those that are discarded due to linearly dependent subsamples.} \item{\code{tune}}{a numeric value between 0 and 1 giving the fraction of the data to receive non-zero weight. Default is \code{tune = 0.95}.} \item{\code{prob}}{a numeric value between 0 and 1 specifying the probability of high breakdown point; used to compute \code{nsamp} when \code{nsamp} is omitted. Default is \code{prob = 0.99}.} \item{\code{eps}}{a numeric value between 0 and 0.5 specifying the breakdown point; used to compute \code{nsamp} when \code{nresamp} is omitted. Default is \code{eps = 0.5}.} \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlSde")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlSde", nsamp=2000) ctrl2 <- CovControlSde(nsamp=2000) data(hbk) CovSde(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/scorePlot.Rd0000644000176200001440000000244012763517421014431 0ustar liggesusers\name{scorePlot-methods} \docType{methods} \alias{scorePlot} \alias{scorePlot-methods} \alias{scorePlot,ANY-method} \alias{scorePlot,Pca-method} \title{ Score plot for Principal Components (objects of class 'Pca') } \description{ Produces a score plot from an object (derived from) \code{\link{Pca-class}}. } \usage{ \S4method{scorePlot}{Pca}(x, i=1, j=2, \dots) } \arguments{ \item{x}{an object of class (derived from) \code{"Pca"}.} \item{i}{First score coordinate, defaults to \code{i=1}.} \item{j}{Second score coordinate, defaults to \code{j=2}.} \item{\dots}{optional arguments to be passed to the internal graphical functions.} } \section{Side Effects}{ a plot is produced on the current graphics device. } \section{Methods}{ \describe{ \item{scorePlot}{\code{signature(x = Pca)}: Plot a scatter plot of ith against jth score of the Pca object with superimposed tollerance (0.975) ellipse. See also \code{\link{biplot}}, \code{\link{screeplot}}.} }} %\references{} \seealso{ \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaRobust-class}}. } \examples{ require(graphics) ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaHubert(hbk) pca scorePlot(pca) } \keyword{multivariate} \keyword{hplot} rrcov/man/rice.Rd0000644000176200001440000000250012763517421013376 0ustar liggesusers\name{rice} \alias{rice} \docType{data} \title{ Rice taste data} \description{ The rice taste data consists of five inputs and a single output whose values are associated with subjective evaluations as follows: xl: flavor, x2: appearance, x3: taste, x4: stickiness, x5: toughness, y: overall evaluation. Sensory test data have been obtained by such subjective evaluations for 105 kinds of rice (e.g., Sasanishiki, Akita-Komachi, etc.). The data set was used by Nozaki et al. (1997) to demonstrate the high performance of a proposed for automatically generating fuzzy if-then rules from numerical data. } \usage{data(rice)} \format{ A data frame with 105 observations on the following 6 variables: \describe{ \item{\code{Favor}}{compactness} \item{\code{Appearance}}{circularity} \item{\code{Taste}}{distance circularity} \item{\code{Stickiness}}{radius ratio} \item{\code{Toughness}}{principal axis aspect ratio} \item{\code{Overall_evaluation}}{maximum length aspect ratio} } } %%\details{} \source{ Nozaki, K., Ishibuchi, H, and Tanaka, H. (1997) A simple but powerful heuristic method for generating fuzzy rules from numerical data \emph{Fuzzy Sets and Systems} \bold{86} 3 p. 251--270. } %\references{} %\examples{} \keyword{datasets} rrcov/man/PcaClassic-class.Rd0000644000176200001440000000630214145003636015562 0ustar liggesusers\name{PcaClassic-class} \docType{class} \alias{PcaClassic-class} \alias{getQuan,PcaClassic-method} \title{Class "PcaClassic" - Principal Components Analysis } \description{ Contains the results of a classical Principal Components Analysis } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaClassic", ...)} but the usual way of creating \code{PcaClassic} objects is a call to the function \code{PcaClassic} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{Object of class \code{"language"} } \item{\code{center}:}{Object of class \code{"vector"} the center of the data } \item{\code{scale}:}{Object of class \code{"vector"} the scaling applied to each variable } \item{\code{rank}:}{Object of class \code{"numeric"} the rank of the data matrix } \item{\code{loadings}:}{Object of class \code{"matrix"} the matrix of variable loadings (i.e., a matrix whose columns contain the eigenvectors) } \item{\code{eigenvalues}:}{Object of class \code{"vector"} the eigenvalues } \item{\code{scores}:}{Object of class \code{"matrix"} the scores - the value of the projected on the space of the principal components data (the centred (and scaled if requested) data multiplied by the \code{loadings} matrix) is returned. Hence, \code{cov(scores)} is the diagonal matrix \code{diag(eigenvalues)} } \item{\code{k}:}{Object of class \code{"numeric"} number of (choosen) principal components } \item{\code{sd}:}{Object of class \code{"Uvector"} Score distances within the robust PCA subspace } \item{\code{od}:}{Object of class \code{"Uvector"} Orthogonal distances to the robust PCA subspace } \item{\code{cutoff.sd}:}{Object of class \code{"numeric"} Cutoff value for the score distances} \item{\code{cutoff.od}:}{Object of class \code{"numeric"} Cutoff values for the orthogonal distances } \item{\code{flag}:}{Object of class \code{"Uvector"} The observations whose score distance is larger than cutoff.sd or whose orthogonal distance is larger than cutoff.od can be considered as outliers and receive a flag equal to zero. The regular observations receive a flag 1 } \item{\code{n.obs}:}{Object of class \code{"numeric"} the number of observations } \item{\code{eig0}:}{Object of class \code{"vector"} all eigenvalues } \item{\code{totvar0}:}{Object of class \code{"numeric"} the total variance explained (\code{=sum(eig0)}) } } } \section{Extends}{ Class \code{"\linkS4class{Pca}"}, directly. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaClassic")}: returns the number of observations used in the computation, i.e. n.obs } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}} } \examples{ showClass("PcaClassic") } \keyword{robust} \keyword{multivariate} rrcov/man/wolves.Rd0000644000176200001440000000351714177776410014012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datadoc.R \docType{data} \name{wolves} \alias{wolves} \title{Skull dimensions of the wolf \emph{Canis lupus} L.} \format{ A data frame with 25 rows and 12 variables. The variables are as follows (all measurements are in milimeters): \itemize{ \item \code{class}: a factor presenting the combinations of \code{location} and \code{sex}. The levels are \code{arf} \code{arm} \code{rmf} and \code{rmm} \item \code{location}: a factor with levels \code{ar}=Arctic, \code{rm}=Rocky Mountain \item \code{sex}: a factor with levels \code{f}=female, \code{m}=male \item \code{x1}: palatal length \item \code{x2}: postpalatal length \item \code{x3}: zygomatic width \item \code{x4}: palatal width outside first upper molars \item \code{x5}: palatal width inside second upper molars \item \code{x6}: postglenoid foramina width \item \code{x7}: interorbital width \item \code{x8}: braincase width \item \code{x9}: crown length } } \source{ Jolicoeur, P. Multivariate geographical variation in the wolf \emph{Canis lupis L.}, \emph{Evolution}, XIII, 283--299. Morrison, D. F. \emph{Multivariate Statistical Methods}, (3rd ed.), 1990. New York: McGraw-Hill, p. 288--289. } \usage{ data(wolves) } \description{ A data set containing skull morphometric measurements on Rocky Mountain and Arctic wolves (\emph{Canis Lupus L.}). The tdata are published in Morrison (1990), originally from Jolicoeur (1959). } \examples{ data(wolves) ## Remove the factors location and sex which we will not use for now x <- wolves[,-c(2:3)] ## Plot a pairwise scaterplot matrix pairs(x[,2:10]) mcd <- CovMcd(x[, 2:10]) plot(mcd, which="pairs") lda <- LdaClassic(class~., data=x) lda@center lda@cov predict(lda) } \keyword{datasets} rrcov/man/CovMest.Rd0000644000176200001440000001207414145002357014034 0ustar liggesusers\name{CovMest} \alias{CovMest} \title{Constrained M-Estimates of Location and Scatter} \concept{High breakdown point} \usage{ CovMest(x, r = 0.45, arp = 0.05, eps=1e-3, maxiter=120, control, t0, S0, initcontrol) } \description{ Computes constrained M-Estimates of multivariate location and scatter based on the translated biweight function (\sQuote{t-biweight}) using a High breakdown point initial estimate as defined by Rocke (1996). The default initial estimate is the Minimum Volume Ellipsoid computed with \code{\link{CovMve}}. The raw (not reweighted) estimates are taken and the covariance matrix is standardized to determinant 1. } \arguments{ \item{x}{a matrix or data frame. } \item{r}{ required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is 0.45} \item{arp}{ asympthotic rejection point, i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{0.05}.} \item{eps}{ a numeric value specifying the relative precision of the solution of the M-estimate. Defaults to \code{1e-3}} \item{maxiter}{ maximum number of iterations allowed in the computation of the M-estimate. Defaults to 120} \item{control}{ a control object (S4) of class \code{\link{CovControlMest-class}} containing estimation options - same as these provided in the fucntion 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{t0}{ optional initial high breakdown point estimates of the location. If not supplied MVE will be used. } \item{S0}{ optional initial high breakdown point estimates of the scatter. If not supplied MVE will be used. } \item{initcontrol}{ optional control object - of class CovControl - specifing the initial high breakdown point estimates of location and scatter. If not supplied MVE will be used. } } \details{ Rocke (1996) has shown that the S-estimates of multivariate location and scatter in high dimensions can be sensitive to outliers even if the breakdown point is set to be near 0.5. To mitigate this problem he proposed to utilize the translated biweight (or t-biweight) method with a standardization step consisting of equating the median of \code{rho(d)} with the median under normality. This is then not an S-estimate, but is instead a constrained M-estimate. In order to make the smooth estimators to work, a reasonable starting point is necessary, which will lead reliably to a good solution of the estimator. In \code{CovMest} the MVE computed by \code{\link{CovMve}} is used, but the user has the possibility to give her own initial estimates. } \note{ The psi, rho and weight functions for the M estimation are encapsulated in a virtual S4 class \code{PsiFun} from which a \code{PsiBwt} class, implementing the translated biweight (t-biweight), is dervied. The base class \code{PsiFun} contains also the M-iteration itself. Although not documented and not accessibale directly by the user these classes will form the bases for adding other functions (biweight, LWS, etc.) as well as S-estimates. } \author{Valentin Todorov \email{valentin.todorov@chello.at}, (some code from C. Becker - http://www.sfb475.uni-dortmund.de/dienst/de/content/struk-d/bereicha-d/tpa1softw-d.html) } \value{ An object of class \code{\link{CovMest-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ D.L.Woodruff and D.M.Rocke (1994) Computable robust estimation of multivariate location and shape on high dimension using compound estimators, \emph{Journal of the American Statistical Association}, \bold{89}, 888--896. D.M.Rocke (1996) Robustness properties of S-estimates of multivariate location and shape in high dimension, \emph{Annals of Statistics}, \bold{24}, 1327-1345. D.M.Rocke and D.L.Woodruff (1996) Identification of outliers in multivariate data \emph{Journal of the American Statistical Association}, \bold{91}, 1047--1061. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \seealso{ \code{\link[robustbase]{covMcd}}, \code{\link{Cov-class}}, \code{\link{CovMve}}, \code{\link{CovRobust-class}}, \code{\link{CovMest-class}} } \examples{ library(rrcov) data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovMest(hbk.x) ## the following four statements are equivalent c0 <- CovMest(hbk.x) c1 <- CovMest(hbk.x, r = 0.45) c2 <- CovMest(hbk.x, control = CovControlMest(r = 0.45)) c3 <- CovMest(hbk.x, control = new("CovControlMest", r = 0.45)) ## direct specification overrides control one: c4 <- CovMest(hbk.x, r = 0.40, control = CovControlMest(r = 0.25)) c1 summary(c1) plot(c1) } \keyword{robust} \keyword{multivariate} rrcov/man/octane.Rd0000644000176200001440000000251713372336267013741 0ustar liggesusers\name{octane} \alias{octane} \docType{data} \title{ Octane data } \description{ The octane data contains near infrared absorbance spectra (NIR) of \code{n=39} gasoline samples over \code{p=226} wavelengths ranging from 1102 nm to 1552 nm with measurements every two nanometers. For each of the 39 production gasoline samples the octane number was measured. Six of the samples (25, 26, and 36-39) contain added alcohol. } \usage{data(octane)} \format{ A data frame with 39 observations and 226 columns, the wavelengts are by column. } %\details{} \source{ K.H. Esbensen, S. Schoenkopf and T. Midtgaard \emph{Multivariate Analysis in Practice}, Trondheim, Norway: Camo, 1994. } \references{ M. Hubert, P. J. Rousseeuw, K. Vanden Branden (2005), ROBPCA: a new approach to robust principal components analysis, \emph{Technometrics}, \bold{47}, 64--79. P. J. Rousseeuw, M. Debruyne, S. Engelen and M. Hubert (2006), Robustness and Outlier Detection in Chemometrics, \emph{Critical Reviews in Analytical Chemistry}, \bold{36}(3--4), 221--242. } \examples{ data(octane) pca=PcaHubert(octane, k=10) screeplot(pca, type="lines") pca2 <- PcaHubert(octane, k=2) plot(pca2, id.n.sd=6) pca7 <- PcaHubert(octane, k=7) plot(pca7, id.n.sd=6) } \keyword{datasets} rrcov/man/CovControlMve-class.Rd0000644000176200001440000000471414145002064016314 0ustar liggesusers\name{CovControlMve-class} \docType{class} \alias{CovControlMve-class} \alias{restimate,CovControlMve-method} \title{Class 'CovControlMve' - contains control parameters for CovMve } \description{ This class extends the \code{CovControl} class and contains the control parameters for \code{"CovMve"} } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlMve", ...)} or by calling the constructor-function \code{CovControlMve}. } \section{Slots}{ \describe{ \item{\code{alpha}:}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{\code{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{\code{seed}:}{starting value for random generator. Default is \code{seed = NULL}} \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlMve")}: the generic function \code{restimate} allowes the different methods for robust estimation to be used polymorphically - this function will call \code{CovMve} passing it the control object and will return the obtained \code{CovRobust} object} }} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMve", alpha=0.75) ctrl2 <- CovControlMve(alpha=0.75) data(hbk) CovMve(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovMest-class.Rd0000644000176200001440000000360014145002422015123 0ustar liggesusers\name{CovMest-class} \Rdversion{1.1} \docType{class} \alias{CovMest-class} \title{Constrained M-estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class "CovRobust" accomodates constrained M-Estimates of multivariate location and scatter based on the translated biweight function (\sQuote{t-biweight}) using a High breakdown point initial estimate (Minimum Covariance Determinant - \sQuote{Fast MCD})} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovMest", ...)}, but the usual way of creating \code{CovMest} objects is a call to the function \code{CovMest} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{vt}:}{Object of class \code{"vector"} - vector of weights (v)} \item{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovMest" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{CovMest}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovMest") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovOgk-class.Rd0000644000176200001440000000437214145002777014757 0ustar liggesusers\name{CovOgk-class} \Rdversion{1.1} \docType{class} \alias{CovOgk-class} \title{ OGK Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates OGK Estimates of multivariate location and scatter computed by the algorithm proposed by Marona and Zamar (2002). } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovOgk", ...)}, but the usual way of creating \code{CovOgk} objects is a call to the function \code{CovOgk} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{raw.cov}:}{Object of class \code{"matrix"} the raw (not reweighted) estimate of covariance matrix } \item{\code{raw.center}:}{Object of class \code{"vector"} - the raw (not reweighted) estimate of the location vector} \item{\code{raw.mah}:}{Object of class \code{"Uvector"} - mahalanobis distances of the observations based on the raw estimate of the location and scatter } \item{\code{raw.wt}:}{Object of class \code{"Uvector"} - weights of the observations based on the raw estimate of the location and scatter } \item{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovOgk" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMcd-class}}, \code{\link{CovMest-class}} } \examples{ showClass("CovOgk") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/SummaryCov-class.Rd0000644000176200001440000000332514145004131015653 0ustar liggesusers\name{SummaryCov-class} \docType{class} \alias{SummaryCov-class} \alias{getCenter,SummaryCov-method} \alias{getCov,SummaryCov-method} \alias{getDistance,SummaryCov-method} \alias{getEvals,SummaryCov-method} \alias{isClassic,SummaryCov-method} \alias{show,SummaryCov-method} \title{Class "SummaryCov" - summary of "Cov" objects } \description{The "Cov" object plus some additional summary information} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SummaryCov", ...)}, but most often by invoking 'summary' on a "Cov" object. They contain values meant for printing by 'show'. } \section{Slots}{ \describe{ \item{\code{covobj}:}{Object of class \code{"Cov"}} \item{\code{evals}:}{eigenvalues of the covariance or correlation matrix } } } \section{Methods}{ \describe{ \item{getCenter}{\code{signature(obj = "SummaryCov")}: location vector } \item{getCov}{\code{signature(obj = "SummaryCov")}: covariance matrix } \item{getDistance}{\code{signature(obj = "SummaryCov")}: vector of distances } \item{getEvals}{\code{signature(obj = "SummaryCov")}: vector of eignevalues } \item{isClassic}{\code{signature(obj = "SummaryCov")}: is the estimate a classic one } \item{show}{\code{signature(object = "SummaryCov")}: display the object } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Cov-class}} } \examples{ showClass("SummaryCov") } \keyword{classes} rrcov/man/getLoadings-methods.Rd0000644000176200001440000000177413365401474016370 0ustar liggesusers\name{getLoadings-methods} \docType{methods} \alias{getLoadings-methods} \alias{getLoadings} \alias{getEigenvalues,methods} \alias{getEigenvalues} \alias{getPrcomp,methods} \alias{getPrcomp} \alias{getScores,methods} \alias{getScores} \alias{getSdev,methods} \alias{getSdev} \alias{getQuan,methods} \alias{getQuan} \alias{getScale,methods} \alias{getScale} \alias{names,Pca-method} \alias{$,Pca-method} \title{ Accessor methods to the essential slots of Pca and its subclasses} \description{ Accessor methods to the slots of objects of class \code{Pca} and its subclasses } \arguments{ \item{obj}{an object of class \code{"Pca"} or of a class derived from \code{"Pca"} } } \section{Methods}{ \describe{ \item{obj = "Pca"}{Accessors for object of class \code{Pca}} \item{obj = "PcaRobust"}{Accessors for object of class \code{PcaRobust}} \item{obj = "PcaClassic"}{Accessors for object of class \code{PcaClassic}} }} \keyword{methods} \keyword{multivariate} \keyword{robust} rrcov/man/biplot.Rd0000644000176200001440000000330712763517421013753 0ustar liggesusers\name{biplot-methods} \docType{methods} \alias{biplot} \alias{biplot-methods} \alias{biplot,ANY-method} \alias{biplot,Pca-method} \title{ Biplot for Principal Components (objects of class 'Pca') } \description{ Produces a biplot from an object (derived from) \code{\link{Pca-class}}. } \usage{ \S4method{biplot}{Pca}(x, choices=1L:2L, scale=1, \dots) } \arguments{ \item{x}{an object of class (derived from) \code{"Pca"}.} \item{choices}{length 2 vector specifying the components to plot. Only the default is a biplot in the strict sense.} \item{scale}{ The variables are scaled by \code{lambda ^ scale} and the observations are scaled by \code{lambda ^ (1-scale)} where \code{lambda} are the singular values as computed by the Principal Components function. Normally \code{0 <= scale <= 1}, and a warning will be issued if the specified \code{scale} is outside this range. } \item{\dots}{optional arguments to be passed to the internal graphical functions.} } \section{Side Effects}{ a plot is produced on the current graphics device. } \section{Methods}{ \describe{ \item{biplot}{\code{signature(x = Pca)}: Plot a biplot, i.e. represent both the observations and variables of a matrix of multivariate data on the same plot. See also \code{\link{biplot.princomp}}.} }} \references{ Gabriel, K. R. (1971). The biplot graphical display of matrices with applications to principal component analysis. \emph{Biometrika}, \bold{58}, 453--467. } \seealso{ \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaRobust-class}}. } \examples{ require(graphics) biplot(PcaClassic(USArrests, k=2)) } \keyword{multivariate} \keyword{hplot} rrcov/man/PcaHubert.Rd0000644000176200001440000002174514145755265014353 0ustar liggesusers\name{PcaHubert} \alias{PcaHubert} \alias{PcaHubert.formula} \alias{PcaHubert.default} \title{ ROBPCA - ROBust method for Principal Components Analysis } \description{ The ROBPCA algorithm was proposed by Hubert et al (2005) and stays for 'ROBust method for Principal Components Analysis'. It is resistant to outliers in the data. The robust loadings are computed using projection-pursuit techniques and the MCD method. Therefore ROBPCA can be applied to both low and high-dimensional data sets. In low dimensions, the MCD method is applied. } \usage{ PcaHubert(x, ...) \method{PcaHubert}{default}(x, k = 0, kmax = 10, alpha = 0.75, mcd = TRUE, skew=FALSE, maxdir=250, scale = FALSE, signflip = TRUE, crit.pca.distances = 0.975, trace=FALSE, \dots) \method{PcaHubert}{formula}(formula, data = NULL, subset, na.action, \dots) } \arguments{ \item{formula}{a formula with no response variable, referring only to numeric variables.} \item{data}{an optional data frame (or similar: see \code{\link{model.frame}}) containing the variables in the formula \code{formula}.} \item{subset}{an optional vector used to select rows (observations) of the data matrix \code{x}.} \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 default is \code{\link{na.omit}}.} \item{\dots}{arguments passed to or from other methods.} \item{x}{a numeric matrix (or data frame) which provides the data for the principal components analysis.} \item{k}{number of principal components to compute. If \code{k} is missing, or \code{k = 0}, the algorithm itself will determine the number of components by finding such \code{k} that \eqn{l_k/l_1 >= 10.E-3} and \eqn{\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j >= 0.8}. It is preferable to investigate the scree plot in order to choose the number of components and then run again. Default is \code{k=0}. } \item{kmax}{maximal number of principal components to compute. Default is \code{kmax=10}. If \code{k} is provided, \code{kmax} does not need to be specified, unless \code{k} is larger than 10.} \item{alpha}{this parameter measures the fraction of outliers the algorithm should resist. In MCD alpha controls the size of the subsets over which the determinant is minimized, i.e. alpha*n observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.75. } \item{mcd}{Logical - when the number of variables is sufficiently small, the loadings are computed as the eigenvectors of the MCD covariance matrix, hence the function \code{\link{CovMcd}()} is automatically called. The number of principal components is then taken as k = rank(x). Default is \code{mcd=TRUE}. If \code{mcd=FALSE}, the ROBPCA algorithm is always applied.} \item{skew}{Logical - whether the adjusted outlyingness algorithm for skewed data (Hubert et al., 2009) will be used, default is \code{skew=FALSE}.} \item{maxdir}{maximal number of random directions to use for computing the outlyingness (or the adjusted outlyingness when \code{skew=TRUE}) of the data points, see \code{\link[robustbase]{adjOutlyingness}} for more details.. Default is \code{maxdir=250}. If the number \code{n} of observations is small all possible \code{n*(n-1)/2} pairs of observations are taken to generate the directions.} \item{scale}{a value indicating whether and how the variables should be scaled. If \code{scale=FALSE} (default) or \code{scale=NULL} no scaling is performed (a vector of 1s is returned in the scale slot). If \code{scale=TRUE} the data are scaled to have unit variance. Alternatively it can be a function like \code{sd} or \code{mad} or a vector of length equal the number of columns of \code{x}. The value is passed to the underlying function and the result returned is stored in the scale slot. Default is \code{scale=FALSE}.} \item{signflip}{a logical value indicating wheather to try to solve the sign indeterminancy of the loadings - ad hoc approach setting the maximum element in a singular vector to be positive. Default is \code{signflip = TRUE}} \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \details{ \code{PcaHubert}, serving as a constructor for objects of class \code{\link{PcaHubert-class}} is a generic function with "formula" and "default" methods. The calculation is done using the ROBPCA method of Hubert et al (2005) which can be described briefly as follows. For details see the relevant references. Let \code{n} denote the number of observations, and \code{p} the number of original variables in the input data matrix \code{X}. The ROBPCA algorithm finds a robust center \code{M (p x 1)} of the data and a loading matrix \code{P} which is \code{(p x k)} dimensional. Its columns are orthogonal and define a new coordinate system. The scores T, an \code{(n x k)} matrix, are the coordinates of the centered observations with respect to the loadings: \deqn{T=(X-M)P} The ROBPCA algorithm also yields a robust covariance matrix (often singular) which can be computed as \deqn{S=PLP^t} where \eqn{L} is the diagonal matrix with the eigenvalues \eqn{l_1, \dots, \l_k}. This is done in the following three main steps: \bold{Step 1:} The data are preprocessed by reducing their data space to the subspace spanned by the \code{n} observations. This is done by singular value decomposition of the input data matrix. As a result the data are represented using at most \code{n-1=rank(X)} without loss of information. \bold{Step 2:} In this step for each data point a measure of outlyingness is computed. For this purpose the high-dimensional data points are projected on many univariate directions, each time the univariate MCD estimator of location and scale is computed and the standardized distance to the center is measured. The largest of these distances (over all considered directions) is the outlyingness measure of the data point. The \code{h} data points with smallest outlyingness measure are used to compute the covariance matrix \eqn{\Sigma_h} and to select the number \code{k} of principal components to retain. This is done by finding such \code{k} that \eqn{l_k/l_1 >= 10.E-3} and \eqn{\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j >= 0.8} Alternatively the number of principal components \code{k} can be specified by the user after inspecting the scree plot. \bold{Step 3:} The data points are projected on the k-dimensional subspace spanned by the \code{k} eigenvectors corresponding to the largest \code{k} eigenvalues of the matrix \eqn{\Sigma_h}. The location and scatter of the projected data are computed using the reweighted MCD estimator and the eigenvectors of this scatter matrix yield the robust principal components. } \value{ An S4 object of class \code{\link{PcaHubert-class}} which is a subclass of the virtual class \code{\link{PcaRobust-class}}. } \references{ M. Hubert, P. J. Rousseeuw, K. Vanden Branden (2005), ROBPCA: a new approach to robust principal components analysis, \emph{Technometrics}, \bold{47}, 64--79. M. Hubert, P. J. Rousseeuw and T. Verdonck (2009), Robust PCA for skewed data and its outlier map, \emph{Computational Statistics & Data Analysis}, \bold{53}, 2264--2274. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \note{ The ROBPCA algorithm is implemented on the bases of the Matlab implementation, available as part of \emph{LIBRA, a Matlab Library for Robust Analysis} to be found at www.wis.kuleuven.ac.be/stat/robust.html } \examples{ ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaHubert(hbk) pca ## Compare with the classical PCA prcomp(hbk) ## or PcaClassic(hbk) ## If you want to print the scores too, use print(pca, print.x=TRUE) ## Using the formula interface PcaHubert(~., data=hbk) ## To plot the results: plot(pca) # distance plot pca2 <- PcaHubert(hbk, k=2) plot(pca2) # PCA diagnostic plot (or outlier map) ## Use the standard plots available for prcomp and princomp screeplot(pca) biplot(pca) ## Restore the covraiance matrix py <- PcaHubert(hbk) cov.1 <- py@loadings \%*\% diag(py@eigenvalues) \%*\% t(py@loadings) cov.1 } \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMrcd.Rd0000644000176200001440000000440714145001752015351 0ustar liggesusers\name{CovControlMrcd} \alias{CovControlMrcd} % \title{ Constructor function for objects of class "CovControlMrcd"} \description{ This function will create a control object \code{CovControlMrcd} containing the control parameters for \code{CovMrcd} } \usage{ CovControlMrcd(alpha = 0.5, h=NULL, maxcsteps=200, rho=NULL, target=c("identity", "equicorrelation"), maxcond=50, trace= FALSE) } \arguments{ \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{h}{the size of the subset (can be between ceiling(n/2) and n). Normally NULL and then it \code{h} will be calculated as \code{h=ceiling(alpha*n)}. If \code{h} is provided, \code{alpha} will be calculated as \code{alpha=h/n}.} \item{maxcsteps}{maximal number of concentration steps in the deterministic MCD; should not be reached.} \item{rho}{regularization parameter. Normally NULL and will be estimated from the data.} \item{target}{structure of the robust positive definite target matrix: a) "identity": target matrix is diagonal matrix with robustly estimated univariate scales on the diagonal or b) "equicorrelation": non-diagonal target matrix that incorporates an equicorrelation structure (see (17) in paper). Default is \code{target="identity"}} \item{maxcond}{maximum condition number allowed (see step 3.4 in algorithm 1). Default is \code{maxcond=50}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } %\details{} \value{ A \code{CovControlMrcd} object } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMrcd", alpha=0.75) ctrl2 <- CovControlMrcd(alpha=0.75) data(hbk) CovMrcd(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovControlSest-class.Rd0000644000176200001440000000555414145002270016505 0ustar liggesusers\name{CovControlSest-class} \Rdversion{1.1} \docType{class} \alias{CovControlSest-class} \alias{restimate,CovControlSest-method} \title{Class 'CovControlSest' - contains control parameters for "CovSest"} \description{ This class extends the \code{CovControl} class and contains the control parameters for CovSest } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlSest", ...)} or by calling the constructor-function \code{CovControlSest}. } \section{Slots}{ \describe{ \item{bdp}{a numeric value specifying the required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is \code{bdp=0.45}. } \item{arp}{a numeric value specifying the asympthotic rejection point (for the Rocke type S estimates), i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{arp=0.1}. } \item{eps}{a numeric value specifying the relative precision of the solution of the S-estimate (bisquare and Rocke type). Default is to \code{eps=1e-5}. } \item{maxiter}{maximum number of iterations allowed in the computation of the S-estimate (bisquare and Rocke type). Default is \code{maxiter=120}. } \item{nsamp}{the number of random subsets considered. Default is \code{nsamp = 500}.} \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{method}{Which algorithm to use: 'sfast'=FAST-S, 'surreal'=Ruppert's SURREAL algorithm, 'bisquare'=Bisquare S-estimation with HBDP start or 'rocke' for Rocke type S-estimates} \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlSest")}: the generic function \code{restimate} allowes the different methods for robust estimation to be used polymorphically - this function will call \code{CovSest} passing it the control object and will return the obtained \code{CovRobust} object} } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlSest", bdp=0.4) ctrl2 <- CovControlSest(bdp=0.4) data(hbk) CovSest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/SummaryPca-class.Rd0000644000176200001440000000227014145004156015634 0ustar liggesusers\name{SummaryPca-class} \docType{class} \alias{SummaryPca-class} \alias{show,SummaryPca-method} \title{Class "SummaryPca" - summary of "Pca" objects } \description{The "Pca" object plus some additional summary information} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SummaryPca", ...)}, but most often by invoking 'summary' on a "Pca" object. They contain values meant for printing by 'show'. } \section{Slots}{ \describe{ \item{\code{pcaobj}:}{Object of class \code{"Pca"}} \item{\code{importance}:}{matrix with additional information: importance of components } } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "SummaryPca")}: display the object } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Pca-class}} } \examples{ showClass("SummaryPca") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/QdaCov.Rd0000644000176200001440000000350014145004125013616 0ustar liggesusers\name{QdaCov} \alias{QdaCov} \alias{QdaCov.formula} \alias{QdaCov.default} \title{ Robust Quadratic Discriminant Analysis } \description{ Performs robust quadratic discriminant analysis and returns the results as an object of class \code{QdaCov} (aka constructor). } \usage{ QdaCov(x, ...) \method{QdaCov}{default}(x, grouping, prior = proportions, tol = 1.0e-4, method = CovControlMcd(), ...) } \arguments{ \item{x}{a matrix or data frame containing the explanatory variables (training set). } \item{grouping}{grouping variable: a factor specifying the class for each observation.} \item{prior}{prior probabilities, default to the class proportions for the training set.} \item{tol}{tolerance} \item{method}{method} \item{\dots}{arguments passed to or from other methods} } \details{ details } \value{ Returns an S4 object of class \code{QdaCov} } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \section{Warning }{Still an experimental version!} \seealso{ \code{\link[rrcov]{CovMcd}} } \examples{ ## Example anorexia library(MASS) data(anorexia) ## start with the classical estimates qda <- QdaClassic(Treat~., data=anorexia) predict(qda)@classification ## try now the robust LDA with the default method (MCD with pooled whitin cov matrix) rqda <- QdaCov(Treat~., data= anorexia) predict(rqda)@classification ## try the other methods QdaCov(Treat~., data= anorexia, method="sde") QdaCov(Treat~., data= anorexia, method="M") QdaCov(Treat~., data= anorexia, method=CovControlOgk()) } \keyword{robust} \keyword{multivariate} rrcov/man/Lda-class.Rd0000644000176200001440000000560614145003322014253 0ustar liggesusers\name{Lda-class} \docType{class} \alias{Lda-class} \alias{predict,Lda-method} \alias{show,Lda-method} \alias{summary,Lda-method} \title{Class "Lda" - virtual base class for all classic and robust LDA classes } \description{ The class \code{Lda} serves as a base class for deriving all other classes representing the results of classical and robust Linear Discriminant Analisys methods } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{the (matched) function call.} \item{\code{prior}:}{prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the common covariance matrix} \item{\code{ldf}:}{a matrix containing the linear discriminant functions} \item{\code{ldfconst}:}{a vector containing the constants of each linear discriminant function} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{covobj}:}{object of class \code{"Cov"} containing the estimate of the common covariance matrix of the centered data. It is not NULL only in case of method "B".} \item{\code{control}:}{object of class \code{"CovControl"} specifying which estimate and with what estimation options to use for the group means and common covariance (or \code{NULL} for classical linear discriminant analysis)} } } \section{Methods}{ \describe{ \item{predict}{\code{signature(object = "Lda")}: calculates prediction using the results in \code{object}. An optional data frame or matrix in which to look for variables with which to predict. If omitted, the training data set is used. If the original fit used a formula or a data frame or a matrix with column names, newdata must contain columns with the same names. Otherwise it must contain the same number of columns, to be used in the same order. } \item{show}{\code{signature(object = "Lda")}: prints the results } \item{summary}{\code{signature(object = "Lda")}: prints summary information } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{LdaClassic}}, \code{\link{LdaClassic-class}}, \code{\link{LdaRobust-class}} } \examples{ showClass("Lda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/un86.Rd0000644000176200001440000000236512763517421013265 0ustar liggesusers\name{un86} \alias{un86} \docType{data} \title{ United Nations Data - 1986} \description{ This data set consists of seven socioeconomic variables observed for 73 countries. } \usage{data(un86)} \format{ A data frame with 73 observations on the following 7 variables. \describe{ \item{\code{POP}}{Total population in milions} \item{\code{MOR}}{Number of infant deaths per thousand births} \item{\code{CAR}}{Number of motorized vehicles per hundred inhabitants} \item{\code{DR}}{Number of medical doctors per thousand inhabitants} \item{\code{GNP}}{Gross national product per inhabitant in thousands of US dollars} \item{\code{DEN}}{Density in inhabitants per square kilometer} \item{\code{TB}}{Trade balance, defined as total exports/(total exports + total imports)} } } \details{ The data set is from World Statistics in Brief, Number 10, a 1986 UN publication. It was used in Daigle et al. (1992) to illustrate a robust biplot method. } \source{ World Statistics in Brief, Number 10, a 1986 United Nations publication Daigle, G. and Rivest, L. (1992) A robust biplot, The canadian Journal of Statistics, 20, pp 241--255 } \examples{ data(un86) pairs(un86) } \keyword{datasets} rrcov/man/QdaRobust-class.Rd0000644000176200001440000000362514145004127015462 0ustar liggesusers\name{QdaRobust-class} \docType{class} \alias{QdaRobust-class} \title{Class "QdaRobust" is a virtual base class for all robust QDA classes } \description{ The class \code{QdaRobust} searves as a base class for deriving all other classes representing the results of robust Quadratic Discriminant Analysis methods} \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the group covariance matrices} \item{\code{covinv}:}{the inverse of the group covariance matrices} \item{\code{covdet}:}{the determinants of the group covariance matrices} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{control}:}{Object of class \code{"CovControl"} specifying which estimate to use for the group means and covariances } } } \section{Extends}{ Class \code{"\linkS4class{Qda}"}, directly. } \section{Methods}{ No methods defined with class "QdaRobust" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{Qda-class}}, \code{\link{QdaClassic-class}}, } \examples{ showClass("QdaRobust") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/lmom32.Rd0000644000176200001440000000405013710111174013553 0ustar liggesusers\name{lmom32} \alias{lmom32} \docType{data} \title{ Hosking and Wallis Data Set, Table 3.2} \description{ The data on annual maximum streamflow at 18 sites with smallest drainage area basin in southeastern USA contains the sample L-moments ratios (L-CV, L-skewness and L-kurtosis) as used by Hosking and Wallis (1997) to illustrate the discordancy measure in regional freqency analysis (RFA). } \usage{data(lmom32)} \format{ A data frame with 18 observations on the following 3 variables. \describe{ \item{\code{L-CV}}{L-coefficient of variation} \item{\code{L-skewness}}{L-coefficient of skewness} \item{\code{L-kurtosis}}{L-coefficient of kurtosis} } } \details{ The sample L-moment ratios (L-CV, L-skewness and L-kurtosis) of a site are regarded as a point in three dimensional space. } \source{ Hosking, J. R. M. and J. R. Wallis (1997), \emph{Regional Frequency Analysis: An Approach Based on L-moments.} Cambridge University Press, p.49, Table 3.2 } \references{ Neykov, N.M., Neytchev, P.N., Van Gelder, P.H.A.J.M. and Todorov V. (2007), Robust detection of discordant sites in regional frequency analysis, \emph{Water Resources Research}, 43, W06417, doi:10.1029/2006WR005322 } \examples{ data(lmom32) # plot a matrix of scatterplots pairs(lmom32, main="Hosking and Wallis Data Set, Table 3.3", pch=21, bg=c("red", "green3", "blue")) mcd<-CovMcd(lmom32) mcd plot(mcd, which="dist", class=TRUE) plot(mcd, which="dd", class=TRUE) ## identify the discordant sites using robust distances and compare ## to the classical ones mcd <- CovMcd(lmom32) rd <- sqrt(getDistance(mcd)) ccov <- CovClassic(lmom32) cd <- sqrt(getDistance(ccov)) r.out <- which(rd > sqrt(qchisq(0.975,3))) c.out <- which(cd > sqrt(qchisq(0.975,3))) cat("Robust: ", length(r.out), " outliers: ", r.out,"\n") cat("Classical: ", length(c.out), " outliers: ", c.out,"\n") } \keyword{datasets} rrcov/man/pca.scoreplot.Rd0000644000176200001440000000233014200555400015214 0ustar liggesusers\name{pca.scoreplot} \alias{pca.scoreplot} \title{ Score plot for Principal Components (objects of class 'Pca') } \description{ Produces a score plot from an object (derived from) \code{\link{Pca-class}}. } \usage{ pca.scoreplot(obj, i=1, j=2, main, id.n, \dots) } \arguments{ \item{obj}{an object of class (derived from) \code{"Pca"}.} \item{i}{First score coordinate, defaults to \code{i=1}.} \item{j}{Second score coordinate, defaults to \code{j=2}.} \item{main}{The main title of the plot.} \item{id.n}{Number of observations to identify by a label. If missing and the total number of observations is less or equal to 10, all observations will be labelled.} \item{\dots}{Optional arguments to be passed to the internal graphical functions.} } %\details{} %\value{} %\references{} %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} \seealso{ \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaRobust-class}}. } \examples{ require(graphics) ## PCA of the Hawkins Bradu Kass's Artificial Data ## using all 4 variables data(hbk) pca <- PcaHubert(hbk) pca pca.scoreplot(pca) } \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMMest.Rd0000644000176200001440000000342714145001534015510 0ustar liggesusers\name{CovControlMMest} \alias{CovControlMMest} \title{ Constructor function for objects of class "CovControlMMest" } \concept{High breakdown point} \description{ This function will create a control object \code{CovControlMMest} containing the control parameters for \code{CovMMest} } \usage{ CovControlMMest(bdp = 0.5, eff=0.95, maxiter = 50, sest=CovControlSest(), trace = FALSE, tolSolve = 1e-7) } \arguments{ \item{bdp}{ a numeric value specifying the required breakdown point. Allowed values are between 0.5 and 1 and the default is 0.5 } \item{eff}{a numeric value specifying the required efficiency for the MM estimates. Default is \code{eff=0.95}. } \item{sest}{an \code{CovControlSest} object containing control parameters for the initial S-estimate. } \item{maxiter}{maximum number of iterations allowed in the computation of the MM-estimate. Defaults to 150. } \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{tolSolve}{numeric tolerance to be used as a convergence tolerance for the MM-iteration. } } %\details{} \value{ A \code{CovControlSest} object. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMMest", bdp=0.25) ctrl2 <- CovControlMMest(bdp=0.25) data(hbk) CovMMest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/maryo.Rd0000644000176200001440000000364412763517421013615 0ustar liggesusers\name{maryo} \alias{maryo} \docType{data} \title{ Marona and Yohai Artificial Data} \description{ Simple artificial data set generated according the example by Marona and Yohai (1998). The data set consists of 20 bivariate normal observations generated with zero means, unit variances and correlation 0.8. The sample correlation is 0.81. Two outliers are introduced (i.e. these are 10\% of the data) in the following way: two points are modified by interchanging the largest (observation 19) and smallest (observation 9) value of the first coordinate. The sample correlation becomes 0.05. This example provides a good example of the fact that a multivariate outlier need not be an outlier in any of its coordinate variables. } \usage{data(maryo)} \format{ A data frame with 20 observations on 2 variables. To introduce the outliers x[9,1] with x[19,1] are interchanged. % \describe{ % \item{V1}{x[1]} % \item{V2}{x[2]} % } } %\details{} \source{ R. A. Marona and V. J. Yohai (1998) Robust estimation of multivariate location and scatter. In \emph{Encyclopedia of Statistical Sciences, Updated Volume 2} (Eds. S.Kotz, C.Read and D.Banks). Wiley, New York p. 590 } %\references{} \examples{ data(maryo) getCorr(CovClassic(maryo)) ## the sample correlation is 0.81 ## Modify 10%% of the data in the following way: ## modify two points (out of 20) by interchanging the ## largest and smallest value of the first coordinate imin <- which(maryo[,1]==min(maryo[,1])) # imin = 9 imax <- which(maryo[,1]==max(maryo[,1])) # imax = 19 maryo1 <- maryo maryo1[imin,1] <- maryo[imax,1] maryo1[imax,1] <- maryo[imin,1] ## The sample correlation becomes 0.05 plot(maryo1) getCorr(CovClassic(maryo1)) ## the sample correlation becomes 0.05 getCorr(CovMcd(maryo1)) ## the (reweighted) MCD correlation is 0.79 } \keyword{datasets} rrcov/man/estimate-methods.Rd0000644000176200001440000000242012763517421015731 0ustar liggesusers\name{restimate-methods} \docType{methods} \alias{restimate} \alias{restimate-methods} \alias{restimate,CovControlMest-method} \title{ Methods for Function estimate in Package 'rrcov'} \description{ Each concrete control class, like \code{CovControlMest}, \code{CovControlOgk}, etc., should implement an \code{restimate} method which will call the correponding (constructor)-function and will return the obtained S4 class, derived from \code{CovRobust}. } \usage{ \S4method{restimate}{CovControlMest}(obj, x, ...) } \arguments{ \item{obj}{an object of class \code{"CovControlEstimate"}} \item{x}{ Data frame or matrix containing the data }. \item{... }{ other parameters to be passed through to the estimation function. } } \section{Methods}{ \describe{ \item{obj = "CovControlMcd"}{ Compute the MCD estimates of multivariate location and scatter by calling\code{CovMcd} } \item{obj = "CovControlMest"}{ Compute the constrained M-estimates of multivariate location and scatter by calling\code{CovMest} } \item{obj = "CovControlOgk"}{ Compute the Ortogonalized Gnanadesikan-Kettenring (OGK) estimates of multivariate location and scatter by calling\code{CovOgk} } }} \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/PcaHubert-class.Rd0000644000176200001440000000471614145003657015444 0ustar liggesusers\name{PcaHubert-class} \Rdversion{1.1} \docType{class} \alias{PcaHubert-class} \alias{getQuan,PcaHubert-method} \title{Class "PcaHubert" - ROBust method for Principal Components Analysis } \description{ The ROBPCA algorithm was proposed by Hubert et al (2005) and stays for 'ROBust method for Principal Components Analysis'. It is resistant to outliers in the data. The robust loadings are computed using projection-pursuit techniques and the MCD method. Therefore ROBPCA can be applied to both low and high-dimensional data sets. In low dimensions, the MCD method is applied.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaHubert", ...)} but the usual way of creating \code{PcaHubert} objects is a call to the function \code{PcaHubert} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{alpha}:}{Object of class \code{"numeric"} the fraction of outliers the algorithm should resist - this is the argument alpha} \item{\code{quan}:}{The quantile \code{h} used throughout the algorithm } \item{\code{skew}:}{Whether the adjusted outlyingness algorithm for skewed data was used} \item{\code{ao}:}{Object of class \code{"Uvector"} Adjusted outlyingness within the robust PCA subspace } \item{\code{call}, \code{center}, \code{scale}, \code{rank}, \code{loadings}, \code{eigenvalues}, \code{scores}, \code{k}, \code{sd}, \code{od}, \code{cutoff.sd}, \code{cutoff.od}, \code{flag}, \code{n.obs}, \code{eig0}, \code{totvar0}:}{ from the \code{"\linkS4class{Pca}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{PcaRobust}"}, directly. Class \code{"\linkS4class{Pca}"}, by class "PcaRobust", distance 2. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaHubert")}: Returns the quantile used throughout the algorithm } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaClassic-class}} } \examples{ showClass("PcaHubert") } \keyword{robust} \keyword{multivariate} rrcov/man/PcaCov-class.Rd0000644000176200001440000000356714145003645014742 0ustar liggesusers\name{PcaCov-class} \Rdversion{1.1} \docType{class} \alias{PcaCov-class} \alias{getQuan,PcaCov-method} \title{Class "PcaCov" - Robust PCA based on a robust covariance matrix } \description{ Robust PCA are obtained by replacing the classical covariance matrix by a robust covariance estimator. This can be one of the available in \code{rrcov} estimators, i.e. MCD, OGK, M, S or Stahel-Donoho estimator. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaCov", ...)} but the usual way of creating \code{PcaCov} objects is a call to the function \code{PcaCov} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{quan}:}{Object of class \code{"numeric"} The quantile \code{h} used throughout the algorithm } \item{\code{call}, \code{center}, \code{rank}, \code{loadings}, \code{eigenvalues}, \code{scores}, \code{k}, \code{sd}, \code{od}, \code{cutoff.sd}, \code{cutoff.od}, \code{flag}, \code{n.obs}, \code{eig0}, \code{totvar0}:}{ from the \code{"\linkS4class{Pca}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{PcaRobust}"}, directly. Class \code{"\linkS4class{Pca}"}, by class "PcaRobust", distance 2. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaCov")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaClassic-class}} } \examples{ showClass("PcaCov") } \keyword{robust} \keyword{multivariate} rrcov/man/bushmiss.Rd0000644000176200001440000000512212763517421014314 0ustar liggesusers\name{bushmiss} \alias{bushmiss} \docType{data} \title{ Campbell Bushfire Data with added missing data items} \description{ This data set is based on the bushfire data set which was used by Campbell (1984) to locate bushfire scars - see \code{\link[robustbase]{bushfire}} in package \code{robustbase}. The original dataset contains satelite measurements on five frequency bands, corresponding to each of 38 pixels. } \usage{data(bushmiss)} \format{ A data frame with 190 observations on 6 variables. The original data set consists of 38 observations in 5 variables. Based on it four new data sets are created in which some of the data items are replaced by missing values with a simple "missing completely at random " mechanism. For this purpose independent Bernoulli trials are realized for each data item with a probability of success 0.1, 0.2, 0.3, 0.4, where success means that the corresponding item is set to missing. The obtained five data sets, including the original one (each with probability of a data item to be missing equal to 0, 0.1, 0.2, 0.3 and 0.4 which is reflected in the new variable \code{MPROB}) are merged. (See also Beguin and Hulliger (2004).) %\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. Beguin, C. and Hulliger, B. (2004) Multivariate outlier detection in incomplete survey data: the epidemic algorithm and transformed rank correlations. \emph{Journal of the Royal Statistical Society: Series B (Statistical Methodology)} \bold{127}, 2, 275--294. } %\seealso{} \examples{ ## The following code will result in exactly the same output ## as the one obtained from the original data set data(bushmiss) bf <- bushmiss[bushmiss$MPROB==0,1:5] plot(bf) covMcd(bf) \dontrun{ ## This is the code with which the missing data were created: ## ## Creates a data set with missing values (for testing purposes) ## from a complete data set 'x'. The probability of ## each item being missing is 'pr' (Bernoulli trials). ## getmiss <- function(x, pr=0.1) { n <- nrow(x) p <- ncol(x) done <- FALSE iter <- 0 while(iter <= 50){ bt <- rbinom(n*p, 1, pr) btmat <- matrix(bt, nrow=n) btmiss <- ifelse(btmat==1, NA, 0) y <- x+btmiss if(length(which(rowSums(nanmap(y)) == p)) == 0) return (y) iter <- iter + 1 } y } } } \keyword{datasets} rrcov/man/isSingular.Rd0000644000176200001440000000152312763517421014600 0ustar liggesusers\name{isSingular-methods} \docType{methods} \alias{isSingular} \alias{isSingular-methods} \alias{isSingular,ANY-method} \alias{isSingular,Cov-method} \title{ Check if a covariance matrix (object of class 'Cov') is singular } \description{ Returns TRUE if the covariance matrix contained in a \code{\link{Cov-class}} object (or derived from) is singular. } \usage{ \S4method{isSingular}{Cov}(obj) } \arguments{ \item{obj}{an object of class (derived from) \code{"Cov"}.} } \section{Methods}{ \describe{ \item{isSingular}{\code{signature(x = Cov)}: Check if a covariance matrix (object of class \code{\link{Cov-class}}) is singular.} }} \seealso{ \code{\link{Cov-class}}, \code{\link{CovClassic}}, \code{\link{CovRobust-class}}. } \examples{ data(hbk) cc <- CovClassic(hbk) isSingular(cc) } \keyword{multivariate} rrcov/man/CovMve.Rd0000644000176200001440000001167314145002735013657 0ustar liggesusers\name{CovMve} \alias{CovMve} % \title{ Robust Location and Scatter Estimation via MVE } \description{ Computes a robust multivariate location and scatter estimate with a high breakdown point, using the \sQuote{MVE} (Minimum Volume Ellipsoid) estimator. } \usage{ CovMve(x, alpha = 1/2, nsamp = 500, seed = NULL, trace = FALSE, control) } \arguments{ \item{x}{a matrix or data frame. } \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{ number of subsets used for initial estimates or \code{"best"} or \code{"exact"}. Default is \code{nsamp = 500}. For \code{nsamp="best"} exhaustive enumeration is done, as long as the number of trials does not exceed 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{seed}{starting value for random generator. Default is \code{seed = NULL}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{control}{ a control object (S4) of class \code{\link{CovControlMve-class}} containing estimation options - same as these provided in the fucntion 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.} } \details{ This function computes the minimum volume ellipsoid estimator of location and scatter and returns an S4 object of class \code{\link{CovMve-class}} containing the estimates. The approximate estimate is based on a subset of size \code{alpha*n} with an enclosing ellipsoid of smallest volume. The mean of the best found subset provides the raw estimate of the location, and the rescaled covariance matrix is the raw estimate of scatter. The rescaling of the raw covariance matrix is by \code{median(dist)/qchisq(0.5, p)} and this scale factor is returned in the slot \code{raw.cnp2}. Currently no finite sample corrction factor is applied. The Mahalanobis distances of all observations from the location estimate for the raw covariance matrix are calculated, and those points within the 97.5% point under Gaussian assumptions are declared to be good. The final (reweightd) estimates are the mean and rescaled covariance of the good points. The reweighted covariance matrix is rescaled by \code{1/pgamma(qchisq(alpha, p)/2, p/2 + 1)/alpha} (see Croux and Haesbroeck, 1999) and this scale factor is returned in the slot \code{cnp2}. The search for the approximate solution is made over ellipsoids determined by the covariance matrix of \code{p+1} of the data points and applying a simple but effective improvement of the subsampling procedure as described in Maronna et al. (2006), p. 198. Although there exists no formal proof of this improvement (as for MCD and LTS), simulations show that it can be recommended as an approximation of the MVE. } \note{ Main reason for implementing the MVE estimate was that it is the recommended initial estimate for S estimation (see Maronna et al. (2006), p. 199) and will be used by default in \code{\link{CovMest}} (after removing the correction factors from the covariance matrix and rescaling to determinant 1). } \value{ An S4 object of class \code{\link{CovMve-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ P. J. Rousseeuw and A. M. Leroy (1987) \emph{Robust Regression and Outlier Detection.} Wiley. C. Croux and G. Haesbroeck (1999). Influence function and efficiency of the minimum covariance determinant scatter matrix estimator. \emph{Journal of Multivariate Analysis}, \bold{71}, 161--190. R. A. Maronna, D. Martin and V. Yohai (2006). \emph{Robust Statistics: Theory and Methods}. Wiley, New York. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} and Matias Salibian-Barrera \email{matias@stat.ubc.ca} } \seealso{ \code{\link[MASS]{cov.rob}} from package \pkg{MASS} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovMve(hbk.x) ## the following three statements are equivalent c1 <- CovMve(hbk.x, alpha = 0.75) c2 <- CovMve(hbk.x, control = CovControlMve(alpha = 0.75)) ## direct specification overrides control one: c3 <- CovMve(hbk.x, alpha = 0.75, control = CovControlMve(alpha=0.95)) c1 } \keyword{robust} \keyword{multivariate} rrcov/man/Linda.Rd0000644000176200001440000001021014145003416013466 0ustar liggesusers\name{Linda} \alias{Linda} \alias{Linda.formula} \alias{Linda.default} \title{ Robust Linear Discriminant Analysis } \description{ Robust linear discriminant analysis based on MCD and returns the results as an object of class \code{Linda} (aka constructor). } \usage{ Linda(x, ...) \method{Linda}{default}(x, grouping, prior = proportions, tol = 1.0e-4, method = c("mcd", "mcdA", "mcdB", "mcdC", "fsa", "mrcd", "ogk"), alpha=0.5, l1med=FALSE, cov.control, trace=FALSE, ...) } \arguments{ \item{x}{a matrix or data frame containing the explanatory variables (training set). } \item{grouping}{grouping variable: a factor specifying the class for each observation.} \item{prior}{prior probabilities, default to the class proportions for the training set.} \item{tol}{tolerance} \item{method}{method} \item{alpha}{this parameter measures the fraction of outliers the algorithm should resist. In MCD alpha controls the size of the subsets over which the determinant is minimized, i.e. alpha*n observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{l1med}{whether to use L1 median (space median) instead of MCD to compute the group means locations in order to center the data in methods \code{mcdB} and \code{mcdC}. useful in case of groups with small size. Default is \code{l1med = FALSE}.} \item{cov.control}{specifies which covariance estimator to use by providing a \code{\link{CovControl-class}} object. The default is \code{\link{CovControlMcd-class}} which will indirectly call \code{\link{CovMcd}}. If \code{cov.control=NULL} is specified, the classical estimates will be used by calling \code{\link{CovClassic}}}. \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{\dots}{arguments passed to or from other methods} } \details{ details } \value{ Returns an S4 object of class \code{Linda} } \references{ Hawkins, D.M. and McLachlan, G.J. (1997) High-Breakdown Linear Discriminant Analysis, \emph{Journal of the American Statistical Association}, \bold{92}, 136--143. Todorov V. (2007) Robust selection of variables in linear discriminant analysis, \emph{Statistical Methods and Applications}, \bold{15}, 395--407, doi:10.1007/s10260-006-0032-6. Todorov, V. and Pires, A.M. (2007) Comparative Performance of Several Robust Linear Discriminant Analysis Methods. \emph{REVSTAT Statistical Journal}, \bold{5}, p 63--83. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link[rrcov]{CovMcd}}, \code{\link[rrcov]{CovMrcd}} } \examples{ ## Example anorexia library(MASS) data(anorexia) ## start with the classical estimates lda <- LdaClassic(Treat~., data=anorexia) predict(lda)@classification ## try now the robust LDA with the default method (MCD with pooled whitin cov matrix) rlda <- Linda(Treat~., data= anorexia) predict(rlda)@classification ## try the other methods Linda(Treat~., data= anorexia, method="mcdA") Linda(Treat~., data= anorexia, method="mcdB") Linda(Treat~., data= anorexia, method="mcdC") ## try the Hawkins&McLachlan method ## use the default method grp <- anorexia[,1] grp <- as.factor(grp) x <- anorexia[,2:3] Linda(x, grp, method="fsa") ## Do DA with Linda and method mcdB or mcdC, when some classes ## have very few observations. Use L1 median instead of MCD ## to compute the group means (l1med=TRUE). data(fish) # remove observation #14 containing missing value fish <- fish[-14,] # The height and width are calculated as percentages # of the third length variable fish[,5] <- fish[,5]*fish[,4]/100 fish[,6] <- fish[,6]*fish[,4]/100 table(fish$Species) Linda(Species~., data=fish, l1med=TRUE) Linda(Species~., data=fish, method="mcdC", l1med=TRUE) } \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMcd-class.Rd0000644000176200001440000000640714145001574016276 0ustar liggesusers\name{CovControlMcd-class} \Rdversion{1.1} \docType{class} \alias{CovControlMcd-class} \alias{restimate,CovControlMcd-method} \title{Class 'CovControlMcd' - contains control parameters for CovMcd } \description{ This class extends the \code{CovControl} class and contains the control parameters for \code{"CovMcd"} } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlMcd", ...)} or by calling the constructor-function \code{CovControlMcd}. } \section{Slots}{ \describe{ \item{\code{alpha}:}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{ number of subsets used for initial estimates or \code{"best"}, \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 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. 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{scalefn}{\code{\link{function}} to compute a robust scale estimate or character string specifying a rule determining such a function.} \item{maxcsteps}{maximal number of concentration steps in the deterministic MCD; should not be reached.} \item{\code{seed}:}{starting value for random generator. Default is \code{seed = NULL}} \item{\code{use.correction}:}{ whether to use finite sample correction factors. Default is \code{use.correction=TRUE}. } \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlMcd")}: the generic function \code{restimate} allows the different methods for robust estimation to be used polymorphically - this function will call \code{CovMcd} passing it the control object and will return the obtained \code{CovRobust} object} }} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMcd", alpha=0.75) ctrl2 <- CovControlMcd(alpha=0.75) data(hbk) CovMcd(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovSest.Rd0000644000176200001440000001713614145003131014035 0ustar liggesusers\encoding{latin1} \name{CovSest} \alias{CovSest} \title{ S Estimates of Multivariate Location and Scatter } \concept{High breakdown point} \description{ Computes S-Estimates of multivariate location and scatter based on Tukey's biweight function using a fast algorithm similar to the one proposed by Salibian-Barrera and Yohai (2006) for the case of regression. Alternativley, the Ruppert's SURREAL algorithm, bisquare or Rocke type estimation can be used. } \usage{ CovSest(x, bdp = 0.5, arp = 0.1, eps = 1e-5, maxiter = 120, nsamp = 500, seed = NULL, trace = FALSE, tolSolve = 1e-14, scalefn, maxisteps=200, initHsets = NULL, save.hsets = FALSE, method = c("sfast", "surreal", "bisquare", "rocke", "suser", "sdet"), control, t0, S0, initcontrol) } \arguments{ \item{x}{ a matrix or data frame. } \item{bdp}{a numeric value specifying the required breakdown point. Allowed values are between \code{(n - p)/(2 * n)} and 1 and the default is \code{bdp=0.5}. } \item{arp}{a numeric value specifying the asympthotic rejection point (for the Rocke type S estimates), i.e. the fraction of points receiving zero weight (see Rocke (1996)). Default is \code{arp=0.1}. } \item{eps}{a numeric value specifying the relative precision of the solution of the S-estimate (bisquare and Rocke type). Default is to \code{eps=1e-5}. } \item{maxiter}{maximum number of iterations allowed in the computation of the S-estimate (bisquare and Rocke type). Default is \code{maxiter=120}. } \item{nsamp}{the number of random subsets considered. The default is different for the different methods: (i) for \code{sfast} it is \code{nsamp = 20}, (ii) for \code{surreal} it is \code{nsamp = 600*p} and (iii) for \code{bisquare} or \code{rocke} it is \code{nsamp = 500}.} \item{seed}{starting value for random generator. Default is \code{seed = NULL}.} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{tolSolve}{numeric tolerance to be used for inversion (\code{\link{solve}}) of the covariance matrix in \code{\link{mahalanobis}}.} \item{scalefn}{\code{\link{function}} to compute a robust scale estimate or character string specifying a rule determining such a function. Used for computing the "deterministic" S-estimates (\code{method="sdet"}). If \code{scalefn} is missing or is \code{NULL}, the function is selected depending on the data set size, following the recomendation of Hubert et al. (2012) - \code{\link[robustbase]{Qn}} if \code{n <= 1000} and \code{\link[robustbase]{scaleTau2}} otherwise.} \item{maxisteps}{maximal number of concentration steps in the deterministic S-estimates; should not be reached.} \item{initHsets}{NULL or a \eqn{K x n} integer matrix of initial subsets of observations of size (specified by the indices in \code{1:n}).} \item{save.hsets}{(for deterministic S-estimates) logical indicating if the initial subsets should be returned as \code{initHsets}.} \item{method}{ Which algorithm to use: 'sfast'=C implementation of FAST-S, 'surreal'=SURREAL, 'bisquare', 'rocke'. The method 'suser' currently calls the R implementation of FAST-S but in the future will allow the user to supply own \code{rho} function. The method 'sdet' invokes the deterministic algorihm of Hubert et al. (2012).} \item{control}{ a control object (S4) of class \code{\link{CovControlSest-class}} containing estimation options - same as these provided in the fucntion 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{t0}{ optional initial HBDP estimate for the center } \item{S0}{ optional initial HBDP estimate for the covariance matrix } \item{initcontrol}{ optional control object to be used for computing the initial HBDP estimates } } \details{ Computes multivariate S-estimator of location and scatter. The computation will be performed by one of the following algorithms: \describe{ \item{FAST-S}{An algorithm similar to the one proposed by Salibian-Barrera and Yohai (2006) for the case of regression} \item{SURREAL}{Ruppert's SURREAL algorithm when \code{method} is set to 'surreal'} \item{BISQUARE}{Bisquare S-Estimate with \code{method} set to 'bisquare'} \item{ROCKE}{Rocke type S-Estimate with \code{method} set to 'rocke'} } Except for the last algorithm, \emph{ROCKE}, all other use Tukey biweight loss function. The tuning parameters used in the loss function (as determined by bdp) are returned in the slots \code{cc} and \code{kp} of the result object. They can be computed by the internal function \code{.csolve.bw.S(bdp, p)}. } \value{ An S4 object of class \code{\link{CovSest-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ M. Hubert, P. Rousseeuw and T. Verdonck (2012) A deterministic algorithm for robust location and scatter. \emph{Journal of Computational and Graphical Statistics} \bold{21}(3), 618--637. M. Hubert, P. Rousseeuw, D. Vanpaemel and T. Verdonck (2015) The DetS and DetMM estimators for multivariate location and scatter. \emph{Computational Statistics and Data Analysis} \bold{81}, 64--75. H.P. Lopuha (1989) On the Relation between S-estimators and M-estimators of Multivariate Location and Covariance. \emph{Annals of Statistics} \bold{17} 1662--1683. D. Ruppert (1992) Computing S Estimators for Regression and Multivariate Location/Dispersion. \emph{Journal of Computational and Graphical Statistics} \bold{1} 253--270. M. Salibian-Barrera and V. Yohai (2006) A fast algorithm for S-regression estimates, \emph{Journal of Computational and Graphical Statistics}, \bold{15}, 414--427. R. A. Maronna, D. Martin and V. Yohai (2006). \emph{Robust Statistics: Theory and Methods}. Wiley, New York. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at}, Matias Salibian-Barrera \email{matias@stat.ubc.ca} and Victor Yohai \email{vyohai@dm.uba.ar}. See also the code from Kristel Joossens, K.U. Leuven, Belgium and Ella Roelant, Ghent University, Belgium. } %\note{} %\seealso{} \examples{ library(rrcov) data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cc <- CovSest(hbk.x) cc ## summry and different types of plots summary(cc) plot(cc) plot(cc, which="dd") plot(cc, which="pairs") plot(cc, which="xydist") ## the following four statements are equivalent c0 <- CovSest(hbk.x) c1 <- CovSest(hbk.x, bdp = 0.25) c2 <- CovSest(hbk.x, control = CovControlSest(bdp = 0.25)) c3 <- CovSest(hbk.x, control = new("CovControlSest", bdp = 0.25)) ## direct specification overrides control one: c4 <- CovSest(hbk.x, bdp = 0.40, control = CovControlSest(bdp = 0.25)) c1 summary(c1) plot(c1) ## Use the SURREAL algorithm of Ruppert cr <- CovSest(hbk.x, method="surreal") cr ## Use Bisquare estimation cr <- CovSest(hbk.x, method="bisquare") cr ## Use Rocke type estimation cr <- CovSest(hbk.x, method="rocke") cr ## Use Deterministic estimation cr <- CovSest(hbk.x, method="sdet") cr } \keyword{robust} \keyword{multivariate} rrcov/man/LdaClassic-class.Rd0000644000176200001440000000354114145003340015551 0ustar liggesusers\name{LdaClassic-class} \docType{class} \alias{LdaClassic-class} \title{Class "LdaClassic" - Linear Discriminant Analysis } \description{ Contains the results of a classical Linear Discriminant Analysis } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("LdaClassic", ...)} but the usual way of creating \code{LdaClassic} objects is a call to the function \code{LdaClassic} which serves as a constructor. }\section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the common covariance matrix} \item{\code{ldf}:}{a matrix containing the linear discriminant functions} \item{\code{ldfconst}:}{a vector containing the constants of each linear discriminant function} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} } } \section{Extends}{ Class \code{"\linkS4class{Lda}"}, directly. } \section{Methods}{ No methods defined with class "LdaClassic" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{LdaRobust-class}}, \code{\link{Lda-class}}, \code{\link{LdaClassic}} } \examples{ showClass("LdaClassic") } \keyword{robust} \keyword{multivariate} rrcov/man/CovSest-class.Rd0000644000176200001440000000423714145003143015141 0ustar liggesusers\name{CovSest-class} \Rdversion{1.1} \docType{class} \alias{CovSest-class} \title{ S Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates S Estimates of multivariate location and scatter computed by the \sQuote{Fast S} or \sQuote{SURREAL} algorithm.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovSest", ...)}, but the usual way of creating \code{CovSest} objects is a call to the function \code{CovSest} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{iBest}, \code{nsteps}, \code{initHsets}:}{parameters for deterministic S-estimator (the best initial subset, number of concentration steps to convergence for each of the initial subsets, and the computed initial subsets, respectively). } \item{\code{cc}, \code{kp}}{tuning parameters used in Tukey biweight loss function, as determined by bdp. Can be computed by the internal function \code{.csolve.bw.S(bdp, p)}. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovSest" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovSest}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovSest") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/PcaLocantore-class.Rd0000644000176200001440000000416014145003663016127 0ustar liggesusers\name{PcaLocantore-class} \Rdversion{1.1} \docType{class} \alias{PcaLocantore-class} \alias{getQuan,PcaLocantore-method} \title{Class "PcaLocantore" Spherical Principal Components } \description{ The Spherical Principal Components procedure was proposed by Locantore et al., (1999) as a functional data analysis method. The idea is to perform classical PCA on the the data, \ projected onto a unit sphere. The estimates of the eigenvectors are consistent and the procedure is extremly fast. The simulations of Maronna (2005) show that this method has very good performance. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PcaLocantore", ...)} but the usual way of creating \code{PcaLocantore} objects is a call to the function \code{PcaLocantore} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{delta}:}{Accuracy parameter} \item{\code{quan}:}{Object of class \code{"numeric"} The quantile h used throughout the algorithm } \item{\code{call}, \code{center}, \code{scale}, \code{rank}, \code{loadings}, \code{eigenvalues}, \code{scores}, \code{k}, \code{sd}, \code{od}, \code{cutoff.sd}, \code{cutoff.od}, \code{flag}, \code{n.obs}, \code{eig0}, \code{totvar0}:}{ from the \code{"\linkS4class{Pca}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{PcaRobust}"}, directly. Class \code{"\linkS4class{Pca}"}, by class "PcaRobust", distance 2. } \section{Methods}{ \describe{ \item{getQuan}{\code{signature(obj = "PcaLocantore")}: ... } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{PcaRobust-class}}, \code{\link{Pca-class}}, \code{\link{PcaClassic}}, \code{\link{PcaClassic-class}} } \examples{ showClass("PcaLocantore") } \keyword{robust} \keyword{multivariate} rrcov/man/CovControlMcd.Rd0000644000176200001440000000502214145001626015161 0ustar liggesusers\name{CovControlMcd} \alias{CovControlMcd} % \title{ Constructor function for objects of class "CovControlMcd"} \description{ This function will create a control object \code{CovControlMcd} containing the control parameters for \code{CovMcd} } \usage{ CovControlMcd(alpha = 0.5, nsamp = 500, scalefn=NULL, maxcsteps=200, seed = NULL, trace= FALSE, use.correction = TRUE) } \arguments{ \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{ number of subsets used for initial estimates or \code{"best"}, \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 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. 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{scalefn}{\code{\link{function}} to compute a robust scale estimate or character string specifying a rule determining such a function, see \code{\link{rrcov.control}}.} \item{maxcsteps}{maximal number of concentration steps in the deterministic MCD; should not be reached.} \item{seed}{starting value for random generator. Default is \code{seed = NULL}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} \item{use.correction}{ whether to use finite sample correction factors. Default is \code{use.correction=TRUE}} } %\details{} \value{ A \code{CovControlMcd} object } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMcd", alpha=0.75) ctrl2 <- CovControlMcd(alpha=0.75) data(hbk) CovMcd(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/QdaClassic-class.Rd0000644000176200001440000000420514145004116015556 0ustar liggesusers\name{QdaClassic-class} \Rdversion{1.1} \docType{class} \alias{QdaClassic-class} \title{Class "QdaClassic" - Quadratic Discriminant Analysis } \description{ Contains the results of classical Quadratic Discriminant Analysis } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("QdaClassic", ...)} but the usual way of creating \code{QdaClassic} objects is a call to the function \code{QdaClassic} which serves as a constructor. }\section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the group covariance matrices} \item{\code{covinv}:}{the inverse of the group covariance matrices} \item{\code{covdet}:}{the determinants of the group covariance matrices} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{control}:}{Object of class \code{"CovControl"} inherited from class \code{Qda} specifying which estimate and with what estimation options to use for the group means and covariances. It is always \code{NULL} for classical discriminant analysis.} } } \section{Extends}{ Class \code{"\linkS4class{Qda}"}, directly. } \section{Methods}{ No methods defined with class "QdaClassic" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{QdaRobust-class}}, \code{\link{Qda-class}}, \code{\link{QdaClassic}} } \examples{ showClass("QdaClassic") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/hemophilia.Rd0000644000176200001440000000462512763517421014605 0ustar liggesusers\name{hemophilia} \alias{hemophilia} \docType{data} \title{ Hemophilia Data } \description{ The hemophilia data set contains two measured variables on 75 women, belonging to two groups: n1=30 of them are non-carriers (normal group) and n2=45 are known hemophilia A carriers (obligatory carriers). } \usage{data(hemophilia)} \format{ A data frame with 75 observations on the following 3 variables. \describe{ \item{\code{AHFactivity}}{AHF activity} \item{\code{AHFantigen}}{AHF antigen} \item{\code{gr}}{group - normal or obligatory carrier} } } \details{ Originally analized in the context of discriminant analysis by Habemma and Hermans (1974). The objective is to find a procedure for detecting potential hemophilia A carriers on the basis of two measured variables: X1=log10(AHV activity) and X2=log10(AHV-like antigen). The first group of n1=30 women consists of known non-carriers (normal group) and the second group of n2=45 women is selected from known hemophilia A carriers (obligatory carriers). This data set was also analyzed by Johnson and Wichern (1998) as well as, in the context of robust Linear Discriminant Analysis by Hawkins and McLachlan (1997) and Hubert and Van Driessen (2004). } \source{ Habemma, J.D.F, Hermans, J. and van den Broek, K. (1974) Stepwise Discriminant Analysis Program Using Density Estimation in \emph{Proceedings in Computational statistics, COMPSTAT`1974} (Physica Verlag, Heidelberg, 1974, pp 101--110). } \references{ Johnson, R.A. and Wichern, D. W. \emph{Applied Multivariate Statistical Analysis} (Prentice Hall, International Editions, 2002, fifth edition) Hawkins, D. M. and McLachlan, G.J. (1997) High-Breakdown Linear Discriminant Analysis \emph{J. Amer. Statist. Assoc.} \bold{92} 136--143. Hubert, M., Van Driessen, K. (2004) Fast and robust discriminant analysis, \emph{Computational Statistics and Data Analysis}, \bold{45} 301--320. } \examples{ data(hemophilia) plot(AHFantigen~AHFactivity, data=hemophilia, col=as.numeric(as.factor(gr))+1) ## ## Compute robust location and covariance matrix and ## plot the tolerance ellipses (mcd <- CovMcd(hemophilia[,1:2])) col <- ifelse(hemophilia$gr == "carrier", 2, 3) ## define clours for the groups plot(mcd, which="tolEllipsePlot", class=TRUE, col=col) %x <- hemophilia[,-3] %gr <- hemophilia[,3] %Linda(x, gr, method="ogk") } \keyword{datasets} rrcov/man/pottery.Rd0000644000176200001440000000670513607313765014200 0ustar liggesusers\name{pottery} \alias{pottery} \alias{pottery.test} \docType{data} \title{Archaic Greek Pottery data} \description{ The Archaic Greek Pottery data set contains data on fragments of Greek pottery which were classified into two groups according to their origin: Attic or Eritrean. Six chemical variables, metallic oxide constituents, were measured: Si, Al, Fe, Ca and Ti. The main data set consists of 13 Attic objects and 14 Eritrean ones. There is a separate data set with 13 observations which can be used as a test data set. It consists of 4 observations classified as "probably Attic" and the remaining 9 as "probably Eritrean". } \usage{ data(pottery) } \format{ Two data frames with 27 an 13 observations on the following 7 variables. \describe{ \item{\code{SI}}{Si content} \item{\code{AL}}{Al content} \item{\code{FE}}{Fe content} \item{\code{MG}}{Mg content} \item{\code{CA}}{Ca content} \item{\code{TI}}{Ti content} \item{\code{origin}}{Origin - factor with two levels: \code{Attic} and \code{Eritrean}} } } \details{ The Archaic Greek Pottery data set was first published by Stern and Descoeudres (1977) and later reproduced in Cooper and Weeks (1983) for illustration of linear discriminant analisys. The data set was used by Pires and Branco (2010) for illustration of their projection pursuit approach to linear discriminant analysis. } \source{ STERN, W. B. and DESCOEUDRES, J.-P. (1977) X-RAY FLUORESCENCE ANALYSIS OF ARCHAIC GREEK POTTERY \emph{Archaeometry}, Blackwell Publishing Ltd, \bold{19}, 73--86. } \references{ Cooper, R.A. and Weekes, A.J.. 1983 \emph{Data, Models, and Statistical Analysis}, (Lanham, MD: Rowman & Littlefield). Pires, A. M. and A. Branco, J. (2010) Projection-pursuit approach to robust linear discriminant analysis \emph{Journal Multivariate Analysis}, Academic Press, Inc., \bold{101}, 2464--2485. } \examples{ data(pottery) x <- pottery[,c("MG", "CA")] grp <- pottery$origin ## ## Compute robust location and covariance matrix and ## plot the tolerance ellipses library(rrcov) (mcd <- CovMcd(x)) col <- c(3,4) gcol <- ifelse(grp == "Attic", col[1], col[2]) gpch <- ifelse(grp == "Attic", 16, 1) plot(mcd, which="tolEllipsePlot", class=TRUE, col=gcol, pch=gpch) ## ## Perform classical LDA and plot the data, 0.975 tolerance ellipses ## and LDA separation line ## x <- pottery[,c("MG", "CA")] grp <- pottery$origin lda <- LdaClassic(x, grp) lda e1 <- getEllipse(loc=lda@center[1,], cov=lda@cov) e2 <- getEllipse(loc=lda@center[2,], cov=lda@cov) plot(CA~MG, data=pottery, col=gcol, pch=gpch, xlim=c(min(MG,e1[,1], e2[,1]), max(MG,e1[,1], e2[,1])), ylim=c(min(CA,e1[,2], e2[,2]), max(CA,e1[,2], e2[,2]))) ab <- lda@ldf[1,] - lda@ldf[2,] cc <- lda@ldfconst[1] - lda@ldfconst[2] abline(a=-cc/ab[2], b=-ab[1]/ab[2], col=2, lwd=2) lines(e1, type="l", col=col[1]) lines(e2, type="l", col=col[2]) ## ## Perform robust (MCD) LDA and plot data, classical and ## robust separation line ## plot(CA~MG, data=pottery, col=gcol, pch=gpch) lda <- LdaClassic(x, grp) ab <- lda@ldf[1,] - lda@ldf[2,] cc <- lda@ldfconst[1] - lda@ldfconst[2] abline(a=-cc/ab[2], b=-ab[1]/ab[2], col=2, lwd=2) abline(a=-cc/ab[2], b=-ab[1]/ab[2], col=4, lwd=2) rlda <- Linda(x, grp, method="mcd") rlda ab <- rlda@ldf[1,] - rlda@ldf[2,] cc <- rlda@ldfconst[1] - rlda@ldfconst[2] abline(a=-cc/ab[2], b=-ab[1]/ab[2], col=2, lwd=2) } \keyword{datasets} rrcov/man/CovMve-class.Rd0000644000176200001440000000647714145002747014773 0ustar liggesusers\name{CovMve-class} \Rdversion{1.1} \docType{class} \alias{CovMve-class} \title{ MVE Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates MVE Estimates of multivariate location and scatter computed by the \sQuote{Fast MVE} algorithm. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovMve", ...)}, but the usual way of creating \code{CovMve} objects is a call to the function \code{CovMve} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{alpha}:}{Object of class \code{"numeric"} - the size of the subsets over which the volume of the ellipsoid is minimized (the default is (n+p+1)/2) } \item{\code{quan}:}{Object of class \code{"numeric"} - the number of observations on which the MVE is based. If \code{quan} equals \code{n.obs}, the MVE is the classical covariance matrix. } \item{\code{best}:}{Object of class \code{"Uvector"} - the best subset found and used for computing the raw estimates. The size of \code{best} is equal to \code{quan} } \item{\code{raw.cov}:}{Object of class \code{"matrix"} the raw (not reweighted) estimate of location } \item{\code{raw.center}:}{Object of class \code{"vector"} - the raw (not reweighted) estimate of scatter} \item{\code{raw.mah}:}{Object of class \code{"Uvector"} - mahalanobis distances of the observations based on the raw estimate of the location and scatter } \item{\code{raw.wt}:}{Object of class \code{"Uvector"} - weights of the observations based on the raw estimate of the location and scatter } \item{\code{raw.cnp2}:}{Object of class \code{"numeric"} - 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{\code{cnp2}:}{Object of class \code{"numeric"} - 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{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class "CovMve" in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMve}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovMve") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovOgk.Rd0000644000176200001440000001163314145002764013646 0ustar liggesusers\name{CovOgk} \alias{CovOgk} % \title{ Robust Location and Scatter Estimation - Ortogonalized Gnanadesikan-Kettenring (OGK)} \description{ Computes a robust multivariate location and scatter estimate with a high breakdown point, using the pairwise algorithm proposed by Marona and Zamar (2002) which in turn is based on the pairwise robust estimator proposed by Gnanadesikan-Kettenring (1972). } \usage{ CovOgk(x, niter = 2, beta = 0.9, control) } \arguments{ \item{x}{a matrix or data frame. } \item{niter}{ number of iterations, usually 1 or 2 since iterations beyond the second do not lead to improvement. } \item{beta}{ coverage parameter for the final reweighted estimate } \item{control}{ a control object (S4) of class \code{\link{CovControlOgk-class}} containing 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. The control object contains also functions for computing the robust univariate location and dispersion estimate \code{mrob} and for computing the robust estimate of the covariance between two random variables \code{vrob}. } } \details{ The method proposed by Marona and Zamar (2002) allowes to obtain positive-definite and almost affine equivariant robust scatter matrices starting from any pairwise robust scatter matrix. The default robust estimate of covariance between two random vectors used is the one proposed by Gnanadesikan and Kettenring (1972) but the user can choose any other method by redefining the function in slot \code{vrob} of the control object \code{CovControlOgk}. Similarly, the function for computing the robust univariate location and dispersion used is the \code{tau scale} defined in Yohai and Zamar (1998) but it can be redefined in the control object. The estimates obtained by the OGK method, similarly as in \code{CovMcd} are returned as 'raw' estimates. To improve the estimates a reweighting step is performed using the coverage parameter \code{beta} and these reweighted estimates are returned as 'final' estimates. } \note{ If the user does not specify a scale and covariance function to be used in the computations or specifies one by using the arguments \code{smrob} and \code{svrob} (i.e. the names of the functions as strings), a native code written in C will be called which is by far faster than the R version. If the arguments \code{mrob} and \code{vrob} are not NULL, the specified functions will be used via the pure R implementation of the algorithm. This could be quite slow. See \code{\link{CovControlOgk}} for details. } \value{ An S4 object of class \code{\link{CovOgk-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \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. Yohai, R.A. and Zamar, R.H. (1998) High breakdown point estimates of regression by means of the minimization of efficient scale \emph{JASA} \bold{86}, 403--413. Gnanadesikan, R. and John R. Kettenring (1972) Robust estimates, residuals, and outlier detection with multiresponse data. \emph{Biometrics} \bold{28}, 81--124. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} and Kjell Konis \email{kjell.konis@epfl.ch} } %\note{} \seealso{ \code{\link{CovMcd}}, \code{\link{CovMest}} } \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovOgk(hbk.x) ## the following three statements are equivalent c1 <- CovOgk(hbk.x, niter=1) c2 <- CovOgk(hbk.x, control = CovControlOgk(niter=1)) ## direct specification overrides control one: c3 <- CovOgk(hbk.x, beta=0.95, control = CovControlOgk(beta=0.99)) c1 x<-matrix(c(1,2,3,7,1,2,3,7), ncol=2) ## CovOgk(x) - this would fail because the two columns of x are exactly collinear. ## In order to fix it, redefine the default 'vrob' function for example ## in the following way and pass it as a parameter in the control ## object. cc <- CovOgk(x, control=new("CovControlOgk", vrob=function(x1, x2, ...) { r <- .vrobGK(x1, x2, ...) if(is.na(r)) r <- 0 r }) ) cc } \keyword{robust} \keyword{multivariate} rrcov/man/QdaCov-class.Rd0000644000176200001440000000427214145004123014726 0ustar liggesusers\name{QdaCov-class} \docType{class} \alias{QdaCov-class} \title{Class "QdaCov" - Robust methods for Quadratic Discriminant Analysis } \description{ Robust quadratic discriminant analysis is performed by replacing the classical group means and withing group covariance matrices by their robust equivalents. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("QdaCov", ...)} but the usual way of creating \code{QdaCov} objects is a call to the function \code{QdaCov} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the group covariance matrices} \item{\code{covinv}:}{the inverse of the group covariance matrices} \item{\code{covdet}:}{the determinants of the group covariance matrices} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{control}:}{Object of class \code{"CovControl"} specifying which estimate to use for the group means and covariances } } } \section{Extends}{ Class \code{"\linkS4class{QdaRobust}"}, directly. Class \code{"\linkS4class{Qda}"}, by class "QdaRobust", distance 2. } \section{Methods}{No methods defined with class "QdaCov" in the signature.} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{QdaRobust-class}}, \code{\link{Qda-class}}, \code{\link{QdaClassic}}, \code{\link{QdaClassic-class}} } \examples{ showClass("QdaCov") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/LdaClassic.Rd0000644000176200001440000000325414145003351014451 0ustar liggesusers\name{LdaClassic} \alias{LdaClassic} \alias{LdaClassic.formula} \alias{LdaClassic.default} \title{ Linear Discriminant Analysis } \description{ Performs a linear discriminant analysis and returns the results as an object of class \code{LdaClassic} (aka constructor). } \usage{ LdaClassic(x, ...) %%\method{LdaClassic}{formula}(formula, data = NULL, subset, na.action, \dots) \method{LdaClassic}{default}(x, grouping, prior = proportions, tol = 1.0e-4, ...) } \arguments{ \item{x}{a matrix or data frame containing the explanatory variables (training set). } \item{grouping}{grouping variable: a factor specifying the class for each observation.} \item{prior}{prior probabilities, default to the class proportions for the training set.} \item{tol}{tolerance} \item{\dots}{arguments passed to or from other methods.} } %\details{} \value{ Returns an S4 object of class \code{LdaClassic} } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{Lda-class}}, \code{\link{LdaClassic-class}}, } \examples{ ## Example anorexia library(MASS) data(anorexia) ## rrcov: LdaClassic() lda <- LdaClassic(Treat~., data=anorexia) predict(lda)@classification ## MASS: lda() lda.MASS <- lda(Treat~., data=anorexia) predict(lda.MASS)$class ## Compare the prediction results of MASS:::lda() and LdaClassic() all.equal(predict(lda)@classification, predict(lda.MASS)$class) } \keyword{robust} \keyword{multivariate} rrcov/man/Qda-class.Rd0000644000176200001440000000523314145004114014254 0ustar liggesusers\name{Qda-class} \Rdversion{1.1} \docType{class} \alias{Qda-class} \alias{predict,Qda-method} \alias{show,Qda-method} \alias{summary,Qda-method} \title{Class "Qda" - virtual base class for all classic and robust QDA classes } \description{ The class \code{Qda} serves as a base class for deriving all other classes representing the results of classical and robust Quadratic Discriminant Analisys methods } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{the (matched) function call.} \item{\code{prior}:}{prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the group covariance matrices} \item{\code{covinv}:}{the inverse of the group covariance matrices} \item{\code{covdet}:}{the determinants of the group covariance matrices} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{control}:}{object of class \code{"CovControl"} specifying which estimate and with what estimation options to use for the group means and covariances (or \code{NULL} for classical discriminant analysis)} } } \section{Methods}{ \describe{ \item{predict}{\code{signature(object = "Qda")}: calculates prediction using the results in \code{object}. An optional data frame or matrix in which to look for variables with which to predict. If omitted, the scores are used. If the original fit used a formula or a data frame or a matrix with column names, newdata must contain columns with the same names. Otherwise it must contain the same number of columns, to be used in the same order. } \item{show}{\code{signature(object = "Qda")}: prints the results } \item{summary}{\code{signature(object = "Qda")}: prints summary information } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{QdaClassic}}, \code{\link{QdaClassic-class}}, \code{\link{QdaRobust-class}} } \examples{ showClass("Qda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/QdaClassic.Rd0000644000176200001440000000252714145004120014453 0ustar liggesusers\name{QdaClassic} \Rdversion{1.1} \alias{QdaClassic} \alias{QdaClassic.formula} \alias{QdaClassic.default} \title{ Quadratic Discriminant Analysis } \description{ Performs quadratic discriminant analysis and returns the results as an object of class \code{QdaClassic} (aka constructor). } \usage{ QdaClassic(x, ...) %%\method{QdaClassic}{formula}(formula, data = NULL, subset, na.action, \dots) \method{QdaClassic}{default}(x, grouping, prior = proportions, tol = 1.0e-4, ...) } \arguments{ \item{x}{a matrix or data frame containing the explanatory variables (training set). } \item{grouping}{grouping variable: a factor specifying the class for each observation.} \item{prior}{prior probabilities, default to the class proportions for the training set.} \item{tol}{tolerance} \item{\dots}{arguments passed to or from other methods.} } %\details{} \value{ Returns an S4 object of class \code{QdaClassic} } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{Qda-class}}, \code{\link{QdaClassic-class}}, } %\examples{} \keyword{robust} \keyword{multivariate} rrcov/man/Linda-class.Rd0000644000176200001440000000417014145003406014600 0ustar liggesusers\name{Linda-class} \docType{class} \alias{Linda-class} \title{Class "Linda" - Robust method for LINear Discriminant Analysis } \description{ Robust linear discriminant analysis is performed by replacing the classical group means and withing group covariance matrix by robust equivalents based on MCD. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Linda", ...)} but the usual way of creating \code{Linda} objects is a call to the function \code{Linda} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{call}:}{The (matched) function call.} \item{\code{prior}:}{Prior probabilities used, default to group proportions} \item{\code{counts}:}{number of observations in each class} \item{\code{center}:}{the group means} \item{\code{cov}:}{the common covariance matrix} \item{\code{ldf}:}{a matrix containing the linear discriminant functions} \item{\code{ldfconst}:}{a vector containing the constants of each linear discriminant function} \item{\code{method}:}{a character string giving the estimation method used} \item{\code{X}:}{the training data set (same as the input parameter x of the constructor function)} \item{\code{grp}:}{grouping variable: a factor specifying the class for each observation.} \item{\code{l1med}:}{wheather L1 median was used to compute group means.} } } \section{Extends}{ Class \code{"\linkS4class{LdaRobust}"}, directly. Class \code{"\linkS4class{Lda}"}, by class "LdaRobust", distance 2. } \section{Methods}{No methods defined with class "Linda" in the signature.} \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{LdaRobust-class}}, \code{\link{Lda-class}}, \code{\link{LdaClassic}}, \code{\link{LdaClassic-class}} } \examples{ showClass("Linda") } \keyword{robust} \keyword{multivariate} rrcov/man/Cascades.Rd0000644000176200001440000000401113710111176014147 0ustar liggesusers\name{Cascades} \alias{Cascades} \docType{data} \title{ Annual precipitation totals for the North Cascades region} \description{ The data on annual precipitation totals for the North Cascades region contains the sample L-moments ratios (L-CV, L-skewness and L-kurtosis) for 19 sites as used by Hosking and Wallis (1997), page 53, Table 3.4, to illustrate screening tools for regional freqency analysis (RFA). } \usage{data(Cascades)} \format{ A data frame with 19 observations on the following 3 variables. \describe{ \item{\code{L-CV}}{L-coefficient of variation} \item{\code{L-skewness}}{L-coefficient of skewness} \item{\code{L-kurtosis}}{L-coefficient of kurtosis} } } \details{ The sample L-moment ratios (L-CV, L-skewness and L-kurtosis) of a site are regarded as a point in three dimensional space. } \source{ Hosking, J. R. M. and J. R. Wallis (1997), \emph{Regional Frequency Analysis: An Approach Based on L-moments.} Cambridge University Press, p. 52--53 } \references{ Neykov, N.M., Neytchev, P.N., Van Gelder, P.H.A.J.M. and Todorov V. (2007), Robust detection of discordant sites in regional frequency analysis, \emph{Water Resources Research}, 43, W06417, doi:10.1029/2006WR005322 } \examples{ data(Cascades) # plot a matrix of scatterplots pairs(Cascades, main="Cascades data set", pch=21, bg=c("red", "green3", "blue")) mcd<-CovMcd(Cascades) mcd plot(mcd, which="dist", class=TRUE) plot(mcd, which="dd", class=TRUE) ## identify the discordant sites using robust distances and compare ## to the classical ones rd <- sqrt(getDistance(mcd)) ccov <- CovClassic(Cascades) cd <- sqrt(getDistance(ccov)) r.out <- which(rd > sqrt(qchisq(0.975,3))) c.out <- which(cd > sqrt(qchisq(0.975,3))) cat("Robust: ", length(r.out), " outliers: ", r.out,"\n") cat("Classical: ", length(c.out), " outliers: ", c.out,"\n") } \keyword{datasets} rrcov/man/SummaryLda-class.Rd0000644000176200001440000000217714145004154015635 0ustar liggesusers\name{SummaryLda-class} \docType{class} \alias{SummaryLda-class} \alias{show,SummaryLda-method} \title{ Class "SummaryLda" - summary of "Lda" objects } \description{ Contains summary information about an \code{Lda} object - Linear Discriminant Analysis object } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("SummaryLda", ...)}, but most often by invoking 'summary' on an "Lda" object. They contain values meant for printing by 'show'. } \section{Slots}{ \describe{ \item{\code{ldaobj}:}{Object of class \code{"Lda"}} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "SummaryLda")}: display the object } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Lda-class}} } \examples{ showClass("SummaryLda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/plot-methods.Rd0000644000176200001440000000451312763517421015101 0ustar liggesusers\name{plot-methods} \docType{methods} \concept{High breakdown point} \alias{plot-methods} \alias{plot,CovClassic-method} \alias{plot,CovClassic,missing-method} \alias{plot,CovRobust-method} \alias{plot,CovRobust,missing-method} \title{Methods for Function 'plot' in Package 'rrcov'} \description{ Shows the Mahalanobis distances based on robust and/or classical estimates of the location and the covariance matrix in different plots. The following plots are available: - index plot of the robust and mahalanobis distances - distance-distance plot - Chisquare QQ-plot of the robust and mahalanobis distances - plot of the tolerance ellipses (robust and classic) - Scree plot - Eigenvalues comparison plot } \usage{ \S4method{plot}{CovClassic}(x, which = c("all","distance","qqchi2","tolellipse","screeplot"), ask=(which=="all" && dev.interactive()), cutoff, id.n, tol=1e-7, \dots) \S4method{plot}{CovRobust}(x, which = c("all","dd","distance","qqchi2","tolellipse","screeplot"), classic=FALSE, ask=(which=="all" && dev.interactive()), cutoff, id.n, tol=1e-7, \dots) } \arguments{ \item{x}{an object of class \code{"Cov"} or \code{"CovRobust"}} \item{which}{ Which plot to show? See Details for description of the options. Default is \code{which}="all". }. \item{classic}{ whether to plot the classical distances too. Default is \code{classic}=FALSE. }. \item{ask}{ logical; if 'TRUE', the user is \emph{ask}ed before each plot, see 'par(ask=.)'. Default is \code{ask = which=="all" && dev.interactive()}. } \item{cutoff}{ The cutoff value for the distances. } \item{id.n}{ Number of observations to identify by a label. If not supplied, the number of observations with distance larger than \code{cutoff} is used. } \item{tol}{ tolerance to be used for computing the inverse see 'solve'. Default is \code{tol = 10e-7}} \item{... }{ other parameters to be passed through to plotting functions. } } \section{Methods}{\describe{ \item{x = "Cov", y = "missing"}{Plot mahalanobis distances for \code{x}.} \item{x = "CovRobust", y = "missing"}{Plot robust and classical mahalanobis distances for \code{x}.} }} \examples{ data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) cv <- CovClassic(hbk.x) plot(cv) rcv <- CovMest(hbk.x) plot(rcv) } \keyword{methods} rrcov/man/CovMMest.Rd0000644000176200001440000000651514145002477014157 0ustar liggesusers\encoding{latin1} \name{CovMMest} \alias{CovMMest} \title{ MM Estimates of Multivariate Location and Scatter } \concept{High breakdown point} \description{ Computes MM-Estimates of multivariate location and scatter starting from an initial S-estimate } \usage{ CovMMest(x, bdp = 0.5, eff = 0.95, eff.shape=TRUE, maxiter = 50, trace = FALSE, tolSolve = 1e-7, control) } \arguments{ \item{x}{ a matrix or data frame. } \item{bdp}{a numeric value specifying the required breakdown point. Allowed values are between 0.5 and 1 and the default is \code{bdp=0.5}. } \item{eff}{a numeric value specifying the required efficiency for the MM estimates. Default is \code{eff=0.95}. } \item{eff.shape}{logical; if TRUE, eff is with regard to shape-efficiency, otherwise location-efficiency. Default is \code{eff.shape=FALSE}. } \item{maxiter}{maximum number of iterations allowed in the computation of the S-estimate (bisquare and Rocke type). Default is \code{maxiter=50}. } \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}.} \item{tolSolve}{numeric tolerance to be used as a convergence tolerance for the MM-iteration} \item{control}{ a control object (S4) of class \code{\link{CovControlMMest-class}} containing estimation options - same as these provided in the fucntion 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.} } \details{ Computes MM-estimates of multivariate location and scatter starting from an initial S-estimate. } \value{ An S4 object of class \code{\link{CovMMest-class}} which is a subclass of the virtual class \code{\link{CovRobust-class}}. } \references{ Tatsuoka, K.S. and Tyler, D.E. (2000). The uniqueness of S and M-functionals under non-elliptical distributions. \emph{Annals of Statistics} 28, 1219--1243 M. Salibian-Barrera, S. Van Aelstt and G. Willems (2006). Principal components analysis based on multivariate MM-estimators with fast and robust bootstrap. \emph{Journal of the American Statistical Association} 101, 1198--1211. R. A. Maronna, D. Martin and V. Yohai (2006). \emph{Robust Statistics: Theory and Methods}. Wiley, New York. Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} %\seealso{} \examples{ library(rrcov) data(hbk) hbk.x <- data.matrix(hbk[, 1:3]) CovMMest(hbk.x) ## the following four statements are equivalent c0 <- CovMMest(hbk.x) c1 <- CovMMest(hbk.x, bdp = 0.25) c2 <- CovMMest(hbk.x, control = CovControlMMest(bdp = 0.25)) c3 <- CovMMest(hbk.x, control = new("CovControlMMest", bdp = 0.25)) ## direct specification overrides control one: c4 <- CovMMest(hbk.x, bdp = 0.40, control = CovControlMMest(bdp = 0.25)) c1 summary(c1) plot(c1) ## Deterministic MM-estmates CovMMest(hbk.x, control=CovControlMMest(sest=CovControlSest(method="sdet"))) } \keyword{robust} \keyword{multivariate} rrcov/man/machines.Rd0000644000176200001440000000465714177776410014270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datadoc.R \docType{data} \name{machines} \alias{machines} \title{Computer Hardware} \format{ A data frame with 209 rows and 8 variables The variables are as follows: \itemize{ \item MMIN: minimum main memory in kilobytes (integer) \item MMAX: maximum main memory in kilobytes (integer) \item CACH: cache memory in kilobytes (integer) \item CHMIN: minimum channels in units (integer) \item CHMAX: maximum channels in units (integer) \item PRP: published relative performance (integer) \item ERP: estimated relative performance from the original article (integer) } } \source{ \href{http://archive.ics.uci.edu/ml/datasets/Computer+Hardware?ref=datanews.io}{UCI Archive} } \usage{ data(machines) } \description{ A data set containing relative CPU performance data of 209 machines on 8 variables. are predictive, one (\code{PRP}) is the goal field and one (\code{ERP}) is the linear regression's guess. The estimated relative performance values were estimated by the authors using a linear regression method. See their article (Ein-Dor and Feldmesser, CACM 4/87, pp 308-317) for more details on how the relative performance values were set. } \examples{ data(machines) ## Compute the medcouple of each variable of the Computer hardware data data.frame(MC=round(apply(machines, 2, mc),2)) ## Plot a pairwise scaterplot matrix pairs(machines[,1:6]) mcd <- CovMcd(machines[,1:6]) plot(mcd, which="pairs") ## Remove the rownames (too long) rownames(machines) <- NULL ## Start with robust PCA based on MCD (P << n) (pca1 <- PcaHubert(machines, k=3)) plot(pca1, main="ROBPCA-MCD", off=0.03) ## PCA with the projection algoritm of Hubert (pca2 <- PcaHubert(machines, k=3, mcd=FALSE)) plot(pca2, main="ROBPCA-SD", off=0.03) ## PCA with the adjusted for skewness algorithm of Hubert et al (2009) (pca3 <- PcaHubert(machines, k=3, mcd=FALSE, skew=TRUE)) plot(pca3, main="ROBPCA-AO", off=0.03) } \references{ Phillip Ein-Dor and Jacob Feldmesser (1987), Attributes of the performance of central processing units: A relative performance prediction model, \emph{Communications of the ACM}, \bold{30}, 4, pp 308-317. M. Hubert, P. J. Rousseeuw and T. Verdonck (2009), Robust PCA for skewed data and its outlier map, \emph{Computational Statistics & Data Analysis}, \bold{53}, 2264--2274. } \keyword{datasets} rrcov/man/PredictLda-class.Rd0000644000176200001440000000246714145004202015566 0ustar liggesusers\name{PredictLda-class} \docType{class} \alias{PredictLda-class} \alias{show,PredictLda-method} \title{Class "PredictLda" - prediction of "Lda" objects } \description{ The prediction of a "Lda" object } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("PredictLda", ...)} but most often by invoking 'predict' on a "Lda" object. They contain values meant for printing by 'show'} \section{Slots}{ \describe{ \item{\code{classification}:}{a factor variable containing the classification of each object } \item{\code{posterior}:}{a matrix containing the posterior probabilities } \item{\code{x}:}{ matrix with the discriminant scores } \item{\code{ct}:}{re-classification table of the training sample} } } \section{Methods}{ \describe{ \item{show}{\code{signature(object = "PredictLda")}: Prints the results } } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\note{} \seealso{ \code{\link{Lda-class}} } \examples{ showClass("PredictLda") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/lmom33.Rd0000644000176200001440000000405213710111211013546 0ustar liggesusers\name{lmom33} \alias{lmom33} \docType{data} \title{ Hosking and Wallis Data Set, Table 3.3} \description{ The data on annual maximum streamflow at 17 sites with largest drainage area basins in southeastern USA contains the sample L-moments ratios (L-CV, L-skewness and L-kurtosis) as used by Hosking and Wallis (1997) to illustrate the discordancy measure in regional freqency analysis (RFA). } \usage{data(lmom33)} \format{ A data frame with 17 observations on the following 3 variables. \describe{ \item{\code{L-CV}}{L-coefficient of variation} \item{\code{L-skewness}}{L-coefficient of skewness} \item{\code{L-kurtosis}}{L-coefficient of kurtosis} } } \details{ The sample L-moment ratios (L-CV, L-skewness and L-kurtosis) of a site are regarded as a point in three dimensional space. } \source{ Hosking, J. R. M. and J. R. Wallis (1997), \emph{Regional Frequency Analysis: An Approach Based on L-moments.} Cambridge University Press, p.51, Table 3.3 } \references{ Neykov, N.M., Neytchev, P.N., Van Gelder, P.H.A.J.M. and Todorov V. (2007), Robust detection of discordant sites in regional frequency analysis, \emph{Water Resources Research}, 43, W06417, doi:10.1029/2006WR005322 } \examples{ data(lmom33) # plot a matrix of scatterplots pairs(lmom33, main="Hosking and Wallis Data Set, Table 3.3", pch=21, bg=c("red", "green3", "blue")) mcd<-CovMcd(lmom33) mcd plot(mcd, which="dist", class=TRUE) plot(mcd, which="dd", class=TRUE) ## identify the discordant sites using robust distances and compare ## to the classical ones mcd <- CovMcd(lmom33) rd <- sqrt(getDistance(mcd)) ccov <- CovClassic(lmom33) cd <- sqrt(getDistance(ccov)) r.out <- which(rd > sqrt(qchisq(0.975,3))) c.out <- which(cd > sqrt(qchisq(0.975,3))) cat("Robust: ", length(r.out), " outliers: ", r.out,"\n") cat("Classical: ", length(c.out), " outliers: ", c.out,"\n") } \keyword{datasets} rrcov/man/CovControlMve.Rd0000644000176200001440000000346014145002045015205 0ustar liggesusers\name{CovControlMve} \alias{CovControlMve} % \title{ Constructor function for objects of class "CovControlMve"} \description{ This function will create a control object \code{CovControlMve} containing the control parameters for \code{CovMve} } \usage{ CovControlMve(alpha = 0.5, nsamp = 500, seed = NULL, trace= FALSE) } \arguments{ \item{alpha}{numeric parameter controlling the size of the subsets over which the determinant is minimized, i.e., \code{alpha*n} observations are used for computing the determinant. Allowed values are between 0.5 and 1 and the default is 0.5.} \item{nsamp}{ number of subsets used for initial estimates or \code{"best"} or \code{"exact"}. Default is \code{nsamp = 500}. For \code{nsamp="best"} exhaustive enumeration is done, as long as the number of trials does not exceed 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{seed}{starting value for random generator. Default is \code{seed = NULL}} \item{trace}{whether to print intermediate results. Default is \code{trace = FALSE}} } \value{ A \code{CovControlMve} object } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{Valentin Todorov \email{valentin.todorov@chello.at}} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMve", alpha=0.75) ctrl2 <- CovControlMve(alpha=0.75) data(hbk) CovMve(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/CovMcd-class.Rd0000644000176200001440000000647214145002555014737 0ustar liggesusers\name{CovMcd-class} \Rdversion{1.1} \docType{class} \alias{CovMcd-class} \title{ MCD Estimates of Multivariate Location and Scatter } \description{ This class, derived from the virtual class \code{"CovRobust"} accomodates MCD Estimates of multivariate location and scatter computed by the \sQuote{Fast MCD} algorithm. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovMcd", ...)}, but the usual way of creating \code{CovMcd} objects is a call to the function \code{CovMcd} which serves as a constructor. } \section{Slots}{ \describe{ \item{\code{alpha}:}{Object of class \code{"numeric"} - the size of the subsets over which the determinant is minimized (the default is (n+p+1)/2) } \item{\code{quan}:}{Object of class \code{"numeric"} - the number of observations on which the MCD is based. If \code{quan} equals \code{n.obs}, the MCD is the classical covariance matrix. } \item{\code{best}:}{Object of class \code{"Uvector"} - the best subset found and used for computing the raw estimates. The size of \code{best} is equal to \code{quan} } \item{\code{raw.cov}:}{Object of class \code{"matrix"} the raw (not reweighted) estimate of location } \item{\code{raw.center}:}{Object of class \code{"vector"} - the raw (not reweighted) estimate of scatter} \item{\code{raw.mah}:}{Object of class \code{"Uvector"} - mahalanobis distances of the observations based on the raw estimate of the location and scatter } \item{\code{raw.wt}:}{Object of class \code{"Uvector"} - weights of the observations based on the raw estimate of the location and scatter } \item{\code{raw.cnp2}:}{Object of class \code{"numeric"} - 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{\code{cnp2}:}{Object of class \code{"numeric"} - 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{\code{iter}, \code{crit}, \code{wt}:}{from the \code{"\linkS4class{CovRobust}"} class. } \item{\code{call}, \code{cov}, \code{center}, \code{n.obs}, \code{mah}, \code{method}, \code{singularity}, \code{X}:}{from the \code{"\linkS4class{Cov}"} class. } } } \section{Extends}{ Class \code{"\linkS4class{CovRobust}"}, directly. Class \code{"\linkS4class{Cov}"}, by class \code{"\linkS4class{CovRobust}"}. } \section{Methods}{ No methods defined with class \code{"CovMcd"} in the signature. } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } \author{ Valentin Todorov \email{valentin.todorov@chello.at} } \seealso{ \code{\link{CovMcd}}, \code{\link{Cov-class}}, \code{\link{CovRobust-class}} } \examples{ showClass("CovMcd") } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/diabetes.Rd0000644000176200001440000000504313564322552014240 0ustar liggesusers\name{diabetes} \alias{diabetes} \docType{data} \title{Reaven and Miller diabetes data} \description{ The data set contains five measurements made on 145 non-obese adult patients classified into three groups. The three primary variables are glucose intolerance (area under the straight line connecting glucose levels), insulin response to oral glucose (area under the straight line connecting insulin levels) and insulin resistance (measured by the steady state plasma glucose (SSPG) determined after chemical suppression of endogenous insulin secretion). Two additional variables, the relative weight and fasting plasma glucose, are also included. Reaven and Miller, following Friedman and Rubin (1967), applied cluster analysis to the three primary variables and identified three clusters: "normal", "chemical diabetic", and "overt diabetic" subjects. The column \code{group} contains the classifications of the subjects into these three groups, obtained by current medical criteria. } \usage{ data(diabetes) } \format{A data frame with the following variables: \describe{ \item{rw}{relative weight, expressed as the ratio of actual weight to expected weight, given the person's height.} \item{fpg}{fasting plasma glucose level.} \item{glucose}{area under plasma glucose curve after a three hour oral glucose tolerance test (OGTT).} \item{insulin}{area under plasma insulin curve after a three hour oral glucose tolerance test (OGTT).} \item{sspg}{Steady state plasma glucose, a measure of insulin resistance.} \item{group}{the type of diabetes: a factor with levels \code{normal}, \code{chemical} and \code{overt}.}} } \source{ Reaven, G. M. and Miller, R. G. (1979). An attempt to define the nature of chemical diabetes using a multidimensional analysis. \emph{Diabetologia} 16, 17--24. Andrews, D. F. and Herzberg, A. M. (1985). \emph{Data: A Collection of Problems from Many Fields for the Student and Research Worker}, Springer-Verlag, Ch. 36. } \references{ Reaven, G. M. and Miller, R. G. (1979). An attempt to define the nature of chemical diabetes using a multidimensional analysis. \emph{Diabetologia} 16, 17--24. Friedman, H. P. and Rubin, J. (1967). On some invariant criteria for grouping data. \emph{Journal of the American Statistical Association} \bold{62}, 1159--1178. Hawkins, D. M. and McLachlan, G. J., 1997. High-breakdown linear discriminant analysis. \emph{Journal of the American Statistical Association} \bold{92} (437), 136--143. } \examples{ data(diabetes) (cc <- Linda(group~insulin+glucose+sspg, data=diabetes)) (pr <- predict(cc)) } \keyword{datasets} rrcov/man/CovControlMMest-class.Rd0000644000176200001440000000455414145001505016613 0ustar liggesusers\name{CovControlMMest-class} \Rdversion{1.1} \docType{class} \alias{CovControlMMest-class} \alias{restimate,CovControlMMest-method} \title{Class 'CovControlMMest' - contains control parameters for "CovMMest"} \description{ This class extends the \code{CovControl} class and contains the control parameters for CovMMest } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("CovControlMMest", ...)} or by calling the constructor-function \code{CovControlMMest}. } \section{Slots}{ \describe{ \item{bdp}{a numeric value specifying the required breakdown point. Allowed values are between 0.5 and 1 and the default is \code{bdp=0.5}. } \item{eff}{a numeric value specifying the required efficiency for the MM estimates. Default is \code{eff=0.95}. } \item{sest}{an \code{CovControlSest} object containing control parameters for the initial S-estimate. } \item{maxiter}{maximum number of iterations allowed in the computation of the MM-estimate. Default is \code{maxiter=50}. } \item{\code{trace}, \code{tolSolve}:}{from the \code{"\linkS4class{CovControl}"} class. \code{tolSolve} is used as a convergence tolerance for the MM-iteration. } } } \section{Extends}{ Class \code{"\linkS4class{CovControl}"}, directly. } \section{Methods}{ \describe{ \item{restimate}{\code{signature(obj = "CovControlMMest")}: the generic function \code{restimate} allowes the different methods for robust estimation to be used polymorphically - this function will call \code{CovMMest} passing it the control object and will return the obtained \code{CovRobust} object} } } \references{ Todorov V & Filzmoser P (2009), An Object Oriented Framework for Robust Multivariate Analysis. \emph{Journal of Statistical Software}, \bold{32}(3), 1--47. \doi{10.18637/jss.v032.i03}. } %\note{} \author{Valentin Todorov \email{valentin.todorov@chello.at}} %\seealso{} \examples{ ## the following two statements are equivalent ctrl1 <- new("CovControlMMest", bdp=0.25) ctrl2 <- CovControlMMest(bdp=0.25) data(hbk) CovMMest(hbk, control=ctrl1) } \keyword{classes} \keyword{robust} \keyword{multivariate} rrcov/man/Pca-class.Rd0000644000176200001440000001357514145003451014265 0ustar liggesusers\name{Pca-class} \docType{class} \alias{Pca-class} \alias{getCenter,Pca-method} \alias{getScale,Pca-method} \alias{getEigenvalues,Pca-method} \alias{getLoadings,Pca-method} \alias{getPrcomp,Pca-method} \alias{getScores,Pca-method} \alias{getSdev,Pca-method} \alias{plot,Pca,missing-method} \alias{show,Pca-method} \alias{predict,Pca-method} \alias{predict} \alias{screeplot,Pca-method} \alias{screeplot} \alias{summary,Pca-method} \title{Class "Pca" - virtual base class for all classic and robust PCA classes } \description{ The class \code{Pca} searves as a base class for deriving all other classes representing the results of the classical and robust Principal Component Analisys methods } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Slots}{ \describe{ \item{\code{call}:}{Object of class \code{"language"} } \item{\code{center}:}{Object of class \code{"vector"} the center of the data } \item{\code{scale}:}{Object of class \code{"vector"} the scaling applied to each variable of the data } \item{\code{rank}:}{Object of class \code{"numeric"} the rank of the data matrix } \item{\code{loadings}:}{Object of class \code{"matrix"} the matrix of variable loadings (i.e., a matrix whose columns contain the eigenvectors) } \item{\code{eigenvalues}:}{Object of class \code{"vector"} the eigenvalues } \item{\code{scores}:}{Object of class \code{"matrix"} the scores - the value of the projected on the space of the principal components data (the centred (and scaled if requested) data multiplied by the \code{loadings} matrix) is returned. Hence, \code{cov(scores)} is the diagonal matrix \code{diag(eigenvalues)} } \item{\code{k}:}{Object of class \code{"numeric"} number of (choosen) principal components } \item{\code{sd}:}{Object of class \code{"Uvector"} Score distances within the robust PCA subspace } \item{\code{od}:}{Object of class \code{"Uvector"} Orthogonal distances to the robust PCA subspace } \item{\code{cutoff.sd}:}{Object of class \code{"numeric"} Cutoff value for the score distances} \item{\code{cutoff.od}:}{Object of class \code{"numeric"} Cutoff values for the orthogonal distances } \item{\code{flag}:}{Object of class \code{"Uvector"} The observations whose score distance is larger than cutoff.sd or whose orthogonal distance is larger than cutoff.od can be considered as outliers and receive a flag equal to zero. The regular observations receive a flag 1 } \item{crit.pca.distances}{criterion to use for computing the cutoff values for the orthogonal and score distances. Default is 0.975.} \item{\code{n.obs}:}{Object of class \code{"numeric"} the number of observations } \item{\code{eig0}:}{Object of class \code{"vector"} all eigenvalues } \item{\code{totvar0}:}{Object of class \code{"numeric"} the total variance explained (\code{=sum(eig0)}) } } } \section{Methods}{ \describe{ \item{getCenter}{\code{signature(obj = "Pca")}: center of the data } \item{getScale}{\code{signature(obj = "Pca")}: return the scaling applied to each variable } \item{getEigenvalues}{\code{signature(obj = "Pca")}: the eigenvalues of the covariance/correlation matrix, though the calculation is actually done with the singular values of the data matrix) } \item{getLoadings}{\code{signature(obj = "Pca")}: returns the matrix \code{loadings} (i.e., a matrix whose columns contain the eigenvectors). The function prcomp returns this matrix in the element rotation. } \item{getPrcomp}{\code{signature(obj = "Pca")}: returns an S3 object \code{prcomp} for compatibility with the functions prcomp() and princomp(). Thus the standard plots screeplot() and biplot() can be used} \item{getScores}{\code{signature(obj = "Pca")}: returns the rotated data (the centred (and scaled if requested) data multiplied by the loadings matrix). } \item{getSdev}{\code{signature(obj = "Pca")}: returns the standard deviations of the principal components (i.e., the square roots of the eigenvalues of the covariance/correlation matrix, though the calculation is actually done with the singular values of the data matrix) } \item{plot}{\code{signature(x = "Pca")}: produces a distance plot (if \code{k=rank}) or distance-distance plot (if\code{k sqrt(qchisq(0.975,3))) c.out <- which(cd > sqrt(qchisq(0.975,3))) cat("Robust: ", length(r.out), " outliers: ", r.out,"\n") cat("Classical: ", length(c.out), " outliers: ", c.out,"\n") } \keyword{datasets} rrcov/man/getCenter-methods.Rd0000644000176200001440000000341113363300100016014 0ustar liggesusers\name{getCenter-methods} \docType{methods} \title{Accessor methods to the essential slots of Cov and its subclasses} \alias{getCenter} \alias{getCenter-methods} \alias{getCov} \alias{getCov-methods} \alias{getCorr} \alias{getCorr-methods} \alias{getData} \alias{getData-methods} \alias{getDistance} \alias{getDistance-methods} \alias{getEvals} \alias{getEvals-methods} \alias{getDet} \alias{getDet-methods} \alias{getShape} \alias{getShape-methods} \alias{getFlag} \alias{getFlag-methods} \alias{getMeth} \alias{getMeth-methods} \alias{isClassic} \alias{isClassic-methods} \alias{getRaw} \alias{getRaw-methods} \alias{names} \alias{names-methods} \alias{names,Cov-method} \alias{$-methods} \alias{$,Cov-method} \usage{ getCenter(obj) getCov(obj) getCorr(obj) getData(obj) getDistance(obj) getEvals(obj) getDet(obj) getShape(obj) getFlag(obj, prob=0.975) getMeth(obj) isClassic(obj) getRaw(obj) } \arguments{ \item{obj}{an object of class \code{"Cov"} or of a class derived from \code{"Cov"}} \item{prob}{optional argument for \code{getFlag} - probability, defaults to 0.975} } \description{ Accessor methods to the slots of objects of class\code{Cov} and its subclasses } \section{Methods}{ \describe{ \item{obj = "Cov"}{generic functions - see \code{getCenter}, \code{getCov}, \code{getCorr}, \code{getData}, \code{getDistance}, \code{getEvals}, \code{getDet}, \code{getShape}, \code{getFlag}, \code{isClassic}} \item{obj = "CovRobust"}{generic functions - see \code{getCenter}, \code{getCov}, \code{getCorr}, \code{getData}, \code{getDistance}, \code{getEvals}, \code{getDet}, \code{getShape}, \code{getFlag}, \code{getMeth}, \code{isClassic}} }} \keyword{methods} \keyword{multivariate} \keyword{robust} rrcov/DESCRIPTION0000644000176200001440000000272714201201362013112 0ustar liggesusersPackage: rrcov Version: 1.6-2 VersionNote: Released 1.6-1 on 2022-01-28 on CRAN Title: Scalable Robust Estimators with High Breakdown Point Authors@R: c(person("Valentin", "Todorov", role = c("aut", "cre"), email = "valentin.todorov@chello.at", comment=c(ORCID = "0000-0003-4215-0245"))) Description: Robust Location and Scatter Estimation and Robust Multivariate Analysis with High Breakdown Point: principal component analysis (Filzmoser and Todorov (2013), ), linear and quadratic discriminant analysis (Todorov and Pires (2007)), multivariate tests (Todorov and Filzmoser (2010) ), outlier detection (Todorov et al. (2010) ). See also Todorov and Filzmoser (2009) , Todorov and Filzmoser (2010) and Boudt et al. (2019) . Maintainer: Valentin Todorov Depends: R (>= 2.10), robustbase (>= 0.92.1), methods Imports: stats, stats4, mvtnorm, lattice, pcaPP Suggests: grid, MASS LazyLoad: yes License: GPL (>= 3) URL: https://github.com/valentint/rrcov BugReports: https://github.com/valentint/rrcov/issues Repository: CRAN Packaged: 2022-02-09 09:37:21 UTC; valen NeedsCompilation: yes Author: Valentin Todorov [aut, cre] () Date/Publication: 2022-02-10 12:20:02 UTC RoxygenNote: 7.1.2 rrcov/build/0000755000176200001440000000000014200705512012500 5ustar liggesusersrrcov/build/vignette.rds0000644000176200001440000000044414200705512015041 0ustar liggesusersmn0 C MTK^`v5Se%nQo{ufDZ>"؄>̌=M,5:qZ'R|6ZB(xZ<|}PNF4E$=!./>M˦h@]9?%0*0F׸b%YѠ@iPS)x4lM ׽K7[ KR6>̙+g^ E\v_qy{>rrcov/build/partial.rdb0000644000176200001440000104667614200705461014654 0ustar liggesusersKp[.@Q$&%Q$)EJ$ԃ(s::t@RD@Iru߰QG#Gt{Ҟ7ޞ;W淁D&Ȅt-I{{ HSmDtynm\v1἟r*;?Rdﺌz>?W_ 6}clOf봋Y'/5ϥ+}\6ŝyvTm)&[q CU8o7VfߔRy>0~pȪX/U}mnV_[;;Bͥlu[٪2ԇ\c-|e/&: EǂOoU?smss9~19D#9sME"w@Ɉʵs;d_$ 7 >iMi(V)։EN8ZJP'B*G=L5i!Q4ie]ٰ4oWrC!g@I@9ǡ³&b?!&圪*gڡ'v( +؏rIA 罼vN@#'`Ɲf,[%P9!& y))4)[Ma1zQR?!FZ^=\IR=PIgkW^E&y^1k˫( GAK_A1cɫ>EN*zFN`ʝ,. v{LvC/pqxȮk!Lrx px dwx@gk:Pn=IO­:imAaIz'^Hv| -: NK) !Lr !lAl敃r[O?o$rp؏rwA*d.~#2%r=O gz9DѤ3j,y5Ap ԼCPG^8h!&m =n3z:5ґzNB%I6pFsw潝8%SƩz:v͜6O>f0(4/Wr [ztr3SI/=o*NR ׻n-v CZI׈b(\پU)?Jii&ʸ~ P+{XVNQJ7 g3n㳳%i1^;,&i"8+޲9'̙2wmzb:%.Wn˦k*V)B=Xcru5ݟM3.]KqjP^W aGq|9M'md! C΀8]I EM}3FuqRl۠onz8B1 f(Y'f'`A_Tqd]Sm+{M^S5qw2sV2v%c9;p'Y璲Q4HgH[>b!OɾNbdVe懽|vig\)~(f@gUNvF.8-!ڷ NEt@tAW HUk>嚡ǘs !J *f1b1"qD$,h};*ޘuOְ"a7T<Ŵ' J$5]zgO,;pBȨeCmolہwAM&8Diwk[V|K Ow n):WbCsCAW_ڦ@BFͣ5$X3&v@N_aDֻ/ڒIA0hXK&v35mm<JmmɝlNB 7`bR _ SoŌ5ul$ 4hHn0h)~Q4ߵj.s<,9o%u+>\vݤŜ@ Aaq%vvK~Cy=anzRr$HAyBD&b ZC$QDG9DMcKӖIʞ鼴E@Q['Msni+ |1cҭaݛ/D͝Dsc3܉8p gSږ(Ĺ\i vmi b֝XD 8h!9>N)j]7pP"!qh)!0pHصρnA8!bCpB)Vk6-qko'e\C6mkES 4;}آ7z)Yhz"7@eo.5 nUla. flJZH^QZ0 ʸc9]"!^7$hn8jp4\ο+ZÒ=\D #GL$ ?b"v 4Rړ1E#ЏvcRwx՚8!J oO$dR7 9nx;Yгʖtj%dGB{s pb|ZʱpbC=w pARI4qpT[kp)&^*k$<1h!1"8k>} qb (-hw}06H|m~m<LS9CW]햬}[Ʀ恫8-@ !J ==mws$*K}cEЋobwzIٜzVjge&p Z͛صA'߼CQZмW}[0ɲ'JH 26ܪ!bl$y6;m:ӆ^]Y17`~̒O,j$[Q٩Z]tmЮS^φ&SI97'?3]ԉvLtm./R654ŸAl^%uWoQu! y8g$6"vXI| t+Q1ٖbλDy5/2ygU.>{z/:/A~!~'#;9b!J 0%' T_>#!gĖ)Wg w۱.؈Uf˵XX E+J@cv/_Aٙ6I2JS;{vIxş_36 'Ȩ/@ɨ?Ker]P)S;Y}3#5v M%QZ>-FVSK T?󤂄Lh$.F.T7<(hYvL^O$ .]e'L ΋> yoJp pDΊ";!9Diz'Y?(8k$Q7tJES5?QKg,¨T X1/E\\FE+Z1I[4ptC{x!J 7{c.9$$׶G dȲ <='vFmdtӝ#6N"==N/-ݏfTOnw=2g]KTհDW@E |?_/`] /^)QX}V.VZx ms!^⋷ݳ 'cNHCض|!9 C۰+{N)1 Aqd"l~CM)NEZ鐁wqk*"-m 2lk"Ʊ@AhK 8`(ĝ ڹ})H&^V(r?E*((t"JyE9) lᠴm)gێ-AxTDaռ:A'bCGaHh{ nZ?kV4js}v@?S۶%GoC{ޮP{࡞B֒/pu2u'W/{sou(nutldSޮ+ ѩ>@ѩ4D.73R]ۛvTuЪˇ; *=-6 Q B٩HSۛ0v7hnYg*vrbbyc wm1:Y ?g^.\~{RH{ހ?]#à4p_NvfH6 TU[2{ėoc &YYm;#Uwl+%fR!\ -+B;>OlrN'as|Fif%Z!7h&>u5͝v.Wn:= 6A)LDŜ7C zwVVJ^)1 |¥ӘxߤB-^t?ok_l:u#,Mc;a@?;7}j-n|haohPzIg2ܮX;}ƈvO'c*̽:sP]5eW\{ p }}g&P}l;꺔mn&_?,>}`eu_?H1V#a[Ov7_̣.Aqvq7 .,e߼~2sDC}1o}ujgu|jO 3ᅰZͧ fWf7g7gr{0[޳Jfn֟3ΖʮΰkWo̾)YovuϾpVa;ݬϷvf7xsi~nqyi1;[*e)IGs;Š+R|z5{~s|pKa^g_Xퟸ=+W˟i?'BqEiw+X4j֡ܦ|?_7u yM>W*U &ynWf33n-wު&ww+c×_jyewXNct﹚4joB8zN^C8BϼeޝпgY<-x[G P]GӨ¿w|[mVXQī__~ 16m-u™7[r=V֤ qWE+xsvO9%] zoVˈߝ_g73.Nu~Qw*BuM{~ 1̈m{jDutaFF݆ƿA|ZSW_40Tl]7T󬜩!AB[,(b^i&"D'#R(Wn921`?uKQ4DeNRʵؤCG8DTN* β/t4av߷*~*k@)N,P ObB3fmF3}.y##9D48kY`TgA.jf՝Fel8n]W4Ȱ7lEp ԝEЎۊi>Du෠Uu7|WdOX+G 2B6`&dAL} FH/!{ (WimQŸkuYɽ3Z !ך8cڨ$/,!H&+ݒ)pCbNŕإZu~CE Αʺ~ǵmQH#Vcݰ59sp0\L&3%CI_hk>_2MMZ +e9;~@hK G@nI[b}C[P 0:M MK`mے?!hvŴaJ`Eרh00$}oԨEPr͖5FZH^QZ0 Ge:G!AcN+Ͷ 䶗%9jp4Zο+ZÒ=\s58w@'pތ A/+J*{NX 9hIظص_;҉KQZM=yl_x3'YG7AM$-з ԊpBMn-Љ]Q] hE1N_p҂~7}k^C/v$T7;VEth&'҉)mз-4R.}\S'_y17vKꝩpS'q҂>۾6G V$T7ki$9`M؝k+~ݒo˘#ЏoĮ8!J %=wSDZ( Jl$p=fNVYh{o@+N{Q Q[9!J Ze=w{ LRu =8zxT*ĉiRuUsfόj%ۭbYIe+ЯgGlwvX O=Zj ;)b!J U=a|NAHH ݧ} r>' pNpOnZݦVLR E2|:kpApغw~8&'_7 dȊeoN`A oֲv4 ֑BS'\;$v8l!@'ƵU:ڡN.^SRBĀNK.:#"G4|nwhIDdb͡D˟B515)FZhkO$ b!hvq}آ3>!Vេc<܎ivrNyo5O?;ed~oN.-OMEY6_t@-g>ݒNWΦsX/EpTΗ3{Iv@(qՎCgaɭ#Zڢ( }٭|J $dx ^6$hi]M}₄< ge{Z}gr33Kߒ$K1g|z֘?UHވ\fέ۳(32ŨAÛǛ/76_E`p  U'۰5`AY%2I=&#uu W37/VLu}Kl 'jV^喊VINɶ~X/QEp&\8WJ{"gVUX}u2(sg4Wg\=c3qk'b̴=Zj_qoP%$⿣vʶc;kaI_7cz!uϽS,G#%E g3-Akmd"5Te(FO!#E"8DQ@:#Jc˗ hoGSH^}Cy]-U;A!mcs!^⋷ݳ 'c INض|!9]RO#uXsJqh;aztE|*(bt_.۶U(;2-{AKj}(M'd8RȍETn-E!&v~h !dɧʒhޛ.jd$oߊyr<}OBֶ'=Ż%no˾6V҃}{ʹ1u9EJ<)y!aTw6m E[1nا8, ! 8`(x ڹ})܅&AKQ EVN-_AAF5^JTIsPS eiP>dPi)4S*A8 z8y3J'T^h~ Cw}Q[Tɚt!s~2lʳqv.RϾpVa0Y?onz[o.-./-fwgK~v*^3^a>bOмў>7jaT݌GbƛOfp#DC}1^im_󀵰M_m=)[aRSH:8RUEWc-ꍬtMf7_}E}A c՝|Be-w#|F%VBBkגW"_EO}gzFr·y䋢3v.QuT:N1ksgB'"]!Tš!b<ջujOj!#/;FA?W~ByWšT9Έ0DQ// O'q'*%tH40$ҖӑzPSiCrx:ꈈCnCHC%I|`4I1,|c sp z"x:$'ՋD-+x:$#6¹F<[%%F%O'^J XB~gYmv!_5mx}MG@:^u&,y@𖸄F-Q6*Nۘ0ji'q2(*hzN,c3ji[yJSd2Zcc>'jw^[PL1>bH15c|:c" iRsPM]MIOhR~Im.|Lrݓ EV䂏MCFC'-ejJM0 fc1f =j* |嶁' C_uxc]5 ;6l~+%|~džAs6Ԣ1~Xt1z AƝg$gkEB92k64,dW@Ɉ룃0PI.}DѤU#;ZpC~^0nRzkQ2SEsS2A-o_x.̬͗v fŅNZ( [6,Ubt=D6+]9oLL͒}PF;\v_wdk [\{wԡbbӕt)EV'55 CܹǤ!dn6 n!1Vʍڹ.*>_Z_;wudd{QƼW2/0| XtjynxMFEڔôp\+Y+a45JʊQ`c4ѽm.i qPʻ.=Owa".H?\mpUj>Y%nd>wM߀l#-;-h*$bΊSr E=I6j҆s7P46]b_)v DF5zi9)( [&J 'ԫ%K8=,#Z 8 o#xrݹ 䚯o,L>*aHSMf۽_)! </^}!~%v"!j):u!c=h` 8h)zxICMoZԔr60pZQ)*7Gj.1f 䖣V ?aƵX޸ka,qߦFӵ{.W/_͝bx<Ñ|nuBLn2D#gM>}2rt&7I8}DѤ[3n+j٭xu u҆Չ:NR%b j<s%Ik؏qICtϷ;ԕPPYt2i/s1VE4u͜k[b9޶w4zO (9Qu/@H^T^r"vUqh0!b!e?VbI- ij]5ˏFݰ$&7@fǑw6Yy8 zZYarq%H"EeanX\ǏsC2٭ojSߧ"4,~KM Q$u|!'e 6*uwCE ΑZE>0ΑBֿ̮o J =͛/&'i3LW6?^a<\VvkFuOmjM$80E8Tڠj Ś4#( 2L&nHOy4i,{ph;=b]Yadd}WY&9恓/V2^(8܁&e*p#< A/+?ŋ?C):\]u$wo ]}[Yw Z݆dWWɿE(#"&4ئ3IW}r 낿c_cJTkkטl.fd.>DYoȦ/_lc> n@;t&qn'#&vUЫLpy .R~ޛ*8c{.[?q{A>^^i&Y?po%u6t;mԝ`Ttm}E-5,j xtM\ o hmPC@%O1LfX& I`ter qDQ9Hvuhh$]A@sGW+% pWrjp;vvHFVs˦Of9 Zj$V?Au+lSKy;Y}\~߿IDzֹzsN_"ƀ@;/]eNV?%>&SQ 2r 54ض_ാ_Cꢮ_9тFl$i/r=jF5uސ[Mr xOʨQYx>1рM~C!Og@4;$\HYm=@Pq< I-hXH&DvU06":h}ͩ 꽵Dh~ xV%iS!v3dLo:8i[G)릗f7^ ,Dy Ա:Vx/kJ{4!$Xx:`f  .C\ NLm ľC={B&=q|'p";EhfGQߗ-:HS(V7mqb$}2@L\.gƆ#3&99?wM'AKI p T :(q]7hyFϴ˗\Z8 $۠f>o->aL>_. w UDr4c)8vljD} 'AKuh4Q64\5nMimެ:%榉0Q=hX}+՝yEQc'Y_V?OvN-4GZ s x!VCF5cb߿`zkIiESΎ&t&F팟@KdbRӁS8wJ{pdΘ;5/[fQ%v뢆H>0~C$v7V*jyX_27,$YΫϔJP:Ӱ&B3>εf1F#M5u.1"vS;(+2 b޹l@%?qE*hz땬!-S75tK3T*$!b|y9*q;)ncJMsTi`HJegصCrT&vOՎ Jš;\d:0Qrmu -w DI+~CMZ˓ 7$ǨPHR&JFRT$o@!ycTA8 z8y3$U@OOm`^+I{SDiNOA{@RK OJWUP@_Ṉ6jm'AKMd"ā$В9F8 #x;ض1PcJouY'i][ZL i%k!KBKx @\BEOsY q朰h u0H ڈ$jMzZ3W穚k&Z Z~܀YgD蠔/$ qs2IAqgoކ谓d! 7/#z.fᏠL8DIVa|SiI}.uZ+/rtjQv{RK5 I͕QQQF<-{$k׶Uzw] -ιpP<Ôo슕/en_Du2Oj}aGe9Z7\2tcI4pp=b<Zh}½ qh6‰mo0D.-ia }Yrh:q!b|y᢯B;wZ04BDVvXᢉU0$\E)`HhE]&9 FCheuD&v7FChIu&Ipщ5fةbc ͵pџDI1N1AZ.ZK5vpzE .Ȅ&Qᢵ 5"*IEO,Qc/pژlݸOUE[a|j*eEG%\nglDm- ͿŸ.Z>.2JEH)Q;p|zݐpI4([oph8. .3jhᢕedh>'oH̗دr(Zh>l 7}jy]+N& a \d,9.^P<(ͳt,)t\Q !aHfM&RFA(͜ͅEiJEFfPe YrZ--*K(ۦgEn69Oq(?!nv֊jiO0z0y!Q4iE.2Ao4DQ)Pro$AM)˰ Ҷ+PaHUg=jC><5Ka#X'&ik$mٜ ;ʨ>#~hnGcK2`5bXUUŰn2)!. 2D#48|f^QB'#P(׮{vƒ$PI4}DѤI.`h}Z9GBB9zu3΢x?  ;C/pI?c%vi}^Sve !J cI_%i1X5Ỹ /:sfΰ(..D͙/3"|FG7!.SqX+NJ]̕APGc0j{F]E;YEӠ+Jz"Eea\7vc5S'D VCqStFx]e ;!bCMox ې]*ا8DL0 ~?%gkWs(pNĘE ZE ̝͐#7Bʼnrо)(1[$Fg\4mf2)QD|y~p$KQŸZ!. K5SM#(l̈0䠄IYL 7b7 Z{?yKWAj{83b}OqO־Up*]==uh5E rXTL@Sn˟_9Պ0DQNHP!TamINE[=Kl#GwCP9vDaJy9UiO/d!bplW$p rUz9]?{H+B1EE)ݫ湠jME1W_򤆚;t7B; !^7Aoo[;Tdf:y |=&=ڬche  ĮxpD% @iSK xĤsZj+J\=%KSE>P~K;'-R>O\Iנ_L-fy Oʒ xӕ f0=ugQY'b7hԂ9gmqm9hOSΎ,o[&Meh!m޺jJ HTWP s#`[4@?cЏ[08$O߀V?4oQMCP]W\hu`jվU<2eB$w-ιS.DǠ*%E۷˔|`/Y(L6v,%h{+UJC$Xҫ9};=O !ȤT8[WA1#ZuNR;/. *ʪ:1-s`dhGo~$D[>@v"b+5e6_n<]w$vdJ΁S }{ܡRŴ  K>0e+ğ|qP<\-WMEqyy!&s;mu h! s)Gio/A˗yJ{.\PR' 6V΋%Ang@靖`tFYc9Y緧*StCnh!~E ~I"h: i!>]R{WľCb?gY`%}ZFY+>xa|vRBFBGQ`;6ǸĎ-̀ @ ɡdF&S-h SϪΤ Ut\)<|`g4#8,Ԏ,xfLK&13/0ua~r4Jމȉ`mb{QZcò:li$i qNoĮx a/H/s",lwUy&sؖ5kJ3w%%c I3ҩr59vzcQ'ƀs7~bw8Zjx/AnquatFd0bakHMݝfBF6^QKm=bo2:%@ Yq [NὔV.VFxXOsiUIi'TM/pƨ\QȢoٲŒo&8Zcfֈ=LhM&EuO"kQvšmu{$LQ4@1Y`( ͡uyD)G1ԳE +(OG]l8 gRN&6"C)S-="vՇ=f.Ow#I2 ZjB#|&k')c/p>h]4t&ZW"z|~JxsYBSҙrWHbr҂1,O=Z11%-N;o4wErX'?f 4hgA^-.F v{xW>,gO' EmzoN֛&<ZjYYj]pVLes]d+ÏC.Rd1wWXI1T,̋-t^"3ej~%YL[|OE \uZ8ӴbOf07wa7DB٣NgVJyތ1/:}sJXG0:,5& ]'金!!Z`5#} Ab3YkroWSj;Y!!ىU&ťx #ZSZ>š3İwg E‰PۿGR\P-V(rLLϡ~(97栦 z/s{:O+P0UCp"W 1;@KPIJU[a#U_5Iks*ƕ1h3* 00P4wW,WJvDg^g"%a˄5u%_)y[uR0y5 Q$KoQa>Qke4_ܓ)ٖr o΀IgG.tPY2jK>j2kT2Fmm7#ۦԌ0|MX~b&y`;lIrUFю$`0%K}3y"8D=#rqYF\[ѳACGd0DQ'!99mrYMYf5/}(2\~A_eӦWs|bY0}B/s( M5Bċ lQAC`((`G k氪8}}\ZЏ7插Bz>s{eDD:閗: E+l/'9ч;e" >XYCY?{m}$^qJʟ6;#|i@;8zQԕC+5k%: 陇?sy>`D~5$8+˘:pr nTuI;vmi\ӟ_0#(D%=#iR5$$oq[xVB4P2컖 RRU,xpͨZ]W QO_ ]'v_[h#_~,L1nLJ_5.?ZYq i7b=A-pܞKʼnR5ЃTQ]R=}?$ p6Eus/2JZ><%-PF<9I=%?ovMEC eU3letR]xye̙=kmvn9E{ڴf\eT"$sRͪNY@RrG}$;⣜,-k^`.#c|08Yг-I[F5BGߋp>r<ҕ7ow6;'=K{|֝y¥Ӹk9?-!V?X%or.ӂyrA:r_lQNvW9 EY,"-JZ{Y+8};ݳo@Z%R;jK } ~<$ 搜I~(] zw>*Ĵg ^}Yz#!K3wۨӦh ;9Mi;;wmij%#Cw {*UP) e., ] C.<.2ۋ+|)sCMfv|c12UN9f3ŬVs/x bD!w-((>ZoFT[9/mJi+Wk)ӜSlśrBS hlPi}5BMK,mݮ\CN0'LNIޔ-$K q"A!;I` )ǀW@7*YURFlL솀@_S6[/w Ո,{6i"g,)WJ4..ͫ #ާ=}-Pd,ŋQwJ@x2Ypa7@܉hnĨe1$wbZ%; -w߀XF3ݧnvl}:%>}oKקǜ%KAKmaqrt3p?V=|QfD>\/ ?ʧfy9,m,VvΉ6K0BHbMr͐f@Ky&Ig9DII^F_I#=g9o]@I?U9~6fpW&@5I {܉]?$܉&(7+1y_so.H {ۯh:wN6]~yijA_sNN9*5q1J͓L_~'vo@6[ooGQoW}s06WUOB4pt^\0i)m'LᮕEuMr~~{$.#LG:YU)ꗮA݄nkxp T~o렯+_"78D]Vݡ6w̐ hхXbEQ+d2эP!эbáXrUšvɡuSP CG'0SB2 ݸ(k6BRV 'e%c6ZѦa =٧rRZEV$hpN =k4')%!$q!v؀ KR*}\FWS$ORJr$HRJn$PIRJ, IJksZ=Tk_~AIJGA 'MRJҎqRH]]JԢ$_YK%)+bpmH&I6HRMpy$VI*~bU}&)d~4zLTSA,T~ ?($_m+fLOH2I)FCRDRvk(FOORJ"8DwRu('Yw8b4$T%$.Cq*F%$~!8Bd2!aH2Τw*(qk9 d$2NrwcjƜq&%+-HHqRw6x3Գ1qqRR('!8h}È'Yd[FS ne 8`4dTTK zw AR7#ԴB8DѤ~!dJ$IsPS=Aiqr 8jVaG#UCp8)V>^0$x,~d=a\fDc:}]+l3RNEdјr=oF:^uWy Ŵ%؈-EB]ʦI.`>":}}t*t:IUۦ(tuѮt'Ŗ2ވ嫨mPJ()EQ4)ᆗZ3,\9*lsra>T:?'3ϒW'!:UD.LZ9O+^6L?{bseHr T̿fQ}johi//AO++WL4cԭJ (Sʙ j^HPp>fȂ>7"Kx]K|%i1X@U8&BJjH 3Z.ne5t3!YUQ9pPfo Jdw/Wip'f&u$"2wb7| em!\ # 3قiBCmޜD툄I=(~;H5$IVdɶoh--Z6Fdf %1TSؠjÄK֊LTƀl6WT?Vu#n!uc1`ADlIdɇ_\TMQͿUzWBr·yCrWU-iCN(L`jvrn\{jvu5jCF5nIgYNޥ;cT3ah*\,^N~TDW8DiAٳ!L̽ZU:mDFT:Tst"Yi?!~'5|Ps*Lܳ*xoy]۴eBήY}8k .92&7->w{s–o:_msr~yԔRR> %FSx|.3&\-+ր4[ϧmQ=w@Kj_0a]t82Z6::b laG7 +aWcƛwt2=g e etfԹaCxuOɎΫ?e)(s􀾾kޞO&ϢρJIb7<ZѣN̹l/n#b?ʡɣ:n0NR>T쒨BF`Fݹ[TcHx8Rqxi84"d%54kF59R~s s͂}'.ey[䖦{"8Di{3sO#S0MtN9n 7UTx> &4i:+Na)8QMVF@˝?2$(]FpQ-Nzɤ^fɨCBJ֎V]¹&BҪ Zn0ձ Q%99DԒ>} Y= rtR%C ^EIigC&%P]8zJCg$ݚ}Q=Tsm{$=B j篔::M i k`I@%1Z1>8EQ S&gm+zs.魘~H^$ǀ?Iv

hc>MA ত_~d[Kp^!8Dij` f"vL7XQvI].VEQkf|h^} UCx 4D dAgbTَa{SVY.CW t|7 k״=h.rPHI@AYdgU-F;51í] v6 qvHVo`jIVVK[=ᓲhGѣyI r8 zbwx \N&,[x,hwב*y_QI8 z2@˭NgHA^LgR+pDzvPY . A_N̺Ne,@vc762.jo`w@K7bw>PTxV{?\-21V1 Cxۦ{b!6?IrEURY_ oȾz"<Z.MA/"?wBh#)Ry?< vCiӭFy h W=[=I6 \, ]߱Jd {ʉ&l!~RL]dJS&vgR)iL؝NhÈH\b?Βhdim}jἪ88(iPH(祮/g6vuM˖ro;)0R^ Z?4]ӃAțvߊ_#xNvźy®?>_@mcTYܛ59^t0!cv]'ptqZdwC8-S| | Z*\66b!}R{9c3}na'a@9(tbߍr0Kf1ÿ=.ܭo@rG)`[1A}byYvYp'%>hOrrqZE7zvbma&9?݆{fvߡ߾ϳ~/ҮTMߝWSUkeLMZm&A(7?Ks\{A*l [p z_} O-IIn%IfvɹlSK$~pTO>uGB 7Zߓ!(hL鉉3LgAˍ "*_4EDZ8k jSЕs]h~D% sVuݹ'[ +="< Z*Gb]oȐwd]';2r.>-rIa&A_~~^ tZ$#6_]7.~mUFeԂ0ҮVb-wҖ>|:NJ1'>XCJ{πaut<+WZ߃ρAN@M^UOgf'&f+ZK+XLW>Y})/nO3<+]$%=wBo6mg/X9M!z$s6n Z=g =,'U42+s7)罰`.̇0X$NO=1?7vv~Cf*5 <\ 8ER,]Įߘ9p-CiGu#цx&:fW^fSk8dIn(䒾Į8: `\ri yӠ[?"v3B9 0Ob0$,!mp@ ՜ou2glUXg϶jm _dv̝܏ݙZ31u~tuyJL;;E&]~߉o{OB-W8HJD/M]}o{^]v:ٻp"68L./r 4޻#oKp1)U.]Z$13Q>Юc); wθ}ʹZ;1smQMwfCP[w" MY$ۣ֦Ytޥ}_ɞ4?+-m)Cku1y3zԞ}qψD4v!d'$Π(e ӂ] Uqae@GmX\#fɰ1|/VO3"~B@?PܲYXP21!ۦ]uꩴ柪V&,NL`4L`4&WSdPb}QNA6fr>~U@R-2kP6wdž1ܠ O)OS1 ˡ{n[z.ز1V@pnv2v;VY70h - h놝)aI9&7AM51{L5$@n{=CL3;ɦK q1w"z 0rIǐ0%Wg?0Q7 x]ղJc%B*‹/;āf60E!cbGm6x]qi?\A_9X*+ C>7d,?0!"P+y౲`l/!uRg6/_x(mclFRw?KԼ}(bD8T_kĴrlk;Qo5kaJ!'9DIH)}|SAs4h =aPgW ?!\D3@5M//g?z!庬ik7r9Q[T(lsoR%*埾ȭ׈s3g&ggg9v̞+l6'^ھHu,gȈy.@8Behkhͳ ]:K-Qbj?l5+kϿ{ɰ]rj5`M=ܞ&­ѲQO6y'l^p|ԸJ"'9lWĈ|).=~2" (;_Fp>c:9d'M#Nfǀ'@KȺQi1M5mAQ`1 VːvP ySPa 髇_%! n3Ϥ.0"iZ!8DIup<%#Pɑ]'u]Bw%1 pMV1˯7ɰ>Q˺a&RQ'*P/,?6]8N\KqyW̄黕SIl !Ve\R'bZ:Nq[$*諉YJlBbw8 zXPnmo6Yt&jM$5?Wu޶<1I˞nqٯZYL c֐D \eMџXnޱJV({,84 `uHkh}ЙKCAN?#sHvFugH.{lJ80Xddqf62W63&f챤iPDV JT`,غN|( [[=lۚQۦa"Vm)$Y -î 2{!V`JUm|"btƿ؈ڂ0WRw< Eꈙ  E g,"<ՓAb < #g8DIhDXfa\߬0D(@?hsc_CwnbC68@ pn . p (9C;VB>-Qt0뚢26 qC6` 3"I Jswkm cX, y8 zbw 8ZFnCd nZ6`9: 4@L%,0D-u%fM7WaxWY})\yscvI'غ?gFoFj_m=O`nDr~Z//#?y50 ²O ۱,jMc>)G#ZW.;?I7FjzvZ*gP9q a@T r^@\aU VB1v-}4Ԃ}D2G%_~\unaNt7!MlB bݥ5$Jkf"JmPAKO:Z>i#9ssfI$IeS:Dg>>N캀@?Kljg33l !{%Z$`k3bw r͡<d)cp!YkЯ[Į %/wwb!,V(0TUSɂ9RpHnr_Kb}\dY .YUDr=h;iwp"93!&ao;;*T]5ZЦEU_q,!UПwv 2Sp0nP~4xOkI7C_Uve5CEq=c\dYٳZ`[cצ תS٩s3wr?nvgrf:kMMޮ=]]^zSNeЗE+H_ku_,ȍ zE^᤾"#um /՗ U܅\0k;[oYUf)6Ɋl (:_zpL[1Ͽ '1ᢹUMc?#jH:1ES4?;16j̙G-6Վޙ Am߱7,4]jgl[fэN}3/%Z`A_aW0|-@%|7c|2pZz#09!d'<(gkSnr z ;/=oŢ5D@$0{בudX#+OɨiCz'm1>|zE݈?EL3CDQlEwB ~=/ ཊ|Z&4fQc/ ۘC;^^%WJVqn&?@ :m>h>]6t"h><x|Z/6/ix kOqxԍQqx\(K%Yi];f@뮦0Woblcʼn4ץBDQltWc )a"“tE^7?J1r7vk)`!YA2cAh0{sovTCU BM+~Cr$,("A8z ,B#ijJYMxR6WJ < Zj4!mJ'-4hެ_k=uY.$׾wro]qsl,T<1<#TɭzJio6r٩əٙfqNdsLa{ĭ=Z{׸09 -29U}oM ~yZĐUl/Cm7Kx땵_vnf}hhǚZz>Mi󛣾lZEO>vBob4.EsJ7EY#*f=~m_)f)7{(t!@_NT,,t xFr=n-#j ݔ-6m-`)jEh#@S ʰ> ".=#.wuA`9"Q. Gq>)ڛJRT+WSgTbukЯW*/9DT*Q=di=$#+GHaQ5 *o鑾AOL6(J c>Q/I3esw~3z6dm9p3A[ sϕ٣oT=$5k\[]c `$u~_}!1[cX_^}C #R5Fwo(xE԰X'|2{`6gB$P//HLui0ftH K >-@ 6ۉ5A`M^-C\kh{S̎SêS$ª!%I][ꃢkKJU[߅҆/>%C$< <:~8,VŮ4}ExCInVȥ7>V2YlJHz8 z6A=ń -54(mp@ [] ~Ol'AK9O;⳱,M砊>=4W{ذgA`nj^07jѣ{Tb;2)I Zm+vb| uNP~ê~$oW˱Xw'Nhݹ9pT>ܝ؟P0ݯ}rYcvQ $|A띛u~sGoLùY5Q福NStnFoqs4"px>jrc(mcj ~n91wS2*ir @cQCepL=ugAK< =a ],lz iPKգ]F&9L֣oג 4ڍJn$9K/[Į z9}W'8Di31s>^!&bNzAO߉Qgc9e3M[nH2pF;b̃Χ(mN0Ux2\4WU8?aYCoLGwq-k' HN5|Zjsvb\Ogzg?Tnj?N)~~~"JB~et^1[J+ZCxT%w zwK~'@9DiC'p&0)h7 i۹}$dW w ^p`V̼W[>pM#Dw~bxjI0K=* Kq"tL'&9DI]ۋ6)ns84w4G~̲p*uf]Iy4'k\)eހo$4â4qCIyM^  rbrwNq^}Eݻ2!JgO(P+W/,Q{(HZ=UM-pG>gfj(LA}-پhGOD{'4ՎC.LGƶKSY@/4aMa{ K#\_++]9}u986,mUMqiF,aDOvҤ>$>K͙2Ts_ ^-X/RMG^᤾"#ud{%_]*}^"6e%&Q+%&\4ט g6Iz%YZk_Zkc~V%}^k!6Y;ˤ7#r"~v,voE[Ql_I78v (F_//h(CNyWOw] vA#)ɥϻ"Hh_E`D:u#bCI3UN7G'!6ϓl8T7B8TbY1 7A N&ba>UWds({a6>*Zv/z]K !p|:Fq Z*괸Q2naER#Im\_4Vt-V!|HUb?(qH`=8ľCych[C~F쵦q-@bS>f9ט/!&P)E$ݭ-jj}/ѵ/arg 0mJJjY%F~up¸,i]}Ѽ=E?$K#AفytGd;D]ZwZ3} Y;YP1b;!ɺ?OjH:풶Z=tYQ-Qj1G$;| J#bCqs*9zTa$dseIF@$I*b?!_ REUצC=-%dc czU))#KK%1c~ 6Ĝ vה}@[>r _ ~cs/_(zTy,fCPX2>S\SrBa橘 TrY\o_~1 .΢˗ݭnF`W2zJ}U!9^~Ն%+H:DH8p)̅4"h`լA1> X^R9$00mK=h*;iNJ(WV]c+jHFCkmz! ='TEUuFNh ;% w@DלᄈPR46l{怫JџӽZt&WmLUbnx`Nנ JfO|!Jf϶쏅tZ= d%xF'AO&))m[&$T#;FU0yPdTM_H+*{a\Q m,rg L;#{UL=b '+vqOQWH)ശ/➲:b"[m_=IuD#If}RsˁZ9 /"]]n*H_q$I}EFDKR5TĽdEl"q/1Zq/1ᢹEKI:b%Zk_Zkc~V%^k!6Z;D7#r"~vwoE[#ESl_> /G"up"I5HWZ=[P&*'J.7 q]FDKk/rXqoΠzuNjntDU:i)dHER#"I8paHARK4"&^ua/i=E%z\ ʼnRFľkmh!9]+m#kE6db#/~X v5i%ľC ,+N9)kA0(ێ2E rE/Z-/?*AA+ 5@o2–*8 θc}rEYй44Ԋ, /4 ^s.ʫъ_8f{cimZyAX0_x Aq%gyQ?m%aqd"Q$eI,2;,){Bl++{7&uft aDlmCL.U d0jS"h؛5.,0sd6z)HOc<2ŬQ;1v!^iNf>v3ڂwp6l^k>{$=m_S~|Y(bobC6A u}&}6>ks}~D8Z}C72M#TGtfq⚞}>1=0 ](Fqv,oĺ`#2LӋ5kJepRe_F~;0xJ ç~ 6[$ zI_~a 6>TL`t^Y6p`(Zn[7*tHk*Y)vIT>6m5'IQK\r3lc*&S&Dh9YAɂ-,PiMzH^ GzUJm+SU3Hg=zxrgb||r:\^i.kЯvb%(m0.aHޮc祱ι8󻓲~'ܰ|Wܝ؟)_/WKC[8\J WA FHwnb|aMq>aMMrΡtnnnss& %Iqcb jd ~̽L;U^1'&Nws\~r$fR6{WRΛ'!9 {4΂Z۫裎-6E;Y <^Mzx:m&9D&q^2?6zuy'\s 5MI&)m|dMbp^{cb OgQ̗a{>UK&O/z fĮx+풉Qh;&K=%3m.ZZ^OH@c8&v] OC643f$0u0'*mZ&7c>p,Qs_Չ]p 5W'8DiZdc$I Zn^ 75K/TBDIߟMO$tYgP5dPkU@캀y/;b_ A.Ǻ?Kxv!լ {{vY%vV>;*5|Zjsvb\/hZIJ_Esng#^D͞ecQ2*W^1(s*u‡kSڀ?.Q3MRbnJ V[NE NS\^`W4ɮ?cT `'EsA }`V̼W[ MkYJZĮ :TDA/<ē6tGb(Dݙ~OLsP 4$[iՇ!k>;g t&9twT(='kzfX&0fXk!a!?!J|*z+k;7[l>=l4r(b Z^i_F/X߷_C$a9smk3-x1qdb^}55%@ΗSkѥKlz׵Zz$_ϰp88A>L^M ySkp9S] 켖MS9bTNI@qrm@(ohA'{CKbFmC!(ZMrؔ,})>wVrR%-5B2nj]klxU a޸S]΂z 6xS۠g(AZ4<3UA{3$0Z}o明rG KԚH)R{bD캁AGx՗ʺ͢<,dfDdlh.he껖Drnm?M.YGA kˢFٴ<y8um:iwa]&n1bT).Dq\Ø'PL?>w7>Z +X/k$xe9*Gs v S3B٪̲ >y @-#/9շOENgQd)ʚ?Mc>"#LC@֖64Ϥ.aWZd,sP+C5g>e5CGN!E=.  56|mjxS٩s3wr?nvgrf:kM-߮=]]^zSNeЗE+H_ku_8P<;DOH+Wd: G6>v傾yw!?V.Wf#6pgɊ|~ڽ]Ee{1nț?'\LĄnW7IG|"X(oƎE3.}c3N̜i}bShV;;~Bӥv躵iݨ7cy\zՂr^=XߘYΛQ'R{>q8‘ގ":8DQ@Ÿ:vH8;h=\%l^\ ;/=oŢ5DWb$0{udXhF]t^%jJ~zIY~:Y*q,¤ A'f>g dxYUvŅo` k?̂&8Uo;L` h}[.wpئ!Z D8B(ZP!oFhB&7 7A Nc">U=\/qd J)A()|)Q*z)NN03HF)3#OD$)xi=~4 6az`vO.G8VɈ,#"UXƷ Zk׊<(QyŽqB*+d1] 6itpb:Fq x?b =5oN&:].yN@%oĮxt 18 Z~ՐmKEbR*NխB{t{S5T@/{߁5kŷ*^2}4tI캁A:g S;.?-f]A,pt:fq8z&΂?0=W$s t^׊1K%X4KU0OP-!dVȋhOxt?c޸f,-s=ة1cǦY+U{"OykM94@q mDzL{c#/v7b JLJ.1'9%{ u-t1[5/~B=9 U@n!^ zq~C;驿+S uY.$סWsn9o0\<-k{Tɭ9J_~ʭygWgoMO.s7r% \ j$~=?jܕ;,J.G3!5ʹ@-ʿk?ԯm:yX㇊{ҏ/w%8||N`<ޏN]! 6cU[5t6| σvwͶQԛ<v86%gFl ΌCč=""Et03K%L'Ta/u5KQb҉â'6Mhha6b(i܌ :HȓXzCS ˩jEuKZI~xH;W1c8ŰFϬfHK (=ڸJR[hh1Pmg9rNehY^"ڨ @I˴j뚵ZC+薟ZIA[1%p~ȂlȂ~-<3:̠L*`u[ظ \xw/3]uI׸;ij8zC "QTLbk"4@9sz w^.K8lF{D٤ PjW=:+P]0$CLq`H.TI]B%93ʡ\ȅJngCPELPI9CP.C|Ko(G8 {BO H}IDBUP.xElBM$r&\8׈tVIt+ڗh.dmL4ݸOer&[9*5u\7K.߻m͘hi.T-FCiW$7r[j^ 'υJ"eDtR]|Q_! IB*Ǘt)!IH%+:$R P.iAؼSd"Q4ȿ?o3"D4c\Q28 ֊PP |# Y8Mu8ZȿD #"nF^eR ^? xBpSQ&A#nCr)&i׀!}=@4` / ,߈o%0(>&:j @ڊL;cZE8PyURtoSrdIr3@J)sN)N2&#JL:pTt"H't͆rtBbA0CU'3O<_xeBOA?QQ|l:״uI3"KI `GE_QX-0E\+u )jF"lwIZLI=C^ yoׄo/f {~/Bg(PA5gt#R>2o v:#[lXl% D9*~mMZ,!i6$!\RmkC j< ߒm:p${phr(!\RlWC j(-hc]0!}URx';•5DN 6DlI$#>CʡpI5nb}JV&1҂}wT`PB8fLf&vAl6nbxdB8j8JT;&vAِpicbp)c6lX$!3 0T#f&ajK\‘dʡpIhbS%KE 6$KEz0-]4JE3V~XIT‘! jĮZ9.N0҂hJ '#! j;,!\Z2ؐN&!0pK9.)@ځyPB/0FOa.ii‰] %FB86RPB;kU%KUQZ|{|cOGr;‡*9ӵ%K>nm&n+%];0$!\ZN2ؐ.E'cMcv/M~u[8'wvߢp2T%KvGPB8V'pOr(!\Mt)rH>`Gh]YK {fvWm1}柢3y!:+)v`|{"߁?BßW!H9cLh#B]((1@#a`CfDM  %<ߐK^T(Lf?QPomU3%'D~:jvixo%$=J=bm\H9DIz47:.2I IJ= @fT[۹B &9N2o HJ ) \nĵGGQĪM0QnI[ ~cKjѴA?Newɷi }F埖kHR,,AdSHQ;Տt(Kwu"xuү@/ALĈ tNWҝdPd?rq @oI'ru&̀66svDNWb *+PURW9]Iir(:"r[YPNW)DNWdP95D/'ķ?r@#=}'RJ^b$"ubkrRͪ](k"6tM$r&\8׈VI'ԎڗhNdmL4ݸOer&[65Lwo"ǒnglV}3'Zӕ}PNWWFP$IOğӕD0"x *Ǘӕt蜮Q r.iAؼSdNq4ȿH> tpm6[V"I #IhȽ < TA1&"wne96۴UjqK(Wѓ.LC8/5 \QeQ9I6I $Q.IEg=ݯ|/ӱߧc7Zd?!vMM6h;#c?(1}A H S8)1&QJ:q"eM ) ;ß9!.bYjNL7ЈBix U#9xR}7cO<uSNP53Pa?UC3(|{/gڊ"*u焳 ~nk>wf@1&}oF>ŬtLƱ@=`iW1bk48-T3\ gP UF}(1iߺ(bȫ6h,)h d"b JAF N6&D+5sT_3ׂPn'@OĨt"ƈ}AAˊCAq~ٶL^jKwVٖIF zY5k'r.˴*rSO}tF ?'(AO(#j rΪcڧ1ǹODV!D<v(i*o D&ԯXiPH(㵘~nkn==(ٛl١&f;< 4hwhcDS~BCP7࿇N&"L&T/ĦPj:;OMpsϥ^S!- *2ppּ-1s81VY&bVjKS'n'I$K-8AAKzC+BOGD1NXgdu>Ӣg2 uZ#^E7(A44rZ9sp JL]ëZvzQbycsNI܁ZP[ug<+R@[3lV #o'QR7{f;A?tuO>(-KSQ>{DI&jMsF7t%׭{ hy-,; <%j|VL Z䄒4n2)6w2% XROء薴W ݢcb($k=Jᦉ}B/0ؐo&5퇥'jS5Ep+fW_:Vnjz~VZ-Q/Qr" ZP~Ѹ5l&yLI쪥e)%LUhV1--Y-D2nސV Zre7l'^ոU))r;?\y{H#_Hzi\(&T#g׻Yf9Y d9|XMPWWLQ6҃'A{~ !J7-%Ti&ZPw4hWSI[0yEƼOi\5ʶkrQFD:.7II}<:Gfrco(r0,PMFv]B6Fwq=^VjcZlTl?R>OJiQKh<輴 ]]-Rk7xKZ z7)%<\E:uIvIyMd M-_~-?|<7 $=x L-h!'+fAO#h vM*!To`ޓNY+(PQ`6k㫭/Ngh$!&3JWh?3bhso׹P:#=@NW&vA^JG'$5`tVZ3dN9 xԍu dz3/΂M~Y9i{9 ocA-ˠ%6A,w)(vT9= sm5^.! 77[bw8zLFY$8[҂'c}kW`̅fMқWx'N$Vp#K/Ih`Z `OEr~*-E2(oabw4&*,Yč vRO.*! :J-ׁ̟_QR1΁dm`{m05+?r6'TFIjB( Q -~oé]|Y AC*] $߃~|'vQ=|3B zVN*)NX`qکCgglȸ~Ǵm,JB19»&oa ҷeb JLo߹YZ>lE׾kfd|N /,(rHfƕE=!yB؄X5A܂-㨬8pxS ?ũX Uď%TABU,7@ -وe CmzAئw0^(1tz}baP_hN2"Y+՞'.?ξzz^_iݢVPe_fձ酅;scgw,妡"G_&h;uGuL;QGcD9&Y2.tȓ e2'/۶7z.Ề F.+"y2k.J'AߏMwyVA pPGDdb|Zx:=;?99=7˽F<-T([6M |6KD%^Qo+v3x +='"B Et5Sǵ\ +8z&yI: $s۠ŖC=myC)pniuܚPgnONMݙP)*%t}DΞwV)/O6gY K^:_f^\\\+|>+ӣY;_m;?lĻul?Y{6ۀàk]t Bw:gG@-/Hy*V6^-Ss9iBoK5WcfG[%Qx^ͲE&ޥ-J# uӬ:WI&~}UhU׉@oNlE3.1fJT3Zj(2pߪ=ilE;01=q(fY.[z"&zx=abHl׵>[z94O}К=јT~9D0"J{|c=[g?/w]X4}/6:4wH )4h)杴Ĭ>Ę%tkF+J*a.Ba6M2s/ ǿ7N[ ._~i5bcĮxu6ÿKo@-;73d> Yiz%+>-t/W^ĦZ6#8>,?gEZq"/|}Z(rgT)V6-q -E+a?)[f}{Ο[!#-T/E j_HB 79㎔1xkMY1"RLU47M?*h05e'رKZ~ ! dr.V,`1WiUn*[C1Z6HxnA1$qއ, ,E3xwLlv/D闻ae=hվYc֊l\àWxl<\15d"= -_M@%? *a6M m+BBXoF̙UrڕDTk L%)+*=!q B}M`z?OL-{C?"_J>Yzc 1Zyꮄ2T;x6`UwF3(( wĨU,a#0 >P-ozm}@2q 7d ܯ\oL%9 dOS~mx.i?CNIГ-0M0#, {y)@˯:;xjfj%mLPLϱiK;a2 q"a g@H ~I ϓs˟ \l9j`<Ս]sFux,U:yZpjE(k$j[p]gxpv +}p[ OlNtolZ9IoZaPD7b JLJ.1G9%+A@ yInՔ>UC3"Vgi ڊ"*éQKO eM\",ٿe#J9^9^/UrkNRzrksS swf'W9umkuJ][hDyy&TA^Ќs TC}{Cqb?G?7XHp?`:|O )ۓXCJ䑯='UJa礘=Wߧ予m #EJhGD`$([I }<%l:){x X\mjEC AmM5m Ĥ;~ *NR@ &HhJZ " Ĥ3FO;tB8z0C'#v!vG$L?~;z[ŵt !TA)h) CV8QQbRWF f%Ttj!-9Udcn"b? J=ѪE b1Z8h1Dgȴd\HYAPJGkN z:)*! 9z:aZgzWCθK:N1iث Ĥ^{o?a?t }}>} p ^\='4[MBF8`8é Nz^нאv҃~GB)JC6F)auĩSJm!4ESa E RI7>0͞RiaOCi8Xna9Uni6α{ab1띦čՕ;w30(UЫ1c8ŰmkpB:J3 j1xNʥHPzZ}!P2DT"qAW-eZus[olh298(eWAy-"^vA:8\: (獊K޷G%dnK|1:2.F TBvotJRg;lxAi7#up , 5TZ 151틺6׫0 ߃j\)8O>`a!YҲ6bA}X<բ *E'Qٚ"1?tfDR91STmٚsH֌HXfY@aHZs&bu홣[E.tς>+""uρ>'#}?(m1\쩷rI1ai4ѢVީj;wAMhƁ FD- "G'ޕgu7ٶd뱼w p}~E6b<: 7^J/0(ᖈ%7A6F91SnJLN[r൝`Ij.k^KuQZt/aNݦż d-4k@.8Z\bKw-$ px}.3N:&sx?tJh kz oL.kޘص?7&EQZG6a yES\` vI.0~jChZ-#I1-4~a-7@ -9^bZlY@kuQZxU=L(joC"@ Ϳ ?HAQo㎍%'b 8Eqn61I='= WmH'Spaxж1#g'ZװkX- pBwӛvܡd4'݅P-Ҳb`VRFQw!]z0K ̩ɤ]2i"~A։ Gڡ9og^琜W$PLd@?6>z HDIoAMv*]. J \=La.#6!pǐ_`Pndޖ&c(8f'q)[%^SQ'<=~'kGX&^PM`nW^48$X'jZW}Pj~rZctr+ƶjv;;ƱdE0^APha i : /ےElHB+'|-!mJҭq-R_M5rSz!)v.hy튉 J \- x+Ws{;?6&J-ZҭuAQ#!#%IKIГ1zd gxej~@ 9P `b^vrZ@s[ĮO (-{|}0 !-/LR]~K^腉]86F |4@ 1k Z趩3&Di3}n6ESI캀-IDb$0k$O`q0k3^^s֭=.ڸspwI`Ip|:&3 } -y4\X3I砅BZb|Eؿdv7qӬ)޶CσbZ,ku~AAw%.*S}l0L1@0SJaFaz׉Eϕf:&`:j+N(M :ΰM3h w,_@]; ~HMQd'm LlZ@V0CbDhݖ&QQbfYQ@+`0#jMȏr GN)ЧGe(@ዣ."l=]$(-/28Fj;,M3R7>N=mc9UK3~U2lLM'?@!v3tn1)$,gɏY];9hةܭؿ`|7zk'V$eJ3麀 i4rr8z*FNA :rvu[?kIi~b1غarmO~3o3Riqk> r=-\?x(,z|^'߁ _ VryӲ\fug?U|lت/j,}UЫou;x+{_z*Idq pt ͣ]y9%4\D=aruG~l&`Pjvb]_4j=vC=h./kWp2bA{|qe}O@.`>aO֞'#!9й=; ='cYml,sbVOkcHXU"Lc4B {*tWƖSy7y[,BV )S!wlݞK=arQ[ H#ܹ\;] x Nk!v}@&p,RJBBi1AQo؄R:OKVNCCSj 8-ï?{lb G/e4;¦Urۛj;X-a|APkX4.)? cvjs- \K gmb dշ|־a몫o){l/6Bx B /4$IUЭ뺪mS=$%=%)Cͩf2._ZюpE#X<{qȈn cޙ;^&^@W߀}ӫꩺg,< jJz@_KZ]:h7@HGDiaG0kxLtoD́%ߐ]?p )]Yk0Gf;qA"7pz]ZйOHKYhsnB6?:`zYwu{WF|On_?)6!A@G'ar0TQvxMGA&oĮxG9b*h(_cER `x?)f@gbB %mM TbXA}v0#jBġ Hʖ7 eSiUulfjja|^ePM_f]3h5]T}Vb6Uzf'}D'-~_I!4-ẃuo;Fqv57< Zhin6h9ifBDW*3;# 4pL27f]/0=99w;"I2|a }z(טOyX?c/s*L؎/mUbᗿ:Y 鹏2=:7|;_m;75;5f O^/x60a'U+y녟qϼK5$%FK"Rזj%z V:jQu˹fMk'lԪNz/լisKElkVI{7斥k슖(>1<&\:TDZ`(ێMVCznl:C,srʴ#Q^н16O} Q݁"vjaJف9'jJ.1'78%ۅ:ρǭ]t!DUC<^[Q\=Ѹ,Dߕjp]ִ uhbn-;-+ǚ^y{*5T)O[5oO~~l~;gYys/W9s٠MCs[ࣲӆs){4cҁV~[xtljb7Cc 7_}Ǽ؎SGG#_bǁzXCn ׎hr)93b{A1B*̗h #"RDS0TtAEM_'Z%&Ⱥ,:rxr= -lشCDI9;󮪕'%8t!TA)h8((ib$eֳ""leTTWkV!* .^ь)yk" ɽg!V\ y"2UM u>i|\>qɥq#.}5QJtv+m%O+!jp#"z2vV1`<~u"*$krl}RZzxk3ؚpYcfǣ&Q7>{ \.- mEWA/^/ K)_'p`lӑC]}3y!vC[oI R^F n|uEN߀~#-H$. aH$֙'ŏ&mBĦ]sҚQ֭= HّYJ~t۠oV9n)wO3 Z;UmG1.8pшeA>" k$H&_:Mw=F9^uC}~BC]cw&hl=&ޕwn@{ jϋ,E;BK|Nj^K3 2GSp^jL%0Dl 6rr>؟gX}.I5=zKL-u׊UZ~@Ds ?cص?&bo 4*0EblgZT /*t%2Nq]x?h6"[nHvwQZxa}ŽD nMِ@ ͹"z8z }KDt47@8:C"'F}{f\lb2{W4Ozې(A 9 ;6ԆAVnj`W횶^KK&xҍnlg}kP@_BkJVO:[=9'L mF+Vu^Y7E1(r ̰݋AѥAV/BDF$ ́؋8%K&8](!-ɻ\lw]v.hy튉 J \% x+Ws{;?6&o]Į 8Z~#!Q|)ul1Z5dKNkv]mZܺ灏I{ab̃Χ}Ax=L I>`^u[腉ߖQj)/LS. Ov ae>|ΘصkΘbX}n6ESI캔]$ c1ajĵO 'L'wsF}O^wAjhƅa:RԬ>wC.-79ZŸ́ݾt" ejW7 Q˾yy z3͸4[5N-[S׍=]Tvg _t9 Y g@H˝%{Awn4u W 'at6lss~AWQ))g]+u$[0Š:Į د,?T+qd]E" :; &p\T8<S@ځt ?0غ|s0InL!⤊u[8b~tH`*ዸ$N8ZhdƁw@ M.R^$]sq<Į}- J |u=LwLgOxIקp bmu/! % -ItZ, L\g:9nx|oǫse >:jaM(M Zh%_i??PpG"E` t)^صˠdEV } ߦ=̀ĦI 3F6mke%h${ vAfDMiƣO>;z{SO 8(@ qc Fndn#> qfz{r& JLmj^ JN)1Bvo9&!=K/ɷn!00UP z12pPKnG?۳7eh'r,>HZ9|~BH&a.,6$>7f8ŜCƼ;ZY@.`RK!hm]m5jc֯ʦg枎y"~؝-f;?vÞXwWŻb6Eotҕ}0Rx^/m!9 ۠x1y ώEHSǹ")Pv)Tj㈏i̱O5ׂs)e 0@}O+-z rC.Yqf0n|KUߛ2uQKt}LM-OeKo-RԧVMwh|ͿByVbv{B[Z09%Q\8`tZu7lȻ?ξfvoc*lۀcŶ;_쌀<31c,"΂=6zɹ;9Z; ^.fV|{cr=4wxP( ~AؼVuvM+ߟ  YqhAZځYRv`24p5ד̡ .!O+3 :xF.08 zT:{UWc74biky n)\( v׀@_(3%B=IS/Hz=x |}:V@h ЭPkEیJMP|.? RbC (^a,D" d\w}=8-ɈvlꟵR:缯í旍nS&w{AL>_M+lg!7b JLJ.1'H8% <:@3TA?} ǚ }[M;3VWAO4.OzwG/=w*<\5BrZee1a떝r˕cr̼V̽KܚS^ܚw6`~l~;gYys/WʹzOZ+vGǪJxb(P$bkPzOO%8eq|N`<ޏN]! ~HB!5Ut6{ Fvw̶Qԛ<#V 3}ׁ= 6 P6 2zI[-ĞMl[#L;6-wyo0B=mP 2cVb!w)ۚ;LTQhanR=Gz3R;S;GUNaۡ @R"i]9S 뀘E~6Aں"c m^q0"Y+UuUڪT z[ӮKq1o2Eʪ&1Ev*F>p󱵉n\D\ EʁaZ-Û2"2BL"Y' d 5/uAIHz⣥~J|/Z$< ZhP~7M:-Ir=YG0>dJ(Y'uI-q۬Ha}A;W՗.Z2QYzz&'[kz:%u*pXZwB(3ނ  _߀~#]~wA zr4&.~cDsTE,0>wqs 04Gs[؛W&3 : | iz͌>~V4351Nl6鄑*- r÷k3 Ț93f3j`LWɑP^нž7 MX^rrlΝںsO ew1y5MŸ>\Z4lA՚vS8aO AUA6H/0zdH Ա HdfM xDcn)OuYA3-w^2ںΫW -\!,II`3L]%^ 02X^-4`q,صZp٩89Q^kx |dA)9oB CfA䐖9=A1lvޘPx[ۋ'ܝ7f%Λ6%y'uU hLKl]9ki;2m;gƍKW-4{=]\7(ie|Uy(|ycrG[D:%i$}JinHDI!Ibu8 C$C ﲳ;Dv"( ^cX_= be9Lɥ]wX0SZ[Q]Z,ZyUL2.^V 9]yCgyU?u(MBY$e(Wdg`@kG$U%iNu^a,=i4xt )s]uVғ?Tos[DAA檔B'X) 5 NZX vwAM8SI96#!1@?Gdmȷ9dVڎdQK8%KF]0$A^R6JڕzخM5۫]om 2^"&c ީ; tL-LejHbA'6kҟ@uQR@2Jb@  1:'A06S-yG+3R-hR8{h13KpM9#-c&DIݘañ ; CEШ3 Li XW-8F*gtagp tEԕ~hz;M^΂MM9sIbDIMGm`PMn\g 5iYZ!R NdUFݐ18-A/dضQމ>7L5RC/k'*!s#*&;i SB(v=n>[!v'^(xK.%V1--cmu(ݹ[%K#?8B&x/6힔wT8 -sI$uQ6 JK1*NQIhW)W8>XO&gČMW@Ħ\Ǡ/Vvy8KiYDuGhXuCMfbs)iI-~5wW j*{ӚHNmB^.k"nyPNCA '4#( FkdJ/UߊwB[(cP6lKI\t,iiy ̉p {M{êsYVjYv4U /z_Ӡc;>-~'oH~{Gb7\-?`dE:.'raEm`|ý0@054 poA7$_h >0 dk*&{ˠZ/Kqgx:ԯ' x]!I: 0h"I$%(NHqQM75wqPKjƦy|Q:Y%c|';ϛxSղ;t.;yc өtVUx71 JspP.jMsv2-g= Ei`OA?M(J1҂1 BhF@.`/hq'RH4uO+V<-Y ,qMWOxɦ鮯4_rn8S,i[x'tKW5M?XVvq h> HEFt!$Xw1x?I49'Y5bۍ<5gA N>+h:Ց&:>-:rZ85?$I{iWXoL ntMrA0;Uy[x ZlAQ7^c#߁hG5k:]?pz9rѭn?~wnܮ} ^H,/A/V4>q_z;b3]5I)h%>$vgx/ lApbǙ%(boNEf@g[}CX+9Ĕx )<ݏ#O{B4oō|ŋcݑ:h̟NP8N fIjjWJ2n.<0'f9xՒuFҙjQ S1m&Gޗ 2MCllzASTY4;SAڀ8nGS ~AMs8iF'2 "tѮںw9? Ws& < |Z=Rͮ3-g"LλlVܨځw0 #Jg"kpخn1(7y|͵! Z"{n{4x!^dA*Y<#\rIJZhI2=-#EG ɷybCm JLo߹YҿKp^Ү;~K!]6f-B+o_~&LB&WUCOoA1p<8 `<.rY];|SE艐)[|R^΁ """ש oTs'vy3vu7X5vZ~;v6,ve Rӧb7ט^-tϊyuדbb:˿Yڷ5Wa 8H\ zlӛE~2JK >à`!8K? EVTY0-sO^WſL۝c3SS c˷b'ofnUmG}S D; 9_?}nj!x?TXyiV-ZpuGs mg_x'$dh!Re7mp XBǁ7AwC!3;# 4pL2Ŏvͺ^`zrr%BdЩ7|z(טOyX?cf*L؎/mUbᗿ:Y 鹏2=:7|;_m;75;5_tl?Y{6ۀày_:Tmg͡7#KԗD5J|Q bulcբ8{1s̚N.Tjo/-xElkVIY6,]dWJ$6¹nU'*DϵjP:M؉M۝iLډ3z%lFuA-qokoB4fLOt7>}?o˺wNAķd J́{þتkӢXXzɡ5\RW艓I|ñ^"2 :.A+e(ז8s9~pe_zhf5)7 Z(2v(cz wD?#9btOZ5[-Ze^A Pm~װ*p+і־Ey,U,Z.N 8߅NW'@mG |Q{[oc#qUЫuߍ1B'?߃[:Օe4#I69^}{ ^&to?4xL z3F-M'JRB3 cбNQ$k]J!l.b&NA R"6bou+tUJy#|s/Cο[D]MNрpPZ~۸ \7mj#凣mH%Cc{K+f$BiigB3 w&6ZRԅID}v;(U7$g0<1) h;{c4O} n7b JLJ.1Z8%{u}.ռ:AbA _;3(nh\3_zJ}z.kڅ:Dbn-;T+ǚ^y{*5T)O[5مvβ^sqL6p\kQ-k>W 19N>]Wj_ߵwl:?T'K-~?N5XJp?p2:2:X4C ` EWORؠ ?ňYQkmi@Cn`Bvn\1ro N26#JL:i N`rb`6衭:isƫ3I(cZBI[1(1)܎j (~̩vh")hYd3!bAz7&CF-( 6H}998g1ڔc80wcV& 2w{D' QRs ͶEJQ]s/?NaJ "?eGs4=\mڞf)7tBx`|EEڌ2oSe.>s΄>vP1]JȕpbwThR݌ Y ':E\w]8,&cwfՅ_~[uot;o'|rwb."ha_ͳ V.'aބ#GDdd씭:QQ$58T=+kg()q쌐[:]ǂaӄfy 6 | qlM2ҙI=eUuHWEb<FZA:P3LtAfF| 52RK! 7uul?5 qpHרH K/I@t &C,=|`@I='@lmǪEFJi4*N#FIVQ0(}hFtr%d.wMF-ذ͝abbp3'd+AɊ94FQ09!mЙ|UIs /B7=Mcb?`CZfݸ,v\d1j8:DhZ-#?*b3{c3 !K H12(;5f(r&:b-+h ɡ2AeЗ4B)eVwvMj2]nbd` z9D1Ңm0rT_MMަԏ"L&vj8zHXCfy gfdxN.@H'`[:9ji>L@ϥ[۠oH#;ĦAb<>-˯Ơ޾?>- 4rJt׮!($K7vƁTH3av:iS!v'@_jAFFUj|ݜ !v'"z#&}>>}DimKP$-e(ʊ5q4ܚ pL2 -4WjrZ,"Zn+Xo )hYLƬ$'п.j;6B+2'e#$2t`4^Κ[ܳC^}5 "\-vJ)S)dӠS߈pt+7? ;Ξf )p Rn)lJs'+ {x dcqlNјS춮6<2k$EQbjMmyMn'@Ƿ*EZc.> -8%,(I`+0:''2܇'I)`|KSC}{(}RAvԋEw2/ӉQRCvVX@nuqQbfO-:TL3 -%@r3JO>;z{yD]QpH&u_ ʎT+?m?1H 4k"H!WRB1((IĈquץ_{B-ދ_Gc$ ˾{-`$`Y 2yjĵx ]? JmJK &s-ĊGEێHbM_f:08lHgI6½B&RdpԮgǟ**jΤI fP|mό3 -t})kṊ_եZ0q޾t;p vg}YQ"9 bŋصA/JWw&LH!o2bRD%/jm`} H[JC*WP7T}AJ8{x:- z]}jR2mRWձ u[ˠ=}eBLTw۰C[Z0 786¹F䓏J2HdD 7ecٻp~-D>zL"fN QdҿU; e{|֋vr1=q(WY.G"dvx=abDaצn|pКMUB+aDc51) jO(˖ckSM** A]~W/ͬ;"F@ئ^Ҍb!ͣc'%QbNZ5G@?fD2"ha03B;09(PjiJڱ$i Zq0Qu/#ۈJ8u/+*63 $4pB:Fq nQ\d7O(@ $MU@uXc{ӱ -@U[(mv:GI6~VAWz=Qbz{:kEیepfJW0(>c5'ڌ EZڻ#jiƹEEԎ(q?kJ1t)bZksm6̏DnPN`/'˾im߆"nôBDI)%`dP9BwU3uO_5Ğ s"VዬxEUQKO]o eM\ZYmغe缵rXs+3sR%*i~+=7=507y6s%ctg*7a1|ϵ*WP\ӄSQ:TAnLت@ʿk?ԟm:yX㇊{Ɵ$8ts|NGFq+FVObauа5n36(Mr#_;@/k:ӿךɺ)#,(bhqxPՄrNA=dI*! Ĥ/JZ-F^PMAxTui؟gI5}[sc9 uMY5̕V(`R[e1ˡi*PwbTc8Ű^BS1mQwLV*= wO,]5(-RzeNbX) ~*.]ì|]}krVe=HSiFQ*oDV؏(nu IQm`Rbr5Zy&POIUX4[#{B5zV}xB} jZ:civԁ@/VUݸvXx ;s=.0"h_}.~i(돨>繥bGIkX`0ae &B)4}(,͒q"q0f2\HCOZΛű%3몳yXfqOp5 Jt  lk/\d+y-]ݏ wnO%%; AnCJdU> p tf} |7Kȷ]x7L՗0>F_rs 04Gs[כWܖXݲugB-kY;mH#6;&FlW@?kE#_~,jk;a.)c:z&àܘn\Vj Ț!io̎WɑP@ zLPw4bMYu՛ ջaY.~QWӧ򼎒a פAWAExy2'FD*3+ibWCI 2ilGc ZKʪ-hEߦ.iCQԬEu^yzd{`5udb֫<CDp>]"1X#va҆1:$W3uF~k$%C=DL7LrU7MQ]׀RK#J=kI>&C $yW v/jr7f%ΛͿ\}̟ _8 }yn]xmoݹ+ѓ8DRc[(SDOOKFb;lSJm[<Ui 9 Pȅt1HȦS;p ;I6:Ġpw sA:}Di+aeO.u#w,9kVuWTHJ=Y@AAս 1U=莡cr7˼ UN^QeQՓU"Q5luԭ/"I֮@ m?Ev$7IZo:H!yzVK$} |yGgMx˘" ^Ujic^8%yoP;;An:o׀ J-LqtLZ GI@lu&۵p6\߬Qfe$]' S"haU6ՠu{ղͲV@Kd̒;u'߀~<6\ؿc% $5ypڔ8N]g% ߊj>@  1:̱B c{Y;Ւ^vlX=3-?׸鎦-?ý;@ yLz1}c&l䒚1__ݘToK0Q: ΔV;uUҭcmb{FAv{;_}A]释eFŻnRejArNG`L(%Cb;z.6Io3zTQjmX ʵӍ+nr{wjnC?U=^"P @KiDIzKˠh{hrS2l(DoG@!i 9KEr sn-]*.d'taVHiЧbwxiЅHX1--cmu(ݹ[%{H ٳ4I1i닺M'ծN!Ga^L2Dr\g%i3#v*0H}CZW)pc>$+~+~V,Q'QbF f+WbMYc7xy+")_~)-Ⱥ(0uP\7vJǿ4?~RE"&<jKؚ[;p)w FkdJ/UߊwB߻4a]~ޡYL*= uwM> >\&^ްj\@rUZV(g‹liӱpw$y]cp=#vpt|]N€1h>G(QR_An 1蚴d@ f]VT~@$s/p|C%w) 78"#=/MOBxQNށEVHKQУ- +oJk4y+p$-ԹP4sMt\-e7tZ"Ych<3gvwQvhiD@?'o(J6} iCQbAԇh E=vπZd`UFC:[}ry03|4$C[סqj?9vI=PFkgN-JǤ66h;9'Oljz/9s7b Qv/ުh]^н΁iV}mr)wv`w>MKb6ۧ[xMuWs}dpڼy `W1]oDu*ҽpe)Sl[NW@/6Bf(x.tS&zh\NJ=cY%5գa8.p"d-t$>$2"+ܒo96yNcKp k@K$U"txE(;ӂ0B:mT-JRCnh:Ba7AB716 kl$s;q<06bzMZBy<5u j7s2*R%KVc̀=aٶ+y $Ig-4AT4>qla-^ǎZk49NiЧcH3~3.+hdx t4r8zDZ#svtR;ή.bTb*p|'x9i6$9zDIښ `/hbُ\?YR\Э׺ A'pk&ӪmvGP]m70'i~Iy3TC +X/@HB_2"/ΣM&`{"Ȉ% ]4h'U[To(lVoɫZ_fqܷq֝} 2pM꤫ ^<JUU輪U*wkHb~EȐT*^-jV0dnVL۠YC###?{R:eJڠHp#- Z޸!cER6$i=~xs 33;Ӈ -7T_I>ݢ+jRL̹۾k1wL5w4R%a=|s]Y+ J2m%^~N:'٘o`cmtώl-<[^s?#\V'* ҥv$s{B[I|]4Bzz#6τS>~'?0wn֢]XC6qLVZ.d%&nB׌$h!w{0 Jygh٪p|F|[3z*I CKh0Lݾ&NT/ycB>ߊ-B&蟤 լ'̥ȟ6 G9Z>𛺣EJc-y//~y_+Zv(9}JK;baPSiL-wG d\P岺>)07Ór$Y f T؍Ap= (7J׃Go*X^5hm[iOa9w+dȏ`j{!fnUmGȖIa-зebw8Z"->$IiCDd 9-E~neH3 ušIQ$keKUߛ2uQKt:6350>A[|kX/O)i}f~V_5;i!8= @o0U9x O8=KjѪۛ;c؎nn;ŻGBvo Re7-[xa&BVWܡ|8&dfg΀Dc,"W. vͺ^`zrr$>V)/O6g,s/Y vQ,W4Z#=`cWG/87=;?{'mgfglĻul?Y{6ۀày_:Tm8 ?;jH}ID]gjhck]ǩ؋`ִvrώU{{nyc0+baTﭒ(|Y6,]dW׿E 86¹nU'*DϵjP:M؉M۝iLډ3z%lFuA-qokoB4fLOt7>}?o˺m [2k%d=abHl׵Y߲ ao0z$=G () jO^vrmyS B(u 0܃xY^,Yw DJئ^%y>wx}3_>Pj[߱'Vcj /eږ|;zx;b?=q͝83+o_~&LQ'@or `E^Zq"R;HV+r\dmm߰e1ǚqKJ$dn;KJ>JVmHRp Bs=^ov>s &$'Us_LUHDxyyySrwQWRnxs/pjgI[|K,ҢyYe BNZ{~1>4ofN| -O *)]!\o:^8%~r_o?w4Wvp ?[$Z_p􈴔A[u;KB D8z#x6/|oI QEn>B$Br'0jr#R%WC]][Ӡal Nfz-Hkc}LXM:xݤ:ECԒVoyad'LZ3.?a|wF< U*V=(zKq+z|ܯů .iO@#n7 [h;Pj`ʶcS*UW`3W}AcwS&CM+'6?_M+lEItj׬DI)% *dB@KE5BW ? XVWAO4npzwG/=w<\5Br\_Y̹emrB+Wf^+Jn)UJVn;]8?{{nzjvan6ܞv/W9P *$VU+wZD+:~3D'0{F*CHyCqb?G?LW߮1V5j^5t6r| ǃvw˶Ay " eaÍKJ>؞cE@i@n`r(8 ʵssڎa#xsXNt5JQbIȅ2:L VNl/vrjN\D,h!OئV4Y ru!ik3fwt]U+Osj!=u @ TDGDI[k~c޶: CU'{~to}j뚕U;e8% :aFOA?Ѥ)c&"4{I(m] 6ĠeFVQ$kJ YbfV~, aVW'k-zuw\ lO6WZY>#]7 >d v;۴;}#!9EۖYT"0난#'clՑ Hjp"*p՜zZP ?U9%7%3e}֋LlvI;:o$o;C1cʺR慤T#BFתǁ߃^ZP=>$O<ͤ,صς_QS҈ h%RhrVRlODGՓV}dJ)= ZD:*[SL [)z>Ki>O(s"8)iTaaWApG$9DDȧzvCCb()Ɠ%Q )EhqNƁ!d79eoimзQ-<.軱䨥A4t4\"<>-4$<+ޣS{c o? -G7{ޖS"hCfu*&;ҍi53LcҦBlN/oyVyyDtr8Zh_''[,0:Npq- )wZM]腖zS8VT YTكtBNρ?`?<#4GS}\(B$ @"}\M~^X3NNG-W3gZYhjk-+&Sj | q 7Lƞ;]vxmD9ݟ0׳TD{6"`]vBibX9knqHxtT2J%DCeǃgEVαNvS~<;(ݒD-5 tKƲ>ǜ?}8 Z~-,(I~('hFܛ} ߜ[t㒹-qy%4P]Z}' I8S]gu(R\;pv+yz;XKںЀ(1@C1P!Q9(Y9s m)dx/q= UjRo (I_b ZhM Zhśε3Ny |U5-j4oDIL߂~+=3ɲ /L|]Goфgp5tOíf:FTa.*jΤI HVeTe_ H͍0A 7h;eͩZT0MYгw 9/iNA.^ "V];{Uݰ}Q$hYMC&KLh4E;m2qQR(- r#.Yqhwxz-z]}jR2mRWձ u1ԷA7 SK+ɋth;i/agl] @o`s+q z͑fr;cPpous׬T̈́6Tٍ`݊;m쌀<31c,"΂@\u.I2|a  _5S_.l+ψd&lGїا1͢VH}, vl?Y{6ۀày_:TmX uϼc$%FK"Rצ(=RV:jQQ^YsKEl\=J*B=xfܲt]ѹ&H&\8׈VI&~I}Dl̝5{θO%'[5Lw75\jgl$}3'e辟7eAķxY<g0[(q_9t-OtoZx%hL:":F"eDtR]iז8% b<A]~W/ͬ;"F@ -r=4wxZ5-1wҪήiE0>|6#bAA3 |s6_hB(aчf=S@44P8=lAw/rJmH:{Ubᚙ6it"(uL(;3%B=IS謧A%pz:VtpF?nV!1 @mvұUB+:~Aޞ8Z6#FY4 r0(>c5ݷ'ZV"Y-]sysB;lJ΂Tkv ц9r\4*r%K{脼Pto c~;N>vUCIckJ2" F'=&ktV *"MK'Zs%&-2Uה#t}OA7m!'m ĭ2N>jV+usT_7QYˎni^PͲsV-j8bDv\WlV 7AoƨwrZmZ&dEPYq0"Y+c5CyپldVB`tkXIqI(&xRz5"Y-g<\ܢ1a^5G)J"0"1H&O*tA~~…DzT~@Q~|`ܮñ+ ZEO:BIRY<>y5].^q=vZzjɄZֲ?X"z[3&l%eH6Yv ձ|yߌz](B-!?Qb3 h 9u) ߘ6"ln&ԂhnKՄjWla<s'|Yz͝9W% _߀~㴪jk;aӪk - rcQYqz"k'$OA#Kq{^1'w s աUޫKw'jT-ݮe[W­>zg-q1EA>\Z͖%25i,l}8aO CyޙK _Kc?oQmGc ZKyohL+nbcF(j֢jH^W91פF**O@> O9\[DD0±m5]3vWfьr.YXɪx Ci9SA)uJv R+HތI Ai(IwU"h+yaQR|lulB{7H{O;n]Bt{"}]ѭ=ogގH>kЯ}\7(ie|U>3ffgR1#Q!Yib6K!+)3N!QvdIA1t"驆$"*9Q[ODe'7mB*h龦iŪGE]s GI$)VID( }Cוb'=% )I@$v=ˠ/0 1q5IeMM݁(ˠfZZ>-4 klQ6DnD@@IKSՊn4wX4YiMRZSg+)44::>j#,pt s7`I@˯uvtIǠϑU"HG*.~m Apz A?okBڞN zV].:Uv-{z m!H@X:jR4>q{qaHvTHS#A.A -Z^}IZEG"$RO8ĹTV҄T[uLC% i\"|Q/8Vn$$%2;21ʸfnªn>["vE%Xsnٳj[/4 \H`U=bRg uD-;vۅ@M-byɛ-t%z tǹX!Ҝ٫ r~k #$Y0BzR #l#Vji lGA 9O]aER I#atF0 жrvC%oϐ|E Cںw?-8Ws{rHaoG;^l۷>p *̻y.N$)}A ?d%Cm^i:[+hP:C!6[ ;[\a.;I{U*ILρA :ibz#6Oڀ@HD;7k7Bx&84*[bTP6qBV: JLM7¥G6NeTKq,{@HԄJhأ٪vDC s2!y3^bES30nfOH( @#'A I7@F$?YZW^.gCUQQḌQ?V%Nь"]/^!b.CnPpzV nXZ<*UiOa9)dw`wj{%SbX?-p[ܫebw^oWl'AOJJ Nmz+gdYP9w(SՕb;0)xB}U=ݰ ulfj8j#́I B FZ mqtcw x}{x_0T98uneW/НHW_X4v^i[Ei{_lG/zsxta=Re7m.h+q];mq0i~n{`ZA^w+J'h$ ײBH'Q;赦ߛ=njA}i#/ͪE;(uv㺹kNCOo$V}5Z? :Ky*j,"gfAϮf]/0=99ww$sJ}t;_5S_.l+] K[UX寎iŵGzc4FL _pnz*;}w~NWMdوwXzyem Asܦ'U+y|sesG#%k=s_TCXX{:N^ }v/լۋnw$^-Ukl-K>-oQ}x(I¹nU'*DϵjP:M؉Mٻp~56v"LC j;{]PKwE.[P7mhݍOtϛ岿 [2k%d=abHl׵Y a7=q8o8R1Q$RAA'şV?hE|w>':A]~W/ͬ;"F@ ]zlS/Ւ;_> FU]ӊ`LaEmɷљ'(abEZӽ+j]"x!jЭ$>.-9hlYeM4-SC(wY?Z[F0fHu-Nˣ H-nP ɻoAZ jͷʲOjV#8V@51˓_f/YW0|LW('K4o!0h~{#&=RpOڮo ]|mLl;6ZR ]y v?(- rc~䔉.eu{Aǧ/vG(xR}(1)rJAx[5?AW ? X/^[Q\=Ѹ^Jߕ6p]ִ uhybn-;R+ǚ^5^/UrkNRzrkasS seͽ\I+0Hmk8r%j-[{J Q9LK TC}8AzCqb?GR#?W߮1ԕ`3VeXSJg#'G]}+7@oHWKZi7WkW@y Ò|o ~ImX-Z(^0|$w=栗_㙷[YMG?S PwRG>y_/@AKSz!@+W5~6u5'D2vv' FI/5;S$ez] ?!s(@]rD X+f9톌!$vfAQq'!Ar~AAMӔ>-bm[f$ ha'cl2"~G5ZX ATN{`g=ʁ1 Ε1f5f#7`HY3B1b &">\ZVu^"1^߁~'- ҪMY/^!.8)_R~{N(NJZRG͈x =!`C+9P Wj!?H[נF]qJr VC,܂.g zxYiŨEqEiV=s8z.9iΖLذ9pgDyԾ^4iJz"ӨvS4$=MlЗ2"Y1'#ƜҜE2 pЊ]%lwgA6֑u97Ɖ(1So"OT'G9}ӱ,pI{c>KC(${q Q뫴Ȳ[7B~WzI *l~"]ܝ J:~l'rUQY@ m b -u!~A>IZ'8F;T;4+3ܑ"2 Jr8 zZPF ZXfuNw pj>u߁_ ~A\V >6%0EKz-~A9{AR.jЅ_6mаruw$_o洿L t/#kh'JZK-QZ)4f6~?2 !44C@I|Tf ұ[EЋ63.ec28CODЕ}2bE>yo 瓣n@,9$ca1'Ahyndxttr8zE:ĴehQ46Rtǖ.軱䨥m4t4 ɉF[v +:t; ?HpJĜbϷd']:\$q It8.'m*$K-hVyy h: -g,,0:Npq$<(ic V:x) \-4͛j0~o`#-9σQO Y; <\ , L=ΦQMNR Zm>.GAƦ|1bd8 Zh3_-W3gZYhSM"ZW@ MrI!?>E_߿.j;6BNaۈ؝-mt0wA]( ] +g-YɢJ@_kJoZ o$zJD#Y47{8߿wLgOr Z^:Rn~$ ob o$12"Y+ؾvSa `Qޛ:.NBe2(@I[9y8 GD 7qA?`M$9,+WRUBsA@~:үM,ׯpHd +{-`$` ^qAjĵx ]? JmU׿:ߪ}(h Ƙ6M^>fC˾{C8ba0!k/L N)Ev'L(xpuu)I' LIFrSƌu@ ]F m5jc֯yNlbw8z^ڠ/k[1e?EpSI;נ_K 7쟐Ŧe2vZh$瓈UQ$hYG+\'#@A3 ;,ܢA0(7.d0{KUuQKɴuK]/OewfZ*O-'z?W_YdLp]%IT5#/MSӊtyw2dmg_n]5xtRe7mp t+q`23Lg@Ĩ-X`{ 8 zVZc=S'IA?lAcjP1tas]\~F%0a;ڎeK寎iŵGzc4FL _pnz*;}w~NWMd٨A+ko#^Mo{)+gDס*t?o&tu?Փ/H]]5J|Q bulcբ8{1s̚N.٨ Xz/լ)疊ظ}U',[}DoQE䜊Mp1*DϵjP:M٘;)j?qv$1ӮP¦i^R;7FKV,Mc[/aIoġf=/ }%k]3 Ck>4UV\c$RAA'şV?PVj(ז8RUAe܃xY^,Yw D}KQ;Z(A3Q(y'V#ȿ?o3"D4Sl0B;03P LF֎4OD@`,E^}9F[3 ^ Eti Tao"8-T(N~Z(@ $M5 집%pz:VP/~x"XҖfVqnAh'X]MED逃m3bEÙYEbZ'_> Jb̡Hq"љ.Q$弽k{>;-$":=A ;^e۠ 푏|`LGֿSrbĶCX=NOP6 2jI[+4(1iʶMD^'N4B${vڠk2ؐE->mqj(4r4e0wZHjgQ]{#MAKeNeFE++fbcN쫜.^Q:&fO vD9--5Q(J(=QZU~CXfŤ[p[_T#:%nWrAMBp{B78[ƍ¡~Fn쨎}~ = 2ȑF +ސ--Uj7m=: {G9kP{&+UˮnEݲn{Doz1T罣UP޷>\m䵲Z*@&e:.W5vv' FI/ uvͭ=2]xgI-zDaY1kgnևte%a05I3 $_}0r HVڰqf{#ӠgTbs=3>Bs81n"Y hf(㛾`09A$>'uIr}viԊ]~s{B- .~mɄy'#ү]0ۮ^=WX_BAlJM|{9J^Qsl-5Kx75 mIbY0?HWmߧ?7Ao~;>\0+M: Lէ0N?Frs 07^MxugB-kY2" '2bV2{+Яb\+NZAߪGxӲP{fE,O2.g{ +y3 BT6W&-.T镮z[E}BX4I7/ Wӄ\-閑Ikg9ecvv%}Bd#6ͣKW w$DI 2GlGc ZKFʪ- +/F3-w^2:w18z^Z".@ևfNv̂^z' `Rק"@WbץSFu)rwH8Jځà ct\͛eG3K\c1׀IKJe\ zh/ [8Lץ$k_L0 T2JԲ.wSaykھQo($iAp-$-UdDn⤍)h#ZdhHXs/pg'9NDQhlY"hcO3CPv3eo\66JozLR.we iMrL2\gT % 9wɰ7hiiC@?Ǡo(J1l~P ZC,<0hG@6Q:?C b{qfvpFT{Wj9·Œ?h$GڂIt޶JN&.D!Չ[;޻׼3!S%_w-3s]4\h?]r?pHIdx3T.f9}Tv=w{55Ͳ>Lr8'| ZW s22'!)J"dnr$Zv`1zg -[`m"E.D{nmFI]EI0/PEtg(b5z.Ez5o7rp] c?uyrġ)) kBW)zM*6NNQœ ;Т۶IKQ*1 Y9#3pOM~&DN@?V\s# )^7THw> .G,`5>x:b#Gef}A -Dz1k̙FH<.^J"5h_/W@iÆ՟j#ݟcSgUڥaNo> df6~ΐ ]2eiF^lQx lDw={"=䛼lߐ0R|×'Ln` (dHOfZ_7ڭK􏼮tLަ?W@7m>M~Fb$Q4c3HkK@2,*h ǾrZm82#vEF8 Cѷ PyIYzSM3̂>b¤v+v Re.厊y 6:|Wנ=.Pq jKEWަcrjtd5O=QXwvZ_ꐒk+?pOvB6m?ĝX5xtofOځ}rX# W-CH%Z-ꀖ;A*!J,oQ;J-I)I|5C^,狁~_˅b-ik"vǀݠ+KL\dIr ZjMyMk.^~p`M<b| wp {DwO@ m5$ <!)hIIz@ >,&A0kRפ9ōz- ]ttT-uR^ٺ)#8kT{/fv{zz-W戴y(CPB#mAkly:j[F~Z$TtdRl N1+%,m)ҤD&? We;44}^T&-L]nq> J0z,H\,E77r҄ djR FL|I>ӦAcq|ŵoZ-hIE?Q$ni-ݴ6R4u{_[7x/Oa̤[8Sy=s;S8kh;3|g:lky gKB znkX,i8923L޴4,pd+2g$_a־F) R*pKC}djbFX5Vy%ޅp{}Fof5h([COSpݿ!eSnӟ+,W=X?. >o?Mrt0t($vNB7ge˭/ * (8pkEvAyJ ZI[M"@"ٟdl.n~5UyX,oW qu6*kךBDKښ-=Ux5'>h˘Wd :I4J .yWx9eVP5={lQ^;"yrώhC{D>-oN'2@CxIughH %m4Į8z@ZC󯊒Qߣ?p{4I΀+gx]ze"mpOdHEBYɴun7Q*^6w,|Zw#sN6\a׼b-ce!'iNς 3~b<~.UsijMavS^K" /-L0(#=Jɳm3#1s##KE{UGQ|Uv}Dȏc/F⤋#<=Z.^t?z`|=!h4KELǓ3DXyzw? (ZW 2,hpV @,7-*Sx_`뢭u޷ ~ =a梘>tXwpn4aMh7ˠER%![P}lyُBL g0 :-^1iCiOE'UdZSDbaPO<#+?Ԃ$3ʀ"$gY})ӗfe7yD? Reqrwy_? >LuneP\?JFFi):YS% i7f~lmް;*Iy3B5&f[ۛ1lo&f>\f23YF:bY [BfV936vk6'PDy\&-R. :P[Eq$o`jY AktME/DdA|rEJV[qKEQ`9P}fE_6 QEP½灋ETb|Z~?'7bg4%h]vJJZ]Y}jbԭU+e _'VQp}MX˶vw?)e6R5r.WJ+\zbc)BJɭtŻKWsM->/ȡ﬊MZPֺkؼ,H6UVVc'k;ROWѓ.zNO 3 =|$vׁӠNc?-IgjQΙ{tvumj.v!Ɔ9V) ɵ377\xOϽ/Xőዓã{7o8\q"n{xl}Az']~ނ}۪]cl2jdoQ} >G~b}9}uqeoG>;j[K^wWk7[-{$^_-[ki|"q+.7Kdbg@>X} ElتS2Ϳ8b96vbLC j>:]PS+vzKW,YrnDgwV[2-b=abױjWkE0hК=q8p$p/GHT}ߧ3Jf-S`Podgv@MTr͑Us(b-_}Oax2*e0&oe|KޏyNr~tDVC>O78"omkwH vᖌcS1tL7;㟄|jQ)mf;Gprw20 Z;*$i?њ}A{sʼn/hAOq!XvYo8UG_z1_4JF>"H( YO0]dq _PgA ٟvk9͵BW!a.FBm ^=.&%_]b:x&| {NlS5G\[#=,-h?yտ Q?1u=+=荬bG_Uj'H[^X ,ILc!<h Bug ֞{VEߥzXN4Hr-+KEoALBaV=!Gh 7o_\w !q!OoQI]/R) b7 !i)Wg\] b%SCTӞBX~Za}>x3M1H"F.sr +$IƈSFYԨ@?pCO<U*[t/J#\;&^)M-'T%cv4L` kE9'Cmvxųeqj`3BO! WLD(*1}$ ,@_vُ#_2ieF#̣?@?S!O$۶UA&Q/4 XbaM@#8LځݠisoײpPĿ[7.4 )RJsUS < Zvj=t!Df _5M TPo񯁚i7wsXv ۴Q27?\_/ܜ1391=;3_1Qv˹{[u{{g/8R{{%s~#=|Ch]끎'cHzZGj eu).Zyc [H[=J5R%igX vwz^, Xc+jwaJ JUD#EZ&s>A#N`.".v<)ZއݠI)IHv"N+V Vv@-I QN*π '\59 FlPbA4E9a+F9OM[i8 NAOb/kZz"DK[ˌӫ2lovpiQQwڑ[tKQ8FҦ@b? sybMӡO_@v OT PM l<$Eٟޯ:nQeQ:kreg riAߗ~ۤb4rmڴhPxz:,&WyĄAߖ[$ޠڞ]A&j$Kޗ+9H\z&RxW_IaV{1?U u"3Q˽0l\6Ow6] PKPM97=*{ 6G{^,mG~+:W n*_]7ɶi 7=P;E܊a=~@'Dk73Re^g&N:ig&V3b3 0FJI5̂VP6\lLVfƀwA+:ndtVomiLV[јص?~4&%њNP=&_ƴDYp*hD`ј?Y7> <ZA#y$7jaUWy&d@] 2U tTrx&6hea1>>>0A/6I#A?Vc&<^IG+Oo@d;i9:ۻ줃k*$7z"iS!vǁՍ< !": ̂Na]@I8z\Nqq$MPhMhJogA65 hqOZ [;< dk~Mt4Rc8Н>Nuzq8 zX>Z_ω(p"=Z.@O5I-3"-w&Sj|Q7D;Pg +z`V=S.?}H#圵=K Yt%BUrx& *hh'"'Aпa)߈4P}vԵRtrCipotfvOFm OD*'پzǁS|< Zl2u$03țZq}kZ4OS*?0pX eIH-9ђ'Į8z\S@uKS}(4l۶ZH^]v$9;oO(u7knEC+XZںC4E_ѹҁM:O3 -|2)KDHtrN:qRpH&%`(D4IY9aa4m FrgM- 3/S.% )2hI.NW_3K{ܣ1V]&y}<8ΠZE ՝24.2 ZҾKjң KY?=@5RӇ S>M^>-9=MI #ɆC~Z!v`&;y(D5C **!)I/6 ̌G1Fmό3 -tC%!Q6܊mXkuFy{,0<$t!v'gZsEĪAW bֽ]+w~A4I1ZE G{IiH (bm)e Opr 0(7\Nn@7T3[7V~ER,qrL[_S͎f˯bP gߵleLjwim&z #1T|YQZ zaWuw׈ͭH6U*/Ŕg'v-͸FG/eNR5Ta{8 zZZ#^=%IfA g$9G9ge3*Rۅ_ ?Ur 82|qrx'''roNqr;Stܠ ˯b^EchkPDǁO xSîw՛d:O[O9=#o雮̍{,{c<ٸyLz/賷cSE_=L߽YEFղfgțsp1 uժL\,hc_y3lϱ3fJT3j_׋5\jgl͒u3'뼛`^oK9p`طT;X1m,z=pxJ=Q_Q~uD0&>s|Z5qЦL}v@MTreK1|VP_GDM )NFݴƇ@ߓ^7"D4S /B;0SP LFVw4@>ZW8?1l;@_P6ftazD:{x2V=4,Q`P7:p\:FqxP(A $ 3Š|W@co@ %ⷊ{6*rYp(N:+c?++hޞ8FɱbFY4$ugDK[|o|8Zwh,cD]EQno#JՉd۶j~4K 7Vs-5DqˍGlVpp){#;p/wg ZRfhbv j{D?P$#FhD 2_&m )R̉}Fz+ث1 jRρ>ZB&` ©*%nxC6NR W3tJ QM*e%X=jڶf,f+Cxrn)bvi*0"~PbMܣZF߶Yئkڶ:;CJ{IjPMW7J>29;;;T k>{/Ue+=|)RD`Tڵm egnda8g-/3 AcMd#t j"T/FLh)WOu 8Zhjbcٙ(iKd?yJ#G?l?EMLLfcRCCW_I=GǝF$[7Rq7o @/>6a:'c^Dusy#q={FVwm#o-xeRZՂFMmNi*9 GLgɵ GMQ>@SZm? ,y* rFc^s/6TCh_~ G#^_1 ؈Z肑KMx rYqh< Yp0fc+ Ajv:n:w^tt9[k%3WSbyÛ{sZ4 | Z,?GWANSSxXܬng^2&fZ"V-Zmt!Xf-u.!&hԙ:q&Җnmwk#۶S,NSiyN@POnCx'_ގɋ0t>9 ?$3XJ$ Z>y _R>A@6|~e57&u;kgK\a %=%vs ]4*:N:j5,)LX|NZ,]>} ;Jе2J]t7똥u}X*yse״eDj؞>-qȿoQHk{:힔7t8"=Đt%%mfF^-OH#h;/-z/SݣcqbƤ_ 񦁋ir G E+","le%뺑&]])nl6l+2mNk"ہ7@ z!n)[$-,h!e2gB[XޡT~:9%$dtӲ ^GCMru"ezA/Kפ?Z?/ٗuR֍ X鏄G!*$IebۇyJI$;)h{5\ˉ]9A >-UY~ Z aqB1dm@e=[FI5:MR<k-( GIxpV$a8Uo5mFr2F.&`䯼K \gԹH4 st3 \-euZ?>-y^O[s 6&׼/t*p]=6͹IIђ6,TF8UHrao4g(~A PLl~P ZV>+qV?yhnB|6{AƮi ZjkV 3Y9e8%k~J):V|Nc*fx1v7MD-lZuwq5XzH> h[K4v k/q9O)#ƶ8EZ}g',[~JV9;!\-?^GE%ff[v}x1$Y%BG1T3r.}(ShZ__!oAqs|} |T HXF^O:$m,̀\Nr"/kDeE56)5hGc=.^NCWTsܾ5Tp BdPd7-[F`HaVNvXK!vZJN_(y7ڡTް%M+sAWVT}o9@x&x^0mBxto&DڵZvMVdA|ݯN#"LG#C52Ca{Yp7uTw-o*[ea I0Ů>03$vAv*1Ggoߐ%U.]lӡF =%KүqL6ut2G oeOo짿y/IsЪ1IoA˯sW$ODS1 @?KOcMR S#7a%4ҵ{j~|ZÏ Nj/wRL`Vi䎜7^,ч%q8(<%ˠN ZmjB ͇@˻Ou<-,tzC#a`/wr4A7T<>T:"{ N&Tw] ޮѪOf,hL|}j ؆ 䳑 |> Z}S$>`9ۀgA YK$i` @oG ܹk_I"߂#AT[im)/i>䩠^k ~!Cw>]-h]|k_@H@6qM6EN[T\."ݨ\.#\nIR]4Ц_M߂~;ybh޾}`%$j-O0xb}∬8`=D4E.9b=,KC6~?F>~ ^]'h4ް֨f_1/p=("qON JFB|I9|} h1@%oL`@:h]ژR_lfϻSBLQ`aۄH oAˏy|'&tbRۚXn/;t̿il޷`f_BX1|3{baP.NSc {Z g-nrJz"dj3}qa fa oi̻IMbwx#av Ne-0,56 | Zh __bh-dΏa 44nϜ 2 7 o ^Oޖ)`t6y[&v1c҆"iU, ;|5[$8h_JyӫMV.0l>+ŭmh7vq*G~i}-A#yȞB̈́?{GrA܉Np02[ogɱܣg+m߁uj|ȿۇU.x[ ?YFQkE-9n1J/fӴ=_$b^ph!Q|c4/EA-"aC5SK'J7we,?mP o-oM>s+Oݜ5++Kx`|(K`O UZ5ϛe[;;X嘶 u U0ze= L ]/Yѿ?B.]|w#\&EM->X}gUlr/oRRWuw׈]Bm$l*h1#^sk{3m p w ? Z]v`β7#mK5%My#|̅v5)f(e}ꛮ9IͿ[$#u;vi(K憑"Yv;}qI\-t0>ft_~(E>/2laTMˎ *d/?i r}'bheE}iq! IOŲ?BEp`bhGkpK3H8 Z~e'^qڥ>SK$-*"< Zl}͵BA@wI 5c1=(&㯐pB1-{@x V~W=x& {hmmS37s j@8a҂TYA?1u=;D5z<ѲGw BAy my`1$1Ң5(_%QNO{:}cjYœ9n T|&}$.V)qmAVIГr_0q*j,?O ې2hOo<iXhl-ZvVRѴ-cW d{7cP](-i s@ F)Yhp :_}R4>W΅D@R3H\+ʉV8RHmGևb~v;ɽD3 )/ <9eՂMnʴrlkQ'wIt2H)[jN>B'ALE5~髆؟bMD24PAOou~ij5Yn$ׁ]ƽ^vmZAVi=nmoO7Ɨ37oLNLLm2,~r˚=aSc|lYc6sH afܘgZ&7OpHC :c ]zǼڎGzSG*c%99zD>GwVAtRd$hbD9Fdnh %"P$Žg;Etw:T2@4E:isOہ]ijʿێ补:is!ՉTB1 B$UT4. 6b "oQΆ qj!= !m_TDDK[~YKJ cVZ@ ,-yh[RrDZo?e\fNqQX[oZ[tKQ)6SK[2Cr6#+}.$?խVtDR-Oc3KKc_Zv߂lqmJ[eyË5˛<>?Vfm7zhKKaUE4q; ӦdcI8Z(j2~:cA4I fOoޣ󦓥 ^y9%FK7ߔݑjosh$4n$>p؜Vn iUkCײHo@,ECv Lo[4 /\#8(iGGaBCxxmp􈴲.V3^aF(^"~{iAEwf#KOg;<o@V +o:CRf9{DҝjUNl ntXeiPgLfԺB;3@0_ò_en0H sTD b"9ᔦ0☬AńԇFd$4""E> 3zDρ>' tA0*Y-)*ӿoK(A'o#L,5ўeh$\=Zl4r1ָg $R:*9 J&WDCSAb2&UNAzS|;.L_K -qA4EԲ7>5`v_ne9a~p [L-9ђ'L qo 9%s][n2F%1E) Eط3&):C]چkQA;`Zkit){6P 0)Dɯl]\=C;zRGpH&&v"5~C_ixxfFr2(~z)tH gxc'/p"}^(^/qH^<غ_ b 2BjK\ZWK/2%BkBdk9r8zrAfwz$#sSu[_4i^2L_~%]Z)ndYT&\^[o҄gp58pԧV=!mA&53:E?$35y8hEd>ƅ@ H)3AVkE w)n b#o|-_(o7ANNOThm|Is:2GE pO2LZw@ߑ܎M2&)Fp`>2I_)Ұ'indA2Heԑ 0(7R}T}+b[cdv4/ .%ٞƖk(#wm8& zMŠΪ74+a2+ֺkq7  Z6sk{3m pt3Q;m)y&Sc*b^N@_-.I2~jV圹OgWW̏H5okl~_ZVə[.?pJn{xl}Az']~ނYaȻѥ J=Q_D~uD0&>բp|< Z]dz;/=o3x@$0hHGV-U|-~HDM )NG @ߓ^7"D4Sׂ_RE5gv`C)R;0v}`fX=ӸTD!:h]`İ^,^Nu6u/KN52 :%lYгEjQ\-w,fwzF^+. w+X#oұ{g(w@ױUGc]n:#Ћ0逃i+fEÙA8 S8)1ByCiY$?IgcDq|B;lVV΁DsvFr4kvk*+KGPdR}/j/+TV: f ݟj)*+}U<ښ&*良r|-E#J+8'|NQ㠙ӇBUD*UPfM@ @cc.B&k| >DF,ݛN2Uw MNC qR5ݴ@SM AI[74huS0 oPƩu\jnkTCucVrmEkk*e ,VY';Rv*EWYZ":+B˄%%li[8/3&8ԺD*B|[~SI_F /Ǭ&hS}8n8r խe~%D4A;.YBD,'hs91-MC/)Z;ű #.Kş6(|\ k} -' j}G%ꖟL qVKҪ;&h5dy}ƒ-GVihVk?Yx8{i ~"-0 fbuX^tsy#fprndu6շ}b/CN z؇E.9 ]R3-j.Vum! <ϽUYsL7[N8;SsϥRᔪQS請M rcaYq &kܧ%{m2+z`>=Pme[]oΩ-6m옺iV2ަ U.%RSiMʖiUil8a^dLMC)vH _Wc}}aX$kvRDG$1ʺ/_ eӂPdsc">Zynm_NSS~\wc*jy{}@B$I1m Zm_uxT[e(ej<֋e KW {3ffgR⡸, k61W%Pђdᩑt"1(HDHUr"( ^txX]ub9LenP74\ٴ*iloe X' U|Uh,ٺXLe"E0r7 ځIp?‹/RQ٩u=] ԣ<K!j'i5 CtON3%vmZl3$Sx/R b ƒW II-зj)f]}; =+mmYT7|8"+ml!Vڎtppܡ2(-Ilصπ_eӋ4q4nRY3J0Sw)%hu M!W]'5hIO -0b z9 $_a- dXpPR<><\3ʖ~pzfAqwMzp{o7J8 Zhg`s7fbAԍ-֘}Da! uN z4몴[ȶm &-pILخފna N`%}2ܦ!3gIbA}r_~0Y Vr>Y/yכxHS5s3%Ax!,hy)ק]!908@/vf8FFyPB$0Cp7B檕";i/? ݗcZH1MXN,+ÞOSVUl% '҂/A=E\zbymPu(~-,NXv{5 ^<\-? e}@ruR֍ X鏄1.@TIГ\'Pq}xOc7p(x_dsD⒞''xC!ITM+6^ăǵ HA0& HQHخP($C[j3R5BcC>0A/wG Iq?h^e3Xc^Ff^$˩Ks/j1M+fj|d-i빤ROV7%ޠͦQ>8(}Z~(T[RDkm鎡GEsMk NGqAތ T}Eۗ@Qp< ~ @I2%^}A h@FV$Ia8qej D DtZhů CBc]򽉢I3fь}Bi3oP4bX9Cݯm,k[lqlaď50$9),]!-8wLwJ;*T.pxU&}Tş7o{ x t G< ZBmk߰M44vLoStqH9okeoIJchC%op_ ki2)?pǥQaD5I8^K#A@ WYVaQI0ժ:i*WZ !z PI4VKfy?TH13ϤE'?iDElx,W2k (0roaWoO]*1=G?s!M4s_4 K 6 Y3#G[?KKo> <Ze6E2w% ~Y,;F $ׂIhu[V]1==}ZS?>à> 88{A5NBY_A.ܵ߂x_RN]j.kjtn8z*CA ]ߧa~GZZ`+bmI+Я%Vޏ!߆ޮ>bCҰAR!S&Fǀv:Ɣ)`65)^1iCp?=1pVkjH3 =И8h_e,Y}!wjNZlPvz]q֨s}J zU nWm_wbm+p.$T'gUll\sMov ژhfnmoưA/w{Y}FV9665u;4+5kǘyXMjBݚ m+b[cҳY FfABIv-(ix$sR7axL!cW\-z2qZww wl^}5y%v-#⎮x {)y&⤦vbf 1lAOl:G(0966s;v$3@NݙjQΙ{tvum]yu\cÜ_K_ZVə[.?M޾9}k7LLO1vW1/}`8IW=|y5?jd7^/ѷsz'G.?7]wۙYx䳣MFuGԊRo ݛ%Qj'%ζ78=^~p\W'f}H:EرUd8qsl&iČ66L}tW"s Y$ۣuD-~݌':r9X[2M6C}6t sk>qz8~ÑýE"eD R]|(eX.OqE'R#;;/=o3x@$0huǏ[4݄~A4eɨØaQƵ}ڤ c I~+rQbW3oZ*vl XaCoW@_$ [*ن7-{k['PJ={$Gn˅{kģn#ꅢ1dƨ_%̺K,uoOzG*Szre^=Bv°/]PSwM=oR:2Ǫo8 38yɤ G}9?1}^?X6vuC_+]˚{G8 zXZP?[m v=$ݠbx!HW rP(:2k?Nw9e8!.^V˼[3u\ګ EtOQu=^AvBund0?NP۽_8۞~a~[_؄&{kHz,[䅻t)Q- :)?U(~̊RgtdE8Z~]jZ^FĎc[HHk#$d)m۪.E.<g/> S&;N+V?{u,G(1m^)rJAx\[5?AW ? ^ >3wxmMD*]Vɚv#,Y똶3h/lo?2\ccߘ[֋?tsm|?rst~}ܶQǸ1~mxu]Hv? ,#v4IJ @͓1<8RC-23C\ǃ.Zyc [SF[=U`?cU)<+Qg֋+^+MLg)2b{@!FY 14hv)s)X7{Q:CFI)҉dc]ǀ6UT4-G~M[74ht؟ U [pkc*MŌRI|wiq!}K0Hsun)C"^%/D:q:\B)v4huV123 2{9HԒ2;ax^gIsi*E+m:ƾE1H Cu9l1\o='LbnLtL'oi<泆ܙ%G"Rgݶ|. hj=$"k ^nNiU m{5_^`cNp@+s8Sc0Ӷ6bA4ֺR\^:"kQ("1z[:TX)J[vE˴$aӎѮ JZs&fs8Cv ''ut gMЧOLRCRʍ̥}d7*Ɔ9,b40tf8 zVhD2 I5JZw@ߑ{J2քG#ygo n1)UsZ0JlO3(H|%:,ׄ ` l+3 :JgAGABzwX@Wsנ_'t]+prAد0քXc%(qsX"zA >ꄎπ>~%gDS4U $0 :+lBŏaę΁V9k`2c;u@| ].)"hcW+Io#Ŝ3xwwӢ5jV[e@+an嵻<!s4.b+6 !\ay]H=a]HG`3~)ސ@ρ>bbB}^bx{b? 2x't8Iy{&ݠ_~|%vC. ZBnw`>TW⎶$\/0ťblR ?͠Rqі:LbDpNLS\*!vׁJ6}CP7Xse#pܤ ~O#>#bU}^k^k$C藛/^o4ۿG]*  A A S؟vׁD*ABf]'.1L db dVL$3(m k8t)%ΤJ-Gykg$:"J|Y:J~;ie}|ZX>9Αo{v㯔N*VF8}(2/i9~fvm?[Sbw8 zZZo~A'G4*ho?9"7Dk<0ѡ^ˑ;%Įҟ Mp^z^}YYm.W ĈjyYMmli`3W7@ǖkւe9fy4z!']+~&hML6Bp) - 9Q&bIIh_H &N0 yƀ7@ C~ Z~`5ћ8AQ4ؖen9`-H@דĮz#HL7DkB$\"4#1 p61cHLR~IUH)\_/>4/;6jzb `>8a $8[(6hEO|`֚c;~zKɰ7N@ˇUGQ֫3a쿲 z^X0E: UЫ 4g8>~M̛T)(k4m2s?sH<гOQ>~{Iޠpr@x[vx};` }=a}{k9Yo&z̖pҁu;wbALLHQУ_$k^Ext w5,Yi9T!6| Z(_%vwߥx IQ6$\26F-kfMht-0Շ5I>e$=t<`sX[E! GcrQǻ? PPo!8 e)o|s#.&}i^,_`Yܬ-n b~ FQ1Asnka!ʙ{8WK Q{doz;XM%JPώf+H 2w-MN^d'i'$g6#=Il"#CYփỲbm  Ze sk{3m eu}ǙxV_"3=% $p BuYB i7S;G(0966s!IfAo3jQΙ{tvum"v!Ɔ9TOe{z}* _3~ɉӷsT81nmoW/XX\~-sz']~ނ^k~t2H=("uuV/ѷsz'G.?7]wۙYx䳣MF lSݛ%QtIղfD'\LI7eEs]*n$nu|Y,Ҿ"~Q6hI_q?IZ;1cMM~ݠj_׋5\jgl͒u3'`^oK9p`ط=uzϘYq`͇*׀B+aD}Es1) `wT-Sܷ x͂Htv@MTr-=Us(b-_;gMYt2*e0> D*BeǠBb6.@>YR06c؆5΁N!A_%Z3 HE1/lׁsUi`j Vו4!]=IK{-K#Ҏi+&l8M3!dRb (5cOLh$?)g>-$!AնRb즚kS0HӄS&>kvVK>{7 ELWA9^)s9,) AxRNA53Pa?UfQ"ES7ښ&*V"o@Mִu`iuqncθ?_~ds+oߘ[֋?tsm|9}cfrbzvf:>nykg|(W` E<~׋V,'&31˶5iưCh]'crZGb ef֙L~tʳnhAݚVP+u߱z0oo=Œ;G>O)4b˦J+_!F$F!.]""t3+fo;J'|n$SD6dycS 7UT4-PH~M[9 hOs,1C-RPshiFM$-er'ϫ2Vηkgo)}[E^plڣ6 " ykا/^uȱ 8Uk*RW'nǰ'WdMPiFWu/{, sȟځCTdOGb 3&l*i==oJ%',=n[;*;F׬FqiSOep ~hbXP ,1;ևbyCz*9{պH7J4_H-(ҫxuW9%dIr͟>}/>yrHwYdMq/кR\ޠ !۪Ob2X,0S$aĩNu~x.D4/#_ K7LL/ ׋yuA _wG:CxR{A4AW}C_7(Oo̰߬/¯лOw42^"m(TgԀ_~B 5S۶qiã{$_/v uRO2r}bD֒?ad<-*fKEȟ'-4ub | eN_1_ 0y_?w{1^Nj|>Nu%M|RH"AiZr*ij1~hUL>ǦZw@ߑWc3wDkc 1yN]z6QْlbD1lbA4Eͱ߱a)G%Į]?aMR <}}̀(Bt-Zu:mM );{aKEӴQDkhxBkX>5e XKVBbg ~|~M倥ޘdaEWfOВP}#X>wbwE5Voj⠽ھ%urN_m*']da1砟'?p!va7ꕾdMR ` ؅]xlz GDKar;<ؤ 0(7vNIT~y)7zAkך0 bR)7I6`DM~#&&kFMl? H)+$ǤV5K)a i@MAuȤ$If)7Ssf032rrLՋB+a$RA4 O^ٌ6g2n|sFϸI:bS] #*9KDeoO0.z(-;C.CFzO\j3#R~t!̀vbJ'O4x 9/@OJ?öA5b]6Y} :,pXa8Cj6Nu?i6"s؁[K%M2YK$ۆ/]Lô E %eGi+ZЭ\§b8>h9 V}h"*AحxR؊=AN)Wa! *Qr xj"W ?`]Knqg(^[xBW2܊R)/_5)/ɿߧ 4N)"R^rG@)NyN2U MNdCMTp˴5ٗuB)/Ss7"*eZ*"C -'R^JZJ]ב)/_'RڈS^=j R^Jj/&R^JK2eZJDKNQHyRPMLy))/_'R-ES^)/Iy:唗bKp˴)/I һHy)$R^r*Ks!I~R^ Zs&K6eRkR4(NyR^JR,eZ}k)/SR^*R^&ĮA˴\7Hy)MNy)/ubJMy+OyC R^=ZÔ>ތI96= eZM4Hyc3Rpl)/lb eZMO0ȳ2)'v R^ hb(Oy)iibS^&i}\YѲc2)/^x<5Ly~"%ΒNy‥_S9`7R^rZrQ LjEzؔur.ئJ2eRb eZŦLs)/|"eZD.'cR^>3'R|u)/S}"QtS^Jb)/Eu:奤VXKAu$25gDKN9ėRrLy)R>{)/9EOI@KlKp.PrC32IWB)/%m,_q?M0I,> qzHyY$[̓_8czKNy)R^~'L=%J5d_ZK)/h˴wBs> vmo@ 'mvj_inx%$ mB&䈭`; zV D2^)O2ehX\DSvցM.C!fDM t)أۘ} E! I0eXt[5U I 5au㢦ru:F@:u/hְ*+T< =@؝N4WC4d8͋ed 5b/'T?(>50S[w)pO[2GSimuo$3 fddYAp oѻWVCkg뺵Ut]C>-RLئ+?@oō"}V8-{7$"IWAJu3BJ[VYԎNV/[䁖 O#P"H>CA,߇/o1/_QݢcjPXؔ߃:]RӤfk]0)+cQDOZ*ҟH(qDkhmߞ0a$' YK.eǓ\]/p)"cGe>8y'v'[њ12 %$Y`32bwnF6Pus(idhrz)ywg!nw' IQ*L$׆`I 4R+Mh|; lz20&&Ǵ`=2D5kkzf;XxS%}djbbv4KA>9] 7w-;X X`iG-=Akפߓiz5K]wVŦeoz=ے+ֺkؼenH6UB3^ތa-?dEt<<)*7kV:psdڋcc3$37'(= ~:b~ܶn.d0j.ɵ377\xOϽ/Xőዓã'<%ޮ<^~*[x_8IW=U7GNGލ$vzPDyU}'G.??|&j[icSEl͒(jZMンm %W&\4U&I21s|Y,Ҿ"~Q6hJg\O;?fN̘i(aSGg j~Ŏ_/2p瞧E=Z\7KNr͘8PYn*{1ůLzp=abױ=cf9Y {,p(FOR_#2 .OGU3b<)M۴B&Z )*݁x97A~,;"w@Qf_GV-X{x]!53,:w3L|!=ߟ׍}8j W0A8 bp)D@>9BbbC Ny9ap|VSNH.7+b:myB1\mӪ>-Kl۳`K4Z2%i< Z&i<?ݭ_DSm%NJP纡I?0(7Z|8nj$?K/Hp,[.0\HmGck9׻ vau&YmXGrr0CP SY-ys1۵-YhbV BDS#AGNnZ-As#hrJM+l,4݁:OVW*j@W ?Špȧ<5M uw]w_Zm|&kڍ:6nqncθD6pV(1ǗݭRɉٙm筝-lLPej%q#2dn#hL %"P$e> ݝN2U MNZEVP;K;PRWR+V Vv0䛩<Zv#M-L"Y5JE#j^UbH!gDK[ f'!j-i#7|DT1u(؆[ؤSyxАܢ[+"=cMN;aCb}x zI>;qh;M8%| uZ% jz(Y}ݶ|/ tp!C"2~:cA4I fO7ʔ{Ԡ?k{~jQkm32/#l\n4nL?>T[ǀ@?fVq{Ͼ^,8/{~x%F~lb'Fx ؝^}]Z_u ?P&? ?aYK/!<bvƢ'eBĦUUEYRIEy)oG37jEea&NM"nҺRb}N|nCòCA4IK:N"q*9BDkBTDК310uqDBҪٲS#ޫqľA4AW7^>eM0Z.>'  z]BZuvӚ 5=Kn4 < Zȹ|Bi4?`O\"۶fKE (`V/F==m~w8 |UNZKvbA&x{L{U)ǎKcݝkp&P0 gZNϜfPx7/ղ2e~-DzhUv>禇ZAO߹ 5387w˙oi:7Af:7g뉫uG…5GA&ĮȤLۏuњ}j}Lޏ[S|N܇ԧEVLʉʭq91?`]LI'9qbY=}D<.ReV`g&͛eCJib۫ONkFK5Qmל ^YE3W/a䝜صx?e N~"л8y̚xNttrbAN>I^]1/GaAPy1NZA?OӉ њ'oey=Y)Oәݯfz:?͠ZO1ayuQ 1ʼn+op䝝9/շjKrNDk1yg?#3u4)?gv؉y~ޯ&,Ԛ"?MFLDsLWpby幧p1KսQ z Ħz# @7DkB`&ao,\NqM⛹&GO2vM[O! ,e9G ߷m3_\ ; /v1l9: ;?k^Z@go>mq}c7ht vZm :@0&AYr^-cxY fXlZ5ff-tj`o8iE~_}oiuQ_@j՞ǧz ɮxW L޽}6\vNv`7*﫝 ,ǷJңӟ͜Ү̵)"8缮Akպa!]؍AOKoMְJP G?&?$gm۟@$NF"+h8/9 ! C:ro 2hX'^[ DS Ծ&v'L 0bdjMrRs`2k ;]ZpseqLr ~Q«7vEC0!Pzk48h}sKe Pֻђ@.Yo$d{}$̂ {}} 7Г6=l~ E! /-l;tX61U,IQ6܊mr0,p)}~VK㾤}b#/ehp Z6W&9I7 (-K&v-bܢ.AGŸ%u_NiqK#74I&IfŸSs櫁Z}s_?q_枬>iŸIAFAۛS[K5BŸՊX?)ƭL$q+.kLd$nHMdKw6&Zk7.2ŸE՚j>:{ǏYI1"6u3'Z}!@Obܗ'Z '&2 .^7-im$q|bܒ_!3GT1nEV53,:3}Oy݈gMLqY;uŸeZu(P>{G,KuкDLi]b B1֪DK//4ڪě΂M(6W42hLQ΃IŧS7;&QՀ*߀:ooAG?MoTZ`=j#M&Rb (5gki 몁 ~1JUPd۰(x&k أI2&E' ^BBDSSPav(xJ"F2Q8sPaDQU3 uO_5I#j\|iQamagTSSlUOL:k C ScĶ~C@\ꁧL#DS0E'{A l$=HVVKxP+ĺjcbAb5}FQ3Ϥ&IT̴C1zPS=PIka7Q=PIjs!#Gjs M_[:ghj-kUk_嵮/6[GC|"3*I2lӭuܩhmװ⟄A~]8 Q eN*QsG ANytB1>+X;}z~6=t"?vEp̮[JN+J hzTz\h囚ی| sK&k ]Pyyjp}Oo?a ANYSYsL78uFc^/2. K/y+"E*ւEs\ O uV׷]e`%6ߎܤ #~AUڜYݵJ_M&̱BBA/+ Wc#K%=ZSm:\#+-t2&UcA#}ھ48&(<7zu.fEfp?7{{4>RuF9 ܰap9G?'R7{fH tm=ʬIX_߈߁]Of-u?c?7 H6qǕYˢ靖^vfUM}^?N{DMOOZPUR|SrƦyo$XVF_3ʖIuPh2ڡ0osg7~09i+RL΃WULulÊ;MZ81#IO;.LoXrbM4XdːmH}bɠbyaYqhv/c?(+38_ 4[o$U A IГrX4 D4Eodu(U^ L ߤ(G3 G9JTJ~A4ɯ @5a8ރb}PR*ljI=ڴ}2ULLbH)+k*SRW2IIv U:bRei@LAuȤ$If2Ss@>9s/~A2}x_H5UV=MIvu92տT.*SyDRe*(TʄP'O"/Tژh̯ݸ؟ʤL;Ħ0Tk,*?Fd%2v;d c͘hjL-ZDdZ 'ԧ$2Zl$ U˧ʤ56ڦ^DRe|Tҋq29`DLᙹHQy=\ 2%G般8JIu2PKP aDLa7udht"h= h!yYkM[1e)b3tPq*P"WиTVD砟PbA4A//2^|zCO2 ڞn%#S$iX5o1(v& 7yӡަhT7P)qáQ7lKo.na%-G"uTY;--2E8zHDV_vOG?fMRS卲ymnҞ:WM<]8E:*H  hqR@?R撱n ciMkוH 'W_Isbnũxi"ۢ)s -* LvH +$o;*Һg~nX!FE?ټuxӉOӉС ̇صj+&#"ԪEeSL'K.y6iDa0aRJzEcVZV]4%s`!m|*LE7[]oaĈ7oe$==PO1I3V 7虛 5{=K7Lw;0i&6~B$uΒ>}s`2og/ V֘ep 佝kKvbA&x{_`>&GV;.u>|>];-grNO3XL/+[kM8LMG/"۷$iX{;7k}?}&Dks3 Rqn|ݗӯH8c؟fPsw29& 9(ص&$Dks<'3f:i'&vZ贝XdPPHԜ8b'[@)̲]+lbͲwenfivrY3O$,yvp'^DO@?Iɉ]+[ߦ)hMp@>3~M33gtrbAN>I^ĴCvjO'fLӭ砛pvؿ`P>nf&Lٚaqxw3=XfPz~Ӱ2>-T;9nq_YQnE] _~V+Яwvb ZͣI^NyV>\y~ή}Sk<~57t*Abyep1SսQ +דĮz# @7DkB8)mۼa$&G:M\#'T&פvg`5y'vKT {赦?[#y?JBZ_ s'-!؅'QA!,,%D4P|EŶ"/Z; p|:f-tl` 613 Hŗ_@"-d6QcV+@h-qZX#&yWӠ cǤ?|[LM8zJZ#,L%wF,0:*pgu-ϻZ@? DS]E6* TbF^E9k +CZZ|{Qo5_(2ra2&BR.DS4"Hs/*N? s>.%З}\H9DKz,G"YPZyH\NV0 %x0qAy SoHwkp`|1@]_' >LO_`ڣ0 <.5zZC8bbS%E|ſFÑ p{4ّdP_Z\sX6Ce^7ʆ[MޥKOh ܦ~ %9#DK[0}uLkNS.yKcZlf啼e1^~Oe6p>(.yKB#JJbJ2enJފꊻF[c8(y+:pZ;PVt*&Q$M͙G(= ~(z"Ւ$ #[)y}vjE_)yL$J*.kLUR$nHdKm6&Zk7.2%oH՚j>:{ǏYIۯ"6OسxZp-D4rٴvQw4-$> B7n#ٶU+|b7\(nѷ/IAܹyh=,CգI;$屧 ^B BDSr3Pav|J"fF2W6"JuOP57~髆؟bP8Skk@'rIW0a1((?R;k ա߽DjEE?^Pϔb!vP 4 -i"Ɨ*;dUBDS.Ubw}FO0OK5u="ՠ\jCSV E9ղxWHx-u#{xAB町"=Pin-E>\u-`"}I*+.;C ]dqnvT`rئ[ˎTY үq^|_S*ٔA>+4]#aƀSyeJ: =-a_Qk\$ )ʾH'ld mھqsʟ3&hGۡ$?Kw3#z._fKw}Ƹ4:wNbm.BM}O  H:(GW`&GL>_TgK_fu*y50fFx 3i'y|^|/ :(;ݟ$~1cΊclDuoZ543{v-ſdMߩdT* x﶑8m )ύG݋ ~Ru O%*K:U;H5cޘJ:?A6{!A;ޗ !ڀ={YaA>Q~wDKa= aF"~`}%kΌ ~٠ko`=&gA˛P]UR|UƦ}o$XVЦ;&im@M ZTBf%m%+?ղGT!.S[5)=6Gh2PNr*aGQ2\6<-hJF֖ny;8({ANޖچ,m1WZ D6i?ČɉCѤ{_]F䈔: Wzlb| j}M(gešT12vč2#VAM3 sUfʱ[p XvLs )z#;FanL3 ʹtA-%&UC8& u $dV+ЦQ+br`DZQ]qD&QKrLj*#K19juv G:drԒ$3ځ9@>9s/~A9j/@ =jZvzPDUR>PZ"'QL$r*.kLQ$c?L־Ds&kc9jvb*6;TfꣳHڿw,mT_7cz9jٷ䨕|Q;8A\}sԒH-fgs^ԂUˆ #rJ/%~Vxf.Rnx=)6IEx%ߒK(?a8^нX*q۴kv~A@IГ,Qm?MO3($/]v:A0?EkE@4Q`-+?9Rp{xyQy>eЗ~=Nb dhYѫ ) q*#S1AGDtҾ'v˝`]HrEqn,X4EcV2ǖ%E*lypv___a7;VAϚװݠFqk:nqpsS†klP0cz-4ŵ<!k\R۶Y(O]>- EA,BQ8!1w!^vd Ijޥn[Vloi Ip&B@~\kjuqzށlmvL#vCTcg`dbs7π>#-_e!S0RMR%)ts~! MIS"Lk^m|D& Z̾;1)m$aY= $=%Κ0鬥'9砈1m^)E&0"uuO_5™#j.^[B=UN.P"ϭOf)ԈʌUg(WQ#+8FlO1X8Ĉ<)R.]""-+fo;J'|n$SuD2`с0u?h!yɭM[74uw0@uIyHUK)ۮS݊Q udJG : 霯fy~B,/@H_%hڡ&Z4h1LR19;!6mJK)3Zm錶oR\&u43H]`.1`aN$k('?ImnۦؗZO$^ >72q_~ oDtQvDjp RuFwl.!C"F8P|{fk_ѪY^ȝ-c4oAMڈ;[[JEkAJM4%)g ֭ *L<#<.~"9,aL̨ZҚ31Ýy ttO>!""H9/Me Db }s`Z★}llZw8 |UNZKvbA&x{E[r츴a^`v fRNءժtfPx4/+[kMK LuG/,"{@K޹ [AO߹ 0 cMyrW|N˹]΍*unZg -IsQУ1k^}M^5~L3?Tc~+։I^7Iމ]XV$hxĞfY9oګD= ,ص8&7l,;x&T;2WCfzĮڮ9K^Ĵ*9|INNmNN zz>aN:MtbA>cM6 }#8v OҊ2yg'vW_~A&8;rH\Vx>}z#5=oW\}۠z>~*{> G^z= @Z7~A&&WJkr6o`&Ǭ5sMXdP\˄"kOZAV)ZE{h2 Oo` TҪs#sͷM-@0&ꏳ+ FR^-y;}]bXl1,{f3F͢dVtI}/2K!țVK3{Q.0+E܆IN31NR}j)Q6ܶYvF-߉a}F?jW>>i>Č 4qG,s;C9q@Q(<ˬ+[Wχ[}C]4qA4ECPٝ~0]AЃ-!ђ9@.YPZ.0A\fAt4 g{[mR' /\أ:_@ފ 2)n b>C# KM5Air.]VqŻG_^Ya'\քIl(+LB# Kw1e] 0 Q`DYaI]&9&Sځ)+LeELeI}@YԜy8Pk32TVxG8{BOZVd:~C9eտT.TVXS$J2ᢹT~UI[TM־D 'kcevb*SV8[UfꣳHYw,m_7czeٷ|(+<8AJ=0aM0Hwe/i*aDYa^]YK-ˆ’_VF]dQD1}orJ-o%S버s{2MTϗUSrfMRS2[hxm/'YMMVsJ ;#ȁ$;J(#l\n4FƆ5TOA Yd4F5T=gIk3{Kb[C\LT,X(UҫU֍}7{xF{3p適B)-&߶AxﵮX*mf\nɵQ.pd{SBy3 ) r/jJ-I0H˩cfM4lnRf.iЙΏx1cRGIwvlsIkJ(5y;S1 50:l"r8 z6{΁SȶA6wT$]њc1j2:kѪ6Sb < Z(ʅ5bA4Va1VTVPy˶ʬPA"66| uNڀˠwb TPu\I-4LKCV(55D yqrHhV&?"{Dih l\)uvB|"Gn0@ے8cnyV-$1 ث~-3v<0;sza+lU6Em蟒{bޘߥgњz>&騖d.]]^t@ISf|^Oz@˟[?9G풱>"o: /)-F%hb%M$q*RD]Fڒh# bA4E_s H3 {Ut8jvUq5kɿa\VaYߗ*.[EB#VI1e] 0l]#VIꊿl1 VGL*bw8([%U$ vlUj|%Pr_P٪+>/HOZd:oIeԿT.TJ- PJDIR&\4טBj?I&~^}JDV}TlU!ZSGgU1"+)[Y$գnDSVo1([%>Q*̝S?U(+[V#ڀg@Q׫ZE]΁Vw)j; ZXSLT-ִ ZڠPiy$8vٛh^x2JQ| B Re"H^żvh~+k/GduOV-8NuiBɂcb]6Y}*Ia0[Q6ȲpiɇcAS9M2v$ۆn3# Q`O4V& B&RZ!} }yxmM &6w_M4*{4,2J_Vq3(r4&T²+.:.OB95q 0'M@|H1}ptzght&|Ѵ",2Z|cf> ci1HECY҅XF@- 85i|]{EX.b,ôE/3aXO+ Q`a{`+,^PhMqJ$A?L_~A4Ej|NWOVuWUz؉=̫XRd'?)SгL~w髗`'N`+r$=]UCCO?fMRIgkD䡗#e'/AT朱 n +id(Ke҂tѳ\^i+RSys6p KO dDS!g14=$zDT]n a]BNI's!I~ ==y5gbz@d=0~u[ھ-}р{.9`]jNԉ#9ZݪX2zzhxt:& Z@ߒ7Sb:bLc6rSibOqLDMV>-IB? `HcD/psqub |H I$/P~4Tݑ@I-4͈l4A3l جX]Nh6vG,s?sx\SE!IȢh C@f#DѰ=&5HǁA fbwT3ꅢyqi{u>wp9ך\}X 3{SE! .cXܘYgaHTʠgEg1h*gE,:$viR ,pDIvqD1I)e.c^C&ZXKICbaPn"1ΜgPMecVGeKm3ރO}8c Ș'od#vވyΘGG$uş1Ni2I#&cȘ':ȘGk2CZ}s_?2 @s'R͘7USD%UܼhR7Zʄ&"o׀@?H:.@/NC}an+l >àhأ.G`]rG^0\cds:G61su[R ,1$H/rB6Bf()) ŴR&2%dJ֒ᖄM$`G;^|V ͏iMA>à\ :pU,_hN =煏 Bs!s,m>i폣9e"Awq(boA>n/¶ya9)لV˯{ˆ_t!oP~]eP&nz)\fٽ!_4cߡ=wUU2랪a_J-b]r1"$YEm3릥L/DSِES0)BrF^HK9 hfi% I'=kaQRb-m1l3pIK'h>5WafO#0۠o+4aD8 z6}QcMP{c37Dhd-7]Y 2:UaskVťTW5+,ųVBI2=̘cwBU iԞ?/MbVL[HSʛ WeSY{q}O @.O#k˚J^A 61k쐎K]|ާ&|@?f&+;;#[3)K $6`ItE7c#nݩJTUYƽΚ_0oCoy0/Y:kNO/BUq,hvW;bqɈ/ m]0ʄWLjOƕz sV"] ^įB&zBU2pI}2hV1$9 !sйw{QH]H;i9?~QaT@< ;׹hhlt8gU&pҢ|L +-$݇7a{K@wbEO)R\(4ʽFi0H[QV]#fj>k^î^&*q[ C67JUR7R3(N dƎ*",XT҉po.eI- ݉t?AcϧފTЗe Re)QHh ;9"}OZ]ײ}(̚ҥlЗ,*lmkR0ЗEǁV}´D d9E_xԝЗ)F22iC_Z]eYx4P/ї9vDm 9H G/Kq;ڝң 7vѦ/;o}_fwL ۂՃaGi<0LH/Ib˔_Aj C_+y2c 8muїi#}/St}Y2 cuїe֘a{|2wS>‹*/2/#kUN\r}B/3k 2cA_f̸x Sf$?_eƘ*}\:eC"Pufg?~F8U~S2.2;|ZOJ+a edRN@MYЗiG,+@_=e4RseY8L3R^2,eG-2&iA6f=KQ^zxNzw4 CO7ɘUk6-0"MPhNc%-%W _3‰H^|]Ui=1]JBў{ųGd 5ct\4! ?˾u(F/ z.f.Dv9SaK+{.MrvӦ.4+&%z9ŀ%{9zz־r90du.K/H*\2VF/UHه^NulE,Ej}+)RC0'HvL8JD}z:J; G(M`~IkkQ̛ml͌Ȍ`*2o_Y`,:&S48^;!s.F(a bD!"1Si \HaE0UoAG %a0 %>eS)]{Znz4v!9.Sb@@3G0u'܂ՃaHt? K Ly` v@0E1So!T|5!<1ݑ@0E>L)C`,ޱ2kILTo!Ko&_dJ0E VXݚtZ#)2N0eDS,J`ʘqZ8VI.!~RI7T ҍ1U=ouҭD*S4Lqv[1Sb).Y]SwTt&ڨF0O0QFG=I%[]S}9)20`JF! S1SY-4C`juAK^61["ɵZfxt͸`>R"S̼! CeD1o ҉Zox[ulpo<TBjmpxƋ4Os sCH4y>{ߑG_/wX\{]e[k~E9fV-9"H%(H{3=ѬoJmޤ]JnԈU_*}LPylG'Nxy~%d_q_;a4v%eF4Q'5F!2Qlzt֬5))ޅ|WۋXw/UxV@֏,.26\jmoUȉ͵ֱMmJsa+2OAN(0L6 ,Yt 'eȗE4܅OBωHvf*Ȝziywt=ZXܻ*TdlR߀k&[N#?%OBc'534ZeVfl"C>~"u _vp<0Z$( )8dMrY"j!/f?b#Kjsx F̯;%w epK3ẂIJThyC`~QD I+E"˔&.)ɔ b\$uC<1qa"H}A@<(ưSQQ0.5GdO!R ፂ)pzFӁ ]i~0]>`aQcfg >p^9Uc([1 dȣL4l^c{lxȞ./KIcOV z77nM:">H8Yhc^cl7-۲ !/j gSNҥ|Ǜ݈G:eAH@,~pcБBS-uNZz2ϡ!2{z&}8.>&inc5}ЬʎNȘO!}|2?:b7BF 0P|AS \Tr!G7 O4ER\@<+-,Ua&<nymNeȖ+ZNR7w#KWZƔ-9[vaesJ>líL;$xϿy rY! 2(=d$ 64hF=~c9Rqjvx8 /-_v»lmxPhPLs t}=u}yyz&lz&2p꺞IU%z&ws=JN"~eHu4Fk/cܕ"~y kXF 3m+$+ƥׯ_f-n6bٙ(NoLpzC~kR(Ol96u{ʧ NcH3TįP,!h=smm([6ҁHs՛PvL@3Z|R\׶&+pa ]>213@s򳘏i%Gғs p?sI3ڣ`}B:MNX'uw ?&Fk4Ќ#{hٴB6| \m 6lb7]*m0pax+<ɒ 0@af(-3Pӎ*RY|yl[zLf<>8.j@|^: q{Y^)' OJM%sEJiF%V9OZ&X^]$ÙO 'p~~j8Ju4Qi[C΀>1—i CyỚv(˦U晴P$iN 9m*Ϋ hZy\iU4mTßOZ { '}m8#&$Iag$rc|.G٭Ҹ\/<=E L1; /a,7Ȯ-RtܼGm ,e*,d p򲶋?>I$Eȶ5P8ٟv|VHj{8 !{5 Ny fchdIH/Xo6lE7F1xxɥԄ(~%!W_TpsiydX.6j >?ll,w㐕R\,#~ St,x2e "ŻG7x7Uڱj>|Twۜ;sj~t"Dz@f.CV#.8_OA<*Xtik5ܪ` ExCː/WNQyXŽ]R7jOZfoJX u#Eȋ J:% ɥax tZ#cG6ib [GRH}N@<)ᒮ9/p!Z .->.~_vpZl^Ύ j[M>K &M~ՔZ'%M68,0P8#ݎM;+,-:oaMO]͟P5oе,xǖ}Vr@4O:B&cY٭$-taZC=,,*s xɅZdlaaPXX Cg IwFL}ynɾannDz Dh.z8ۧ54j-Wy8ʦ+cdU>ѓӎm[~b?,M|;?2\߳ZɮLAuCRd# GW9Yw@x"1Ո4:<Yfbٴ+t^8lfR?( C|@ vAxiJ\cAQf眀{G^Lf|F6mk naSs|TOߜgqD気^YslP`9 چX ݤ<įF<`0Fo_Bα]>kzmI ?UM"tw C̒B0abvޗ6Dh&)<[UбJ>E-/ݪ\k;oplǘ?x֤(.^X׾mgtpbޭ7Tr'][A5Jq9j Zz "k5'1ꘀ{RTIDD!Ks0j˸f~'{!'EH9P3oW[JefuL@v :)[p) \lD;-ټ >⣋x$Mج(Ju}>, VOGD>'ވ.9. %Ǡ{SAhn BF9Q:aP%=7 *{.Vm~w؍}|t&9e]s5B7=k_7wثŠ|aW=u|oY>y`'p+w*qBZT_5kff@u!7 xԇ|P1Wp T4i^?*Mgg-7{S/ 2莄Ҥ&6[*f'6%Я-KH&&6/,όNNMNN/.:L_A3$ lA&k V_S:x,uf:9;7c=/3fM4qژEi6f\քcf$?Ы L?aQNQ=oN%Y;d`O31c%fԴ0H8n6: cGv4WXߊ=eKq꤁lMj,ZhfiJ˦ezojzsKovъNk%ƣՕe\%]6 _LҌP%։g4hYQT*Kڔުyt+Ǜhׁǀs fuVRCv:+_.B^47⛗_!/tG:+[ޅ|WNY^dS´`5d[zYM(VcIVI҄(zUsn.A&~{V.xlL- Y'~+X Azui4l-4$#ך8lpǞk/y45=Vdp]l4c˕5mw<nc\!]c('aWV N壪{H{d1c?q}個u_%ҿ)[{}izJJg֗H-=q:^gsS ܌'d} /oMjҧgar.Z,R.OOMN&q%J/.WX8P--%’"_X2k%cd89*IM4^>J F$TH&tlL,*UVQ'~+X l2wE),l -hyE)dRN@?3u P@<ㄿ8<QL7/4QHsϥ'C8ߜOa{ z*հf enyG5}')LwcPoYj6j]i:lV&w I?O! UMc2a9EM4G+"i#?/ ZnV}@dWJM(k_J/tvIW{.~o2[nPk6* ^7t. v9. JF%b`s/!_6sG5mW|KTh]_.AJwl>o*y|(]y-$!^עbĝ3 ՜U-Y]r:v Z h}S8FkR!f^C({t]ZZ1F8rXnC~|2\1(BB#]L>g%^8 5^tZGVћbZaȾ) ;H=A9֟][Y^ǪZ:GP ?.'O7?\TomS+E5Iӿ{ i;j`m#J՚%(y7<#"$ s #@ԭ;l0XLp I)WCmܲ$?ު bXd;c:spߞxI; c}Hcͅj3;cL.Y8_􋞓G;K&?@IUhKL G=I1 "ehꔤy|X_+6B*8Jh΀e%tvm J_lԼŇ +w _R[@\Ҧi5!c^ُWnnMY;ԟ!IZ6wč$g0V]C G>]:fQl24ʿԙ撨vWBtn>L6jQ+WU>䟭 :hZ*7:?}7rߝms1N:nu~o+g?+_9/66ƖlcS#EˎG_?k-~Ƹw2CwwÏ.{#2\o1ȇ-O\sA gI UAZW[Ɨl[z,T]dY+?sυR]j} nQ6$~ז5s-^[k5)FsճN|Xx CaL ?K7&_9j+7*|S3%SM\msݽ̝(rrcov/tests/0000755000176200001440000000000014200601000012526 5ustar liggesusersrrcov/tests/tldapp.R0000644000176200001440000000223613373002641014160 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) dodata <- function(method) { options(digits = 5) set.seed(101) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("===================================================\n") data(pottery); show(lda <- LdaPP(origin~., data=pottery, method=method)); show(predict(lda)) data(hemophilia); show(lda <- LdaPP(as.factor(gr)~., data=hemophilia, method=method)); show(predict(lda)) data(anorexia); show(lda <- LdaPP(Treat~., data=anorexia, method=method)); show(predict(lda)) data(Pima.tr); show(lda <- LdaPP(type~., data=Pima.tr, method=method)); show(predict(lda)) data(crabs); show(lda <- LdaPP(sp~., data=crabs, method=method)); show(predict(lda)) cat("===================================================\n") } ## -- now do it: ## Commented out - still to slow ##dodata(method="huber") ##dodata(method="sest") ## VT::14.11.2018 - Commented out: too slow ## dodata(method="mad") ## dodata(method="class") rrcov/tests/tsest.R0000644000176200001440000001266412763517421014055 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) dodata <- function(nrep = 1, time = FALSE, full = TRUE, method) { doest <- function(x, xname, nrep = 1, method=c("sfast", "surreal", "bisquare", "rocke", "suser", "MM", "sdet")) { method <- match.arg(method) lname <- 20 n <- dim(x)[1] p <- dim(x)[2] mm <- if(method == "MM") CovMMest(x) else CovSest(x, method=method) crit <- log(mm@crit) xres <- sprintf("%3d %3d %12.6f\n", dim(x)[1], dim(x)[2], crit) lpad <- lname-nchar(xname) cat(pad.right(xname,lpad), xres) dist <- getDistance(mm) quantiel <- qchisq(0.975, p) ibad <- which(dist >= quantiel) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) cat("-------------\n") show(mm) cat("--------------------------------------------------------\n") } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) ### data(rice) data(hemophilia) data(fish) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p LOG(det) Time\n") cat("===================================================\n") doest(heart[, 1:2], data(heart), nrep, method=method) doest(starsCYG, data(starsCYG), nrep, method=method) doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep, method=method) doest(stack.x, data(stackloss), nrep, method=method) doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep, method=method) doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep, method=method) doest(data.matrix(subset(wood, select = -y)), data(wood), nrep, method=method) doest(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep, method=method) doest(brain, "Animals", nrep, method=method) doest(milk, data(milk), nrep, method=method) doest(bushfire, data(bushfire), nrep, method=method) doest(data.matrix(subset(rice, select = -Overall_evaluation)), data(rice), nrep, method=method) doest(data.matrix(subset(hemophilia, select = -gr)), data(hemophilia), nrep, method=method) doest(data.matrix(subset(fish, select = -Species)), data(fish), nrep, method=method) ## from package 'datasets' doest(airquality[,1:4], data(airquality), nrep, method=method) doest(attitude, data(attitude), nrep, method=method) doest(attenu, data(attenu), nrep, method=method) doest(USJudgeRatings, data(USJudgeRatings), nrep, method=method) doest(USArrests, data(USArrests), nrep, method=method) doest(longley, data(longley), nrep, method=method) doest(Loblolly, data(Loblolly), nrep, method=method) doest(quakes[,1:4], data(quakes), nrep, method=method) cat("===================================================\n") } # generate contaminated data using the function gendata with different # number of outliers and check if the M-estimate breaks - i.e. the # largest eigenvalue is larger than e.g. 5. # For n=50 and p=10 and d=5 the M-estimate can break for number of # outliers grater than 20. dogen <- function(){ eig <- vector("numeric",26) for(i in 0:25) { gg <- gendata(eps=i) mm <- CovSRocke(gg$x, t0=gg$tgood, S0=gg$sgood) eig[i+1] <- ev <- getEvals(mm)[1] cat(i, ev, "\n") ## stopifnot(ev < 5 || i > 20) } plot(0:25, eig, type="l", xlab="Number of outliers", ylab="Largest Eigenvalue") } # # generate data 50x10 as multivariate normal N(0,I) and add # eps % outliers by adding d=5.0 to each component. # - if eps <0 and eps <=0.5, the number of outliers is eps*n # - if eps >= 1, it is the number of outliers # - use the center and cov of the good data as good start # - use the center and the cov of all data as a bad start # If using a good start, the M-estimate must iterate to # the good solution: the largest eigenvalue is less then e.g. 5 # gendata <- function(n=50, p=10, eps=0, d=5.0){ if(eps < 0 || eps > 0.5 && eps < 1.0 || eps > 0.5*n) stop("eps is out of range") library(MASS) x <- mvrnorm(n, rep(0,p), diag(p)) bad <- vector("numeric") nbad = if(eps < 1) eps*n else eps if(nbad > 0){ bad <- sample(n, nbad) x[bad,] <- x[bad,] + d } cov1 <- cov.wt(x) cov2 <- if(nbad <= 0) cov1 else cov.wt(x[-bad,]) list(x=x, bad=sort(bad), tgood=cov2$center, sgood=cov2$cov, tbad=cov1$center, sbad=cov1$cov) } pad.right <- function(z, pads) { ## Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } ## -- now do it: dodata(method="sfast") dodata(method="sdet") ##dodata(method="suser") ##dodata(method="surreal") dodata(method="bisquare") dodata(method="rocke") dodata(method="MM") ##dogen() ##cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' rrcov/tests/tldapp.Rout.save0000644000176200001440000000365413373003741015654 0ustar liggesusers R Under development (unstable) (2018-11-12 r75592) -- "Unsuffered Consequences" Copyright (C) 2018 The R Foundation for Statistical Computing Platform: i386-w64-mingw32/i386 (32-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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > library(MASS) > > dodata <- function(method) { + + options(digits = 5) + set.seed(101) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + cat("===================================================\n") + + data(pottery); show(lda <- LdaPP(origin~., data=pottery, method=method)); show(predict(lda)) + data(hemophilia); show(lda <- LdaPP(as.factor(gr)~., data=hemophilia, method=method)); show(predict(lda)) + data(anorexia); show(lda <- LdaPP(Treat~., data=anorexia, method=method)); show(predict(lda)) + data(Pima.tr); show(lda <- LdaPP(type~., data=Pima.tr, method=method)); show(predict(lda)) + data(crabs); show(lda <- LdaPP(sp~., data=crabs, method=method)); show(predict(lda)) + + cat("===================================================\n") + } > > > ## -- now do it: > > ## Commented out - still to slow > ##dodata(method="huber") > ##dodata(method="sest") > > ## VT::14.11.2018 - Commented out: too slow > ## dodata(method="mad") > ## dodata(method="class") > > proc.time() user system elapsed 0.54 0.06 0.59 rrcov/tests/tmest4.Rout.save0000644000176200001440000002707212763517421015617 0ustar liggesusers R Under development (unstable) (2013-08-17 r63608) -- "Unsuffered Consequences" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: i386-w64-mingw32/i386 (32-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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > library(MASS) > dodata <- function(nrep = 1, time = FALSE, full = TRUE) { + domest <- function(x, xname, nrep = 1) { + n <- dim(x)[1] + p <- dim(x)[2] + mm <- CovMest(x) + crit <- log(mm@crit) + ## c1 <- mm@psi@c1 + ## M <- mm$psi@M + + xres <- sprintf("%3d %3d %12.6f\n", dim(x)[1], dim(x)[2], crit) + lpad <- lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + dist <- getDistance(mm) + quantiel <- qchisq(0.975, p) + ibad <- which(dist >= quantiel) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ",nbad,"\n") + if(nbad > 0) + print(ibad) + cat("-------------\n") + show(mm) + cat("--------------------------------------------------------\n") + } + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + lname <- 20 + + data(heart) + data(starsCYG) + data(phosphor) + data(stackloss) + data(coleman) + data(salinity) + data(wood) + data(hbk) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + data(milk) + data(bushfire) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p c1 M LOG(det) Time\n") + cat("======================================================================\n") + domest(heart[, 1:2], data(heart), nrep) + domest(starsCYG, data(starsCYG), nrep) + domest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + domest(stack.x, data(stackloss), nrep) + domest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + domest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + domest(data.matrix(subset(wood, select = -y)), data(wood), nrep) + domest(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep) + + + domest(brain, "Animals", nrep) + domest(milk, data(milk), nrep) + domest(bushfire, data(bushfire), nrep) + cat("======================================================================\n") + } > > # generate contaminated data using the function gendata with different > # number of outliers and check if the M-estimate breaks - i.e. the > # largest eigenvalue is larger than e.g. 5. > # For n=50 and p=10 and d=5 the M-estimate can break for number of > # outliers grater than 20. > dogen <- function(){ + eig <- vector("numeric",26) + for(i in 0:25) { + gg <- gendata(eps=i) + mm <- CovMest(gg$x, t0=gg$tgood, S0=gg$sgood, arp=0.001) + eig[i+1] <- ev <- getEvals(mm)[1] + # cat(i, ev, "\n") + + stopifnot(ev < 5 || i > 20) + } + # plot(0:25, eig, type="l", xlab="Number of outliers", ylab="Largest Eigenvalue") + } > > # > # generate data 50x10 as multivariate normal N(0,I) and add > # eps % outliers by adding d=5.0 to each component. > # - if eps <0 and eps <=0.5, the number of outliers is eps*n > # - if eps >= 1, it is the number of outliers > # - use the center and cov of the good data as good start > # - use the center and the cov of all data as a bad start > # If using a good start, the M-estimate must iterate to > # the good solution: the largest eigenvalue is less then e.g. 5 > # > gendata <- function(n=50, p=10, eps=0, d=5.0){ + + if(eps < 0 || eps > 0.5 && eps < 1.0 || eps > 0.5*n) + stop("eps is out of range") + + library(MASS) + + x <- mvrnorm(n, rep(0,p), diag(p)) + bad <- vector("numeric") + nbad = if(eps < 1) eps*n else eps + if(nbad > 0){ + bad <- sample(n, nbad) + x[bad,] <- x[bad,] + d + } + cov1 <- cov.wt(x) + cov2 <- if(nbad <= 0) cov1 else cov.wt(x[-bad,]) + + list(x=x, bad=sort(bad), tgood=cov2$center, sgood=cov2$cov, tbad=cov1$center, sbad=cov1$cov) + } > > pad.right <- function(z, pads) + { + ## Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > > ## -- now do it: > dodata() Call: dodata() Data Set n p c1 M LOG(det) Time ====================================================================== heart 12 2 7.160341 Outliers: 3 [1] 2 6 12 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: height weight 34.9 27.0 Robust Estimate of Covariance: height weight height 102 155 weight 155 250 -------------------------------------------------------- starsCYG 47 2 -5.994588 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: log.Te log.light 4.42 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0169 0.0587 log.light 0.0587 0.3523 -------------------------------------------------------- phosphor 18 2 8.867522 Outliers: 3 [1] 1 6 10 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: inorg organic 15.4 39.1 Robust Estimate of Covariance: inorg organic inorg 169 213 organic 213 308 -------------------------------------------------------- stackloss 21 3 7.241400 Outliers: 9 [1] 1 2 3 15 16 17 18 19 21 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 59.5 20.8 87.3 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 9.34 8.69 8.52 Water.Temp 8.69 13.72 9.13 Acid.Conc. 8.52 9.13 34.54 -------------------------------------------------------- coleman 20 5 2.574752 Outliers: 7 [1] 2 6 9 10 12 13 15 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.82 48.44 5.30 25.19 6.51 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2850 0.1045 1.7585 0.3074 0.0355 fatherWc 0.1045 824.8305 260.7062 3.7507 17.7959 sstatus 1.7585 260.7062 105.6135 4.1140 5.7714 teacherSc 0.3074 3.7507 4.1140 0.6753 0.1563 motherLev 0.0355 17.7959 5.7714 0.1563 0.4147 -------------------------------------------------------- salinity 28 3 3.875096 Outliers: 9 [1] 3 5 10 11 15 16 17 23 24 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: X1 X2 X3 10.02 3.21 22.36 Robust Estimate of Covariance: X1 X2 X3 X1 15.353 1.990 -5.075 X2 1.990 5.210 -0.769 X3 -5.075 -0.769 2.314 -------------------------------------------------------- wood 20 5 -35.156305 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: x1 x2 x3 x4 x5 0.587 0.122 0.531 0.538 0.892 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 6.45e-03 1.21e-03 2.03e-03 -3.77e-04 -1.05e-03 x2 1.21e-03 3.12e-04 8.16e-04 -3.34e-05 1.52e-05 x3 2.03e-03 8.16e-04 4.27e-03 -5.60e-04 2.27e-04 x4 -3.77e-04 -3.34e-05 -5.60e-04 1.83e-03 1.18e-03 x5 -1.05e-03 1.52e-05 2.27e-04 1.18e-03 1.78e-03 -------------------------------------------------------- hbk 75 3 1.432485 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: X1 X2 X3 1.54 1.78 1.69 Robust Estimate of Covariance: X1 X2 X3 X1 1.6485 0.0739 0.1709 X2 0.0739 1.6780 0.2049 X3 0.1709 0.2049 1.5584 -------------------------------------------------------- Animals 28 2 18.194822 Outliers: 10 [1] 2 6 7 9 12 14 15 16 25 28 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 4993 8466 brain 8466 30335 -------------------------------------------------------- milk 86 8 -25.041802 Outliers: 20 [1] 1 2 3 11 12 13 14 15 16 17 18 20 27 41 44 47 70 74 75 77 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.88 33.04 26.11 25.09 25.02 123.12 14.39 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 4.89e-07 9.64e-05 1.83e-04 1.76e-04 1.57e-04 1.48e-04 6.53e-04 X2 9.64e-05 2.05e+00 3.38e-01 2.37e-01 1.70e-01 2.71e-01 1.91e+00 X3 1.83e-04 3.38e-01 1.16e+00 8.56e-01 8.48e-01 8.31e-01 8.85e-01 X4 1.76e-04 2.37e-01 8.56e-01 6.83e-01 6.55e-01 6.40e-01 6.91e-01 X5 1.57e-04 1.70e-01 8.48e-01 6.55e-01 6.93e-01 6.52e-01 6.90e-01 X6 1.48e-04 2.71e-01 8.31e-01 6.40e-01 6.52e-01 6.61e-01 6.95e-01 X7 6.53e-04 1.91e+00 8.85e-01 6.91e-01 6.90e-01 6.95e-01 4.40e+00 X8 5.56e-06 2.60e-01 1.98e-01 1.29e-01 1.12e-01 1.19e-01 4.12e-01 X8 X1 5.56e-06 X2 2.60e-01 X3 1.98e-01 X4 1.29e-01 X5 1.12e-01 X6 1.19e-01 X7 4.12e-01 X8 1.65e-01 -------------------------------------------------------- bushfire 38 5 23.457490 Outliers: 15 [1] 7 8 9 10 11 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovMest(x = x) -> Method: M-Estimates Robust Estimate of Location: V1 V2 V3 V4 V5 107 147 263 215 277 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 775 560 -4179 -925 -759 V2 560 478 -2494 -510 -431 V3 -4179 -2494 27433 6441 5196 V4 -925 -510 6441 1607 1276 V5 -759 -431 5196 1276 1020 -------------------------------------------------------- ====================================================================== > dogen() > #cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' > > proc.time() user system elapsed 0.68 0.10 0.79 rrcov/tests/togk4.Rout.save0000644000176200001440000002227413710032160015407 0ustar liggesusers R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > ## VT::14.01.2020 > ## On some platforms minor differences are shown - use > ## IGNORE_RDIFF_BEGIN > ## IGNORE_RDIFF_END > > dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMCD","MASS")){ + domcd <- function(x, xname, nrep=1){ + n <- dim(x)[1] + p <- dim(x)[2] + + mcd<-CovOgk(x) + + xres <- sprintf("%3d %3d\n", dim(x)[1], dim(x)[2]) + + lpad<-lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + dist <- getDistance(mcd) + quantiel <- qchisq(0.975, p) + ibad <- which(dist >= quantiel) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ",nbad,"\n") + if(nbad > 0) + print(ibad) + cat("-------------\n") + show(mcd) + cat("--------------------------------------------------------\n") + } + + lname <- 20 + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + method <- match.arg(method) + + data(heart) + data(starsCYG) + data(phosphor) + data(stackloss) + data(coleman) + data(salinity) + data(wood) + + data(hbk) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + data(milk) + data(bushfire) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p Half LOG(obj) Time\n") + cat("========================================================\n") + domcd(heart[, 1:2], data(heart), nrep) + ## This will not work within the function, of course + ## - comment it out + ## IGNORE_RDIFF_BEGIN + ## domcd(starsCYG,data(starsCYG), nrep) + ## IGNORE_RDIFF_END + domcd(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + domcd(stack.x,data(stackloss), nrep) + domcd(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + domcd(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + ## IGNORE_RDIFF_BEGIN + ## domcd(data.matrix(subset(wood, select = -y)), data(wood), nrep) + ## IGNORE_RDIFF_END + domcd(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep) + + domcd(brain, "Animals", nrep) + domcd(milk, data(milk), nrep) + domcd(bushfire, data(bushfire), nrep) + cat("========================================================\n") + } > > pad.right <- function(z, pads) + { + ### Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > dodata() Call: dodata() Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 Outliers: 5 [1] 2 6 8 10 12 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: height weight 39.76 35.71 Robust Estimate of Covariance: height weight height 15.88 32.07 weight 32.07 78.28 -------------------------------------------------------- phosphor 18 2 Outliers: 2 [1] 1 6 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: inorg organic 13.31 40.00 Robust Estimate of Covariance: inorg organic inorg 92.82 93.24 organic 93.24 152.62 -------------------------------------------------------- stackloss 21 3 Outliers: 2 [1] 1 2 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 57.72 20.50 85.78 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 38.423 11.306 18.605 Water.Temp 11.306 6.806 5.889 Acid.Conc. 18.605 5.889 29.840 -------------------------------------------------------- coleman 20 5 Outliers: 3 [1] 1 6 10 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.723 43.202 2.912 25.010 6.290 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.12867 2.80048 0.92026 0.15118 0.06413 fatherWc 2.80048 678.72549 227.36415 9.30826 16.15102 sstatus 0.92026 227.36415 101.39094 3.38013 5.63283 teacherSc 0.15118 9.30826 3.38013 0.57112 0.27701 motherLev 0.06413 16.15102 5.63283 0.27701 0.44801 -------------------------------------------------------- salinity 28 3 Outliers: 3 [1] 3 5 16 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: X1 X2 X3 10.74 2.68 22.99 Robust Estimate of Covariance: X1 X2 X3 X1 8.1047 -0.6365 -0.4720 X2 -0.6365 3.0976 -1.3520 X3 -0.4720 -1.3520 2.3648 -------------------------------------------------------- hbk 75 3 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: X1 X2 X3 1.538 1.780 1.687 Robust Estimate of Covariance: X1 X2 X3 X1 1.11350 0.04992 0.11541 X2 0.04992 1.13338 0.13843 X3 0.11541 0.13843 1.05261 -------------------------------------------------------- Animals 28 2 Outliers: 12 [1] 2 6 7 9 12 14 15 16 17 24 25 28 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: body brain 39.65 105.83 Robust Estimate of Covariance: body brain body 3981 7558 brain 7558 16594 -------------------------------------------------------- milk 86 8 Outliers: 22 [1] 1 2 3 11 12 13 14 15 16 17 18 20 27 41 44 47 50 70 74 75 77 85 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.80 33.10 26.15 25.13 25.06 123.06 14.39 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 4.074e-07 5.255e-05 1.564e-04 1.506e-04 1.340e-04 1.234e-04 5.308e-04 X2 5.255e-05 1.464e+00 3.425e-01 2.465e-01 1.847e-01 2.484e-01 1.459e+00 X3 1.564e-04 3.425e-01 1.070e+00 7.834e-01 7.665e-01 7.808e-01 7.632e-01 X4 1.506e-04 2.465e-01 7.834e-01 6.178e-01 5.868e-01 5.959e-01 5.923e-01 X5 1.340e-04 1.847e-01 7.665e-01 5.868e-01 6.124e-01 5.967e-01 5.868e-01 X6 1.234e-04 2.484e-01 7.808e-01 5.959e-01 5.967e-01 6.253e-01 5.819e-01 X7 5.308e-04 1.459e+00 7.632e-01 5.923e-01 5.868e-01 5.819e-01 3.535e+00 X8 1.990e-07 1.851e-01 1.861e-01 1.210e-01 1.041e-01 1.116e-01 3.046e-01 X8 X1 1.990e-07 X2 1.851e-01 X3 1.861e-01 X4 1.210e-01 X5 1.041e-01 X6 1.116e-01 X7 3.046e-01 X8 1.292e-01 -------------------------------------------------------- bushfire 38 5 Outliers: 17 [1] 7 8 9 10 11 12 28 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovOgk(x = x) -> Method: Orthogonalized Gnanadesikan-Kettenring Estimator Robust Estimate of Location: V1 V2 V3 V4 V5 104.5 146.0 275.6 217.8 279.3 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 266.8 203.2 -1380.7 -311.1 -252.2 V2 203.2 178.4 -910.9 -185.9 -155.9 V3 -1380.7 -910.9 8279.7 2035.5 1615.4 V4 -311.1 -185.9 2035.5 536.5 418.6 V5 -252.2 -155.9 1615.4 418.6 329.2 -------------------------------------------------------- ======================================================== > > proc.time() user system elapsed 0.40 0.20 0.59 rrcov/tests/tmcd4.R0000644000176200001440000002420113372061002013676 0ustar liggesusers## Test the exact fit property of CovMcd doexactfit <- function(){ exact <-function(seed=1234){ set.seed(seed) n1 <- 45 p <- 2 x1 <- matrix(rnorm(p*n1),nrow=n1, ncol=p) x1[,p] <- x1[,p] + 3 n2 <- 55 m1 <- 0 m2 <- 3 x2 <- cbind(rnorm(n2),rep(m2,n2)) x<-rbind(x1,x2) colnames(x) <- c("X1","X2") x } print(CovMcd(exact())) } dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMCD","MASS", "deterministic", "exact", "MRCD")){ ##@bdescr ## Test the function covMcd() on the literature datasets: ## ## Call CovMcd() for all regression datasets available in rrcov and print: ## - execution time (if time == TRUE) ## - objective fucntion ## - best subsample found (if short == false) ## - outliers identified (with cutoff 0.975) (if short == false) ## - estimated center and covarinance matrix if full == TRUE) ## ##@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 cente and covariance matrix ##@in method : [character] select a method: one of (FASTMCD, MASS) doest <- function(x, xname, nrep=1){ n <- dim(x)[1] p <- dim(x)[2] if(method == "MASS"){ mcd<-cov.mcd(x) quan <- as.integer(floor((n + p + 1)/2)) #default: floor((n+p+1)/2) } else{ mcd <- if(method=="deterministic") CovMcd(x, nsamp="deterministic", trace=FALSE) else if(method=="exact") CovMcd(x, nsamp="exact", trace=FALSE) else if(method=="MRCD") CovMrcd(x, trace=FALSE) else CovMcd(x, trace=FALSE) quan <- as.integer(mcd@quan) } crit <- mcd@crit if(time){ xtime <- system.time(dorep(x, nrep, method))[1]/nrep xres <- sprintf("%3d %3d %3d %12.6f %10.3f\n", dim(x)[1], dim(x)[2], quan, crit, xtime) } else{ xres <- sprintf("%3d %3d %3d %12.6f\n", dim(x)[1], dim(x)[2], quan, crit) } lpad<-lname-nchar(xname) cat(pad.right(xname,lpad), xres) if(!short){ cat("Best subsample: \n") if(length(mcd@best) > 150) cat("Too long... \n") else print(mcd@best) ibad <- which(mcd@wt==0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0 & nbad < 150) print(ibad) else cat("Too many to print ... \n") if(full){ cat("-------------\n") show(mcd) } cat("--------------------------------------------------------\n") } } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed lname <- 20 ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) method <- match.arg(method) if(method == "MASS") library(MASS) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(fish) data(pottery) data(rice) data(un86) data(wages) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p Half LOG(obj) Time\n") cat("========================================================\n") if(method=="exact") { ## only small data sets doest(heart[, 1:2], data(heart), nrep) doest(starsCYG, data(starsCYG), nrep) doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) doest(data.matrix(subset(wood, select = -y)), data(wood), nrep) doest(brain, "Animals", nrep) doest(lactic, data(lactic), nrep) doest(pension, data(pension), nrep) doest(data.matrix(subset(vaso, select = -Y)), data(vaso), nrep) doest(stack.x, data(stackloss), nrep) doest(pilot, data(pilot), nrep) } else { doest(heart[, 1:2], data(heart), nrep) doest(starsCYG, data(starsCYG), nrep) doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) doest(stack.x, data(stackloss), nrep) doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) doest(data.matrix(subset(wood, select = -y)), data(wood), nrep) doest(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) doest(brain, "Animals", nrep) ## doest(milk, data(milk), nrep) # difference between 386 and x64 doest(bushfire, data(bushfire), nrep) doest(lactic, data(lactic), nrep) doest(pension, data(pension), nrep) ## doest(pilot, data(pilot), nrep) # difference between 386 and x64 if(method != "MRCD") # these two are quite slow for MRCD, especially the second one { doest(radarImage, data(radarImage), nrep) doest(NOxEmissions, data(NOxEmissions), nrep) } doest(data.matrix(subset(vaso, select = -Y)), data(vaso), nrep) doest(data.matrix(subset(wagnerGrowth, select = -Period)), data(wagnerGrowth), nrep) doest(data.matrix(subset(fish, select = -Species)), data(fish), nrep) doest(data.matrix(subset(pottery, select = -origin)), data(pottery), nrep) doest(rice, data(rice), nrep) doest(un86, data(un86), nrep) doest(wages, data(wages), nrep) ## from package 'datasets' doest(airquality[,1:4], data(airquality), nrep) doest(attitude, data(attitude), nrep) doest(attenu, data(attenu), nrep) doest(USJudgeRatings, data(USJudgeRatings), nrep) doest(USArrests, data(USArrests), nrep) doest(longley, data(longley), nrep) doest(Loblolly, data(Loblolly), nrep) doest(quakes[,1:4], data(quakes), nrep) } cat("========================================================\n") } dogen <- function(nrep=1, eps=0.49, method=c("FASTMCD", "MASS")){ doest <- function(x, nrep=1){ gc() xtime <- system.time(dorep(x, nrep, method))[1]/nrep cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) xtime } set.seed(1234) ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) method <- match.arg(method) ap <- c(2, 5, 10, 20, 30) an <- c(100, 500, 1000, 10000, 50000) tottime <- 0 cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- an[i] p <- ap[j] if(5*p <= n){ xx <- gendata(n, p, eps) X <- xx$X tottime <- tottime + doest(X, nrep) } } } cat("=====================\n") cat("Total time: ", tottime*nrep, "\n") } docheck <- function(n, p, eps){ xx <- gendata(n,p,eps) mcd <- CovMcd(xx$X) check(mcd, xx$xind) } check <- function(mcd, xind){ ## check if mcd is robust w.r.t xind, i.e. check how many of xind ## did not get zero weight mymatch <- xind %in% which(mcd@wt == 0) length(xind) - length(which(mymatch)) } dorep <- function(x, nrep=1, method=c("FASTMCD","MASS", "deterministic", "exact", "MRCD")){ method <- match.arg(method) for(i in 1:nrep) if(method == "MASS") cov.mcd(x) else { if(method=="deterministic") CovMcd(x, nsamp="deterministic", trace=FALSE) else if(method=="exact") CovMcd(x, nsamp="exact", trace=FALSE) else if(method=="MRCD") CovMrcd(x, trace=FALSE) else CovMcd(x, trace=FALSE) } } #### gendata() #### # Generates a location contaminated multivariate # normal sample of n observations in p dimensions # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) # where # m = (b,b,...,b) # Defaults: eps=0 and b=10 # gendata <- function(n,p,eps=0,b=10){ if(missing(n) || missing(p)) stop("Please specify (n,p)") if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) nbad <- as.integer(eps * n) if(nbad > 0){ Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) xind <- sample(n,nbad) X[xind,] <- Xbad } list(X=X, xind=xind) } pad.right <- function(z, pads) { ### Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } whatis<-function(x){ if(is.data.frame(x)) cat("Type: data.frame\n") else if(is.matrix(x)) cat("Type: matrix\n") else if(is.vector(x)) cat("Type: vector\n") else cat("Type: don't know\n") } ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) dodata() dodata(method="deterministic") dodata(method="exact") dodata(method="MRCD") ##doexactfit() rrcov/tests/tqda.Rout.save0000644000176200001440000006771112763517421015334 0ustar liggesusers R Under development (unstable) (2013-08-17 r63608) -- "Unsuffered Consequences" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: i386-w64-mingw32/i386 (32-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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > dodata <- function(method) { + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + cat("===================================================\n") + + data(hemophilia); show(QdaCov(as.factor(gr)~., data=hemophilia, method=method)) + data(anorexia, package="MASS"); show(QdaCov(Treat~., data=anorexia, method=method)) + data(Pima.tr, package="MASS"); show(QdaCov(type~., data=Pima.tr, method=method)) + data(iris); # show(QdaCov(Species~., data=iris, method=method)) + data(crabs, package="MASS"); # show(QdaCov(sp~., data=crabs, method=method)) + + show(QdaClassic(as.factor(gr)~., data=hemophilia)) + show(QdaClassic(Treat~., data=anorexia)) + show(QdaClassic(type~., data=Pima.tr)) + show(QdaClassic(Species~., data=iris)) + ## show(QdaClassic(sp~., data=crabs)) + cat("===================================================\n") + } > > > ## -- now do it: > dodata(method="mcd") Call: dodata(method = "mcd") =================================================== Call: QdaCov(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.12920 -0.0603000 Group: carrier AHFactivity AHFantigen AHFactivity 0.023784 0.015376 AHFantigen 0.015376 0.024035 Group: normal AHFactivity AHFantigen AHFactivity 0.0093528 0.0069246 AHFantigen 0.0069246 0.0138008 Call: QdaCov(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.633 82.950 Cont 81.558 81.108 FT 84.331 94.762 Group: CBT Prewt Postwt Prewt 21.919 19.240 Postwt 19.240 26.427 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 53.947 17.649 Postwt 17.649 23.280 Call: QdaCov(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 1.8602 107.69 67.344 25.29 30.642 0.40777 24.667 Yes 5.3167 145.85 74.283 31.80 34.095 0.49533 37.883 Group: No npreg glu bp skin bmi ped age npreg 2.941754 -0.24702 2.46922 -0.58819 0.228424 -0.090506 3.48775 glu -0.247021 624.74739 59.94791 11.85454 40.585329 -0.842007 4.63665 bp 2.469220 59.94791 145.76207 34.57040 19.162480 -0.278565 17.52081 skin -0.588185 11.85454 34.57040 156.62803 69.256954 -0.396617 11.46341 bmi 0.228424 40.58533 19.16248 69.25695 57.344837 0.010574 8.94607 ped -0.090506 -0.84201 -0.27857 -0.39662 0.010574 0.077809 -0.24735 age 3.487748 4.63665 17.52081 11.46341 8.946075 -0.247348 16.01287 Group: Yes npreg glu bp skin bmi ped age npreg 19.919555 -15.31143 10.06920 5.013071 1.991884 0.088597 30.0019 glu -15.311430 1022.67603 61.62896 31.175834 11.985146 0.103272 43.4043 bp 10.069198 61.62896 144.84493 38.033578 11.259873 0.221026 36.7223 skin 5.013071 31.17583 38.03358 113.490113 33.762220 0.072143 4.0053 bmi 1.991884 11.98515 11.25987 33.762220 25.106101 0.094019 -7.4029 ped 0.088597 0.10327 0.22103 0.072143 0.094019 0.074292 0.1248 age 30.001919 43.40427 36.72231 4.005332 -7.402926 0.124800 160.1318 Call: QdaClassic(as.factor(gr) ~ ., data = hemophilia) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.13487 -0.0778567 Group: carrier AHFactivity AHFantigen AHFactivity 0.023784 0.015376 AHFantigen 0.015376 0.024035 Group: normal AHFactivity AHFantigen AHFactivity 0.020897 0.015515 AHFantigen 0.015515 0.017920 Call: QdaClassic(Treat ~ ., data = anorexia) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.690 85.697 Cont 81.558 81.108 FT 83.229 90.494 Group: CBT Prewt Postwt Prewt 23.479 19.910 Postwt 19.910 69.755 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 25.167 22.883 Postwt 22.883 71.827 Call: QdaClassic(type ~ ., data = Pima.tr) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.9167 113.11 69.545 27.205 31.074 0.41548 29.235 Yes 4.8382 145.06 74.588 33.118 34.709 0.54866 37.691 Group: No npreg glu bp skin bmi ped age npreg 7.878499 10.77226 8.190840 2.910305 -0.035751 -0.207341 16.82888 glu 10.772265 709.56118 81.430257 13.237682 19.037867 -0.518609 59.01307 bp 8.190840 81.43026 122.845246 33.879944 16.612630 -0.077183 46.78695 skin 2.910305 13.23768 33.879944 119.446391 50.125920 0.074282 18.47068 bmi -0.035751 19.03787 16.612630 50.125920 40.722996 0.145242 6.99999 ped -0.207341 -0.51861 -0.077183 0.074282 0.145242 0.071388 -0.53814 age 16.828880 59.01307 46.786954 18.470680 6.999988 -0.538138 91.08183 Group: Yes npreg glu bp skin bmi ped age npreg 15.77941 -8.199298 6.42493 -0.51800 -1.03288 -0.133011 21.93437 glu -8.19930 907.250219 23.71115 87.51536 9.98156 -0.082159 58.12291 bp 6.42493 23.711150 134.18613 19.70588 5.15891 -0.795470 26.30378 skin -0.51800 87.515364 19.70588 151.32924 28.28551 0.347951 26.67867 bmi -1.03288 9.981563 5.15891 28.28551 23.14529 0.457694 -7.91216 ped -0.13301 -0.082159 -0.79547 0.34795 0.45769 0.128883 -0.41737 age 21.93437 58.122915 26.30378 26.67867 -7.91216 -0.417375 131.79873 Call: QdaClassic(Species ~ ., data = iris) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 5.006 3.428 1.462 0.246 versicolor 5.936 2.770 4.260 1.326 virginica 6.588 2.974 5.552 2.026 Group: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.124249 0.099216 0.0163551 0.0103306 Sepal.Width 0.099216 0.143690 0.0116980 0.0092980 Petal.Length 0.016355 0.011698 0.0301592 0.0060694 Petal.Width 0.010331 0.009298 0.0060694 0.0111061 Group: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.266433 0.085184 0.182898 0.055780 Sepal.Width 0.085184 0.098469 0.082653 0.041204 Petal.Length 0.182898 0.082653 0.220816 0.073102 Petal.Width 0.055780 0.041204 0.073102 0.039106 Group: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.404343 0.093763 0.303290 0.049094 Sepal.Width 0.093763 0.104004 0.071380 0.047629 Petal.Length 0.303290 0.071380 0.304588 0.048824 Petal.Width 0.049094 0.047629 0.048824 0.075433 =================================================== > dodata(method="m") Call: dodata(method = "m") =================================================== Call: QdaCov(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.29810 -0.0028222 normal -0.13081 -0.0675283 Group: carrier AHFactivity AHFantigen AHFactivity 0.026018 0.017653 AHFantigen 0.017653 0.030128 Group: normal AHFactivity AHFantigen AHFactivity 0.0081933 0.0065737 AHFantigen 0.0065737 0.0118565 Call: QdaCov(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.436 82.631 Cont 81.559 80.272 FT 85.120 94.657 Group: CBT Prewt Postwt Prewt 23.630 25.128 Postwt 25.128 38.142 Group: Cont Prewt Postwt Prewt 35.8824 -8.2405 Postwt -8.2405 23.7416 Group: FT Prewt Postwt Prewt 33.805 18.206 Postwt 18.206 24.639 Call: QdaCov(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.5225 111.26 68.081 26.640 30.801 0.40452 26.306 Yes 5.0702 144.32 75.088 31.982 34.267 0.47004 37.140 Group: No npreg glu bp skin bmi ped age npreg 5.74219 14.47051 6.63766 4.98559 0.826570 -0.128106 10.71303 glu 14.47051 591.08717 68.81219 44.73311 40.658393 -0.545716 38.01918 bp 6.63766 68.81219 121.02716 30.46466 16.789801 -0.320065 25.29371 skin 4.98559 44.73311 30.46466 136.52176 56.604475 -0.250711 19.73259 bmi 0.82657 40.65839 16.78980 56.60447 47.859747 0.046358 6.94523 ped -0.12811 -0.54572 -0.32006 -0.25071 0.046358 0.061485 -0.34653 age 10.71303 38.01918 25.29371 19.73259 6.945227 -0.346527 35.66101 Group: Yes npreg glu bp skin bmi ped age npreg 15.98861 -1.2430 10.48556 9.05947 2.425316 0.162453 30.149872 glu -1.24304 867.1076 46.43838 25.92297 5.517382 1.044360 31.152650 bp 10.48556 46.4384 130.12536 17.21407 6.343942 -0.235121 41.091494 skin 9.05947 25.9230 17.21407 85.96314 26.089017 0.170061 14.562516 bmi 2.42532 5.5174 6.34394 26.08902 22.051976 0.097786 -5.297971 ped 0.16245 1.0444 -0.23512 0.17006 0.097786 0.057112 0.055286 age 30.14987 31.1527 41.09149 14.56252 -5.297971 0.055286 137.440921 Call: QdaClassic(as.factor(gr) ~ ., data = hemophilia) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.13487 -0.0778567 Group: carrier AHFactivity AHFantigen AHFactivity 0.023784 0.015376 AHFantigen 0.015376 0.024035 Group: normal AHFactivity AHFantigen AHFactivity 0.020897 0.015515 AHFantigen 0.015515 0.017920 Call: QdaClassic(Treat ~ ., data = anorexia) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.690 85.697 Cont 81.558 81.108 FT 83.229 90.494 Group: CBT Prewt Postwt Prewt 23.479 19.910 Postwt 19.910 69.755 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 25.167 22.883 Postwt 22.883 71.827 Call: QdaClassic(type ~ ., data = Pima.tr) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.9167 113.11 69.545 27.205 31.074 0.41548 29.235 Yes 4.8382 145.06 74.588 33.118 34.709 0.54866 37.691 Group: No npreg glu bp skin bmi ped age npreg 7.878499 10.77226 8.190840 2.910305 -0.035751 -0.207341 16.82888 glu 10.772265 709.56118 81.430257 13.237682 19.037867 -0.518609 59.01307 bp 8.190840 81.43026 122.845246 33.879944 16.612630 -0.077183 46.78695 skin 2.910305 13.23768 33.879944 119.446391 50.125920 0.074282 18.47068 bmi -0.035751 19.03787 16.612630 50.125920 40.722996 0.145242 6.99999 ped -0.207341 -0.51861 -0.077183 0.074282 0.145242 0.071388 -0.53814 age 16.828880 59.01307 46.786954 18.470680 6.999988 -0.538138 91.08183 Group: Yes npreg glu bp skin bmi ped age npreg 15.77941 -8.199298 6.42493 -0.51800 -1.03288 -0.133011 21.93437 glu -8.19930 907.250219 23.71115 87.51536 9.98156 -0.082159 58.12291 bp 6.42493 23.711150 134.18613 19.70588 5.15891 -0.795470 26.30378 skin -0.51800 87.515364 19.70588 151.32924 28.28551 0.347951 26.67867 bmi -1.03288 9.981563 5.15891 28.28551 23.14529 0.457694 -7.91216 ped -0.13301 -0.082159 -0.79547 0.34795 0.45769 0.128883 -0.41737 age 21.93437 58.122915 26.30378 26.67867 -7.91216 -0.417375 131.79873 Call: QdaClassic(Species ~ ., data = iris) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 5.006 3.428 1.462 0.246 versicolor 5.936 2.770 4.260 1.326 virginica 6.588 2.974 5.552 2.026 Group: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.124249 0.099216 0.0163551 0.0103306 Sepal.Width 0.099216 0.143690 0.0116980 0.0092980 Petal.Length 0.016355 0.011698 0.0301592 0.0060694 Petal.Width 0.010331 0.009298 0.0060694 0.0111061 Group: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.266433 0.085184 0.182898 0.055780 Sepal.Width 0.085184 0.098469 0.082653 0.041204 Petal.Length 0.182898 0.082653 0.220816 0.073102 Petal.Width 0.055780 0.041204 0.073102 0.039106 Group: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.404343 0.093763 0.303290 0.049094 Sepal.Width 0.093763 0.104004 0.071380 0.047629 Petal.Length 0.303290 0.071380 0.304588 0.048824 Petal.Width 0.049094 0.047629 0.048824 0.075433 =================================================== > dodata(method="ogk") Call: dodata(method = "ogk") =================================================== Call: QdaCov(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.29324 0.00033953 normal -0.12744 -0.06628182 Group: carrier AHFactivity AHFantigen AHFactivity 0.019260 0.013026 AHFantigen 0.013026 0.021889 Group: normal AHFactivity AHFantigen AHFactivity 0.0049651 0.0039707 AHFantigen 0.0039707 0.0066084 Call: QdaCov(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.587 82.709 Cont 81.558 81.108 FT 85.110 94.470 Group: CBT Prewt Postwt Prewt 10.452 15.115 Postwt 15.115 37.085 Group: Cont Prewt Postwt Prewt 31.3178 -4.2024 Postwt -4.2024 21.6422 Group: FT Prewt Postwt Prewt 5.5309 1.4813 Postwt 1.4813 7.5501 Call: QdaCov(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.4286 110.35 67.495 25.905 30.275 0.39587 26.248 Yes 5.1964 142.71 75.357 32.732 34.809 0.48823 37.607 Group: No npreg glu bp skin bmi ped age npreg 3.97823 8.70612 4.58776 4.16463 0.250612 -0.117238 8.21769 glu 8.70612 448.91392 51.71120 38.66213 21.816345 -0.296524 24.29370 bp 4.58776 51.71120 99.41188 24.27574 10.491311 -0.290753 20.02975 skin 4.16463 38.66213 24.27574 98.61950 41.682404 -0.335213 16.60454 bmi 0.25061 21.81634 10.49131 41.68240 35.237101 -0.019774 5.12042 ped -0.11724 -0.29652 -0.29075 -0.33521 -0.019774 0.051431 -0.36275 age 8.21769 24.29370 20.02975 16.60454 5.120417 -0.362748 31.32916 Group: Yes npreg glu bp skin bmi ped age npreg 15.26499 6.30612 3.01913 3.76690 0.94825 0.12076 22.64860 glu 6.30612 688.16837 22.22704 12.81633 3.55791 0.68833 32.28061 bp 3.01913 22.22704 103.97959 9.95281 2.09860 0.45672 31.17602 skin 3.76690 12.81633 9.95281 67.51754 19.51489 0.59831 -2.35523 bmi 0.94825 3.55791 2.09860 19.51489 17.20331 0.24347 -6.88221 ped 0.12076 0.68833 0.45672 0.59831 0.24347 0.05933 0.43798 age 22.64860 32.28061 31.17602 -2.35523 -6.88221 0.43798 111.16709 Call: QdaClassic(as.factor(gr) ~ ., data = hemophilia) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.13487 -0.0778567 Group: carrier AHFactivity AHFantigen AHFactivity 0.023784 0.015376 AHFantigen 0.015376 0.024035 Group: normal AHFactivity AHFantigen AHFactivity 0.020897 0.015515 AHFantigen 0.015515 0.017920 Call: QdaClassic(Treat ~ ., data = anorexia) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.690 85.697 Cont 81.558 81.108 FT 83.229 90.494 Group: CBT Prewt Postwt Prewt 23.479 19.910 Postwt 19.910 69.755 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 25.167 22.883 Postwt 22.883 71.827 Call: QdaClassic(type ~ ., data = Pima.tr) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.9167 113.11 69.545 27.205 31.074 0.41548 29.235 Yes 4.8382 145.06 74.588 33.118 34.709 0.54866 37.691 Group: No npreg glu bp skin bmi ped age npreg 7.878499 10.77226 8.190840 2.910305 -0.035751 -0.207341 16.82888 glu 10.772265 709.56118 81.430257 13.237682 19.037867 -0.518609 59.01307 bp 8.190840 81.43026 122.845246 33.879944 16.612630 -0.077183 46.78695 skin 2.910305 13.23768 33.879944 119.446391 50.125920 0.074282 18.47068 bmi -0.035751 19.03787 16.612630 50.125920 40.722996 0.145242 6.99999 ped -0.207341 -0.51861 -0.077183 0.074282 0.145242 0.071388 -0.53814 age 16.828880 59.01307 46.786954 18.470680 6.999988 -0.538138 91.08183 Group: Yes npreg glu bp skin bmi ped age npreg 15.77941 -8.199298 6.42493 -0.51800 -1.03288 -0.133011 21.93437 glu -8.19930 907.250219 23.71115 87.51536 9.98156 -0.082159 58.12291 bp 6.42493 23.711150 134.18613 19.70588 5.15891 -0.795470 26.30378 skin -0.51800 87.515364 19.70588 151.32924 28.28551 0.347951 26.67867 bmi -1.03288 9.981563 5.15891 28.28551 23.14529 0.457694 -7.91216 ped -0.13301 -0.082159 -0.79547 0.34795 0.45769 0.128883 -0.41737 age 21.93437 58.122915 26.30378 26.67867 -7.91216 -0.417375 131.79873 Call: QdaClassic(Species ~ ., data = iris) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 5.006 3.428 1.462 0.246 versicolor 5.936 2.770 4.260 1.326 virginica 6.588 2.974 5.552 2.026 Group: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.124249 0.099216 0.0163551 0.0103306 Sepal.Width 0.099216 0.143690 0.0116980 0.0092980 Petal.Length 0.016355 0.011698 0.0301592 0.0060694 Petal.Width 0.010331 0.009298 0.0060694 0.0111061 Group: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.266433 0.085184 0.182898 0.055780 Sepal.Width 0.085184 0.098469 0.082653 0.041204 Petal.Length 0.182898 0.082653 0.220816 0.073102 Petal.Width 0.055780 0.041204 0.073102 0.039106 Group: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.404343 0.093763 0.303290 0.049094 Sepal.Width 0.093763 0.104004 0.071380 0.047629 Petal.Length 0.303290 0.071380 0.304588 0.048824 Petal.Width 0.049094 0.047629 0.048824 0.075433 =================================================== > dodata(method="sde") Call: dodata(method = "sde") =================================================== Call: QdaCov(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.29834 -0.0032286 normal -0.12944 -0.0676930 Group: carrier AHFactivity AHFantigen AHFactivity 0.025398 0.017810 AHFantigen 0.017810 0.030639 Group: normal AHFactivity AHFantigen AHFactivity 0.0083435 0.0067686 AHFantigen 0.0067686 0.0119565 Call: QdaCov(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.949 83.323 Cont 81.484 80.840 FT 84.596 93.835 Group: CBT Prewt Postwt Prewt 22.283 17.084 Postwt 17.084 25.308 Group: Cont Prewt Postwt Prewt 37.1864 -8.8896 Postwt -8.8896 31.1930 Group: FT Prewt Postwt Prewt 20.7108 3.1531 Postwt 3.1531 25.7046 Call: QdaCov(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.2567 109.91 67.538 25.484 30.355 0.38618 25.628 Yes 5.2216 141.64 75.048 32.349 34.387 0.47742 37.634 Group: No npreg glu bp skin bmi ped age npreg 4.396832 10.20629 5.43346 4.38313 7.9891e-01 -0.09389257 7.45638 glu 10.206286 601.12211 56.62047 49.67071 3.3829e+01 -0.31896741 31.64508 bp 5.433462 56.62047 120.38052 34.38984 1.4817e+01 -0.21784446 26.44853 skin 4.383134 49.67071 34.38984 136.94931 6.1576e+01 -0.47532490 17.74141 bmi 0.798908 33.82928 14.81668 61.57578 5.1441e+01 0.00061983 8.56856 ped -0.093893 -0.31897 -0.21784 -0.47532 6.1983e-04 0.06012655 -0.26872 age 7.456376 31.64508 26.44853 17.74141 8.5686e+00 -0.26872005 29.93856 Group: Yes npreg glu bp skin bmi ped age npreg 15.91978 7.7491 7.24229 10.46802 5.40627 0.320434 25.88314 glu 7.74907 856.4955 58.59554 29.65331 11.44745 1.388745 38.24430 bp 7.24229 58.5955 89.66288 21.36597 6.46859 0.764486 36.30462 skin 10.46802 29.6533 21.36597 86.79253 26.22071 0.620654 5.28665 bmi 5.40627 11.4475 6.46859 26.22071 20.12351 0.211701 0.71583 ped 0.32043 1.3887 0.76449 0.62065 0.21170 0.062727 0.93743 age 25.88314 38.2443 36.30462 5.28665 0.71583 0.937430 136.24335 Call: QdaClassic(as.factor(gr) ~ ., data = hemophilia) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.13487 -0.0778567 Group: carrier AHFactivity AHFantigen AHFactivity 0.023784 0.015376 AHFantigen 0.015376 0.024035 Group: normal AHFactivity AHFantigen AHFactivity 0.020897 0.015515 AHFantigen 0.015515 0.017920 Call: QdaClassic(Treat ~ ., data = anorexia) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.690 85.697 Cont 81.558 81.108 FT 83.229 90.494 Group: CBT Prewt Postwt Prewt 23.479 19.910 Postwt 19.910 69.755 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 25.167 22.883 Postwt 22.883 71.827 Call: QdaClassic(type ~ ., data = Pima.tr) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.9167 113.11 69.545 27.205 31.074 0.41548 29.235 Yes 4.8382 145.06 74.588 33.118 34.709 0.54866 37.691 Group: No npreg glu bp skin bmi ped age npreg 7.878499 10.77226 8.190840 2.910305 -0.035751 -0.207341 16.82888 glu 10.772265 709.56118 81.430257 13.237682 19.037867 -0.518609 59.01307 bp 8.190840 81.43026 122.845246 33.879944 16.612630 -0.077183 46.78695 skin 2.910305 13.23768 33.879944 119.446391 50.125920 0.074282 18.47068 bmi -0.035751 19.03787 16.612630 50.125920 40.722996 0.145242 6.99999 ped -0.207341 -0.51861 -0.077183 0.074282 0.145242 0.071388 -0.53814 age 16.828880 59.01307 46.786954 18.470680 6.999988 -0.538138 91.08183 Group: Yes npreg glu bp skin bmi ped age npreg 15.77941 -8.199298 6.42493 -0.51800 -1.03288 -0.133011 21.93437 glu -8.19930 907.250219 23.71115 87.51536 9.98156 -0.082159 58.12291 bp 6.42493 23.711150 134.18613 19.70588 5.15891 -0.795470 26.30378 skin -0.51800 87.515364 19.70588 151.32924 28.28551 0.347951 26.67867 bmi -1.03288 9.981563 5.15891 28.28551 23.14529 0.457694 -7.91216 ped -0.13301 -0.082159 -0.79547 0.34795 0.45769 0.128883 -0.41737 age 21.93437 58.122915 26.30378 26.67867 -7.91216 -0.417375 131.79873 Call: QdaClassic(Species ~ ., data = iris) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 5.006 3.428 1.462 0.246 versicolor 5.936 2.770 4.260 1.326 virginica 6.588 2.974 5.552 2.026 Group: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.124249 0.099216 0.0163551 0.0103306 Sepal.Width 0.099216 0.143690 0.0116980 0.0092980 Petal.Length 0.016355 0.011698 0.0301592 0.0060694 Petal.Width 0.010331 0.009298 0.0060694 0.0111061 Group: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.266433 0.085184 0.182898 0.055780 Sepal.Width 0.085184 0.098469 0.082653 0.041204 Petal.Length 0.182898 0.082653 0.220816 0.073102 Petal.Width 0.055780 0.041204 0.073102 0.039106 Group: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.404343 0.093763 0.303290 0.049094 Sepal.Width 0.093763 0.104004 0.071380 0.047629 Petal.Length 0.303290 0.071380 0.304588 0.048824 Petal.Width 0.049094 0.047629 0.048824 0.075433 =================================================== > > proc.time() user system elapsed 0.78 0.06 0.84 rrcov/tests/tmest4.R0000644000176200001440000001031712763517421014124 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) dodata <- function(nrep = 1, time = FALSE, full = TRUE) { domest <- function(x, xname, nrep = 1) { n <- dim(x)[1] p <- dim(x)[2] mm <- CovMest(x) crit <- log(mm@crit) ## c1 <- mm@psi@c1 ## M <- mm$psi@M xres <- sprintf("%3d %3d %12.6f\n", dim(x)[1], dim(x)[2], crit) lpad <- lname-nchar(xname) cat(pad.right(xname,lpad), xres) dist <- getDistance(mm) quantiel <- qchisq(0.975, p) ibad <- which(dist >= quantiel) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) cat("-------------\n") show(mm) cat("--------------------------------------------------------\n") } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed lname <- 20 data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p c1 M LOG(det) Time\n") cat("======================================================================\n") domest(heart[, 1:2], data(heart), nrep) domest(starsCYG, data(starsCYG), nrep) domest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) domest(stack.x, data(stackloss), nrep) domest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) domest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) domest(data.matrix(subset(wood, select = -y)), data(wood), nrep) domest(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep) domest(brain, "Animals", nrep) domest(milk, data(milk), nrep) domest(bushfire, data(bushfire), nrep) cat("======================================================================\n") } # generate contaminated data using the function gendata with different # number of outliers and check if the M-estimate breaks - i.e. the # largest eigenvalue is larger than e.g. 5. # For n=50 and p=10 and d=5 the M-estimate can break for number of # outliers grater than 20. dogen <- function(){ eig <- vector("numeric",26) for(i in 0:25) { gg <- gendata(eps=i) mm <- CovMest(gg$x, t0=gg$tgood, S0=gg$sgood, arp=0.001) eig[i+1] <- ev <- getEvals(mm)[1] # cat(i, ev, "\n") stopifnot(ev < 5 || i > 20) } # plot(0:25, eig, type="l", xlab="Number of outliers", ylab="Largest Eigenvalue") } # # generate data 50x10 as multivariate normal N(0,I) and add # eps % outliers by adding d=5.0 to each component. # - if eps <0 and eps <=0.5, the number of outliers is eps*n # - if eps >= 1, it is the number of outliers # - use the center and cov of the good data as good start # - use the center and the cov of all data as a bad start # If using a good start, the M-estimate must iterate to # the good solution: the largest eigenvalue is less then e.g. 5 # gendata <- function(n=50, p=10, eps=0, d=5.0){ if(eps < 0 || eps > 0.5 && eps < 1.0 || eps > 0.5*n) stop("eps is out of range") library(MASS) x <- mvrnorm(n, rep(0,p), diag(p)) bad <- vector("numeric") nbad = if(eps < 1) eps*n else eps if(nbad > 0){ bad <- sample(n, nbad) x[bad,] <- x[bad,] + d } cov1 <- cov.wt(x) cov2 <- if(nbad <= 0) cov1 else cov.wt(x[-bad,]) list(x=x, bad=sort(bad), tgood=cov2$center, sgood=cov2$cov, tbad=cov1$center, sbad=cov1$cov) } pad.right <- function(z, pads) { ## Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } ## -- now do it: dodata() dogen() #cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' rrcov/tests/tmve4.Rout.save0000644000176200001440000003754512763517421015444 0ustar liggesusers R Under development (unstable) (2013-08-17 r63608) -- "Unsuffered Consequences" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: i386-w64-mingw32/i386 (32-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. > dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMVE","MASS")){ + ##@bdescr + ## Test the function covMve() on the literature datasets: + ## + ## Call covMve() for all regression datasets available in rrco/robustbasev and print: + ## - execution time (if time == TRUE) + ## - objective fucntion + ## - best subsample found (if short == false) + ## - outliers identified (with cutoff 0.975) (if short == false) + ## - estimated center and covarinance matrix if full == TRUE) + ## + ##@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 cente and covariance matrix + ##@in method : [character] select a method: one of (FASTMCD, MASS) + + domve <- function(x, xname, nrep=1){ + n <- dim(x)[1] + p <- dim(x)[2] + alpha <- 0.5 + h <- h.alpha.n(alpha, n, p) + if(method == "MASS"){ + mve <- cov.mve(x, quantile.used=h) + quan <- h #default: floor((n+p+1)/2) + crit <- mve$crit + best <- mve$best + mah <- mahalanobis(x, mve$center, mve$cov) + quantiel <- qchisq(0.975, p) + wt <- as.numeric(mah < quantiel) + } + else{ + mve <- CovMve(x, trace=FALSE) + quan <- as.integer(mve@quan) + crit <- log(mve@crit) + best <- mve@best + wt <- mve@wt + } + + + if(time){ + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + xres <- sprintf("%3d %3d %3d %12.6f %10.3f\n", dim(x)[1], dim(x)[2], quan, crit, xtime) + } + else{ + xres <- sprintf("%3d %3d %3d %12.6f\n", dim(x)[1], dim(x)[2], quan, crit) + } + + lpad<-lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + if(!short){ + cat("Best subsample: \n") + print(best) + + ibad <- which(wt == 0) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ", nbad, "\n") + if(nbad > 0) + print(ibad) + if(full){ + cat("-------------\n") + show(mve) + } + cat("--------------------------------------------------------\n") + } + } + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + lname <- 20 + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + method <- match.arg(method) + if(method == "MASS") + library(MASS) + + + data(heart) + data(starsCYG) + data(phosphor) + data(stackloss) + data(coleman) + data(salinity) + data(wood) + + data(hbk) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + data(milk) + data(bushfire) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p Half LOG(obj) Time\n") + cat("========================================================\n") + domve(heart[, 1:2], data(heart), nrep) + domve(starsCYG, data(starsCYG), nrep) + domve(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + domve(stack.x, data(stackloss), nrep) + domve(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + domve(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + domve(data.matrix(subset(wood, select = -y)), data(wood), nrep) + domve(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) + + domve(brain, "Animals", nrep) + domve(milk, data(milk), nrep) + domve(bushfire, data(bushfire), nrep) + cat("========================================================\n") + } > > dogen <- function(nrep=1, eps=0.49, method=c("FASTMVE", "MASS")){ + + domve <- function(x, nrep=1){ + gc() + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) + xtime + } + + set.seed(1234) + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + library(MASS) + + method <- match.arg(method) + + ap <- c(2, 5, 10, 20, 30) + an <- c(100, 500, 1000, 10000, 50000) + + tottime <- 0 + cat(" n p Time\n") + cat("=====================\n") + for(i in 1:length(an)) { + for(j in 1:length(ap)) { + n <- an[i] + p <- ap[j] + if(5*p <= n){ + xx <- gendata(n, p, eps) + X <- xx$X + tottime <- tottime + domve(X, nrep) + } + } + } + + cat("=====================\n") + cat("Total time: ", tottime*nrep, "\n") + } > > docheck <- function(n, p, eps){ + xx <- gendata(n,p,eps) + mve <- CovMve(xx$X) + check(mve, xx$xind) + } > > check <- function(mcd, xind){ + ## check if mcd is robust w.r.t xind, i.e. check how many of xind + ## did not get zero weight + mymatch <- xind %in% which(mcd@wt == 0) + length(xind) - length(which(mymatch)) + } > > dorep <- function(x, nrep=1, method=c("FASTMVE","MASS")){ + + method <- match.arg(method) + for(i in 1:nrep) + if(method == "MASS") + cov.mve(x) + else + CovMve(x) + } > > #### gendata() #### > # Generates a location contaminated multivariate > # normal sample of n observations in p dimensions > # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) > # where > # m = (b,b,...,b) > # Defaults: eps=0 and b=10 > # > gendata <- function(n,p,eps=0,b=10){ + + if(missing(n) || missing(p)) + stop("Please specify (n,p)") + if(eps < 0 || eps >= 0.5) + stop(message="eps must be in [0,0.5)") + X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) + nbad <- as.integer(eps * n) + if(nbad > 0){ + Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) + xind <- sample(n,nbad) + X[xind,] <- Xbad + } + list(X=X, xind=xind) + } > > pad.right <- function(z, pads) + { + ### Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > whatis<-function(x){ + if(is.data.frame(x)) + cat("Type: data.frame\n") + else if(is.matrix(x)) + cat("Type: matrix\n") + else if(is.vector(x)) + cat("Type: vector\n") + else + cat("Type: don't know\n") + } > > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > dodata() Call: dodata() Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 7 3.827606 Best subsample: [1] 1 4 7 8 9 10 11 Outliers: 3 [1] 2 6 12 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: height weight 34.9 27.0 Robust Estimate of Covariance: height weight height 142 217 weight 217 350 -------------------------------------------------------- starsCYG 47 2 25 -2.742997 Best subsample: [1] 2 4 6 8 12 13 16 23 24 25 26 28 31 32 33 37 38 39 41 42 43 44 45 46 47 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: log.Te log.light 4.41 4.93 Robust Estimate of Covariance: log.Te log.light log.Te 0.0173 0.0578 log.light 0.0578 0.3615 -------------------------------------------------------- phosphor 18 2 10 4.443101 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 3 [1] 1 6 10 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: inorg organic 15.2 39.4 Robust Estimate of Covariance: inorg organic inorg 188 230 organic 230 339 -------------------------------------------------------- stackloss 21 3 12 3.327582 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 3 [1] 1 2 3 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 56.7 20.2 85.5 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 34.31 11.07 23.54 Water.Temp 11.07 9.23 7.85 Acid.Conc. 23.54 7.85 47.35 -------------------------------------------------------- coleman 20 5 13 2.065143 Best subsample: [1] 1 3 4 5 7 8 11 14 16 17 18 19 20 Outliers: 5 [1] 2 6 9 10 13 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.79 44.26 3.59 25.08 6.38 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2920 1.1188 2.0421 0.3487 0.0748 fatherWc 1.1188 996.7540 338.6587 7.1673 23.1783 sstatus 2.0421 338.6587 148.2501 4.4894 7.8135 teacherSc 0.3487 7.1673 4.4894 0.9082 0.3204 motherLev 0.0748 23.1783 7.8135 0.3204 0.6024 -------------------------------------------------------- salinity 28 3 16 2.002555 Best subsample: [1] 1 7 8 9 12 13 14 18 19 20 21 22 25 26 27 28 Outliers: 5 [1] 5 11 16 23 24 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: X1 X2 X3 10.2 3.1 22.4 Robust Estimate of Covariance: X1 X2 X3 X1 14.387 1.153 -4.072 X2 1.153 5.005 -0.954 X3 -4.072 -0.954 2.222 -------------------------------------------------------- wood 20 5 13 -5.471407 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 5 [1] 4 6 8 11 19 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: x1 x2 x3 x4 x5 0.576 0.123 0.531 0.538 0.889 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 7.45e-03 1.11e-03 1.83e-03 -2.90e-05 -5.65e-04 x2 1.11e-03 3.11e-04 7.68e-04 3.37e-05 3.85e-05 x3 1.83e-03 7.68e-04 4.30e-03 -9.96e-04 -6.27e-05 x4 -2.90e-05 3.37e-05 -9.96e-04 3.02e-03 1.91e-03 x5 -5.65e-04 3.85e-05 -6.27e-05 1.91e-03 2.25e-03 -------------------------------------------------------- hbk 75 3 39 1.096831 Best subsample: [1] 15 17 18 19 20 21 24 27 28 30 32 33 35 36 40 41 42 43 44 46 48 49 50 53 54 [26] 55 56 58 59 64 65 66 67 70 71 72 73 74 75 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: X1 X2 X3 1.48 1.86 1.73 Robust Estimate of Covariance: X1 X2 X3 X1 1.695 0.230 0.265 X2 0.230 1.679 0.119 X3 0.265 0.119 1.683 -------------------------------------------------------- Animals 28 2 15 8.945423 Best subsample: [1] 1 3 4 5 10 11 17 18 21 22 23 24 26 27 28 Outliers: 9 [1] 2 6 7 9 12 14 15 16 25 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: body brain 48.3 127.3 Robust Estimate of Covariance: body brain body 10767 16872 brain 16872 46918 -------------------------------------------------------- milk 86 8 47 -1.160085 Best subsample: [1] 4 5 7 8 9 10 11 19 21 22 23 24 26 30 31 33 34 35 36 37 38 39 42 43 45 [26] 46 54 56 57 59 60 61 62 63 64 65 66 67 69 72 76 78 79 81 82 83 85 Outliers: 18 [1] 1 2 3 12 13 14 15 16 17 18 20 27 41 44 47 70 74 75 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.91 33.02 26.08 25.06 24.99 122.93 14.38 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 6.00e-07 1.51e-04 3.34e-04 3.09e-04 2.82e-04 2.77e-04 1.09e-03 X2 1.51e-04 2.03e+00 3.83e-01 3.04e-01 2.20e-01 3.51e-01 2.18e+00 X3 3.34e-04 3.83e-01 1.58e+00 1.21e+00 1.18e+00 1.20e+00 1.60e+00 X4 3.09e-04 3.04e-01 1.21e+00 9.82e-01 9.39e-01 9.53e-01 1.36e+00 X5 2.82e-04 2.20e-01 1.18e+00 9.39e-01 9.67e-01 9.52e-01 1.34e+00 X6 2.77e-04 3.51e-01 1.20e+00 9.53e-01 9.52e-01 9.92e-01 1.38e+00 X7 1.09e-03 2.18e+00 1.60e+00 1.36e+00 1.34e+00 1.38e+00 6.73e+00 X8 3.33e-05 2.92e-01 2.65e-01 1.83e-01 1.65e-01 1.76e-01 5.64e-01 X8 X1 3.33e-05 X2 2.92e-01 X3 2.65e-01 X4 1.83e-01 X5 1.65e-01 X6 1.76e-01 X7 5.64e-01 X8 1.80e-01 -------------------------------------------------------- bushfire 38 5 22 5.644315 Best subsample: [1] 1 2 3 4 5 6 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Outliers: 15 [1] 7 8 9 10 11 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovMve(x = x, trace = FALSE) -> Method: Minimum volume ellipsoid estimator Robust Estimate of Location: V1 V2 V3 V4 V5 107 147 263 215 277 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 519 375 -2799 -619 -509 V2 375 320 -1671 -342 -289 V3 -2799 -1671 18373 4314 3480 V4 -619 -342 4314 1076 854 V5 -509 -289 3480 854 683 -------------------------------------------------------- ======================================================== > > proc.time() user system elapsed 0.48 0.07 0.56 rrcov/tests/thubert.R0000644000176200001440000002106314177771243014366 0ustar liggesusersdodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method=c("hubert", "hubert.mcd", "locantore", "cov", "classic", "grid", "proj")) { ## Test the PcaXxx() functions on the literature datasets: ## ## Call PcaHubert() and the other functions for all regression ## data sets available in robustbase/rrcov and print: ## - execution time (if time == TRUE) ## - loadings ## - eigenvalues ## - scores ## dopca <- function(x, xname, nrep=1){ n <- dim(x)[1] p <- dim(x)[2] if(method == "hubert.mcd") pca <- PcaHubert(x, k=p) else if(method == "hubert") pca <- PcaHubert(x, mcd=FALSE) else if(method == "locantore") pca <- PcaLocantore(x) else if(method == "cov") pca <- PcaCov(x) else if(method == "classic") pca <- PcaClassic(x) else if(method == "grid") pca <- PcaGrid(x) else if(method == "proj") pca <- PcaProj(x) else stop("Undefined PCA method: ", method) e1 <- getEigenvalues(pca)[1] e2 <- getEigenvalues(pca)[2] k <- pca@k if(time){ xtime <- system.time(dorep(x, nrep, method))[1]/nrep xres <- sprintf("%3d %3d %3d %12.6f %12.6f %10.3f\n", dim(x)[1], dim(x)[2], k, e1, e2, xtime) } else{ xres <- sprintf("%3d %3d %3d %12.6f %12.6f\n", dim(x)[1], dim(x)[2], k, e1, e2) } lpad<-lname-nchar(xname) cat(pad.right(xname, lpad), xres) if(!short){ cat("Scores: \n") print(getScores(pca)) if(full){ cat("-------------\n") show(pca) } cat("----------------------------------------------------------\n") } } stopifnot(length(nrep) == 1, nrep >= 1) method <- match.arg(method) options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed lname <- 20 ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p k e1 e2\n") cat("==========================================================\n") dopca(heart[, 1:2], data(heart), nrep) dopca(starsCYG, data(starsCYG), nrep) dopca(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) dopca(stack.x, data(stackloss), nrep) ## dopca(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) # differences between the architectures dopca(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) ## dopca(data.matrix(subset(wood, select = -y)), data(wood), nrep) # differences between the architectures dopca(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) ## dopca(brain, "Animals", nrep) dopca(milk, data(milk), nrep) dopca(bushfire, data(bushfire), nrep) cat("==========================================================\n") } dogen <- function(nrep=1, eps=0.49, method=c("hubert", "hubert.mcd", "locantore", "cov")){ dopca <- function(x, nrep=1){ gc() xtime <- system.time(dorep(x, nrep, method))[1]/nrep cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) xtime } set.seed(1234) ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) method <- match.arg(method) ap <- c(2, 5, 10, 20, 30) an <- c(100, 500, 1000, 10000, 50000) tottime <- 0 cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- an[i] p <- ap[j] if(5*p <= n){ xx <- gendata(n, p, eps) X <- xx$X ## print(dimnames(X)) tottime <- tottime + dopca(X, nrep) } } } cat("=====================\n") cat("Total time: ", tottime*nrep, "\n") } dorep <- function(x, nrep=1, method=c("hubert", "hubert.mcd", "locantore", "cov")){ method <- match.arg(method) for(i in 1:nrep) if(method == "hubert.mcd") PcaHubert(x) else if(method == "hubert") PcaHubert(x, mcd=FALSE) else if(method == "locantore") PcaLocantore(x) else if(method == "cov") PcaCov(x) else stop("Undefined PCA method: ", method) } #### gendata() #### # Generates a location contaminated multivariate # normal sample of n observations in p dimensions # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) # where # m = (b,b,...,b) # Defaults: eps=0 and b=10 # gendata <- function(n,p,eps=0,b=10){ if(missing(n) || missing(p)) stop("Please specify (n,p)") if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) nbad <- as.integer(eps * n) xind <- vector("numeric") if(nbad > 0){ Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) xind <- sample(n,nbad) X[xind,] <- Xbad } list(X=X, xind=xind) } pad.right <- function(z, pads) { ### Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } whatis <- function(x){ if(is.data.frame(x)) cat("Type: data.frame\n") else if(is.matrix(x)) cat("Type: matrix\n") else if(is.vector(x)) cat("Type: vector\n") else cat("Type: don't know\n") } ################################################################# ## VT::27.08.2010 ## bug report from Stephen Milborrow ## test.case.1 <- function() { X <- matrix(c( -0.79984, -1.00103, 0.899794, 0.00000, 0.34279, 0.52832, -1.303783, -1.17670, -0.79984, -1.00103, 0.899794, 0.00000, 0.34279, 0.52832, -1.303783, -1.17670, 0.34279, 0.52832, -1.303783, -1.17670, 1.48542, 0.66735, 0.716162, 1.17670, -0.79984, -1.00103, 0.899794, 0.00000, 1.69317, 1.91864, -0.018363, 1.76505, -1.00759, -0.16684, -0.385626, 0.58835, -0.79984, -1.00103, 0.899794, 0.00000), ncol=4, byrow=TRUE) cc1 <- PcaHubert(X, k=3) cc2 <- PcaLocantore(X, k=3) cc3 <- PcaCov(X, k=3, cov.control=CovControlSest()) cc4 <- PcaProj(X, k=2) # with k=3 will produce warnings in .distances - too small eignevalues cc5 <- PcaGrid(X, k=2) # dito list(cc1, cc2, cc3, cc4, cc5) } ################################################################# ## VT::05.08.2016 ## bug report from Matthieu Lesnoff ## test.case.2 <- function() { do.test.case.2 <- function(z) { if(missing(z)) { set.seed(12345678) n <- 5 z <- data.frame(v1 = rnorm(n), v2 = rnorm(n), v3 = rnorm(n)) z } fm <- PcaLocantore(z, k = 2, scale = TRUE) fm@scale apply(z, MARGIN = 2, FUN = mad) scale(z, center = fm@center, scale = fm@scale) T <- fm@scores P <- fm@loadings E <- scale(z, center = fm@center, scale = fm@scale) - T %*% t(P) d2 <- apply(E^2, MARGIN = 1, FUN = sum) ## print(sqrt(d2)); print(fm@od) print(ret <- all.equal(sqrt(d2), fm@od)) ret } do.test.case.2() do.test.case.2(phosphor) do.test.case.2(stackloss) do.test.case.2(salinity) do.test.case.2(hbk) do.test.case.2(milk) do.test.case.2(bushfire) data(rice); do.test.case.2(rice) data(un86); do.test.case.2(un86) } ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) dodata(method="classic") dodata(method="hubert.mcd") dodata(method="hubert") dodata(method="locantore") dodata(method="cov") dodata(method="grid") ## IGNORE_RDIFF_BEGIN dodata(method="proj") ## IGNORE_RDIFF_END ## VT::14.11.2018 - commented out - on some platforms PcaHubert will choose only 1 PC ## and will show difference ## test.case.1() test.case.2() rrcov/tests/tsde.R0000644000176200001440000001306212763517421013643 0ustar liggesusers## Test for singularity doexact <- function(){ exact <-function(){ n1 <- 45 p <- 2 x1 <- matrix(rnorm(p*n1),nrow=n1, ncol=p) x1[,p] <- x1[,p] + 3 ## library(MASS) ## x1 <- mvrnorm(n=n1, mu=c(0,3), Sigma=diag(1,nrow=p)) n2 <- 55 m1 <- 0 m2 <- 3 x2 <- cbind(rnorm(n2),rep(m2,n2)) x<-rbind(x1,x2) colnames(x) <- c("X1","X2") x } print(CovSde(exact())) } dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE){ domcd <- function(x, xname, nrep=1){ n <- dim(x)[1] p <- dim(x)[2] mcd<-CovSde(x) if(time){ xtime <- system.time(dorep(x, nrep))[1]/nrep xres <- sprintf("%3d %3d %3d\n", dim(x)[1], dim(x)[2], xtime) } else{ xres <- sprintf("%3d %3d\n", dim(x)[1], dim(x)[2]) } lpad<-lname-nchar(xname) cat(pad.right(xname,lpad), xres) if(!short){ ibad <- which(mcd@wt==0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) if(full){ cat("-------------\n") show(mcd) } cat("--------------------------------------------------------\n") } } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed lname <- 20 ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p Half LOG(obj) Time\n") cat("========================================================\n") domcd(heart[, 1:2], data(heart), nrep) domcd(starsCYG, data(starsCYG), nrep) domcd(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) domcd(stack.x, data(stackloss), nrep) domcd(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) domcd(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) domcd(data.matrix(subset(wood, select = -y)), data(wood), nrep) domcd(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) domcd(brain, "Animals", nrep) domcd(milk, data(milk), nrep) domcd(bushfire, data(bushfire), nrep) ## VT::19.07.2010: test the univariate SDE for(i in 1:ncol(bushfire)) domcd(bushfire[i], data(bushfire), nrep) cat("========================================================\n") } dogen <- function(nrep=1, eps=0.49){ library(MASS) domcd <- function(x, nrep=1){ gc() xtime <- system.time(dorep(x, nrep))[1]/nrep cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) xtime } set.seed(1234) ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) ap <- c(2, 5, 10, 20, 30) an <- c(100, 500, 1000, 10000, 50000) tottime <- 0 cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- an[i] p <- ap[j] if(5*p <= n){ xx <- gendata(n, p, eps) X <- xx$X tottime <- tottime + domcd(X, nrep) } } } cat("=====================\n") cat("Total time: ", tottime*nrep, "\n") } docheck <- function(n, p, eps){ xx <- gendata(n,p,eps) mcd <- CovSde(xx$X) check(mcd, xx$xind) } check <- function(mcd, xind){ ## check if mcd is robust w.r.t xind, i.e. check how many of xind ## did not get zero weight mymatch <- xind %in% which(mcd@wt == 0) length(xind) - length(which(mymatch)) } dorep <- function(x, nrep=1){ for(i in 1:nrep) CovSde(x) } #### gendata() #### # Generates a location contaminated multivariate # normal sample of n observations in p dimensions # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) # where # m = (b,b,...,b) # Defaults: eps=0 and b=10 # gendata <- function(n,p,eps=0,b=10){ if(missing(n) || missing(p)) stop("Please specify (n,p)") if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) nbad <- as.integer(eps * n) if(nbad > 0){ Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) xind <- sample(n,nbad) X[xind,] <- Xbad } list(X=X, xind=xind) } pad.right <- function(z, pads) { ### Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } whatis<-function(x){ if(is.data.frame(x)) cat("Type: data.frame\n") else if(is.matrix(x)) cat("Type: matrix\n") else if(is.vector(x)) cat("Type: vector\n") else cat("Type: don't know\n") } ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) dodata() ##doexact() rrcov/tests/tsde.Rout.save0000644000176200001440000003505412763517421015335 0ustar liggesusers R Under development (unstable) (2013-08-17 r63608) -- "Unsuffered Consequences" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: i386-w64-mingw32/i386 (32-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 for singularity > doexact <- function(){ + exact <-function(){ + n1 <- 45 + p <- 2 + x1 <- matrix(rnorm(p*n1),nrow=n1, ncol=p) + x1[,p] <- x1[,p] + 3 + ## library(MASS) + ## x1 <- mvrnorm(n=n1, mu=c(0,3), Sigma=diag(1,nrow=p)) + + n2 <- 55 + m1 <- 0 + m2 <- 3 + x2 <- cbind(rnorm(n2),rep(m2,n2)) + x<-rbind(x1,x2) + colnames(x) <- c("X1","X2") + x + } + print(CovSde(exact())) + } > > dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE){ + + domcd <- function(x, xname, nrep=1){ + n <- dim(x)[1] + p <- dim(x)[2] + + mcd<-CovSde(x) + + if(time){ + xtime <- system.time(dorep(x, nrep))[1]/nrep + xres <- sprintf("%3d %3d %3d\n", dim(x)[1], dim(x)[2], xtime) + } + else{ + xres <- sprintf("%3d %3d\n", dim(x)[1], dim(x)[2]) + } + lpad<-lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + if(!short){ + + ibad <- which(mcd@wt==0) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ",nbad,"\n") + if(nbad > 0) + print(ibad) + if(full){ + cat("-------------\n") + show(mcd) + } + cat("--------------------------------------------------------\n") + } + } + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + lname <- 20 + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + data(heart) + data(starsCYG) + data(phosphor) + data(stackloss) + data(coleman) + data(salinity) + data(wood) + + data(hbk) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + data(milk) + data(bushfire) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p Half LOG(obj) Time\n") + cat("========================================================\n") + domcd(heart[, 1:2], data(heart), nrep) + domcd(starsCYG, data(starsCYG), nrep) + domcd(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + domcd(stack.x, data(stackloss), nrep) + domcd(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + domcd(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + domcd(data.matrix(subset(wood, select = -y)), data(wood), nrep) + domcd(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) + + domcd(brain, "Animals", nrep) + domcd(milk, data(milk), nrep) + domcd(bushfire, data(bushfire), nrep) + ## VT::19.07.2010: test the univariate SDE + for(i in 1:ncol(bushfire)) + domcd(bushfire[i], data(bushfire), nrep) + cat("========================================================\n") + } > > dogen <- function(nrep=1, eps=0.49){ + + library(MASS) + domcd <- function(x, nrep=1){ + gc() + xtime <- system.time(dorep(x, nrep))[1]/nrep + cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) + xtime + } + + set.seed(1234) + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + ap <- c(2, 5, 10, 20, 30) + an <- c(100, 500, 1000, 10000, 50000) + + tottime <- 0 + cat(" n p Time\n") + cat("=====================\n") + for(i in 1:length(an)) { + for(j in 1:length(ap)) { + n <- an[i] + p <- ap[j] + if(5*p <= n){ + xx <- gendata(n, p, eps) + X <- xx$X + tottime <- tottime + domcd(X, nrep) + } + } + } + + cat("=====================\n") + cat("Total time: ", tottime*nrep, "\n") + } > > docheck <- function(n, p, eps){ + xx <- gendata(n,p,eps) + mcd <- CovSde(xx$X) + check(mcd, xx$xind) + } > > check <- function(mcd, xind){ + ## check if mcd is robust w.r.t xind, i.e. check how many of xind + ## did not get zero weight + mymatch <- xind %in% which(mcd@wt == 0) + length(xind) - length(which(mymatch)) + } > > dorep <- function(x, nrep=1){ + + for(i in 1:nrep) + CovSde(x) + } > > #### gendata() #### > # Generates a location contaminated multivariate > # normal sample of n observations in p dimensions > # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) > # where > # m = (b,b,...,b) > # Defaults: eps=0 and b=10 > # > gendata <- function(n,p,eps=0,b=10){ + + if(missing(n) || missing(p)) + stop("Please specify (n,p)") + if(eps < 0 || eps >= 0.5) + stop(message="eps must be in [0,0.5)") + X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) + nbad <- as.integer(eps * n) + if(nbad > 0){ + Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) + xind <- sample(n,nbad) + X[xind,] <- Xbad + } + list(X=X, xind=xind) + } > > pad.right <- function(z, pads) + { + ### Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > whatis<-function(x){ + if(is.data.frame(x)) + cat("Type: data.frame\n") + else if(is.matrix(x)) + cat("Type: matrix\n") + else if(is.vector(x)) + cat("Type: vector\n") + else + cat("Type: don't know\n") + } > > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > dodata() Call: dodata() Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 Outliers: 5 [1] 2 6 8 10 12 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: height weight 39.8 35.7 Robust Estimate of Covariance: height weight height 38.2 77.1 weight 77.1 188.1 -------------------------------------------------------- starsCYG 47 2 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: log.Te log.light 4.42 4.96 Robust Estimate of Covariance: log.Te log.light log.Te 0.0163 0.0522 log.light 0.0522 0.3243 -------------------------------------------------------- phosphor 18 2 Outliers: 2 [1] 1 6 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: inorg organic 13.3 39.7 Robust Estimate of Covariance: inorg organic inorg 133 134 organic 134 204 -------------------------------------------------------- stackloss 21 3 Outliers: 6 [1] 1 2 3 15 17 21 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 57.8 20.7 86.4 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 39.7 15.6 25.0 Water.Temp 15.6 13.0 11.9 Acid.Conc. 25.0 11.9 40.3 -------------------------------------------------------- coleman 20 5 Outliers: 8 [1] 1 2 6 10 11 12 15 18 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.78 58.64 9.09 25.37 6.69 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2556 -1.0144 0.6599 0.2673 0.0339 fatherWc -1.0144 1615.9192 382.7846 -4.8287 36.0227 sstatus 0.6599 382.7846 108.1781 -0.7904 9.1027 teacherSc 0.2673 -4.8287 -0.7904 0.9346 -0.0239 motherLev 0.0339 36.0227 9.1027 -0.0239 0.9155 -------------------------------------------------------- salinity 28 3 Outliers: 9 [1] 3 4 5 9 11 16 19 23 24 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: X1 X2 X3 10.84 3.35 22.48 Robust Estimate of Covariance: X1 X2 X3 X1 10.75 -1.62 -2.05 X2 -1.62 4.21 -1.43 X3 -2.05 -1.43 2.63 -------------------------------------------------------- wood 20 5 Outliers: 11 [1] 4 6 7 8 9 10 12 13 16 19 20 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: x1 x2 x3 x4 x5 0.573 0.119 0.517 0.549 0.904 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.025185 0.004279 -0.001262 -0.000382 -0.001907 x2 0.004279 0.001011 0.000197 -0.000117 0.000247 x3 -0.001262 0.000197 0.003042 0.002034 0.001773 x4 -0.000382 -0.000117 0.002034 0.007943 0.001137 x5 -0.001907 0.000247 0.001773 0.001137 0.005392 -------------------------------------------------------- hbk 75 3 Outliers: 15 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 53 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: X1 X2 X3 1.59 1.79 1.67 Robust Estimate of Covariance: X1 X2 X3 X1 1.6354 0.0793 0.2284 X2 0.0793 1.6461 0.3186 X3 0.2284 0.3186 1.5673 -------------------------------------------------------- Animals 28 2 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 4702 7973 brain 7973 28571 -------------------------------------------------------- milk 86 8 Outliers: 21 [1] 1 2 3 6 11 12 13 14 15 16 17 18 20 27 41 44 47 70 74 75 77 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.90 33.04 26.11 25.10 25.02 123.06 14.37 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 4.73e-07 6.57e-05 1.79e-04 1.71e-04 1.62e-04 1.42e-04 6.85e-04 X2 6.57e-05 1.57e+00 1.36e-01 9.28e-02 4.18e-02 1.30e-01 1.58e+00 X3 1.79e-04 1.36e-01 1.12e+00 8.20e-01 8.27e-01 8.00e-01 6.66e-01 X4 1.71e-04 9.28e-02 8.20e-01 6.57e-01 6.41e-01 6.18e-01 5.47e-01 X5 1.62e-04 4.18e-02 8.27e-01 6.41e-01 6.93e-01 6.44e-01 5.71e-01 X6 1.42e-04 1.30e-01 8.00e-01 6.18e-01 6.44e-01 6.44e-01 5.55e-01 X7 6.85e-04 1.58e+00 6.66e-01 5.47e-01 5.71e-01 5.55e-01 4.17e+00 X8 1.40e-05 2.33e-01 1.74e-01 1.06e-01 9.44e-02 9.86e-02 3.54e-01 X8 X1 1.40e-05 X2 2.33e-01 X3 1.74e-01 X4 1.06e-01 X5 9.44e-02 X6 9.86e-02 X7 3.54e-01 X8 1.57e-01 -------------------------------------------------------- bushfire 38 5 Outliers: 23 [1] 1 5 6 7 8 9 10 11 12 13 15 16 28 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V1 V2 V3 V4 V5 105 148 287 223 283 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 1964 1712 -10230 -2504 -2066 V2 1712 1526 -8732 -2145 -1763 V3 -10230 -8732 56327 13803 11472 V4 -2504 -2145 13803 3509 2894 V5 -2066 -1763 11472 2894 2404 -------------------------------------------------------- bushfire 38 1 Outliers: 2 [1] 13 30 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V1 98.5 Robust Estimate of Covariance: V1 V1 431 -------------------------------------------------------- bushfire 38 1 Outliers: 6 [1] 33 34 35 36 37 38 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V2 141 Robust Estimate of Covariance: V2 V2 528 -------------------------------------------------------- bushfire 38 1 Outliers: 0 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V3 238 Robust Estimate of Covariance: V3 V3 37148 -------------------------------------------------------- bushfire 38 1 Outliers: 9 [1] 8 9 32 33 34 35 36 37 38 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V4 210 Robust Estimate of Covariance: V4 V4 2543 -------------------------------------------------------- bushfire 38 1 Outliers: 9 [1] 8 9 32 33 34 35 36 37 38 ------------- Call: CovSde(x = x) -> Method: Stahel-Donoho estimator Robust Estimate of Location: V5 273 Robust Estimate of Covariance: V5 V5 1575 -------------------------------------------------------- ======================================================== > ##doexact() > > proc.time() user system elapsed 0.45 0.10 0.54 rrcov/tests/tmve4.R0000644000176200001440000001607212763517421013747 0ustar liggesusersdodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMVE","MASS")){ ##@bdescr ## Test the function covMve() on the literature datasets: ## ## Call covMve() for all regression datasets available in rrco/robustbasev and print: ## - execution time (if time == TRUE) ## - objective fucntion ## - best subsample found (if short == false) ## - outliers identified (with cutoff 0.975) (if short == false) ## - estimated center and covarinance matrix if full == TRUE) ## ##@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 cente and covariance matrix ##@in method : [character] select a method: one of (FASTMCD, MASS) domve <- function(x, xname, nrep=1){ n <- dim(x)[1] p <- dim(x)[2] alpha <- 0.5 h <- h.alpha.n(alpha, n, p) if(method == "MASS"){ mve <- cov.mve(x, quantile.used=h) quan <- h #default: floor((n+p+1)/2) crit <- mve$crit best <- mve$best mah <- mahalanobis(x, mve$center, mve$cov) quantiel <- qchisq(0.975, p) wt <- as.numeric(mah < quantiel) } else{ mve <- CovMve(x, trace=FALSE) quan <- as.integer(mve@quan) crit <- log(mve@crit) best <- mve@best wt <- mve@wt } if(time){ xtime <- system.time(dorep(x, nrep, method))[1]/nrep xres <- sprintf("%3d %3d %3d %12.6f %10.3f\n", dim(x)[1], dim(x)[2], quan, crit, xtime) } else{ xres <- sprintf("%3d %3d %3d %12.6f\n", dim(x)[1], dim(x)[2], quan, crit) } lpad<-lname-nchar(xname) cat(pad.right(xname,lpad), xres) if(!short){ cat("Best subsample: \n") print(best) ibad <- which(wt == 0) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ", nbad, "\n") if(nbad > 0) print(ibad) if(full){ cat("-------------\n") show(mve) } cat("--------------------------------------------------------\n") } } options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed lname <- 20 ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) method <- match.arg(method) if(method == "MASS") library(MASS) data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p Half LOG(obj) Time\n") cat("========================================================\n") domve(heart[, 1:2], data(heart), nrep) domve(starsCYG, data(starsCYG), nrep) domve(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) domve(stack.x, data(stackloss), nrep) domve(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) domve(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) domve(data.matrix(subset(wood, select = -y)), data(wood), nrep) domve(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) domve(brain, "Animals", nrep) domve(milk, data(milk), nrep) domve(bushfire, data(bushfire), nrep) cat("========================================================\n") } dogen <- function(nrep=1, eps=0.49, method=c("FASTMVE", "MASS")){ domve <- function(x, nrep=1){ gc() xtime <- system.time(dorep(x, nrep, method))[1]/nrep cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) xtime } set.seed(1234) ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) method <- match.arg(method) ap <- c(2, 5, 10, 20, 30) an <- c(100, 500, 1000, 10000, 50000) tottime <- 0 cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- an[i] p <- ap[j] if(5*p <= n){ xx <- gendata(n, p, eps) X <- xx$X tottime <- tottime + domve(X, nrep) } } } cat("=====================\n") cat("Total time: ", tottime*nrep, "\n") } docheck <- function(n, p, eps){ xx <- gendata(n,p,eps) mve <- CovMve(xx$X) check(mve, xx$xind) } check <- function(mcd, xind){ ## check if mcd is robust w.r.t xind, i.e. check how many of xind ## did not get zero weight mymatch <- xind %in% which(mcd@wt == 0) length(xind) - length(which(mymatch)) } dorep <- function(x, nrep=1, method=c("FASTMVE","MASS")){ method <- match.arg(method) for(i in 1:nrep) if(method == "MASS") cov.mve(x) else CovMve(x) } #### gendata() #### # Generates a location contaminated multivariate # normal sample of n observations in p dimensions # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) # where # m = (b,b,...,b) # Defaults: eps=0 and b=10 # gendata <- function(n,p,eps=0,b=10){ if(missing(n) || missing(p)) stop("Please specify (n,p)") if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) nbad <- as.integer(eps * n) if(nbad > 0){ Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) xind <- sample(n,nbad) X[xind,] <- Xbad } list(X=X, xind=xind) } pad.right <- function(z, pads) { ### Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } whatis<-function(x){ if(is.data.frame(x)) cat("Type: data.frame\n") else if(is.matrix(x)) cat("Type: matrix\n") else if(is.vector(x)) cat("Type: vector\n") else cat("Type: don't know\n") } ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) dodata() rrcov/tests/tlda.R0000644000176200001440000000634213710027637013631 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) library(MASS) ## VT::14.01.2020 ## On some platforms minor differences are shown - use ## IGNORE_RDIFF_BEGIN ## IGNORE_RDIFF_END dodata <- function(method) { options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("===================================================\n") cat("\nData: ", "hemophilia\n") data(hemophilia) show(rlda <- Linda(as.factor(gr)~., data=hemophilia, method=method)) show(predict(rlda)) cat("\nData: ", "anorexia\n") data(anorexia) show(rlda <- Linda(Treat~., data=anorexia, method=method)) show(predict(rlda)) cat("\nData: ", "Pima\n") data(Pima.tr) show(rlda <- Linda(type~., data=Pima.tr, method=method)) show(predict(rlda)) cat("\nData: ", "Forest soils\n") data(soil) soil1983 <- soil[soil$D == 0, -2] # only 1983, remove column D (always 0) ## This will not work within the function, of course ## - comment it out ## IGNORE_RDIFF_BEGIN rlda <- Linda(F~., data=soil1983, method=method) ## show(rlda) ## IGNORE_RDIFF_END show(predict(rlda)) cat("\nData: ", "Raven and Miller diabetes data\n") data(diabetes) show(rlda <- Linda(group~insulin+glucose+sspg, data=diabetes, method=method)) show(predict(rlda)) cat("\nData: ", "iris\n") data(iris) if(method != "mcdA") { show(rlda <- Linda(Species~., data=iris, method=method, l1med=TRUE)) show(predict(rlda)) } cat("\nData: ", "crabs\n") data(crabs) show(rlda <- Linda(sp~., data=crabs, method=method)) show(predict(rlda)) cat("\nData: ", "fish\n") data(fish) fish <- fish[-14,] # remove observation #14 containing missing value # The height and width are calculated as percentages # of the third length variable fish[,5] <- fish[,5]*fish[,4]/100 fish[,6] <- fish[,6]*fish[,4]/100 ## There is one class with only 6 observations (p=6). Normally ## Linda will fail, therefore use l1med=TRUE. ## This works only for methods mcdB and mcdC table(fish$Species) if(method != "mcdA") { ## IGNORE_RDIFF_BEGIN rlda <- Linda(Species~., data=fish, method=method, l1med=TRUE) ## show(rlda) ## IGNORE_RDIFF_END show(predict(rlda)) } cat("\nData: ", "pottery\n") data(pottery) show(rlda <- Linda(origin~., data=pottery, method=method)) show(predict(rlda)) cat("\nData: ", "olitos\n") data(olitos) if(method != "mcdA") { ## IGNORE_RDIFF_BEGIN rlda <- Linda(grp~., data=olitos, method=method, l1med=TRUE) ## show(rlda) ## IGNORE_RDIFF_END show(predict(rlda)) } cat("===================================================\n") } ## -- now do it: dodata(method="mcdA") dodata(method="mcdB") dodata(method="mcdC") dodata(method="mrcd") dodata(method="ogk") #dodata(method="fsa") rrcov/tests/tmcd4.Rout.save0000644000176200001440000030533413564754563015424 0ustar liggesusers R Under development (unstable) (2019-10-19 r77318) -- "Unsuffered Consequences" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (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 the exact fit property of CovMcd > doexactfit <- function(){ + exact <-function(seed=1234){ + + set.seed(seed) + + n1 <- 45 + p <- 2 + x1 <- matrix(rnorm(p*n1),nrow=n1, ncol=p) + x1[,p] <- x1[,p] + 3 + n2 <- 55 + m1 <- 0 + m2 <- 3 + x2 <- cbind(rnorm(n2),rep(m2,n2)) + x<-rbind(x1,x2) + colnames(x) <- c("X1","X2") + x + } + print(CovMcd(exact())) + } > > dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMCD","MASS", "deterministic", "exact", "MRCD")){ + ##@bdescr + ## Test the function covMcd() on the literature datasets: + ## + ## Call CovMcd() for all regression datasets available in rrcov and print: + ## - execution time (if time == TRUE) + ## - objective fucntion + ## - best subsample found (if short == false) + ## - outliers identified (with cutoff 0.975) (if short == false) + ## - estimated center and covarinance matrix if full == TRUE) + ## + ##@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 cente and covariance matrix + ##@in method : [character] select a method: one of (FASTMCD, MASS) + + doest <- function(x, xname, nrep=1){ + n <- dim(x)[1] + p <- dim(x)[2] + if(method == "MASS"){ + mcd<-cov.mcd(x) + quan <- as.integer(floor((n + p + 1)/2)) #default: floor((n+p+1)/2) + } + else{ + mcd <- if(method=="deterministic") CovMcd(x, nsamp="deterministic", trace=FALSE) + else if(method=="exact") CovMcd(x, nsamp="exact", trace=FALSE) + else if(method=="MRCD") CovMrcd(x, trace=FALSE) + else CovMcd(x, trace=FALSE) + quan <- as.integer(mcd@quan) + } + + crit <- mcd@crit + + if(time){ + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + xres <- sprintf("%3d %3d %3d %12.6f %10.3f\n", dim(x)[1], dim(x)[2], quan, crit, xtime) + } + else{ + xres <- sprintf("%3d %3d %3d %12.6f\n", dim(x)[1], dim(x)[2], quan, crit) + } + lpad<-lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + if(!short){ + cat("Best subsample: \n") + if(length(mcd@best) > 150) + cat("Too long... \n") + else + print(mcd@best) + + ibad <- which(mcd@wt==0) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ",nbad,"\n") + if(nbad > 0 & nbad < 150) + print(ibad) + else + cat("Too many to print ... \n") + if(full){ + cat("-------------\n") + show(mcd) + } + cat("--------------------------------------------------------\n") + } + } + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + lname <- 20 + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + method <- match.arg(method) + if(method == "MASS") + library(MASS) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + + data(fish) + data(pottery) + data(rice) + data(un86) + data(wages) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p Half LOG(obj) Time\n") + cat("========================================================\n") + + if(method=="exact") + { + ## only small data sets + doest(heart[, 1:2], data(heart), nrep) + doest(starsCYG, data(starsCYG), nrep) + doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + doest(data.matrix(subset(wood, select = -y)), data(wood), nrep) + doest(brain, "Animals", nrep) + doest(lactic, data(lactic), nrep) + doest(pension, data(pension), nrep) + doest(data.matrix(subset(vaso, select = -Y)), data(vaso), nrep) + doest(stack.x, data(stackloss), nrep) + doest(pilot, data(pilot), nrep) + } else + { + doest(heart[, 1:2], data(heart), nrep) + doest(starsCYG, data(starsCYG), nrep) + doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + doest(stack.x, data(stackloss), nrep) + doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) + doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + doest(data.matrix(subset(wood, select = -y)), data(wood), nrep) + doest(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) + + doest(brain, "Animals", nrep) + ## doest(milk, data(milk), nrep) # difference between 386 and x64 + doest(bushfire, data(bushfire), nrep) + + doest(lactic, data(lactic), nrep) + doest(pension, data(pension), nrep) + ## doest(pilot, data(pilot), nrep) # difference between 386 and x64 + + if(method != "MRCD") # these two are quite slow for MRCD, especially the second one + { + doest(radarImage, data(radarImage), nrep) + doest(NOxEmissions, data(NOxEmissions), nrep) + } + + doest(data.matrix(subset(vaso, select = -Y)), data(vaso), nrep) + doest(data.matrix(subset(wagnerGrowth, select = -Period)), data(wagnerGrowth), nrep) + + doest(data.matrix(subset(fish, select = -Species)), data(fish), nrep) + doest(data.matrix(subset(pottery, select = -origin)), data(pottery), nrep) + doest(rice, data(rice), nrep) + doest(un86, data(un86), nrep) + + doest(wages, data(wages), nrep) + + ## from package 'datasets' + doest(airquality[,1:4], data(airquality), nrep) + doest(attitude, data(attitude), nrep) + doest(attenu, data(attenu), nrep) + doest(USJudgeRatings, data(USJudgeRatings), nrep) + doest(USArrests, data(USArrests), nrep) + doest(longley, data(longley), nrep) + doest(Loblolly, data(Loblolly), nrep) + doest(quakes[,1:4], data(quakes), nrep) + } + cat("========================================================\n") + } > > dogen <- function(nrep=1, eps=0.49, method=c("FASTMCD", "MASS")){ + + doest <- function(x, nrep=1){ + gc() + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) + xtime + } + + set.seed(1234) + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + library(MASS) + method <- match.arg(method) + + ap <- c(2, 5, 10, 20, 30) + an <- c(100, 500, 1000, 10000, 50000) + + tottime <- 0 + cat(" n p Time\n") + cat("=====================\n") + for(i in 1:length(an)) { + for(j in 1:length(ap)) { + n <- an[i] + p <- ap[j] + if(5*p <= n){ + xx <- gendata(n, p, eps) + X <- xx$X + tottime <- tottime + doest(X, nrep) + } + } + } + + cat("=====================\n") + cat("Total time: ", tottime*nrep, "\n") + } > > docheck <- function(n, p, eps){ + xx <- gendata(n,p,eps) + mcd <- CovMcd(xx$X) + check(mcd, xx$xind) + } > > check <- function(mcd, xind){ + ## check if mcd is robust w.r.t xind, i.e. check how many of xind + ## did not get zero weight + mymatch <- xind %in% which(mcd@wt == 0) + length(xind) - length(which(mymatch)) + } > > dorep <- function(x, nrep=1, method=c("FASTMCD","MASS", "deterministic", "exact", "MRCD")){ + + method <- match.arg(method) + for(i in 1:nrep) + if(method == "MASS") + cov.mcd(x) + else + { + if(method=="deterministic") CovMcd(x, nsamp="deterministic", trace=FALSE) + else if(method=="exact") CovMcd(x, nsamp="exact", trace=FALSE) + else if(method=="MRCD") CovMrcd(x, trace=FALSE) + else CovMcd(x, trace=FALSE) + } + } > > #### gendata() #### > # Generates a location contaminated multivariate > # normal sample of n observations in p dimensions > # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) > # where > # m = (b,b,...,b) > # Defaults: eps=0 and b=10 > # > gendata <- function(n,p,eps=0,b=10){ + + if(missing(n) || missing(p)) + stop("Please specify (n,p)") + if(eps < 0 || eps >= 0.5) + stop(message="eps must be in [0,0.5)") + X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) + nbad <- as.integer(eps * n) + if(nbad > 0){ + Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) + xind <- sample(n,nbad) + X[xind,] <- Xbad + } + list(X=X, xind=xind) + } > > pad.right <- function(z, pads) + { + ### Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > whatis<-function(x){ + if(is.data.frame(x)) + cat("Type: data.frame\n") + else if(is.matrix(x)) + cat("Type: matrix\n") + else if(is.vector(x)) + cat("Type: vector\n") + else + cat("Type: don't know\n") + } > > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > dodata() Call: dodata() Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 Too many to print ... ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=7); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: height weight 38.3 33.1 Robust Estimate of Covariance: height weight height 157 303 weight 303 660 -------------------------------------------------------- starsCYG 47 2 25 -8.031215 Best subsample: [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 Outliers: 6 [1] 7 11 14 20 30 34 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=25); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: log.Te log.light 4.41 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0171 0.0511 log.light 0.0511 0.3555 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 2 [1] 1 6 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=10); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: inorg organic 13.4 38.8 Robust Estimate of Covariance: inorg organic inorg 181 184 organic 184 256 -------------------------------------------------------- stackloss 21 3 12 5.472581 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 9 [1] 1 2 3 15 16 17 18 19 21 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=12); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 59.5 20.8 87.3 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 12.6 11.7 11.5 Water.Temp 11.7 18.5 12.3 Acid.Conc. 11.5 12.3 46.6 -------------------------------------------------------- coleman 20 5 13 1.286808 Best subsample: [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 Outliers: 7 [1] 1 6 9 10 11 15 18 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=13); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.76 48.38 6.12 25.00 6.40 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.381 2.685 -0.400 0.228 0.113 fatherWc 2.685 1959.466 496.858 18.948 51.871 sstatus -0.400 496.858 180.236 5.762 15.230 teacherSc 0.228 18.948 5.762 1.180 0.835 motherLev 0.113 51.871 15.230 0.835 1.567 -------------------------------------------------------- salinity 28 3 16 1.326364 Best subsample: [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 4 [1] 5 16 23 24 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=16); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: X1 X2 X3 10.08 2.78 22.78 Robust Estimate of Covariance: X1 X2 X3 X1 13.87 1.34 -4.24 X2 1.34 5.10 -1.92 X3 -4.24 -1.92 3.17 -------------------------------------------------------- wood 20 5 13 -36.270094 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=13); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: x1 x2 x3 x4 x5 0.587 0.122 0.531 0.538 0.892 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 1.51e-02 2.83e-03 4.74e-03 -8.81e-04 -2.45e-03 x2 2.83e-03 7.29e-04 1.91e-03 -7.82e-05 3.55e-05 x3 4.74e-03 1.91e-03 9.97e-03 -1.31e-03 5.30e-04 x4 -8.81e-04 -7.82e-05 -1.31e-03 4.28e-03 2.75e-03 x5 -2.45e-03 3.55e-05 5.30e-04 2.75e-03 4.16e-03 -------------------------------------------------------- hbk 75 3 39 -1.047858 Best subsample: [1] 15 16 17 18 19 20 21 22 23 24 26 27 31 32 33 35 36 37 38 40 43 49 50 51 54 [26] 55 56 58 59 61 63 64 66 67 70 71 72 73 74 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=39); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: X1 X2 X3 1.54 1.78 1.69 Robust Estimate of Covariance: X1 X2 X3 X1 1.6528 0.0741 0.1713 X2 0.0741 1.6823 0.2055 X3 0.1713 0.2055 1.5624 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=15); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 2511 4258 brain 4258 15257 -------------------------------------------------------- bushfire 38 5 22 18.135810 Best subsample: [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Outliers: 16 [1] 7 8 9 10 11 12 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=22); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: V1 V2 V3 V4 V5 105 147 274 218 279 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 567 439 -2771 -624 -509 V2 439 387 -1843 -376 -318 V3 -2771 -1843 16367 4021 3196 V4 -624 -376 4021 1059 827 V5 -509 -318 3196 827 652 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 3 [1] 17 19 20 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=11); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: X Y 3.86 5.01 Robust Estimate of Covariance: X Y X 19.8 27.3 Y 27.3 39.8 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 4 [1] 15 16 17 18 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=10); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Income Reserves 52.3 560.9 Robust Estimate of Covariance: Income Reserves Income 2534 21294 Reserves 21294 372356 -------------------------------------------------------- radarImage 1573 5 789 36.694425 Best subsample: Too long... Outliers: 73 [1] 262 450 451 480 481 509 535 542 597 643 669 697 803 804 832 [16] 833 834 862 863 864 892 989 1123 1145 1223 1224 1232 1233 1249 1250 [31] 1267 1303 1347 1357 1375 1411 1419 1420 1443 1453 1504 1510 1511 1512 1518 [46] 1519 1520 1521 1525 1526 1543 1544 1546 1547 1548 1549 1550 1551 1552 1553 [61] 1554 1555 1557 1558 1561 1562 1564 1565 1566 1569 1570 1571 1573 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=789); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: X.coord Y.coord Band.1 Band.2 Band.3 52.80 35.12 6.77 18.44 8.90 Robust Estimate of Covariance: X.coord Y.coord Band.1 Band.2 Band.3 X.coord 148.0 27.5 -433.2 -236.0 -27.0 Y.coord 27.5 479.5 41.0 -228.8 -46.8 Band.1 -433.2 41.0 32520.8 9790.3 567.0 Band.2 -236.0 -228.8 9790.3 31148.9 1140.0 Band.3 -27.0 -46.8 567.0 1140.0 5336.9 -------------------------------------------------------- NOxEmissions 8088 4 4046 2.474539 Best subsample: Too long... Outliers: 1515 Too many to print ... ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=4046); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: julday LNOx LNOxEm sqrtWS 168.19 4.73 7.91 1.37 Robust Estimate of Covariance: julday LNOx LNOxEm sqrtWS julday 1.37e+04 1.79e+01 1.07e+00 -1.51e+01 LNOx 1.79e+01 7.03e-01 2.11e-01 -2.27e-01 LNOxEm 1.07e+00 2.11e-01 3.75e-01 6.52e-02 sqrtWS -1.51e+01 -2.27e-01 6.52e-02 3.09e-01 -------------------------------------------------------- vaso 39 2 21 -3.972244 Best subsample: [1] 3 4 8 14 18 19 20 21 22 23 24 25 26 27 28 33 34 35 37 38 39 Outliers: 3 [1] 1 2 17 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=21); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Volume Rate 1.16 1.72 Robust Estimate of Covariance: Volume Rate Volume 0.406 -0.216 Rate -0.216 0.945 -------------------------------------------------------- wagnerGrowth 63 6 35 6.572208 Best subsample: [1] 2 3 4 5 6 7 9 10 11 12 13 14 16 17 18 20 23 25 27 31 32 35 36 38 44 [26] 48 51 52 53 54 55 56 57 60 62 Outliers: 10 [1] 1 8 21 22 29 33 42 43 50 63 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=35); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Region PA GPA HS GHS y 11.00 33.66 -2.00 2.48 0.31 7.48 Robust Estimate of Covariance: Region PA GPA HS GHS y Region 45.5790 22.9855 -0.6840 -1.2234 -0.3964 -17.9553 PA 22.9855 35.5456 -6.2825 -1.8167 0.0439 -36.7897 GPA -0.6840 -6.2825 6.8455 0.3448 -0.1902 5.1276 HS -1.2234 -1.8167 0.3448 1.1102 -0.0582 3.7199 GHS -0.3964 0.0439 -0.1902 -0.0582 0.2271 0.9558 y -17.9553 -36.7897 5.1276 3.7199 0.9558 105.9803 -------------------------------------------------------- fish 159 6 82 8.879005 Best subsample: [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 20 21 22 23 24 25 26 27 28 30 32 35 36 37 42 43 44 45 46 [39] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 107 109 110 111 113 [58] 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 [77] 134 135 136 137 138 139 Outliers: 51 [1] 39 41 62 63 64 65 66 68 69 73 74 75 76 77 78 79 80 81 82 [20] 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 [39] 103 104 143 145 148 150 152 153 155 156 157 158 159 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=82); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 329.9 24.5 26.6 29.7 31.1 14.7 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 104103.18 2226.96 2431.64 3002.74 2168.96 -93.61 Length1 2226.96 52.26 56.68 68.58 43.43 -1.97 Length2 2431.64 56.68 61.60 74.62 47.94 -2.12 Length3 3002.74 68.58 74.62 92.16 64.27 -3.40 Height 2168.96 43.43 47.94 64.27 70.43 -4.24 Width -93.61 -1.97 -2.12 -3.40 -4.24 1.52 -------------------------------------------------------- pottery 27 6 17 -10.586933 Best subsample: [1] 1 2 4 5 6 9 10 11 13 14 15 19 20 21 22 26 27 Outliers: 9 [1] 3 8 12 16 17 18 23 24 25 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=17); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: SI AL FE MG CA TI 54.983 15.206 9.700 3.817 5.211 0.859 Robust Estimate of Covariance: SI AL FE MG CA TI SI 29.12922 3.23731 -0.02886 3.00952 -2.55067 0.12484 AL 3.23731 5.71205 -0.89190 -3.53767 0.29497 -0.02885 FE -0.02886 -0.89190 0.39349 0.75550 -0.49711 0.02020 MG 3.00952 -3.53767 0.75550 3.95652 -0.22341 0.04029 CA -2.55067 0.29497 -0.49711 -0.22341 1.74417 -0.04904 TI 0.12484 -0.02885 0.02020 0.04029 -0.04904 0.00248 -------------------------------------------------------- rice 105 6 56 -14.463986 Best subsample: [1] 2 4 6 8 10 12 15 18 21 22 24 29 30 31 32 33 34 36 37 [20] 38 41 44 45 47 51 52 53 54 55 59 61 65 67 68 69 70 72 76 [39] 78 79 80 81 82 83 84 85 86 92 93 94 95 97 98 99 102 105 Outliers: 11 [1] 9 28 40 42 49 58 62 71 75 77 89 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=56); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Favor Appearance Taste Stickiness -0.2731 0.0600 -0.1468 0.0646 Toughness Overall_evaluation 0.0894 -0.2192 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.478 0.398 0.484 0.479 -0.240 Appearance 0.398 0.619 0.609 0.608 -0.333 Taste 0.484 0.609 0.789 0.775 -0.445 Stickiness 0.479 0.608 0.775 1.003 -0.599 Toughness -0.240 -0.333 -0.445 -0.599 0.556 Overall_evaluation 0.580 0.708 0.891 0.951 -0.563 Overall_evaluation Favor 0.580 Appearance 0.708 Taste 0.891 Stickiness 0.951 Toughness -0.563 Overall_evaluation 1.086 -------------------------------------------------------- un86 73 7 40 17.009322 Best subsample: [1] 1 2 9 10 12 14 16 17 18 20 23 24 26 27 31 32 37 39 41 42 45 47 48 49 50 [26] 51 52 55 56 60 61 62 63 64 65 67 70 71 72 73 Outliers: 29 [1] 3 4 5 6 7 8 11 13 15 19 21 22 28 29 30 35 36 38 40 43 44 46 53 54 58 [26] 59 66 68 69 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=40); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: POP MOR CAR DR GNP DEN TB 20.740 71.023 6.435 0.817 1.146 56.754 0.441 Robust Estimate of Covariance: POP MOR CAR DR GNP DEN POP 8.62e+02 3.33e+02 -1.88e+01 -2.48e+00 -4.98e+00 3.35e+02 MOR 3.33e+02 3.48e+03 -4.25e+02 -4.75e+01 -5.26e+01 -7.81e+02 CAR -1.88e+01 -4.25e+02 8.60e+01 8.49e+00 9.82e+00 1.24e+02 DR -2.48e+00 -4.75e+01 8.49e+00 1.23e+00 8.85e-01 1.80e+01 GNP -4.98e+00 -5.26e+01 9.82e+00 8.85e-01 2.10e+00 1.93e+01 DEN 3.35e+02 -7.81e+02 1.24e+02 1.80e+01 1.93e+01 3.02e+03 TB 5.92e-01 -1.75e+00 4.00e-01 2.83e-02 8.58e-03 -1.38e+00 TB POP 5.92e-01 MOR -1.75e+00 CAR 4.00e-01 DR 2.83e-02 GNP 8.58e-03 DEN -1.38e+00 TB 2.72e-02 -------------------------------------------------------- wages 39 10 19 22.994272 Best subsample: [1] 1 2 6 7 8 9 10 11 12 13 14 15 17 18 19 25 26 27 28 Outliers: 9 [1] 4 5 6 24 28 30 32 33 34 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=19); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: HRS RATE ERSP ERNO NEIN ASSET AGE DEP 2153.37 2.87 1129.16 297.53 360.58 6876.58 39.48 2.36 RACE SCHOOL 38.88 10.17 Robust Estimate of Covariance: HRS RATE ERSP ERNO NEIN ASSET HRS 7.84e+03 2.22e+01 -2.14e+03 -2.64e+03 1.17e+04 2.59e+05 RATE 2.22e+01 3.23e-01 2.74e+01 -4.53e+00 7.49e+01 1.76e+03 ERSP -2.14e+03 2.74e+01 2.52e+04 9.94e+01 -2.20e+03 -1.80e+04 ERNO -2.64e+03 -4.53e+00 9.94e+01 2.64e+03 -2.58e+03 -6.18e+04 NEIN 1.17e+04 7.49e+01 -2.20e+03 -2.58e+03 2.58e+04 5.82e+05 ASSET 2.59e+05 1.76e+03 -1.80e+04 -6.18e+04 5.82e+05 1.32e+07 AGE -8.05e+01 -3.34e-01 6.18e+00 3.13e+01 -1.38e+02 -3.15e+03 DEP -7.90e+00 -9.03e-02 -2.73e+01 2.93e+00 -1.67e+01 -4.05e+02 RACE -2.78e+03 -1.21e+01 9.21e+02 7.16e+02 -5.06e+03 -1.12e+05 SCHOOL 9.12e+01 7.52e-01 6.90e+01 -2.75e+01 2.09e+02 4.86e+03 AGE DEP RACE SCHOOL HRS -8.05e+01 -7.90e+00 -2.78e+03 9.12e+01 RATE -3.34e-01 -9.03e-02 -1.21e+01 7.52e-01 ERSP 6.18e+00 -2.73e+01 9.21e+02 6.90e+01 ERNO 3.13e+01 2.93e+00 7.16e+02 -2.75e+01 NEIN -1.38e+02 -1.67e+01 -5.06e+03 2.09e+02 ASSET -3.15e+03 -4.05e+02 -1.12e+05 4.86e+03 AGE 1.29e+00 9.00e-02 3.06e+01 -1.22e+00 DEP 9.00e-02 5.91e-02 3.48e+00 -2.49e-01 RACE 3.06e+01 3.48e+00 1.12e+03 -3.96e+01 SCHOOL -1.22e+00 -2.49e-01 -3.96e+01 2.07e+00 -------------------------------------------------------- airquality 153 4 58 18.213499 Best subsample: [1] 3 22 24 25 28 29 32 33 35 36 37 38 39 40 41 42 43 44 46 [20] 47 48 49 50 52 56 57 58 59 60 64 66 67 68 69 71 72 73 74 [39] 76 78 80 82 83 84 86 87 89 90 91 92 93 94 95 97 98 105 109 [58] 110 Outliers: 11 [1] 8 9 15 18 21 24 30 48 62 117 148 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=58); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Ozone Solar.R Wind Temp 43.2 192.9 9.6 80.5 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 1219.91 980.92 -77.44 252.18 Solar.R 980.92 9012.14 -2.18 121.72 Wind -77.44 -2.18 13.62 -15.21 Temp 252.18 121.72 -15.21 79.80 -------------------------------------------------------- attitude 30 7 19 24.442803 Best subsample: [1] 2 3 4 5 7 8 10 12 15 17 19 20 22 23 25 27 28 29 30 Outliers: 7 [1] 1 9 13 14 16 18 24 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=19); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: rating complaints privileges learning raises critical 67.1 68.0 52.4 57.6 67.2 77.4 advance 43.4 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 232.42 175.44 55.55 151.33 125.87 -4.93 73.90 complaints 175.44 215.20 72.26 152.30 132.53 9.98 104.35 privileges 55.55 72.26 187.90 126.78 94.70 13.09 120.75 learning 151.33 152.30 126.78 216.54 154.98 9.26 103.63 raises 125.87 132.53 94.70 154.98 154.80 6.73 96.38 critical -4.93 9.98 13.09 9.26 6.73 71.71 20.59 advance 73.90 104.35 120.75 103.63 96.38 20.59 127.80 -------------------------------------------------------- attenu 182 5 86 6.440834 Best subsample: [1] 68 69 70 71 72 73 74 75 76 77 79 82 83 84 85 86 87 88 89 [20] 90 91 92 101 102 103 104 106 107 109 110 111 112 113 114 115 116 117 118 [39] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 [58] 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 [77] 157 158 159 160 161 162 163 164 165 166 Outliers: 44 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 19 20 21 [20] 22 23 24 25 27 28 29 30 31 32 33 34 46 47 59 60 61 64 65 [39] 82 98 100 101 102 105 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=86); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: event mag station dist accel 18.624 5.752 67.861 22.770 0.141 Robust Estimate of Covariance: event mag station dist accel event 25.8954 -1.9225 88.2479 15.7612 -0.1322 mag -1.9225 0.6517 -5.0369 2.1280 0.0193 station 88.2479 -5.0369 1623.2349 110.5543 0.8778 dist 15.7612 2.1280 110.5543 348.6383 -1.4600 accel -0.1322 0.0193 0.8778 -1.4600 0.0152 -------------------------------------------------------- USJudgeRatings 43 12 28 -47.889993 Best subsample: [1] 1 2 3 4 6 9 10 11 15 16 17 18 19 22 24 25 26 27 28 29 32 33 34 36 37 [26] 38 41 43 Outliers: 14 [1] 5 7 8 12 13 14 20 21 23 30 31 35 40 42 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=28); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.40 8.19 7.80 7.96 7.74 7.82 7.74 7.73 7.57 7.63 8.25 7.94 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 1.0672 -0.3329 -0.5283 -0.1942 -0.0614 -0.0927 -0.1464 -0.1487 INTG -0.3329 0.4969 0.6723 0.5089 0.4255 0.4069 0.5063 0.5127 DMNR -0.5283 0.6723 1.0323 0.6561 0.5734 0.5479 0.6513 0.6317 DILG -0.1942 0.5089 0.6561 0.6086 0.5342 0.5130 0.6337 0.6447 CFMG -0.0614 0.4255 0.5734 0.5342 0.5354 0.5046 0.5840 0.5966 DECI -0.0927 0.4069 0.5479 0.5130 0.5046 0.4959 0.5626 0.5788 PREP -0.1464 0.5063 0.6513 0.6337 0.5840 0.5626 0.6911 0.7077 FAMI -0.1487 0.5127 0.6317 0.6447 0.5966 0.5788 0.7077 0.7448 ORAL -0.2213 0.5391 0.7129 0.6400 0.5995 0.5770 0.6909 0.7157 WRIT -0.1995 0.5346 0.6879 0.6458 0.6014 0.5780 0.6966 0.7262 PHYS -0.2308 0.3376 0.4542 0.3865 0.3732 0.3846 0.4201 0.4481 RTEN -0.3252 0.5913 0.8042 0.6508 0.5846 0.5697 0.6752 0.6941 ORAL WRIT PHYS RTEN CONT -0.2213 -0.1995 -0.2308 -0.3252 INTG 0.5391 0.5346 0.3376 0.5913 DMNR 0.7129 0.6879 0.4542 0.8042 DILG 0.6400 0.6458 0.3865 0.6508 CFMG 0.5995 0.6014 0.3732 0.5846 DECI 0.5770 0.5780 0.3846 0.5697 PREP 0.6909 0.6966 0.4201 0.6752 FAMI 0.7157 0.7262 0.4481 0.6941 ORAL 0.7202 0.7190 0.4618 0.7180 WRIT 0.7190 0.7263 0.4576 0.7108 PHYS 0.4618 0.4576 0.3761 0.4732 RTEN 0.7180 0.7108 0.4732 0.7702 -------------------------------------------------------- USArrests 50 4 27 15.391648 Best subsample: [1] 4 7 9 12 13 14 15 16 19 21 23 26 27 29 30 32 34 35 36 38 41 42 43 45 46 [26] 49 50 Outliers: 8 [1] 2 5 6 10 24 28 33 37 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=27); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: Murder Assault UrbanPop Rape 6.71 145.42 65.06 17.88 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 23.4 391.3 29.6 36.7 Assault 391.3 9611.7 825.3 659.4 UrbanPop 29.6 825.3 327.6 69.3 Rape 36.7 659.4 69.3 74.0 -------------------------------------------------------- longley 16 7 12 12.747678 Best subsample: [1] 5 6 7 8 9 10 11 12 13 14 15 16 Outliers: 4 [1] 1 2 3 4 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=12); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 106.5 430.6 328.2 295.0 120.2 Year Employed 1956.5 66.9 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 137.5 1318.8 1562.4 -590.5 103.2 GNP 1318.8 13062.4 14155.2 -5424.8 1018.8 Unemployed 1562.4 14155.2 25109.6 -7362.7 1178.3 Armed.Forces -590.5 -5424.8 -7362.7 3557.9 -415.1 Population 103.2 1018.8 1178.3 -415.1 80.5 Year 65.4 639.5 755.3 -274.8 50.3 Employed 43.4 436.3 410.4 -189.6 33.2 Year Employed GNP.deflator 65.4 43.4 GNP 639.5 436.3 Unemployed 755.3 410.4 Armed.Forces -274.8 -189.6 Population 50.3 33.2 Year 31.8 21.2 Employed 21.2 15.7 -------------------------------------------------------- Loblolly 84 3 44 4.898174 Best subsample: [1] 1 2 4 7 8 10 13 14 19 20 21 25 26 28 31 32 33 34 37 38 39 40 43 44 45 [26] 46 49 50 51 55 56 58 61 62 64 67 68 69 73 74 75 79 80 81 Outliers: 26 [1] 5 6 12 18 23 24 29 30 35 36 41 42 47 48 53 54 59 60 65 66 71 72 77 78 83 [26] 84 ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=44); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: height age Seed 20.44 8.19 7.72 Robust Estimate of Covariance: height age Seed height 439.77 141.10 21.15 age 141.10 45.61 5.32 Seed 21.15 5.32 30.27 -------------------------------------------------------- quakes 1000 4 502 8.274369 Best subsample: Too long... Outliers: 230 Too many to print ... ------------- Call: CovMcd(x = x, trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=502); nsamp = 500; (n,k)mini = (300,5) Robust Estimate of Location: lat long depth mag -21.31 182.48 361.35 4.54 Robust Estimate of Covariance: lat long depth mag lat 2.11e+01 5.07e+00 1.92e+02 -3.61e-01 long 5.07e+00 6.53e+00 -5.20e+02 6.26e-02 depth 1.92e+02 -5.20e+02 6.95e+04 -1.85e+01 mag -3.61e-01 6.26e-02 -1.85e+01 1.97e-01 -------------------------------------------------------- ======================================================== > dodata(method="deterministic") Call: dodata(method = "deterministic") Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 Too many to print ... ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=7) Robust Estimate of Location: height weight 38.3 33.1 Robust Estimate of Covariance: height weight height 157 303 weight 303 660 -------------------------------------------------------- starsCYG 47 2 25 -8.028718 Best subsample: [1] 1 6 10 12 13 16 23 24 25 26 28 31 32 33 37 38 39 40 41 42 43 44 45 46 47 Outliers: 6 [1] 7 11 14 20 30 34 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=25) Robust Estimate of Location: log.Te log.light 4.41 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0171 0.0511 log.light 0.0511 0.3555 -------------------------------------------------------- phosphor 18 2 10 7.732906 Best subsample: [1] 2 4 5 7 8 9 11 12 14 16 Outliers: 1 [1] 6 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=10) Robust Estimate of Location: inorg organic 12.5 40.8 Robust Estimate of Covariance: inorg organic inorg 136 110 organic 110 215 -------------------------------------------------------- stackloss 21 3 12 6.577286 Best subsample: [1] 4 5 6 7 8 9 11 13 16 18 19 20 Outliers: 2 [1] 1 2 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=12) Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 58.4 20.5 86.1 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 64.90 15.37 30.77 Water.Temp 15.37 9.55 8.05 Acid.Conc. 30.77 8.05 43.78 -------------------------------------------------------- coleman 20 5 13 2.149184 Best subsample: [1] 3 4 5 7 8 12 13 14 16 17 18 19 20 Outliers: 2 [1] 6 10 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=13) Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.76 41.08 2.76 25.01 6.27 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.464 3.514 2.551 0.531 0.130 fatherWc 3.514 1614.996 526.259 14.543 39.038 sstatus 2.551 526.259 244.382 7.684 13.529 teacherSc 0.531 14.543 7.684 1.401 0.606 motherLev 0.130 39.038 13.529 0.606 1.093 -------------------------------------------------------- salinity 28 3 16 1.940763 Best subsample: [1] 1 8 10 12 13 14 15 17 18 20 21 22 25 26 27 28 Outliers: 2 [1] 5 16 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=16) Robust Estimate of Location: X1 X2 X3 10.50 2.58 23.12 Robust Estimate of Covariance: X1 X2 X3 X1 12.02759 -0.00504 -1.61240 X2 -0.00504 4.24789 -2.14688 X3 -1.61240 -2.14688 3.54596 -------------------------------------------------------- wood 20 5 13 -35.240819 Best subsample: [1] 1 2 3 5 9 11 12 13 14 15 17 18 20 Outliers: 4 [1] 4 6 8 19 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=13) Robust Estimate of Location: x1 x2 x3 x4 x5 0.582 0.125 0.530 0.534 0.888 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 1.33e-02 2.28e-03 2.63e-03 -8.09e-04 -1.21e-03 x2 2.28e-03 7.01e-04 1.10e-03 -2.56e-04 -5.93e-05 x3 2.63e-03 1.10e-03 7.06e-03 -1.40e-03 -1.59e-05 x4 -8.09e-04 -2.56e-04 -1.40e-03 5.38e-03 3.28e-03 x5 -1.21e-03 -5.93e-05 -1.59e-05 3.28e-03 3.72e-03 -------------------------------------------------------- hbk 75 3 39 -1.045501 Best subsample: [1] 15 17 18 19 20 21 22 23 24 26 27 28 29 32 33 35 36 38 40 41 43 48 49 50 51 [26] 54 55 56 58 59 63 64 66 67 70 71 72 73 74 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=39) Robust Estimate of Location: X1 X2 X3 1.54 1.78 1.69 Robust Estimate of Covariance: X1 X2 X3 X1 1.6528 0.0741 0.1713 X2 0.0741 1.6823 0.2055 X3 0.1713 0.2055 1.5624 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=15) Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 2511 4258 brain 4258 15257 -------------------------------------------------------- bushfire 38 5 22 18.135810 Best subsample: [1] 1 2 3 4 5 6 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Outliers: 16 [1] 7 8 9 10 11 12 29 30 31 32 33 34 35 36 37 38 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=22) Robust Estimate of Location: V1 V2 V3 V4 V5 105 147 274 218 279 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 567 439 -2771 -624 -509 V2 439 387 -1843 -376 -318 V3 -2771 -1843 16367 4021 3196 V4 -624 -376 4021 1059 827 V5 -509 -318 3196 827 652 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 3 [1] 17 19 20 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=11) Robust Estimate of Location: X Y 3.86 5.01 Robust Estimate of Covariance: X Y X 19.8 27.3 Y 27.3 39.8 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 4 [1] 15 16 17 18 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=10) Robust Estimate of Location: Income Reserves 52.3 560.9 Robust Estimate of Covariance: Income Reserves Income 2534 21294 Reserves 21294 372356 -------------------------------------------------------- radarImage 1573 5 789 36.694865 Best subsample: Too long... Outliers: 71 [1] 262 450 451 480 481 509 535 542 597 643 669 697 803 804 832 [16] 833 834 862 863 864 892 989 1123 1145 1223 1224 1232 1233 1249 1250 [31] 1267 1303 1347 1357 1375 1411 1419 1420 1443 1453 1504 1511 1512 1518 1519 [46] 1521 1525 1526 1543 1544 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 [61] 1557 1558 1561 1562 1564 1565 1566 1569 1570 1571 1573 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=789) Robust Estimate of Location: X.coord Y.coord Band.1 Band.2 Band.3 52.78 35.37 7.12 18.81 9.09 Robust Estimate of Covariance: X.coord Y.coord Band.1 Band.2 Band.3 X.coord 146.7 25.6 -433.2 -238.2 -29.0 Y.coord 25.6 489.0 55.4 -211.1 -39.8 Band.1 -433.2 55.4 32206.4 9690.0 558.8 Band.2 -238.2 -211.1 9690.0 30881.1 1126.6 Band.3 -29.0 -39.8 558.8 1126.6 5322.0 -------------------------------------------------------- NOxEmissions 8088 4 4046 2.474536 Best subsample: Too long... Outliers: 1515 Too many to print ... ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=4046) Robust Estimate of Location: julday LNOx LNOxEm sqrtWS 168.20 4.73 7.91 1.37 Robust Estimate of Covariance: julday LNOx LNOxEm sqrtWS julday 1.37e+04 1.79e+01 1.04e+00 -1.51e+01 LNOx 1.79e+01 7.05e-01 2.13e-01 -2.27e-01 LNOxEm 1.04e+00 2.13e-01 3.76e-01 6.49e-02 sqrtWS -1.51e+01 -2.27e-01 6.49e-02 3.09e-01 -------------------------------------------------------- vaso 39 2 21 -3.972244 Best subsample: [1] 3 4 8 14 18 19 20 21 22 23 24 25 26 27 28 33 34 35 37 38 39 Outliers: 3 [1] 1 2 17 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=21) Robust Estimate of Location: Volume Rate 1.16 1.72 Robust Estimate of Covariance: Volume Rate Volume 0.406 -0.216 Rate -0.216 0.945 -------------------------------------------------------- wagnerGrowth 63 6 35 6.511864 Best subsample: [1] 2 3 4 5 6 7 9 10 11 12 13 16 17 18 20 23 25 27 31 32 35 36 38 41 44 [26] 48 51 52 53 54 55 56 57 60 62 Outliers: 10 [1] 1 8 21 22 29 33 42 43 50 63 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=35) Robust Estimate of Location: Region PA GPA HS GHS y 10.91 33.65 -2.05 2.43 0.31 6.98 Robust Estimate of Covariance: Region PA GPA HS GHS y Region 46.5443 23.4853 -1.8550 -0.8681 -0.6263 -19.7780 PA 23.4853 37.6600 -7.3182 -1.6484 -0.0598 -39.2343 GPA -1.8550 -7.3182 6.9108 0.5237 -0.2851 5.0671 HS -0.8681 -1.6484 0.5237 0.9635 -0.0142 2.8499 GHS -0.6263 -0.0598 -0.2851 -0.0142 0.2289 1.1180 y -19.7780 -39.2343 5.0671 2.8499 1.1180 104.7167 -------------------------------------------------------- fish 159 6 82 8.880459 Best subsample: [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 20 21 22 23 24 25 26 27 35 36 37 42 43 44 45 46 47 48 49 [39] 50 51 52 53 54 55 56 57 58 59 60 106 107 108 109 110 111 112 113 [58] 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 [77] 134 135 136 137 138 139 Outliers: 51 [1] 39 41 62 63 65 68 69 73 74 75 76 77 78 79 80 81 82 83 84 [20] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 [39] 143 145 148 150 151 152 153 154 155 156 157 158 159 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=82) Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 316.3 24.1 26.3 29.3 31.0 14.7 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 98110.10 2142.90 2339.56 2908.93 2155.78 -92.78 Length1 2142.90 51.81 56.20 68.39 44.38 -1.91 Length2 2339.56 56.20 61.08 74.40 48.88 -2.04 Length3 2908.93 68.39 74.40 92.29 65.28 -3.27 Height 2155.78 44.38 48.88 65.28 70.56 -4.04 Width -92.78 -1.91 -2.04 -3.27 -4.04 1.54 -------------------------------------------------------- pottery 27 6 17 -10.586933 Best subsample: [1] 1 2 4 5 6 9 10 11 13 14 15 19 20 21 22 26 27 Outliers: 9 [1] 3 8 12 16 17 18 23 24 25 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=17) Robust Estimate of Location: SI AL FE MG CA TI 54.983 15.206 9.700 3.817 5.211 0.859 Robust Estimate of Covariance: SI AL FE MG CA TI SI 29.12922 3.23731 -0.02886 3.00952 -2.55067 0.12484 AL 3.23731 5.71205 -0.89190 -3.53767 0.29497 -0.02885 FE -0.02886 -0.89190 0.39349 0.75550 -0.49711 0.02020 MG 3.00952 -3.53767 0.75550 3.95652 -0.22341 0.04029 CA -2.55067 0.29497 -0.49711 -0.22341 1.74417 -0.04904 TI 0.12484 -0.02885 0.02020 0.04029 -0.04904 0.00248 -------------------------------------------------------- rice 105 6 56 -14.423048 Best subsample: [1] 4 6 8 10 13 15 16 17 18 25 27 29 30 31 32 33 34 36 37 [20] 38 44 45 47 51 52 53 55 59 60 65 66 67 70 72 74 76 78 79 [39] 80 81 82 83 84 85 86 90 92 93 94 95 97 98 99 100 101 105 Outliers: 13 [1] 9 19 28 40 42 43 49 58 62 64 71 75 77 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=56) Robust Estimate of Location: Favor Appearance Taste Stickiness -0.2950 0.0799 -0.1555 0.0363 Toughness Overall_evaluation 0.0530 -0.2284 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.539 0.451 0.546 0.518 -0.230 Appearance 0.451 0.707 0.686 0.660 -0.339 Taste 0.546 0.686 0.880 0.832 -0.412 Stickiness 0.518 0.660 0.832 0.950 -0.485 Toughness -0.230 -0.339 -0.412 -0.485 0.463 Overall_evaluation 0.645 0.775 0.971 0.980 -0.492 Overall_evaluation Favor 0.645 Appearance 0.775 Taste 0.971 Stickiness 0.980 Toughness -0.492 Overall_evaluation 1.143 -------------------------------------------------------- un86 73 7 40 17.117142 Best subsample: [1] 2 9 10 12 14 16 17 18 19 20 23 24 25 26 27 31 32 33 37 39 42 48 49 50 51 [26] 52 55 56 57 60 61 62 63 64 65 67 70 71 72 73 Outliers: 28 [1] 3 4 5 6 7 8 11 13 15 21 22 28 29 30 35 36 38 40 43 44 46 53 54 58 59 [26] 66 68 69 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=40) Robust Estimate of Location: POP MOR CAR DR GNP DEN TB 17.036 68.512 6.444 0.877 1.134 64.140 0.433 Robust Estimate of Covariance: POP MOR CAR DR GNP DEN POP 5.34e+02 2.89e+02 -9.30e+00 -2.82e-02 -3.06e+00 8.57e+01 MOR 2.89e+02 3.54e+03 -4.14e+02 -4.99e+01 -5.01e+01 -1.36e+03 CAR -9.30e+00 -4.14e+02 8.52e+01 8.55e+00 9.75e+00 1.16e+02 DR -2.82e-02 -4.99e+01 8.55e+00 1.34e+00 8.38e-01 2.51e+01 GNP -3.06e+00 -5.01e+01 9.75e+00 8.38e-01 2.11e+00 1.37e+01 DEN 8.57e+01 -1.36e+03 1.16e+02 2.51e+01 1.37e+01 5.22e+03 TB -9.01e-02 -1.47e+00 3.70e-01 2.93e-02 1.01e-02 -1.44e+00 TB POP -9.01e-02 MOR -1.47e+00 CAR 3.70e-01 DR 2.93e-02 GNP 1.01e-02 DEN -1.44e+00 TB 2.42e-02 -------------------------------------------------------- wages 39 10 19 23.119456 Best subsample: [1] 1 2 5 6 7 9 10 11 12 13 14 15 19 21 23 25 26 27 28 Outliers: 9 [1] 4 5 9 24 25 26 28 32 34 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=19) Robust Estimate of Location: HRS RATE ERSP ERNO NEIN ASSET AGE DEP 2161.89 2.95 1114.21 297.68 374.00 7269.37 39.13 2.43 RACE SCHOOL 36.13 10.39 Robust Estimate of Covariance: HRS RATE ERSP ERNO NEIN ASSET HRS 4.53e+03 1.06e+01 -7.63e+03 -8.23e+02 6.60e+03 1.44e+05 RATE 1.06e+01 2.28e-01 1.05e+01 3.46e+00 5.00e+01 1.14e+03 ERSP -7.63e+03 1.05e+01 2.44e+04 1.45e+03 -6.06e+03 -1.22e+05 ERNO -8.23e+02 3.46e+00 1.45e+03 2.31e+03 -4.56e+02 -9.39e+03 NEIN 6.60e+03 5.00e+01 -6.06e+03 -4.56e+02 1.76e+04 3.85e+05 ASSET 1.44e+05 1.14e+03 -1.22e+05 -9.39e+03 3.85e+05 8.48e+06 AGE -4.27e+01 -8.39e-02 1.07e+02 1.92e+00 -4.20e+01 -9.67e+02 DEP 5.77e+00 -5.14e-02 -3.55e+01 1.68e+00 -1.04e+01 -2.06e+02 RACE -1.66e+03 -7.76e+00 2.30e+03 1.90e+02 -3.30e+03 -7.16e+04 SCHOOL 3.85e+01 4.59e-01 -7.14e+00 3.64e+00 1.19e+02 2.69e+03 AGE DEP RACE SCHOOL HRS -4.27e+01 5.77e+00 -1.66e+03 3.85e+01 RATE -8.39e-02 -5.14e-02 -7.76e+00 4.59e-01 ERSP 1.07e+02 -3.55e+01 2.30e+03 -7.14e+00 ERNO 1.92e+00 1.68e+00 1.90e+02 3.64e+00 NEIN -4.20e+01 -1.04e+01 -3.30e+03 1.19e+02 ASSET -9.67e+02 -2.06e+02 -7.16e+04 2.69e+03 AGE 8.41e-01 -2.11e-01 1.45e+01 -3.42e-01 DEP -2.11e-01 1.18e-01 3.05e-01 -7.70e-02 RACE 1.45e+01 3.05e-01 7.34e+02 -2.13e+01 SCHOOL -3.42e-01 -7.70e-02 -2.13e+01 1.02e+00 -------------------------------------------------------- airquality 153 4 58 18.316848 Best subsample: [1] 2 3 8 10 24 25 28 32 33 35 36 37 38 39 40 41 42 43 46 [20] 47 48 49 50 52 54 56 57 58 59 60 66 67 69 71 72 73 76 78 [39] 81 82 84 86 87 89 90 91 92 95 97 98 100 101 105 106 108 109 110 [58] 111 Outliers: 8 [1] 9 15 18 30 48 62 117 148 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=58) Robust Estimate of Location: Ozone Solar.R Wind Temp 40.80 189.37 9.66 78.81 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 1045.53 958.61 -62.92 246.40 Solar.R 958.61 9508.06 1.52 173.36 Wind -62.92 1.52 11.07 -12.97 Temp 246.40 173.36 -12.97 93.87 -------------------------------------------------------- attitude 30 7 19 24.464288 Best subsample: [1] 2 3 4 5 7 8 10 11 12 15 17 19 21 22 23 25 27 28 29 Outliers: 5 [1] 9 14 16 18 24 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=19) Robust Estimate of Location: rating complaints privileges learning raises critical 64.4 65.2 51.0 55.5 65.9 77.4 advance 43.2 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 265.87 215.88 154.02 213.33 171.36 -18.02 88.03 complaints 215.88 272.36 173.30 226.92 199.70 21.65 128.53 privileges 154.02 173.30 241.08 202.94 141.68 6.01 121.58 learning 213.33 226.92 202.94 283.29 208.18 13.19 117.42 raises 171.36 199.70 141.68 208.18 202.17 30.71 111.69 critical -18.02 21.65 6.01 13.19 30.71 106.67 36.10 advance 88.03 128.53 121.58 117.42 111.69 36.10 126.99 -------------------------------------------------------- attenu 182 5 86 6.593068 Best subsample: [1] 41 42 43 44 48 49 51 68 70 72 73 74 75 76 77 82 83 84 85 [20] 86 87 88 89 90 91 92 101 102 103 104 106 107 109 110 111 112 113 114 [39] 115 116 117 119 120 121 122 124 125 126 127 128 129 130 131 132 133 134 135 [58] 136 137 138 139 140 141 144 145 146 147 148 149 150 151 152 153 154 155 156 [77] 157 158 159 160 161 162 163 164 165 166 Outliers: 40 [1] 2 4 5 6 7 8 9 10 11 13 15 16 19 20 21 22 23 24 25 [20] 27 28 29 30 31 32 47 59 60 61 64 65 82 97 98 100 101 102 103 [39] 104 105 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=86) Robust Estimate of Location: event mag station dist accel 17.122 5.798 63.461 25.015 0.131 Robust Estimate of Covariance: event mag station dist accel event 4.26e+01 -2.26e+00 1.36e+02 -1.20e+01 -5.13e-02 mag -2.26e+00 6.10e-01 -5.55e+00 4.48e+00 7.58e-03 station 1.36e+02 -5.55e+00 1.58e+03 3.72e+01 7.69e-01 dist -1.20e+01 4.48e+00 3.72e+01 3.81e+02 -1.32e+00 accel -5.13e-02 7.58e-03 7.69e-01 -1.32e+00 1.11e-02 -------------------------------------------------------- USJudgeRatings 43 12 28 -47.886937 Best subsample: [1] 2 3 4 6 9 10 11 15 16 18 19 22 24 25 26 27 28 29 30 32 33 34 36 37 38 [26] 40 41 43 Outliers: 14 [1] 1 5 7 8 12 13 14 17 20 21 23 31 35 42 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=28) Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.46 8.26 7.88 8.06 7.85 7.92 7.84 7.83 7.67 7.74 8.31 8.03 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 0.9226 -0.3654 -0.5254 -0.2434 -0.0695 -0.0865 -0.2133 -0.2164 INTG -0.3654 0.5236 0.6906 0.5222 0.3980 0.3887 0.5322 0.5361 DMNR -0.5254 0.6906 1.0201 0.6586 0.5127 0.4929 0.6634 0.6383 DILG -0.2434 0.5222 0.6586 0.6039 0.4892 0.4785 0.6333 0.6396 CFMG -0.0695 0.3980 0.5127 0.4892 0.4505 0.4220 0.5237 0.5270 DECI -0.0865 0.3887 0.4929 0.4785 0.4220 0.4148 0.5181 0.5255 PREP -0.2133 0.5322 0.6634 0.6333 0.5237 0.5181 0.7076 0.7207 FAMI -0.2164 0.5361 0.6383 0.6396 0.5270 0.5255 0.7207 0.7542 ORAL -0.2643 0.5580 0.7074 0.6333 0.5263 0.5164 0.6985 0.7186 WRIT -0.2548 0.5527 0.6848 0.6374 0.5290 0.5196 0.7007 0.7251 PHYS -0.2035 0.3230 0.3964 0.3550 0.2842 0.2959 0.3895 0.4115 RTEN -0.3286 0.6105 0.7924 0.6520 0.5193 0.5114 0.6876 0.7011 ORAL WRIT PHYS RTEN CONT -0.2643 -0.2548 -0.2035 -0.3286 INTG 0.5580 0.5527 0.3230 0.6105 DMNR 0.7074 0.6848 0.3964 0.7924 DILG 0.6333 0.6374 0.3550 0.6520 CFMG 0.5263 0.5290 0.2842 0.5193 DECI 0.5164 0.5196 0.2959 0.5114 PREP 0.6985 0.7007 0.3895 0.6876 FAMI 0.7186 0.7251 0.4115 0.7011 ORAL 0.7143 0.7113 0.4114 0.7127 WRIT 0.7113 0.7161 0.4094 0.7074 PHYS 0.4114 0.4094 0.2885 0.4145 RTEN 0.7127 0.7074 0.4145 0.7590 -------------------------------------------------------- USArrests 50 4 27 15.438912 Best subsample: [1] 4 7 12 13 14 15 16 19 21 23 25 26 27 29 30 32 34 35 36 38 41 43 45 46 48 [26] 49 50 Outliers: 6 [1] 2 5 6 24 28 33 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=27) Robust Estimate of Location: Murder Assault UrbanPop Rape 6.91 150.10 65.88 18.75 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 23.4 372.7 23.0 32.7 Assault 372.7 8582.9 685.5 607.2 UrbanPop 23.0 685.5 276.7 65.9 Rape 32.7 607.2 65.9 73.7 -------------------------------------------------------- longley 16 7 12 12.747678 Best subsample: [1] 5 6 7 8 9 10 11 12 13 14 15 16 Outliers: 4 [1] 1 2 3 4 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=12) Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 106.5 430.6 328.2 295.0 120.2 Year Employed 1956.5 66.9 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 137.5 1318.8 1562.4 -590.5 103.2 GNP 1318.8 13062.4 14155.2 -5424.8 1018.8 Unemployed 1562.4 14155.2 25109.6 -7362.7 1178.3 Armed.Forces -590.5 -5424.8 -7362.7 3557.9 -415.1 Population 103.2 1018.8 1178.3 -415.1 80.5 Year 65.4 639.5 755.3 -274.8 50.3 Employed 43.4 436.3 410.4 -189.6 33.2 Year Employed GNP.deflator 65.4 43.4 GNP 639.5 436.3 Unemployed 755.3 410.4 Armed.Forces -274.8 -189.6 Population 50.3 33.2 Year 31.8 21.2 Employed 21.2 15.7 -------------------------------------------------------- Loblolly 84 3 44 4.898174 Best subsample: [1] 1 2 4 7 8 10 13 14 19 20 21 25 26 28 31 32 33 34 37 38 39 40 43 44 45 [26] 46 49 50 51 55 56 58 61 62 64 67 68 69 73 74 75 79 80 81 Outliers: 26 [1] 5 6 12 18 23 24 29 30 35 36 41 42 47 48 53 54 59 60 65 66 71 72 77 78 83 [26] 84 ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=44) Robust Estimate of Location: height age Seed 20.44 8.19 7.72 Robust Estimate of Covariance: height age Seed height 439.77 141.10 21.15 age 141.10 45.61 5.32 Seed 21.15 5.32 30.27 -------------------------------------------------------- quakes 1000 4 502 8.274209 Best subsample: Too long... Outliers: 231 Too many to print ... ------------- Call: CovMcd(x = x, nsamp = "deterministic", trace = FALSE) -> Method: Deterministic MCD(alpha=0.5 ==> h=502) Robust Estimate of Location: lat long depth mag -21.34 182.47 360.58 4.54 Robust Estimate of Covariance: lat long depth mag lat 2.15e+01 5.14e+00 1.97e+02 -3.83e-01 long 5.14e+00 6.54e+00 -5.19e+02 6.67e-02 depth 1.97e+02 -5.19e+02 6.95e+04 -1.96e+01 mag -3.83e-01 6.67e-02 -1.96e+01 1.92e-01 -------------------------------------------------------- ======================================================== > dodata(method="exact") Call: dodata(method = "exact") Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 7 5.678742 Best subsample: [1] 1 3 4 5 7 9 11 Outliers: 0 Too many to print ... ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=7); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: height weight 38.3 33.1 Robust Estimate of Covariance: height weight height 157 303 weight 303 660 -------------------------------------------------------- starsCYG 47 2 25 -8.031215 Best subsample: [1] 1 2 4 6 8 10 12 13 16 24 25 26 28 32 33 37 38 39 40 41 42 43 44 45 46 Outliers: 6 [1] 7 11 14 20 30 34 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=25); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: log.Te log.light 4.41 4.95 Robust Estimate of Covariance: log.Te log.light log.Te 0.0171 0.0511 log.light 0.0511 0.3555 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 2 [1] 1 6 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=10); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: inorg organic 13.4 38.8 Robust Estimate of Covariance: inorg organic inorg 181 184 organic 184 256 -------------------------------------------------------- coleman 20 5 13 1.286808 Best subsample: [1] 2 3 4 5 7 8 12 13 14 16 17 19 20 Outliers: 7 [1] 1 6 9 10 11 15 18 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=13); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.76 48.38 6.12 25.00 6.40 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.381 2.685 -0.400 0.228 0.113 fatherWc 2.685 1959.466 496.858 18.948 51.871 sstatus -0.400 496.858 180.236 5.762 15.230 teacherSc 0.228 18.948 5.762 1.180 0.835 motherLev 0.113 51.871 15.230 0.835 1.567 -------------------------------------------------------- salinity 28 3 16 1.326364 Best subsample: [1] 1 2 6 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 4 [1] 5 16 23 24 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=16); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: X1 X2 X3 10.08 2.78 22.78 Robust Estimate of Covariance: X1 X2 X3 X1 13.87 1.34 -4.24 X2 1.34 5.10 -1.92 X3 -4.24 -1.92 3.17 -------------------------------------------------------- wood 20 5 13 -36.270094 Best subsample: [1] 1 2 3 5 9 10 12 13 14 15 17 18 20 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=13); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: x1 x2 x3 x4 x5 0.587 0.122 0.531 0.538 0.892 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 1.51e-02 2.83e-03 4.74e-03 -8.81e-04 -2.45e-03 x2 2.83e-03 7.29e-04 1.91e-03 -7.82e-05 3.55e-05 x3 4.74e-03 1.91e-03 9.97e-03 -1.31e-03 5.30e-04 x4 -8.81e-04 -7.82e-05 -1.31e-03 4.28e-03 2.75e-03 x5 -2.45e-03 3.55e-05 5.30e-04 2.75e-03 4.16e-03 -------------------------------------------------------- Animals 28 2 15 14.555543 Best subsample: [1] 1 3 4 5 10 11 17 18 19 20 21 22 23 26 27 Outliers: 13 [1] 2 6 7 8 9 12 13 14 15 16 24 25 28 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=15); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: body brain 18.7 64.9 Robust Estimate of Covariance: body brain body 2511 4258 brain 4258 15257 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 3 [1] 17 19 20 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=11); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: X Y 3.86 5.01 Robust Estimate of Covariance: X Y X 19.8 27.3 Y 27.3 39.8 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 4 [1] 15 16 17 18 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=10); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: Income Reserves 52.3 560.9 Robust Estimate of Covariance: Income Reserves Income 2534 21294 Reserves 21294 372356 -------------------------------------------------------- vaso 39 2 21 -3.972244 Best subsample: [1] 3 4 8 14 18 19 20 21 22 23 24 25 26 27 28 33 34 35 37 38 39 Outliers: 3 [1] 1 2 17 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=21); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: Volume Rate 1.16 1.72 Robust Estimate of Covariance: Volume Rate Volume 0.406 -0.216 Rate -0.216 0.945 -------------------------------------------------------- stackloss 21 3 12 5.472581 Best subsample: [1] 4 5 6 7 8 9 10 11 12 13 14 20 Outliers: 9 [1] 1 2 3 15 16 17 18 19 21 ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=12); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 59.5 20.8 87.3 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 12.6 11.7 11.5 Water.Temp 11.7 18.5 12.3 Acid.Conc. 11.5 12.3 46.6 -------------------------------------------------------- pilot 20 2 11 6.487287 Best subsample: [1] 2 3 6 7 9 12 15 16 17 18 20 Outliers: 0 Too many to print ... ------------- Call: CovMcd(x = x, nsamp = "exact", trace = FALSE) -> Method: Fast MCD(alpha=0.5 ==> h=11); nsamp = exact; (n,k)mini = (300,5) Robust Estimate of Location: X Y 101.1 67.7 Robust Estimate of Covariance: X Y X 4069 1301 Y 1301 418 -------------------------------------------------------- ======================================================== > dodata(method="MRCD") Call: dodata(method = "MRCD") Data Set n p Half LOG(obj) Time ======================================================== heart 12 2 6 7.446266 Best subsample: [1] 1 3 4 7 9 11 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=6) Robust Estimate of Location: height weight 38.8 33.0 Robust Estimate of Covariance: height weight height 47.4 75.2 weight 75.2 155.4 -------------------------------------------------------- starsCYG 47 2 24 -5.862050 Best subsample: [1] 1 6 10 12 13 16 23 24 25 26 28 31 33 37 38 39 40 41 42 43 44 45 46 47 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=24) Robust Estimate of Location: log.Te log.light 4.44 5.05 Robust Estimate of Covariance: log.Te log.light log.Te 0.00867 0.02686 log.light 0.02686 0.41127 -------------------------------------------------------- phosphor 18 2 9 9.954788 Best subsample: [1] 4 7 8 9 11 12 13 14 16 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=9) Robust Estimate of Location: inorg organic 12.5 39.0 Robust Estimate of Covariance: inorg organic inorg 236 140 organic 140 172 -------------------------------------------------------- stackloss 21 3 11 7.991165 Best subsample: [1] 4 5 6 7 8 9 10 13 18 19 20 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=11) Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 58.2 21.4 85.2 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 49.8 17.2 42.7 Water.Temp 17.2 13.8 25.2 Acid.Conc. 42.7 25.2 58.2 -------------------------------------------------------- coleman 20 5 10 5.212156 Best subsample: [1] 3 4 5 7 8 9 14 16 19 20 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=10) Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.78 59.44 9.28 25.41 6.70 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.1582 -0.2826 0.4112 0.1754 0.0153 fatherWc -0.2826 902.9210 201.5815 -2.1236 18.8736 sstatus 0.4112 201.5815 65.4580 -0.3876 4.7794 teacherSc 0.1754 -2.1236 -0.3876 0.7233 -0.0322 motherLev 0.0153 18.8736 4.7794 -0.0322 0.5417 -------------------------------------------------------- salinity 28 3 14 3.586919 Best subsample: [1] 1 7 8 12 13 14 18 20 21 22 25 26 27 28 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=14) Robust Estimate of Location: X1 X2 X3 10.95 3.71 21.99 Robust Estimate of Covariance: X1 X2 X3 X1 14.153 0.718 -3.359 X2 0.718 3.565 -0.722 X3 -3.359 -0.722 1.607 -------------------------------------------------------- wood 20 5 10 -33.100492 Best subsample: [1] 1 2 3 5 11 14 15 17 18 20 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=10) Robust Estimate of Location: x1 x2 x3 x4 x5 0.572 0.120 0.504 0.545 0.899 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.007543 0.001720 0.000412 -0.001230 -0.001222 x2 0.001720 0.000568 0.000355 -0.000533 -0.000132 x3 0.000412 0.000355 0.002478 0.000190 0.000811 x4 -0.001230 -0.000533 0.000190 0.002327 0.000967 x5 -0.001222 -0.000132 0.000811 0.000967 0.001894 -------------------------------------------------------- hbk 75 3 38 1.539545 Best subsample: [1] 15 17 18 19 20 21 22 23 24 26 27 29 32 33 35 36 38 40 41 43 48 49 50 51 54 [26] 55 56 58 59 63 64 66 67 70 71 72 73 74 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=38) Robust Estimate of Location: X1 X2 X3 1.60 2.37 1.64 Robust Estimate of Covariance: X1 X2 X3 X1 2.810 0.124 1.248 X2 0.124 1.017 0.208 X3 1.248 0.208 2.218 -------------------------------------------------------- Animals 28 2 14 16.278395 Best subsample: [1] 1 3 4 5 10 11 18 19 20 21 22 23 26 27 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=14) Robust Estimate of Location: body brain 19.5 56.8 Robust Estimate of Covariance: body brain body 2802 5179 brain 5179 13761 -------------------------------------------------------- bushfire 38 5 19 28.483413 Best subsample: [1] 1 2 3 4 5 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=19) Robust Estimate of Location: V1 V2 V3 V4 V5 103 145 287 221 281 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 366 249 -1993 -503 -396 V2 249 252 -1223 -291 -233 V3 -1993 -1223 14246 3479 2718 V4 -503 -291 3479 1083 748 V5 -396 -233 2718 748 660 -------------------------------------------------------- lactic 20 2 10 2.593141 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=10) Robust Estimate of Location: X Y 2.60 3.63 Robust Estimate of Covariance: X Y X 8.13 13.54 Y 13.54 24.17 -------------------------------------------------------- pension 18 2 9 18.931204 Best subsample: [1] 2 3 4 5 6 8 9 11 12 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=9) Robust Estimate of Location: Income Reserves 45.7 466.9 Robust Estimate of Covariance: Income Reserves Income 2127 23960 Reserves 23960 348275 -------------------------------------------------------- vaso 39 2 20 -1.864710 Best subsample: [1] 3 4 8 14 18 20 21 22 23 24 25 26 27 28 33 34 35 37 38 39 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=20) Robust Estimate of Location: Volume Rate 1.14 1.77 Robust Estimate of Covariance: Volume Rate Volume 0.44943 -0.00465 Rate -0.00465 0.34480 -------------------------------------------------------- wagnerGrowth 63 6 32 9.287760 Best subsample: [1] 2 3 4 5 6 7 9 10 11 12 16 18 20 23 25 27 31 32 35 36 38 41 44 48 52 [26] 53 54 55 56 57 60 62 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=32) Robust Estimate of Location: Region PA GPA HS GHS y 10.719 33.816 -2.144 2.487 0.293 4.918 Robust Estimate of Covariance: Region PA GPA HS GHS y Region 56.7128 17.4919 -2.9710 -0.6491 -0.4545 -10.4287 PA 17.4919 29.9968 -7.6846 -1.3141 0.5418 -35.6434 GPA -2.9710 -7.6846 6.3238 1.1257 -0.4757 12.4707 HS -0.6491 -1.3141 1.1257 1.1330 -0.0915 3.3617 GHS -0.4545 0.5418 -0.4757 -0.0915 0.1468 -1.1228 y -10.4287 -35.6434 12.4707 3.3617 -1.1228 67.4215 -------------------------------------------------------- fish 159 6 79 22.142828 Best subsample: [1] 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 [20] 22 23 24 25 26 27 35 36 37 42 43 44 45 46 47 48 49 50 51 [39] 52 53 54 55 56 57 58 59 60 71 105 106 107 109 110 111 113 114 115 [58] 116 117 118 119 120 122 123 124 125 126 127 128 129 130 131 132 134 135 136 [77] 137 138 139 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=79) Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 291.7 23.8 25.9 28.9 30.4 14.7 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 77155.07 1567.55 1713.74 2213.16 1912.62 -103.97 Length1 1567.55 45.66 41.57 52.14 38.66 -2.39 Length2 1713.74 41.57 54.26 56.77 42.72 -2.55 Length3 2213.16 52.14 56.77 82.57 58.84 -3.65 Height 1912.62 38.66 42.72 58.84 70.51 -3.80 Width -103.97 -2.39 -2.55 -3.65 -3.80 1.19 -------------------------------------------------------- pottery 27 6 14 -6.897459 Best subsample: [1] 1 2 4 5 6 10 11 13 14 15 19 21 22 26 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=14) Robust Estimate of Location: SI AL FE MG CA TI 54.39 14.93 9.78 3.82 5.11 0.86 Robust Estimate of Covariance: SI AL FE MG CA TI SI 17.47469 -0.16656 0.39943 4.48192 -0.71153 0.06515 AL -0.16656 3.93154 -0.35738 -2.29899 0.14770 -0.02050 FE 0.39943 -0.35738 0.20434 0.37562 -0.22460 0.00943 MG 4.48192 -2.29899 0.37562 2.82339 -0.16027 0.02943 CA -0.71153 0.14770 -0.22460 -0.16027 0.88443 -0.01711 TI 0.06515 -0.02050 0.00943 0.02943 -0.01711 0.00114 -------------------------------------------------------- rice 105 6 53 -8.916472 Best subsample: [1] 4 6 8 10 13 15 16 17 18 25 27 29 30 31 32 33 34 36 37 [20] 38 44 45 47 51 52 53 54 55 59 60 65 67 70 72 76 79 80 81 [39] 82 83 84 85 86 90 92 93 94 95 97 98 99 101 105 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=53) Robust Estimate of Location: Favor Appearance Taste Stickiness -0.1741 0.0774 -0.0472 0.1868 Toughness Overall_evaluation -0.0346 -0.0683 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.402 0.306 0.378 0.364 -0.134 Appearance 0.306 0.508 0.474 0.407 -0.146 Taste 0.378 0.474 0.708 0.611 -0.258 Stickiness 0.364 0.407 0.611 0.795 -0.320 Toughness -0.134 -0.146 -0.258 -0.320 0.302 Overall_evaluation 0.453 0.536 0.746 0.745 -0.327 Overall_evaluation Favor 0.453 Appearance 0.536 Taste 0.746 Stickiness 0.745 Toughness -0.327 Overall_evaluation 0.963 -------------------------------------------------------- un86 73 7 37 19.832993 Best subsample: [1] 9 10 12 14 16 17 18 20 23 24 25 26 27 31 32 33 37 39 42 48 49 50 51 52 55 [26] 56 57 60 62 63 64 65 67 70 71 72 73 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=37) Robust Estimate of Location: POP MOR CAR DR GNP DEN TB 14.462 66.892 6.670 0.858 1.251 55.518 0.429 Robust Estimate of Covariance: POP MOR CAR DR GNP DEN POP 3.00e+02 1.58e+02 9.83e+00 2.74e+00 5.51e-01 6.87e+01 MOR 1.58e+02 2.96e+03 -4.24e+02 -4.72e+01 -5.40e+01 -1.01e+03 CAR 9.83e+00 -4.24e+02 9.12e+01 8.71e+00 1.13e+01 1.96e+02 DR 2.74e+00 -4.72e+01 8.71e+00 1.25e+00 1.03e+00 2.74e+01 GNP 5.51e-01 -5.40e+01 1.13e+01 1.03e+00 2.31e+00 2.36e+01 DEN 6.87e+01 -1.01e+03 1.96e+02 2.74e+01 2.36e+01 3.12e+03 TB 2.04e-02 -1.81e+00 3.42e-01 2.57e-02 2.09e-02 -6.88e-01 TB POP 2.04e-02 MOR -1.81e+00 CAR 3.42e-01 DR 2.57e-02 GNP 2.09e-02 DEN -6.88e-01 TB 2.59e-02 -------------------------------------------------------- wages 39 10 14 35.698016 Best subsample: [1] 1 2 5 6 9 10 11 13 15 19 23 25 26 28 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=14) Robust Estimate of Location: HRS RATE ERSP ERNO NEIN ASSET AGE DEP 2167.71 2.96 1113.50 300.43 382.29 7438.00 39.06 2.41 RACE SCHOOL 33.00 10.45 Robust Estimate of Covariance: HRS RATE ERSP ERNO NEIN ASSET HRS 1.97e+03 -4.14e-01 -4.71e+03 -6.58e+02 1.81e+03 3.84e+04 RATE -4.14e-01 1.14e-01 1.79e+01 3.08e+00 1.40e+01 3.57e+02 ERSP -4.71e+03 1.79e+01 1.87e+04 2.33e+03 -2.06e+03 -3.57e+04 ERNO -6.58e+02 3.08e+00 2.33e+03 5.36e+02 -3.42e+02 -5.56e+03 NEIN 1.81e+03 1.40e+01 -2.06e+03 -3.42e+02 5.77e+03 1.10e+05 ASSET 3.84e+04 3.57e+02 -3.57e+04 -5.56e+03 1.10e+05 2.86e+06 AGE -1.83e+01 1.09e-02 6.69e+01 8.78e+00 -5.07e+00 -1.51e+02 DEP 4.82e+00 -3.14e-02 -2.52e+01 -2.96e+00 -5.33e+00 -1.03e+02 RACE -5.67e+02 -1.33e+00 1.21e+03 1.81e+02 -9.13e+02 -1.96e+04 SCHOOL 5.33e+00 1.87e-01 1.86e+01 3.12e+00 3.20e+01 7.89e+02 AGE DEP RACE SCHOOL HRS -1.83e+01 4.82e+00 -5.67e+02 5.33e+00 RATE 1.09e-02 -3.14e-02 -1.33e+00 1.87e-01 ERSP 6.69e+01 -2.52e+01 1.21e+03 1.86e+01 ERNO 8.78e+00 -2.96e+00 1.81e+02 3.12e+00 NEIN -5.07e+00 -5.33e+00 -9.13e+02 3.20e+01 ASSET -1.51e+02 -1.03e+02 -1.96e+04 7.89e+02 AGE 5.71e-01 -1.56e-01 4.58e+00 -5.00e-02 DEP -1.56e-01 8.08e-02 -3.02e-01 -4.47e-02 RACE 4.58e+00 -3.02e-01 2.36e+02 -4.54e+00 SCHOOL -5.00e-02 -4.47e-02 -4.54e+00 4.23e-01 -------------------------------------------------------- airquality 153 4 56 21.136376 Best subsample: [1] 2 3 8 10 24 25 28 32 33 35 36 37 38 39 40 41 42 43 46 [20] 47 48 49 52 54 56 57 58 59 60 66 67 69 71 72 73 76 78 81 [39] 82 84 86 87 89 90 91 92 96 97 98 100 101 105 106 109 110 111 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=56) Robust Estimate of Location: Ozone Solar.R Wind Temp 41.84 197.21 8.93 80.39 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 1480.7 1562.8 -99.9 347.3 Solar.R 1562.8 11401.2 -35.2 276.8 Wind -99.9 -35.2 11.4 -23.5 Temp 347.3 276.8 -23.5 107.7 -------------------------------------------------------- attitude 30 7 15 27.040805 Best subsample: [1] 2 3 4 5 7 8 10 12 15 19 22 23 25 27 28 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=15) Robust Estimate of Location: rating complaints privileges learning raises critical 65.8 66.5 50.1 56.1 66.7 78.1 advance 41.7 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 138.77 80.02 59.22 107.33 95.83 -1.24 54.36 complaints 80.02 97.23 50.59 99.50 79.15 -2.71 42.81 privileges 59.22 50.59 84.92 90.03 60.88 22.39 44.93 learning 107.33 99.50 90.03 187.67 128.71 15.48 63.67 raises 95.83 79.15 60.88 128.71 123.94 -1.46 49.98 critical -1.24 -2.71 22.39 15.48 -1.46 61.23 12.88 advance 54.36 42.81 44.93 63.67 49.98 12.88 48.61 -------------------------------------------------------- attenu 182 5 83 9.710111 Best subsample: [1] 41 42 43 44 48 49 51 68 70 72 73 74 75 76 77 82 83 84 85 [20] 86 87 88 89 90 91 92 101 102 103 104 106 107 109 110 111 112 113 114 [39] 115 116 117 121 122 124 125 126 127 128 129 130 131 132 133 134 135 136 137 [58] 138 139 140 141 144 145 146 147 148 149 150 151 152 153 155 156 157 158 159 [77] 160 161 162 163 164 165 166 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=83) Robust Estimate of Location: event mag station dist accel 18.940 5.741 67.988 23.365 0.124 Robust Estimate of Covariance: event mag station dist accel event 2.86e+01 -2.31e+00 1.02e+02 2.68e+01 -1.99e-01 mag -2.31e+00 6.17e-01 -7.03e+00 4.67e-01 2.59e-02 station 1.02e+02 -7.03e+00 1.66e+03 1.62e+02 7.96e-02 dist 2.68e+01 4.67e-01 1.62e+02 3.61e+02 -1.23e+00 accel -1.99e-01 2.59e-02 7.96e-02 -1.23e+00 9.42e-03 -------------------------------------------------------- USJudgeRatings 43 12 22 -23.463708 Best subsample: [1] 2 3 4 6 9 11 15 16 18 19 24 25 26 27 28 29 32 33 34 36 37 38 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=22) Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.24 8.42 8.10 8.19 7.95 8.00 7.96 7.96 7.81 7.89 8.40 8.20 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP CONT 0.61805 -0.05601 -0.09540 0.00694 0.09853 0.06261 0.03939 INTG -0.05601 0.23560 0.27537 0.20758 0.16603 0.17281 0.21128 DMNR -0.09540 0.27537 0.55349 0.28872 0.24014 0.24293 0.28886 DILG 0.00694 0.20758 0.28872 0.34099 0.23502 0.23917 0.29672 CFMG 0.09853 0.16603 0.24014 0.23502 0.31649 0.23291 0.27651 DECI 0.06261 0.17281 0.24293 0.23917 0.23291 0.30681 0.27737 PREP 0.03939 0.21128 0.28886 0.29672 0.27651 0.27737 0.42020 FAMI 0.04588 0.20388 0.26072 0.29037 0.27179 0.27737 0.34857 ORAL 0.03000 0.21379 0.29606 0.28764 0.27338 0.27424 0.33503 WRIT 0.03261 0.20258 0.26931 0.27962 0.26382 0.26610 0.32677 PHYS -0.04485 0.13598 0.17659 0.16834 0.14554 0.16467 0.18948 RTEN 0.01543 0.22654 0.32117 0.27307 0.23826 0.24669 0.29450 FAMI ORAL WRIT PHYS RTEN CONT 0.04588 0.03000 0.03261 -0.04485 0.01543 INTG 0.20388 0.21379 0.20258 0.13598 0.22654 DMNR 0.26072 0.29606 0.26931 0.17659 0.32117 DILG 0.29037 0.28764 0.27962 0.16834 0.27307 CFMG 0.27179 0.27338 0.26382 0.14554 0.23826 DECI 0.27737 0.27424 0.26610 0.16467 0.24669 PREP 0.34857 0.33503 0.32677 0.18948 0.29450 FAMI 0.47232 0.33762 0.33420 0.19759 0.29015 ORAL 0.33762 0.40361 0.32208 0.19794 0.29544 WRIT 0.33420 0.32208 0.38733 0.19276 0.28184 PHYS 0.19759 0.19794 0.19276 0.20284 0.18097 RTEN 0.29015 0.29544 0.28184 0.18097 0.36877 -------------------------------------------------------- USArrests 50 4 25 17.834643 Best subsample: [1] 4 7 12 13 14 15 16 19 21 23 25 26 27 29 30 32 34 35 36 38 41 45 46 49 50 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=25) Robust Estimate of Location: Murder Assault UrbanPop Rape 5.38 121.68 63.80 16.33 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 17.8 316.3 48.5 31.1 Assault 316.3 6863.0 1040.0 548.9 UrbanPop 48.5 1040.0 424.8 93.6 Rape 31.1 548.9 93.6 63.8 -------------------------------------------------------- longley 16 7 8 31.147844 Best subsample: [1] 5 6 7 9 10 11 13 14 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=8) Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 104.3 410.8 278.8 300.1 118.2 Year Employed 1955.4 66.5 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 85.0 652.3 784.4 -370.7 48.7 GNP 652.3 7502.9 7328.6 -3414.2 453.9 Unemployed 784.4 7328.6 10760.3 -4646.7 548.1 Armed.Forces -370.7 -3414.2 -4646.7 2824.3 -253.9 Population 48.7 453.9 548.1 -253.9 40.2 Year 33.5 312.7 378.8 -176.1 23.4 Employed 23.9 224.8 263.6 -128.3 16.8 Year Employed GNP.deflator 33.5 23.9 GNP 312.7 224.8 Unemployed 378.8 263.6 Armed.Forces -176.1 -128.3 Population 23.4 16.8 Year 18.9 11.7 Employed 11.7 10.3 -------------------------------------------------------- Loblolly 84 3 42 11.163448 Best subsample: [1] 3 4 5 6 10 21 22 23 24 28 29 33 34 35 36 39 40 41 42 45 46 47 48 51 52 [26] 53 54 57 58 59 63 64 65 66 70 71 76 77 81 82 83 84 Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=42) Robust Estimate of Location: height age Seed 44.20 17.26 6.76 Robust Estimate of Covariance: height age Seed height 326.74 139.18 3.50 age 139.18 68.48 -2.72 Seed 3.50 -2.72 25.43 -------------------------------------------------------- quakes 1000 4 500 11.802478 Best subsample: Too long... Outliers: 0 Too many to print ... ------------- Call: CovMrcd(x = x, trace = FALSE) -> Method: Minimum Regularized Covariance Determinant MRCD(alpha=0.5 ==> h=500) Robust Estimate of Location: lat long depth mag -20.59 182.13 432.46 4.42 Robust Estimate of Covariance: lat long depth mag lat 15.841 5.702 -106.720 -0.441 long 5.702 7.426 -577.189 -0.136 depth -106.720 -577.189 66701.479 3.992 mag -0.441 -0.136 3.992 0.144 -------------------------------------------------------- ======================================================== > ##doexactfit() > > proc.time() user system elapsed 4.96 0.79 5.74 rrcov/tests/tsest.Rout.save0000644000176200001440000026726712763517421015555 0ustar liggesusers R Under development (unstable) (2014-06-23 r66008) -- "Unsuffered Consequences" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > library(MASS) > > dodata <- function(nrep = 1, time = FALSE, full = TRUE, method) { + doest <- function(x, xname, nrep = 1, method=c("sfast", "surreal", "bisquare", "rocke", "suser", "MM", "sdet")) { + + method <- match.arg(method) + + lname <- 20 + n <- dim(x)[1] + p <- dim(x)[2] + + mm <- if(method == "MM") CovMMest(x) else CovSest(x, method=method) + + crit <- log(mm@crit) + + xres <- sprintf("%3d %3d %12.6f\n", dim(x)[1], dim(x)[2], crit) + lpad <- lname-nchar(xname) + cat(pad.right(xname,lpad), xres) + + dist <- getDistance(mm) + quantiel <- qchisq(0.975, p) + ibad <- which(dist >= quantiel) + names(ibad) <- NULL + nbad <- length(ibad) + cat("Outliers: ",nbad,"\n") + if(nbad > 0) + print(ibad) + cat("-------------\n") + show(mm) + cat("--------------------------------------------------------\n") + } + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + data(heart) + data(starsCYG) + data(phosphor) + data(stackloss) + data(coleman) + data(salinity) + data(wood) + data(hbk) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + data(milk) + data(bushfire) + ### + data(rice) + data(hemophilia) + data(fish) + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p LOG(det) Time\n") + cat("===================================================\n") + doest(heart[, 1:2], data(heart), nrep, method=method) + doest(starsCYG, data(starsCYG), nrep, method=method) + doest(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep, method=method) + doest(stack.x, data(stackloss), nrep, method=method) + doest(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep, method=method) + doest(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep, method=method) + doest(data.matrix(subset(wood, select = -y)), data(wood), nrep, method=method) + doest(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep, method=method) + + + doest(brain, "Animals", nrep, method=method) + doest(milk, data(milk), nrep, method=method) + doest(bushfire, data(bushfire), nrep, method=method) + + doest(data.matrix(subset(rice, select = -Overall_evaluation)), data(rice), nrep, method=method) + doest(data.matrix(subset(hemophilia, select = -gr)), data(hemophilia), nrep, method=method) + doest(data.matrix(subset(fish, select = -Species)), data(fish), nrep, method=method) + + ## from package 'datasets' + doest(airquality[,1:4], data(airquality), nrep, method=method) + doest(attitude, data(attitude), nrep, method=method) + doest(attenu, data(attenu), nrep, method=method) + doest(USJudgeRatings, data(USJudgeRatings), nrep, method=method) + doest(USArrests, data(USArrests), nrep, method=method) + doest(longley, data(longley), nrep, method=method) + doest(Loblolly, data(Loblolly), nrep, method=method) + doest(quakes[,1:4], data(quakes), nrep, method=method) + + cat("===================================================\n") + } > > # generate contaminated data using the function gendata with different > # number of outliers and check if the M-estimate breaks - i.e. the > # largest eigenvalue is larger than e.g. 5. > # For n=50 and p=10 and d=5 the M-estimate can break for number of > # outliers grater than 20. > dogen <- function(){ + eig <- vector("numeric",26) + for(i in 0:25) { + gg <- gendata(eps=i) + mm <- CovSRocke(gg$x, t0=gg$tgood, S0=gg$sgood) + eig[i+1] <- ev <- getEvals(mm)[1] + cat(i, ev, "\n") + + ## stopifnot(ev < 5 || i > 20) + } + plot(0:25, eig, type="l", xlab="Number of outliers", ylab="Largest Eigenvalue") + } > > # > # generate data 50x10 as multivariate normal N(0,I) and add > # eps % outliers by adding d=5.0 to each component. > # - if eps <0 and eps <=0.5, the number of outliers is eps*n > # - if eps >= 1, it is the number of outliers > # - use the center and cov of the good data as good start > # - use the center and the cov of all data as a bad start > # If using a good start, the M-estimate must iterate to > # the good solution: the largest eigenvalue is less then e.g. 5 > # > gendata <- function(n=50, p=10, eps=0, d=5.0){ + + if(eps < 0 || eps > 0.5 && eps < 1.0 || eps > 0.5*n) + stop("eps is out of range") + + library(MASS) + + x <- mvrnorm(n, rep(0,p), diag(p)) + bad <- vector("numeric") + nbad = if(eps < 1) eps*n else eps + if(nbad > 0){ + bad <- sample(n, nbad) + x[bad,] <- x[bad,] + d + } + cov1 <- cov.wt(x) + cov2 <- if(nbad <= 0) cov1 else cov.wt(x[-bad,]) + + list(x=x, bad=sort(bad), tgood=cov2$center, sgood=cov2$cov, tbad=cov1$center, sbad=cov1$cov) + } > > pad.right <- function(z, pads) + { + ## Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > > ## -- now do it: > dodata(method="sfast") Call: dodata(method = "sfast") Data Set n p LOG(det) Time =================================================== heart 12 2 2.017701 Outliers: 3 [1] 2 6 12 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 36.1 29.5 Robust Estimate of Covariance: height weight height 129 210 weight 210 365 -------------------------------------------------------- starsCYG 47 2 -1.450032 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 4.42 4.97 Robust Estimate of Covariance: log.Te log.light log.Te 0.0176 0.0617 log.light 0.0617 0.3880 -------------------------------------------------------- phosphor 18 2 2.320721 Outliers: 2 [1] 1 6 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 14.1 38.8 Robust Estimate of Covariance: inorg organic inorg 174 190 organic 190 268 -------------------------------------------------------- stackloss 21 3 1.470031 Outliers: 3 [1] 1 2 3 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 57.5 20.5 86.0 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 38.94 11.66 22.89 Water.Temp 11.66 9.96 7.81 Acid.Conc. 22.89 7.81 40.48 -------------------------------------------------------- coleman 20 5 0.491419 Outliers: 2 [1] 6 10 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 2.77 45.58 4.13 25.13 6.39 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2209 1.9568 1.4389 0.2638 0.0674 fatherWc 1.9568 940.7409 307.8297 8.3290 21.9143 sstatus 1.4389 307.8297 134.0540 4.1808 7.4799 teacherSc 0.2638 8.3290 4.1808 0.7604 0.2917 motherLev 0.0674 21.9143 7.4799 0.2917 0.5817 -------------------------------------------------------- salinity 28 3 0.734619 Outliers: 4 [1] 5 16 23 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 10.31 3.07 22.60 Robust Estimate of Covariance: X1 X2 X3 X1 13.200 0.784 -3.611 X2 0.784 4.441 -1.658 X3 -3.611 -1.658 2.877 -------------------------------------------------------- wood 20 5 -3.202636 Outliers: 2 [1] 7 9 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 0.551 0.135 0.496 0.511 0.916 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.011361 -0.000791 0.005473 0.004204 -0.004747 x2 -0.000791 0.000701 -0.000534 -0.001452 0.000864 x3 0.005473 -0.000534 0.004905 0.002960 -0.001914 x4 0.004204 -0.001452 0.002960 0.005154 -0.002187 x5 -0.004747 0.000864 -0.001914 -0.002187 0.003214 -------------------------------------------------------- hbk 75 3 0.283145 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 1.53 1.83 1.66 Robust Estimate of Covariance: X1 X2 X3 X1 1.8091 0.0479 0.2446 X2 0.0479 1.8190 0.2513 X3 0.2446 0.2513 1.7288 -------------------------------------------------------- Animals 28 2 4.685129 Outliers: 10 [1] 2 6 7 9 12 14 15 16 24 25 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 30.8 84.2 Robust Estimate of Covariance: body brain body 14806 28767 brain 28767 65195 -------------------------------------------------------- milk 86 8 -1.437863 Outliers: 15 [1] 1 2 3 12 13 14 15 16 17 41 44 47 70 74 75 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 1.03 35.81 32.97 26.04 25.02 24.94 122.81 14.36 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 8.30e-07 2.53e-04 4.43e-04 4.02e-04 3.92e-04 3.96e-04 1.44e-03 X2 2.53e-04 2.24e+00 4.77e-01 3.63e-01 2.91e-01 3.94e-01 2.44e+00 X3 4.43e-04 4.77e-01 1.58e+00 1.20e+00 1.18e+00 1.19e+00 1.65e+00 X4 4.02e-04 3.63e-01 1.20e+00 9.74e-01 9.37e-01 9.39e-01 1.39e+00 X5 3.92e-04 2.91e-01 1.18e+00 9.37e-01 9.78e-01 9.44e-01 1.37e+00 X6 3.96e-04 3.94e-01 1.19e+00 9.39e-01 9.44e-01 9.82e-01 1.41e+00 X7 1.44e-03 2.44e+00 1.65e+00 1.39e+00 1.37e+00 1.41e+00 6.96e+00 X8 7.45e-05 3.33e-01 2.82e-01 2.01e-01 1.80e-01 1.91e-01 6.38e-01 X8 X1 7.45e-05 X2 3.33e-01 X3 2.82e-01 X4 2.01e-01 X5 1.80e-01 X6 1.91e-01 X7 6.38e-01 X8 2.01e-01 -------------------------------------------------------- bushfire 38 5 2.443148 Outliers: 13 [1] 7 8 9 10 11 31 32 33 34 35 36 37 38 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 108 149 266 216 278 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 911 688 -3961 -856 -707 V2 688 587 -2493 -492 -420 V3 -3961 -2493 24146 5765 4627 V4 -856 -492 5765 1477 1164 V5 -707 -420 4627 1164 925 -------------------------------------------------------- rice 105 5 -0.724874 Outliers: 7 [1] 9 40 42 49 57 58 71 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] -0.2472 0.1211 -0.1207 0.0715 0.0640 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.423 0.345 0.427 0.405 -0.202 Appearance 0.345 0.592 0.570 0.549 -0.316 Taste 0.427 0.570 0.739 0.706 -0.393 Stickiness 0.405 0.549 0.706 0.876 -0.497 Toughness -0.202 -0.316 -0.393 -0.497 0.467 -------------------------------------------------------- hemophilia 75 2 -1.868949 Outliers: 2 [1] 11 36 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] -0.2126 -0.0357 Robust Estimate of Covariance: AHFactivity AHFantigen AHFactivity 0.0317 0.0112 AHFantigen 0.0112 0.0218 -------------------------------------------------------- fish 159 6 1.285876 Outliers: 21 [1] 61 62 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 [20] 103 142 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 358.3 24.7 26.9 29.7 30.0 14.7 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 1.33e+05 3.09e+03 3.34e+03 3.78e+03 1.72e+03 2.24e+02 Length1 3.09e+03 7.92e+01 8.54e+01 9.55e+01 4.04e+01 7.43e+00 Length2 3.34e+03 8.54e+01 9.22e+01 1.03e+02 4.49e+01 8.07e+00 Length3 3.78e+03 9.55e+01 1.03e+02 1.18e+02 5.92e+01 7.65e+00 Height 1.72e+03 4.04e+01 4.49e+01 5.92e+01 7.12e+01 8.51e-01 Width 2.24e+02 7.43e+00 8.07e+00 7.65e+00 8.51e-01 3.57e+00 -------------------------------------------------------- airquality 153 4 2.684374 Outliers: 7 [1] 7 14 23 30 34 77 107 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 39.34 192.12 9.67 78.71 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 973.104 894.011 -61.856 243.560 Solar.R 894.011 9677.269 0.388 179.429 Wind -61.856 0.388 11.287 -14.310 Temp 243.560 179.429 -14.310 96.714 -------------------------------------------------------- attitude 30 7 2.091968 Outliers: 4 [1] 14 16 18 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 65.7 66.8 51.9 56.1 66.4 76.7 43.0 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 170.59 136.40 77.41 125.46 99.72 8.01 49.52 complaints 136.40 170.94 94.62 136.73 120.76 23.52 78.52 privileges 77.41 94.62 150.49 112.77 87.92 6.43 72.33 learning 125.46 136.73 112.77 173.77 131.46 25.81 81.38 raises 99.72 120.76 87.92 131.46 136.76 29.50 91.70 critical 8.01 23.52 6.43 25.81 29.50 84.75 30.59 advance 49.52 78.52 72.33 81.38 91.70 30.59 116.28 -------------------------------------------------------- attenu 182 5 1.148032 Outliers: 31 [1] 2 5 6 7 8 9 10 11 15 16 19 20 21 22 23 24 25 27 28 [20] 29 30 31 32 64 65 80 94 95 96 97 100 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 16.432 5.849 60.297 27.144 0.134 Robust Estimate of Covariance: event mag station dist accel event 54.9236 -3.0733 181.0954 -49.4194 -0.0628 mag -3.0733 0.6530 -8.4388 6.7388 0.0161 station 181.0954 -8.4388 1689.7161 -114.6319 0.7285 dist -49.4194 6.7388 -114.6319 597.3606 -1.7988 accel -0.0628 0.0161 0.7285 -1.7988 0.0152 -------------------------------------------------------- USJudgeRatings 43 12 -1.683847 Outliers: 7 [1] 5 7 12 13 14 23 31 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 7.43 8.16 7.75 7.89 7.68 7.76 7.67 7.67 7.51 7.58 8.19 7.86 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 0.8710 -0.3019 -0.4682 -0.1893 -0.0569 -0.0992 -0.1771 -0.1975 INTG -0.3019 0.6401 0.8598 0.6955 0.5732 0.5439 0.7091 0.7084 DMNR -0.4682 0.8598 1.2412 0.9107 0.7668 0.7305 0.9292 0.9158 DILG -0.1893 0.6955 0.9107 0.8554 0.7408 0.7036 0.8865 0.8791 CFMG -0.0569 0.5732 0.7668 0.7408 0.6994 0.6545 0.7788 0.7721 DECI -0.0992 0.5439 0.7305 0.7036 0.6545 0.6342 0.7492 0.7511 PREP -0.1771 0.7091 0.9292 0.8865 0.7788 0.7492 0.9541 0.9556 FAMI -0.1975 0.7084 0.9158 0.8791 0.7721 0.7511 0.9556 0.9785 ORAL -0.2444 0.7453 0.9939 0.8917 0.7842 0.7551 0.9554 0.9680 WRIT -0.2344 0.7319 0.9649 0.8853 0.7781 0.7511 0.9498 0.9668 PHYS -0.1983 0.4676 0.6263 0.5629 0.5073 0.5039 0.5990 0.6140 RTEN -0.3152 0.8000 1.0798 0.9234 0.7952 0.7663 0.9637 0.9693 ORAL WRIT PHYS RTEN CONT -0.2444 -0.2344 -0.1983 -0.3152 INTG 0.7453 0.7319 0.4676 0.8000 DMNR 0.9939 0.9649 0.6263 1.0798 DILG 0.8917 0.8853 0.5629 0.9234 CFMG 0.7842 0.7781 0.5073 0.7952 DECI 0.7551 0.7511 0.5039 0.7663 PREP 0.9554 0.9498 0.5990 0.9637 FAMI 0.9680 0.9668 0.6140 0.9693 ORAL 0.9853 0.9744 0.6280 1.0032 WRIT 0.9744 0.9711 0.6184 0.9870 PHYS 0.6280 0.6184 0.4716 0.6520 RTEN 1.0032 0.9870 0.6520 1.0622 -------------------------------------------------------- USArrests 50 4 2.411726 Outliers: 4 [1] 2 28 33 39 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 7.05 150.66 64.66 19.37 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 23.8 380.8 19.2 29.7 Assault 380.8 8436.2 605.6 645.3 UrbanPop 19.2 605.6 246.5 78.8 Rape 29.7 645.3 78.8 77.3 -------------------------------------------------------- longley 16 7 1.038316 Outliers: 5 [1] 1 2 3 4 5 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 107.6 440.8 339.7 292.5 121.0 1957.1 67.2 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 100.6 954.7 1147.1 -507.6 74.2 GNP 954.7 9430.9 10115.8 -4616.5 730.1 Unemployed 1147.1 10115.8 19838.3 -6376.9 850.6 Armed.Forces -507.6 -4616.5 -6376.9 3240.2 -351.3 Population 74.2 730.1 850.6 -351.3 57.5 Year 46.4 450.8 539.5 -233.0 35.3 Employed 30.8 310.5 274.0 -160.8 23.3 Year Employed GNP.deflator 46.4 30.8 GNP 450.8 310.5 Unemployed 539.5 274.0 Armed.Forces -233.0 -160.8 Population 35.3 23.3 Year 21.9 14.6 Employed 14.6 11.2 -------------------------------------------------------- Loblolly 84 3 1.481317 Outliers: 14 [1] 6 12 18 24 30 36 42 48 54 60 66 72 78 84 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] 24.22 9.65 7.50 Robust Estimate of Covariance: height age Seed height 525.08 179.21 14.27 age 179.21 61.85 2.94 Seed 14.27 2.94 25.86 -------------------------------------------------------- quakes 1000 4 1.576855 Outliers: 223 [1] 7 12 15 17 22 25 27 28 32 37 40 41 45 48 53 [16] 63 64 73 78 87 91 92 94 99 108 110 117 118 119 120 [31] 121 122 126 133 136 141 143 145 148 152 154 155 157 159 160 [46] 163 170 192 205 222 226 230 239 243 250 251 252 254 258 263 [61] 267 268 271 283 292 300 301 305 311 312 318 320 321 325 328 [76] 330 334 352 357 360 365 381 382 384 389 400 402 408 413 416 [91] 417 419 426 429 437 441 443 453 456 467 474 477 490 492 496 [106] 504 507 508 509 517 524 527 528 531 532 534 536 538 539 541 [121] 542 543 544 545 546 547 552 553 560 571 581 583 587 593 594 [136] 596 597 605 612 613 618 620 625 629 638 642 647 649 653 655 [151] 656 672 675 681 686 699 701 702 712 714 716 721 725 726 735 [166] 744 754 756 759 765 766 769 779 781 782 785 787 797 804 813 [181] 825 827 837 840 844 852 853 857 860 865 866 869 870 872 873 [196] 883 884 887 888 890 891 893 908 909 912 915 916 921 927 930 [211] 952 962 963 969 974 980 982 986 987 988 992 997 1000 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: S-FAST Robust Estimate of Location: [1] -21.54 182.35 369.21 4.54 Robust Estimate of Covariance: lat long depth mag lat 2.81e+01 6.19e+00 3.27e+02 -4.56e-01 long 6.19e+00 7.54e+00 -5.95e+02 9.56e-02 depth 3.27e+02 -5.95e+02 8.36e+04 -2.70e+01 mag -4.56e-01 9.56e-02 -2.70e+01 2.35e-01 -------------------------------------------------------- =================================================== > dodata(method="sdet") Call: dodata(method = "sdet") Data Set n p LOG(det) Time =================================================== heart 12 2 2.017701 Outliers: 3 [1] 2 6 12 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 36.1 29.5 Robust Estimate of Covariance: height weight height 129 210 weight 210 365 -------------------------------------------------------- starsCYG 47 2 -1.450032 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 4.42 4.97 Robust Estimate of Covariance: log.Te log.light log.Te 0.0176 0.0617 log.light 0.0617 0.3880 -------------------------------------------------------- phosphor 18 2 2.320721 Outliers: 2 [1] 1 6 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 14.1 38.8 Robust Estimate of Covariance: inorg organic inorg 174 190 organic 190 268 -------------------------------------------------------- stackloss 21 3 1.470031 Outliers: 3 [1] 1 2 3 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 57.5 20.5 86.0 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 38.94 11.66 22.89 Water.Temp 11.66 9.96 7.81 Acid.Conc. 22.89 7.81 40.48 -------------------------------------------------------- coleman 20 5 0.491419 Outliers: 2 [1] 6 10 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 2.77 45.58 4.13 25.13 6.39 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2209 1.9568 1.4389 0.2638 0.0674 fatherWc 1.9568 940.7409 307.8297 8.3290 21.9143 sstatus 1.4389 307.8297 134.0540 4.1808 7.4799 teacherSc 0.2638 8.3290 4.1808 0.7604 0.2917 motherLev 0.0674 21.9143 7.4799 0.2917 0.5817 -------------------------------------------------------- salinity 28 3 0.734619 Outliers: 4 [1] 5 16 23 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 10.31 3.07 22.60 Robust Estimate of Covariance: X1 X2 X3 X1 13.200 0.784 -3.611 X2 0.784 4.441 -1.658 X3 -3.611 -1.658 2.877 -------------------------------------------------------- wood 20 5 -3.220754 Outliers: 4 [1] 4 6 8 19 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 0.580 0.123 0.530 0.538 0.890 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 8.16e-03 1.39e-03 1.97e-03 -2.82e-04 -7.61e-04 x2 1.39e-03 4.00e-04 8.14e-04 -8.51e-05 -5.07e-06 x3 1.97e-03 8.14e-04 4.74e-03 -9.59e-04 2.06e-05 x4 -2.82e-04 -8.51e-05 -9.59e-04 3.09e-03 1.87e-03 x5 -7.61e-04 -5.07e-06 2.06e-05 1.87e-03 2.28e-03 -------------------------------------------------------- hbk 75 3 0.283145 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 1.53 1.83 1.66 Robust Estimate of Covariance: X1 X2 X3 X1 1.8091 0.0479 0.2446 X2 0.0479 1.8190 0.2513 X3 0.2446 0.2513 1.7288 -------------------------------------------------------- Animals 28 2 4.685129 Outliers: 10 [1] 2 6 7 9 12 14 15 16 24 25 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 30.8 84.2 Robust Estimate of Covariance: body brain body 14806 28767 brain 28767 65194 -------------------------------------------------------- milk 86 8 -1.437863 Outliers: 15 [1] 1 2 3 12 13 14 15 16 17 41 44 47 70 74 75 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 1.03 35.81 32.97 26.04 25.02 24.94 122.81 14.36 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 8.30e-07 2.53e-04 4.43e-04 4.02e-04 3.92e-04 3.96e-04 1.44e-03 X2 2.53e-04 2.24e+00 4.77e-01 3.63e-01 2.91e-01 3.94e-01 2.44e+00 X3 4.43e-04 4.77e-01 1.58e+00 1.20e+00 1.18e+00 1.19e+00 1.65e+00 X4 4.02e-04 3.63e-01 1.20e+00 9.74e-01 9.37e-01 9.39e-01 1.39e+00 X5 3.92e-04 2.91e-01 1.18e+00 9.37e-01 9.78e-01 9.44e-01 1.37e+00 X6 3.96e-04 3.94e-01 1.19e+00 9.39e-01 9.44e-01 9.82e-01 1.41e+00 X7 1.44e-03 2.44e+00 1.65e+00 1.39e+00 1.37e+00 1.41e+00 6.96e+00 X8 7.45e-05 3.33e-01 2.82e-01 2.01e-01 1.80e-01 1.91e-01 6.38e-01 X8 X1 7.45e-05 X2 3.33e-01 X3 2.82e-01 X4 2.01e-01 X5 1.80e-01 X6 1.91e-01 X7 6.38e-01 X8 2.01e-01 -------------------------------------------------------- bushfire 38 5 2.443148 Outliers: 13 [1] 7 8 9 10 11 31 32 33 34 35 36 37 38 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 108 149 266 216 278 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 911 688 -3961 -856 -707 V2 688 587 -2493 -492 -420 V3 -3961 -2493 24146 5765 4627 V4 -856 -492 5765 1477 1164 V5 -707 -420 4627 1164 925 -------------------------------------------------------- rice 105 5 -0.724874 Outliers: 7 [1] 9 40 42 49 57 58 71 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] -0.2472 0.1211 -0.1207 0.0715 0.0640 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.423 0.345 0.427 0.405 -0.202 Appearance 0.345 0.592 0.570 0.549 -0.316 Taste 0.427 0.570 0.739 0.706 -0.393 Stickiness 0.405 0.549 0.706 0.876 -0.497 Toughness -0.202 -0.316 -0.393 -0.497 0.467 -------------------------------------------------------- hemophilia 75 2 -1.868949 Outliers: 2 [1] 11 36 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] -0.2126 -0.0357 Robust Estimate of Covariance: AHFactivity AHFantigen AHFactivity 0.0317 0.0112 AHFantigen 0.0112 0.0218 -------------------------------------------------------- fish 159 6 1.267294 Outliers: 33 [1] 61 72 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 [20] 91 92 93 94 95 96 97 98 99 100 101 102 103 142 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 381.2 25.6 27.8 30.8 31.0 14.9 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 148372.04 3260.48 3508.71 3976.93 1507.43 127.94 Length1 3260.48 77.00 82.52 92.18 27.56 3.29 Length2 3508.71 82.52 88.57 99.20 30.83 3.43 Length3 3976.93 92.18 99.20 113.97 45.50 2.21 Height 1507.43 27.56 30.83 45.50 70.54 -4.95 Width 127.94 3.29 3.43 2.21 -4.95 2.28 -------------------------------------------------------- airquality 153 4 2.684374 Outliers: 7 [1] 7 14 23 30 34 77 107 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 39.34 192.12 9.67 78.71 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 973.104 894.011 -61.856 243.560 Solar.R 894.011 9677.269 0.388 179.429 Wind -61.856 0.388 11.287 -14.310 Temp 243.560 179.429 -14.310 96.714 -------------------------------------------------------- attitude 30 7 2.091968 Outliers: 4 [1] 14 16 18 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 65.7 66.8 51.9 56.1 66.4 76.7 43.0 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 170.59 136.40 77.41 125.46 99.72 8.01 49.52 complaints 136.40 170.94 94.62 136.73 120.76 23.52 78.52 privileges 77.41 94.62 150.49 112.77 87.92 6.43 72.33 learning 125.46 136.73 112.77 173.77 131.46 25.81 81.38 raises 99.72 120.76 87.92 131.46 136.76 29.50 91.70 critical 8.01 23.52 6.43 25.81 29.50 84.75 30.59 advance 49.52 78.52 72.33 81.38 91.70 30.59 116.28 -------------------------------------------------------- attenu 182 5 1.148032 Outliers: 31 [1] 2 5 6 7 8 9 10 11 15 16 19 20 21 22 23 24 25 27 28 [20] 29 30 31 32 64 65 80 94 95 96 97 100 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 16.432 5.849 60.297 27.144 0.134 Robust Estimate of Covariance: event mag station dist accel event 54.9236 -3.0733 181.0954 -49.4195 -0.0628 mag -3.0733 0.6530 -8.4388 6.7388 0.0161 station 181.0954 -8.4388 1689.7161 -114.6321 0.7285 dist -49.4195 6.7388 -114.6321 597.3609 -1.7988 accel -0.0628 0.0161 0.7285 -1.7988 0.0152 -------------------------------------------------------- USJudgeRatings 43 12 -1.683847 Outliers: 7 [1] 5 7 12 13 14 23 31 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 7.43 8.16 7.75 7.89 7.68 7.76 7.67 7.67 7.51 7.58 8.19 7.86 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 0.8715 -0.3020 -0.4683 -0.1894 -0.0569 -0.0993 -0.1772 -0.1976 INTG -0.3020 0.6403 0.8600 0.6956 0.5733 0.5440 0.7093 0.7086 DMNR -0.4683 0.8600 1.2416 0.9109 0.7669 0.7307 0.9295 0.9161 DILG -0.1894 0.6956 0.9109 0.8555 0.7410 0.7037 0.8867 0.8793 CFMG -0.0569 0.5733 0.7669 0.7410 0.6995 0.6546 0.7789 0.7723 DECI -0.0993 0.5440 0.7307 0.7037 0.6546 0.6343 0.7493 0.7513 PREP -0.1772 0.7093 0.9295 0.8867 0.7789 0.7493 0.9543 0.9559 FAMI -0.1976 0.7086 0.9161 0.8793 0.7723 0.7513 0.9559 0.9788 ORAL -0.2445 0.7456 0.9942 0.8919 0.7844 0.7553 0.9557 0.9683 WRIT -0.2345 0.7321 0.9652 0.8856 0.7783 0.7513 0.9501 0.9671 PHYS -0.1986 0.4676 0.6264 0.5628 0.5072 0.5038 0.5990 0.6140 RTEN -0.3154 0.8002 1.0801 0.9236 0.7954 0.7665 0.9639 0.9695 ORAL WRIT PHYS RTEN CONT -0.2445 -0.2345 -0.1986 -0.3154 INTG 0.7456 0.7321 0.4676 0.8002 DMNR 0.9942 0.9652 0.6264 1.0801 DILG 0.8919 0.8856 0.5628 0.9236 CFMG 0.7844 0.7783 0.5072 0.7954 DECI 0.7553 0.7513 0.5038 0.7665 PREP 0.9557 0.9501 0.5990 0.9639 FAMI 0.9683 0.9671 0.6140 0.9695 ORAL 0.9856 0.9748 0.6281 1.0035 WRIT 0.9748 0.9714 0.6184 0.9873 PHYS 0.6281 0.6184 0.4713 0.6520 RTEN 1.0035 0.9873 0.6520 1.0624 -------------------------------------------------------- USArrests 50 4 2.411726 Outliers: 4 [1] 2 28 33 39 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 7.05 150.66 64.66 19.37 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 23.8 380.8 19.2 29.7 Assault 380.8 8436.2 605.6 645.3 UrbanPop 19.2 605.6 246.5 78.8 Rape 29.7 645.3 78.8 77.3 -------------------------------------------------------- longley 16 7 1.143113 Outliers: 4 [1] 1 2 3 4 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 107 435 334 293 120 1957 67 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 89.2 850.1 1007.4 -404.4 66.2 GNP 850.1 8384.4 9020.8 -3692.0 650.5 Unemployed 1007.4 9020.8 16585.4 -4990.7 752.5 Armed.Forces -404.4 -3692.0 -4990.7 2474.2 -280.9 Population 66.2 650.5 752.5 -280.9 51.2 Year 41.9 407.6 481.9 -186.4 31.9 Employed 27.9 279.7 255.6 -128.8 21.1 Year Employed GNP.deflator 41.9 27.9 GNP 407.6 279.7 Unemployed 481.9 255.6 Armed.Forces -186.4 -128.8 Population 31.9 21.1 Year 20.2 13.4 Employed 13.4 10.1 -------------------------------------------------------- Loblolly 84 3 1.481317 Outliers: 14 [1] 6 12 18 24 30 36 42 48 54 60 66 72 78 84 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] 24.22 9.65 7.50 Robust Estimate of Covariance: height age Seed height 525.08 179.21 14.27 age 179.21 61.85 2.94 Seed 14.27 2.94 25.86 -------------------------------------------------------- quakes 1000 4 1.576855 Outliers: 223 [1] 7 12 15 17 22 25 27 28 32 37 40 41 45 48 53 [16] 63 64 73 78 87 91 92 94 99 108 110 117 118 119 120 [31] 121 122 126 133 136 141 143 145 148 152 154 155 157 159 160 [46] 163 170 192 205 222 226 230 239 243 250 251 252 254 258 263 [61] 267 268 271 283 292 300 301 305 311 312 318 320 321 325 328 [76] 330 334 352 357 360 365 381 382 384 389 400 402 408 413 416 [91] 417 419 426 429 437 441 443 453 456 467 474 477 490 492 496 [106] 504 507 508 509 517 524 527 528 531 532 534 536 538 539 541 [121] 542 543 544 545 546 547 552 553 560 571 581 583 587 593 594 [136] 596 597 605 612 613 618 620 625 629 638 642 647 649 653 655 [151] 656 672 675 681 686 699 701 702 712 714 716 721 725 726 735 [166] 744 754 756 759 765 766 769 779 781 782 785 787 797 804 813 [181] 825 827 837 840 844 852 853 857 860 865 866 869 870 872 873 [196] 883 884 887 888 890 891 893 908 909 912 915 916 921 927 930 [211] 952 962 963 969 974 980 982 986 987 988 992 997 1000 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: DET-S Robust Estimate of Location: [1] -21.54 182.35 369.21 4.54 Robust Estimate of Covariance: lat long depth mag lat 2.81e+01 6.19e+00 3.27e+02 -4.56e-01 long 6.19e+00 7.54e+00 -5.95e+02 9.56e-02 depth 3.27e+02 -5.95e+02 8.36e+04 -2.70e+01 mag -4.56e-01 9.56e-02 -2.70e+01 2.35e-01 -------------------------------------------------------- =================================================== > ##dodata(method="suser") > ##dodata(method="surreal") > dodata(method="bisquare") Call: dodata(method = "bisquare") Data Set n p LOG(det) Time =================================================== heart 12 2 7.721793 Outliers: 3 [1] 2 6 12 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: height weight 36.1 29.4 Robust Estimate of Covariance: height weight height 109 177 weight 177 307 -------------------------------------------------------- starsCYG 47 2 -5.942108 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: log.Te log.light 4.42 4.97 Robust Estimate of Covariance: log.Te log.light log.Te 0.0164 0.0574 log.light 0.0574 0.3613 -------------------------------------------------------- phosphor 18 2 9.269096 Outliers: 2 [1] 1 6 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: inorg organic 14.1 38.7 Robust Estimate of Covariance: inorg organic inorg 173 189 organic 189 268 -------------------------------------------------------- stackloss 21 3 8.411100 Outliers: 3 [1] 1 2 3 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 57.5 20.5 86.0 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 33.82 10.17 20.02 Water.Temp 10.17 8.70 6.84 Acid.Conc. 20.02 6.84 35.51 -------------------------------------------------------- coleman 20 5 4.722046 Outliers: 2 [1] 6 10 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.77 45.59 4.14 25.13 6.39 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2135 1.8732 1.3883 0.2547 0.0648 fatherWc 1.8732 905.6704 296.1916 7.9820 21.0848 sstatus 1.3883 296.1916 128.9536 4.0196 7.1917 teacherSc 0.2547 7.9820 4.0196 0.7321 0.2799 motherLev 0.0648 21.0848 7.1917 0.2799 0.5592 -------------------------------------------------------- salinity 28 3 4.169963 Outliers: 4 [1] 5 16 23 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: X1 X2 X3 10.30 3.07 22.59 Robust Estimate of Covariance: X1 X2 X3 X1 12.234 0.748 -3.369 X2 0.748 4.115 -1.524 X3 -3.369 -1.524 2.655 -------------------------------------------------------- wood 20 5 -33.862485 Outliers: 5 [1] 4 6 8 11 19 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: x1 x2 x3 x4 x5 0.580 0.123 0.530 0.538 0.890 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 5.88e-03 9.96e-04 1.43e-03 -1.96e-04 -5.46e-04 x2 9.96e-04 2.86e-04 5.89e-04 -5.78e-05 -2.24e-06 x3 1.43e-03 5.89e-04 3.42e-03 -6.95e-04 1.43e-05 x4 -1.96e-04 -5.78e-05 -6.95e-04 2.23e-03 1.35e-03 x5 -5.46e-04 -2.24e-06 1.43e-05 1.35e-03 1.65e-03 -------------------------------------------------------- hbk 75 3 1.472421 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: X1 X2 X3 1.53 1.83 1.66 Robust Estimate of Covariance: X1 X2 X3 X1 1.6775 0.0447 0.2268 X2 0.0447 1.6865 0.2325 X3 0.2268 0.2325 1.6032 -------------------------------------------------------- Animals 28 2 18.528307 Outliers: 11 [1] 2 6 7 9 12 14 15 16 24 25 28 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: body brain 30.7 84.1 Robust Estimate of Covariance: body brain body 13278 25795 brain 25795 58499 -------------------------------------------------------- milk 86 8 -24.816943 Outliers: 19 [1] 1 2 3 11 12 13 14 15 16 17 20 27 41 44 47 70 74 75 77 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.81 32.96 26.04 25.02 24.94 122.79 14.35 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 6.80e-07 2.20e-04 3.70e-04 3.35e-04 3.27e-04 3.30e-04 1.21e-03 X2 2.20e-04 1.80e+00 3.96e-01 3.03e-01 2.45e-01 3.27e-01 2.00e+00 X3 3.70e-04 3.96e-01 1.27e+00 9.68e-01 9.49e-01 9.56e-01 1.37e+00 X4 3.35e-04 3.03e-01 9.68e-01 7.86e-01 7.55e-01 7.57e-01 1.15e+00 X5 3.27e-04 2.45e-01 9.49e-01 7.55e-01 7.88e-01 7.61e-01 1.14e+00 X6 3.30e-04 3.27e-01 9.56e-01 7.57e-01 7.61e-01 7.90e-01 1.17e+00 X7 1.21e-03 2.00e+00 1.37e+00 1.15e+00 1.14e+00 1.17e+00 5.71e+00 X8 6.57e-05 2.71e-01 2.30e-01 1.64e-01 1.48e-01 1.57e-01 5.27e-01 X8 X1 6.57e-05 X2 2.71e-01 X3 2.30e-01 X4 1.64e-01 X5 1.48e-01 X6 1.57e-01 X7 5.27e-01 X8 1.62e-01 -------------------------------------------------------- bushfire 38 5 21.704243 Outliers: 13 [1] 7 8 9 10 11 31 32 33 34 35 36 37 38 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: V1 V2 V3 V4 V5 108 149 266 216 278 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 528 398 -2298 -497 -410 V2 398 340 -1445 -285 -244 V3 -2298 -1445 14026 3348 2687 V4 -497 -285 3348 857 676 V5 -410 -244 2687 676 537 -------------------------------------------------------- rice 105 5 -7.346939 Outliers: 8 [1] 9 14 40 42 49 57 58 71 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: Favor Appearance Taste Stickiness Toughness -0.2480 0.1203 -0.1213 0.0710 0.0644 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.415 0.338 0.419 0.398 -0.198 Appearance 0.338 0.580 0.559 0.539 -0.310 Taste 0.419 0.559 0.725 0.693 -0.386 Stickiness 0.398 0.539 0.693 0.859 -0.487 Toughness -0.198 -0.310 -0.386 -0.487 0.457 -------------------------------------------------------- hemophilia 75 2 -7.465173 Outliers: 2 [1] 11 36 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: AHFactivity AHFantigen -0.2128 -0.0366 Robust Estimate of Covariance: AHFactivity AHFantigen AHFactivity 0.0321 0.0115 AHFantigen 0.0115 0.0220 -------------------------------------------------------- fish 159 6 13.465134 Outliers: 35 [1] 38 61 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 [20] 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 142 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 381.4 25.6 27.8 30.8 31.0 14.9 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 111094.92 2440.81 2626.59 2976.92 1129.78 95.85 Length1 2440.81 57.63 61.75 68.98 20.67 2.46 Length2 2626.59 61.75 66.28 74.24 23.13 2.57 Length3 2976.92 68.98 74.24 85.29 34.11 1.65 Height 1129.78 20.67 23.13 34.11 52.75 -3.70 Width 95.85 2.46 2.57 1.65 -3.70 1.71 -------------------------------------------------------- airquality 153 4 21.282926 Outliers: 8 [1] 7 11 14 23 30 34 77 107 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: Ozone Solar.R Wind Temp 39.40 192.29 9.66 78.74 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 930.566 849.644 -59.157 232.459 Solar.R 849.644 9207.569 0.594 168.122 Wind -59.157 0.594 10.783 -13.645 Temp 232.459 168.122 -13.645 92.048 -------------------------------------------------------- attitude 30 7 28.084183 Outliers: 6 [1] 6 9 14 16 18 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: rating complaints privileges learning raises critical 65.7 66.8 51.9 56.1 66.4 76.7 advance 43.0 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 143.88 114.95 64.97 105.69 83.95 6.96 41.78 complaints 114.95 143.84 79.28 115.00 101.48 19.69 66.13 privileges 64.97 79.28 126.38 94.70 73.87 5.37 61.07 learning 105.69 115.00 94.70 146.14 110.50 21.67 68.49 raises 83.95 101.48 73.87 110.50 115.01 24.91 77.16 critical 6.96 19.69 5.37 21.67 24.91 71.74 25.88 advance 41.78 66.13 61.07 68.49 77.16 25.88 97.71 -------------------------------------------------------- attenu 182 5 10.109049 Outliers: 35 [1] 2 4 5 6 7 8 9 10 11 15 16 19 20 21 22 23 24 25 27 [20] 28 29 30 31 32 64 65 80 93 94 95 96 97 98 99 100 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: event mag station dist accel 16.418 5.850 60.243 27.307 0.134 Robust Estimate of Covariance: event mag station dist accel event 41.9000 -2.3543 137.8110 -39.0321 -0.0447 mag -2.3543 0.4978 -6.4461 5.2644 0.0118 station 137.8110 -6.4461 1283.9675 -90.1657 0.5554 dist -39.0321 5.2644 -90.1657 462.3898 -1.3672 accel -0.0447 0.0118 0.5554 -1.3672 0.0114 -------------------------------------------------------- USJudgeRatings 43 12 -43.367499 Outliers: 10 [1] 5 7 8 12 13 14 20 23 31 35 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.43 8.16 7.75 7.89 7.69 7.76 7.68 7.67 7.52 7.59 8.19 7.87 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 0.6895 -0.2399 -0.3728 -0.1514 -0.0461 -0.0801 -0.1419 -0.1577 INTG -0.2399 0.5021 0.6746 0.5446 0.4479 0.4254 0.5564 0.5558 DMNR -0.3728 0.6746 0.9753 0.7128 0.5992 0.5715 0.7289 0.7181 DILG -0.1514 0.5446 0.7128 0.6691 0.5789 0.5501 0.6949 0.6892 CFMG -0.0461 0.4479 0.5992 0.5789 0.5468 0.5118 0.6100 0.6049 DECI -0.0801 0.4254 0.5715 0.5501 0.5118 0.4965 0.5872 0.5890 PREP -0.1419 0.5564 0.7289 0.6949 0.6100 0.5872 0.7497 0.7511 FAMI -0.1577 0.5558 0.7181 0.6892 0.6049 0.5890 0.7511 0.7696 ORAL -0.1950 0.5848 0.7798 0.6990 0.6143 0.5921 0.7508 0.7610 WRIT -0.1866 0.5747 0.7575 0.6946 0.6101 0.5895 0.7470 0.7607 PHYS -0.1620 0.3640 0.4878 0.4361 0.3927 0.3910 0.4655 0.4779 RTEN -0.2522 0.6268 0.8462 0.7220 0.6210 0.5991 0.7553 0.7599 ORAL WRIT PHYS RTEN CONT -0.1950 -0.1866 -0.1620 -0.2522 INTG 0.5848 0.5747 0.3640 0.6268 DMNR 0.7798 0.7575 0.4878 0.8462 DILG 0.6990 0.6946 0.4361 0.7220 CFMG 0.6143 0.6101 0.3927 0.6210 DECI 0.5921 0.5895 0.3910 0.5991 PREP 0.7508 0.7470 0.4655 0.7553 FAMI 0.7610 0.7607 0.4779 0.7599 ORAL 0.7745 0.7665 0.4893 0.7866 WRIT 0.7665 0.7645 0.4823 0.7745 PHYS 0.4893 0.4823 0.3620 0.5062 RTEN 0.7866 0.7745 0.5062 0.8313 -------------------------------------------------------- USArrests 50 4 19.266763 Outliers: 4 [1] 2 28 33 39 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: Murder Assault UrbanPop Rape 7.04 150.55 64.64 19.34 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 23.7 378.9 19.1 29.5 Assault 378.9 8388.2 601.3 639.7 UrbanPop 19.1 601.3 245.3 77.9 Rape 29.5 639.7 77.9 76.3 -------------------------------------------------------- longley 16 7 13.789499 Outliers: 4 [1] 1 2 3 4 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 107 435 333 293 120 Year Employed 1957 67 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 65.05 619.75 734.33 -294.02 48.27 GNP 619.75 6112.14 6578.12 -2684.52 474.26 Unemployed 734.33 6578.12 12075.90 -3627.79 548.58 Armed.Forces -294.02 -2684.52 -3627.79 1797.05 -204.25 Population 48.27 474.26 548.58 -204.25 37.36 Year 30.58 297.29 351.44 -135.53 23.29 Employed 20.36 203.96 186.62 -93.64 15.42 Year Employed GNP.deflator 30.58 20.36 GNP 297.29 203.96 Unemployed 351.44 186.62 Armed.Forces -135.53 -93.64 Population 23.29 15.42 Year 14.70 9.80 Employed 9.80 7.36 -------------------------------------------------------- Loblolly 84 3 8.518440 Outliers: 14 [1] 6 12 18 24 30 36 42 48 54 60 66 72 78 84 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: height age Seed 24.14 9.62 7.51 Robust Estimate of Covariance: height age Seed height 464.64 158.43 12.83 age 158.43 54.62 2.67 Seed 12.83 2.67 22.98 -------------------------------------------------------- quakes 1000 4 11.611413 Outliers: 234 [1] 7 12 15 17 22 25 27 28 32 37 40 41 45 48 53 [16] 63 64 73 78 87 91 92 94 99 108 110 117 118 119 120 [31] 121 122 126 133 136 141 143 145 148 152 154 155 157 159 160 [46] 163 166 170 174 192 205 222 226 230 239 243 250 251 252 254 [61] 258 263 267 268 271 283 292 297 300 301 305 311 312 318 320 [76] 321 325 328 330 331 334 352 357 360 365 368 376 381 382 384 [91] 389 399 400 402 408 413 416 417 418 419 426 429 437 441 443 [106] 453 456 467 474 477 490 492 496 504 507 508 509 517 524 527 [121] 528 531 532 534 536 538 539 541 542 543 544 545 546 547 552 [136] 553 558 560 570 571 581 583 587 593 594 596 597 605 612 613 [151] 618 620 625 629 638 642 647 649 653 655 656 672 675 681 686 [166] 699 701 702 712 714 716 721 725 726 735 744 753 754 756 759 [181] 765 766 769 779 781 782 785 787 797 804 813 825 827 837 840 [196] 844 852 853 857 860 865 866 869 870 872 873 883 884 887 888 [211] 890 891 893 908 909 912 915 916 921 927 930 952 962 963 969 [226] 974 980 982 986 987 988 992 997 1000 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: bisquare Robust Estimate of Location: lat long depth mag -21.54 182.35 369.29 4.54 Robust Estimate of Covariance: lat long depth mag lat 2.18e+01 4.82e+00 2.53e+02 -3.54e-01 long 4.82e+00 5.87e+00 -4.63e+02 7.45e-02 depth 2.53e+02 -4.63e+02 6.51e+04 -2.10e+01 mag -3.54e-01 7.45e-02 -2.10e+01 1.83e-01 -------------------------------------------------------- =================================================== > dodata(method="rocke") Call: dodata(method = "rocke") Data Set n p LOG(det) Time =================================================== heart 12 2 7.285196 Outliers: 3 [1] 2 6 12 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: height weight 34.3 26.1 Robust Estimate of Covariance: height weight height 105 159 weight 159 256 -------------------------------------------------------- starsCYG 47 2 -5.929361 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: log.Te log.light 4.42 4.93 Robust Estimate of Covariance: log.Te log.light log.Te 0.0193 0.0709 log.light 0.0709 0.3987 -------------------------------------------------------- phosphor 18 2 8.907518 Outliers: 3 [1] 1 6 10 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: inorg organic 15.8 39.4 Robust Estimate of Covariance: inorg organic inorg 196 252 organic 252 360 -------------------------------------------------------- stackloss 21 3 8.143313 Outliers: 4 [1] 1 2 3 21 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 56.8 20.2 86.4 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 29.26 9.62 14.78 Water.Temp 9.62 8.54 6.25 Acid.Conc. 14.78 6.25 29.70 -------------------------------------------------------- coleman 20 5 4.001659 Outliers: 5 [1] 2 6 9 10 13 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.81 40.27 2.11 25.01 6.27 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.2850 1.1473 2.0254 0.3536 0.0737 fatherWc 1.1473 798.0714 278.0145 6.4590 18.6357 sstatus 2.0254 278.0145 128.7601 4.0666 6.3845 teacherSc 0.3536 6.4590 4.0666 0.8749 0.2980 motherLev 0.0737 18.6357 6.3845 0.2980 0.4948 -------------------------------------------------------- salinity 28 3 3.455146 Outliers: 9 [1] 3 5 10 11 15 16 17 23 24 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: X1 X2 X3 9.89 3.10 22.46 Robust Estimate of Covariance: X1 X2 X3 X1 12.710 1.868 -4.135 X2 1.868 4.710 -0.663 X3 -4.135 -0.663 1.907 -------------------------------------------------------- wood 20 5 -35.020244 Outliers: 7 [1] 4 6 7 8 11 16 19 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: x1 x2 x3 x4 x5 0.588 0.123 0.534 0.535 0.891 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 6.60e-03 1.25e-03 2.16e-03 -3.73e-04 -1.10e-03 x2 1.25e-03 3.30e-04 8.91e-04 -1.23e-05 2.62e-05 x3 2.16e-03 8.91e-04 4.55e-03 -4.90e-04 1.93e-04 x4 -3.73e-04 -1.23e-05 -4.90e-04 2.01e-03 1.36e-03 x5 -1.10e-03 2.62e-05 1.93e-04 1.36e-03 1.95e-03 -------------------------------------------------------- hbk 75 3 1.413303 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: X1 X2 X3 1.56 1.77 1.68 Robust Estimate of Covariance: X1 X2 X3 X1 1.6483 0.0825 0.2133 X2 0.0825 1.6928 0.2334 X3 0.2133 0.2334 1.5334 -------------------------------------------------------- Animals 28 2 17.787210 Outliers: 11 [1] 2 6 7 9 12 14 15 16 24 25 28 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: body brain 60.6 150.2 Robust Estimate of Covariance: body brain body 10670 19646 brain 19646 41147 -------------------------------------------------------- milk 86 8 -25.169970 Outliers: 22 [1] 1 2 3 11 12 13 14 15 16 17 18 20 27 28 41 44 47 70 73 74 75 77 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.87 33.14 26.19 25.17 25.11 123.16 14.41 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 4.47e-07 1.77e-04 1.94e-04 1.79e-04 1.60e-04 1.45e-04 6.45e-04 X2 1.77e-04 2.36e+00 4.03e-01 3.08e-01 2.08e-01 3.45e-01 2.18e+00 X3 1.94e-04 4.03e-01 1.13e+00 8.31e-01 8.08e-01 7.79e-01 9.83e-01 X4 1.79e-04 3.08e-01 8.31e-01 6.62e-01 6.22e-01 5.95e-01 7.82e-01 X5 1.60e-04 2.08e-01 8.08e-01 6.22e-01 6.51e-01 5.93e-01 7.60e-01 X6 1.45e-04 3.45e-01 7.79e-01 5.95e-01 5.93e-01 5.88e-01 7.81e-01 X7 6.45e-04 2.18e+00 9.83e-01 7.82e-01 7.60e-01 7.81e-01 4.81e+00 X8 2.47e-05 2.57e-01 2.00e-01 1.37e-01 1.13e-01 1.28e-01 4.38e-01 X8 X1 2.47e-05 X2 2.57e-01 X3 2.00e-01 X4 1.37e-01 X5 1.13e-01 X6 1.28e-01 X7 4.38e-01 X8 1.61e-01 -------------------------------------------------------- bushfire 38 5 21.641566 Outliers: 13 [1] 7 8 9 10 11 31 32 33 34 35 36 37 38 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: V1 V2 V3 V4 V5 111 150 256 214 276 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 554 408 -2321 -464 -393 V2 408 343 -1361 -244 -215 V3 -2321 -1361 14690 3277 2684 V4 -464 -244 3277 783 629 V5 -393 -215 2684 629 509 -------------------------------------------------------- rice 105 5 -7.208835 Outliers: 8 [1] 9 14 40 42 49 57 58 71 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: Favor Appearance Taste Stickiness Toughness -0.21721 0.20948 -0.04581 0.15355 -0.00254 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.432 0.337 0.417 0.382 -0.201 Appearance 0.337 0.591 0.553 0.510 -0.295 Taste 0.417 0.553 0.735 0.683 -0.385 Stickiness 0.382 0.510 0.683 0.834 -0.462 Toughness -0.201 -0.295 -0.385 -0.462 0.408 -------------------------------------------------------- hemophilia 75 2 -7.453807 Outliers: 2 [1] 46 53 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: AHFactivity AHFantigen -0.2276 -0.0637 Robust Estimate of Covariance: AHFactivity AHFantigen AHFactivity 0.0405 0.0221 AHFantigen 0.0221 0.0263 -------------------------------------------------------- fish 159 6 13.110263 Outliers: 47 [1] 38 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [20] 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [39] 98 99 100 101 102 103 104 140 142 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 452.1 27.2 29.5 32.6 30.8 15.0 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 132559.85 2817.97 3035.69 3369.07 1231.68 112.19 Length1 2817.97 64.16 68.74 75.36 22.52 2.37 Length2 3035.69 68.74 73.77 81.12 25.57 2.47 Length3 3369.07 75.36 81.12 91.65 37.39 1.40 Height 1231.68 22.52 25.57 37.39 50.91 -3.92 Width 112.19 2.37 2.47 1.40 -3.92 1.87 -------------------------------------------------------- airquality 153 4 21.181656 Outliers: 13 [1] 6 7 11 14 17 20 23 30 34 53 63 77 107 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: Ozone Solar.R Wind Temp 40.21 198.33 9.76 79.35 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 885.7 581.1 -57.3 226.4 Solar.R 581.1 8870.9 26.2 -15.1 Wind -57.3 26.2 11.8 -13.4 Temp 226.4 -15.1 -13.4 89.4 -------------------------------------------------------- attitude 30 7 27.836398 Outliers: 8 [1] 1 9 13 14 17 18 24 26 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: rating complaints privileges learning raises critical 64.0 65.4 50.5 54.9 63.1 72.6 advance 40.5 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 180.10 153.16 42.04 128.90 90.25 18.75 39.81 complaints 153.16 192.38 58.32 142.48 94.29 8.13 45.33 privileges 42.04 58.32 113.65 82.31 69.53 23.13 61.96 learning 128.90 142.48 82.31 156.99 101.74 13.22 49.64 raises 90.25 94.29 69.53 101.74 110.85 47.84 55.76 critical 18.75 8.13 23.13 13.22 47.84 123.00 36.97 advance 39.81 45.33 61.96 49.64 55.76 36.97 53.59 -------------------------------------------------------- attenu 182 5 9.726797 Outliers: 44 [1] 1 2 4 5 6 7 8 9 10 11 13 15 16 19 20 21 22 23 24 [20] 25 27 28 29 30 31 32 40 45 60 61 64 65 78 80 81 93 94 95 [39] 96 97 98 99 100 108 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: event mag station dist accel 16.39 5.82 60.89 27.97 0.12 Robust Estimate of Covariance: event mag station dist accel event 4.20e+01 -1.97e+00 1.44e+02 -3.50e+01 4.05e-02 mag -1.97e+00 5.05e-01 -4.78e+00 4.63e+00 4.19e-03 station 1.44e+02 -4.78e+00 1.47e+03 -5.74e+01 7.88e-01 dist -3.50e+01 4.63e+00 -5.74e+01 3.99e+02 -1.18e+00 accel 4.05e-02 4.19e-03 7.88e-01 -1.18e+00 7.71e-03 -------------------------------------------------------- USJudgeRatings 43 12 -46.356873 Outliers: 15 [1] 1 5 7 8 12 13 14 17 20 21 23 30 31 35 42 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.56 8.12 7.70 7.91 7.74 7.82 7.66 7.66 7.50 7.58 8.22 7.86 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP CONT 0.63426 -0.20121 -0.31858 -0.09578 0.00521 -0.00436 -0.07140 INTG -0.20121 0.28326 0.37540 0.27103 0.20362 0.19838 0.25706 DMNR -0.31858 0.37540 0.58265 0.33615 0.25649 0.24804 0.31696 DILG -0.09578 0.27103 0.33615 0.32588 0.27022 0.26302 0.32236 CFMG 0.00521 0.20362 0.25649 0.27022 0.25929 0.24217 0.27784 DECI -0.00436 0.19838 0.24804 0.26302 0.24217 0.23830 0.27284 PREP -0.07140 0.25706 0.31696 0.32236 0.27784 0.27284 0.35071 FAMI -0.07118 0.25858 0.29511 0.32582 0.27863 0.27657 0.35941 ORAL -0.11149 0.27055 0.33919 0.31768 0.27339 0.26739 0.34200 WRIT -0.10050 0.26857 0.32570 0.32327 0.27860 0.27201 0.34399 PHYS -0.09693 0.15339 0.18416 0.17089 0.13837 0.14895 0.18472 RTEN -0.15643 0.31793 0.40884 0.33863 0.27073 0.26854 0.34049 FAMI ORAL WRIT PHYS RTEN CONT -0.07118 -0.11149 -0.10050 -0.09693 -0.15643 INTG 0.25858 0.27055 0.26857 0.15339 0.31793 DMNR 0.29511 0.33919 0.32570 0.18416 0.40884 DILG 0.32582 0.31768 0.32327 0.17089 0.33863 CFMG 0.27863 0.27339 0.27860 0.13837 0.27073 DECI 0.27657 0.26739 0.27201 0.14895 0.26854 PREP 0.35941 0.34200 0.34399 0.18472 0.34049 FAMI 0.38378 0.35617 0.36094 0.19998 0.35048 ORAL 0.35617 0.34918 0.34808 0.19759 0.35217 WRIT 0.36094 0.34808 0.35242 0.19666 0.35090 PHYS 0.19998 0.19759 0.19666 0.14770 0.20304 RTEN 0.35048 0.35217 0.35090 0.20304 0.39451 -------------------------------------------------------- USArrests 50 4 19.206310 Outliers: 4 [1] 2 28 33 39 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: Murder Assault UrbanPop Rape 7.55 160.94 65.10 19.97 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 25.6 409.5 23.4 32.1 Assault 409.5 8530.9 676.9 669.4 UrbanPop 23.4 676.9 269.9 76.6 Rape 32.1 669.4 76.6 76.6 -------------------------------------------------------- longley 16 7 13.387132 Outliers: 4 [1] 1 2 3 4 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 105.5 422.4 318.3 299.7 119.5 Year Employed 1956.1 66.5 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 59.97 582.66 694.99 -237.75 46.12 GNP 582.66 5849.82 6383.68 -2207.26 461.15 Unemployed 694.99 6383.68 11155.03 -3104.18 534.25 Armed.Forces -237.75 -2207.26 -3104.18 1429.11 -171.28 Population 46.12 461.15 534.25 -171.28 36.79 Year 29.01 287.48 340.95 -112.61 22.85 Employed 18.99 193.66 186.31 -76.88 14.94 Year Employed GNP.deflator 29.01 18.99 GNP 287.48 193.66 Unemployed 340.95 186.31 Armed.Forces -112.61 -76.88 Population 22.85 14.94 Year 14.36 9.45 Employed 9.45 6.90 -------------------------------------------------------- Loblolly 84 3 7.757906 Outliers: 27 [1] 5 6 11 12 18 23 24 29 30 35 36 41 42 47 48 53 54 59 60 65 66 71 72 77 78 [26] 83 84 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: height age Seed 21.72 8.60 7.58 Robust Estimate of Covariance: height age Seed height 316.590 102.273 5.939 age 102.273 33.465 -0.121 Seed 5.939 -0.121 27.203 -------------------------------------------------------- quakes 1000 4 11.473431 Outliers: 237 [1] 7 12 15 17 22 25 27 28 32 37 40 41 45 48 53 [16] 63 64 73 78 87 91 92 94 99 108 110 117 118 119 120 [31] 121 122 126 133 136 141 143 145 148 152 154 155 157 159 160 [46] 163 166 170 174 176 192 205 222 226 230 239 243 244 250 251 [61] 252 254 258 263 267 268 271 283 292 297 300 301 305 311 312 [76] 318 320 321 325 328 330 331 334 352 357 360 365 368 376 381 [91] 382 384 389 399 400 402 408 410 413 416 417 418 419 426 429 [106] 437 441 443 453 456 467 474 477 490 492 496 504 507 508 509 [121] 517 524 527 528 531 532 534 536 538 539 541 542 543 544 545 [136] 546 547 552 553 558 560 570 571 581 583 587 593 594 596 597 [151] 605 612 613 618 620 625 629 638 642 647 649 653 655 656 672 [166] 675 681 686 699 701 702 712 714 716 721 725 726 735 744 753 [181] 754 756 759 765 766 769 779 781 782 785 787 797 804 813 825 [196] 827 837 840 844 852 853 857 860 865 866 869 870 872 873 883 [211] 884 887 888 890 891 893 908 909 912 915 916 921 927 930 952 [226] 962 963 969 974 980 982 986 987 988 992 997 1000 ------------- Call: CovSest(x = x, method = method) -> Method: S-estimates: Rocke type Robust Estimate of Location: lat long depth mag -21.45 182.54 351.18 4.55 Robust Estimate of Covariance: lat long depth mag lat 2.10e+01 4.66e+00 2.45e+02 -3.38e-01 long 4.66e+00 5.88e+00 -4.63e+02 9.36e-02 depth 2.45e+02 -4.63e+02 6.38e+04 -2.02e+01 mag -3.38e-01 9.36e-02 -2.02e+01 1.78e-01 -------------------------------------------------------- =================================================== > dodata(method="MM") Call: dodata(method = "MM") Data Set n p LOG(det) Time =================================================== heart 12 2 2.017701 Outliers: 1 [1] 6 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: height weight 40.0 37.7 Robust Estimate of Covariance: height weight height 99.2 205.7 weight 205.7 458.9 -------------------------------------------------------- starsCYG 47 2 -1.450032 Outliers: 7 [1] 7 9 11 14 20 30 34 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: log.Te log.light 4.41 4.94 Robust Estimate of Covariance: log.Te log.light log.Te 0.0180 0.0526 log.light 0.0526 0.3217 -------------------------------------------------------- phosphor 18 2 2.320721 Outliers: 1 [1] 6 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: inorg organic 12.3 41.4 Robust Estimate of Covariance: inorg organic inorg 94.2 67.2 organic 67.2 162.1 -------------------------------------------------------- stackloss 21 3 1.470031 Outliers: 0 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: Air.Flow Water.Temp Acid.Conc. 60.2 21.0 86.4 Robust Estimate of Covariance: Air.Flow Water.Temp Acid.Conc. Air.Flow 81.13 21.99 23.15 Water.Temp 21.99 10.01 6.43 Acid.Conc. 23.15 6.43 27.22 -------------------------------------------------------- coleman 20 5 0.491419 Outliers: 1 [1] 10 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: salaryP fatherWc sstatus teacherSc motherLev 2.74 43.14 3.65 25.07 6.32 Robust Estimate of Covariance: salaryP fatherWc sstatus teacherSc motherLev salaryP 0.1878 2.0635 1.0433 0.2721 0.0582 fatherWc 2.0635 670.2232 211.0609 4.3625 15.6083 sstatus 1.0433 211.0609 92.8743 2.6532 5.1816 teacherSc 0.2721 4.3625 2.6532 1.2757 0.1613 motherLev 0.0582 15.6083 5.1816 0.1613 0.4192 -------------------------------------------------------- salinity 28 3 0.734619 Outliers: 2 [1] 5 16 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: X1 X2 X3 10.46 2.66 23.15 Robust Estimate of Covariance: X1 X2 X3 X1 10.079 -0.024 -1.899 X2 -0.024 3.466 -1.817 X3 -1.899 -1.817 3.665 -------------------------------------------------------- wood 20 5 -3.202636 Outliers: 0 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: x1 x2 x3 x4 x5 0.550 0.133 0.506 0.511 0.909 Robust Estimate of Covariance: x1 x2 x3 x4 x5 x1 0.008454 -0.000377 0.003720 0.002874 -0.003065 x2 -0.000377 0.000516 -0.000399 -0.000933 0.000645 x3 0.003720 -0.000399 0.004186 0.001720 -0.001714 x4 0.002874 -0.000933 0.001720 0.003993 -0.001028 x5 -0.003065 0.000645 -0.001714 -0.001028 0.002744 -------------------------------------------------------- hbk 75 3 0.283145 Outliers: 14 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: X1 X2 X3 1.54 1.79 1.68 Robust Estimate of Covariance: X1 X2 X3 X1 1.8016 0.0739 0.2000 X2 0.0739 1.8301 0.2295 X3 0.2000 0.2295 1.7101 -------------------------------------------------------- Animals 28 2 4.685129 Outliers: 10 [1] 2 6 7 9 12 14 15 16 24 25 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: body brain 82 148 Robust Estimate of Covariance: body brain body 21050 24534 brain 24534 35135 -------------------------------------------------------- milk 86 8 -1.437863 Outliers: 12 [1] 1 2 3 12 13 17 41 44 47 70 74 75 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: X1 X2 X3 X4 X5 X6 X7 X8 1.03 35.73 32.87 25.96 24.94 24.85 122.55 14.33 Robust Estimate of Covariance: X1 X2 X3 X4 X5 X6 X7 X1 1.08e-06 5.36e-04 6.80e-04 5.96e-04 5.87e-04 5.91e-04 2.22e-03 X2 5.36e-04 2.42e+00 7.07e-01 5.51e-01 4.89e-01 5.70e-01 3.08e+00 X3 6.80e-04 7.07e-01 1.64e+00 1.28e+00 1.25e+00 1.26e+00 2.38e+00 X4 5.96e-04 5.51e-01 1.28e+00 1.05e+00 1.01e+00 1.02e+00 2.01e+00 X5 5.87e-04 4.89e-01 1.25e+00 1.01e+00 1.05e+00 1.02e+00 1.96e+00 X6 5.91e-04 5.70e-01 1.26e+00 1.02e+00 1.02e+00 1.05e+00 2.01e+00 X7 2.22e-03 3.08e+00 2.38e+00 2.01e+00 1.96e+00 2.01e+00 9.22e+00 X8 1.68e-04 4.13e-01 3.37e-01 2.53e-01 2.34e-01 2.43e-01 8.81e-01 X8 X1 1.68e-04 X2 4.13e-01 X3 3.37e-01 X4 2.53e-01 X5 2.34e-01 X6 2.43e-01 X7 8.81e-01 X8 2.11e-01 -------------------------------------------------------- bushfire 38 5 2.443148 Outliers: 12 [1] 8 9 10 11 31 32 33 34 35 36 37 38 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: V1 V2 V3 V4 V5 109 149 258 215 276 Robust Estimate of Covariance: V1 V2 V3 V4 V5 V1 708 538 -2705 -558 -464 V2 538 497 -1376 -248 -216 V3 -2705 -1376 20521 4833 3914 V4 -558 -248 4833 1217 969 V5 -464 -216 3914 969 778 -------------------------------------------------------- rice 105 5 -0.724874 Outliers: 5 [1] 9 42 49 58 71 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: Favor Appearance Taste Stickiness Toughness -0.2653 0.0969 -0.1371 0.0483 0.0731 Robust Estimate of Covariance: Favor Appearance Taste Stickiness Toughness Favor 0.421 0.349 0.427 0.405 -0.191 Appearance 0.349 0.605 0.565 0.553 -0.316 Taste 0.427 0.565 0.725 0.701 -0.378 Stickiness 0.405 0.553 0.701 0.868 -0.484 Toughness -0.191 -0.316 -0.378 -0.484 0.464 -------------------------------------------------------- hemophilia 75 2 -1.868949 Outliers: 2 [1] 11 36 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: AHFactivity AHFantigen -0.2342 -0.0333 Robust Estimate of Covariance: AHFactivity AHFantigen AHFactivity 0.0309 0.0122 AHFantigen 0.0122 0.0231 -------------------------------------------------------- fish 159 6 1.285876 Outliers: 20 [1] 61 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 [20] 142 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: Weight Length1 Length2 Length3 Height Width 352.7 24.3 26.4 29.2 29.7 14.6 Robust Estimate of Covariance: Weight Length1 Length2 Length3 Height Width Weight 1.20e+05 2.89e+03 3.12e+03 3.51e+03 1.49e+03 2.83e+02 Length1 2.89e+03 7.73e+01 8.35e+01 9.28e+01 3.73e+01 9.26e+00 Length2 3.12e+03 8.35e+01 9.04e+01 1.01e+02 4.16e+01 1.01e+01 Length3 3.51e+03 9.28e+01 1.01e+02 1.14e+02 5.37e+01 1.01e+01 Height 1.49e+03 3.73e+01 4.16e+01 5.37e+01 6.75e+01 3.22e+00 Width 2.83e+02 9.26e+00 1.01e+01 1.01e+01 3.22e+00 4.18e+00 -------------------------------------------------------- airquality 153 4 2.684374 Outliers: 6 [1] 7 14 23 30 34 77 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: Ozone Solar.R Wind Temp 40.35 186.21 9.86 78.09 Robust Estimate of Covariance: Ozone Solar.R Wind Temp Ozone 951.0 959.9 -62.5 224.6 Solar.R 959.9 8629.9 -28.1 244.9 Wind -62.5 -28.1 11.6 -15.8 Temp 224.6 244.9 -15.8 93.1 -------------------------------------------------------- attitude 30 7 2.091968 Outliers: 4 [1] 14 16 18 24 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: rating complaints privileges learning raises critical 65.0 66.5 52.4 56.2 65.3 75.6 advance 42.7 Robust Estimate of Covariance: rating complaints privileges learning raises critical advance rating 143.5 123.4 62.4 92.5 79.2 17.7 28.2 complaints 123.4 159.8 83.9 99.7 96.0 27.3 44.0 privileges 62.4 83.9 133.5 78.6 62.0 13.4 46.4 learning 92.5 99.7 78.6 136.0 90.9 18.9 62.6 raises 79.2 96.0 62.0 90.9 107.6 34.6 63.3 critical 17.7 27.3 13.4 18.9 34.6 84.9 25.9 advance 28.2 44.0 46.4 62.6 63.3 25.9 94.4 -------------------------------------------------------- attenu 182 5 1.148032 Outliers: 21 [1] 2 7 8 9 10 11 15 16 24 25 28 29 30 31 32 64 65 94 95 [20] 96 100 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: event mag station dist accel 15.36 5.95 58.11 33.56 0.14 Robust Estimate of Covariance: event mag station dist accel event 4.88e+01 -2.74e+00 1.53e+02 -1.14e+02 5.95e-02 mag -2.74e+00 5.32e-01 -6.29e+00 1.10e+01 9.37e-03 station 1.53e+02 -6.29e+00 1.29e+03 -2.95e+02 1.04e+00 dist -1.14e+02 1.10e+01 -2.95e+02 1.13e+03 -2.41e+00 accel 5.95e-02 9.37e-03 1.04e+00 -2.41e+00 1.70e-02 -------------------------------------------------------- USJudgeRatings 43 12 -1.683847 Outliers: 7 [1] 5 7 12 13 14 23 31 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: CONT INTG DMNR DILG CFMG DECI PREP FAMI ORAL WRIT PHYS RTEN 7.45 8.15 7.74 7.87 7.67 7.74 7.65 7.65 7.50 7.57 8.17 7.85 Robust Estimate of Covariance: CONT INTG DMNR DILG CFMG DECI PREP FAMI CONT 0.9403 -0.2500 -0.3953 -0.1418 -0.0176 -0.0620 -0.1304 -0.1517 INTG -0.2500 0.6314 0.8479 0.6889 0.5697 0.5386 0.7007 0.6985 DMNR -0.3953 0.8479 1.2186 0.9027 0.7613 0.7232 0.9191 0.9055 DILG -0.1418 0.6889 0.9027 0.8474 0.7344 0.6949 0.8751 0.8655 CFMG -0.0176 0.5697 0.7613 0.7344 0.6904 0.6442 0.7683 0.7594 DECI -0.0620 0.5386 0.7232 0.6949 0.6442 0.6219 0.7362 0.7360 PREP -0.1304 0.7007 0.9191 0.8751 0.7683 0.7362 0.9370 0.9357 FAMI -0.1517 0.6985 0.9055 0.8655 0.7594 0.7360 0.9357 0.9547 ORAL -0.1866 0.7375 0.9841 0.8816 0.7747 0.7433 0.9400 0.9496 WRIT -0.1881 0.7208 0.9516 0.8711 0.7646 0.7357 0.9302 0.9439 PHYS -0.1407 0.4673 0.6261 0.5661 0.5105 0.5039 0.5996 0.6112 RTEN -0.2494 0.7921 1.0688 0.9167 0.7902 0.7585 0.9533 0.9561 ORAL WRIT PHYS RTEN CONT -0.1866 -0.1881 -0.1407 -0.2494 INTG 0.7375 0.7208 0.4673 0.7921 DMNR 0.9841 0.9516 0.6261 1.0688 DILG 0.8816 0.8711 0.5661 0.9167 CFMG 0.7747 0.7646 0.5105 0.7902 DECI 0.7433 0.7357 0.5039 0.7585 PREP 0.9400 0.9302 0.5996 0.9533 FAMI 0.9496 0.9439 0.6112 0.9561 ORAL 0.9712 0.9558 0.6271 0.9933 WRIT 0.9558 0.9483 0.6135 0.9725 PHYS 0.6271 0.6135 0.4816 0.6549 RTEN 0.9933 0.9725 0.6549 1.0540 -------------------------------------------------------- USArrests 50 4 2.411726 Outliers: 3 [1] 2 33 39 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: Murder Assault UrbanPop Rape 7.52 163.86 65.66 20.64 Robust Estimate of Covariance: Murder Assault UrbanPop Rape Murder 19.05 295.96 8.32 23.40 Assault 295.96 6905.03 396.53 523.49 UrbanPop 8.32 396.53 202.98 62.81 Rape 23.40 523.49 62.81 79.10 -------------------------------------------------------- longley 16 7 1.038316 Outliers: 5 [1] 1 2 3 4 5 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: GNP.deflator GNP Unemployed Armed.Forces Population 107.5 440.4 339.4 293.0 120.9 Year Employed 1957.0 67.2 Robust Estimate of Covariance: GNP.deflator GNP Unemployed Armed.Forces Population GNP.deflator 100.4 953.8 1140.8 -501.8 74.3 GNP 953.8 9434.3 10084.3 -4573.8 731.3 Unemployed 1140.8 10084.3 19644.6 -6296.3 848.4 Armed.Forces -501.8 -4573.8 -6296.3 3192.3 -348.5 Population 74.3 731.3 848.4 -348.5 57.7 Year 46.3 450.7 537.0 -230.7 35.3 Employed 30.8 310.2 273.8 -159.4 23.3 Year Employed GNP.deflator 46.3 30.8 GNP 450.7 310.2 Unemployed 537.0 273.8 Armed.Forces -230.7 -159.4 Population 35.3 23.3 Year 21.9 14.6 Employed 14.6 11.2 -------------------------------------------------------- Loblolly 84 3 1.481317 Outliers: 0 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: height age Seed 31.93 12.79 7.48 Robust Estimate of Covariance: height age Seed height 440.644 165.652 6.958 age 165.652 63.500 0.681 Seed 6.958 0.681 16.564 -------------------------------------------------------- quakes 1000 4 1.576855 Outliers: 218 [1] 7 12 15 17 22 27 32 37 40 41 45 48 53 63 64 [16] 73 78 87 91 92 94 99 108 110 117 118 119 120 121 122 [31] 126 133 136 141 143 145 148 152 154 155 157 159 160 163 170 [46] 192 205 222 226 230 239 243 250 251 252 254 258 263 267 268 [61] 271 283 292 300 301 305 311 312 318 320 321 325 328 330 334 [76] 352 357 360 365 381 382 384 389 400 402 408 413 416 417 419 [91] 429 437 441 443 453 456 467 474 477 490 492 496 504 507 508 [106] 509 517 524 527 528 531 532 534 536 538 539 541 542 543 544 [121] 545 546 547 552 553 560 571 581 583 587 593 594 596 597 605 [136] 612 613 618 620 625 629 638 642 647 649 653 655 656 672 675 [151] 681 686 699 701 702 712 714 716 721 725 726 735 744 754 756 [166] 759 765 766 769 779 781 782 785 787 797 804 813 825 827 837 [181] 840 844 852 853 857 860 865 866 869 870 872 873 883 884 887 [196] 888 890 891 893 908 909 912 915 916 921 927 930 962 963 969 [211] 974 980 982 986 987 988 997 1000 ------------- Call: CovMMest(x = x) -> Method: MM-estimates Robust Estimate of Location: lat long depth mag -21.74 182.37 356.37 4.56 Robust Estimate of Covariance: lat long depth mag lat 2.97e+01 6.53e+00 3.46e+02 -4.66e-01 long 6.53e+00 6.92e+00 -5.05e+02 5.62e-02 depth 3.46e+02 -5.05e+02 7.39e+04 -2.51e+01 mag -4.66e-01 5.62e-02 -2.51e+01 2.32e-01 -------------------------------------------------------- =================================================== > ##dogen() > ##cat('Time elapsed: ', proc.time(),'\n') # for ``statistical reasons'' > > proc.time() user system elapsed 24.41 0.71 25.36 rrcov/tests/thubert.Rout.save0000644000176200001440000041250514177772636016067 0ustar liggesusers R Under development (unstable) (2021-10-11 r81035) -- "Unsuffered Consequences" Copyright (C) 2021 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (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. > dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, + method=c("hubert", "hubert.mcd", "locantore", "cov", "classic", + "grid", "proj")) + { + ## Test the PcaXxx() functions on the literature datasets: + ## + ## Call PcaHubert() and the other functions for all regression + ## data sets available in robustbase/rrcov and print: + ## - execution time (if time == TRUE) + ## - loadings + ## - eigenvalues + ## - scores + ## + + dopca <- function(x, xname, nrep=1){ + + n <- dim(x)[1] + p <- dim(x)[2] + if(method == "hubert.mcd") + pca <- PcaHubert(x, k=p) + else if(method == "hubert") + pca <- PcaHubert(x, mcd=FALSE) + else if(method == "locantore") + pca <- PcaLocantore(x) + else if(method == "cov") + pca <- PcaCov(x) + else if(method == "classic") + pca <- PcaClassic(x) + else if(method == "grid") + pca <- PcaGrid(x) + else if(method == "proj") + pca <- PcaProj(x) + else + stop("Undefined PCA method: ", method) + + + e1 <- getEigenvalues(pca)[1] + e2 <- getEigenvalues(pca)[2] + k <- pca@k + + if(time){ + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + xres <- sprintf("%3d %3d %3d %12.6f %12.6f %10.3f\n", dim(x)[1], dim(x)[2], k, e1, e2, xtime) + } + else{ + xres <- sprintf("%3d %3d %3d %12.6f %12.6f\n", dim(x)[1], dim(x)[2], k, e1, e2) + } + lpad<-lname-nchar(xname) + cat(pad.right(xname, lpad), xres) + + if(!short){ + cat("Scores: \n") + print(getScores(pca)) + + if(full){ + cat("-------------\n") + show(pca) + } + cat("----------------------------------------------------------\n") + } + } + + stopifnot(length(nrep) == 1, nrep >= 1) + method <- match.arg(method) + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + lname <- 20 + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + + data(Animals, package = "MASS") + brain <- Animals[c(1:24, 26:25, 27:28),] + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + + cat("Data Set n p k e1 e2\n") + cat("==========================================================\n") + dopca(heart[, 1:2], data(heart), nrep) + dopca(starsCYG, data(starsCYG), nrep) + dopca(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) + dopca(stack.x, data(stackloss), nrep) + ## dopca(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) # differences between the architectures + dopca(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) + ## dopca(data.matrix(subset(wood, select = -y)), data(wood), nrep) # differences between the architectures + dopca(data.matrix(subset(hbk, select = -Y)),data(hbk), nrep) + + ## dopca(brain, "Animals", nrep) + dopca(milk, data(milk), nrep) + dopca(bushfire, data(bushfire), nrep) + cat("==========================================================\n") + } > > dogen <- function(nrep=1, eps=0.49, method=c("hubert", "hubert.mcd", "locantore", "cov")){ + + dopca <- function(x, nrep=1){ + gc() + xtime <- system.time(dorep(x, nrep, method))[1]/nrep + cat(sprintf("%6d %3d %10.2f\n", dim(x)[1], dim(x)[2], xtime)) + xtime + } + + set.seed(1234) + + ## VT::15.09.2013 - this will render the output independent + ## from the version of the package + suppressPackageStartupMessages(library(rrcov)) + library(MASS) + + method <- match.arg(method) + + ap <- c(2, 5, 10, 20, 30) + an <- c(100, 500, 1000, 10000, 50000) + + tottime <- 0 + cat(" n p Time\n") + cat("=====================\n") + for(i in 1:length(an)) { + for(j in 1:length(ap)) { + n <- an[i] + p <- ap[j] + if(5*p <= n){ + xx <- gendata(n, p, eps) + X <- xx$X + ## print(dimnames(X)) + tottime <- tottime + dopca(X, nrep) + } + } + } + + cat("=====================\n") + cat("Total time: ", tottime*nrep, "\n") + } > > dorep <- function(x, nrep=1, method=c("hubert", "hubert.mcd", "locantore", "cov")){ + + method <- match.arg(method) + for(i in 1:nrep) + if(method == "hubert.mcd") + PcaHubert(x) + else if(method == "hubert") + PcaHubert(x, mcd=FALSE) + else if(method == "locantore") + PcaLocantore(x) + else if(method == "cov") + PcaCov(x) + else + stop("Undefined PCA method: ", method) + } > > #### gendata() #### > # Generates a location contaminated multivariate > # normal sample of n observations in p dimensions > # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) > # where > # m = (b,b,...,b) > # Defaults: eps=0 and b=10 > # > gendata <- function(n,p,eps=0,b=10){ + + if(missing(n) || missing(p)) + stop("Please specify (n,p)") + if(eps < 0 || eps >= 0.5) + stop(message="eps must be in [0,0.5)") + X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) + nbad <- as.integer(eps * n) + xind <- vector("numeric") + if(nbad > 0){ + Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) + xind <- sample(n,nbad) + X[xind,] <- Xbad + } + list(X=X, xind=xind) + } > > pad.right <- function(z, pads) + { + ### Pads spaces to right of text + padding <- paste(rep(" ", pads), collapse = "") + paste(z, padding, sep = "") + } > > whatis <- function(x){ + if(is.data.frame(x)) + cat("Type: data.frame\n") + else if(is.matrix(x)) + cat("Type: matrix\n") + else if(is.vector(x)) + cat("Type: vector\n") + else + cat("Type: don't know\n") + } > > ################################################################# > ## VT::27.08.2010 > ## bug report from Stephen Milborrow > ## > test.case.1 <- function() + { + X <- matrix(c( + -0.79984, -1.00103, 0.899794, 0.00000, + 0.34279, 0.52832, -1.303783, -1.17670, + -0.79984, -1.00103, 0.899794, 0.00000, + 0.34279, 0.52832, -1.303783, -1.17670, + 0.34279, 0.52832, -1.303783, -1.17670, + 1.48542, 0.66735, 0.716162, 1.17670, + -0.79984, -1.00103, 0.899794, 0.00000, + 1.69317, 1.91864, -0.018363, 1.76505, + -1.00759, -0.16684, -0.385626, 0.58835, + -0.79984, -1.00103, 0.899794, 0.00000), ncol=4, byrow=TRUE) + + cc1 <- PcaHubert(X, k=3) + + cc2 <- PcaLocantore(X, k=3) + cc3 <- PcaCov(X, k=3, cov.control=CovControlSest()) + + cc4 <- PcaProj(X, k=2) # with k=3 will produce warnings in .distances - too small eignevalues + cc5 <- PcaGrid(X, k=2) # dito + + list(cc1, cc2, cc3, cc4, cc5) + } > > ################################################################# > ## VT::05.08.2016 > ## bug report from Matthieu Lesnoff > ## > test.case.2 <- function() + { + do.test.case.2 <- function(z) + { + if(missing(z)) + { + set.seed(12345678) + n <- 5 + z <- data.frame(v1 = rnorm(n), v2 = rnorm(n), v3 = rnorm(n)) + z + } + + fm <- PcaLocantore(z, k = 2, scale = TRUE) + fm@scale + apply(z, MARGIN = 2, FUN = mad) + scale(z, center = fm@center, scale = fm@scale) + + T <- fm@scores + P <- fm@loadings + E <- scale(z, center = fm@center, scale = fm@scale) - T %*% t(P) + d2 <- apply(E^2, MARGIN = 1, FUN = sum) + ## print(sqrt(d2)); print(fm@od) + print(ret <- all.equal(sqrt(d2), fm@od)) + + ret + } + do.test.case.2() + do.test.case.2(phosphor) + do.test.case.2(stackloss) + do.test.case.2(salinity) + do.test.case.2(hbk) + do.test.case.2(milk) + do.test.case.2(bushfire) + data(rice); do.test.case.2(rice) + data(un86); do.test.case.2(un86) + } > > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > > dodata(method="classic") Call: dodata(method = "classic") Data Set n p k e1 e2 ========================================================== heart 12 2 2 812.379735 9.084962 Scores: PC1 PC2 1 2.7072 1.46576 2 59.9990 -1.43041 3 -3.5619 -1.54067 4 -7.7696 2.52687 5 14.7660 -0.95822 6 -20.0489 6.91079 7 1.4189 2.25961 8 -34.3308 -4.23717 9 -6.0487 -0.97859 10 -33.0102 -3.73143 11 -18.6372 0.25821 12 44.5163 -0.54476 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 28.5023 3.0141 ---------------------------------------------------------- starsCYG 47 2 2 0.331279 0.079625 Scores: PC1 PC2 1 0.2072999 0.089973 2 0.6855999 0.349644 3 -0.0743007 -0.061028 4 0.6855999 0.349644 5 0.1775161 0.015053 6 0.4223986 0.211351 7 -0.2926077 -0.516156 8 0.2188453 0.293607 9 0.5593696 0.028761 10 0.0983878 0.074540 11 0.8258140 -0.711176 12 0.4167063 0.180244 13 0.3799883 0.225541 14 -0.9105236 -0.432014 15 -0.7418831 -0.125322 16 -0.4432862 0.048287 17 -1.0503005 -0.229623 18 -0.8393302 -0.007831 19 -0.8126742 -0.195952 20 0.9842316 -0.688729 21 -0.6230699 -0.108486 22 -0.7814875 -0.130933 23 -0.6017038 0.025840 24 -0.1857772 0.155474 25 -0.0020261 0.070412 26 -0.3640775 0.059510 27 -0.3458392 -0.069204 28 -0.1208393 0.053577 29 -0.6033482 -0.176391 30 1.1440521 -0.676183 31 -0.5960920 -0.013765 32 0.0519296 0.259855 33 0.1861752 0.167779 34 1.3802755 -0.632611 35 -0.6542566 -0.173505 36 0.5583690 0.392215 37 0.0561384 0.230152 38 0.1861752 0.167779 39 0.1353472 0.241376 40 0.5355195 0.197080 41 -0.3980701 0.014294 42 0.0277576 0.145332 43 0.2979736 0.234120 44 0.3049884 0.184614 45 0.4889809 0.311684 46 -0.0514512 0.134108 47 -0.5224950 0.037063 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 0.57557 0.28218 ---------------------------------------------------------- phosphor 18 2 2 220.403422 68.346121 Scores: PC1 PC2 1 4.04290 -15.3459 2 -22.30489 -1.0004 3 -24.52683 3.2836 4 -12.54839 -6.0848 5 -19.37044 2.2979 6 15.20366 -19.9424 7 0.44222 -3.1379 8 -10.64042 3.6933 9 -11.67967 5.9670 10 14.26805 -7.0221 11 -4.98832 1.5268 12 8.74986 7.9379 13 12.26290 6.0251 14 6.27607 7.5768 15 17.53246 3.1560 16 -10.17024 -5.8994 17 21.05826 5.4492 18 16.39281 11.5191 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 14.8460 8.2672 ---------------------------------------------------------- stackloss 21 3 3 99.576089 19.581136 Scores: PC1 PC2 PC3 1 20.15352 -4.359452 0.324585 2 19.81554 -5.300468 0.308294 3 15.45222 -1.599136 -0.203125 4 2.40370 -0.145282 2.370302 5 1.89538 0.070566 0.448061 6 2.14954 -0.037358 1.409182 7 4.43153 5.500810 2.468051 8 4.43153 5.500810 2.468051 9 -1.47521 1.245404 2.511773 10 -5.11183 -4.802083 -2.407870 11 -2.07009 3.667055 -2.261247 12 -2.66223 2.833964 -3.238659 13 -4.43589 -2.920053 -2.375287 14 -0.46404 7.323193 -1.234961 15 -9.31959 6.232579 -0.056064 16 -10.33350 3.409533 -0.104938 17 -14.81094 -9.872607 0.628103 18 -12.44514 -3.285499 0.742143 19 -11.85300 -2.452408 1.719555 20 -5.73994 -2.494520 0.098250 21 9.98843 1.484952 -3.614198 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 9.9788 4.4251 1.8986 ---------------------------------------------------------- salinity 28 3 3 11.410736 7.075409 Scores: PC1 PC2 PC3 1 -0.937789 -2.40535 0.812909 2 -1.752631 -2.57774 2.004437 3 -6.509364 -0.78762 -1.821906 4 -5.619847 -2.41333 -1.586891 5 -7.268242 1.61012 1.563568 6 -4.316558 -3.20411 0.029376 7 -2.379545 -3.32371 0.703101 8 0.013514 -3.50586 1.260502 9 0.265262 -0.16736 -2.886883 10 1.890755 2.43623 -0.986832 11 0.804196 2.56656 0.387577 12 0.935082 -1.03559 -0.074081 13 1.814839 -1.61087 0.612290 14 3.407535 -0.15880 2.026088 15 1.731273 2.95159 -1.840286 16 -6.129708 7.21368 2.632273 17 -0.645124 1.06260 0.028697 18 -1.307532 -2.54679 -0.280273 19 0.483455 -0.55896 -3.097281 20 2.053267 0.47308 -1.858703 21 3.277664 -1.31002 0.453753 22 4.631644 -0.78005 1.519894 23 1.864403 5.32790 -0.849694 24 0.623899 4.29317 0.056461 25 1.301696 0.37871 -0.646220 26 2.852126 -0.79527 -0.347711 27 4.134051 -0.92756 0.449222 28 4.781679 -0.20467 1.736616 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 3.3780 2.6600 1.4836 ---------------------------------------------------------- hbk 75 3 3 216.162129 1.981077 Scores: PC1 PC2 PC3 1 26.2072 -0.660756 0.503340 2 27.0406 -0.108506 -0.225059 3 28.8351 -1.683721 0.263078 4 29.9221 -0.812174 -0.674480 5 29.3181 -0.909915 -0.121600 6 27.5360 -0.599697 0.916574 7 27.6617 -0.073753 0.676620 8 26.5576 -0.882312 0.159620 9 28.8726 -1.074223 -0.673462 10 27.6643 -1.463829 -0.868593 11 34.2019 -0.664473 -0.567265 12 35.4805 -2.730949 -0.259320 13 34.7544 1.325449 0.749884 14 38.9522 8.171389 0.034382 15 -5.5375 0.390704 1.679172 16 -7.4319 0.803850 1.925633 17 -8.5880 0.957577 -1.010312 18 -6.6022 -0.425109 0.625148 19 -6.5596 1.154721 -0.640680 20 -5.2525 0.812527 1.377832 21 -6.2771 0.067747 0.958907 22 -6.2501 1.325491 -1.104428 23 -7.2419 0.839808 0.728712 24 -7.6489 1.131606 0.154897 25 -9.0763 -0.670721 -0.167577 26 -5.5967 0.999411 -0.810000 27 -5.1460 -0.339018 1.326712 28 -7.1659 -0.993461 0.125933 29 -8.2104 -0.169338 -0.073569 30 -6.2499 -1.689222 -0.877481 31 -7.3180 -0.225795 1.687204 32 -7.9446 1.473868 -0.541790 33 -6.3604 1.237472 0.061800 34 -8.9812 -0.710662 -0.830422 35 -5.1698 -0.435484 1.102817 36 -5.9995 -0.058135 -0.713550 37 -5.8753 0.852882 -1.610556 38 -8.4501 0.334363 0.404813 39 -8.1751 -1.300317 0.633282 40 -7.4495 0.672712 -0.829815 41 -5.6213 -1.106765 1.395315 42 -6.8571 -0.900977 -1.509937 43 -7.0633 1.987372 -1.079934 44 -6.3763 -1.867647 -0.251224 45 -8.6456 -0.866053 0.630132 46 -6.5356 -1.763526 -0.189838 47 -8.2224 -1.183284 1.615150 48 -5.6136 -1.100704 1.079239 49 -5.9907 0.220336 1.443387 50 -5.2675 0.142923 0.194023 51 -7.9324 0.324710 1.113289 52 -7.5544 -1.033884 1.792496 53 -6.7119 -1.712257 -1.711778 54 -7.4679 1.856542 0.046658 55 -7.4666 1.161504 -0.725948 56 -6.7110 1.574868 0.534288 57 -8.2571 -0.399824 0.521995 58 -5.9781 1.312567 0.926790 59 -5.6960 -0.394338 -0.332938 60 -6.1017 -0.797579 -1.679359 61 -5.2628 0.919128 -1.436156 62 -9.1245 -0.516135 -0.229065 63 -7.7140 1.659145 0.068510 64 -4.9886 0.173613 0.865810 65 -6.6157 -1.479786 0.098390 66 -7.9511 0.772770 -0.998321 67 -7.1856 0.459602 0.216588 68 -8.7345 -0.860784 -1.238576 69 -8.5833 -0.313481 0.832074 70 -5.8642 -0.142883 -0.870064 71 -5.8879 0.186456 0.464467 72 -7.1865 0.497156 -0.826767 73 -6.8671 -0.058606 -1.335842 74 -7.1398 0.727642 -1.422331 75 -7.2696 -1.347832 -1.496927 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 14.70245 1.40751 0.95725 ---------------------------------------------------------- milk 86 8 8 15.940298 2.771345 Scores: PC1 PC2 PC3 PC4 PC5 PC6 PC7 1 6.471620 1.031110 0.469432 0.5736412 1.0294362 -0.6054039 -0.2005117 2 7.439545 0.320597 0.081922 -0.6305898 0.7128977 -1.1601053 -0.1170582 3 1.240654 -1.840458 0.520870 -0.1717469 0.2752079 -0.3815506 0.6004089 4 5.952685 -1.856375 1.638710 0.3358626 -0.5834205 -0.0665348 -0.1580799 5 -0.706973 0.261795 0.423736 0.2916399 -0.5307716 -0.3325563 -0.0062349 6 2.524050 0.293380 -0.572997 0.2466367 -0.3497882 0.0386014 -0.1418131 7 3.136085 -0.050202 -0.818165 -0.0451560 -0.5226337 -0.1597194 0.1669050 8 3.260390 0.312365 -0.110776 0.4908006 -0.5225353 -0.1972222 -0.1068433 9 -0.808914 -2.355785 1.344204 -0.4743284 -0.1394914 -0.1390080 -0.2620731 10 -2.511226 -0.995321 -0.087218 -0.5950040 0.4268321 0.2561918 0.0891170 11 -9.204096 -0.598364 1.587275 0.0833647 0.1865626 0.0358228 0.0920394 12 -12.946774 1.951332 -0.179186 0.2560603 0.1300954 -0.1179820 -0.0999494 13 -10.011603 0.726323 -2.102423 -1.3105560 0.3291550 0.0660007 -0.0794410 14 -11.983644 0.768224 -0.532227 -0.5161201 -0.0817164 -0.4358934 -0.1734612 15 -10.465714 -0.704271 2.035437 0.3713778 -0.0564830 -0.2696432 -0.1940091 16 -2.527619 -0.286939 0.354497 0.8571223 0.1585009 0.2272835 0.4386955 17 -0.514527 -2.895087 1.657181 0.2208239 0.1961109 0.1280496 -0.0182491 18 -1.763931 0.854269 -0.686282 0.2848209 -0.4813608 -0.2623962 0.4757030 19 -1.538419 -0.866477 1.103818 0.3874507 0.2086661 0.1267277 0.2354264 20 0.732842 -1.455594 1.097358 -0.2530588 -0.0302385 0.2654274 0.6093330 21 -2.530155 1.932885 -0.873095 0.6202295 -0.4153607 0.0048383 0.0067484 22 -0.772646 0.675846 -0.259539 0.4844670 -0.0893266 -0.2785557 -0.0424662 23 0.185417 1.413719 0.066135 1.1014470 0.0468093 0.0288637 0.2539994 24 -0.280536 0.908864 0.113221 1.3370381 0.3289929 0.2588134 -0.0356289 25 -3.503626 1.971233 0.203620 1.1975494 -0.3175317 0.1149685 0.0584396 26 -0.639313 1.175503 0.403906 0.9082134 -0.2648165 -0.1238813 -0.0174853 27 -2.923327 -0.365168 0.149478 0.8201430 -0.1544609 -0.4856934 -0.0058424 28 2.505633 3.050292 -0.554424 2.1416405 -0.0378764 0.1002280 -0.3888580 29 4.649504 1.054863 -0.081018 1.1454466 0.1502080 0.4967323 0.0879775 30 1.049282 1.355215 -0.142701 0.7805566 -0.2059790 0.0193142 0.0815524 31 1.962583 1.595396 -2.050642 0.3556747 0.1384801 0.1197984 0.1608247 32 1.554846 0.095644 -1.423054 -0.3175620 0.4260008 -0.1612463 -0.0567196 33 2.248977 0.010348 -0.062469 0.6388269 0.2098648 0.1330250 0.0906704 34 0.993109 -0.828812 0.284059 0.3446686 0.1899096 -0.0515571 -0.2281197 35 -0.335103 1.614093 -0.920661 1.2502617 0.2435013 0.1264875 0.0469238 36 4.346795 1.208134 0.368889 1.1429977 -0.1362052 -0.0158169 -0.0183852 37 0.992634 2.013738 -1.350619 0.8714694 0.0057776 -0.2122691 0.1760918 38 2.213341 1.706516 -0.705418 1.2670281 -0.0707149 0.0670467 -0.1863588 39 -1.213255 0.644062 0.163988 1.1213961 0.2945355 0.1093574 0.0019574 40 3.942604 -1.704266 0.660327 0.1618506 0.4259076 0.0070193 0.3462765 41 4.262054 1.687193 0.351875 0.5396477 1.0052810 -0.9331689 0.0056063 42 6.865198 -1.091248 1.153585 1.1248797 0.0873276 0.2565221 0.0333265 43 3.476720 0.555449 -1.030771 -0.3015720 -0.1748109 -0.1584968 0.4079902 44 5.691730 -0.141240 0.565189 0.3174238 0.6478440 1.0579977 -0.5387916 45 0.327134 0.152011 -0.394798 0.4998430 0.1599781 0.3159518 0.1623656 46 0.280225 1.569387 -0.100397 1.2800976 0.0446645 0.0946513 0.0461599 47 3.119928 -0.384834 -3.325600 -1.8865310 -0.1334744 0.1249987 -0.2561273 48 0.501542 0.739816 -1.384556 -0.1244721 0.2948958 0.4836170 -0.1182802 49 -1.953218 0.269986 -1.726474 -0.8510637 0.5047958 0.4860651 0.2318735 50 3.706878 -2.400570 1.361047 -0.4949076 0.2180352 0.4080879 0.1156540 51 -1.060358 -0.521609 -1.387412 -1.2767491 -0.0521356 0.1665452 -0.0044412 52 -4.900528 0.157011 -1.015880 -0.9941168 0.2069608 0.3239762 -0.1921715 53 -0.388496 0.062051 -0.643721 -0.8544141 -0.1857141 0.0063293 0.2664606 54 0.109234 -0.018709 -0.242825 -0.2064701 -0.0585165 0.1720867 0.1117397 55 1.176175 0.644539 -0.373694 0.0038605 -0.3436524 0.0194450 -0.0838883 56 0.407259 -0.606637 0.222915 -0.3622451 -0.0737834 0.0228104 0.0297333 57 -1.022756 -0.071860 0.741957 0.2273628 -0.1388444 -0.2396467 -0.2327738 58 0.245419 1.167059 0.225934 0.8318795 -0.5365166 -0.0090816 -0.1680757 59 -1.300617 -1.110325 -0.262740 -0.8857801 -0.0816954 -0.1186886 -0.0928322 60 -1.110561 -0.832357 -0.212713 -0.4754481 -0.4105982 -0.1886992 -0.0602872 61 0.381831 -1.475116 0.601047 -0.6260156 -0.1854501 -0.1749306 -0.0013904 62 2.734462 -1.887861 0.813453 -0.5856987 0.2310656 0.1117041 -0.0293373 63 3.092464 -0.172602 0.017725 0.4874693 -0.5428206 0.0151218 -0.0683340 64 3.092464 -0.172602 0.017725 0.4874693 -0.5428206 0.0151218 -0.0683340 65 0.004744 -2.712679 1.178987 -0.6677199 0.0208119 0.0621903 -0.0655693 66 -2.014851 -1.060090 -0.099959 -0.7225044 -0.1947648 -0.2282902 -0.0505015 67 0.621739 -1.296106 0.255632 -0.3309504 -0.0880200 0.2524306 0.1465779 68 -0.271385 -1.709161 -1.100349 -2.0937671 0.2166264 0.0191278 0.0114174 69 -0.326350 -0.737232 0.021639 -0.3850383 -0.4338287 0.2156624 0.1597594 70 4.187093 9.708082 4.632803 -4.9751240 -0.0881576 0.2392433 0.0568049 71 -1.868507 -1.600166 0.436353 -0.8078214 -0.1530893 0.0479471 -0.1999893 72 2.768081 -0.556824 -0.148923 -0.3197853 -0.5524427 0.0907804 -0.0694488 73 -1.441846 -2.735114 -0.294134 -1.2172969 0.0109453 -0.0562910 0.1505788 74 -10.995490 0.615992 1.950966 1.1687190 0.2798335 0.2713257 0.0652135 75 0.508992 -2.363945 -0.407064 -0.9522316 0.1040307 0.1088110 -0.7368484 76 -1.015714 -0.307662 -1.088162 -1.0181862 -0.0440888 -0.1362208 0.0271200 77 -8.028891 -0.580763 0.933638 0.4619362 0.3379832 -0.1368644 -0.0669441 78 1.763308 -1.336175 -0.127809 -0.7161775 -0.1904861 -0.0900461 0.0037539 79 0.208944 -0.580698 -0.626297 -0.7620610 -0.0262368 -0.2928202 0.0285908 80 -3.230608 1.251352 0.195280 0.8687004 0.1812011 0.2600692 -0.1516375 81 1.498160 0.669731 -0.266114 0.3772866 -0.2769688 -0.1066593 -0.1608395 82 3.232051 -1.776018 0.485524 0.1170945 0.0557260 0.2219872 0.1187681 83 2.999977 -0.228275 -0.467724 -0.4287672 0.0494902 -0.2337809 -0.0718159 84 1.238083 0.320956 -1.806006 -1.0142266 0.2359630 -0.0857149 0.0593938 85 1.276376 -2.081214 2.540850 0.3745805 -0.2596482 -0.1228412 -0.2199985 86 0.930715 0.836457 -1.385153 -0.6074929 -0.2476354 0.1680713 -0.0117324 PC8 1 9.0765e-04 2 2.1811e-04 3 1.1834e-03 4 8.4077e-05 5 9.9209e-04 6 1.6277e-03 7 2.4907e-04 8 6.8383e-04 9 -5.0924e-04 10 3.1215e-04 11 3.0654e-04 12 -1.1951e-03 13 -1.2849e-03 14 -9.0801e-04 15 -1.2686e-03 16 -1.8441e-03 17 -2.1068e-03 18 -5.7816e-04 19 -1.2330e-03 20 3.3857e-05 21 3.8623e-04 22 1.3035e-04 23 -3.8648e-04 24 -1.7400e-04 25 -3.9196e-04 26 -7.6996e-04 27 -4.8042e-04 28 -2.0628e-04 29 -4.5672e-04 30 -1.4716e-04 31 -4.6385e-05 32 -2.0481e-04 33 -3.0020e-04 34 -5.8179e-05 35 1.3870e-04 36 -6.7177e-04 37 -3.0799e-04 38 6.2140e-04 39 4.5912e-04 40 -3.7165e-04 41 -5.4362e-04 42 -1.0155e-03 43 1.3449e-04 44 -5.4761e-04 45 1.0300e-03 46 1.1039e-03 47 -6.4858e-04 48 -7.6886e-05 49 3.2590e-04 50 8.6845e-05 51 4.9423e-04 52 9.2973e-04 53 4.4342e-04 54 4.9888e-04 55 7.2171e-04 56 -3.2133e-05 57 -1.8101e-04 58 -5.4969e-06 59 -8.3841e-04 60 5.9446e-05 61 -6.5683e-05 62 -3.4073e-04 63 -6.5145e-04 64 -6.5145e-04 65 1.4986e-04 66 2.8096e-04 67 -6.5170e-05 68 -1.3775e-04 69 6.8225e-06 70 -1.6290e-04 71 3.9009e-04 72 -1.3981e-04 73 6.2613e-04 74 2.6513e-03 75 3.7088e-04 76 9.9539e-04 77 1.2979e-03 78 5.6500e-04 79 3.0940e-04 80 8.7993e-04 81 -3.1353e-04 82 4.9625e-04 83 -6.3951e-04 84 -4.5582e-04 85 5.9440e-04 86 -3.6234e-04 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 3.99253025 1.66473582 1.10660264 0.96987790 0.33004256 0.29263512 0.20843280 [8] 0.00074024 ---------------------------------------------------------- bushfire 38 5 5 38435.075910 1035.305774 Scores: PC1 PC2 PC3 PC4 PC5 1 -111.9345 4.9970 -1.00881 -1.224361 3.180569 2 -113.4128 7.4784 -0.79170 -0.235184 2.385812 3 -105.8364 10.9615 -3.15662 -0.251662 1.017328 4 -89.1684 8.7232 -6.15080 -0.075611 1.431111 5 -58.7216 -1.9543 -12.70661 -0.151328 1.425570 6 -35.0370 -12.8434 -17.06841 -0.525664 3.499743 7 -250.2123 -49.4348 23.31261 -19.070238 0.647348 8 -292.6877 -69.7708 -21.30815 13.093808 -1.288764 9 -294.0765 -70.9903 -23.96326 14.940985 -0.939076 10 -290.0193 -57.3747 3.51346 1.858995 0.083107 11 -289.8168 -43.3207 16.08046 -1.745099 -1.506042 12 -290.8645 6.2503 40.52173 -7.496479 -0.033767 13 -232.6865 41.8090 37.19429 -1.280348 -0.470837 14 9.8483 25.1954 -14.56970 0.538484 1.772046 15 137.1924 11.8521 -37.12452 -5.130459 -0.586695 16 92.9804 10.3923 -24.97267 -7.551314 -1.867125 17 90.4493 10.5630 -21.92735 -5.669651 -1.001362 18 78.6325 5.2211 -19.74718 -6.107880 -1.939986 19 82.1178 3.6913 -21.37810 -4.259855 -1.278838 20 92.9044 7.1961 -21.22900 -4.125571 -0.127089 21 74.9157 10.2991 -16.60924 -5.660751 -0.406343 22 66.7350 12.0460 -16.73298 -4.669080 1.333436 23 -62.1981 22.7394 6.03613 -5.182356 -0.453624 24 -116.5696 32.3182 12.74846 -1.465657 -0.097851 25 -53.8907 22.4278 -2.18861 -2.742014 -0.990071 26 -60.6384 20.2952 -3.05206 -2.953685 -0.629061 27 -74.7621 28.9067 -0.65817 1.473357 -0.443957 28 -50.2202 37.3457 -1.44989 5.530426 -1.073521 29 -38.7483 50.2749 2.34469 10.156457 -0.416262 30 -93.3887 51.7884 20.08872 8.798781 -1.620216 31 35.3096 41.7158 13.46272 14.464358 -0.475973 32 290.8493 3.5924 7.41501 15.244293 2.141354 33 326.7236 -29.8194 15.64898 2.612061 0.064931 34 322.9095 -30.6372 16.21520 1.248005 -0.711322 35 328.5307 -29.9533 16.49656 1.138916 0.974792 36 325.6791 -30.6990 16.83840 -0.050949 -1.211360 37 323.8136 -30.7474 19.55764 -1.545150 -0.267580 38 325.2991 -30.5350 20.31878 -1.928580 -0.120425 ------------- Call: PcaClassic(x = x) Standard deviations: [1] 196.0487 32.1762 18.4819 6.9412 1.3510 ---------------------------------------------------------- ========================================================== > dodata(method="hubert.mcd") Call: dodata(method = "hubert.mcd") Data Set n p k e1 e2 ========================================================== heart 12 2 2 602.892739 7.727093 Scores: PC1 PC2 1 -12.2285 0.86283 2 -68.9906 -7.43256 3 -5.7035 -1.53793 4 -1.8988 2.90891 5 -24.0044 -2.68946 6 9.9115 8.43321 7 -11.0210 1.77484 8 25.1826 -1.31573 9 -3.2809 -0.74345 10 23.8200 -0.93701 11 9.1344 1.67701 12 -53.6607 -5.08826 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 24.5539 2.7798 ---------------------------------------------------------- starsCYG 47 2 2 0.381108 0.008040 Scores: PC1 PC2 1 -0.285731 -0.0899858 2 -0.819689 0.0153191 3 0.028077 -0.1501882 4 -0.819689 0.0153191 5 -0.234971 -0.1526225 6 -0.527231 -0.0382380 7 0.372118 -0.5195605 8 -0.357448 0.1009508 9 -0.603553 -0.2533541 10 -0.177170 -0.0722541 11 -0.637339 -1.0390758 12 -0.512526 -0.0662337 13 -0.490978 -0.0120517 14 0.936868 -0.2550656 15 0.684479 -0.0125787 16 0.347708 0.0641382 17 1.009966 -0.0202111 18 0.742477 0.1286170 19 0.773105 -0.0588983 20 -0.795247 -1.0648673 21 0.566048 -0.0319223 22 0.723956 -0.0061308 23 0.505616 0.0899297 24 0.069956 0.0896997 25 -0.080090 -0.0462652 26 0.268755 0.0512425 27 0.289710 -0.0770574 28 0.038341 -0.0269216 29 0.567463 -0.1026188 30 -0.951542 -1.1005280 31 0.512064 0.0504528 32 -0.188059 0.1184850 33 -0.288758 -0.0094200 34 -1.190016 -1.1293460 35 0.615197 -0.0846898 36 -0.710930 0.0938781 37 -0.183223 0.0888774 38 -0.288758 -0.0094200 39 -0.262177 0.0759816 40 -0.630957 -0.0855773 41 0.314679 0.0182135 42 -0.130850 0.0163715 43 -0.415248 0.0205825 44 -0.407188 -0.0287636 45 -0.620693 0.0376892 46 -0.051896 0.0292672 47 0.426662 0.0770340 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 0.617339 0.089666 ---------------------------------------------------------- phosphor 18 2 2 356.981009 40.133815 Scores: PC1 PC2 1 -2.89681 -18.08811 2 21.34021 -0.40854 3 22.98065 4.13006 4 12.33544 -6.72947 5 17.99823 2.47611 6 -13.35773 -24.10967 7 -0.92957 -5.51314 8 9.16061 2.71354 9 9.89243 5.10403 10 -14.12600 -11.17832 11 3.84175 -0.17605 12 -10.61905 4.37646 13 -13.85065 2.01919 14 -8.11927 4.34325 15 -18.69805 -1.51673 16 9.95352 -6.85784 17 -22.49433 0.29387 18 -18.66592 6.92359 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 18.8939 6.3351 ---------------------------------------------------------- stackloss 21 3 3 90.759236 22.197591 Scores: PC1 PC2 PC3 1 -20.323997 10.26124 0.92041 2 -19.761418 11.08797 0.92383 3 -16.469919 6.43190 0.22593 4 -4.171902 1.68262 2.50695 5 -3.756174 1.40774 0.57004 6 -3.964038 1.54518 1.53850 7 -7.547376 -3.27780 2.48643 8 -7.547376 -3.27780 2.48643 9 -0.763294 -0.63699 2.53518 10 4.214079 4.46296 -2.28315 11 -0.849132 -2.97767 -2.31393 12 -0.078689 -2.28838 -3.27896 13 3.088921 2.80948 -2.28999 14 -3.307313 -6.14718 -1.35916 15 5.552354 -7.34201 -0.32057 16 7.240091 -4.86180 -0.31031 17 14.908334 6.84995 0.70603 18 10.970281 1.06279 0.68209 19 10.199838 0.37350 1.64712 20 4.273564 1.99328 0.14526 21 -11.992249 2.19025 -3.37391 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 9.5268 4.7114 2.3614 ---------------------------------------------------------- salinity 28 3 3 14.598180 5.145994 Scores: PC1 PC2 PC3 1 1.68712 1.62591 0.19812128 2 2.35772 2.37290 1.24965734 3 6.80132 -2.14412 0.68142276 4 6.41982 -0.61348 -0.31907921 5 6.36697 -1.98030 4.87319903 6 5.22050 1.20864 0.10252555 7 3.34007 2.02950 0.00064329 8 1.06220 2.89801 -0.35658064 9 0.34692 -2.20572 -1.71677710 10 -2.21421 -2.74842 0.76862599 11 -1.40111 -2.16163 2.21124383 12 -0.38242 0.32284 -0.23732191 13 -1.12809 1.33152 -0.28800043 14 -3.24998 1.35943 1.17514969 15 -2.11006 -3.70114 0.45102357 16 3.46920 -5.41242 8.56937909 17 0.46682 -1.46753 1.48992481 18 2.21807 0.99168 -0.61894625 19 0.28525 -2.00333 -2.16450483 20 -1.66639 -1.76768 -1.06946404 21 -2.58106 1.23534 -0.65557612 22 -4.15573 1.71244 0.08170141 23 -3.07670 -4.87628 2.53200755 24 -1.70808 -3.71657 2.99305849 25 -1.08172 -1.05713 0.02468813 26 -2.23187 0.27323 -0.85760867 27 -3.50498 1.07657 -0.68503455 28 -4.49819 1.43219 0.53416609 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 3.8208 2.2685 1.2048 ---------------------------------------------------------- hbk 75 3 3 1.966655 1.617943 Scores: PC1 PC2 PC3 1 -31.105415 4.714217 10.4566165 2 -31.707650 5.748724 10.7682402 3 -33.366131 4.625897 12.1570167 4 -34.173377 6.069657 12.4466895 5 -33.780418 5.508823 11.9872893 6 -32.493478 4.684595 10.5679819 7 -32.592637 5.235522 10.3765493 8 -31.293363 4.865797 10.9379676 9 -33.160964 5.714260 12.3098920 10 -31.919786 5.384537 12.3374332 11 -38.231962 6.810641 13.5994385 12 -39.290479 5.393906 15.2942554 13 -39.418445 7.326461 11.5194898 14 -43.906584 13.214819 8.3282743 15 -1.906326 -0.716061 -0.8635112 16 -0.263255 -0.926016 -1.9009292 17 1.776489 1.072332 -0.5496140 18 -0.464648 -0.702441 0.0482897 19 -0.267826 1.283779 -0.2925812 20 -2.122108 -0.165970 -0.8924686 21 -0.937217 -0.548532 -0.4132196 22 -0.423273 1.781869 -0.0323061 23 -0.047532 -0.018909 -1.1259327 24 0.490041 0.520202 -1.1065753 25 2.143049 -0.720869 -0.0495474 26 -1.094748 1.459175 0.2226246 27 -2.070705 -0.898573 0.0023229 28 0.294998 -0.830258 0.5929001 29 1.242995 -0.300216 -0.2010507 30 -0.147958 -0.439099 2.0003038 31 -0.170818 -1.440946 -0.9755627 32 0.958531 1.199730 -1.0129867 33 -0.697307 0.874343 -0.7260649 34 2.278946 -0.261106 0.4196544 35 -1.962829 -0.809318 0.2033113 36 -0.626631 0.600666 0.8004036 37 -0.550885 1.881448 0.7382776 38 1.249717 -0.336214 -0.9349845 39 1.106696 -1.569418 0.1869576 40 0.684034 0.939963 -0.1034965 41 -1.559314 -1.551408 0.3660323 42 0.538741 0.447358 1.6361099 43 0.252685 2.080564 -0.7765259 44 -0.217012 -1.027281 1.7015154 45 1.497600 -1.349234 -0.2698932 46 -0.100388 -1.026443 1.5390401 47 0.811117 -2.195271 -0.5208141 48 -1.462210 -1.321318 0.5600144 49 -1.383976 -0.740714 -0.7348906 50 -1.636773 0.215464 0.3195369 51 0.530918 -0.759743 -1.2069247 52 0.109566 -2.107455 -0.5315473 53 0.564334 0.060847 2.3910630 54 0.272234 1.122711 -1.5060028 55 0.608660 1.197219 -0.5255609 56 -0.565430 0.710345 -1.3708230 57 1.115629 -0.888816 -0.4186014 58 -1.351288 0.374815 -1.1980618 59 -0.998016 0.151228 0.9007970 60 -0.124017 0.764846 1.9005963 61 -1.189858 1.905264 0.7721322 62 2.190589 -0.579614 -0.1377914 63 0.518278 0.931130 -1.4534768 64 -2.124566 -0.194391 -0.0327092 65 -0.154218 -1.050861 1.1309885 66 1.197852 1.044147 -0.2265269 67 0.114174 0.094763 -0.5168926 68 2.201115 -0.032271 0.8573493 69 1.307843 -1.104815 -0.7741270 70 -0.691449 0.676665 1.0004603 71 -1.150975 -0.050861 -0.0717068 72 0.457293 0.861871 0.1026350 73 0.392258 0.897451 0.9178065 74 0.584658 1.450471 0.3201857 75 0.972517 0.063777 1.8223995 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 1.4024 1.2720 1.1801 ---------------------------------------------------------- milk 86 8 8 6.897629 2.890481 Scores: PC1 PC2 PC3 PC4 PC5 PC6 PC7 1 -5.710924 -1.346213 0.01332091 -0.3709242 -0.566813 0.7529298 -1.2525433 2 -6.578612 -0.440749 1.16354746 0.2870685 -0.573207 0.7368064 -1.6101427 3 -0.720902 1.777381 -0.21532020 -0.3213950 0.287603 -0.4764464 -0.5638337 4 -5.545889 1.621147 -0.85212883 0.4380154 0.022241 0.0718035 0.1176140 5 1.323210 -0.143897 -0.78611461 0.5966857 0.043139 -0.0512545 -0.1419726 6 -1.760792 -0.662792 0.46402240 0.2149752 0.130000 0.0797221 0.1916948 7 -2.344198 -0.363657 0.92442296 0.3921371 0.241463 -0.2370967 0.0636268 8 -2.556824 -0.680132 0.04339934 0.4635077 0.154136 0.0371259 0.0260340 9 1.203234 2.712342 -1.00693092 0.1251739 0.170679 0.2231851 -0.0118196 10 3.151858 1.255826 -0.01678562 -0.5087398 -0.087933 0.0115055 -0.0097828 11 9.562891 1.580419 -2.65612113 -0.1748178 -0.153031 -0.0880112 -0.1648752 12 13.617821 -0.999033 -1.92168237 0.0326918 -0.038488 0.0870082 -0.1809687 13 10.958032 -0.097916 0.95915085 -0.2348663 0.147875 0.1219202 0.0419067 14 12.675941 0.158747 -1.04153243 0.3117402 0.302036 0.1187749 -0.2310830 15 10.726828 1.775339 -3.36786799 0.1285422 0.151594 0.0998947 -0.2028458 16 3.042705 0.212589 -1.23921907 -0.5596596 0.277061 -0.5037073 0.0612182 17 0.780071 2.990008 -1.58490147 -0.5441119 0.436485 -0.0603833 0.1016610 18 2.523916 -0.923373 -0.03221722 0.3830822 0.208008 -0.5505270 -0.1252648 19 1.990563 1.062648 -1.42038451 -0.3602257 -0.068006 -0.1932744 -0.1197842 20 -0.243938 1.674555 -0.72225359 -0.1475652 -0.397855 -0.5385123 -0.0559660 21 3.354424 -2.001060 -0.22542149 0.3346180 0.032502 -0.0953825 0.1293148 22 1.477177 -0.777534 -0.35362339 0.1224412 0.203208 0.0514382 -0.2166274 23 0.502055 -1.618511 -0.85013853 -0.1298862 -0.144328 -0.1941806 -0.1923681 24 0.900504 -1.227820 -1.07180474 -0.5851197 0.112657 0.0467164 0.0405544 25 4.161393 -1.869015 -1.54507759 0.2003123 -0.152582 -0.1382908 0.0864320 26 1.277795 -1.185179 -1.13445511 0.2771556 -0.101901 0.0070037 -0.1279016 27 3.447256 0.257652 -1.13407954 -0.0077859 0.853002 -0.1376443 -0.1897380 28 -1.695730 -3.781876 -0.72940594 -0.0956421 0.064475 0.3665470 0.0726448 29 -3.923610 -1.654818 -0.16117226 -0.4242302 -0.303749 -0.0209844 0.1723890 30 -0.309616 -1.564739 -0.39909943 0.1657509 -0.178739 -0.0600221 -0.0571706 31 -0.960838 -2.242733 1.50477679 -0.2957897 0.163758 -0.1034399 0.0257903 32 -0.671285 -0.459839 1.39124475 -0.3669914 0.246127 0.2094780 -0.2681284 33 -1.589089 -0.390812 -0.16505762 -0.3992573 0.086870 -0.0402114 -0.0399923 34 -0.421868 0.636139 -0.42563447 -0.2985726 0.311365 0.2398515 -0.0540852 35 1.118429 -2.116328 -0.22329747 -0.4864401 0.289927 -0.0503006 0.0101706 36 -3.660291 -1.630831 -0.57876280 0.1294792 -0.260224 0.0912904 -0.1565668 37 -0.087686 -2.530609 0.50076931 -0.0319873 0.194898 -0.1233526 -0.2494283 38 -1.418620 -2.303011 -0.09405565 -0.0931745 0.169466 0.1581787 0.0850095 39 1.815225 -0.838968 -1.10222194 -0.4897630 0.180933 0.0096330 -0.0600652 40 -3.420975 1.398516 -0.17143314 -0.5852146 0.090464 -0.2066323 -0.2974177 41 -3.462295 -1.795174 -0.17500650 -0.1610267 -0.595086 0.5981680 -1.5930268 42 -6.401429 0.451242 -0.78723149 -0.4285618 0.055395 -0.0212476 0.0808936 43 -2.583017 -0.871790 1.29937081 0.2422349 -0.190002 -0.2822972 -0.2625721 44 -5.027244 -0.167503 -0.02382957 -0.8288929 -0.852207 0.7399343 0.4606076 45 0.364494 -0.440380 -0.07746564 -0.4552133 0.095711 -0.1662998 0.1566706 46 0.420706 -1.880819 -0.82180986 -0.1823454 -0.022661 -0.0304227 -0.0516440 47 -1.932985 -0.120002 4.00934170 0.0930728 0.295428 0.2787446 0.3766231 48 0.395402 -1.021393 1.07953292 -0.4599764 -0.132386 0.1895780 0.2771755 49 2.886100 -0.276587 1.48851137 -0.6314648 -0.203963 -0.0891955 0.1347804 50 -3.255379 2.479232 -0.37933775 -0.3651497 -0.415000 0.0045750 0.0671055 51 1.939333 0.617579 1.57113225 0.0310866 -0.039226 0.0409183 0.1830694 52 5.727154 0.275898 0.58814711 -0.1739820 -0.222791 0.2553797 0.1959402 53 1.207873 0.131451 0.80899235 0.2872465 -0.353544 -0.1697200 -0.0987230 54 0.612921 0.040062 0.17807459 -0.0053074 -0.202244 -0.0671788 0.0530276 55 -0.399075 -0.727144 0.26196635 0.3657576 -0.192705 0.0903564 0.0641289 56 0.240719 0.733792 -0.05030509 0.0967214 -0.186906 0.0310231 -0.0594812 57 1.589641 0.289427 -1.02478822 0.2723190 -0.048378 0.2599262 -0.2040853 58 0.423483 -1.262515 -0.85026016 0.4749963 -0.082647 0.0752412 0.1352259 59 1.983684 1.335122 0.42593757 0.1345894 0.096456 0.1153107 -0.0385994 60 1.770171 0.935428 0.14901569 0.3641973 0.274015 -0.0280119 0.0690244 61 0.182845 1.706453 -0.18364654 0.2517421 -0.035773 0.0357087 -0.1363470 62 -2.191617 1.966324 -0.03573689 -0.2203900 -0.235704 0.1682332 -0.1145174 63 -2.442239 -0.209694 -0.06681921 0.3184048 0.206772 -0.0608468 0.2425649 64 -2.442239 -0.209694 -0.06681921 0.3184048 0.206772 -0.0608468 0.2425649 65 0.407575 2.996346 -0.63021113 -0.1335795 0.087668 0.0627032 0.0486166 66 2.660379 1.322824 0.10122110 0.2420451 0.192938 0.0344019 -0.0771918 67 -0.032273 1.315299 -0.04511689 -0.1293380 -0.025923 -0.1655965 0.1887534 68 1.117637 2.005809 1.97078787 -0.0429209 -0.176568 0.1634287 -0.0916254 69 0.970730 0.837158 0.01621375 0.2347502 -0.071757 -0.2464626 0.2907551 70 -2.688271 -5.335891 -0.64225481 4.1819517 -9.523550 2.0943027 -2.8098426 71 2.428718 1.976051 -0.24749122 0.1308738 0.018276 0.1711292 0.1346284 72 -2.061944 0.405943 0.50472914 0.4393739 -0.056420 -0.0031558 0.2663880 73 2.029606 2.874991 0.68310320 -0.2067254 0.511537 -0.2010371 0.0805608 74 11.293757 0.328931 -3.84783031 -0.4130266 -0.210499 -0.1103148 -0.0381326 75 0.120896 2.287914 0.83639076 -0.2462845 0.551353 0.6629701 0.3789055 76 1.859499 0.422019 1.18435547 0.1546108 0.017266 0.0470615 -0.1071011 77 8.435857 1.147499 -2.19924186 -0.4156770 0.386548 0.0294075 -0.1911399 78 -1.090858 1.311287 0.62897430 0.1727009 0.077341 0.0135972 -0.0096934 79 0.560012 0.623617 0.83727267 0.1680787 0.087477 0.0611949 -0.2588084 80 3.873817 -1.133641 -1.27469019 -0.2717298 -0.165066 0.1696232 0.0635047 81 -0.758664 -0.880260 0.00057124 0.2838720 0.016243 0.1527299 -0.0150514 82 -2.709588 1.464049 -0.12598126 -0.3828567 0.213647 -0.1425385 0.1552827 83 -2.213670 0.059563 0.87565603 0.1255703 -0.082005 0.2189829 -0.2938264 84 -0.242242 -0.483552 2.05089334 -0.0681005 -0.101578 0.1304632 -0.2218093 85 -1.032129 2.375018 -2.19321259 0.2332079 -0.066379 0.1854598 -0.0873859 86 0.015327 -0.948155 1.39530555 0.2701225 -0.268889 0.0578145 0.1608678 PC8 1 2.1835e-03 2 1.6801e-03 3 1.6623e-03 4 2.6286e-04 5 9.5884e-04 6 1.4430e-03 7 1.8784e-04 8 6.8473e-04 9 -6.8490e-04 10 1.1565e-04 11 5.6907e-06 12 -1.8395e-03 13 -2.1582e-03 14 -1.6294e-03 15 -1.6964e-03 16 -1.9664e-03 17 -2.2448e-03 18 -6.5884e-04 19 -1.1536e-03 20 2.6887e-04 21 3.3199e-05 22 1.1170e-04 23 -1.7617e-04 24 -2.1577e-04 25 -6.1495e-04 26 -7.2903e-04 27 -6.8773e-04 28 -2.0742e-04 29 -2.6937e-04 30 -6.7472e-05 31 -1.3222e-04 32 -1.6516e-04 33 -1.8836e-04 34 -1.1273e-04 35 3.0703e-05 36 -3.0311e-04 37 -1.9380e-04 38 5.5526e-04 39 4.1987e-04 40 8.4807e-05 41 8.8725e-04 42 -6.5647e-04 43 4.3202e-04 44 -5.3330e-04 45 8.9161e-04 46 1.1588e-03 47 -1.2714e-03 48 -4.0376e-04 49 4.1280e-06 50 3.0116e-04 51 5.8510e-05 52 3.3236e-04 53 4.0982e-04 54 4.0428e-04 55 6.1600e-04 56 -4.0496e-05 57 -1.8342e-04 58 -1.6748e-04 59 -1.0894e-03 60 -2.6876e-04 61 -5.8951e-05 62 -1.5517e-04 63 -7.9933e-04 64 -7.9933e-04 65 2.2592e-05 66 2.4984e-05 67 -2.2714e-04 68 -3.3991e-04 69 -3.0375e-04 70 3.4033e-03 71 2.3288e-05 72 -3.4126e-04 73 2.5528e-04 74 2.2760e-03 75 -2.8985e-04 76 7.9077e-04 77 9.4636e-04 78 4.9099e-04 79 3.0501e-04 80 6.5280e-04 81 -3.6570e-04 82 4.9966e-04 83 -4.3245e-04 84 -4.6152e-04 85 7.4691e-04 86 -6.1103e-04 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 2.62633379 1.70014141 1.01464625 0.36921951 0.21696728 0.19573429 0.17585482 [8] 0.00059393 ---------------------------------------------------------- bushfire 38 5 5 38703.789699 444.618237 Scores: PC1 PC2 PC3 PC4 PC5 1 155.972 1.08098 -23.31135 -1.93015 1.218941 2 157.738 0.35648 -20.95658 -2.42375 0.466415 3 150.667 2.12545 -16.20395 -2.00140 -0.582924 4 133.892 5.25124 -15.88873 -2.78469 -0.275261 5 102.462 13.00611 -21.54096 -4.69409 -0.944176 6 77.694 18.75377 -28.71865 -6.44244 0.446350 7 286.266 -11.36184 -98.67134 10.95233 -3.625338 8 326.627 29.92767 -112.60824 -29.26330 -13.710094 9 327.898 32.39553 -113.34314 -31.65905 -13.830781 10 325.131 5.81628 -105.58927 -13.45695 -8.987971 11 326.458 -7.84562 -94.25242 -6.11547 -8.572845 12 333.171 -37.69907 -50.89207 8.98187 -1.742979 13 279.789 -40.78415 -8.06209 7.65884 0.181748 14 37.714 10.54231 13.46530 -1.55051 2.102662 15 -90.034 34.68964 18.98186 0.69260 0.417573 16 -46.492 23.65086 10.07282 4.36090 -0.748517 17 -43.990 20.36443 9.61049 2.83084 -0.127983 18 -32.938 19.11199 2.64850 2.92879 -1.473988 19 -36.555 20.60142 2.01879 0.63832 -1.235075 20 -46.837 19.89630 6.65142 0.89120 0.271108 21 -28.670 15.29534 6.59311 3.29638 0.402194 22 -20.331 15.06559 7.33721 2.16591 2.006327 23 108.644 -7.92707 -1.45130 6.27388 0.356715 24 163.697 -16.15568 0.61663 4.24231 0.464415 25 100.471 -0.30739 0.87762 2.86452 -0.692735 26 106.922 0.90864 -1.91436 2.54557 -0.565023 27 121.966 -3.29641 4.85626 -0.47676 -0.490047 28 98.650 -4.51455 16.64160 -3.08996 -0.839397 29 88.795 -10.85457 30.46708 -5.37360 0.315657 30 142.981 -27.89100 22.40713 -1.67126 -0.680158 31 14.125 -21.60028 29.80480 -8.25272 -0.019693 32 -244.044 -11.76430 24.53390 -12.52294 2.022312 33 -283.842 -13.21931 -6.23565 -2.63367 -0.080728 34 -280.168 -13.41903 -7.69318 -1.24571 -0.722513 35 -285.666 -13.78452 -6.50318 -1.23756 1.074669 36 -282.938 -13.82281 -7.63902 0.20435 -0.971673 37 -281.129 -16.20408 -8.57154 1.85797 0.234486 38 -282.589 -16.91969 -8.36010 2.35589 0.490630 ------------- Call: PcaHubert(x = x, k = p) Standard deviations: [1] 196.7328 21.0860 18.0481 4.4044 1.0324 ---------------------------------------------------------- ========================================================== > dodata(method="hubert") Call: dodata(method = "hubert") Data Set n p k e1 e2 ========================================================== heart 12 2 1 546.354097 NA Scores: PC1 1 13.2197 2 69.9817 3 6.6946 4 2.8899 5 24.9956 6 -8.9203 7 12.0121 8 -24.1915 9 4.2721 10 -22.8289 11 -8.1433 12 54.6519 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 23.374 ---------------------------------------------------------- starsCYG 47 2 1 0.308922 NA Scores: PC1 1 0.224695 2 0.758653 3 -0.089113 4 0.758653 5 0.173934 6 0.466195 7 -0.433154 8 0.296411 9 0.542517 10 0.116133 11 0.576303 12 0.451490 13 0.429942 14 -0.997904 15 -0.745515 16 -0.408745 17 -1.071002 18 -0.803514 19 -0.834141 20 0.734210 21 -0.627085 22 -0.784992 23 -0.566652 24 -0.130992 25 0.019053 26 -0.329791 27 -0.350747 28 -0.099378 29 -0.628499 30 0.890506 31 -0.573100 32 0.127022 33 0.227721 34 1.128979 35 -0.676234 36 0.649894 37 0.122186 38 0.227721 39 0.201140 40 0.569920 41 -0.375716 42 0.069814 43 0.354212 44 0.346152 45 0.559656 46 -0.009140 47 -0.487699 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 0.55581 ---------------------------------------------------------- phosphor 18 2 1 215.172048 NA Scores: PC1 1 1.12634 2 -22.10340 3 -23.49216 4 -13.45927 5 -18.60808 6 11.24086 7 -0.14748 8 -9.77075 9 -10.37022 10 12.71798 11 -4.61857 12 10.07037 13 13.16767 14 7.57254 15 17.81362 16 -11.08799 17 21.70358 18 18.24496 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 14.669 ---------------------------------------------------------- stackloss 21 3 2 92.695059 22.692615 Scores: PC1 PC2 1 -20.334936 10.28081 2 -19.772121 11.10736 3 -16.461573 6.43794 4 -4.258672 1.73213 5 -3.773146 1.41928 6 -4.015909 1.57571 7 -7.635560 -3.22715 8 -7.635560 -3.22715 9 -0.855388 -0.58707 10 4.298129 4.41664 11 -0.767202 -3.02229 12 0.038375 -2.35217 13 3.172500 2.76354 14 -3.261224 -6.17206 15 5.553840 -7.34784 16 7.242284 -4.86820 17 14.878925 6.85989 18 10.939223 1.07406 19 10.133645 0.40394 20 4.267234 1.99501 21 -11.859921 2.12579 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 9.6278 4.7637 ---------------------------------------------------------- salinity 28 3 2 9.897101 7.246198 Scores: PC1 PC2 1 2.858444 1.04359 2 3.807704 1.55974 3 6.220733 -4.32114 4 6.388841 -2.83649 5 6.077450 -3.70092 6 5.974494 -0.67230 7 4.531584 0.78322 8 2.725849 2.41297 9 0.100501 -2.13615 10 -2.358003 -1.49718 11 -1.317688 -1.15391 12 0.434635 0.58230 13 0.116019 1.79022 14 -1.771501 2.71749 15 -2.630757 -2.44003 16 2.289743 -5.51829 17 0.637985 -1.26452 18 3.076147 0.19883 19 0.097381 -1.95868 20 -1.572471 -0.93003 21 -1.284185 2.21858 22 -2.531713 3.30313 23 -3.865359 -3.01230 24 -2.143461 -2.41918 25 -0.714414 -0.41227 26 -1.327781 1.18373 27 -2.201166 2.41566 28 -2.931988 3.20536 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 3.1460 2.6919 ---------------------------------------------------------- hbk 75 3 3 1.966655 1.617943 Scores: PC1 PC2 PC3 1 31.105415 -4.714217 -10.4566165 2 31.707650 -5.748724 -10.7682402 3 33.366131 -4.625897 -12.1570167 4 34.173377 -6.069657 -12.4466895 5 33.780418 -5.508823 -11.9872893 6 32.493478 -4.684595 -10.5679819 7 32.592637 -5.235522 -10.3765493 8 31.293363 -4.865797 -10.9379676 9 33.160964 -5.714260 -12.3098920 10 31.919786 -5.384537 -12.3374332 11 38.231962 -6.810641 -13.5994385 12 39.290479 -5.393906 -15.2942554 13 39.418445 -7.326461 -11.5194898 14 43.906584 -13.214819 -8.3282743 15 1.906326 0.716061 0.8635112 16 0.263255 0.926016 1.9009292 17 -1.776489 -1.072332 0.5496140 18 0.464648 0.702441 -0.0482897 19 0.267826 -1.283779 0.2925812 20 2.122108 0.165970 0.8924686 21 0.937217 0.548532 0.4132196 22 0.423273 -1.781869 0.0323061 23 0.047532 0.018909 1.1259327 24 -0.490041 -0.520202 1.1065753 25 -2.143049 0.720869 0.0495474 26 1.094748 -1.459175 -0.2226246 27 2.070705 0.898573 -0.0023229 28 -0.294998 0.830258 -0.5929001 29 -1.242995 0.300216 0.2010507 30 0.147958 0.439099 -2.0003038 31 0.170818 1.440946 0.9755627 32 -0.958531 -1.199730 1.0129867 33 0.697307 -0.874343 0.7260649 34 -2.278946 0.261106 -0.4196544 35 1.962829 0.809318 -0.2033113 36 0.626631 -0.600666 -0.8004036 37 0.550885 -1.881448 -0.7382776 38 -1.249717 0.336214 0.9349845 39 -1.106696 1.569418 -0.1869576 40 -0.684034 -0.939963 0.1034965 41 1.559314 1.551408 -0.3660323 42 -0.538741 -0.447358 -1.6361099 43 -0.252685 -2.080564 0.7765259 44 0.217012 1.027281 -1.7015154 45 -1.497600 1.349234 0.2698932 46 0.100388 1.026443 -1.5390401 47 -0.811117 2.195271 0.5208141 48 1.462210 1.321318 -0.5600144 49 1.383976 0.740714 0.7348906 50 1.636773 -0.215464 -0.3195369 51 -0.530918 0.759743 1.2069247 52 -0.109566 2.107455 0.5315473 53 -0.564334 -0.060847 -2.3910630 54 -0.272234 -1.122711 1.5060028 55 -0.608660 -1.197219 0.5255609 56 0.565430 -0.710345 1.3708230 57 -1.115629 0.888816 0.4186014 58 1.351288 -0.374815 1.1980618 59 0.998016 -0.151228 -0.9007970 60 0.124017 -0.764846 -1.9005963 61 1.189858 -1.905264 -0.7721322 62 -2.190589 0.579614 0.1377914 63 -0.518278 -0.931130 1.4534768 64 2.124566 0.194391 0.0327092 65 0.154218 1.050861 -1.1309885 66 -1.197852 -1.044147 0.2265269 67 -0.114174 -0.094763 0.5168926 68 -2.201115 0.032271 -0.8573493 69 -1.307843 1.104815 0.7741270 70 0.691449 -0.676665 -1.0004603 71 1.150975 0.050861 0.0717068 72 -0.457293 -0.861871 -0.1026350 73 -0.392258 -0.897451 -0.9178065 74 -0.584658 -1.450471 -0.3201857 75 -0.972517 -0.063777 -1.8223995 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 1.4024 1.2720 1.1801 ---------------------------------------------------------- milk 86 8 2 7.629557 3.124392 Scores: PC1 PC2 1 -5.768003 -0.9174359 2 -6.664422 0.0280812 3 -0.484521 1.7923710 4 -5.211590 2.0747301 5 1.422641 -0.3268437 6 -1.810360 -0.5469828 7 -2.402924 -0.1987041 8 -2.553389 -0.4963662 9 1.583399 2.5410448 10 3.267946 0.9141367 11 9.924771 0.6501301 12 13.628569 -2.3009846 13 10.774550 -1.1628697 14 12.716376 -1.0670330 15 11.176408 0.7403371 16 3.209269 -0.0804317 17 1.256577 2.8931153 18 2.468720 -1.2008647 19 2.253229 0.8379608 20 0.021073 1.6394221 21 3.205298 -2.3518286 22 1.470733 -0.9618655 23 0.475732 -1.7044535 24 0.930144 -1.3288398 25 4.151553 -2.2882554 26 1.314488 -1.3527439 27 3.613405 -0.0813605 28 -1.909178 -3.6473200 29 -3.987263 -1.3255834 30 -0.370601 -1.5855086 31 -1.273254 -2.1892809 32 -0.816634 -0.4514478 33 -1.553394 -0.2792004 34 -0.275027 0.6359374 35 0.980782 -2.2353223 36 -3.678470 -1.3459182 37 -0.327102 -2.5615283 38 -1.563492 -2.2008288 39 1.876146 -1.0292641 40 -3.204182 1.6694332 41 -3.561892 -1.5844770 42 -6.175135 1.0123714 43 -2.736601 -0.7040261 44 -4.981783 0.2434304 45 0.368802 -0.5011413 46 0.369508 -1.9511091 47 -2.306673 -0.0089446 48 0.215195 -1.1000357 49 2.704678 -0.5919929 50 -2.930879 2.7161936 51 1.846250 0.3732500 52 5.661288 -0.3139157 53 1.154929 -0.0575094 54 0.625715 -0.0733934 55 -0.453714 -0.7535924 56 0.343722 0.6460318 57 1.743002 0.0794685 58 0.433705 -1.3500731 59 2.078550 1.0860506 60 1.867913 0.7162287 61 0.392645 1.6184583 62 -1.958732 2.0993596 63 -2.383251 -0.0253919 64 -2.383251 -0.0253919 65 0.780239 2.9018927 66 2.785329 1.0142893 67 0.131210 1.2703167 68 1.110073 1.8140467 69 1.076878 0.6954148 70 -3.260160 -5.6233069 71 2.647036 1.6892084 72 -2.017340 0.5353349 73 2.247524 2.6406249 74 11.649291 -0.7374197 75 0.280544 2.2306959 76 1.791213 0.1796005 77 8.730344 0.3412271 78 -0.987405 1.3467910 79 0.560808 0.5006661 80 3.897879 -1.5270179 81 -0.792759 -0.8649399 82 -2.493611 1.6796838 83 -2.245966 0.1889555 84 -0.468812 -0.5359088 85 -0.538372 2.4105954 86 -0.185347 -1.0176989 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 2.7622 1.7676 ---------------------------------------------------------- bushfire 38 5 1 38435.075910 NA Scores: PC1 1 -111.9345 2 -113.4128 3 -105.8364 4 -89.1684 5 -58.7216 6 -35.0370 7 -250.2123 8 -292.6877 9 -294.0765 10 -290.0193 11 -289.8168 12 -290.8645 13 -232.6865 14 9.8483 15 137.1924 16 92.9804 17 90.4493 18 78.6325 19 82.1178 20 92.9044 21 74.9157 22 66.7350 23 -62.1981 24 -116.5696 25 -53.8907 26 -60.6384 27 -74.7621 28 -50.2202 29 -38.7483 30 -93.3887 31 35.3096 32 290.8493 33 326.7236 34 322.9095 35 328.5307 36 325.6791 37 323.8136 38 325.2991 ------------- Call: PcaHubert(x = x, mcd = FALSE) Standard deviations: [1] 196.05 ---------------------------------------------------------- ========================================================== > > dodata(method="locantore") Call: dodata(method = "locantore") Data Set n p k e1 e2 ========================================================== heart 12 2 2 1.835912 0.084745 Scores: PC1 PC2 [1,] 7.3042 1.745289 [2,] 64.6474 0.164425 [3,] 1.1057 -1.404189 [4,] -3.1943 2.565728 [5,] 19.4154 -0.401369 [6,] -15.5709 6.666752 [7,] 5.9980 2.509372 [8,] -29.5933 -4.805972 [9,] -1.3933 -0.899323 [10,] -28.2845 -4.270057 [11,] -14.0069 0.048311 [12,] 49.1484 0.694598 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.35496 0.29111 ---------------------------------------------------------- starsCYG 47 2 2 0.779919 0.050341 Scores: PC1 PC2 [1,] 0.174291 -0.0489127 [2,] 0.703776 0.0769650 [3,] -0.136954 -0.1212071 [4,] 0.703776 0.0769650 [5,] 0.125991 -0.1134658 [6,] 0.413609 0.0121367 [7,] -0.466451 -0.5036094 [8,] 0.238569 0.1446547 [9,] 0.498194 -0.1998666 [10,] 0.065125 -0.0353931 [11,] 0.562344 -0.9836936 [12,] 0.399997 -0.0164068 [13,] 0.376370 0.0369013 [14,] -1.041009 -0.2611550 [15,] -0.798187 -0.0090880 [16,] -0.464636 0.0805967 [17,] -1.123135 -0.0293034 [18,] -0.861603 0.1297588 [19,] -0.884955 -0.0588007 [20,] 0.721130 -1.0033585 [21,] -0.679097 -0.0238366 [22,] -0.837884 -0.0041718 [23,] -0.623423 0.1002615 [24,] -0.188079 0.1168815 [25,] -0.032888 -0.0131784 [26,] -0.385242 0.0707643 [27,] -0.401220 -0.0582501 [28,] -0.151978 0.0015702 [29,] -0.677776 -0.0945350 [30,] 0.878688 -1.0329475 [31,] -0.628339 0.0605648 [32,] 0.068629 0.1556245 [33,] 0.174199 0.0317098 [34,] 1.118098 -1.0525206 [35,] -0.726168 -0.0784655 [36,] 0.592061 0.1512588 [37,] 0.064942 0.1258519 [38,] 0.174199 0.0317098 [39,] 0.144335 0.1160195 [40,] 0.519088 -0.0311555 [41,] -0.429855 0.0359837 [42,] 0.015412 0.0513747 [43,] 0.299435 0.0665821 [44,] 0.293289 0.0169612 [45,] 0.504064 0.0916219 [46,] -0.063981 0.0612071 [47,] -0.544029 0.0904291 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 0.88313 0.22437 ---------------------------------------------------------- phosphor 18 2 2 0.933905 0.279651 Scores: PC1 PC2 1 4.5660 -15.58981 2 -21.2978 -0.38905 3 -23.3783 3.96546 4 -11.7131 -5.79023 5 -18.2569 2.81141 6 15.5702 -20.54935 7 1.3671 -3.27043 8 -9.4859 3.92005 9 -10.4501 6.22662 10 15.0583 -7.60532 11 -3.9078 1.56960 12 10.0330 7.52732 13 13.4815 5.50056 14 7.5487 7.24752 15 18.6543 2.46040 16 -9.3301 -5.68285 17 22.2533 4.63689 18 17.7892 10.85633 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 0.96639 0.52882 ---------------------------------------------------------- stackloss 21 3 3 1.137747 0.196704 Scores: PC1 PC2 PC3 [1,] 19.98046 -6.20875 -3.93576 [2,] 19.57014 -7.11509 -4.03666 [3,] 15.48729 -3.14247 -3.29600 [4,] 3.12341 -1.38969 1.50633 [5,] 2.35380 -0.84492 -0.25745 [6,] 2.73860 -1.11731 0.62444 [7,] 5.58533 4.04837 2.11170 [8,] 5.58533 4.04837 2.11170 [9,] -0.56851 0.17483 2.46656 [10,] -5.36478 -4.80766 -2.64915 [11,] -1.67190 3.34943 -1.74110 [12,] -2.46702 2.71547 -2.72389 [13,] -4.54414 -2.99497 -2.44736 [14,] 0.35419 6.70241 -0.45563 [15,] -8.28612 5.93369 1.94314 [16,] -9.51708 3.21466 1.64046 [17,] -14.87676 -9.74652 1.10983 [18,] -12.00452 -3.40212 1.81609 [19,] -11.20939 -2.76816 2.79887 [20,] -5.42808 -2.89367 0.23748 [21,] 9.83969 0.74095 -5.30190 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.06665 0.44351 0.33935 ---------------------------------------------------------- salinity 28 3 3 1.038873 0.621380 Scores: PC1 PC2 PC3 1 -2.7215590 -0.98924 0.3594538 2 -3.6251829 -1.03361 1.4973993 3 -6.0588883 4.23861 -1.1012038 4 -6.2741857 2.42372 -1.4875092 5 -5.7274076 5.42190 2.9332011 6 -5.8431892 0.57161 -0.3385363 7 -4.4051377 -0.83292 0.0851817 8 -2.6155827 -2.50739 0.3386166 9 -0.0426575 1.19631 -2.5025726 10 2.5297488 1.65029 -0.0110335 11 1.5528097 1.93255 1.4216262 12 -0.3140451 -0.73269 -0.1961364 13 0.0010783 -1.88658 0.1849912 14 1.9554303 -2.13519 1.8471356 15 2.7897250 2.40211 -0.6327944 16 -1.7665706 8.69449 5.6608836 17 -0.4374125 1.72696 0.7230753 18 -2.9752196 -0.54118 -0.6829760 19 -0.0599346 0.84127 -2.8473543 20 1.6597909 0.34191 -1.4847516 21 1.3857395 -2.43924 0.0039271 22 2.6664754 -3.14291 1.0600254 23 4.1202067 3.81886 1.0608640 24 2.4163743 3.45141 1.6874099 25 0.8493897 0.31424 -0.3073115 26 1.4216265 -1.55310 -0.5455012 27 2.3021676 -2.63392 0.0481451 28 3.0877115 -2.85951 1.4378956 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.01925 0.78828 0.36470 ---------------------------------------------------------- hbk 75 3 3 1.038833 0.363386 Scores: PC1 PC2 PC3 1 32.393698 -3.4318297 0.051248 2 33.103072 -4.4154651 0.294662 3 35.038965 -3.5996035 -0.940929 4 35.955809 -4.9285404 -0.479059 5 35.424918 -4.3076292 -0.366699 6 33.753497 -3.2463136 0.289013 7 33.817375 -3.6819421 0.684167 8 32.717119 -3.7074394 -0.279567 9 34.932190 -4.6939061 -0.738196 10 33.737339 -4.5702346 -1.193206 11 40.202273 -5.4336890 -0.229323 12 41.638189 -4.5304173 -1.996311 13 40.768565 -5.0531048 2.123222 14 44.408749 -8.8448536 8.236462 15 0.977343 1.3057899 0.938694 16 -0.900390 1.6169842 1.382855 17 -2.384467 -0.9835430 0.375495 18 -0.143306 0.7859701 -0.237712 19 -0.344479 -0.9791245 0.733869 20 1.199115 0.8330752 1.216827 21 0.184475 0.8630593 0.351029 22 -0.100389 -1.5084406 0.718236 23 -0.847925 0.4823829 0.958677 24 -1.334366 -0.1021190 1.000300 25 -2.669352 0.4692990 -0.811134 26 0.601538 -1.1984283 0.541627 27 1.373423 1.2098621 0.136249 28 -0.721268 0.6164612 -0.963817 29 -1.832615 0.2543279 -0.297658 30 0.120086 -0.1558590 -1.976558 31 -0.747437 1.7749106 0.342824 32 -1.727558 -0.8325772 1.043088 33 -0.073907 -0.3923823 1.083904 34 -2.646454 -0.1350138 -1.101448 35 1.331096 1.0443905 -0.039328 36 0.281192 -0.6569943 -0.404009 37 0.245349 -1.8406517 0.093656 38 -2.049446 0.5320301 0.347219 39 -1.645547 1.3268749 -1.068792 40 -1.216874 -0.8556007 0.201262 41 0.959445 1.6250030 -0.553881 42 -0.603579 -0.9569812 -1.502730 43 -0.946870 -1.6333180 1.324763 44 0.076217 0.5018427 -1.902369 45 -2.140584 1.2192726 -0.677180 46 -0.081677 0.5389288 -1.785347 47 -1.590461 2.1881067 -0.583771 48 0.931421 1.3321181 -0.669782 49 0.512639 1.2123979 0.683099 50 1.095415 0.0045968 0.143109 51 -1.456417 1.1186245 0.619657 52 -0.917904 2.2084467 -0.366392 53 -0.429654 -0.8524437 -2.326637 54 -1.213858 -0.4996891 1.630709 55 -1.253877 -0.9438354 0.692022 56 -0.390657 -0.0427482 1.571167 57 -1.797537 0.8934866 -0.281980 58 0.396886 0.3227454 1.492494 59 0.646360 -0.2194210 -0.562699 60 0.119900 -1.2480691 -1.459763 61 0.867946 -1.7843458 0.232229 62 -2.733997 0.3604288 -0.692947 63 -1.442683 -0.3732483 1.452800 64 1.444934 0.5727959 0.434633 65 -0.147284 0.7055205 -1.413940 66 -1.739552 -0.9838385 0.220303 67 -0.824644 0.1503195 0.411693 68 -2.437638 -0.4835278 -1.392882 69 -2.091970 1.1865192 -0.088483 70 0.403429 -0.7855276 -0.540161 71 0.507512 0.3152001 0.276885 72 -0.944376 -0.8197825 0.044859 73 -0.648597 -1.1160277 -0.658528 74 -0.979453 -1.4589411 0.029182 75 -0.982282 -0.7226425 -1.917060 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.01923 0.60282 0.46137 ---------------------------------------------------------- milk 86 8 8 1.175171 0.426506 Scores: PC1 PC2 PC3 PC4 PC5 PC6 [1,] 6.1907998 0.58762698 0.686510 -0.209679 0.3321757 -1.3424985 [2,] 7.0503894 -0.49576086 -0.322697 -0.767415 -0.0165833 -1.4596064 [3,] 0.7670594 -1.83556812 0.468814 0.346810 -0.0204610 -0.2115383 [4,] 5.4656748 -2.29797862 1.612819 -0.378295 -0.2050232 0.3486957 [5,] -1.0291160 0.37303007 0.634604 -0.521527 -0.3299543 0.0859469 [6,] 2.2186300 0.39396818 -0.236987 -0.033975 -0.2549238 0.2541221 [7,] 2.7938591 -0.01152811 -0.600546 -0.098564 -0.3906602 0.3798516 [8,] 2.9544176 0.32646226 0.273051 -0.275073 -0.3982959 0.2377581 [9,] -1.3344639 -2.45440308 1.001792 -0.104783 -0.1744718 -0.0887272 [10,] -2.9294174 -0.79860558 -0.260533 0.375330 0.3425169 -0.2056682 [11,] -9.5810648 -0.09577968 1.565111 -0.112002 0.3143032 -0.3190238 [12,] -13.1147240 2.95665890 0.228086 -0.180867 0.0136463 -0.4604390 [13,] -10.2989319 1.53220781 -2.244629 0.323950 -0.0398642 -0.3463501 [14,] -12.2553418 1.62281167 -0.472862 -0.212983 -0.4124280 -0.4253719 [15,] -10.8346894 -0.09781844 2.134079 -0.272304 -0.1090226 -0.3725738 [16,] -2.8358474 0.28109809 0.945309 0.603249 0.1615955 0.1762086 [17,] -1.0353408 -2.75475311 1.677879 0.598578 0.0078965 0.0228522 [18,] -2.0271810 1.25894451 -0.266038 -0.168565 -0.3000200 0.2891774 [19,] -1.9279394 -0.68339726 1.264416 0.186749 0.3018226 -0.0869321 [20,] 0.2568334 -1.62632029 0.854279 -0.088175 0.5458645 0.2217019 [21,] -2.7017404 2.45223507 -0.243639 -0.211402 -0.2102323 0.2140100 [22,] -1.0386097 0.99459030 0.188462 -0.033434 -0.2857078 -0.1438517 [23,] -0.0198126 1.73285416 0.761979 0.005501 0.1671992 -0.0375468 [24,] -0.4909448 1.40982693 0.967440 0.521275 0.1625359 -0.0892501 [25,] -3.6632699 2.51414455 0.966410 -0.272694 0.0467958 0.1572715 [26,] -0.8733564 1.42247465 0.946038 -0.338985 -0.0804141 -0.0080759 [27,] -3.2254798 0.26912538 0.799468 0.372442 -0.6886191 -0.0553515 [28,] 2.4675785 3.56128696 0.813964 0.118354 -0.1677073 -0.0303774 [29,] 4.4177264 1.13316321 0.613509 0.261488 0.4229929 0.1780620 [30,] 0.8240097 1.54163297 0.398148 -0.221825 0.0309586 0.0830110 [31,] 1.7735990 2.00615332 -1.399933 0.469158 -0.0740282 0.0692312 [32,] 1.2348922 0.28918604 -1.239899 0.470999 -0.1511519 -0.3692504 [33,] 1.9407276 0.19123540 0.406623 0.389965 0.0994854 -0.0204286 [34,] 0.6225565 -0.65636700 0.565253 0.369897 -0.1612501 -0.1774611 [35,] -0.4869219 2.26301333 0.071825 0.588101 -0.0579092 -0.0362009 [36,] 4.1117242 1.16638974 0.982790 -0.266009 0.0728797 -0.0018914 [37,] 0.8415225 2.46677043 -0.526780 0.167456 -0.2370116 -0.0731483 [38,] 2.0528334 2.09648023 0.220912 0.206722 -0.1924842 0.0676382 [39,] -1.4493644 1.14916103 0.904194 0.455498 0.0678893 -0.1476540 [40,] 3.4867792 -1.82367389 0.730183 0.499859 0.2327704 -0.1518819 [41,] 4.0222120 1.34765470 0.580852 -0.453301 0.2482908 -1.5306566 [42,] 6.4789035 -1.25599522 1.644194 0.381331 0.1699942 0.1847594 [43,] 3.1529354 0.44884526 -0.967114 -0.220364 0.0037036 0.0802727 [44,] 5.3344976 -0.47975673 0.642789 0.298705 0.9983145 -0.1310548 [45,] 0.0325597 0.49900084 0.076948 0.486521 0.1642679 0.1392696 [46,] 0.1014401 1.97657735 0.733879 0.127235 0.0650844 -0.0144271 [47,] 2.7217685 -0.37859042 -3.696163 0.355401 -0.4123714 0.2114024 [48,] 0.2292225 1.01473918 -1.115726 0.434557 0.2668316 0.0103147 [49,] -2.2803784 0.59474034 -1.783003 0.549252 0.4660435 -0.0802352 [50,] 3.1560404 -2.84820361 0.913015 0.077151 0.5803961 0.0350246 [51,] -1.4680905 -0.43078891 -1.733657 0.074684 0.0026718 0.0819023 [52,] -5.2469034 0.48385240 -1.246027 0.081379 0.2380924 -0.1663831 [53,] -0.7670982 0.00234561 -0.923030 -0.366820 0.1582141 0.0508747 [54,] -0.2428655 0.04714401 -0.217187 -0.059549 0.1762969 0.0806339 [55,] 0.8723441 0.66109329 -0.224917 -0.360607 -0.0638127 0.1310131 [56,] 0.0019700 -0.67624071 0.081304 -0.182908 0.1045597 -0.0281936 [57,] -1.3684663 -0.00045069 0.860560 -0.350684 -0.1443970 -0.2270651 [58,] 0.0079047 1.36376727 0.750919 -0.437914 -0.1894910 0.2345556 [59,] -1.7430794 -1.06973583 -0.569381 -0.055139 -0.1582790 -0.0873605 [60,] -1.5171606 -0.69340281 -0.287048 -0.136559 -0.3871182 0.1606979 [61,] -0.0955085 -1.64221260 0.263650 -0.265665 -0.0808644 -0.0476862 [62,] 2.2259171 -2.22161516 0.426279 0.027834 0.2924338 -0.1784242 [63,] 2.7573525 -0.11785122 0.391113 -0.094032 -0.3184760 0.4251268 [64,] 2.7573525 -0.11785122 0.391113 -0.094032 -0.3184760 0.4251268 [65,] -0.5520071 -2.86186682 0.746248 0.109945 0.0556927 -0.0135739 [66,] -2.4472964 -0.94969715 -0.329042 -0.113895 -0.2728443 -0.0523337 [67,] 0.1790969 -1.29190443 0.146657 0.140234 0.1534048 0.2318353 [68,] -0.8017055 -1.93331421 -1.968273 0.017854 0.1287513 -0.2306786 [69,] -0.7356418 -0.68868398 -0.075215 -0.156944 0.0302876 0.4232626 [70,] 3.8821693 5.16959880 0.215490 -8.985938 5.2189361 -2.8089276 [71,] -2.3478937 -1.60220695 0.058822 -0.111845 -0.0539018 0.0087982 [72,] 2.3676739 -0.70331436 -0.214457 -0.307311 -0.1582719 0.3995413 [73,] -1.9906385 -2.60946629 -0.730312 0.485522 -0.2391998 0.1009341 [74,] -11.2435515 1.44868683 2.482678 0.026711 0.4922865 -0.2822136 [75,] 0.0044207 -2.29768358 -0.692425 0.538923 -0.4110598 -0.0824903 [76,] -1.4045239 -0.22649785 -1.343257 -0.067382 -0.1322233 -0.1072330 [77,] -8.3637576 0.14167751 1.267616 0.384528 -0.0728561 -0.4017300 [78,] 1.3022939 -1.47457541 -0.394623 -0.068014 -0.1502832 0.0757414 [79,] -0.1950676 -0.58254701 -0.824931 -0.088174 -0.2071634 -0.1896613 [80,] -3.4432989 1.73593273 0.777996 0.094211 0.2377017 -0.1520088 [81,] 1.2167258 0.77512068 0.085803 -0.214850 -0.2201173 0.0432435 [82,] 2.7778798 -1.80071342 0.583878 0.465898 0.0648352 0.2148470 [83,] 2.6218578 -0.39825539 -0.553372 -0.145721 -0.0977092 -0.2485337 [84,] 0.8946018 0.33790104 -1.974267 0.091828 0.0051986 -0.2606274 [85,] 0.7759316 -2.34860124 2.423325 -0.384149 -0.0167182 -0.0353374 [86,] 0.6266756 0.87099609 -1.407948 -0.237762 0.0361644 0.1675792 PC7 PC8 [1,] -0.1014312 1.5884e-03 [2,] -0.3831443 1.0212e-03 [3,] -0.7164683 1.2035e-03 [4,] 0.0892864 3.5409e-04 [5,] -0.0943992 1.0547e-03 [6,] 0.1184847 1.5031e-03 [7,] -0.2509793 1.6850e-05 [8,] -0.0136880 7.0308e-04 [9,] 0.2238736 -1.9164e-04 [10,] 0.0754413 1.3614e-04 [11,] 0.0784380 3.5175e-04 [12,] 0.2033489 -1.3174e-03 [13,] 0.2139525 -1.7101e-03 [14,] 0.1209735 -9.1070e-04 [15,] 0.2119647 -9.2843e-04 [16,] -0.3011483 -2.1474e-03 [17,] 0.0660858 -1.9036e-03 [18,] -0.5199396 -9.4385e-04 [19,] -0.1232622 -1.2649e-03 [20,] -0.3900208 -2.6927e-04 [21,] 0.0264834 7.6074e-05 [22,] -0.0736288 1.7240e-04 [23,] -0.2156005 -5.5661e-04 [24,] 0.1143327 -2.5248e-04 [25,] 0.0481580 -6.1531e-04 [26,] -0.0084802 -7.5928e-04 [27,] -0.2173883 -3.0971e-04 [28,] 0.3288873 -1.8975e-04 [29,] 0.0788974 -7.2436e-04 [30,] -0.0598663 -3.0463e-04 [31,] -0.1511658 -4.8751e-04 [32,] -0.0532375 -2.5207e-04 [33,] -0.0635290 -3.9270e-04 [34,] 0.1598240 1.3024e-04 [35,] -0.0355175 -8.5374e-05 [36,] -0.0174096 -6.3294e-04 [37,] -0.2883141 -5.2809e-04 [38,] 0.1426412 5.3331e-04 [39,] 0.0313308 4.2738e-04 [40,] -0.3536195 -3.4170e-04 [41,] -0.3925168 1.4588e-04 [42,] -0.0056267 -9.1925e-04 [43,] -0.4447402 -1.8415e-04 [44,] 0.9184385 -5.9685e-04 [45,] -0.0340987 7.2924e-04 [46,] -0.0162866 9.7800e-04 [47,] 0.2428769 -1.1208e-03 [48,] 0.3026758 -4.5769e-04 [49,] 0.0246345 -2.6207e-04 [50,] 0.0857698 7.6439e-05 [51,] 0.1136658 1.3013e-04 [52,] 0.3993357 6.2796e-04 [53,] -0.1765161 1.1329e-04 [54,] 0.0016144 2.5870e-04 [55,] 0.1064371 5.8188e-04 [56,] 0.0207478 -8.7595e-05 [57,] 0.1560065 6.3987e-05 [58,] 0.1684561 -5.0193e-05 [59,] 0.0778732 -8.5458e-04 [60,] 0.0037585 1.0429e-05 [61,] -0.0296083 3.1526e-05 [62,] 0.0913974 -2.2794e-04 [63,] 0.0358917 -7.3721e-04 [64,] 0.0358917 -7.3721e-04 [65,] 0.1209159 2.9398e-04 [66,] -0.0027574 2.9380e-04 [67,] -0.0091059 -2.7494e-04 [68,] 0.0555970 -3.3016e-04 [69,] -0.0149255 -3.1228e-04 [70,] 0.9282997 4.7859e-05 [71,] 0.2630142 4.2617e-04 [72,] 0.1063248 -3.0070e-04 [73,] -0.1462452 4.9607e-04 [74,] 0.2027591 2.6399e-03 [75,] 0.6934350 6.0284e-04 [76,] -0.0430524 8.1271e-04 [77,] 0.0789302 1.4655e-03 [78,] -0.0318359 5.2799e-04 [79,] -0.1269568 2.9497e-04 [80,] 0.2903958 7.8932e-04 [81,] 0.0979443 -3.1531e-04 [82,] -0.0548155 4.2140e-04 [83,] -0.0371550 -5.6653e-04 [84,] -0.0835149 -7.0682e-04 [85,] 0.1864954 1.0604e-03 [86,] 0.1074252 -7.4859e-04 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.08405293 0.65307452 0.28970076 0.11162824 0.09072195 0.06659711 0.05888048 [8] 0.00022877 ---------------------------------------------------------- bushfire 38 5 5 1.464779 0.043290 Scores: PC1 PC2 PC3 PC4 PC5 [1,] -69.9562 -13.0364 0.98678 1.054123 2.411188 [2,] -71.5209 -10.5459 0.31081 1.631208 1.663470 [3,] -63.9308 -7.4622 -2.43241 0.671038 0.465836 [4,] -47.0413 -9.6343 -3.83609 0.758349 0.683983 [5,] -15.9088 -20.1737 -5.55893 1.181744 -0.053563 [6,] 8.3484 -30.7646 -5.51541 1.877227 1.338037 [7,] -207.7458 -66.2492 34.48519 -5.894885 -1.051729 [8,] -246.4327 -97.0433 -9.57057 22.286225 -9.234869 [9,] -247.5984 -98.8613 -12.13406 23.948770 -9.250401 [10,] -245.8121 -79.2634 12.47990 13.046128 -5.125478 [11,] -246.8887 -62.5899 21.21764 9.111011 -5.080985 [12,] -251.1354 -9.2115 31.77448 0.236379 0.707528 [13,] -194.0239 27.1288 21.05023 0.940913 1.781359 [14,] 51.7182 8.5038 -11.22109 -2.132458 1.984807 [15,] 180.5597 -4.8151 -21.36630 -9.390663 -0.817036 [16,] 135.7246 -5.0756 -11.33517 -10.015567 -1.670831 [17,] 133.0151 -4.0344 -8.95540 -7.702087 -0.923277 [18,] 121.2619 -9.0627 -5.96042 -7.210971 -2.092872 [19,] 124.9038 -10.6649 -7.22555 -5.349553 -1.771009 [20,] 135.5410 -6.8146 -7.52834 -5.562769 -0.396924 [21,] 117.1950 -3.5643 -4.67473 -6.862117 -0.234551 [22,] 108.9944 -2.3344 -5.90349 -5.928299 1.455538 [23,] -21.4031 8.0668 6.19525 -4.784890 0.671394 [24,] -76.3499 16.7804 6.52545 -1.391250 1.219282 [25,] -12.5732 6.1109 -1.45259 -3.512072 -0.375837 [26,] -19.1800 3.4685 -2.02243 -3.490028 -0.169127 [27,] -33.6733 12.0757 -3.53322 0.048666 0.067468 [28,] -9.3966 21.5055 -5.91671 2.650895 -0.449672 [29,] 1.4123 35.8559 -5.98222 5.982362 0.613667 [30,] -54.2683 39.6029 7.82694 6.759994 0.035048 [31,] 74.8866 34.9048 10.03986 12.592158 0.149308 [32,] 331.4144 9.3079 27.73391 17.334531 1.015536 [33,] 367.6915 -19.5135 48.52753 10.213314 -1.268047 [34,] 363.8686 -20.4079 49.32855 8.986581 -1.930673 [35,] 369.4371 -19.5074 49.66761 9.001542 -0.179566 [36,] 366.5850 -20.2555 50.30290 7.745330 -2.259131 [37,] 364.5463 -19.8198 53.00407 6.757796 -1.083372 [38,] 365.9709 -19.3753 53.80168 6.467284 -0.854384 ------------- Call: PcaLocantore(x = x) Standard deviations: [1] 1.210280 0.208063 0.177790 0.062694 0.014423 ---------------------------------------------------------- ========================================================== > dodata(method="cov") Call: dodata(method = "cov") Data Set n p k e1 e2 ========================================================== heart 12 2 2 802.107569 15.354150 Scores: PC1 PC2 1 8.18562 1.17998 2 65.41185 -2.80723 3 1.86039 -1.70646 4 -2.26910 2.44051 5 20.19603 -1.47331 6 -14.46264 7.05759 7 6.91264 1.99823 8 -28.95436 -3.81624 9 -0.61523 -1.09711 10 -27.62427 -3.33575 11 -13.17788 0.37931 12 49.94879 -1.62675 ------------- Call: PcaCov(x = x) Standard deviations: [1] 28.3215 3.9184 ---------------------------------------------------------- starsCYG 47 2 2 0.362996 0.009574 Scores: PC1 PC2 1 0.272263 -0.07964458 2 0.804544 0.03382837 3 -0.040587 -0.14464760 4 0.804544 0.03382837 5 0.222468 -0.14305159 6 0.512941 -0.02420304 7 -0.378928 -0.51924735 8 0.341045 0.11236831 9 0.592550 -0.23812462 10 0.163442 -0.06357822 11 0.638370 -1.02323643 12 0.498667 -0.05242075 13 0.476291 0.00142479 14 -0.947664 -0.26343572 15 -0.699020 -0.01711057 16 -0.363464 0.06475681 17 -1.024352 -0.02972862 18 -0.759174 0.12317995 19 -0.786925 -0.06478250 20 0.796654 -1.04660568 21 -0.580307 -0.03463751 22 -0.738591 -0.01126825 23 -0.521748 0.08812607 24 -0.086135 0.09457052 25 0.065975 -0.03907968 26 -0.284322 0.05307219 27 -0.303309 -0.07553370 28 -0.052738 -0.02155274 29 -0.580638 -0.10534741 30 0.953478 -1.07986770 31 -0.527590 0.04855502 32 0.171408 0.12730538 33 0.274054 0.00095808 34 1.192364 -1.10502882 35 -0.628641 -0.08815176 36 0.694595 0.11071187 37 0.167026 0.09762710 38 0.274054 0.00095808 39 0.246168 0.08594248 40 0.617380 -0.06994769 41 -0.329735 0.01934346 42 0.115770 0.02432733 43 0.400071 0.03289494 44 0.392768 -0.01656886 45 0.605229 0.05314718 46 0.036628 0.03601196 47 -0.442606 0.07644144 ------------- Call: PcaCov(x = x) Standard deviations: [1] 0.602491 0.097845 ---------------------------------------------------------- phosphor 18 2 2 406.415096 31.072588 Scores: PC1 PC2 1 2.7987 -19.015683 2 -20.4311 -0.032022 3 -21.8198 4.589809 4 -11.7869 -6.837833 5 -16.9357 2.664785 6 12.9132 -25.602526 7 1.5249 -6.351664 8 -8.0984 2.416616 9 -8.6979 4.843680 10 14.3903 -12.732868 11 -2.9462 -0.760656 12 11.7427 2.991004 13 14.8400 0.459849 14 9.2449 3.095095 15 19.4860 -3.336883 16 -9.4156 -7.096788 17 23.3759 -1.737460 18 19.9173 5.092467 ------------- Call: PcaCov(x = x) Standard deviations: [1] 20.1597 5.5743 ---------------------------------------------------------- stackloss 21 3 3 56.394968 17.878262 Scores: PC1 PC2 PC3 [1,] 10.538448 13.596944 12.84989 [2,] 9.674846 14.098881 12.89733 [3,] 8.993255 9.221043 9.94062 [4,] 1.744427 3.649104 0.17292 [5,] 0.980215 2.223126 1.34874 [6,] 1.362321 2.936115 0.76083 [7,] 6.926040 0.637480 -0.11170 [8,] 6.926040 0.637480 -0.11170 [9,] 0.046655 0.977727 -2.46930 [10,] -7.909092 0.926343 0.80232 [11,] -0.136672 -3.591094 0.37539 [12,] -1.382381 -3.802146 1.01074 [13,] -6.181887 -0.077532 0.70744 [14,] 3.699843 -4.885854 -0.40226 [15,] -2.768005 -7.507870 -6.08487 [16,] -5.358811 -6.002058 -5.94256 [17,] -17.067135 1.738055 -5.86637 [18,] -11.021920 -1.775507 -6.19842 [19,] -9.776212 -1.564455 -6.83377 [20,] -6.075508 0.369252 -2.08345 [21,] 6.301743 2.706174 8.79509 ------------- Call: PcaCov(x = x) Standard deviations: [1] 7.5097 4.2283 1.8427 ---------------------------------------------------------- salinity 28 3 3 15.689189 5.266840 Scores: PC1 PC2 PC3 1 -1.59888 1.582157 0.135248 2 -2.26975 2.429177 1.107832 3 -6.79543 -2.034636 0.853876 4 -6.36795 -0.602960 -0.267268 5 -6.42044 -1.520259 5.022962 6 -5.13821 1.225470 0.016977 7 -3.24014 1.998671 -0.123418 8 -0.93998 2.789889 -0.515656 9 -0.30856 -2.424345 -1.422752 10 2.20362 -2.800513 1.142127 11 1.38120 -2.076832 2.515630 12 0.44997 0.207439 -0.152835 13 1.21669 1.193701 -0.277116 14 3.31664 1.306627 1.213342 15 2.08484 -3.774814 0.905400 16 -3.64862 -4.677257 9.046484 17 -0.46124 -1.411762 1.706719 18 -2.13038 0.890401 -0.633349 19 -0.23610 -2.262304 -1.885048 20 1.70337 -1.970773 -0.781880 21 2.67273 1.038742 -0.610945 22 4.24561 1.547290 0.108927 23 2.99619 -4.785343 3.094945 24 1.64474 -3.564562 3.432429 25 1.11703 -1.158030 0.237700 26 2.30707 0.069668 -0.735809 27 3.59356 0.860498 -0.611380 28 4.57550 1.300407 0.589307 ------------- Call: PcaCov(x = x) Standard deviations: [1] 3.9610 2.2950 1.0901 ---------------------------------------------------------- hbk 75 3 3 1.935081 1.591967 Scores: PC1 PC2 PC3 1 31.105415 -4.714217 10.4566165 2 31.707650 -5.748724 10.7682402 3 33.366131 -4.625897 12.1570167 4 34.173377 -6.069657 12.4466895 5 33.780418 -5.508823 11.9872893 6 32.493478 -4.684595 10.5679819 7 32.592637 -5.235522 10.3765493 8 31.293363 -4.865797 10.9379676 9 33.160964 -5.714260 12.3098920 10 31.919786 -5.384537 12.3374332 11 38.231962 -6.810641 13.5994385 12 39.290479 -5.393906 15.2942554 13 39.418445 -7.326461 11.5194898 14 43.906584 -13.214819 8.3282743 15 1.906326 0.716061 -0.8635112 16 0.263255 0.926016 -1.9009292 17 -1.776489 -1.072332 -0.5496140 18 0.464648 0.702441 0.0482897 19 0.267826 -1.283779 -0.2925812 20 2.122108 0.165970 -0.8924686 21 0.937217 0.548532 -0.4132196 22 0.423273 -1.781869 -0.0323061 23 0.047532 0.018909 -1.1259327 24 -0.490041 -0.520202 -1.1065753 25 -2.143049 0.720869 -0.0495474 26 1.094748 -1.459175 0.2226246 27 2.070705 0.898573 0.0023229 28 -0.294998 0.830258 0.5929001 29 -1.242995 0.300216 -0.2010507 30 0.147958 0.439099 2.0003038 31 0.170818 1.440946 -0.9755627 32 -0.958531 -1.199730 -1.0129867 33 0.697307 -0.874343 -0.7260649 34 -2.278946 0.261106 0.4196544 35 1.962829 0.809318 0.2033113 36 0.626631 -0.600666 0.8004036 37 0.550885 -1.881448 0.7382776 38 -1.249717 0.336214 -0.9349845 39 -1.106696 1.569418 0.1869576 40 -0.684034 -0.939963 -0.1034965 41 1.559314 1.551408 0.3660323 42 -0.538741 -0.447358 1.6361099 43 -0.252685 -2.080564 -0.7765259 44 0.217012 1.027281 1.7015154 45 -1.497600 1.349234 -0.2698932 46 0.100388 1.026443 1.5390401 47 -0.811117 2.195271 -0.5208141 48 1.462210 1.321318 0.5600144 49 1.383976 0.740714 -0.7348906 50 1.636773 -0.215464 0.3195369 51 -0.530918 0.759743 -1.2069247 52 -0.109566 2.107455 -0.5315473 53 -0.564334 -0.060847 2.3910630 54 -0.272234 -1.122711 -1.5060028 55 -0.608660 -1.197219 -0.5255609 56 0.565430 -0.710345 -1.3708230 57 -1.115629 0.888816 -0.4186014 58 1.351288 -0.374815 -1.1980618 59 0.998016 -0.151228 0.9007970 60 0.124017 -0.764846 1.9005963 61 1.189858 -1.905264 0.7721322 62 -2.190589 0.579614 -0.1377914 63 -0.518278 -0.931130 -1.4534768 64 2.124566 0.194391 -0.0327092 65 0.154218 1.050861 1.1309885 66 -1.197852 -1.044147 -0.2265269 67 -0.114174 -0.094763 -0.5168926 68 -2.201115 0.032271 0.8573493 69 -1.307843 1.104815 -0.7741270 70 0.691449 -0.676665 1.0004603 71 1.150975 0.050861 -0.0717068 72 -0.457293 -0.861871 0.1026350 73 -0.392258 -0.897451 0.9178065 74 -0.584658 -1.450471 0.3201857 75 -0.972517 -0.063777 1.8223995 ------------- Call: PcaCov(x = x) Standard deviations: [1] 1.3911 1.2617 1.1706 ---------------------------------------------------------- milk 86 8 8 7.282476 2.813536 Scores: PC1 PC2 PC3 PC4 PC5 PC6 1 5.7090867 1.388263 0.0055924 0.3510505 -0.7335114 -1.41950731 2 6.5825186 0.480410 -1.1356236 -0.3250838 -0.7343177 -1.71595400 3 0.7433619 -1.749281 0.2510521 0.3450575 0.2996413 -0.34585702 4 5.5733255 -1.588521 0.8934908 -0.3412408 0.0087626 0.07235942 5 -1.3030839 0.142394 0.8487785 -0.5847851 0.0588053 -0.08968553 6 1.7708705 0.674240 -0.4153759 -0.1915734 0.1382138 0.12454293 7 2.3570866 0.381017 -0.8771357 -0.3739365 0.2918453 0.13437364 8 2.5700714 0.695006 0.0061108 -0.4323695 0.1643797 -0.00469369 9 -1.1725766 -2.713291 1.0677483 -0.0647875 0.1183120 -0.10762785 10 -3.1357225 -1.255175 0.0666017 0.5083690 -0.1096080 -0.00647493 11 -9.5333894 -1.608943 2.7307809 0.1690156 -0.1682415 -0.06597478 12 -13.6028505 0.941083 2.0136258 -0.1076520 -0.0475905 -0.15295614 13 -10.9497471 0.048776 -0.8765307 0.1518572 0.1428294 -0.00064406 14 -12.6558378 -0.219444 1.1396273 -0.3734679 0.2875578 -0.23870524 15 -10.6924790 -1.818075 3.4560731 -0.1177943 0.1101199 -0.19708172 16 -3.0258070 -0.203186 1.2835368 0.5799363 0.3237454 0.23168871 17 -0.7498665 -2.977505 1.6310512 0.6305329 0.3994006 0.06594881 18 -2.5093526 0.924459 0.0899818 -0.4026675 0.2963072 0.11324019 19 -1.9689970 -1.051282 1.4659908 0.3870104 -0.0708083 -0.02148354 20 0.2695886 -1.646440 0.7597630 0.1750131 -0.3418142 0.21515143 21 -3.3470252 1.989939 0.2887021 -0.3599779 0.0771965 0.16867095 22 -1.4659204 0.777242 0.4090149 -0.1248050 0.1916768 -0.23160291 23 -0.4944476 1.634130 0.8915509 0.1222296 -0.1231015 -0.08351169 24 -0.8945477 1.239223 1.1117165 0.6018455 0.0912200 -0.01204668 25 -4.1499992 1.860190 1.6062973 -0.2139736 -0.1140169 0.16632426 26 -1.2647012 1.188058 1.1893430 -0.2740862 -0.0971504 -0.09851714 27 -3.4280131 -0.267150 1.1969552 0.0354366 0.8482718 -0.18977667 28 1.6896630 3.793723 0.7706325 0.1007287 0.0317704 -0.11269816 29 3.9258127 1.691428 0.1850999 0.4485202 -0.2969916 0.16594044 30 0.3178322 1.577233 0.4455231 -0.1687197 -0.1587136 -0.00823174 31 0.9562350 2.258138 -1.4672169 0.2675668 0.1910110 0.03177387 32 0.6738452 0.470764 -1.3496896 0.3524049 0.2008218 -0.36957179 33 1.5980690 0.413899 0.1999664 0.4232293 0.0768479 -0.04627841 34 0.4365091 -0.626490 0.4718364 0.3392252 0.2554060 -0.19018602 35 -1.1184804 2.124234 0.2650931 0.4791171 0.2927791 -0.01579964 36 3.6673986 1.659798 0.6138972 -0.1092158 -0.2705583 -0.16494176 37 0.0867143 2.541765 -0.4572593 0.0024263 0.2163300 -0.20116352 38 1.4191839 2.315690 0.1365887 0.1028375 0.1595780 -0.02049460 39 -1.8062960 0.845438 1.1469588 0.5022406 0.1603011 -0.08751261 40 3.4380914 -1.358545 0.1956896 0.6314649 0.0716078 -0.21591535 41 3.4608782 1.828575 0.2012565 0.1064437 -0.7454169 -1.64629924 42 6.4162310 -0.402642 0.8070441 0.5146855 0.0331594 0.04373032 43 2.5906567 0.897993 -1.2612252 -0.2620162 -0.1432569 -0.10279385 44 5.0299750 0.203721 0.0439110 0.8775684 -0.9536011 0.15153452 45 -0.3555392 0.454930 0.1173992 0.4688991 0.1137820 0.18752442 46 -0.4155426 1.892410 0.8649578 0.1827426 -0.0186113 -0.04029205 47 1.9328817 0.121936 -3.9578157 -0.1135807 0.2971001 0.18733657 48 -0.3947656 1.028405 -1.0370498 0.4467257 -0.1445498 0.16878692 49 -2.8829860 0.279064 -1.4443310 0.5889970 -0.1883118 0.16947945 50 3.2797246 -2.443968 0.4100655 0.4278962 -0.4414712 0.08598366 51 -1.9272930 -0.622137 -1.5136862 -0.0483369 -0.0272502 0.16006066 52 -5.7161590 -0.298434 -0.5216578 0.1385780 -0.2435931 0.10628617 53 -1.1933277 -0.125878 -0.7556261 -0.3129372 -0.3166453 0.03078643 54 -0.5994394 -0.031069 -0.1296378 0.0061490 -0.1869578 0.09839221 55 0.4104586 0.733465 -0.2088065 -0.3645266 -0.1830137 0.04705775 56 -0.2227671 -0.724741 0.1007592 -0.0838897 -0.1939960 -0.04223579 57 -1.5706297 -0.292436 1.0849660 -0.2559591 -0.0917278 -0.27423151 58 -0.4102168 1.263831 0.9082556 -0.4592777 -0.0676902 0.11089798 59 -1.9640736 -1.340173 -0.3652736 -0.1267573 0.0775692 -0.07977644 60 -1.7490968 -0.941370 -0.0849901 -0.3453455 0.2858594 0.06413468 61 -0.1583416 -1.699326 0.2385988 -0.2231496 -0.0513883 -0.12227279 62 2.2124878 -1.942366 0.0743514 0.2627321 -0.2844018 -0.15848039 63 2.4578489 0.226019 0.1148050 -0.2715718 0.2322085 0.22346659 64 2.4578489 0.226019 0.1148050 -0.2715718 0.2322085 0.22346659 65 -0.3779208 -2.987354 0.6819006 0.1942611 0.0529259 0.01315140 66 -2.6385498 -1.331204 -0.0367809 -0.2327572 0.1845076 -0.08521680 67 0.0526645 -1.301299 0.0912198 0.1634869 -0.0068236 0.24131589 68 -1.1013065 -2.004809 -1.9168056 0.0260663 -0.2029903 -0.12625268 69 -0.9495853 -0.831697 0.0389476 -0.2123483 -0.0202267 0.38463410 70 2.6935893 5.369312 0.6987368 -4.5754846 -9.6833013 -2.32910628 71 -2.4037611 -1.983509 0.3109848 -0.1015686 -0.0071432 0.06410351 72 2.0795505 -0.392730 -0.4534128 -0.4054224 -0.0312781 0.25408988 73 -2.0038405 -2.874605 -0.6269939 0.2408421 0.5184666 0.11140104 74 -11.2683996 -0.361851 3.9219448 0.4045689 -0.2203308 0.05930132 75 -0.1028287 -2.295813 -0.7769187 0.3071821 0.4537196 0.00522380 76 -1.8466137 -0.425825 -1.1261209 -0.1760585 0.0165729 -0.10698465 77 -8.4124493 -1.174820 2.2700712 0.4213953 0.3446597 -0.20636892 78 1.1103236 -1.299480 -0.5787732 -0.1455945 0.0732148 -0.01806218 79 -0.5451834 -0.620170 -0.7830595 -0.1746479 0.0723052 -0.26017118 80 -3.8647223 1.126328 1.3299567 0.2645241 -0.1881443 0.00485531 81 0.7690939 0.887363 0.0513096 -0.2730980 0.0076447 -0.07590882 82 2.7287618 -1.435327 0.1602865 0.4465859 0.2129425 0.16104418 83 2.2241485 -0.042822 -0.8316486 -0.1230697 -0.1193057 -0.35207561 84 0.2452905 0.491732 -2.0050683 0.0286567 -0.1159415 -0.24887542 85 1.0655845 -2.360746 2.2456131 -0.1479972 -0.1186670 -0.14020891 86 -0.0091659 0.952208 -1.3429189 -0.2944676 -0.2433277 0.15354490 PC7 PC8 1 -0.09778744 2.3157e-03 2 0.05189698 1.8077e-03 3 0.70506895 1.2838e-03 4 -0.08541140 3.2781e-04 5 0.11768945 8.3496e-04 6 -0.17886391 1.5222e-03 7 0.14143613 1.3261e-04 8 -0.07724578 7.1241e-04 9 -0.12298048 -7.0110e-04 10 0.07569878 2.3093e-05 11 0.29299858 -3.4542e-04 12 0.07764899 -2.1390e-03 13 -0.08945524 -2.2633e-03 14 0.03597787 -1.8891e-03 15 0.11780498 -2.0279e-03 16 0.46501534 -2.3266e-03 17 0.08603290 -2.4073e-03 18 0.52605757 -9.8822e-04 19 0.31007227 -1.3919e-03 20 0.61582059 -2.3549e-05 21 0.01199350 -6.1649e-05 22 0.03654587 1.3302e-05 23 0.27549986 -3.6759e-04 24 -0.04155354 -2.9882e-04 25 0.11473708 -7.9629e-04 26 0.06673183 -8.3728e-04 27 0.16937729 -9.5775e-04 28 -0.41753592 -7.5544e-05 29 -0.03693100 -2.2481e-04 30 0.08461537 -1.3611e-04 31 0.02476253 -1.4319e-04 32 -0.09756048 -1.2234e-04 33 0.06442434 -2.4915e-04 34 -0.17828409 -9.5882e-05 35 0.00881239 -7.1427e-05 36 -0.01041003 -2.8489e-04 37 0.15994729 -3.1472e-04 38 -0.22386895 6.1384e-04 39 0.03666242 2.8506e-04 40 0.35883231 -8.3062e-05 41 0.18521851 8.5509e-04 42 0.00733985 -6.4477e-04 43 0.35466617 3.2923e-04 44 -0.74952524 -7.6869e-05 45 0.09907237 7.9128e-04 46 0.05119980 1.0606e-03 47 -0.48571583 -9.3780e-04 48 -0.27463442 -2.7037e-04 49 0.06787536 -3.0554e-05 50 0.08499400 3.1181e-04 51 -0.09197457 1.1213e-04 52 -0.24513244 3.9100e-04 53 0.24012780 3.2068e-04 54 0.07999888 3.5689e-04 55 -0.09825475 6.6675e-04 56 0.05133674 -7.2984e-05 57 -0.10302363 -2.0693e-04 58 -0.12323360 -1.6620e-04 59 -0.05119989 -1.1016e-03 60 0.00082131 -3.2951e-04 61 0.08128272 -1.1550e-04 62 -0.01789040 -1.1579e-04 63 -0.07188070 -7.8367e-04 64 -0.07188070 -7.8367e-04 65 0.00917085 -2.6800e-05 66 0.03121573 -5.3492e-05 67 0.12202335 -3.0466e-04 68 -0.04764366 -2.6126e-04 69 0.13828337 -3.9331e-04 70 0.10401069 4.2870e-03 71 -0.14369640 3.7669e-05 72 -0.10334451 -2.6456e-04 73 0.17655402 1.0917e-04 74 0.26779696 1.8685e-03 75 -0.75016549 2.1079e-05 76 0.01802016 7.7555e-04 77 0.13081368 6.4286e-04 78 0.01409131 4.9476e-04 79 0.06643384 2.6590e-04 80 -0.12624376 5.9801e-04 81 -0.14074469 -3.2172e-04 82 0.09228230 4.4064e-04 83 -0.06352151 -3.6274e-04 84 -0.02642452 -3.9742e-04 85 -0.03502188 6.9814e-04 86 -0.11749109 -5.1283e-04 ------------- Call: PcaCov(x = x) Standard deviations: [1] 2.69860623 1.67735991 1.04790391 0.37316334 0.22073847 0.18538758 0.14376681 [8] 0.00059177 ---------------------------------------------------------- bushfire 38 5 5 18661.452428 323.510706 Scores: PC1 PC2 PC3 PC4 PC5 1 -91.383 -16.17804 0.56195 -0.252428 1.261840 2 -93.033 -13.93251 -0.67212 0.042287 0.470924 3 -85.400 -10.72512 -3.09832 -1.224797 -0.504718 4 -68.381 -12.12202 -3.31950 -0.676880 -0.228383 5 -36.742 -21.04171 -1.98872 0.397655 -0.932613 6 -12.095 -30.21719 0.59595 2.100702 0.384714 7 -227.949 -71.40450 35.57308 -7.880296 -2.710415 8 -262.815 -111.81228 -11.04574 2.397832 -13.646407 9 -263.767 -114.13702 -13.71407 3.131736 -13.825200 10 -264.312 -90.69643 9.72320 0.967173 -8.800150 11 -266.681 -72.85993 16.55010 0.291092 -8.373583 12 -274.050 -18.41395 20.74273 -2.464589 -1.505967 13 -218.299 19.16040 7.69765 0.069012 0.054846 14 29.646 10.52526 -7.50754 0.855493 1.966680 15 159.575 3.86633 -6.95837 -2.753953 0.616068 16 114.286 2.47164 0.62690 -3.146317 -0.501623 17 111.289 3.45086 1.97182 -0.303064 -0.094416 18 99.626 -1.80416 4.88197 -0.013096 -1.438397 19 103.353 -3.50426 3.58993 1.578169 -1.317194 20 113.769 0.84544 3.28254 2.204926 0.131167 21 95.186 3.50703 4.97153 0.916181 0.351658 22 86.996 4.00938 2.95209 1.281788 1.920404 23 -44.232 8.50898 6.30689 -1.038871 0.400078 24 -99.527 13.81377 1.75130 -0.260669 0.394804 25 -34.855 5.99709 -0.57224 -1.660513 -0.620158 26 -41.265 2.94659 -1.04825 -2.243950 -0.440017 27 -56.148 10.14428 -5.41858 0.321752 -0.608412 28 -32.366 20.27795 -8.60687 3.806572 -1.267249 29 -22.438 34.73585 -11.19123 8.296154 -0.511610 30 -79.035 37.05713 -1.51591 9.892959 -1.618635 31 49.465 39.37414 5.95714 22.874813 -1.883481 32 304.825 30.19205 37.68900 45.175923 -1.293939 33 341.237 7.04985 65.43451 44.553009 -3.148116 34 337.467 6.16879 66.48222 43.278480 -3.688631 35 342.929 7.38548 66.91291 43.941556 -1.937887 36 340.143 6.70203 67.85433 42.479161 -3.873639 37 337.931 7.43184 70.50828 42.333220 -2.645830 38 339.281 8.07267 71.34405 42.400459 -2.392774 ------------- Call: PcaCov(x = x) Standard deviations: [1] 136.6069 17.9864 6.2944 2.3373 1.3045 ---------------------------------------------------------- ========================================================== > dodata(method="grid") Call: dodata(method = "grid") Data Set n p k e1 e2 ========================================================== heart 12 2 2 516.143549 23.932102 Scores: PC1 PC2 [1,] 6.4694 3.8179 [2,] 61.7387 19.1814 [3,] 1.4722 -1.0161 [4,] -3.8056 1.5127 [5,] 18.6760 5.3303 [6,] -16.8411 1.7900 [7,] 4.9962 4.1638 [8,] -26.8665 -13.3010 [9,] -1.0648 -1.2690 [10,] -25.7734 -12.4037 [11,] -13.3987 -4.0751 [12,] 46.7700 15.1272 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 22.719 4.892 ---------------------------------------------------------- starsCYG 47 2 2 0.473800 0.026486 Scores: PC1 PC2 [1,] 0.181489 -0.0300854 [2,] 0.695337 0.1492475 [3,] -0.120738 -0.1338110 [4,] 0.695337 0.1492475 [5,] 0.140039 -0.0992368 [6,] 0.413314 0.0551030 [7,] -0.409428 -0.5478860 [8,] 0.225647 0.1690378 [9,] 0.519123 -0.1471454 [10,] 0.071513 -0.0277935 [11,] 0.663045 -0.9203119 [12,] 0.402691 0.0253179 [13,] 0.373739 0.0759321 [14,] -1.005756 -0.3654219 [15,] -0.789968 -0.0898580 [16,] -0.467328 0.0334465 [17,] -1.111148 -0.1431778 [18,] -0.867242 0.0417806 [19,] -0.871200 -0.1481782 [20,] 0.823011 -0.9236455 [21,] -0.669994 -0.0923582 [22,] -0.829959 -0.0890246 [23,] -0.627294 0.0367802 [24,] -0.195929 0.0978059 [25,] -0.028257 -0.0157122 [26,] -0.387346 0.0317797 [27,] -0.390054 -0.0981920 [28,] -0.148231 -0.0132120 [29,] -0.661454 -0.1625514 [30,] 0.982767 -0.9369769 [31,] -0.628127 -0.0032112 [32,] 0.055476 0.1625819 [33,] 0.173158 0.0501056 [34,] 1.222924 -0.9319795 [35,] -0.711235 -0.1515118 [36,] 0.576613 0.2117347 [37,] 0.054851 0.1325884 [38,] 0.173158 0.0501056 [39,] 0.134833 0.1309216 [40,] 0.522665 0.0228177 [41,] -0.428171 -0.0073782 [42,] 0.013192 0.0534392 [43,] 0.294173 0.0975945 [44,] 0.293132 0.0476054 [45,] 0.495172 0.1434167 [46,] -0.066790 0.0551060 [47,] -0.547311 0.0351134 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 0.68833 0.16275 ---------------------------------------------------------- phosphor 18 2 2 392.155327 50.657228 Scores: PC1 PC2 1 5.6537 -15.2305 2 -21.2150 -1.8862 3 -23.5966 2.3112 4 -11.2742 -6.6000 5 -18.4067 1.5202 6 16.9795 -19.4039 7 1.5964 -3.1666 8 -9.7354 3.2429 9 -10.8594 5.4759 10 15.5585 -6.5279 11 -4.0058 1.2905 12 9.4815 8.2139 13 13.0640 6.4346 14 7.0230 7.7600 15 18.4378 3.7658 16 -8.9047 -6.3253 17 21.8748 6.1900 18 16.9843 12.0801 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 19.8029 7.1174 ---------------------------------------------------------- stackloss 21 3 3 109.445054 16.741203 Scores: PC1 PC2 PC3 [1,] 15.136434 14.82909 -2.0387704 [2,] 14.393636 15.46816 -1.8391595 [3,] 12.351209 10.12290 -2.3458098 [4,] 2.510036 2.07589 1.8251581 [5,] 1.767140 1.78527 -0.0088651 [6,] 2.138588 1.93058 0.9081465 [7,] 6.966825 -1.75851 0.6274924 [8,] 6.966825 -1.75851 0.6274924 [9,] -0.089513 -1.09062 2.2894224 [10,] -7.146340 2.65628 -0.8983590 [11,] -0.461157 -3.09532 -2.6948576 [12,] -1.575403 -2.60157 -3.4122582 [13,] -5.660744 1.37815 -1.2975809 [14,] 2.881484 -5.50628 -2.5762898 [15,] -4.917360 -9.13772 0.0676942 [16,] -7.145755 -7.22052 0.6665270 [17,] -17.173481 1.87173 4.3780920 [18,] -11.973894 -2.60174 2.9808153 [19,] -10.859648 -3.09549 3.6982160 [20,] -6.031899 0.15817 1.2270803 [21,] 8.451640 4.98077 -5.4038839 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 10.4616 4.0916 2.8271 ---------------------------------------------------------- salinity 28 3 3 14.911546 8.034974 Scores: PC1 PC2 PC3 1 -2.72400 0.79288 0.688038 2 -3.45684 0.86162 1.941690 3 -5.73471 -4.79507 0.129202 4 -6.17045 -3.04372 -0.352797 5 -4.72453 -5.59543 4.144851 6 -5.75447 -1.07062 0.579975 7 -4.40759 0.47731 0.680203 8 -2.76360 2.30716 0.540271 9 -0.28782 -1.40644 -2.373399 10 2.64361 -1.43362 -0.266957 11 1.91078 -1.66975 1.312215 12 -0.40661 0.68573 -0.200135 13 -0.14911 1.88993 0.044001 14 1.99005 2.43874 1.373229 15 2.88128 -2.21263 -0.863674 16 -0.12935 -8.28831 6.483875 17 -0.16895 -1.68742 0.905190 18 -3.08054 0.23753 -0.269165 19 -0.38685 -1.08501 -2.736860 20 1.45520 -0.33209 -1.686406 21 1.13834 2.53553 -0.381657 22 2.48522 3.42927 0.417050 23 4.56487 -3.36542 0.711908 24 2.94072 -3.08490 1.556939 25 0.82140 -0.26895 -0.406490 26 1.17794 1.61119 -0.863764 27 2.02965 2.80707 -0.489050 28 2.98039 3.21462 0.747622 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 3.86155 2.83460 0.95394 ---------------------------------------------------------- hbk 75 3 3 3.714805 3.187126 Scores: PC1 PC2 PC3 1 8.423138 24.765818 19.413334 2 7.823138 25.295092 20.356662 3 9.023138 27.411905 20.218454 4 8.223138 28.010236 21.568269 5 8.623138 27.442650 21.123471 6 9.123138 25.601873 20.279943 7 8.823138 25.463855 20.770811 8 8.223138 25.264348 19.451646 9 8.023138 27.373593 20.716984 10 7.623138 26.752275 19.666288 11 9.323138 31.108975 24.313778 12 10.323138 33.179719 23.469966 13 10.323138 29.958667 26.231274 14 9.323138 29.345676 34.207755 15 1.723138 -0.077538 0.754886 16 1.423138 -1.818609 -0.080979 17 -1.676862 -1.872341 -0.686878 18 0.623138 -0.077633 -0.548955 19 -0.876862 -0.576068 0.716574 20 1.423138 -0.016144 1.261078 21 0.923138 -0.223313 0.041619 22 -1.276862 -0.299937 1.038679 23 0.323138 -1.327742 0.057038 24 -0.376862 -1.626860 0.034051 25 -0.676862 -1.550331 -2.266849 26 -0.776862 0.290637 1.184359 27 1.623138 0.750760 0.417361 28 0.123138 -0.016334 -1.346603 29 -0.476862 -1.220468 -1.338846 30 -0.476862 1.387213 -1.339036 31 1.423138 -1.059368 -0.824991 32 -1.176862 -1.833934 0.118433 33 -0.176862 -0.691099 0.908323 34 -1.276862 -1.251213 -2.243862 35 1.423138 0.858128 0.325317 36 -0.576862 0.574335 0.102918 37 -1.576862 0.413330 0.892903 38 -0.176862 -1.841691 -1.085702 39 0.423138 -0.752683 -2.205550 40 -1.176862 -0.905930 -0.211430 41 1.723138 0.819721 -0.479993 42 -1.376862 0.666284 -1.093554 43 -1.576862 -1.304659 1.061761 44 0.123138 1.203126 -1.553772 45 0.223138 -1.358581 -2.151818 46 0.123138 1.003714 -1.569097 47 1.323138 -1.159169 -2.136494 48 1.423138 0.919427 -0.472331 49 1.423138 -0.246300 0.340737 50 0.423138 0.727773 0.716479 51 0.623138 -1.665267 -0.771259 52 1.623138 -0.798657 -1.607314 53 -1.376862 1.310494 -1.645816 54 -0.576862 -1.879908 0.716669 55 -1.176862 -1.235698 0.164407 56 0.123138 -1.296997 0.962055 57 0.123138 -1.304849 -1.545920 58 0.723138 -0.714086 1.207441 59 -0.076862 0.881115 0.026199 60 -1.376862 1.226208 -0.549050 61 -1.276862 0.781504 1.322377 62 -0.776862 -1.657699 -2.174806 63 -0.576862 -1.956627 0.409888 64 1.123138 0.712448 0.915891 65 0.323138 0.689271 -1.392672 66 -1.476862 -1.289430 -0.441492 67 -0.076862 -0.905930 -0.211430 68 -1.576862 -0.852389 -2.213213 69 0.323138 -1.696011 -1.676276 70 -0.676862 0.773747 0.118243 71 0.523138 0.152524 0.371386 72 -1.076862 -0.606812 -0.188443 73 -1.376862 0.114117 -0.433924 74 -1.676862 -0.522431 0.018632 75 -1.376862 0.612552 -1.699453 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 1.9274 1.7853 1.6714 ---------------------------------------------------------- milk 86 8 8 9.206694 2.910585 Scores: PC1 PC2 PC3 PC4 PC5 PC6 [1,] 6.090978 0.590424 1.1644466 -0.3835606 1.0342867 -0.4752288 [2,] 6.903009 -0.575027 0.8613622 -1.1221795 0.7221616 -1.3097951 [3,] 0.622903 -1.594239 1.2122863 -0.0555128 0.3252629 -0.2799581 [4,] 5.282665 -1.815742 2.2543268 0.9824543 -0.5345577 -0.7331037 [5,] -1.039753 0.663906 0.3353811 0.3070599 -0.3224317 -0.4056666 [6,] 2.247786 0.218255 -0.3382923 0.1270005 -0.0271307 -0.2035021 [7,] 2.784293 -0.291678 -0.4897587 0.0198481 0.0752345 -0.5986846 [8,] 2.942266 0.315608 0.1603961 0.3568462 -0.0647311 -0.5316127 [9,] -1.420086 -1.751212 1.7027572 0.0708340 -0.9226517 0.0738411 [10,] -2.921113 -0.727554 0.0113966 -0.3915037 -0.0772913 0.6062573 [11,] -9.568075 0.792291 1.0217507 0.2554182 -0.6254883 0.8899897 [12,] -12.885166 3.423607 -1.2579351 -0.4300397 -0.4094558 1.1727128 [13,] -10.038470 1.274931 -2.6913262 -1.6219658 -0.3284974 1.1228303 [14,] -12.044003 2.096254 -1.2859668 -0.9602250 -0.7937418 0.8264019 [15,] -10.798341 1.159257 1.4870766 0.3248231 -1.0787537 0.8723637 [16,] -2.841629 0.500846 0.4771762 0.5975365 0.3197882 0.5804087 [17,] -1.150691 -1.978038 2.3229313 0.5275273 -0.5339514 0.5421631 [18,] -1.992369 1.131288 -0.8385615 0.1156462 0.2253010 -0.3393814 [19,] -1.999699 -0.252876 1.2229972 0.5081648 0.0082612 0.3373454 [20,] 0.091385 -1.439422 1.1836134 0.6297789 0.0961407 -0.2126653 [21,] -2.571346 2.280701 -1.2845660 0.1463583 0.0949331 0.0902039 [22,] -0.990078 1.087033 -0.1638640 -0.0351472 0.0743205 -0.0040605 [23,] -0.010631 1.704171 0.0038808 0.5765418 0.6086460 0.0329995 [24,] -0.440350 1.500798 0.2769870 0.5556999 0.4751445 0.6516120 [25,] -3.578249 2.672783 -0.3534268 0.7398104 0.1108289 0.2704730 [26,] -0.854914 1.626684 0.2301131 0.5530224 0.0662862 -0.0999969 [27,] -3.175381 0.762609 0.5101987 0.0849002 -0.2137237 0.2729808 [28,] 2.599844 3.370137 -0.5174736 0.7409946 0.6853156 0.2430943 [29,] 4.395534 0.823611 0.1610152 0.8184845 0.7665555 0.0779724 [30,] 0.843794 1.438263 -0.2366601 0.4600650 0.3424806 -0.1768083 [31,] 1.890815 1.266935 -1.8218143 -0.3909337 0.8390127 0.1026821 [32,] 1.300145 -0.085976 -0.8965312 -0.8855787 0.4156780 0.1478055 [33,] 1.923087 0.137638 0.3487435 0.2958367 0.4245932 0.1566678 [34,] 0.615762 -0.390711 0.8107376 0.0295536 -0.1169590 0.2940241 [35,] -0.372946 2.037079 -0.7663299 0.1907237 0.6959350 0.5366205 [36,] 4.068134 1.129044 0.5492962 0.7640964 0.4799859 -0.4080205 [37,] 0.937617 2.048258 -1.2326566 -0.0942856 0.7885267 -0.1004018 [38,] 2.141223 1.877022 -0.5178216 0.3750868 0.4767003 0.1240656 [39,] -1.403505 1.327163 0.3165610 0.3989824 0.3505825 0.5915956 [40,] 3.337528 -1.689495 1.4737175 0.2584843 0.4308444 -0.0810597 [41,] 3.938506 1.384908 0.8103687 -0.5875595 1.1616535 -0.6492603 [42,] 6.327471 -1.061362 1.9861187 1.1016484 0.3512405 -0.1540592 [43,] 3.120160 -0.064108 -0.8370717 -0.2229341 0.5623447 -0.7152184 [44,] 5.290520 -0.669008 0.8597130 0.5518503 0.2470856 0.6454703 [45,] 0.058291 0.356399 -0.1896007 0.2427518 0.3705541 0.3975085 [46,] 0.150881 1.942057 -0.1140726 0.5656469 0.5227623 0.2151825 [47,] 2.870881 -1.446283 -2.8450062 -1.7292144 -0.0888429 -0.1347003 [48,] 0.335593 0.500884 -1.3154520 -0.3874864 0.3449038 0.5387692 [49,] -2.179494 -0.021237 -1.7792344 -0.8445930 0.4435338 0.6547961 [50,] 2.968304 -2.588546 1.8552104 0.4590101 -0.1755089 -0.0550378 [51,] -1.399208 -0.820296 -1.3660014 -0.8890243 -0.2344105 0.1236943 [52,] -5.112989 0.318983 -1.3852993 -0.8461529 -0.3467685 0.7349666 [53,] -0.773103 -0.267333 -0.8154896 -0.3783062 0.0113880 -0.3304648 [54,] -0.244565 -0.066211 -0.2541557 0.0043037 0.0390890 0.0074067 [55,] 0.894921 0.516411 -0.4443369 0.0708354 -0.0637890 -0.2799646 [56,] -0.038706 -0.588256 0.3166588 -0.0196663 -0.1793472 -0.1179341 [57,] -1.377469 0.428939 0.7502430 0.1458375 -0.3818977 -0.0380258 [58,] 0.042787 1.488605 0.0252606 0.6377516 -0.1524172 -0.1898723 [59,] -1.734357 -0.966494 -0.1026850 -0.5656888 -0.4831402 0.0308069 [60,] -1.501991 -0.544918 -0.0837127 -0.2362486 -0.5382026 -0.1351338 [61,] -0.175102 -1.339436 0.8403933 -0.0907428 -0.4846145 -0.2795153 [62,] 2.100915 -2.004702 1.3031556 -0.0041957 -0.2067776 -0.0793613 [63,] 2.735432 -0.102018 0.3215454 0.5331904 -0.1499209 -0.3536272 [64,] 2.735432 -0.102018 0.3215454 0.5331904 -0.1499209 -0.3536272 [65,] -0.665219 -2.325594 1.6287363 0.0607163 -0.6996720 0.1353325 [66,] -2.439244 -0.737375 0.0187770 -0.4561269 -0.5425315 -0.0208332 [67,] 0.121564 -1.214385 0.4877707 0.1809998 -0.1943262 0.0662506 [68,] -0.804267 -2.238327 -0.8547917 -1.3449926 -0.3577254 -0.0293779 [69,] -0.761319 -0.676391 -0.0245494 0.2262894 -0.3396872 -0.1166505 [70,] 3.385399 4.360467 -0.7946150 -0.0417895 0.4474362 -4.6626174 [71,] -2.364955 -1.257673 0.5226907 -0.2346145 -0.7838777 0.1815821 [72,] 2.334511 -0.794530 0.0175620 0.1848925 -0.3437761 -0.4522442 [73,] -2.023440 -2.449907 0.2525041 -0.6657474 -0.5509480 0.2118442 [74,] -11.180192 2.456516 1.1036540 0.8711496 -0.3833194 1.3548314 [75,] 0.058297 -2.094811 0.3075211 -0.8052760 -0.9527729 0.5850255 [76,] -1.355742 -0.464355 -1.0183333 -0.8525619 -0.1577144 -0.0767323 [77,] -8.296881 0.945092 0.8088967 -0.0071463 -0.4527530 1.0614233 [78,] 1.251696 -1.460466 0.2511701 -0.2717606 -0.3158308 -0.2964813 [79,] -0.192380 -0.662365 -0.3671703 -0.6722658 -0.1243452 -0.2388225 [80,] -3.355201 1.915096 -0.1086672 0.3560062 0.0956865 0.6974817 [81,] 1.245305 0.736787 -0.1662155 0.1309822 -0.0122872 -0.2182528 [82,] 2.679561 -1.666401 1.1576691 0.3960280 -0.0059146 0.0584136 [83,] 2.596651 -0.556654 -0.0807307 -0.4468501 0.0964927 -0.3922894 [84,] 0.959377 -0.272038 -1.5879803 -1.1153057 0.3412508 -0.1281556 [85,] 0.602737 -1.384591 2.8844745 0.9479144 -0.7946454 -0.2014038 [86,] 0.698125 0.335743 -1.5248055 -0.4443037 0.0768256 -0.1999790 PC7 PC8 [1,] 0.9281777 -0.05158594 [2,] 0.8397946 -0.04276628 [3,] -0.5189230 0.04913688 [4,] -0.0178377 0.01578074 [5,] -0.0129237 0.01056305 [6,] -0.0764270 0.01469518 [7,] -0.3059779 0.04237267 [8,] -0.0684673 0.02289928 [9,] -0.2549733 -0.00832119 [10,] -0.0578118 -0.01894694 [11,] 0.0415545 -0.03474479 [12,] 0.0869267 -0.04485633 [13,] -0.2843977 -0.03100709 [14,] -0.3375083 -0.02155574 [15,] -0.1718828 -0.02996980 [16,] -0.4176728 0.03232381 [17,] -0.5923252 0.01765700 [18,] -0.3190679 0.04476532 [19,] -0.0279426 -0.00236626 [20,] 0.1299811 0.00586022 [21,] 0.0474059 0.00563264 [22,] -0.1240299 0.01123557 [23,] 0.2232631 0.00551065 [24,] 0.0122404 0.00060079 [25,] 0.2627442 -0.00824800 [26,] 0.2257329 -0.00440907 [27,] -0.8496967 0.05266701 [28,] 0.3473502 -0.00500580 [29,] 0.4172329 -0.00542705 [30,] 0.2773880 -0.00014648 [31,] -0.1224270 0.02372808 [32,] -0.2224748 0.00757892 [33,] -0.0633903 0.01236118 [34,] -0.2616599 0.00561781 [35,] -0.1671986 0.01988458 [36,] 0.4502086 -0.00418541 [37,] -0.0773232 0.02768282 [38,] 0.0464683 0.01134849 [39,] -0.0927182 0.00555823 [40,] -0.2162796 0.02467605 [41,] 0.9440753 -0.04806541 [42,] -0.0078920 0.02022925 [43,] 0.1152244 0.02074199 [44,] 1.0406693 -0.08815111 [45,] -0.1376804 0.01424369 [46,] 0.1673461 0.00442877 [47,] -0.4125225 0.01038694 [48,] 0.1556289 -0.02103354 [49,] 0.0434415 -0.01782739 [50,] 0.2518610 -0.02154540 [51,] -0.1186185 -0.00881133 [52,] 0.1507435 -0.04523343 [53,] 0.2161208 -0.00967982 [54,] 0.1374909 -0.00783970 [55,] 0.2417108 -0.00895268 [56,] 0.1253846 -0.01188643 [57,] 0.1390898 -0.01831232 [58,] 0.2219634 -0.00364174 [59,] -0.2045636 -0.00589047 [60,] -0.3679942 0.01673699 [61,] -0.0705611 -0.00273407 [62,] 0.1447701 -0.02026768 [63,] -0.1854788 0.02686899 [64,] -0.1854788 0.02686899 [65,] -0.2626650 -0.00376657 [66,] -0.3044266 0.00484197 [67,] -0.1358811 0.00605789 [68,] -0.0551482 -0.02379410 [69,] -0.0914891 0.00812122 [70,] 10.2524854 -0.64367029 [71,] -0.1326972 -0.01666774 [72,] 0.0051905 0.00656777 [73,] -0.8236843 0.03367265 [74,] 0.2140104 -0.04092219 [75,] -0.5684260 -0.00987116 [76,] -0.1225779 -0.00204629 [77,] -0.4235612 -0.00450631 [78,] -0.1935155 0.00973901 [79,] -0.1615883 0.00518643 [80,] 0.2915052 -0.02960159 [81,] 0.0908823 0.00038216 [82,] -0.3392789 0.02605374 [83,] 0.1112141 -0.00629308 [84,] 0.0510771 -0.00845572 [85,] 0.0748700 -0.01174487 [86,] 0.2488127 -0.01446339 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 3.034253 1.706044 1.167717 0.670864 0.536071 0.396285 0.266625 0.020768 ---------------------------------------------------------- bushfire 38 5 5 38232.614428 1580.825276 Scores: PC1 PC2 PC3 PC4 PC5 [1,] -67.120 -23.70481 -1.06551 1.129721 1.311630 [2,] -69.058 -21.42113 -1.54798 0.983735 0.430774 [3,] -61.939 -17.23665 -3.81386 -0.635074 -0.600149 [4,] -44.952 -16.53458 -5.16114 0.411753 -0.390518 [5,] -12.644 -21.62271 -7.14146 3.519877 -1.211923 [6,] 12.820 -27.86930 -7.66114 7.230422 0.040330 [7,] -194.634 -100.67730 27.43084 -0.026242 -0.134248 [8,] -229.349 -129.75912 -19.46346 25.591651 -18.592601 [9,] -230.306 -131.28743 -22.22175 27.251157 -19.214683 [10,] -231.118 -115.10815 3.70208 16.303210 -10.573515 [11,] -234.540 -100.24984 13.67112 10.325539 -8.727961 [12,] -246.507 -51.03515 27.61698 -5.352226 0.514087 [13,] -195.712 -5.81324 20.04485 -9.226807 1.721886 [14,] 49.881 16.90911 -9.97400 -1.900739 2.190429 [15,] 179.545 23.96999 -18.71166 -2.987136 1.332713 [16,] 135.356 15.81282 -9.24353 -4.703584 0.971669 [17,] 132.350 16.65014 -7.01838 -2.428578 1.346198 [18,] 121.499 9.75832 -4.45699 -1.587450 0.131923 [19,] 125.222 9.17601 -5.88919 0.582516 -0.061642 [20,] 135.112 14.63812 -5.90351 0.411704 1.460488 [21,] 116.581 14.47390 -3.04021 -1.842579 2.005998 [22,] 108.223 14.62103 -4.47428 -1.196993 3.288463 [23,] -22.095 3.26439 6.58391 -6.164581 2.125258 [24,] -77.831 3.46616 6.59280 -6.373595 1.545789 [25,] -13.092 3.41344 -0.99296 -5.076733 0.299636 [26,] -19.206 -0.17007 -1.84209 -4.858675 0.347945 [27,] -35.022 6.54155 -3.12767 -3.556587 -0.327873 [28,] -12.651 20.14894 -4.61607 -2.025539 -1.214190 [29,] -4.404 36.39823 -3.81590 -0.633155 -0.602027 [30,] -60.018 30.40980 9.44610 -1.763156 -0.765133 [31,] 67.689 47.40087 12.70229 9.791794 -0.671751 [32,] 324.134 63.46147 31.52512 30.099817 2.406344 [33,] 364.639 38.84260 51.20467 30.648590 3.218678 [34,] 361.089 37.09494 52.00522 29.394356 2.861158 [35,] 366.403 38.88889 52.31879 29.878844 4.650618 [36,] 363.821 37.40859 53.10394 28.286557 2.922632 [37,] 361.761 37.21276 55.73012 27.648760 4.477279 [38,] 363.106 37.78395 56.56345 27.460078 4.845396 ------------- Call: PcaGrid(x = x) Standard deviations: [1] 195.5316 39.7596 11.7329 7.3743 1.7656 ---------------------------------------------------------- ========================================================== > > ## IGNORE_RDIFF_BEGIN > dodata(method="proj") Call: dodata(method = "proj") Data Set n p k e1 e2 ========================================================== heart 12 2 2 512.772467 29.052346 Scores: PC1 PC2 [1,] 6.7568 3.2826 [2,] 63.0869 14.1293 [3,] 1.3852 -1.1318 [4,] -3.6709 1.8153 [5,] 19.0457 3.8035 [6,] -16.6413 3.1452 [7,] 5.3163 3.7464 [8,] -27.8536 -11.0863 [9,] -1.1638 -1.1788 [10,] -26.6915 -10.2803 [11,] -13.6842 -2.9790 [12,] 47.8395 11.2980 ------------- Call: PcaProj(x = x) Standard deviations: [1] 22.644 5.390 ---------------------------------------------------------- starsCYG 47 2 2 0.470874 0.024681 Scores: PC1 PC2 [1,] 0.181333 -3.1013e-02 [2,] 0.696091 1.4569e-01 [3,] -0.121421 -1.3319e-01 [4,] 0.696091 1.4569e-01 [5,] 0.139530 -9.9951e-02 [6,] 0.413590 5.2989e-02 [7,] -0.412224 -5.4579e-01 [8,] 0.226508 1.6788e-01 [9,] 0.518364 -1.4980e-01 [10,] 0.071370 -2.8159e-02 [11,] 0.658332 -9.2369e-01 [12,] 0.402815 2.3259e-02 [13,] 0.374123 7.4020e-02 [14,] -1.007611 -3.6028e-01 [15,] -0.790417 -8.5818e-02 [16,] -0.467151 3.5835e-02 [17,] -1.111866 -1.3750e-01 [18,] -0.867017 4.6214e-02 [19,] -0.871946 -1.4372e-01 [20,] 0.818278 -9.2784e-01 [21,] -0.670457 -8.8932e-02 [22,] -0.830403 -8.4781e-02 [23,] -0.627097 3.9987e-02 [24,] -0.195426 9.8806e-02 [25,] -0.028337 -1.5568e-02 [26,] -0.387178 3.3760e-02 [27,] -0.390551 -9.6197e-02 [28,] -0.148297 -1.2454e-02 [29,] -0.662277 -1.5917e-01 [30,] 0.977965 -9.4199e-01 [31,] -0.628135 -7.2164e-16 [32,] 0.056306 1.6230e-01 [33,] 0.173412 4.9220e-02 [34,] 1.218143 -9.3822e-01 [35,] -0.712000 -1.4787e-01 [36,] 0.577688 2.0878e-01 [37,] 0.055528 1.3231e-01 [38,] 0.173412 4.9220e-02 [39,] 0.135501 1.3023e-01 [40,] 0.522775 2.0145e-02 [41,] -0.428203 -5.1892e-03 [42,] 0.013465 5.3371e-02 [43,] 0.294668 9.6089e-02 [44,] 0.293371 4.6106e-02 [45,] 0.495898 1.4088e-01 [46,] -0.066508 5.5447e-02 [47,] -0.547124 3.7911e-02 ------------- Call: PcaProj(x = x) Standard deviations: [1] 0.6862 0.1571 ---------------------------------------------------------- phosphor 18 2 2 388.639033 51.954664 Scores: PC1 PC2 1 5.8164 -15.1691 2 -21.1936 -2.1132 3 -23.6199 2.0585 4 -11.2029 -6.7203 5 -18.4220 1.3231 6 17.1862 -19.2211 7 1.6302 -3.1493 8 -9.7695 3.1385 9 -10.9174 5.3594 10 15.6275 -6.3610 11 -4.0194 1.2476 12 9.3931 8.3149 13 12.9944 6.5741 14 6.9396 7.8348 15 18.3964 3.9629 16 -8.8365 -6.4202 17 21.8073 6.4237 18 16.8541 12.2611 ------------- Call: PcaProj(x = x) Standard deviations: [1] 19.714 7.208 ---------------------------------------------------------- stackloss 21 3 3 97.347030 38.052774 Scores: PC1 PC2 PC3 [1,] 19.08066 -9.06092 -2.64544 [2,] 18.55152 -9.90152 -2.76118 [3,] 15.04269 -5.37517 -2.31373 [4,] 2.79667 -1.78925 1.70823 [5,] 2.21768 -1.17513 -0.10495 [6,] 2.50717 -1.48219 0.80164 [7,] 5.97151 3.25438 2.40268 [8,] 5.97151 3.25438 2.40268 [9,] -0.68332 0.30263 2.42495 [10,] -5.83478 -4.04630 -2.91819 [11,] -1.07253 3.51914 -1.87651 [12,] -1.89116 2.98559 -2.89885 [13,] -4.77650 -2.36509 -2.68671 [14,] 1.33353 6.57450 -0.50696 [15,] -7.45351 7.08878 1.37012 [16,] -9.04093 4.56697 1.02289 [17,] -16.15938 -7.50855 0.30909 [18,] -12.45541 -1.62432 1.11929 [19,] -11.63677 -1.09077 2.14162 [20,] -5.79275 -2.08680 -0.06187 [21,] 10.13623 -0.76824 -4.70180 ------------- Call: PcaProj(x = x) Standard deviations: [1] 9.8665 6.1687 3.2669 ---------------------------------------------------------- salinity 28 3 3 12.120566 8.431549 Scores: PC1 PC2 PC3 1 -2.52547 1.45945 -1.1943e-01 2 -3.32298 2.15704 8.7594e-01 3 -6.64947 -3.26398 1.0135e+00 4 -6.64427 -1.81382 -1.6392e-01 5 -6.16898 -2.52222 5.1373e+00 6 -5.87594 0.26440 -2.4425e-15 7 -4.23084 1.46250 -2.8008e-01 8 -2.21502 2.76478 -8.3789e-01 9 -0.40186 -2.17785 -1.6702e+00 10 2.27089 -1.84923 7.3391e-01 11 1.37935 -1.29276 2.1418e+00 12 -0.22635 0.60372 -5.0980e-01 13 0.27224 1.73920 -7.0505e-01 14 2.36592 2.40462 6.4320e-01 15 2.37640 -2.83174 5.2669e-01 16 -2.49175 -4.77664 9.0404e+00 17 -0.61250 -1.11672 1.4398e+00 18 -2.91853 0.63310 -8.3666e-01 19 -0.39732 -2.02029 -2.1396e+00 20 1.47554 -1.23407 -1.1712e+00 21 1.70104 1.92401 -1.1292e+00 22 3.14437 2.81928 -5.2415e-01 23 3.62890 -3.51450 2.6740e+00 24 2.04538 -2.63992 3.0718e+00 25 0.77088 -0.54783 -1.3370e-01 26 1.57254 0.89176 -1.2089e+00 27 2.63610 1.97075 -1.1855e+00 28 3.55112 2.67606 -6.0915e-02 ------------- Call: PcaProj(x = x) Standard deviations: [1] 3.4815 2.9037 1.3810 ---------------------------------------------------------- hbk 75 3 3 3.801978 3.574192 Scores: PC1 PC2 PC3 1 28.747049 15.134042 2.3959241 2 29.021724 16.318941 2.6207988 3 31.271908 15.869319 3.4420860 4 31.586189 17.508798 3.6246706 5 31.299168 16.838093 3.2402573 6 30.037754 15.591930 2.1421166 7 29.888160 16.139376 1.9750096 8 28.994463 15.350167 2.8226275 9 30.758047 16.820526 3.7269602 10 29.759314 16.079531 4.0486097 11 35.301371 19.637962 3.7433562 12 37.193371 18.709303 4.9915250 13 35.634808 20.497713 1.4740727 14 36.816439 27.523024 -2.3006796 15 1.237203 -0.331072 -1.3801401 16 -0.451166 -1.118847 -1.9707479 17 -2.604733 0.067276 0.0130015 18 0.179177 -0.804398 -0.1285240 19 -0.765512 0.982349 -0.2513990 20 1.236727 0.259123 -1.4210070 21 0.428326 -0.503724 -0.6830690 22 -0.724774 1.507943 -0.0022175 23 -0.745349 -0.330094 -1.0982084 24 -1.407850 -0.011831 -0.8987075 25 -2.190427 -1.732051 0.4497793 26 0.058631 1.444044 0.0446166 27 1.680557 -0.429402 -0.6031146 28 -0.315122 -1.179169 0.5822607 29 -1.563355 -1.026914 0.1040012 30 0.329957 -0.633156 1.8533795 31 -0.110108 -1.617131 -1.0958807 32 -2.035875 0.463421 -0.6346632 33 -0.356033 0.740564 -0.8116369 34 -2.342887 -1.340168 0.9724491 35 1.607131 -0.379763 -0.3747630 36 0.084455 0.486671 0.6551654 37 -0.436144 1.659467 0.7145344 38 -1.754819 -1.076076 -0.6037590 39 -0.904375 -2.161949 0.3436723 40 -1.455274 0.331839 0.1499308 41 1.539788 -1.212921 -0.1715110 42 -0.688338 -0.048173 1.7491184 43 -1.635822 1.539067 -0.5208916 44 0.511762 -1.165641 1.5020865 45 -1.454500 -2.099954 0.0219268 46 0.362645 -1.208389 1.3758464 47 -0.615800 -2.658098 -0.4629006 48 1.426278 -1.027667 0.0582638 49 0.809592 -0.533893 -1.1232120 50 0.996105 0.469082 -0.0988805 51 -1.036368 -1.227376 -1.0843166 52 -0.016464 -2.331540 -0.6477169 53 -0.376625 -0.405855 2.4526088 54 -1.524100 0.621590 -1.2927429 55 -1.588523 0.591668 -0.2559428 56 -0.592710 0.529426 -1.4111404 57 -1.306991 -1.538024 -0.1841717 58 0.275991 0.491888 -1.4739863 59 0.598971 0.196673 0.6208960 60 -0.127953 0.485014 1.8571970 61 0.140584 1.905037 0.5838465 62 -2.305069 -1.617811 0.3880825 63 -1.666479 0.357251 -1.1934779 64 1.480143 0.248671 -0.5959984 65 0.309561 -1.219790 0.9671263 66 -1.986789 0.248245 0.1723620 67 -0.765691 -0.269054 -0.4611368 68 -2.232721 -1.090790 1.3915841 69 -1.502453 -1.813763 -0.4936268 70 0.170883 0.584046 0.8369571 71 0.543623 0.043244 -0.3707674 72 -1.168908 0.341335 0.2837393 73 -0.902885 0.411872 1.0546196 74 -1.425273 0.852445 0.5719123 75 -0.898536 -0.555475 2.0107684 ------------- Call: PcaProj(x = x) Standard deviations: [1] 1.9499 1.8906 1.2797 ---------------------------------------------------------- milk 86 8 8 8.369408 3.530461 Scores: PC1 PC2 PC3 PC4 PC5 PC6 [1,] 6.337004 -0.245000 0.7704092 -4.9848e-01 -1.6599e-01 1.1763e-01 [2,] 7.021899 1.030349 0.2832977 -1.2673e+00 -8.7296e-01 2.0547e-01 [3,] 0.600831 1.686247 0.9682032 -3.2663e-02 7.4112e-02 4.7412e-01 [4,] 5.206465 2.665956 1.5942253 9.8285e-01 -5.4159e-01 -2.0155e-01 [5,] -0.955757 -0.579889 0.3206393 5.1174e-01 -6.1684e-01 -3.8990e-02 [6,] 2.198695 0.073770 -0.5712493 1.9440e-01 -1.0237e-01 4.1825e-02 [7,] 2.695361 0.644049 -0.8645373 8.1894e-02 -2.6953e-01 1.6884e-01 [8,] 2.945361 0.137227 -0.2071463 5.0841e-01 -4.2075e-01 5.8589e-02 [9,] -1.539013 1.879894 1.6952390 1.6792e-01 -2.8195e-01 5.0563e-02 [10,] -2.977110 0.319666 0.3515636 -5.2496e-01 4.6898e-01 8.5978e-03 [11,] -9.375355 -1.638105 1.9026171 4.1237e-01 1.8768e-02 -1.8546e-01 [12,] -12.602600 -4.715888 0.0273004 -4.7798e-02 -1.2246e-02 9.6858e-03 [13,] -10.114331 -2.487462 -1.6331544 -1.5139e+00 4.1903e-01 2.8313e-01 [14,] -11.949336 -3.190157 -0.2146943 -5.0060e-01 -2.9537e-01 3.2160e-01 [15,] -10.595396 -1.905517 2.3716887 7.6651e-01 -3.3531e-01 1.9933e-02 [16,] -2.735720 -0.748282 0.6750464 7.2415e-01 5.5304e-01 2.2283e-01 [17,] -1.248116 2.131195 2.2596886 6.4958e-01 3.5634e-01 2.9021e-01 [18,] -1.904210 -1.285804 -0.7746460 3.0198e-01 -2.7407e-01 1.7500e-01 [19,] -1.902313 0.095461 1.3824711 5.0369e-01 2.2193e-01 -5.5628e-02 [20,] 0.123220 1.399444 1.1517634 3.2546e-01 7.8261e-02 -4.0733e-01 [21,] -2.436023 -2.524827 -1.0197416 3.4819e-01 -1.4914e-01 -4.3669e-02 [22,] -0.904931 -1.114894 -0.1235807 2.0285e-01 -1.6200e-01 2.5681e-01 [23,] 0.220231 -1.767325 0.0482262 6.4418e-01 9.8618e-02 -5.7683e-02 [24,] -0.274403 -1.561826 0.3820323 7.0016e-01 5.5220e-01 1.4376e-01 [25,] -3.306400 -2.980247 0.0252488 9.4001e-01 -1.0841e-01 -2.5303e-01 [26,] -0.658015 -1.625199 0.3021005 7.2702e-01 -3.0299e-01 -1.2339e-01 [27,] -3.137066 -0.774218 0.5577497 6.4188e-01 -8.0125e-02 7.7819e-01 [28,] 2.867950 -3.099435 -0.6435415 1.0366e+00 1.5908e-01 7.6524e-02 [29,] 4.523097 -0.527338 -0.1032516 6.4537e-01 4.7286e-01 -2.7166e-01 [30,] 1.002381 -1.376693 -0.2735956 5.0522e-01 -1.2750e-01 -1.6178e-01 [31,] 1.894615 -1.296202 -1.9117282 -3.8032e-01 4.6473e-01 3.1085e-01 [32,] 1.210291 0.067230 -0.9832930 -8.5379e-01 3.2823e-01 4.9994e-01 [33,] 1.964118 0.022175 0.1818518 3.0464e-01 3.5596e-01 1.4985e-01 [34,] 0.576738 0.567851 0.6982155 1.8415e-01 1.8695e-01 3.2706e-01 [35,] -0.231793 -2.143909 -0.6825523 4.0681e-01 5.4492e-01 3.6259e-01 [36,] 4.250883 -0.719760 0.2157706 7.7167e-01 -1.9064e-01 -2.0611e-01 [37,] 1.077364 -2.054664 -1.3064867 1.0043e-01 8.6092e-02 3.5416e-01 [38,] 2.259260 -1.653588 -0.6730692 5.7300e-01 1.6930e-01 1.6986e-01 [39,] -1.251576 -1.451593 0.4671580 5.8957e-01 4.2672e-01 2.2495e-01 [40,] 3.304245 1.998193 1.0941231 1.3734e-01 3.7012e-01 2.4142e-01 [41,] 4.286315 -1.280951 0.5856744 -6.0980e-01 -4.3090e-01 1.9801e-01 [42,] 6.343820 1.801880 1.3481119 1.0355e+00 2.9802e-01 -8.4501e-04 [43,] 3.119491 0.214077 -1.1216236 -3.8134e-01 -1.9523e-01 -2.6706e-02 [44,] 5.285254 0.938072 0.7440487 1.1539e-02 8.1629e-01 -7.9286e-01 [45,] 0.082429 -0.416631 -0.1588203 2.3098e-01 5.1867e-01 9.4503e-02 [46,] 0.357862 -1.951997 -0.0731829 7.0393e-01 1.8828e-01 1.5707e-02 [47,] 2.428744 1.522538 -3.0467213 -1.9114e+00 2.4638e-01 3.5871e-01 [48,] 0.282348 -0.697287 -1.1592508 -5.4929e-01 6.2199e-01 -5.4596e-02 [49,] -2.266009 -0.559548 -1.3794914 -1.1300e+00 7.8872e-01 -2.0411e-02 [50,] 2.868649 2.860857 1.6128307 6.7382e-02 2.2344e-01 -4.1484e-01 [51,] -1.596061 0.546812 -1.1779327 -1.0512e+00 1.3522e-01 -9.4865e-03 [52,] -5.186121 -1.000829 -0.7440599 -9.6302e-01 3.0732e-01 -1.7009e-01 [53,] -0.800232 0.049087 -0.6946842 -5.8284e-01 -2.1277e-01 -2.7004e-01 [54,] -0.246388 -0.030606 -0.1814302 -1.1632e-01 5.7767e-02 -1.8637e-01 [55,] 0.914315 -0.428594 -0.4919557 4.5039e-02 -2.7868e-01 -2.2140e-01 [56,] -0.061827 0.583572 0.3263056 -1.1589e-01 -1.2973e-01 -1.6518e-01 [57,] -1.295979 -0.421943 0.8410805 3.0441e-01 -3.9478e-01 -4.5233e-02 [58,] 0.174908 -1.343854 0.0115086 8.0227e-01 -3.9364e-01 -2.2918e-01 [59,] -1.869684 0.840823 0.0109543 -5.5536e-01 -1.4155e-01 1.0613e-01 [60,] -1.614271 0.557309 -0.0690787 -9.1753e-02 -3.0975e-01 1.6192e-01 [61,] -0.258192 1.434984 0.7684636 -1.1998e-01 -3.4662e-01 -4.8808e-02 [62,] 2.000275 2.204730 1.1194067 -2.3783e-01 5.9953e-02 -1.5836e-01 [63,] 2.694063 0.555482 -0.0340910 6.4470e-01 -2.2417e-01 1.9442e-02 [64,] 2.694063 0.555482 -0.0340910 6.4470e-01 -2.2417e-01 1.9442e-02 [65,] -0.822201 2.427550 1.5859438 -2.6715e-16 -1.9429e-15 1.0564e-14 [66,] -2.545586 0.605953 0.1469837 -3.5318e-01 -2.5871e-01 1.6901e-01 [67,] 0.028900 1.253717 0.4474540 5.3595e-02 1.6063e-01 -1.0980e-01 [68,] -1.086135 1.968868 -0.7220293 -1.6576e+00 6.2061e-02 -7.0998e-04 [69,] -0.836638 0.660453 0.0049966 1.3663e-01 -1.0131e-01 -2.4008e-01 [70,] 4.843092 -6.035092 0.8250084 -3.4481e+00 -4.8538e+00 -7.8407e+00 [71,] -2.500038 1.146245 0.6967314 -2.4611e-01 -1.4266e-01 -8.2996e-02 [72,] 2.220676 1.122951 -0.2444075 1.1066e-01 -3.1540e-01 -2.1344e-01 [73,] -2.310518 2.354552 0.2706503 -6.4192e-01 2.0566e-01 4.5520e-01 [74,] -10.802799 -3.462655 2.2031446 1.1326e+00 2.8049e-01 -2.9749e-01 [75,] -0.301038 2.284366 0.2440764 -6.9450e-01 2.6435e-01 4.3129e-01 [76,] -1.477936 0.245154 -0.8869850 -8.9900e-01 -9.8013e-02 1.1983e-01 [77,] -8.169236 -1.599780 1.4987144 3.7767e-01 2.4726e-01 3.8246e-01 [78,] 1.096654 1.646072 0.0591327 -3.3138e-01 -1.7936e-01 6.2716e-02 [79,] -0.289199 0.625796 -0.3974294 -6.6099e-01 -2.0857e-01 2.1190e-01 [80,] -3.160557 -2.282579 0.3255355 4.6181e-01 2.7753e-01 -1.5673e-01 [81,] 1.284356 -0.548854 -0.2907281 2.4017e-01 -2.5254e-01 -1.4289e-03 [82,] 2.562817 2.019485 0.8249162 3.2973e-01 3.3866e-01 1.3889e-01 [83,] 2.538825 0.759863 -0.3142506 -5.1028e-01 -2.0539e-01 8.8979e-02 [84,] 0.841123 0.110035 -1.5793120 -1.2807e+00 1.2332e-01 1.6224e-01 [85,] 0.636271 1.793014 2.6824860 1.0329e+00 -4.8850e-01 -2.3012e-01 [86,] 0.633183 -0.426511 -1.4791366 -6.1314e-01 -7.0534e-02 -2.3778e-01 PC7 PC8 [1,] 1.0196e-01 -1.7180e-03 [2,] 2.6131e-01 -8.5191e-03 [3,] 6.9637e-01 -8.0573e-03 [4,] -1.3548e-01 -1.4969e-03 [5,] 3.1443e-02 -2.7307e-03 [6,] -2.5079e-01 3.6450e-03 [7,] 4.5377e-02 -2.6071e-03 [8,] -1.6060e-01 -2.3761e-04 [9,] -1.5152e-01 -4.3079e-04 [10,] 9.1089e-02 1.9536e-03 [11,] 2.5654e-01 -1.4875e-03 [12,] -2.3798e-03 -1.0954e-04 [13,] -1.3687e-01 2.8402e-03 [14,] -6.5248e-02 -1.5114e-03 [15,] 3.7695e-02 -2.7827e-03 [16,] 3.8131e-01 -3.7990e-03 [17,] 4.5661e-02 -1.4965e-03 [18,] 3.9910e-01 -7.2703e-03 [19,] 2.9353e-01 -3.3342e-03 [20,] 6.0915e-01 -6.0837e-03 [21,] -1.0079e-01 1.0179e-03 [22,] -2.2945e-02 -1.0515e-03 [23,] 2.3631e-01 -2.5558e-03 [24,] -7.7207e-02 3.4800e-03 [25,] 1.4903e-02 -3.2430e-04 [26,] 3.8032e-03 -2.1705e-03 [27,] 3.7208e-02 -3.0631e-03 [28,] -4.8147e-01 6.1089e-03 [29,] -4.0388e-02 2.8549e-03 [30,] 3.4318e-02 -1.0014e-03 [31,] -2.2872e-02 1.8706e-03 [32,] -8.4542e-02 1.3368e-03 [33,] 4.5274e-02 5.3383e-04 [34,] -2.0048e-01 2.4727e-03 [35,] -5.6482e-02 2.9923e-03 [36,] -2.6046e-02 -1.2910e-03 [37,] 9.6038e-02 -1.8897e-03 [38,] -2.9035e-01 4.4317e-03 [39,] -4.6322e-03 2.4336e-03 [40,] 3.8686e-01 -3.9300e-03 [41,] 3.7834e-01 -7.8976e-03 [42,] -8.2037e-04 -4.3106e-05 [43,] 3.3467e-01 -5.2401e-03 [44,] -6.2170e-01 1.2840e-02 [45,] 5.3557e-02 2.9156e-03 [46,] 5.1785e-04 2.0738e-03 [47,] -5.2141e-01 5.7206e-03 [48,] -2.7669e-01 6.7329e-03 [49,] 8.4319e-02 3.8528e-03 [50,] 1.4210e-01 1.6961e-04 [51,] -1.1871e-01 2.6676e-03 [52,] -2.5036e-01 6.4121e-03 [53,] 2.2399e-01 -2.8200e-03 [54,] 5.6532e-02 4.9304e-04 [55,] -1.4343e-01 1.2558e-03 [56,] 4.1682e-02 -9.6490e-04 [57,] -1.3014e-01 -6.2709e-04 [58,] -2.1428e-01 8.2594e-04 [59,] -7.9775e-02 -8.9776e-04 [60,] -8.6835e-02 -1.0498e-03 [61,] 6.2470e-02 -2.7499e-03 [62,] 3.3052e-02 -3.2369e-04 [63,] -1.7137e-01 -3.1087e-04 [64,] -1.7137e-01 -3.1087e-04 [65,] 3.5496e-14 2.5975e-12 [66,] -2.2016e-02 -1.2206e-03 [67,] 8.5160e-02 -1.4837e-04 [68,] -2.2535e-03 1.9054e-04 [69,] 5.9976e-02 -8.6961e-04 [70,] 1.0448e+00 -2.0167e-02 [71,] -1.7609e-01 1.9378e-03 [72,] -1.7047e-01 2.6076e-04 [73,] 1.1885e-01 -8.1624e-04 [74,] 2.0942e-01 3.3164e-03 [75,] -7.7528e-01 9.9316e-03 [76,] -4.6285e-03 2.5153e-04 [77,] 7.0218e-02 1.5708e-03 [78,] -1.4859e-02 -6.7049e-04 [79,] 5.1054e-02 -2.0198e-03 [80,] -1.5770e-01 4.9579e-03 [81,] -1.9411e-01 4.4401e-04 [82,] 6.0634e-02 8.7960e-04 [83,] -4.4635e-02 -1.7048e-03 [84,] -2.3612e-03 -2.2242e-04 [85,] -5.5171e-02 -1.1222e-03 [86,] -1.4972e-01 1.4543e-03 ------------- Call: PcaProj(x = x) Standard deviations: [1] 2.8929930 1.8789522 0.9946460 0.7479403 0.3744197 0.2596328 0.1421387 [8] 0.0025753 ---------------------------------------------------------- bushfire 38 5 5 37473.439646 1742.633018 Scores: PC1 PC2 PC3 PC4 PC5 [1,] -67.2152 -2.3010e+01 4.4179e+00 1.0892e+00 1.7536e+00 [2,] -69.0225 -2.1417e+01 2.5382e+00 1.1092e+00 9.3919e-01 [3,] -61.6651 -1.8580e+01 -6.1022e-01 -8.1124e-01 -1.6462e-01 [4,] -44.5883 -1.8234e+01 -3.9899e-01 -5.2145e-01 2.0050e-01 [5,] -12.2941 -2.2954e+01 3.5970e+00 1.1037e+00 -2.4384e-01 [6,] 13.0282 -2.8133e+01 8.7670e+00 3.4751e+00 1.3728e+00 [7,] -199.0774 -7.7956e+01 5.4935e+01 6.3134e+00 -1.9919e+00 [8,] -228.2849 -1.3258e+02 2.2340e+01 2.1656e+01 -1.2594e+01 [9,] -228.9164 -1.3560e+02 2.0463e+01 2.2625e+01 -1.2743e+01 [10,] -232.4703 -1.0661e+02 3.5597e+01 1.7915e+01 -7.7659e+00 [11,] -236.7410 -8.8072e+01 3.6632e+01 1.5095e+01 -7.4695e+00 [12,] -249.4091 -3.6830e+01 2.4010e+01 4.7317e+00 -1.2986e+00 [13,] -197.0450 4.2633e-14 4.9738e-14 1.1657e-13 -1.1369e-13 [14,] 50.9487 1.1397e+01 -1.1247e+01 -4.8733e+00 2.4511e+00 [15,] 180.7896 1.7571e+01 -8.0454e+00 -1.0582e+01 1.2714e+00 [16,] 135.6178 1.4189e+01 -4.9116e-01 -9.2701e+00 1.4021e-01 [17,] 132.5344 1.5577e+01 2.2990e-01 -6.4963e+00 7.3370e-01 [18,] 121.3422 1.0471e+01 4.5656e+00 -4.9831e+00 -5.2314e-01 [19,] 125.2722 9.0272e+00 3.7365e+00 -3.3313e+00 -2.9097e-01 [20,] 135.2370 1.4091e+01 2.0639e+00 -3.6800e+00 1.1733e+00 [21,] 116.4250 1.5147e+01 2.9085e+00 -4.8084e+00 1.2603e+00 [22,] 108.2925 1.4223e+01 7.7165e-01 -4.5065e+00 2.7943e+00 [23,] -22.8258 6.4234e+00 2.4654e+00 -3.9627e+00 7.9847e-01 [24,] -78.1850 4.6631e+00 -3.6818e+00 -2.7688e+00 5.8508e-01 [25,] -13.0417 2.7521e+00 -3.1955e+00 -4.6824e+00 -3.1085e-01 [26,] -19.1244 -9.5045e-01 -2.6771e+00 -4.7104e+00 -1.6172e-01 [27,] -34.4379 3.2761e+00 -9.2826e+00 -2.9861e+00 -3.3561e-01 [28,] -11.5852 1.4506e+01 -1.5649e+01 -1.6260e+00 -8.5347e-01 [29,] -2.9366 2.8741e+01 -2.2907e+01 3.9749e-01 3.5861e-02 [30,] -59.7518 2.8633e+01 -1.4710e+01 3.5226e+00 -9.9066e-01 [31,] 67.8017 4.7241e+01 -9.1255e+00 1.3201e+01 1.3500e-13 [32,] 321.9941 7.6188e+01 2.2491e+01 3.1537e+01 3.2368e+00 [33,] 359.5155 6.6710e+01 5.6061e+01 3.4541e+01 2.0718e+00 [34,] 355.8007 6.5695e+01 5.7430e+01 3.3578e+01 1.4640e+00 [35,] 361.1076 6.7577e+01 5.7402e+01 3.3832e+01 3.2618e+00 [36,] 358.3592 6.6791e+01 5.8643e+01 3.2720e+01 1.2487e+00 [37,] 355.9974 6.8071e+01 6.0927e+01 3.2560e+01 2.4898e+00 [38,] 357.2530 6.9073e+01 6.1517e+01 3.2523e+01 2.7558e+00 ------------- Call: PcaProj(x = x) Standard deviations: [1] 193.5806 41.7449 16.7665 8.1585 1.6074 ---------------------------------------------------------- ========================================================== > ## IGNORE_RDIFF_END > > ## VT::14.11.2018 - commented out - on some platforms PcaHubert will choose only 1 PC > ## and will show difference > ## test.case.1() > > test.case.2() [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE > > proc.time() user system elapsed 3.23 0.68 4.00 rrcov/tests/togk4.R0000644000176200001440000000531213710030451013715 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) ## VT::14.01.2020 ## On some platforms minor differences are shown - use ## IGNORE_RDIFF_BEGIN ## IGNORE_RDIFF_END dodata <- function(nrep=1, time=FALSE, short=FALSE, full=TRUE, method = c("FASTMCD","MASS")){ domcd <- function(x, xname, nrep=1){ n <- dim(x)[1] p <- dim(x)[2] mcd<-CovOgk(x) xres <- sprintf("%3d %3d\n", dim(x)[1], dim(x)[2]) lpad<-lname-nchar(xname) cat(pad.right(xname,lpad), xres) dist <- getDistance(mcd) quantiel <- qchisq(0.975, p) ibad <- which(dist >= quantiel) names(ibad) <- NULL nbad <- length(ibad) cat("Outliers: ",nbad,"\n") if(nbad > 0) print(ibad) cat("-------------\n") show(mcd) cat("--------------------------------------------------------\n") } lname <- 20 ## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) method <- match.arg(method) data(heart) data(starsCYG) data(phosphor) data(stackloss) data(coleman) data(salinity) data(wood) data(hbk) data(Animals, package = "MASS") brain <- Animals[c(1:24, 26:25, 27:28),] data(milk) data(bushfire) tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("Data Set n p Half LOG(obj) Time\n") cat("========================================================\n") domcd(heart[, 1:2], data(heart), nrep) ## This will not work within the function, of course ## - comment it out ## IGNORE_RDIFF_BEGIN ## domcd(starsCYG,data(starsCYG), nrep) ## IGNORE_RDIFF_END domcd(data.matrix(subset(phosphor, select = -plant)), data(phosphor), nrep) domcd(stack.x,data(stackloss), nrep) domcd(data.matrix(subset(coleman, select = -Y)), data(coleman), nrep) domcd(data.matrix(subset(salinity, select = -Y)), data(salinity), nrep) ## IGNORE_RDIFF_BEGIN ## domcd(data.matrix(subset(wood, select = -y)), data(wood), nrep) ## IGNORE_RDIFF_END domcd(data.matrix(subset(hbk, select = -Y)), data(hbk), nrep) domcd(brain, "Animals", nrep) domcd(milk, data(milk), nrep) domcd(bushfire, data(bushfire), nrep) cat("========================================================\n") } pad.right <- function(z, pads) { ### Pads spaces to right of text padding <- paste(rep(" ", pads), collapse = "") paste(z, padding, sep = "") } dodata() rrcov/tests/tqda.R0000644000176200001440000000241512763517421013635 0ustar liggesusers## VT::15.09.2013 - this will render the output independent ## from the version of the package suppressPackageStartupMessages(library(rrcov)) dodata <- function(method) { options(digits = 5) set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat("===================================================\n") data(hemophilia); show(QdaCov(as.factor(gr)~., data=hemophilia, method=method)) data(anorexia, package="MASS"); show(QdaCov(Treat~., data=anorexia, method=method)) data(Pima.tr, package="MASS"); show(QdaCov(type~., data=Pima.tr, method=method)) data(iris); # show(QdaCov(Species~., data=iris, method=method)) data(crabs, package="MASS"); # show(QdaCov(sp~., data=crabs, method=method)) show(QdaClassic(as.factor(gr)~., data=hemophilia)) show(QdaClassic(Treat~., data=anorexia)) show(QdaClassic(type~., data=Pima.tr)) show(QdaClassic(Species~., data=iris)) ## show(QdaClassic(sp~., data=crabs)) cat("===================================================\n") } ## -- now do it: dodata(method="mcd") dodata(method="m") dodata(method="ogk") dodata(method="sde") rrcov/tests/tlda.Rout.save0000644000176200001440000014765213710032147015320 0ustar liggesusers R version 4.0.2 (2020-06-22) -- "Taking Off Again" Copyright (C) 2020 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (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. > ## VT::15.09.2013 - this will render the output independent > ## from the version of the package > suppressPackageStartupMessages(library(rrcov)) > library(MASS) > > ## VT::14.01.2020 > ## On some platforms minor differences are shown - use > ## IGNORE_RDIFF_BEGIN > ## IGNORE_RDIFF_END > > dodata <- function(method) { + + options(digits = 5) + set.seed(101) # <<-- sub-sampling algorithm now based on R's RNG and seed + + tmp <- sys.call() + cat("\nCall: ", deparse(substitute(tmp)),"\n") + cat("===================================================\n") + + cat("\nData: ", "hemophilia\n") + data(hemophilia) + show(rlda <- Linda(as.factor(gr)~., data=hemophilia, method=method)) + show(predict(rlda)) + + cat("\nData: ", "anorexia\n") + data(anorexia) + show(rlda <- Linda(Treat~., data=anorexia, method=method)) + show(predict(rlda)) + + cat("\nData: ", "Pima\n") + data(Pima.tr) + show(rlda <- Linda(type~., data=Pima.tr, method=method)) + show(predict(rlda)) + + cat("\nData: ", "Forest soils\n") + data(soil) + soil1983 <- soil[soil$D == 0, -2] # only 1983, remove column D (always 0) + + ## This will not work within the function, of course + ## - comment it out + ## IGNORE_RDIFF_BEGIN + rlda <- Linda(F~., data=soil1983, method=method) + ## show(rlda) + ## IGNORE_RDIFF_END + show(predict(rlda)) + + cat("\nData: ", "Raven and Miller diabetes data\n") + data(diabetes) + show(rlda <- Linda(group~insulin+glucose+sspg, data=diabetes, method=method)) + show(predict(rlda)) + + cat("\nData: ", "iris\n") + data(iris) + if(method != "mcdA") + { + show(rlda <- Linda(Species~., data=iris, method=method, l1med=TRUE)) + show(predict(rlda)) + } + + cat("\nData: ", "crabs\n") + data(crabs) + show(rlda <- Linda(sp~., data=crabs, method=method)) + show(predict(rlda)) + + cat("\nData: ", "fish\n") + data(fish) + fish <- fish[-14,] # remove observation #14 containing missing value + + # The height and width are calculated as percentages + # of the third length variable + fish[,5] <- fish[,5]*fish[,4]/100 + fish[,6] <- fish[,6]*fish[,4]/100 + + ## There is one class with only 6 observations (p=6). Normally + ## Linda will fail, therefore use l1med=TRUE. + ## This works only for methods mcdB and mcdC + + table(fish$Species) + if(method != "mcdA") + { + ## IGNORE_RDIFF_BEGIN + rlda <- Linda(Species~., data=fish, method=method, l1med=TRUE) + ## show(rlda) + ## IGNORE_RDIFF_END + show(predict(rlda)) + } + + cat("\nData: ", "pottery\n") + data(pottery) + show(rlda <- Linda(origin~., data=pottery, method=method)) + show(predict(rlda)) + + cat("\nData: ", "olitos\n") + data(olitos) + if(method != "mcdA") + { + ## IGNORE_RDIFF_BEGIN + rlda <- Linda(grp~., data=olitos, method=method, l1med=TRUE) + ## show(rlda) + ## IGNORE_RDIFF_END + show(predict(rlda)) + } + + cat("===================================================\n") + } > > > ## -- now do it: > dodata(method="mcdA") Call: dodata(method = "mcdA") =================================================== Data: hemophilia Call: Linda(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.30795 -0.0059911 normal -0.12920 -0.0603000 Within-groups Covariance Matrix: AHFactivity AHFantigen AHFactivity 0.019035 0.012637 AHFantigen 0.012637 0.020875 Linear Coeficients: AHFactivity AHFantigen carrier -26.7292 15.8940 normal -8.1418 2.0402 Constants: carrier normal -4.5788 -1.3807 Apparent error rate 0.1333 Classification table Predicted Actual carrier normal carrier 39 6 normal 4 26 Confusion matrix Predicted Actual carrier normal carrier 0.867 0.133 normal 0.133 0.867 Data: anorexia Call: Linda(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.633 82.950 Cont 81.558 81.108 FT 84.331 94.762 Within-groups Covariance Matrix: Prewt Postwt Prewt 35.236 9.120 Postwt 9.120 25.313 Linear Coeficients: Prewt Postwt CBT 1.6509 2.6822 Cont 1.6380 2.6141 FT 1.5709 3.1777 Constants: CBT Cont FT -180.36 -173.83 -218.24 Apparent error rate 0.4167 Classification table Predicted Actual CBT Cont FT CBT 16 5 8 Cont 11 13 2 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.552 0.172 0.276 Cont 0.423 0.500 0.077 FT 0.000 0.235 0.765 Data: Pima Call: Linda(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 1.8602 107.69 67.344 25.29 30.642 0.40777 24.667 Yes 5.3167 145.85 74.283 31.80 34.095 0.49533 37.883 Within-groups Covariance Matrix: npreg glu bp skin bmi ped age npreg 9.706635 -6.22068 5.511519 1.62465 0.930142 -0.020624 14.03895 glu -6.220683 790.08188 61.345250 19.65694 29.744834 -0.477622 20.05841 bp 5.511519 61.34525 147.176158 36.36459 16.264038 -0.083953 25.34483 skin 1.624652 19.65694 36.364593 141.44078 56.033516 -0.215665 8.64726 bmi 0.930142 29.74483 16.264038 56.03352 45.266617 0.043775 2.57539 ped -0.020624 -0.47762 -0.083953 -0.21566 0.043775 0.077364 -0.10287 age 14.038947 20.05841 25.344826 8.64726 2.575386 -0.102867 73.32846 Linear Coeficients: npreg glu bp skin bmi ped age No -0.37963 0.077767 0.36932 -0.23799 0.77512 5.3054 0.26843 Yes -0.17660 0.125772 0.35917 -0.19784 0.76053 7.0697 0.39843 Constants: No Yes -29.944 -42.239 Apparent error rate 0.21 Classification table Predicted Actual No Yes No 109 23 Yes 19 49 Confusion matrix Predicted Actual No Yes No 0.826 0.174 Yes 0.279 0.721 Data: Forest soils Apparent error rate 0.3966 Classification table Predicted Actual 1 2 3 1 2 6 3 2 1 13 9 3 1 3 20 Confusion matrix Predicted Actual 1 2 3 1 0.182 0.545 0.273 2 0.043 0.565 0.391 3 0.042 0.125 0.833 Data: Raven and Miller diabetes data Call: Linda(group ~ insulin + glucose + sspg, data = diabetes, method = method) Prior Probabilities of Groups: normal chemical overt 0.52414 0.24828 0.22759 Group means: insulin glucose sspg normal 163.939 345.8 99.076 chemical 299.448 476.9 223.621 overt 95.958 1026.4 343.000 Within-groups Covariance Matrix: insulin glucose sspg insulin 10353.6 -2304.2 1309.2 glucose -2304.2 30716.6 8010.5 sspg 1309.2 8010.5 4904.4 Linear Coeficients: insulin glucose sspg normal 0.020692 0.015647 -0.010878 chemical 0.030151 0.013928 0.014799 overt 0.013713 0.029891 0.017455 Constants: normal chemical overt -4.5086 -10.8833 -20.4714 Apparent error rate 0.1931 Classification table Predicted Actual normal chemical overt normal 69 7 0 chemical 14 22 0 overt 3 4 26 Confusion matrix Predicted Actual normal chemical overt normal 0.908 0.092 0.000 chemical 0.389 0.611 0.000 overt 0.091 0.121 0.788 Data: iris Data: crabs Call: Linda(sp ~ ., data = crabs, method = method) Prior Probabilities of Groups: B O 0.5 0.5 Group means: sexM index FL RW CL CW BD B 0.34722 27.333 14.211 12.253 30.397 35.117 12.765 O 0.56627 25.554 17.131 13.405 34.247 38.155 15.525 Within-groups Covariance Matrix: sexM index FL RW CL CW BD sexM 0.32495 0.99846 0.27043 -0.38424 0.8947 0.83713 0.38943 index 0.99846 235.34252 47.02247 32.51217 101.2140 112.95209 46.76417 FL 0.27043 47.02247 10.37905 6.94554 22.2286 24.90044 10.16835 RW -0.38424 32.51217 6.94554 6.06757 14.6094 16.70517 6.69952 CL 0.89470 101.21397 22.22862 14.60936 48.7002 54.28090 22.22051 CW 0.83713 112.95209 24.90044 16.70517 54.2809 60.85954 24.79469 BD 0.38943 46.76417 10.16835 6.69952 22.2205 24.79469 10.29765 Linear Coeficients: sexM index FL RW CL CW BD B 21.908 -1.9991 8.7204 12.348 0.80966 -3.5091 -0.45264 O 32.617 -3.1291 21.4650 18.245 2.42215 -13.9386 9.75383 Constants: B O -62.591 -127.368 Apparent error rate 0 Classification table Predicted Actual B O B 100 0 O 0 100 Confusion matrix Predicted Actual B O B 1 0 O 0 1 Data: fish Data: pottery Call: Linda(origin ~ ., data = pottery, method = method) Prior Probabilities of Groups: Attic Eritrean 0.48148 0.51852 Group means: SI AL FE MG CA TI Attic 55.36 13.73 9.82 5.45 6.03 0.863 Eritrean 52.52 16.23 9.13 3.09 6.26 0.814 Within-groups Covariance Matrix: SI AL FE MG CA TI SI 17.8214054 3.888635 -0.857514 0.229867 -0.48380 -0.0067872 AL 3.8886351 2.142219 0.652607 0.946141 0.10067 0.0176169 FE -0.8575143 0.652607 1.403928 -0.530783 -2.51300 0.0754965 MG 0.2298674 0.946141 -0.530783 3.709841 4.27174 -0.0570645 CA -0.4837951 0.100667 -2.512998 4.271737 9.99402 -0.1894384 TI -0.0067872 0.017617 0.075497 -0.057065 -0.18944 0.0057590 Linear Coeficients: SI AL FE MG CA TI Attic 48.097 -150.232 238.55 5.94797 43.434 -973.45 Eritrean 31.493 -93.772 152.77 -0.45512 33.141 -451.84 Constants: Attic Eritrean -1199.10 -683.24 Apparent error rate 0.1111 Classification table Predicted Actual Attic Eritrean Attic 12 1 Eritrean 2 12 Confusion matrix Predicted Actual Attic Eritrean Attic 0.923 0.077 Eritrean 0.143 0.857 Data: olitos =================================================== > dodata(method="mcdB") Call: dodata(method = "mcdB") =================================================== Data: hemophilia Call: Linda(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.31456 -0.014775 normal -0.13582 -0.069084 Within-groups Covariance Matrix: AHFactivity AHFantigen AHFactivity 0.016444 0.011351 AHFantigen 0.011351 0.023937 Linear Coeficients: AHFactivity AHFantigen carrier -27.8058 12.5688 normal -9.3172 1.5323 Constants: carrier normal -4.7913 -1.4961 Apparent error rate 0.16 Classification table Predicted Actual carrier normal carrier 38 7 normal 5 25 Confusion matrix Predicted Actual carrier normal carrier 0.844 0.156 normal 0.167 0.833 Data: anorexia Call: Linda(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 83.254 82.381 Cont 82.178 80.539 FT 84.951 94.193 Within-groups Covariance Matrix: Prewt Postwt Prewt 29.566 13.653 Postwt 13.653 38.906 Linear Coeficients: Prewt Postwt CBT 2.1935 1.3477 Cont 2.1762 1.3064 FT 2.0947 1.6859 Constants: CBT Cont FT -147.73 -143.05 -169.82 Apparent error rate 0.4861 Classification table Predicted Actual CBT Cont FT CBT 16 5 8 Cont 16 8 2 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.552 0.172 0.276 Cont 0.615 0.308 0.077 FT 0.000 0.235 0.765 Data: Pima Call: Linda(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.0767 109.45 67.790 26.158 30.930 0.41455 24.695 Yes 5.5938 145.40 74.748 33.754 34.501 0.49898 37.821 Within-groups Covariance Matrix: npreg glu bp skin bmi ped age npreg 8.253576 11.92843 9.170629 4.47646 2.08222 -0.024996 13.330294 glu 11.928434 716.46162 75.731612 35.47043 37.86433 -0.545890 35.405751 bp 9.170629 75.73161 140.079879 34.70380 16.92999 -0.050649 30.872456 skin 4.476462 35.47043 34.703804 140.03693 59.04382 0.125528 16.764129 bmi 2.082224 37.86433 16.929993 59.04382 47.98303 0.219914 8.302882 ped -0.024996 -0.54589 -0.050649 0.12553 0.21991 0.078207 -0.088361 age 13.330294 35.40575 30.872456 16.76413 8.30288 -0.088361 50.627190 Linear Coeficients: npreg glu bp skin bmi ped age No -1.0456 0.086784 0.38714 -0.24505 0.68786 4.7825 0.44300 Yes -1.0506 0.130049 0.35576 -0.20410 0.63846 6.4944 0.68999 Constants: No Yes -31.095 -43.129 Apparent error rate 0.245 Classification table Predicted Actual No Yes No 106 26 Yes 23 45 Confusion matrix Predicted Actual No Yes No 0.803 0.197 Yes 0.338 0.662 Data: Forest soils Apparent error rate 0.3448 Classification table Predicted Actual 1 2 3 1 3 4 4 2 2 14 7 3 1 2 21 Confusion matrix Predicted Actual 1 2 3 1 0.273 0.364 0.364 2 0.087 0.609 0.304 3 0.042 0.083 0.875 Data: Raven and Miller diabetes data Call: Linda(group ~ insulin + glucose + sspg, data = diabetes, method = method) Prior Probabilities of Groups: normal chemical overt 0.52414 0.24828 0.22759 Group means: insulin glucose sspg normal 152.405 346.55 99.387 chemical 288.244 478.80 226.226 overt 84.754 1028.28 345.605 Within-groups Covariance Matrix: insulin glucose sspg insulin 7615.09 435.85 3116.93 glucose 435.85 2983.58 579.71 sspg 3116.93 579.71 4513.83 Linear Coeficients: insulin glucose sspg normal 0.014590 0.11456 -0.0027697 chemical 0.023165 0.15432 0.0143035 overt -0.030375 0.33858 0.0540565 Constants: normal chemical overt -21.470 -43.293 -183.612 Apparent error rate 0.1103 Classification table Predicted Actual normal chemical overt normal 73 3 0 chemical 6 30 0 overt 0 7 26 Confusion matrix Predicted Actual normal chemical overt normal 0.961 0.039 0.000 chemical 0.167 0.833 0.000 overt 0.000 0.212 0.788 Data: iris Call: Linda(Species ~ ., data = iris, method = method, l1med = TRUE) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 4.9834 3.4153 1.4532 0.22474 versicolor 5.8947 2.8149 4.2263 1.35024 virginica 6.5255 3.0017 5.4485 2.06756 Within-groups Covariance Matrix: Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.248728 0.104224 0.127326 0.045769 Sepal.Width 0.104224 0.134015 0.062132 0.039263 Petal.Length 0.127326 0.062132 0.148630 0.055656 Petal.Width 0.045769 0.039263 0.055656 0.040584 Linear Coeficients: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 18.228 22.179632 -2.9809 -32.3888 versicolor 14.202 5.155493 19.5706 -14.5732 virginica 13.336 0.012598 24.2312 2.6632 Constants: setosa versicolor virginica -78.585 -81.731 -113.394 Apparent error rate 0.0267 Classification table Predicted Actual setosa versicolor virginica setosa 50 0 0 versicolor 0 48 2 virginica 0 2 48 Confusion matrix Predicted Actual setosa versicolor virginica setosa 1 0.00 0.00 versicolor 0 0.96 0.04 virginica 0 0.04 0.96 Data: crabs Call: Linda(sp ~ ., data = crabs, method = method) Prior Probabilities of Groups: B O 0.5 0.5 Group means: sexM index FL RW CL CW BD B 0.41060 25.420 13.947 11.922 29.783 34.404 12.470 O 0.60279 23.202 16.782 13.086 33.401 37.230 15.131 Within-groups Covariance Matrix: sexM index FL RW CL CW BD sexM 0.29887 0.26826 0.13913 -0.37768 0.53244 0.4518 0.22036 index 0.26826 222.02891 45.88529 30.74525 97.13899 109.0306 44.32640 FL 0.13913 45.88529 10.28571 6.79799 21.73780 24.4728 9.83350 RW -0.37768 30.74525 6.79799 5.58065 14.16132 16.2172 6.41632 CL 0.53244 97.13899 21.73780 14.16132 46.85017 52.5599 21.15716 CW 0.45180 109.03063 24.47279 16.21721 52.55989 59.2452 23.74432 BD 0.22036 44.32640 9.83350 6.41632 21.15716 23.7443 9.67786 Linear Coeficients: sexM index FL RW CL CW BD B 11.300 -2.1322 6.6646 8.6474 2.0998 -2.4077 -0.39115 O 12.076 -3.4494 19.4275 10.6323 4.6071 -12.7866 11.59846 Constants: B O -61.35 -123.56 Apparent error rate 0 Classification table Predicted Actual B O B 100 0 O 0 100 Confusion matrix Predicted Actual B O B 1 0 O 0 1 Data: fish Apparent error rate 0.0886 Classification table Predicted Actual 1 2 3 4 5 6 7 1 34 0 0 0 0 0 0 2 0 6 0 0 0 0 0 3 0 0 20 0 0 0 0 4 0 0 0 11 0 0 0 5 0 0 0 0 13 0 1 6 0 0 0 0 0 17 0 7 0 12 0 0 1 0 43 Confusion matrix Predicted Actual 1 2 3 4 5 6 7 1 1 0.000 0 0 0.000 0 0.000 2 0 1.000 0 0 0.000 0 0.000 3 0 0.000 1 0 0.000 0 0.000 4 0 0.000 0 1 0.000 0 0.000 5 0 0.000 0 0 0.929 0 0.071 6 0 0.000 0 0 0.000 1 0.000 7 0 0.214 0 0 0.018 0 0.768 Data: pottery Call: Linda(origin ~ ., data = pottery, method = method) Prior Probabilities of Groups: Attic Eritrean 0.48148 0.51852 Group means: SI AL FE MG CA TI Attic 55.362 13.847 10.0065 5.3141 5.5371 0.87124 Eritrean 52.522 16.347 9.3165 2.9541 5.7671 0.82224 Within-groups Covariance Matrix: SI AL FE MG CA TI SI 14.289193 3.4784663 -0.164844 0.757461 -0.869987 0.0373657 AL 3.478466 1.2524784 0.065480 0.713995 0.355258 0.0034364 FE -0.164844 0.0654798 0.364654 -0.388388 -0.740613 0.0240216 MG 0.757461 0.7139945 -0.388388 2.367904 2.231515 -0.0430910 CA -0.869987 0.3552582 -0.740613 2.231515 3.613917 -0.0782308 TI 0.037366 0.0034364 0.024022 -0.043091 -0.078231 0.0025627 Linear Coeficients: SI AL FE MG CA TI Attic 76.578 -250.51 360.48 5.1529 101.645 -630.17 Eritrean 52.453 -166.23 249.33 -2.5811 79.417 -177.23 Constants: Attic Eritrean -2210.3 -1333.2 Apparent error rate 0.1111 Classification table Predicted Actual Attic Eritrean Attic 12 1 Eritrean 2 12 Confusion matrix Predicted Actual Attic Eritrean Attic 0.923 0.077 Eritrean 0.143 0.857 Data: olitos Apparent error rate 0.15 Classification table Predicted Actual 1 2 3 4 1 44 1 4 1 2 2 23 0 0 3 6 1 26 1 4 1 1 0 9 Confusion matrix Predicted Actual 1 2 3 4 1 0.880 0.020 0.080 0.020 2 0.080 0.920 0.000 0.000 3 0.176 0.029 0.765 0.029 4 0.091 0.091 0.000 0.818 =================================================== > dodata(method="mcdC") Call: dodata(method = "mcdC") =================================================== Data: hemophilia Call: Linda(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.32583 -0.011545 normal -0.12783 -0.071377 Within-groups Covariance Matrix: AHFactivity AHFantigen AHFactivity 0.0120964 0.0075536 AHFantigen 0.0075536 0.0164883 Linear Coeficients: AHFactivity AHFantigen carrier -37.117 16.30377 normal -11.015 0.71742 Constants: carrier normal -6.4636 -1.5947 Apparent error rate 0.16 Classification table Predicted Actual carrier normal carrier 38 7 normal 5 25 Confusion matrix Predicted Actual carrier normal carrier 0.844 0.156 normal 0.167 0.833 Data: anorexia Call: Linda(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.477 82.073 Cont 82.039 80.835 FT 85.242 94.750 Within-groups Covariance Matrix: Prewt Postwt Prewt 19.6589 8.3891 Postwt 8.3891 22.8805 Linear Coeficients: Prewt Postwt CBT 3.1590 2.4288 Cont 3.1599 2.3743 FT 3.0454 3.0245 Constants: CBT Cont FT -230.85 -226.60 -274.53 Apparent error rate 0.4583 Classification table Predicted Actual CBT Cont FT CBT 16 5 8 Cont 14 10 2 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.552 0.172 0.276 Cont 0.538 0.385 0.077 FT 0.000 0.235 0.765 Data: Pima Call: Linda(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.3056 110.63 67.991 26.444 31.010 0.41653 25.806 Yes 5.0444 142.58 74.267 33.067 34.309 0.49422 35.156 Within-groups Covariance Matrix: npreg glu bp skin bmi ped age npreg 6.164422 8.43753 6.879286 3.252980 1.54269 -0.020158 9.543745 glu 8.437528 542.79578 57.156929 26.218837 28.63494 -0.421819 23.809124 bp 6.879286 57.15693 106.687356 26.315526 12.86691 -0.039577 22.992973 skin 3.252980 26.21884 26.315526 106.552759 44.95420 0.094311 12.005740 bmi 1.542689 28.63494 12.866911 44.954202 36.56262 0.167258 6.112925 ped -0.020158 -0.42182 -0.039577 0.094311 0.16726 0.059609 -0.072712 age 9.543745 23.80912 22.992973 12.005740 6.11292 -0.072712 35.594886 Linear Coeficients: npreg glu bp skin bmi ped age No -1.4165 0.11776 0.49336 -0.31564 0.88761 6.5013 0.67462 Yes -1.3784 0.17062 0.46662 -0.26771 0.83745 8.5204 0.90557 Constants: No Yes -41.716 -55.056 Apparent error rate 0.235 Classification table Predicted Actual No Yes No 107 25 Yes 22 46 Confusion matrix Predicted Actual No Yes No 0.811 0.189 Yes 0.324 0.676 Data: Forest soils Apparent error rate 0.3276 Classification table Predicted Actual 1 2 3 1 5 2 4 2 2 13 8 3 1 2 21 Confusion matrix Predicted Actual 1 2 3 1 0.455 0.182 0.364 2 0.087 0.565 0.348 3 0.042 0.083 0.875 Data: Raven and Miller diabetes data Call: Linda(group ~ insulin + glucose + sspg, data = diabetes, method = method) Prior Probabilities of Groups: normal chemical overt 0.52414 0.24828 0.22759 Group means: insulin glucose sspg normal 167.31 348.69 106.44 chemical 247.18 478.18 213.36 overt 101.83 932.92 322.42 Within-groups Covariance Matrix: insulin glucose sspg insulin 4070.84 118.89 1701.54 glucose 118.89 2195.95 426.95 sspg 1701.54 426.95 2664.49 Linear Coeficients: insulin glucose sspg normal 0.041471 0.15888 -0.011992 chemical 0.048103 0.21216 0.015359 overt -0.013579 0.41323 0.063462 Constants: normal chemical overt -31.177 -59.703 -203.775 Apparent error rate 0.0828 Classification table Predicted Actual normal chemical overt normal 72 4 0 chemical 2 34 0 overt 0 6 27 Confusion matrix Predicted Actual normal chemical overt normal 0.947 0.053 0.000 chemical 0.056 0.944 0.000 overt 0.000 0.182 0.818 Data: iris Call: Linda(Species ~ ., data = iris, method = method, l1med = TRUE) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 5.0163 3.4510 1.4653 0.2449 versicolor 5.9435 2.7891 4.2543 1.3239 virginica 6.3867 3.0033 5.3767 2.0700 Within-groups Covariance Matrix: Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.186186 0.082478 0.094998 0.035445 Sepal.Width 0.082478 0.100137 0.049723 0.030678 Petal.Length 0.094998 0.049723 0.113105 0.043078 Petal.Width 0.035445 0.030678 0.043078 0.030885 Linear Coeficients: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 23.678 30.2896 -3.1124 -44.9900 versicolor 20.342 4.6372 27.3265 -23.2006 virginica 18.377 -2.0004 31.4235 4.0906 Constants: setosa versicolor virginica -104.96 -110.79 -145.49 Apparent error rate 0.0333 Classification table Predicted Actual setosa versicolor virginica setosa 50 0 0 versicolor 0 48 2 virginica 0 3 47 Confusion matrix Predicted Actual setosa versicolor virginica setosa 1 0.00 0.00 versicolor 0 0.96 0.04 virginica 0 0.06 0.94 Data: crabs Call: Linda(sp ~ ., data = crabs, method = method) Prior Probabilities of Groups: B O 0.5 0.5 Group means: sexM index FL RW CL CW BD B 0.50000 23.956 13.790 11.649 29.390 33.934 12.274 O 0.51087 24.478 16.903 13.330 33.707 37.595 15.276 Within-groups Covariance Matrix: sexM index FL RW CL CW BD sexM 0.25272 0.39179 0.14054 -0.30017 0.51191 0.45114 0.21708 index 0.39179 192.47099 39.97343 26.56698 84.63152 94.99987 38.67917 FL 0.14054 39.97343 8.97950 5.91408 18.98672 21.38046 8.60313 RW -0.30017 26.56698 5.91408 4.81389 12.31798 14.10613 5.58933 CL 0.51191 84.63152 18.98672 12.31798 40.94109 45.94330 18.52367 CW 0.45114 94.99987 21.38046 14.10613 45.94330 51.80106 20.79704 BD 0.21708 38.67917 8.60313 5.58933 18.52367 20.79704 8.49355 Linear Coeficients: sexM index FL RW CL CW BD B 13.993 -2.5515 9.152 9.9187 2.2321 -2.9774 -0.66797 O 14.362 -4.0280 23.369 12.1556 5.3672 -14.9236 12.94057 Constants: B O -72.687 -142.365 Apparent error rate 0 Classification table Predicted Actual B O B 100 0 O 0 100 Confusion matrix Predicted Actual B O B 1 0 O 0 1 Data: fish Apparent error rate 0.0316 Classification table Predicted Actual 1 2 3 4 5 6 7 1 34 0 0 0 0 0 0 2 0 5 0 0 1 0 0 3 0 0 20 0 0 0 0 4 0 0 0 11 0 0 0 5 0 0 0 0 13 0 1 6 0 0 0 0 0 17 0 7 0 0 0 0 3 0 53 Confusion matrix Predicted Actual 1 2 3 4 5 6 7 1 1 0.000 0 0 0.000 0 0.000 2 0 0.833 0 0 0.167 0 0.000 3 0 0.000 1 0 0.000 0 0.000 4 0 0.000 0 1 0.000 0 0.000 5 0 0.000 0 0 0.929 0 0.071 6 0 0.000 0 0 0.000 1 0.000 7 0 0.000 0 0 0.054 0 0.946 Data: pottery Call: Linda(origin ~ ., data = pottery, method = method) Prior Probabilities of Groups: Attic Eritrean 0.48148 0.51852 Group means: SI AL FE MG CA TI Attic 55.450 13.738 10.0000 5.0750 5.0750 0.87375 Eritrean 52.444 16.444 9.3222 3.1667 6.1778 0.82000 Within-groups Covariance Matrix: SI AL FE MG CA TI SI 6.565481 1.6098148 -0.075259 0.369556 -0.359407 0.0169667 AL 1.609815 0.5640648 0.029407 0.302056 0.112426 0.0018583 FE -0.075259 0.0294074 0.167704 -0.180222 -0.343704 0.0110667 MG 0.369556 0.3020556 -0.180222 1.031667 0.915222 -0.0192167 CA -0.359407 0.1124259 -0.343704 0.915222 1.447370 -0.0348167 TI 0.016967 0.0018583 0.011067 -0.019217 -0.034817 0.0011725 Linear Coeficients: SI AL FE MG CA TI Attic 190.17 -622.48 922.21 1.5045 293.30 -990.323 Eritrean 135.34 -431.40 666.59 -14.3288 237.68 -44.025 Constants: Attic Eritrean -5924.2 -3802.9 Apparent error rate 0.1111 Classification table Predicted Actual Attic Eritrean Attic 12 1 Eritrean 2 12 Confusion matrix Predicted Actual Attic Eritrean Attic 0.923 0.077 Eritrean 0.143 0.857 Data: olitos Apparent error rate 0.1667 Classification table Predicted Actual 1 2 3 4 1 44 1 2 3 2 2 22 0 1 3 5 2 25 2 4 1 1 0 9 Confusion matrix Predicted Actual 1 2 3 4 1 0.880 0.020 0.040 0.060 2 0.080 0.880 0.000 0.040 3 0.147 0.059 0.735 0.059 4 0.091 0.091 0.000 0.818 =================================================== > dodata(method="mrcd") Call: dodata(method = "mrcd") =================================================== Data: hemophilia Call: Linda(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.34048 -0.055943 normal -0.13566 -0.081191 Within-groups Covariance Matrix: AHFactivity AHFantigen AHFactivity 0.0133676 0.0088055 AHFantigen 0.0088055 0.0221225 Linear Coeficients: AHFactivity AHFantigen carrier -32.264 10.31334 normal -10.478 0.50044 Constants: carrier normal -5.7149 -1.6067 Apparent error rate 0.16 Classification table Predicted Actual carrier normal carrier 38 7 normal 5 25 Confusion matrix Predicted Actual carrier normal carrier 0.844 0.156 normal 0.167 0.833 Data: anorexia Call: Linda(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 83.114 84.009 Cont 80.327 80.125 FT 85.161 94.371 Within-groups Covariance Matrix: Prewt Postwt Prewt 22.498 11.860 Postwt 11.860 20.426 Linear Coeficients: Prewt Postwt CBT 2.1994 2.8357 Cont 2.1653 2.6654 FT 1.9451 3.4907 Constants: CBT Cont FT -211.42 -194.77 -248.97 Apparent error rate 0.3889 Classification table Predicted Actual CBT Cont FT CBT 15 6 8 Cont 6 16 4 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.517 0.207 0.276 Cont 0.231 0.615 0.154 FT 0.000 0.235 0.765 Data: Pima Call: Linda(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 1.9925 108.32 66.240 24.856 30.310 0.37382 24.747 Yes 5.8855 145.88 75.715 32.541 33.915 0.39281 38.857 Within-groups Covariance Matrix: npreg glu bp skin bmi ped age npreg 4.090330 7.9547 3.818380 3.35899 2.470242 0.032557 9.5929 glu 7.954730 770.4187 76.377665 53.32216 54.100400 -1.139087 28.5677 bp 3.818380 76.3777 108.201622 42.61184 18.574983 -0.089151 20.3558 skin 3.358992 53.3222 42.611844 146.81170 65.210794 -0.277335 15.0162 bmi 2.470242 54.1004 18.574983 65.21079 52.871847 0.062145 9.0741 ped 0.032557 -1.1391 -0.089151 -0.27733 0.062145 0.063490 0.1762 age 9.592948 28.5677 20.355803 15.01616 9.074109 0.176201 53.5163 Linear Coeficients: npreg glu bp skin bmi ped age No -1.30832 0.065773 0.54772 -0.32738 0.70207 5.2556 0.40900 Yes -0.76566 0.106435 0.55777 -0.28044 0.61709 5.9199 0.54892 Constants: No Yes -33.429 -45.434 Apparent error rate 0.28 Classification table Predicted Actual No Yes No 105 27 Yes 29 39 Confusion matrix Predicted Actual No Yes No 0.795 0.205 Yes 0.426 0.574 Data: Forest soils Apparent error rate 0.3448 Classification table Predicted Actual 1 2 3 1 7 2 2 2 4 14 5 3 3 4 17 Confusion matrix Predicted Actual 1 2 3 1 0.636 0.182 0.182 2 0.174 0.609 0.217 3 0.125 0.167 0.708 Data: Raven and Miller diabetes data Call: Linda(group ~ insulin + glucose + sspg, data = diabetes, method = method) Prior Probabilities of Groups: normal chemical overt 0.52414 0.24828 0.22759 Group means: insulin glucose sspg normal 154.014 346.07 91.606 chemical 248.841 451.10 221.936 overt 89.766 1064.16 335.100 Within-groups Covariance Matrix: insulin glucose sspg insulin 4948.1 1007.61 1471.12 glucose 1007.6 2597.38 358.57 sspg 1471.1 358.57 3180.04 Linear Coeficients: insulin glucose sspg normal 0.00027839 0.13121 0.013882 chemical 0.00148074 0.16615 0.050371 overt -0.10102404 0.43466 0.103100 Constants: normal chemical overt -24.008 -44.642 -245.497 Apparent error rate 0.0966 Classification table Predicted Actual normal chemical overt normal 71 5 0 chemical 2 34 0 overt 0 7 26 Confusion matrix Predicted Actual normal chemical overt normal 0.934 0.066 0.000 chemical 0.056 0.944 0.000 overt 0.000 0.212 0.788 Data: iris Call: Linda(Species ~ ., data = iris, method = method, l1med = TRUE) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 4.9755 3.3826 1.4608 0.22053 versicolor 5.8868 2.7823 4.2339 1.34603 virginica 6.5176 2.9691 5.4560 2.06335 Within-groups Covariance Matrix: Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.238417 0.136325 0.086377 0.036955 Sepal.Width 0.136325 0.148452 0.067500 0.034804 Petal.Length 0.086377 0.067500 0.100934 0.035968 Petal.Width 0.036955 0.034804 0.035968 0.023856 Linear Coeficients: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 17.106 15.693 7.8806 -52.031 versicolor 21.744 -15.813 38.0139 -11.505 virginica 23.032 -26.567 43.6391 23.777 Constants: setosa versicolor virginica -70.214 -115.832 -180.294 Apparent error rate 0.02 Classification table Predicted Actual setosa versicolor virginica setosa 50 0 0 versicolor 0 49 1 virginica 0 2 48 Confusion matrix Predicted Actual setosa versicolor virginica setosa 1 0.00 0.00 versicolor 0 0.98 0.02 virginica 0 0.04 0.96 Data: crabs Call: Linda(sp ~ ., data = crabs, method = method) Prior Probabilities of Groups: B O 0.5 0.5 Group means: sexM index FL RW CL CW BD B 0 25.5 13.270 12.138 28.102 32.624 11.816 O 1 25.5 16.626 12.262 33.688 37.188 15.324 Within-groups Covariance Matrix: sexM index FL RW CL CW BD sexM 1.5255e-07 0.000 0.0000 0.0000 0.000 0.000 0.000 index 0.0000e+00 337.501 62.8107 46.5073 137.713 154.451 63.514 FL 0.0000e+00 62.811 15.3164 9.8612 29.911 33.479 13.805 RW 0.0000e+00 46.507 9.8612 8.6949 21.878 24.604 10.092 CL 0.0000e+00 137.713 29.9112 21.8779 73.888 73.891 30.486 CW 0.0000e+00 154.451 33.4788 24.6038 73.891 92.801 34.122 BD 0.0000e+00 63.514 13.8053 10.0923 30.486 34.122 15.854 Linear Coeficients: sexM index FL RW CL CW BD B 0 -0.64890 0.95529 2.7299 0.20747 0.28549 -0.23815 O 6555120 -0.83294 1.67920 1.8896 0.32330 0.23479 0.51136 Constants: B O -2.1491e+01 -3.2776e+06 Apparent error rate 0.5 Classification table Predicted Actual B O B 50 50 O 50 50 Confusion matrix Predicted Actual B O B 0.5 0.5 O 0.5 0.5 Data: fish Apparent error rate 0.2532 Classification table Predicted Actual 1 2 3 4 5 6 7 1 33 0 0 1 0 0 0 2 0 3 0 0 0 0 3 3 0 2 5 0 0 0 13 4 0 0 0 11 0 0 0 5 0 0 0 0 14 0 0 6 0 0 0 0 0 17 0 7 0 19 0 0 2 0 35 Confusion matrix Predicted Actual 1 2 3 4 5 6 7 1 0.971 0.000 0.00 0.029 0.000 0 0.000 2 0.000 0.500 0.00 0.000 0.000 0 0.500 3 0.000 0.100 0.25 0.000 0.000 0 0.650 4 0.000 0.000 0.00 1.000 0.000 0 0.000 5 0.000 0.000 0.00 0.000 1.000 0 0.000 6 0.000 0.000 0.00 0.000 0.000 1 0.000 7 0.000 0.339 0.00 0.000 0.036 0 0.625 Data: pottery Call: Linda(origin ~ ., data = pottery, method = method) Prior Probabilities of Groups: Attic Eritrean 0.48148 0.51852 Group means: SI AL FE MG CA TI Attic 55.872 13.986 10.113 5.0235 4.7316 0.88531 Eritrean 52.487 16.286 9.499 2.4520 5.3745 0.83959 Within-groups Covariance Matrix: SI AL FE MG CA TI SI 12.795913 3.2987125 -0.35496855 0.9399999 -0.0143514 0.01132392 AL 3.298713 1.0829436 -0.03394751 0.2838724 0.0501000 0.00117721 FE -0.354969 -0.0339475 0.08078156 0.0341568 -0.0457411 0.00043177 MG 0.940000 0.2838724 0.03415675 0.4350013 0.1417876 0.00396576 CA -0.014351 0.0501000 -0.04574114 0.1417876 0.4196628 -0.00104893 TI 0.011324 0.0011772 0.00043177 0.0039658 -0.0010489 0.00026205 Linear Coeficients: SI AL FE MG CA TI Attic 36.451 -63.784 352.90 -124.07 110.08 3826.6 Eritrean 29.763 -41.039 325.12 -128.32 107.36 3938.1 Constants: Attic Eritrean -4000.1 -3776.1 Apparent error rate 0.1111 Classification table Predicted Actual Attic Eritrean Attic 12 1 Eritrean 2 12 Confusion matrix Predicted Actual Attic Eritrean Attic 0.923 0.077 Eritrean 0.143 0.857 Data: olitos Apparent error rate 0.125 Classification table Predicted Actual 1 2 3 4 1 44 2 3 1 2 1 23 1 0 3 4 1 27 2 4 0 0 0 11 Confusion matrix Predicted Actual 1 2 3 4 1 0.880 0.040 0.060 0.020 2 0.040 0.920 0.040 0.000 3 0.118 0.029 0.794 0.059 4 0.000 0.000 0.000 1.000 =================================================== > dodata(method="ogk") Call: dodata(method = "ogk") =================================================== Data: hemophilia Call: Linda(as.factor(gr) ~ ., data = hemophilia, method = method) Prior Probabilities of Groups: carrier normal 0.6 0.4 Group means: AHFactivity AHFantigen carrier -0.29043 -0.00052902 normal -0.12463 -0.06715037 Within-groups Covariance Matrix: AHFactivity AHFantigen AHFactivity 0.015688 0.010544 AHFantigen 0.010544 0.016633 Linear Coeficients: AHFactivity AHFantigen carrier -32.2203 20.3935 normal -9.1149 1.7409 Constants: carrier normal -5.1843 -1.4259 Apparent error rate 0.1467 Classification table Predicted Actual carrier normal carrier 38 7 normal 4 26 Confusion matrix Predicted Actual carrier normal carrier 0.844 0.156 normal 0.133 0.867 Data: anorexia Call: Linda(Treat ~ ., data = anorexia, method = method) Prior Probabilities of Groups: CBT Cont FT 0.40278 0.36111 0.23611 Group means: Prewt Postwt CBT 82.634 82.060 Cont 81.605 80.459 FT 85.157 93.822 Within-groups Covariance Matrix: Prewt Postwt Prewt 15.8294 4.4663 Postwt 4.4663 19.6356 Linear Coeficients: Prewt Postwt CBT 4.3183 3.1970 Cont 4.2734 3.1256 FT 4.3080 3.7983 Constants: CBT Cont FT -310.50 -301.12 -363.05 Apparent error rate 0.4583 Classification table Predicted Actual CBT Cont FT CBT 15 5 9 Cont 14 11 1 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.517 0.172 0.310 Cont 0.538 0.423 0.038 FT 0.000 0.235 0.765 Data: Pima Call: Linda(type ~ ., data = Pima.tr, method = method) Prior Probabilities of Groups: No Yes 0.66 0.34 Group means: npreg glu bp skin bmi ped age No 2.4175 109.93 67.332 26.324 30.344 0.38740 26.267 Yes 5.1853 142.29 75.194 33.151 34.878 0.47977 37.626 Within-groups Covariance Matrix: npreg glu bp skin bmi ped age npreg 7.218576 7.52457 6.96595 4.86613 0.45567 -0.054245 14.42648 glu 7.524571 517.38370 58.53812 31.57321 22.68396 -0.200222 22.88780 bp 6.965950 58.53812 101.50317 27.86784 10.89215 -0.152784 25.41819 skin 4.866127 31.57321 27.86784 95.16949 37.45066 -0.117375 14.60676 bmi 0.455675 22.68396 10.89215 37.45066 30.89491 0.043400 4.05584 ped -0.054245 -0.20022 -0.15278 -0.11737 0.04340 0.051268 -0.18131 age 14.426479 22.88780 25.41819 14.60676 4.05584 -0.181311 57.89570 Linear Coeficients: npreg glu bp skin bmi ped age No -0.99043 0.12339 0.54101 -0.35335 1.0721 8.4945 0.45482 Yes -1.01369 0.17577 0.53898 -0.35554 1.1563 11.0474 0.63966 Constants: No Yes -43.449 -60.176 Apparent error rate 0.23 Classification table Predicted Actual No Yes No 108 24 Yes 22 46 Confusion matrix Predicted Actual No Yes No 0.818 0.182 Yes 0.324 0.676 Data: Forest soils Apparent error rate 0.3621 Classification table Predicted Actual 1 2 3 1 7 3 1 2 4 13 6 3 3 4 17 Confusion matrix Predicted Actual 1 2 3 1 0.636 0.273 0.091 2 0.174 0.565 0.261 3 0.125 0.167 0.708 Data: Raven and Miller diabetes data Call: Linda(group ~ insulin + glucose + sspg, data = diabetes, method = method) Prior Probabilities of Groups: normal chemical overt 0.52414 0.24828 0.22759 Group means: insulin glucose sspg normal 159.540 344.06 99.486 chemical 252.992 478.16 219.442 overt 79.635 1094.96 338.517 Within-groups Covariance Matrix: insulin glucose sspg insulin 3844.877 67.238 1456.55 glucose 67.238 2228.396 324.21 sspg 1456.548 324.205 2181.73 Linear Coeficients: insulin glucose sspg normal 0.040407 0.15379 -0.0042303 chemical 0.047858 0.20764 0.0377766 overt -0.026158 0.47736 0.1016873 Constants: normal chemical overt -30.115 -61.233 -278.996 Apparent error rate 0.0966 Classification table Predicted Actual normal chemical overt normal 71 5 0 chemical 2 34 0 overt 0 7 26 Confusion matrix Predicted Actual normal chemical overt normal 0.934 0.066 0.000 chemical 0.056 0.944 0.000 overt 0.000 0.212 0.788 Data: iris Call: Linda(Species ~ ., data = iris, method = method, l1med = TRUE) Prior Probabilities of Groups: setosa versicolor virginica 0.33333 0.33333 0.33333 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 4.9654 3.3913 1.4507 0.21639 versicolor 5.8767 2.7909 4.2238 1.34189 virginica 6.5075 2.9777 5.4459 2.05921 Within-groups Covariance Matrix: Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.180280 0.068876 0.101512 0.036096 Sepal.Width 0.068876 0.079556 0.047722 0.029409 Petal.Length 0.101512 0.047722 0.111492 0.038658 Petal.Width 0.036096 0.029409 0.038658 0.029965 Linear Coeficients: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 28.582 46.5236 -13.859 -54.9877 versicolor 19.837 11.9601 20.865 -17.7704 virginica 16.999 1.9046 29.808 7.9189 Constants: setosa versicolor virginica -134.94 -108.22 -148.56 Apparent error rate 0.0133 Classification table Predicted Actual setosa versicolor virginica setosa 50 0 0 versicolor 0 49 1 virginica 0 1 49 Confusion matrix Predicted Actual setosa versicolor virginica setosa 1 0.00 0.00 versicolor 0 0.98 0.02 virginica 0 0.02 0.98 Data: crabs Call: Linda(sp ~ ., data = crabs, method = method) Prior Probabilities of Groups: B O 0.5 0.5 Group means: sexM index FL RW CL CW BD B 0.48948 24.060 13.801 11.738 29.491 34.062 12.329 O 0.56236 24.043 16.825 13.158 33.574 37.418 15.223 Within-groups Covariance Matrix: sexM index FL RW CL CW BD sexM 0.24961 0.50421 0.16645 -0.28574 0.54159 0.48449 0.22563 index 0.50421 186.86616 38.46284 25.26749 82.29121 92.11253 37.67723 FL 0.16645 38.46284 8.58830 5.56769 18.33015 20.58235 8.32030 RW -0.28574 25.26749 5.56769 4.52038 11.70881 13.37643 5.32779 CL 0.54159 82.29121 18.33015 11.70881 39.78186 44.52112 18.01179 CW 0.48449 92.11253 20.58235 13.37643 44.52112 50.06150 20.16852 BD 0.22563 37.67723 8.32030 5.32779 18.01179 20.16852 8.25884 Linear Coeficients: sexM index FL RW CL CW BD B 16.497 -2.5896 8.3966 11.518 1.7536 -2.5325 -0.67361 O 17.010 -4.0452 23.5400 13.702 4.7871 -14.8264 13.04556 Constants: B O -77.695 -147.287 Apparent error rate 0 Classification table Predicted Actual B O B 100 0 O 0 100 Confusion matrix Predicted Actual B O B 1 0 O 0 1 Data: fish Apparent error rate 0.0063 Classification table Predicted Actual 1 2 3 4 5 6 7 1 34 0 0 0 0 0 0 2 0 6 0 0 0 0 0 3 0 0 20 0 0 0 0 4 0 0 0 11 0 0 0 5 0 0 0 0 14 0 0 6 0 0 0 0 0 17 0 7 0 0 0 0 1 0 55 Confusion matrix Predicted Actual 1 2 3 4 5 6 7 1 1 0 0 0 0.000 0 0.000 2 0 1 0 0 0.000 0 0.000 3 0 0 1 0 0.000 0 0.000 4 0 0 0 1 0.000 0 0.000 5 0 0 0 0 1.000 0 0.000 6 0 0 0 0 0.000 1 0.000 7 0 0 0 0 0.018 0 0.982 Data: pottery Call: Linda(origin ~ ., data = pottery, method = method) Prior Probabilities of Groups: Attic Eritrean 0.48148 0.51852 Group means: SI AL FE MG CA TI Attic 55.381 14.088 10.1316 4.9588 4.7684 0.88444 Eritrean 53.559 16.251 9.1145 2.6213 5.8980 0.82501 Within-groups Covariance Matrix: SI AL FE MG CA TI SI 7.878378 1.9064112 -0.545403 0.4167407 -0.11589 0.01850748 AL 1.906411 0.6678763 -0.037744 0.1120891 -0.10733 0.00805556 FE -0.545403 -0.0377438 0.213914 -0.0192356 -0.23121 0.00582800 MG 0.416741 0.1120891 -0.019236 0.2336721 0.17284 -0.00183128 CA -0.115888 -0.1073297 -0.231213 0.1728385 0.71388 -0.01895968 TI 0.018507 0.0080556 0.005828 -0.0018313 -0.01896 0.00081815 Linear Coeficients: SI AL FE MG CA TI Attic 57.784 -107.297 319.31 -152.94 241.66 3813.6 Eritrean 52.523 -86.545 306.58 -165.71 242.36 3734.1 Constants: Attic Eritrean -4346 -4139 Apparent error rate 0.1111 Classification table Predicted Actual Attic Eritrean Attic 12 1 Eritrean 2 12 Confusion matrix Predicted Actual Attic Eritrean Attic 0.923 0.077 Eritrean 0.143 0.857 Data: olitos Apparent error rate 0.1 Classification table Predicted Actual 1 2 3 4 1 45 2 2 1 2 0 25 0 0 3 4 1 27 2 4 0 0 0 11 Confusion matrix Predicted Actual 1 2 3 4 1 0.900 0.040 0.040 0.020 2 0.000 1.000 0.000 0.000 3 0.118 0.029 0.794 0.059 4 0.000 0.000 0.000 1.000 =================================================== > #dodata(method="fsa") > > proc.time() user system elapsed 2.31 0.31 2.60 rrcov/src/0000755000176200001440000000000014200705521012170 5ustar liggesusersrrcov/src/fsada.f0000644000176200001440000003575113373003060013427 0ustar liggesusers SUBROUTINE FSADA(X,NE,NV,NG,IGRP,XM,XC,XND, 1 IHALF,NIT,IDSAV,MRAND,IERR,DETC,ITRACE) IMPLICIT DOUBLEPRECISION (A-H,O-Z) C...Default number of iterations to be performed(if NIT=0) PARAMETER (ITK0=500) DIMENSION X(NV,NE), IGRP(NE) DIMENSION XM(NV,NG), XC(NV,NV), XND(NG) DIMENSION ave(NV,NG),cov(NV,NV), 1 datimg(NV,NE),ustu(NE),ibasis(NE), 3 isin(NE),wtv(NG),cinv(NV,NV), 4 IDSAV(NE) C...Set the default number of iterations if not supplied IF(NIT.EQ.0) NIT=ITK0 if(ITRACE .ge. 2) then CALL INTPR('Entering FSADA - NIT: ',-1,NIT,1) endif C...Set the coverage for max breakdown point, if not supplied IF(IHALF.LE.0) IHALF = (NE+NV+1)/2 call reader(X,NE,NV,NG,ave,cov,cinv,datimg,wtv,ustu,DETC, 2 IGRP,ibasis,isin,IHALF, 3 XC,XM,XND,IDSAV,NIT,MRAND,ITRACE) C...the cross-product matrix is returned - scale it DO I=1,NV DO J=1,NV XC(I,J) = XC(I,J)/(IHALF-NG) ENDDO ENDDO END subroutine reader(data,ncas,nord,npop, 1ave,cov,cinv,datimg,wtv,ustu,deter, 2igp,ibasis,isin,ncover, 3bescov,besave,beswtv,ibsbes,nsim,iseed,ITRACE) implicit doubleprecision (a-h,o-z) dimension data(nord,ncas),ave(nord,npop),cov(nord,nord), 1 datimg(nord,ncas), 2 ustu(ncas),igp(ncas),ibasis(ncas), 3 isin(ncas),wtv(npop),cinv(nord,nord), 4 bescov(nord,nord),besave(nord,npop),ibsbes(ncas), 5 beswtv(npop), 6 index(5000),devi(100), 7 detrtb(100),icount(100),isgntb(100) data xix, xia, xic /.31415925d0,17119.d0,0.1221d0/, 1 one /1.d0/ xix = xix * iseed CCC WRITE(*,*) ncas,' cases' c ncover = cover * ncas + 0.5 if(ITRACE .ge. 2) then CALL INTPR('Entering READER - ncas: ',-1,ncas,1) CALL INTPR('Entering READER - ncover: ',-1,ncover,1) endif do j = 1, ncas index(j) = j enddo do j = 1, npop wtv(j) = 0 do i = 1, nord ave(i,j) = 0 enddo enddo do j = 1, nord do i = 1, nord cov(i,j) = 0 enddo enddo do icas = 1, ncas ngp = igp(icas) wold = wtv(ngp) wnew = wold + one wtv(ngp) = wnew rati = wold / wnew do i = 1, nord devi(i) = data(i,icas) - ave(i,ngp) ave(i,ngp) = ave(i,ngp) + devi(i) / wnew do j = 1, i cov(i,j) = cov(i,j) + devi(i) * devi(j) * rati enddo enddo enddo edf = ncas - npop do i = 1, nord do j = 1, i cov(i,j) = cov(i,j) / edf cov(j,i) = cov(i,j) enddo enddo CCC WRITE(*,'('' Full data set''/'' Grp size averages'')') CCC WRITE(8,'('' Full data set''/'' Grp size averages'')') CCC do j = 1, npop CCC WRITE(*,101) j,int(wtv(j)),(ave(i,j),i=1,nord) CCC WRITE(8,101) j,int(wtv(j)),(ave(i,j),i=1,nord) CCC 101 format(/i4,i5,(t12,6g11.4)) CCC enddo CCC WRITE(*,*) ' Covariance matrix' CCC WRITE(8,'(/'' Covariance matrix'')') CCC do j = 1, nord CCC WRITE(*,102) j,(cov(i,j),i=1,nord) CCC WRITE(8,102) j,(cov(i,j),i=1,nord) CCC 102 format(/i5,(t12,6g11.4)) CCC enddo deter = 1 ixlo = 1 do i = 1, nord CCC WRITE(*,'('' Sweeping pivot, deter'',2g15.7)') cov(i,i),deter call zsweep(cov,nord,i,deter) enddo CCC WRITE(*,'(/'' Log10 determinant of overall covariance matrix'', CCC 1 f10.4)') log10(deter) CCC WRITE(8,'(/'' Log10 determinant of overall covariance matrix'', CCC 1 f10.4)') log10(deter) if(ITRACE .ge. 2) then xdet = log10(deter) CALL DBLEPR('Initialization ready - log det: ',-1,xdet,1) endif verbes = 1.d30 if (ncover .ge. ncas) return cover = 1.0*ncover/ncas CCC WRITE(*,'(//'' Start search for high breakdown estimators'' CCC 1 '' of coverage'',f7.3)') cover CCC WRITE(8,'(//'' Start search for high breakdown estimators'' CCC 1 '' of coverage'',f7.3)') cover edf = ncover - npop corter = nord * log10(edf) nsol = 0 do 80 loopo = 1, nsim do i = ncas, 1, -1 fi = i xix = mod(xix * xia + xic, one) inx = xix * fi + one if(inx .ne. i) then itemp = index (i) index (i) = index (inx) index (inx) = itemp endif ibasis(i) = index(i) enddo if(ITRACE .ge. 2) then CALL INTPR('Entering iteration: ',-1,loopo,1) endif call itera(data,ave,cov,cinv,datimg,wtv,ustu,deter, 1 igp,ibasis,isin,nord,ncas,npop,ncover) isgn = isigna(ibasis,ncover) do i = 1, nsol if(isgn.eq.isgntb(i).and.abs(deter/detrtb(i)-one) 1 .lt. .001) then icount(i) = icount(i) + 1 go to 135 endif enddo do i = 1, ncover do j = 1, i if (ibasis(j) .gt. ibasis(i)) then itemp = ibasis(i) ibasis(i) = ibasis(j) ibasis(j) = itemp endif enddo enddo CCC WRITE(*,'(/''Loop'',i6,'' New feasible solution. Retained '', CCC 1 ''cases''/(20i4))') loopo,(ibasis(i),i=1,ncover) CCC detlog = log10(deter) - corter CCC WRITE(*,'('' log10 determinant'', CCC 1 g15.7/'' Grp size averages'')') detlog CCC do 145 j = 1, npop CCC 145 WRITE(*,'(i4,i5,(t12,6g11.4))') j,int(wtv(j)),(ave(i,j),i=1,nord) CCC WRITE(*,*) ' Covariance matrix' CCC do j = 1, nord CCC WRITE(*,'(t12,6g11.4)') (cov(i,j)/edf,i=1,nord) CCC enddo nsol = nsol + 1 isgntb(nsol) = isgn detrtb(nsol) = deter icount(nsol) = 1 135 continue if (deter .lt. 0.999999d0 * verbes) then CCC WRITE(*,'(//'' New optimum'')') CCC WRITE(8,'(/''Loop'',i6,'' New feasible solution. Retained '', CCC 1 ''cases''/(20i4))') loopo,(ibasis(i),i=1,ncover) CCC WRITE(8,'('' log10 determinant'',g15.7)') detlog verbes = deter do i = 1, nord do j = 1, npop beswtv(j) = wtv(j) besave(i,j) = ave(i,j) enddo do j = 1, nord bescov(i,j) = cov(i,j) enddo enddo do i = 1, ncover ibsbes(i) = ibasis(i) enddo endif 80 continue CCC WRITE(*,'('' Criterion and count of different feasible '', CCC 1 ''solutions'')') CCC WRITE(*,'(5(f7.3,i5))') (log10(detrtb(i))-corter, CCC 1 icount(i), i=1,nsol) CCC WRITE(8,'('' Criterion and count of different feasible '', CCC 1 ''solutions'')') CCC WRITE(8,'(5(f7.3,i5))') (log10(detrtb(i))-corter, CCC 1 icount(i), i=1,nsol) CCC write(*,103) (ibsbes(i),i=1,ncover) CCC write(8,103) (ibsbes(i),i=1,ncover) CCC 103 format(/' Best feasible solution. Cases covered are'/(15i5)) CCC WRITE(*,'(/'' Grp size averages'')') CCC WRITE(8,'(/'' Grp size averages'')') CCC do j = 1, npop CCC WRITE(*,101) j,int(beswtv(j)),(besave(i,j),i=1,nord) CCC WRITE(8,101) j,int(beswtv(j)),(besave(i,j),i=1,nord) CCC enddo CCC WRITE(*,*) ' Covariance matrix' CCC WRITE(8,'(/'' Covariance matrix'')') CCC do j = 1, nord CCC WRITE(*,102) j,(bescov(i,j)/edf,i=1,nord) CCC WRITE(8,102) j,(bescov(i,j)/edf,i=1,nord) CCC enddo end subroutine itera(data,ave,cov,cinv,datimg,wtv,ustu,deter, 1 igp,ibasis,isin,nord,ncas,npop,ncover) implicit double precision (a-h,o-z) dimension data(nord,ncas),ave(nord,npop),cov(nord,nord), 1 cinv(nord,nord),datimg(nord,ncas),ustu(ncas), 2 ibasis(ncover),isin(ncas),igp(ncas),devi(200),devj(200), 3 upfac(100), dnfac(100),wtv(npop) data one /1.d0/, big /1.d10/ C Initialize to avoid warnings iout = 0 icasot = 0 jin = 0 do j = 1, npop wtv(j) = 0 do i = 1, nord ave(i,j) = 0 enddo enddo do j = 1, nord do i = 1, nord cov(i,j) = 0 enddo enddo do i = 1, ncas isin(i) = 0 enddo c Get initial covariance matrix do inx = 1, ncover icas = ibasis(inx) isin(icas) = 1 ngp = igp(icas) wold = wtv(ngp) wnew = wold + one wtv(ngp) = wnew rati = wold / wnew do i = 1, nord devi(i) = data(i,icas) - ave(i,ngp) ave(i,ngp) = ave(i,ngp) + devi(i) / wnew do j = 1, i cov(i,j) = cov(i,j) + devi(i) * devi(j) * rati enddo enddo enddo do i = 1, nord do j = 1, i cov(j,i) = cov(i,j) cinv(i,j) = cov(i,j) cinv(j,i) = cov(i,j) enddo enddo deter = 1 ixlo = 1 do i = 1, nord call zsweep(cinv,nord,i,deter) enddo do i = 1, nord do j = 1, nord cinv(i,j) = -cinv(i,j) enddo enddo call verify1(cov,cinv,nord) c Major loop point 30 continue do i = 1, npop wtvi = wtv(i) upfac(i) = sqrt(wtvi / (wtvi + one)) dnfac(i) = big if (wtvi .gt. one) dnfac(i) = sqrt(wtvi / (wtvi - one)) enddo c Get images of cases do 41 j = 1, ncas ngp = igp(j) ustu(j) = 0 do 40 i = 1, nord sum = 0 do 45 k = 1, nord 45 sum = sum + cinv(i,k) * (data(k,j) - ave(k,ngp)) datimg(i,j) = sum ustu(j) = ustu(j) + sum * (data(i,j) - ave(i,ngp)) 40 continue 41 continue c Consider possible case swaps best = one do 50 i = 1, ncover icas = ibasis(i) ngp = igp(icas) if(wtv(ngp) .eq. one) go to 50 c c dont remove the only case in a group c firfac = one - dnfac(ngp) ** 2 * ustu(icas) if (firfac .gt. best) go to 50 do 55 j = 1, ncas if (isin(j) .eq. 1) go to 55 c c do pretest c jgp = igp(j) if(jgp .ne. ngp) then c c (we need special codes when the two are in the same group) c factor=firfac*(one+upfac(jgp)**2*ustu(j)) if (factor .ge. best) go to 55 c (cannot beat what we have already) c sum = 0 do 60 k = 1, nord 60 sum=sum+(data(k,icas)-ave(k,ngp))*datimg(k,j) factor=factor+(sum*upfac(jgp)*dnfac(ngp))**2 if(factor.lt.0) then CCC WRITE(*,*) 'Impossible factor. dnfac,ustu(icas),firfac', CCC 1 dnfac(ngp),ustu(icas),firfac,' upfac,ustu(j)', CCC 2 upfac(jgp),ustu(j),' sum', sum CCC WRITE(*,*) ' wtv(ngp)', wtv(ngp) do 155 ik = 1, ncover ikk = ibasis(ik) CCC if(igp(ikk).eq.ngp) WRITE(*,*) 'hit',ik,ikk 155 continue endif if(factor .lt. best) then best = factor iout = i icasot = icas jin = j endif else sum1 = 0 sum2 = 0 divis = wtv(ngp) - one do 61 k = 1, nord ui = data(k,icas) - ave(k,ngp) vi = data(k,j) - ave(k,ngp) + ui / divis vimg = datimg(k,j) + datimg(k,icas) / divis sum1 = sum1 + vi * vimg sum2 = sum2 + ui * vimg 61 continue factor = firfac * (one + divis * sum1 / wtv(ngp)) + 1 sum2 ** 2 if (factor .lt. best) then best = factor iout = i icasot = icas jin = j endif endif 55 continue 50 continue if(best .eq. one) go to 90 c c There is a swap that improves things. Make it c isin(icasot) = 0 ibasis(iout) = jin isin(jin) = 1 deter = deter * best c c Do the downdate, removing case icasot c ngp = igp(icasot) jgp = igp(jin) wold = wtv(ngp) wnew = wold - one rati = wold / wnew wtv(ngp) = wnew fact = rati / (one - rati * ustu(icasot)) do 70 i = 1, nord devi(i) = data(i,icasot) - ave(i,ngp) ave(i,ngp) = ave(i,ngp) - devi(i) / wnew devj(i) = data(i,jin) - ave(i,jgp) do 70 j = 1, i cov(i,j) = cov(i,j) - devi(i) * devi(j) * rati cov(j,i) = cov(i,j) cinv(i,j) = cinv(i,j) + datimg(i,icasot) * 1 datimg(j,icasot) * fact cinv(j,i) = cinv(i,j) 70 continue call verify1(cov,cinv,nord) c c Now do the update, adding case jin c wold = wtv(jgp) wnew = wold + one wtv(jgp) = wnew rati = wold / wnew sum2 = 0 do 80 i = 1, nord ave(i,jgp) = ave(i,jgp) + devj(i) / wnew sum = 0 do 81 j = 1, nord cov(i,j) = cov(i,j) + rati * devj(i) * devj(j) 81 sum = sum + cinv(i,j) * devj(j) devi(i) = sum sum2 = sum2 + devi(i) * devj(i) 80 continue factor = rati / (one + rati * sum2) do 85 i = 1, nord do 85 j = 1, nord 85 cinv(i,j) = cinv(i,j) - devi(i) * devi(j) * factor call verify1(cov,cinv,nord) go to 30 90 return end subroutine verify1(cov,cinv,nord) implicit double precision (a-h,o-z) dimension cov(nord,nord),cinv(nord,nord) data one /1.d0/ biger = 0 do 5 i = 1, nord do 10 j = 1, nord sum = 0 do 15 k = 1, nord 15 sum = sum + cov(i,k) * cinv(k,j) if (i .eq. j) then biger = max(biger,abs(sum-one)) else biger = max(biger,abs(sum)) endif 10 continue 5 continue if (biger .gt. 0.001) then CCC WRITE(*,*) 'Inversion error, departure from I is',biger return endif return end SUBROUTINE ZSWEEP (COV,NORD,NEL,DETER) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION COV(NORD,NORD) DATA ONE/1.D0/ TEMP=COV(NEL,NEL) DETER=DETER*TEMP IF (NORD.GT.1) GO TO 10 COV(1,1)=ONE/TEMP RETURN 10 DO 30 I=1,NORD IF (I.EQ.NEL) GO TO 30 DO 20 J=1,I IF (J.EQ.NEL) GO TO 20 COV(J,I)=COV(I,J)-COV(I,NEL)*COV(NEL,J)/TEMP COV(I,J)=COV(J,I) 20 CONTINUE 30 CONTINUE COV(NEL,NEL)=ONE DO 40 I=1,NORD COV(NEL,I)=-COV(I,NEL)/TEMP COV(I,NEL)=COV(NEL,I) 40 CONTINUE RETURN END FUNCTION ISIGNA (LIST,NROW) DIMENSION LIST(NROW) DATA NPRIM1/30931/, NPRIM2/59473/ ISIG1 = 43 ISIG2 = 23 DO 10 I=1,NROW ITEMP=LIST(I)+1000 ISIG1 = MOD(ISIG1*ITEMP,NPRIM1) ISIG2 = MOD(ISIG2*ITEMP,NPRIM2) 10 CONTINUE ISIGNA = ISIG1 * ISIG2 RETURN END rrcov/src/ds11.f0000644000176200001440000003413013373003060013107 0ustar liggesusers subroutine rlds(n,np,nresamp,x,tune,wk,locat,cov,maxres, 1 nresper,w,z,icent,iwork) c c c INPUT: 'n' = number observations (integer); c 'np' = number of indepent variables (integer); c 'nresamp' = mumber of resamples required (integer), may not be reached c if too many of the subsamples of size 'np', chosen out of c the observed vectors, are in a hyperplane; c if nresamp=0, ALL subsamples are taken; c 'x' = real (n*np) matrix of observed values; c 'tune' = tuning constant used in calculation of weights; c by default should be equal to the square root of the c 95-percentile of the chi-square distribution with 'np' c degrees of freedom (real). c 'seed' = seed for calculating random numbers (real); c 'wk' = real work vector of length (4*n+np). On output, c wk(1),..,wk(n) contain the weights assigned to c each observation; c 'maxres' = maximum nunber of resamples to be performed (integer), c including those which are discarded due to linearly c dependent subsamples. c 'icent'= if 0 the observations are centered with 0 c c OUTPUT: 'locat' = real vector of location parameters, of length c 'np'; c 'cov' = real (np*np) Donoho-Stahel covariance matrix; c 'nresper' = number of valid resamples performed (integer). c 'w' = weights c 'z' = outlyigness c c NOTE: all real variables are double precision. c implicit double precision (a-h,o-z) double precision locat(np) dimension x(n,np),wk(4*n+np),cov(np,np),w(n),z(n), iwork(4*n+np) nr=1 nind=nr+n naux=nind+np C CALL INTPR('ENTER rlds. nresamp=',-1,nresamp,1) C CALL INTPR('maxres=',-1,maxres,1) C CALL INTPR('icent=',-1,icent,1) call rndstart() call rlweights(n,np,nresamp,x,tune,w,z,locat,wk(nr),iwork(nind), 1 cov,wk(naux),maxres,nresper,icent) call rldonostah(n,np,x,w,locat,cov,icent) call rndend() return end subroutine rlweights(n,np,nresamp,x,c,w,z,a,b,ind,wk, 1 u,maxres,nresper,icent) implicit double precision (a-h,o-z) dimension x(n,np),z(n),a(np),b(n),w(n),ind(np),u(n) dimension wk(np,np) C CALL INTPR('ENTER rlweights',-1,0,0) k1=(np-1)+(n+1)/2 k2=(np-1)+(n+2)/2 z1=dble(k1) zn=dble(n) z3=(1+(z1/zn))/2 call rlquntbi(z3, cc) do i=1,n z(i)=-1. enddo nresper=0 if(np.eq.1) then call rlprocess(n,np,nresper,x,a,b,w,z,ind,wk,u,k1, + k2,cc,icent) elseif (nresamp.eq.0) then call rlall(n,np,nresper,x,a,b,w,z,ind,wk,u,k1,k2,cc,icent) else k=0 do while (k.lt.maxres.and.nresper.lt.nresamp) k=k+1 call rlsubsamp(n,np,ind) call rlprocess(n,np,nresper,x,a,b,w,z,ind,wk,u,k1, + k2,cc,icent) enddo endif C CALL DBLEPR('zi',-1,z,n) do i=1,n call rlrwetml(z(i)/c,w(i)) enddo C CALL DBLEPR('EXIT rlweights: wi=',-1,w,n) return end subroutine rlall(n,np,nresper,x,a,b,w,z,ind,wk,u,k1,k2,cc,icent) implicit double precision (a-h,o-z) dimension x(n,np),z(n),a(np),b(n),w(n),ind(np),u(n) dimension wk(np,np) do j=1,np ind(j)=j enddo call rlprocess(n,np,nresper,x,a,b,w,z,ind,wk,u,k1,k2,cc,icent) j=0 do while (np-j.ge.1) if (ind(np-j).eq.n-j) then j=j+1 else ind(np-j)=ind(np-j)+1 do k=np-j+1,np ind(k)=ind(k-1)+1 enddo call rlprocess(n,np,nresper,x,a,b,w,z,ind, + wk,u,k1,k2,cc,icent) j=0 endif enddo return end subroutine rlprocess(n,np,nresper,x,a,b,w,z,ind,wk, + u,k1,k2,cc,icent) implicit double precision (a-h,o-z) dimension x(n,np),z(n),a(np),b(n),w(n),ind(np),u(n) dimension wk(np,np) data tola,tolr,big1,big2 /1.d-15, 1.d-8,1.d+2,1.d+15/ C CALL INTPR('ENTER rlprocess',-1,0,0) CALL RCHKUSR() ierr=0 if(np.gt.1) then call rlvectora(n,np,x,a,ind,wk,icent,ierr) endif C CALL INTPR('IERR',-1,ierr,1) C CALL DBLEPR('A',-1,a,np) if (ierr.eq.0) then nresper=nresper+1 C VT::19.07.2010 C Handle the univariate case if(np.eq.1) then do i=1,n b(i)=x(i,1) enddo else do i=1,n b(i)=0. do j=1,np b(i)=b(i)+x(i,j)*a(j) enddo enddo endif bmed=0.0d0 if(icent.ne.0) bmed=rlamed(b,n,u) do i=1,n w(i)=abs(b(i)-bmed) enddo ww=0 do i=1,n ww=ww+w(i) enddo ww=ww/n if(ww.ge.tola) then call rlsort(w,n,1) bmad=(w(k1)+w(k2))/2 bmad=bmad/cc if(bmad.ge.tolr *ww) then do i=1,n aux=abs(b(i)-bmed)/bmad if (aux.gt.z(i)) z(i)=aux enddo else do i=1,n if(abs(b(i)-bmed).gt. big1*bmad) z(i)=big2 enddo endif endif endif return end subroutine rlvectora(n,np,x,a,ind,wk,icent,ierr) implicit double precision (a-h,o-z) dimension x(n,np),a(np),ind(np),wk(np,np) do k=1,np do j=1,np wk(j,k)=x(ind(k),j) enddo enddo call rldirec(wk,np,np,icent,ierr,a) return end subroutine rldonostah(n,np,x,w,locat,cov,icent) implicit double precision (a-h,o-z) double precision locat(np) dimension x(n,np),w(n),cov(np,np) sumw=0. sumw2=0. do i=1,n sumw=sumw+w(i) sumw2=sumw2+w(i)*w(i) enddo do j=1,np locat(j)=.0 enddo if(icent.eq.1)then do j=1,np locat(j)=0. do i=1,n locat(j)=locat(j)+w(i)*x(i,j) enddo locat(j)=locat(j)/sumw enddo endif do j=1,np do k=1,np cov(j,k)=0. do i=1,n cov(j,k)=cov(j,k)+w(i)*(x(i,j)-locat(j))* 1 w(i)*(x(i,k)-locat(k)) enddo cov(j,k)=cov(j,k)/sumw2 enddo enddo return end subroutine rlsubsamp(n,np,ind) implicit double precision (a-h,o-z) dimension ind(np) en=dble(n) C call roblibrunif(RND) RND = unifrnd() ind(1)=int(en*RND+1.) if (np.eq.1) return k=2 c 10 call roblibrunif(RND) 10 RND = unifrnd() ind(k)=int(en*RND+1.) do i=1,k-1 if (ind(i).eq.ind(k)) go to 10 enddo if (k.eq.np) return k=k+1 go to 10 end double precision function rlamed(z,n,aux) implicit double precision (a-h,o-z) DIMENSION Z(n),aux(n) DO 100 I=1,N 100 AUX(I)=Z(I) CALL rlSORT (AUX,N,1) I=N/2 K=I*2 rlamed=AUX(I+1) IF (k.GE.N) rlamed=(rlamed+AUX(I))/2. RETURN END SUBROUTINE RLSORT (A,N,SWITCH) implicit double precision (a-h,o-z) DIMENSION A(n) INTEGER SWITCH IF (N.LE.1) GO TO 999 M=1 106 M=M+M IF(M.LE.N) GO TO 106 M=M-1 994 M=M/2 IF (M.EQ.0) GO TO 999 KK=N-M J=1 992 I=J 996 IM=I+M IF(SWITCH) 810,810,800 800 IF (A(I).GT.A(IM)) GO TO 110 GO TO 995 810 IF(A(I).LT.A(IM)) GO TO 110 995 J=J+1 IF(J.GT.KK) GO TO 994 GO TO 992 110 TEMP=A(I) A(I)=A(IM) A(IM)=TEMP I=I-M IF (I.LT.1) GO TO 995 GO TO 996 999 RETURN END double precision function rldprodd(x,y,nn) implicit double precision (a-h,o-z) dimension x(nn), y(nn) rldprodd=0. do i=1,nn rldprodd=rldprodd+x(i)*y(i) enddo return end double precision function rlrobustdnorm(x,nn) implicit double precision (a-h,o-z) dimension x(nn) rlrobustdnorm=rldprodd(x,x,nn) rlrobustdnorm=dsqrt(rlrobustdnorm) return end subroutine rlxnorma(x,nn,ierr,tol) implicit double precision (a-h,o-z) dimension x(nn) ierr=1 dn=rlrobustdnorm(x,nn) if (dn.le.tol) then ierr=1 return else ierr=0 endif do i=1,nn x(i)=x(i)/dn enddo return end subroutine rlorthog(xx,nn,mm,nmain,ierr) implicit double precision (a-h,o-z) dimension xx(nmain,mm) data tola,tolr /1.d-15, 1.d-8/ C In original code tolb was never initialized (was 0 on Solaris, random on HP) tolb = tola do j=1,mm call rlxnorma(xx(1,j),nn,ierr,tola) if (ierr.gt.0) return enddo mm1=mm-1 do j=1,mm1 call rlxnorma(xx(1,j),nn,ierr,tolr) if (ierr.ne.0) return j1=j+1 do k=j1,mm dp=rldprodd(xx(1,j),xx(1,k),nn) do i=1,nn xx(i,k)=xx(i,k)-xx(i,j)*dp enddo enddo enddo call rlxnorma(xx(1,mm),nn,ierr,tolb) C if (ierr .ne. 0) write(*,*) 'rlxnorma(...,tolb) failed!' return end subroutine rlortdir(xx,mm,nmain,dire) implicit double precision (a-h,o-z) dimension xx(nmain,mm), dire(mm) tol=1./dsqrt(dble(mm)) mm1=mm-1 do k=1,mm do i=1,mm dire(i)=0 do j=1,mm1 dire(i)=dire(i)-xx(i,j)*xx(k,j) enddo enddo dire(k)=dire(k)+1 dn=rlrobustdnorm(dire,mm) if (dn.ge.tol) goto 40 enddo 40 do i=1,mm dire(i)=dire(i)/dn enddo return end subroutine rldirec(xx,mm,nmain,icent,ierr,dire) implicit double precision (a-h,o-z) dimension xx(nmain,mm), dire(mm) mm1=mm if (icent.ne.0)then mm1=mm-1 do k=1,mm1 do i=1,mm xx(i,k)=xx(i,k)-xx(i,mm) enddo enddo endif call rlorthog(xx,mm,mm1,nmain,ierr) if (ierr.eq.0) call rlortdir(xx,mm,nmain,dire) return end SUBROUTINE RLRWETML(X,P) C....................................................................... DOUBLE PRECISION X,AX,P,COEF,ZERO DIMENSION COEF(4) DATA ZERO/0.D0/ DATA COEF/-19.7187928669416D0, + 82.3045267489739D0, + -105.4526748971229D0, + 42.8669410150906D0/ C----------------------------------------------------------------------- C CALCULATE WEIGHT FUNCTION FOR REWEIGHTING C NOTE: X >= 0 C----------------------------------------------------------------------- AX = DABS(X) IF (AX .GE. 1.D0) THEN P = ZERO ELSE IF (AX .LE. 0.8D0) THEN P = 1.D0 ELSE P = COEF(1)+COEF(2)*AX**2+COEF(3)*AX**4+COEF(4)*AX**6 ENDIF C CALL DBLEPR('IN RLRWETML',-1,p,1) RETURN END C======================================================================= SUBROUTINE RLQUNTBI(P,X) C....................................................................... DOUBLE PRECISION C(6),P,P1,T,X,XN,XZ DATA C(1),C(2),C(3),C(4),C(5),C(6)/ + 2.515517D0,0.802853D0,0.010328D0, + 1.432788D0,0.189269D0,0.001308D0/ C----------------------------------------------------------------------- C INVERSE OF GAUSSIAN DISTRIBUTION FUNCTION C----------------------------------------------------------------------- C P: I, PROBABILITY, C X: O, QUANTILE. C----------------------------------------------------------------------- P1=P IF (P .GT. 0.5D0) P1=1.D0-P T=DSQRT(-2.D0*DLOG(P1)) XZ=(C(3)*T+C(2))*T+C(1) XN=((C(6)*T+C(5))*T+C(4))*T+1.D0 X=T-XZ/XN IF (P .LT. 0.5D0) X=-X RETURN END rrcov/src/sest.c0000644000176200001440000005523313711115663013332 0ustar liggesusers/* TO DO - FIXME * - Fix the parameters maxit, rtol and converged * - Fix "if(ires > 0) ... else" -there is no need of such distinction * - Use QR to compute the inverse of the cov matrix - see mtxdet(). */ #include #include #include #include /* for the QR routines */ #define MAX_NTRY 1000 /* was 500 */ #define ZERO 1e-10 #define INFI 1e+20 void r_sample(int *x, int *n, int *k); void selectwr(int *array, int size, int nchoices); void reverse(int *a, int n); void resample(int *array, int n, int k); void covp(double **x, int *n, int *p, int *indices, int *nind, double *mean, double **cov, double *det, int *rank); void covpold(double **a, int n, int p, int *id, int np, double *t, double ** cov); void covar(double **a, int n, int p, double *t, double ** cov); void covwt(double **a, int n, int p, double *wts, double *t, double **cov); double mymed(int n, double *x); double mymedabs(int n, double *x); double mad(int n, double *x, double *dwork1, double *dwork2, double *mu); int maxind(double *a, double *maxval, int n); double norm (double *x, int n); double norm1(double *x, int n); double norm_diff (double *x, double *y, int n); double norm1_diff(double *x, double *y, int n); int mtxdet(double **c, int p, double *det); void mtxswp(double **a, int p, int k); void mtxinv(double **a, int p, double *det); void mtxtra(double **a, double **b, int n, int p); void vectra(double *a, double *b, int n); void mtxmsc(double **a, double s, int n, int p); double **mtxalloc(int n, int p); void mtxfree(double **a, int n, int p); void resdis(double **x, int n, int p, double *mu, double **sigma, double *d); double rhobw(double u, double cc); double mean_rhobw(double *u, double scale, int n, double cc); double lossS(double *u, double scale, int n, double cc); double scaleS(double *u, double kp, double cc, double initial_sc, int n); void scaledpsi(double *u, double scale, int n, double cc, double *w); int refine_s(double **x, int n, int p, double *init_mu, double **init_sigma, double init_scale, int k, int conv, double kp, double cc, double *mu, double **sigma, double *scale, double *rdis, double *weights); /* * Compute FAST-S estimates of location and covariance matrix - * similar to the one proposed for regression by * Salibian-Barrera, M. and Yohai, V.J. (2005), * "A fast algorithm for S-regression estimates". * This current C implemention is by Valentin Todorov. * * INPUT: * X - input data matrix - linear (FORTRAN) nn by pp * nsamp - number of initial samples to generate * cc1 - constant for the biweight function * kkp - constant (b) for the S-equation * bbest_r - number of 'best' solution to keep and iterate to convergence later * kstep * maxit * rtol * * OUTPUT: * ctr - location vector * ccov - covariance matrix (linear, p by p) * scale - scale * converged * */ void sest(double *X, int *nn, int *pp, int *nsamp, double *ctr, double *ccov, double *scale, double *cc1, double *kkp, int *bbest_r, int *kstep, int *maxit, double *rtol, int *converged); /* for "tracing" only : */ void disp_mat(double **a, int n, int m); void disp_dble(double *a, int n); void disp_int(int *a, int n); void disp_lmat(double *a, int n, int p); #define _use_blas_ /* ||x||_2 */ double norm(double *x, int n) { #ifdef _use_blas_ int one = 1; return(F77_CALL(dnrm2)(&n, x, &one)); #else int i; double s = 0.; for(i=0; i < n; i++) s += x[i] * x[i]; return(sqrt(s)); #endif } double norm1(double *x, int n) { #ifdef _USE_BLAS_ int one = 1; return(F77_CALL(dasum)(&n, x, &one)); #else int i; double s = 0.; for(i=0; i < n; i++) s += fabs(x[i]); return(s); #endif } /* ||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); } /* * Resample without replacement: * Interface to R - call it from R instead of sample() for tests * when you want to have exactly the same sequence. * */ void r_sample(int *x, int *n, int *k) { int i; resample(x, *n, *k); for(i=0; i<*k; i++) x[i] += 1; } /* * Resample without replacement - k out of n elements of the array 'array' * */ void resample(int *array, int n, int k) { int i; for(i=0; i MAX_NTRY) { REprintf("\nToo many singular resamples\nAborting sest()\n\n"); *sscale = -1.0; goto cleanup_and_return; } resample(b_i, n, p+1); //covp(x, n, p, b_i, p+1, tmp, tmp_mat); //singular = mtxdet(tmp_mat, p, &det); covp(x, &n, &p, b_i, &nind, tmp, tmp_mat, &det, &rank); singular = rank < p; // REprintf("\n%d: Singular=%d, LOGDET= %lf\n", ires, singular, det); } mtxmsc(tmp_mat, pow(exp(det), -1.0/p), p, p); // Perform k steps of iterative reweighting on the elemental set if(*kstep > 0) { // do the refining: no convergence, only several (kstep) iterations refine_s(x, n, p, tmp, tmp_mat, -1, *kstep, conv, kp, c1, mu, sigma, &scale, rdis, weights); } else { // k = 0 means "no refining" vectra(tmp, mu, p); mtxtra(tmp_mat, sigma, p, p); resdis(x, n, p, mu, sigma, rdis); scale = mymedabs(n, rdis)/.6745; } if(ires > 0) { /* * if this isn't the first iteration.... * check whether new mu/sigma belong to the top best results; if so keep * mu and sigma with corresponding scale. */ s_test = lossS(rdis, s_worst, n, c1); if(s_test < kp) { s_best = scaleS(rdis, kp, c1, scale, n); ind = maxind(best_scales, &s_worst, best_r); best_scales[ind] = s_best; for(i=0; i= 0), it's used, o/w the MAD is used * k = number of refining steps * conv = 0 means "do k steps and don't check for convergence" * conv = 1 means "stop when convergence is detected, or the * maximum number of iterations is achieved" * kp and cc = tuning constants of the equation */ int refine_s(double **x, int n, int p, double *init_mu, double **init_sigma, double init_scale, int k, int conv, double kp, double cc, double *mu, double **sigma, double *scale, double *rdis, double *weights) { double convtol = 1e-20; double *mu_1 = (double *)Calloc(p, double); double **sigma_1 = mtxalloc(p,p); double **tmp_mat = mtxalloc(p,p); double sc, det; int i, singular; resdis(x, n, p, init_mu, init_sigma, rdis); if(init_scale < 0.0) init_scale = sc = mymedabs(n, rdis)/.6745; else sc = init_scale; // if conv == 1 then set the max no. of iterations to 50 // magic number alert!!! if(conv == 1) k = 50; // copy the initial estimates mu and sigma to work storage vectra(init_mu, mu, p); mtxtra(init_sigma, sigma, p, p); for(i=0; i= 0) // not singular { for(l=0; l 5 && p < 8) eps = 1.0E-14; else eps = 1.0E-16; *det = 1.0; for(j=0; j c1 */ double rhobw(double u, double cc) { double t2, c2 = cc*cc; double ret = c2/6; if(fabs(u) <= cc) { t2 = u*u; ret = t2*(1.0 - t2/c2 + t2*t2/(3*c2*c2))/2; } return ret; } /* * Return the mean of the rho(u/scale) for the Tukey's * biweight function rho() * 1/n * sum(rho(u/s)) */ double mean_rhobw(double *u, double scale, int n, double cc) { int i; double s = 0; for(i=0; i < n; i++) s += rhobw(u[i]/scale, cc); return (s/n); } /* * The objective function: * we solve loss.S(u, s, cc) = b for "s" */ double lossS(double *u, double scale, int n, double cc) { return mean_rhobw(u, scale, n, cc); } /* * Scaled psi function for Tukey's biweight to comute the weights: * Weight function = psi(u)/u */ void scaledpsi(double *u, double scale, int n, double cc, double *w) { int i=0; double t; // ##ifelse(abs(xx) < c1, xx - 2 * xx^3/c1^2 + xx^5/c1^4, 0) for(i=0; i eps) { sc2 = sqrt(sc*sc * mean_rhobw(u, sc, n, cc) / kp); err = fabs(sc2/sc - 1.0); sc = sc2; } return(sc); } void disp_dble(double *a, int n) { int i; for(i=0; i < n; i++) Rprintf("%lf ",a[i]); Rprintf("\n"); } void disp_int(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"); } /* * Display an nxp matrix stored in linear array in * row major order (C) */ void disp_lmat(double *a, int n, int p) { int i,j; for(i=0; i < n; i++) { Rprintf("\n"); for(j=0; j < p; j++) Rprintf("%10.8f ", a[i*p+j]); } Rprintf("\n"); } /* Compute the determinant and check if the matrix 'c' is singular using QR decomposition */ int mtxdet(double **c, int p, double *det) { int i, j, k; int rank; double sum, tol = 1.0e-7; double *cx = (double *) R_alloc(p*p, sizeof(double)); double *qraux = (double *) R_alloc(p, sizeof(double)); double *work = (double *) R_alloc(2*p, sizeof(double)); int *pivot = (int *) R_alloc(p, sizeof(int)); for(i=0; i 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(); } rrcov/src/Makevars0000644000176200001440000000005613373003060013664 0ustar liggesusersPKG_LIBS=$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) rrcov/src/rrcov_init.c0000644000176200001440000000357713373003060014525 0ustar liggesusers// VT::21.05.2018 - this file was added to fix the warning // "Found no calls to: R_registerRoutines, R_useDynamicSymbols" // // About registration of native symbols see for example: https://www.r-bloggers.com/1-easy-package-registration/ // also here http://r.789695.n4.nabble.com/Registration-of-native-routines-td4728874.html // // There is a new function in 'tools' package: // package_native_routine_registration_skeleton() // // - about Windows - take the 64 bit version of mingw! // #include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .C calls */ extern void r_fast_mve(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void sest(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); /* .Call calls */ extern SEXP covOPW(SEXP, SEXP, SEXP, SEXP); /* .Fortran calls */ extern void F77_NAME(fsada)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rlds)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"r_fast_mve", (DL_FUNC) &r_fast_mve, 12}, {"sest", (DL_FUNC) &sest, 14}, {NULL, NULL, 0} }; static const R_CallMethodDef CallEntries[] = { {"covOPW", (DL_FUNC) &covOPW, 4}, {NULL, NULL, 0} }; static const R_FortranMethodDef FortranEntries[] = { {"fsada", (DL_FUNC) &F77_NAME(fsada), 15}, {"rlds", (DL_FUNC) &F77_NAME(rlds), 14}, {NULL, NULL, 0} }; void R_init_rrcov(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } rrcov/src/covOPW.c0000644000176200001440000002227713373003060013522 0ustar liggesusers#include "R.h" #include "Rinternals.h" #include "Rmath.h" #include "R_ext/BLAS.h" #include "R_ext/Lapack.h" typedef double (scaleFnPtr)(int, double*, double*, double*, double*); typedef double (rcovFnPtr)(int, double*, double*, scaleFnPtr*, double*, double*, double*); double my_mad(int n, double *x, double *dwork1, double *dwork2, double *mu); double my_median(int n, double *x); double gk(int n, double *x, double *y, scaleFnPtr *scalefn, double *dwork1, double *dwork2, double *dwork3); double qc(int n, double *x, double *y, scaleFnPtr *scalefn, double *dwork1, double *dwork2, double *dwork3); double dsum(int n, double* x, int incx, double* wrkn); double scaleTau2(int n, double *x, double *dwork1, double *dwork2, double *mu); SEXP covOPW(SEXP SX, SEXP Siter, SEXP SscaleFun, SEXP SrcovFun) { char CHARA = 'A', CHARL = 'L', CHARN = 'N', CHART = 'T', CHARV = 'V'; double *X = NULL, *Z = NULL, *ZCOPY = NULL, *U = NULL, **A = NULL, *d = NULL; double *dwork1 = NULL, *dwork2 = NULL, *dwork3 = NULL, *diagT = NULL, *offdiagT = NULL; double *tau = NULL, *gamma = NULL, *cov = NULL, *covcopy = NULL, *center = NULL, *dist = NULL; double mu = 0.0, alpha = 0.0, DZERO = 0.0, DONE = 1.0; int n = 0, p = 0, np = 0, pp = 0, iter = -1, i = 0, j = 0, k = 0, info = 0, lwork = 0; int liwork = 0, IONE = 1; int *isuppz = NULL, *iwork = NULL; SEXP Sans = R_NilValue, Scov = R_NilValue, Scenter = R_NilValue; SEXP Sdist = R_NilValue, Sdim = R_NilValue, Snames = R_NilValue; scaleFnPtr *scalefn = NULL; rcovFnPtr *rcovfn = NULL; if(strncmp(CHAR(asChar(SscaleFun)), "s_mad", 5) == 0) scalefn = &my_mad; else if(strncmp(CHAR(asChar(SscaleFun)), "scaleTau2", 9) == 0) scalefn = &scaleTau2; else error("unable to set scale function pointer in C function covOPW"); if(strncmp(CHAR(asChar(SrcovFun)), "gk", 2) == 0) rcovfn = &gk; else if(strncmp(CHAR(asChar(SrcovFun)), "qc", 2) == 0) rcovfn = &qc; else error("unable to set rcov function pointer in C function covOPW"); if(!isMatrix(SX)) error("first argument to C function covOPW is not a matrix"); PROTECT(Sdim = getAttrib(SX, R_DimSymbol)); n = INTEGER(Sdim)[0]; p = INTEGER(Sdim)[1]; Sdim = R_NilValue; UNPROTECT(1); np = n*p; pp = p*p; lwork = 18*p; liwork = 10*p; iter = INTEGER(Siter)[0]; X = REAL(SX); Z = (double*) R_alloc((size_t) np, sizeof(double)); F77_CALL(dcopy)(&np, X, &IONE, Z, &IONE); ZCOPY = (double*) R_alloc((size_t) np, sizeof(double)); U = (double*) R_alloc((size_t) (p*(p+1))/2, sizeof(double)); covcopy = (double*) R_alloc((size_t) pp, sizeof(double)); A = (double**) R_alloc((size_t) iter, sizeof(double*)); for(k = 0; k < iter; k++) A[k] = (double*) R_alloc((size_t) pp, sizeof(double)); d = (double*) R_alloc((size_t) p, sizeof(double)); dwork1 = (double*) R_alloc((size_t) n, sizeof(double)); dwork2 = (double*) R_alloc((size_t) n, sizeof(double)); dwork3 = (double*) R_alloc((size_t) imax2(n, lwork), sizeof(double)); diagT = (double*) R_alloc((size_t) p, sizeof(double)); offdiagT = (double*) R_alloc((size_t) p, sizeof(double)); tau = (double*) R_alloc((size_t) (p-1), sizeof(double)); gamma = (double*) R_alloc((size_t) p, sizeof(double)); isuppz = (int*) R_alloc((size_t) (2*p), sizeof(int)); iwork = (int*) R_alloc((size_t) liwork, sizeof(int)); for(k = 0; k < iter; k++) { for(j = 0; j < p; j++) { d[j] = scalefn(n, Z+j*n, dwork1, dwork2, &mu); //this can be handled better if(fabs(d[j]) < 1e-12) error("column with zero scale encountered in C function covOPW"); alpha = 1.0 / d[j]; F77_CALL(dscal)(&n, &alpha, Z+j*n, &IONE); } for(i = 0; i < p; i++) U[i+((2*p-i-1)*i)/2] = 1.0; for(i = 1; i < p; i++) for(j = 0; j < i; j++) U[i+((2*p-j-1)*j)/2] = rcovfn(n, Z+i*n, Z+j*n, scalefn, dwork1, dwork2, dwork3); /* Rprintf("\n %d (%d): %d, %d, %d, %d %d %d \n", k, iter, n, p, np, pp, lwork, liwork); */ F77_CALL(dsptrd)(&CHARL, &p, U, diagT, offdiagT, tau, &info); F77_CALL(dstegr)(&CHARV, &CHARA, &p, diagT, offdiagT, &mu, &mu, &i, &i, &DZERO, &j, gamma, A[k], &p, isuppz, dwork3, &lwork, iwork, &liwork, &info); F77_CALL(dopmtr)(&CHARL, &CHARL, &CHARN, &p, &p, U, tau, A[k], &p, dwork2, &info); for(j = 0; j < p/2; j++) F77_CALL(dswap)(&p, A[k]+j*p, &IONE, A[k]+p*(p-j-1), &IONE); F77_CALL(dcopy)(&np, Z, &IONE, ZCOPY, &IONE); F77_CALL(dgemm)(&CHARN, &CHARN, &n, &p, &p, &DONE, ZCOPY, &n, A[k], &p, &DZERO, Z, &n); for(i = 0; i < p; i++) for(j = 0; j < p; j++) A[k][i+j*p] = d[i] * A[k][i+j*p]; } PROTECT(Scov = allocMatrix(REALSXP, p, p)); PROTECT(Scenter = allocVector(REALSXP, p)); PROTECT(Sdist = allocVector(REALSXP, n)); cov = REAL(Scov); center = REAL(Scenter); dist = REAL(Sdist); for(j = 0; j < p; j++) { gamma[j] = scalefn(n, Z+j*n, dwork1, dwork2, &mu); for(i = 0; i < p; i++) cov[i+j*p] = i == j ? gamma[j] * gamma[j] : 0.0; center[j] = mu; } for(i = 0; i < n; i++) { for(j = 0; j < p; j++) Z[i+j*n] = R_pow_di(((Z[i+j*n] - center[j]) / gamma[j]), 2); dist[i] = F77_CALL(dasum)(&p, Z+i, &n); } for(k = iter-1; k >= 0; k--) { F77_CALL(dcopy)(&pp, cov, &IONE, covcopy, &IONE); F77_CALL(dgemm)(&CHARN, &CHARN, &p, &p, &p, &DONE, A[k], &p, covcopy, &p, &DZERO, cov, &p); F77_CALL(dcopy)(&pp, cov, &IONE, covcopy, &IONE); F77_CALL(dgemm)(&CHARN, &CHART, &p, &p, &p, &DONE, covcopy, &p, A[k], &p, &DZERO, cov, &p); F77_CALL(dcopy)(&p, center, &IONE, gamma, &IONE); F77_CALL(dgemv)(&CHARN, &p, &p, &DONE, A[k], &p, gamma, &IONE, &DZERO, center, &IONE); } PROTECT(Sans = allocVector(VECSXP, 3)); SET_VECTOR_ELT(Sans, 0, Scenter); SET_VECTOR_ELT(Sans, 1, Scov); SET_VECTOR_ELT(Sans, 2, Sdist); PROTECT(Snames = allocVector(STRSXP, 3)); SET_STRING_ELT(Snames, 0, mkChar("center")); SET_STRING_ELT(Snames, 1, mkChar("cov")); SET_STRING_ELT(Snames, 2, mkChar("distances")); setAttrib(Sans, R_NamesSymbol, Snames); UNPROTECT(5); return Sans; } double my_median(int n, double *x) { int k = -1; if(n%2) { k = (n-1)/2; rPsort(x, n, k); return(x[k]); } k = n/2; rPsort(x, n, k); rPsort(x, k, k-1); return((x[k-1] + x[k]) / 2.0); } double my_mad(int n, double *x, double *dwork1, double *dwork2, double *mu) { const int IONE = 1; int i = 0; F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); *mu = my_median(n, dwork1); for(i = 0; i < n; i++) dwork1[i] = fabs(dwork1[i] - *mu); return my_median(n, dwork1) * 1.4826; } double gk(int n, double *x, double *y, scaleFnPtr *scalefn, double *dwork1, double *dwork2, double *dwork3) { const int IONE = 1; double plus = 0.0, minus = 0.0, mu = 0.0; const double DONE = 1.0, DNEGONE = -1.0; F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); F77_CALL(daxpy)(&n, &DONE, y, &IONE, dwork1, &IONE); plus = scalefn(n, dwork1, dwork2, dwork3, &mu); F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); F77_CALL(daxpy)(&n, &DNEGONE, y, &IONE, dwork1, &IONE); minus = scalefn(n, dwork1, dwork2, dwork3, &mu); return (R_pow_di(plus, 2) - R_pow_di(minus, 2)) / 4.0; } double scaleTau2(int n, double *x, double *dwork1, double *dwork2, double *mu) { const double C1 = 4.5, C2squared = 9.0; // const double C2 = 3.0; const double Es2c = 0.9247153921761315; double medx = 0.0, sigma0 = 0.0, tmpsum = 0.0; int i = 0, IONE = 1; F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); medx = my_median(n, dwork1); for(i = 0; i < n; i++) dwork1[i] = fabs(dwork1[i] - medx); sigma0 = my_median(n, dwork1); F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); for(i = 0; i < n; i++) { dwork1[i] = fabs(dwork1[i] - medx); dwork1[i] = dwork1[i] / (C1 * sigma0); dwork2[i] = 1.0 - R_pow_di(dwork1[i], 2); dwork2[i] = R_pow_di(((fabs(dwork2[i]) + dwork2[i])/2.0), 2); } tmpsum = dsum(n, dwork2, 1, dwork1); for(i = 0; i < n; i++) dwork1[i] = x[i] * dwork2[i]; *mu = dsum(n, dwork1, 1, dwork2) / tmpsum; F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); for(i = 0; i < n; i++) { dwork2[i] = R_pow_di((dwork1[i] - *mu) / sigma0, 2); dwork2[i] = dwork2[i] > C2squared ? C2squared : dwork2[i]; } return sigma0 * sqrt(dsum(n, dwork2, 1, dwork1) / (n*Es2c)); } double qc(int n, double *x, double *y, scaleFnPtr *scalefn, double *dwork1, double *dwork2, double *dwork3) { double medx = 0.0, medy = 0.0, r = 0.0; int IONE = 1, i = 0, onethree = 0, twofour = 0; F77_CALL(dcopy)(&n, x, &IONE, dwork1, &IONE); medx = my_median(n, dwork1); F77_CALL(dcopy)(&n, y, &IONE, dwork1, &IONE); medy = my_median(n, dwork1); for(i = 0; i < n; i++) { if((x[i] > medx && y[i] > medy) || (x[i] < medx && y[i] < medy)) onethree++; else if((x[i] > medx && y[i] < medy) || (x[i] < medx && y[i] > medy)) twofour++; } r = ((double) (onethree - twofour)) / ((double) (onethree + twofour)); return sin(M_PI_2*r); } double dsum(int n, double* x, int incx, double* wrkn) { int i = 0; if(n == 1) return x[0]; while(i < n/2) { wrkn[i] = x[2*incx*i] + x[(2*i+1)*incx]; i++; } if(2*i < n) wrkn[i-1] = wrkn[i-1] + x[2*incx*i]; return dsum(i, wrkn, 1, wrkn+i); } rrcov/src/fast-mve.c0000644000176200001440000001453313373003060014063 0ustar liggesusers /* FILE: fast-mve.c // */ #include #include #include #include "R.h" #include "R_ext/Linpack.h" #include #define INFI 1e+20 #define EPS_DET 1e-5 void r_fast_mve(double *xx, int *nn, int *pp, int *nnsamp, int *nsingular, double *ctr, double *ccov, double *scale, int *best_ind, int *nnind, int *nn2, double *pchimed) { void r_find_k_smallest(double *a, int n, int k, int *ind, double *tmp); void r_mean_cov_mah_sample(double *x, int *n, int *p, int *indices, int *nind, double *xw, double *mean, double *cov, double *mah_d, double *det, int *pivot, double *qraux, double *work, int *rank, int *compute_cov, int *compute_distances, int *compute_det); double median(double *x, int n, double *aux); void sample_noreplace(int *x, int n, int k, int *all_ind); int *indi, iter, *pivot, rank, *all_ind; int compute_cov, compute_det, compute_distances; register int i, j; int n = *nn, p = *pp, nsamp = *nnsamp, n2 = *nn2, nind = *nnind; double s0 = INFI, s, *best_ctr, det1, det2; double *di, *tmp, *qraux, *tmp2, dn3; double *cov_vec; double xmed, calpha; double chimed = *pchimed; /* qchisq(0.5, p) */ all_ind = (int *) malloc( n * sizeof(int) ); cov_vec = (double*) calloc( p * p, sizeof(double) ); qraux = (double *) malloc( p * sizeof(double) ); tmp2 = (double *) malloc( 2 * p * sizeof(double) ); /* work */ pivot = (int *) malloc( p * sizeof(int) ); indi = (int *) calloc( n , sizeof(int) ); best_ctr = (double *) malloc( p * sizeof(double) ); di = (double *) malloc( n * sizeof(double) ); tmp = (double *) malloc( n * p * sizeof(double) ); GetRNGstate(); /* set the seed from R? */ dn3 = pow( (double) n2 - 1.0, (double) p); for(iter=0; iter < nsamp; iter++) { compute_distances = 1; compute_det = 1; compute_cov = 0; R_CheckUserInterrupt(); rank = 0; sample_noreplace(indi, n, nind, all_ind); r_mean_cov_mah_sample(xx, nn, pp, indi, &nind, tmp, ctr, cov_vec, di, &det1, pivot, qraux, tmp2, &rank, &compute_cov, &compute_distances, &compute_det); if( rank == p ) { r_find_k_smallest(di, n, n2, indi, tmp); compute_distances = 1; compute_det = 1; compute_cov = 1; r_mean_cov_mah_sample(xx, nn, pp, indi, &n2, tmp, ctr, cov_vec, di, &det1, pivot, qraux, tmp2, &rank, &compute_cov, &compute_distances, &compute_det); if( rank == p ) { det1 = det1 * det1 / dn3; /* det1 = |cov matrix| */ det2 = pow(det1, 1.0 / (double) p ); xmed = median(di, n, tmp); s = xmed * det2; calpha = xmed/chimed; /* Rprintf("calpha=%lf, chimed=%lf\n",calpha, chimed); */ if(s < s0){ s0 = s; for(i=0; i ax) j--; if (jnc <= j) { w=a[jnc]; a[jnc]=a[j]; a[j]=w; jnc++; j--; }; }; if (j 0) for(i = 0; i < j; i++) s -= work[i] * xr[i + nnew*j]; work[j] = s / xr[j + nnew*j]; ss += work[j] * work[j]; } return(ss*(nnew-1)); } /* Sampling k from 0:n-1 without replacement. (c) B. Ripley */ void sample_noreplace(int *x, int n, int k, int *ind) { int i, j, nn=n; for (i = 0; i < n; i++) ind[i] = i; for (i = 0; i < k; i++) { j = nn * unif_rand(); x[i] = ind[j]; ind[j] = ind[--nn]; } } rrcov/vignettes/0000755000176200001440000000000014200705512013411 5ustar liggesusersrrcov/vignettes/AModel.pdf0000644000176200001440000002672412763517421015274 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xVYoF ~ׯ["qշ(dW_3Hk^.ߐ\.nH}HZRR mIb!&G.SVF?BͮUF$5'+*M@]v׳WUBپƥ'T>4M{E}o7U9~L|tq.!8Ob{IrEl$P(hٟ sQ0G Und Tj@>ƏgT9.F_*MZ~aʧڬTӧ?F+LC<:^RS*Q.M4 Re"y/.Y_(!59xKvtIRgh1 a :[ 龡$9;ews's~x韢D3Mt=(So{gz}U.̿b@ιRNPIo/^>FւPqNأ%j *UP{Hϖzt5$RҘ !a ݁pG: /_RN)S48Ft>s/B7r_I=)čܑ-<w̗I|\%?Tq)7^GiWO3^C/hcO>s,w$}rȎ2޸0!B־5V\lz/PKk8=]e@kӖ'Zך %77`m] c1VXE0hTUKb5ٺ%M޶#<iwN-)@:rƝ Ξv㮴E:}mnmKS Xk^m=,bFL5۸c-`U*cĚ~`,52R_^_CλZ6k[sL.E)4k,^%XZh;V{a@ptm}w}"co1῞Eeז>ڡx]Ԭ0цLtg@9%xU0kVfzMFKtŔXZlHp3|f2ss?> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 14 0 obj <> endobj 15 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <>stream xSkPTe>˲UmU %E.I({N,"O!"nr4N^J2˴{PqD}j(?JG 96è)hijQBu0H6PRwXCQYNCľXT<O}Ot0)j O+{uJLQ94R~x ?.C0N+OS%]υz%< 3w..7=]z>b(Ƌi1ɢ%q)Xz zh>m=lg!zR)u4G,HqMőz%ZN9ٺX%8JJf[?o]$+$b:l4V9OsymɌu <<[dQ2]H\mY19:a5'2:G,PmTuM-Z |47l ޠ&N &3 0AkngUcޯ8S h#޼*0s9@4jzii&W^k.,_ZWBŸ=,mPwoo[LM'>m7.vP\Hm63{-0Q BoWi 65S K m,RS]jp1I||0U"{a2&,0R)3FX@?un^Xa1}7mݓŠ+p QQV7t°'Gٍ) uz-&M MX7ٮNӌ-9\[|(<b~3vqWa} tI>yIB48>8:'B=^PR M+Z,?bQPal+.Umm_ݕ}|J%*7fM"! ؖ[^Ӝ )nv4^0[u/.*|h*;'!\&r Zv׭ʵNu*.TGz tYZVҠ ㇀* cX endstream endobj 11 0 obj <> endobj 17 0 obj <>stream xUV{X%dwU%]&Q|Ryz} <iDA@I`pDJDA R "%LƖ[W|'|`_ٓٙ7KSVM̂Ԅ4MpqVxQV)ő#XWQ`WFCD4 fCPzF~fjrJ%:rnxΙ3G>IY*rMJKP&*dɣTYr<2)9'-!.)rYqiHfrVJdvjT-i yr7grqT fPKjZHR* S(o* |j&ZIEPT, hj$eKQeOIapʕR;fz$H :jeyDU>T.m3qaaG؋3.r׸NNϽ6ja 3&wUCM *Hq%MJ1apŠR b@lOl+UZgPf7M@z S;,?):8Eu?9Vy(4َZJQw>NP򩹪XIo-6(:A[*H%XFvCыscǧ[uܱ5~r7f1%#}y7flM AHH `0)1A;fc~Pi f }hz9=4EpR8^q06LW `K<]ן`e~3"{@_j2K0MjF7u"ؤgLJSԩR8/Lc_4Lzm,*$_x2_oŏl>zJ٘54M@ |5yiK%;#<aI-˾ BMgcwK"RȻ',Ls+?62h$Uj$olA2ЌU|/0NO_ VX& F#Yتj.2ɀ`vaC `;{Bcߛ$)olp 0ltTlNC1h[N:]z+kܹ׋8Й%Df gܑN]A'hCǤl{"M|+$ӼZ'ֳҠr-ODygDW\8{Ⱬ>IR<425C io*/%iPKEy Zs٠RPḱ-<&iw;Hw$nܵp$5^9v\+/+ܵwS4Zy'§FMh{D0Mze]颣'K -oBmSW۸ U夭_Py>)wY vH6vi>v{{,ٟ<"Bp/Om<`;O1mNC"R4y sQc\ܦIs+߭]y3e0K'eB?VG.iNLXԩ#"$\TꈚX@-=P&ȽkߊiFU-F`M^ y7xJ+ fRN)(s>^q`?;K!ְr؛tqP<73>EJ&0KN;H0 fIߚL9eZ])i'P c2I}/^ٷ&jӈlsֳ&2d_hN@EQ8̗#qz]9SVհE: i9-kv,EPO9 ް C{A[sδ{?ͥ8S{/ZcZP ũ[u_ 1 c$/:+ YpT`g]X֨K%XĬ9~39P5ẃ]NF)h8?U7brAaah1nC&fId?Mf΀|Ƽ5jQ^5$*ãnCO=h7T*kdp5^|ENb4+cd|q 鱲,* l޾83m5 ږT|Gz &AeA(ҋff3MO=+p`8`Gb{1Ā#F< Arih՞ȉtng¤xray{.qQ>4N֒p"5oUpKؿ/fԋ8}IE8+1WX2ci Xxkw'&D_W,Z}.<{ l î/H (bAs~i_nlϛb&+b鵙Pe5"=la7L4Lo)r KH/44_$aLO77F!ȝ[ ί8> endobj 18 0 obj <>stream xT}Ta)u* }Qv )Ĩ),;q; ,G p\AĀ"$&i4%#=} 6&9{˄0,tKF[>İ!J ˁOME(q WГh |9_9}}҂I?bAYG*qz(mN]t:AlEh3se PF$ʕL#&!Ӎlsdr:̒,9 #D- &t K=#ɃJF,Ddnq:dr;N=*=&e2([r#Q7rZhi'%b)YlFP.4#9J Xbtmg7ؕ{Umtlٷ٨%#,uAY. N{#0LT)i^+zef,^(!1'+RI.1LТ%s>Uo jѶn,>2p z?{$ xfL ʘzf vR!fh庚ک7Re iF0)=10  ,d/!ڽD-\hO(ԯ~ɛ7'?no}bK1 JH3g-QH"k:2j JW8I!|8hx(iK^e MNjieX4" Z[J~kK"HjH5,$Kȁ[D$puM:giï!>)mk&3xp acP*m/F>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 20 0000000000 65535 f 0000001508 00000 n 0000011060 00000 n 0000001449 00000 n 0000001298 00000 n 0000000015 00000 n 0000001278 00000 n 0000001573 00000 n 0000001696 00000 n 0000002722 00000 n 0000001985 00000 n 0000004520 00000 n 0000002396 00000 n 0000007605 00000 n 0000001614 00000 n 0000001644 00000 n 0000002962 00000 n 0000004863 00000 n 0000007855 00000 n 0000009699 00000 n trailer << /Size 20 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 11178 %%EOF rrcov/vignettes/CovModel.pdf0000644000176200001440000003044512763517421015636 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xZKsWm9L~丮M.JahpDͿh3RZA*@`_oe'O] ?ݗBE{d:im'VۭT8P.F2}}}G (4/4>}[HwY Og^ޚrX{}?/Jay 8vƫ>$w=loHXizc.xuO?aXw/xEz!&벚QVET~U1U¶}Z;`owsWІ~w;wo?a~XnVW[kぴ^ﯷWZ]/wWQm [`h^3 y(6T ] ށ9oͨ/N.w1<R\bGC98Z_VWЯ"xMrnrl\T<bZ"߫$/9W"Jg -="'uz`3Cow~~!"ȉ_U9HV.3:r!ePAS&ҏ Ⱘsh/CwaS)V'>e=qA\ Ow#Y kha],e,r Ei!YVHJ!?ȗPPu=UXUj%.VQW窪#ㆁYni"S2, Z I _@uAg֍d-#,5Bq9=Wژ^c cK&` F(MD'B^X\?rΟ AEsDhWJȼ>[ds?GKw7ϻUk2{*HR <Q.'S 6"Y ߜ%1fZ_~Sh/=tdQъ/ iZRFV'Ƴ<)8Ob%>>jUidhuabN&a}aY;ANfVLD<ޢ;,4+{(S?9iuiP G\ylsVL;:HLl}FJVqd(<4oHlpFx*GS%il'[yYB)LBn9m&sg>@B SmPףTCSI*'i Ꚛ>r=ѵ kg(F>COcÇX(#2]\5G =8$G"}LKyƻ&j>ʁcXJ'HT*zIQ ZŪ 9Ȫ8P'r{Ā)poaCgi̅\Rlf_hK@Bz2IFDNr" -EP6ΚmRA>JشXT&r[s^h"PIB͎{+\ɯXU:8Aq}z ҧTٍxc[eT#'Zbi1"AXMWh]>g>BWz環{=Zd2?& Ӓ0·0=*A Ikjwqu_ztW bxK>18ŧ)7D2}CHk2/Z:҈O h4 3x==r<`((_dhGDZ8YWj6ۭ7[(!L.`ldendstream endobj 6 0 obj 2389 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 14 0 obj <> endobj 15 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <>stream xQ]HQiwem5ӈCi"a$b.蒨]/LsC$%TTOf%hQot2>4۹;GQ M,GNW4rDREsrY_}'+BTćKq\OUuuMndMP,A NjPCHՍh-t"tAZ:bmPHCB,!eT u)b]#L@b (##j@f Ԁ $MIHd5N?k Sw8T1P"ؠ("g62>N[ήtƑ<`ہ R endstream endobj 11 0 obj <> endobj 17 0 obj <>stream xUV TSG~ϐPI#$ *qT "" $R+֊ʠVW[*ADX"*?j -RP4Jr&Iܶ99͛ݡ)1M̒,ȕD' V)ѧ㐵Y[T3C-E hzI\r좜wreeesV Poj*W4+ *` X9t*Wt[ytqTPlh÷!ݟ{ї}dCYc04w=nNK4ՆwN]OԱ$Au Lﹶ얺Vy?7l axtS#RRHFx+1Q GB ؍j^9|HAhA,Ne B,~@$ס7hM+|;{8@s<C gKb1^t 8*RykBQZwb-w.zv0wBE{Kx*_s^WHS# q!'lݯzKzn ,w&x:l /cML`bغ$M:Lc!)iǎ ZsIY<#~Bش9 (&:>%R3TڏJ+%le[痐Xg\jYY S=ɢ u5',}ŻvLE2rޟX3$}0,:- 9dEl7B ~s.6%vׁWZl\_Z_ #y +J+se0 l{ W*r|8 ##m=s :nѥb5=Rx$Q5b^6ÌZQ8o#.5&GY(ݜo)C7 PC|&u $+>y20ѡċN'>!+F+{6(W&im _)42MY[sJrb{m:yǴ%K4!w#IE Դ^[r]1b4po V3'v}V օ P_8{ i8[؋$u|::]RdA&MLqgЏH"ͅo2&AѥR䔤F)Ǭ F_u'-fUFȠ8LL׍qt4L\ N34x!Oh9G ak~mވPJArVrKŽ(V7g\e{Yhyb]Ր4 -VT߅nZuSO\L,Uv]8Y<`/D|||y%]#F֫+H?Zk[{9S2K `/drcS_Ibu뙇 7 e&kP#4jړ6ft2N%}yltdQ7Ќ錞a3Rp͙PNlLx=h7WH6ŋ){Wr̡B@|l +Vۊdn_pݑuUߒmGGQCĒ!D6l~;vT9'\ 0; Z@>#J8Aug~~mً.L.fEw\j2M^o7^쏱g%DK:N :9'x}kVn]²6e?d~s_bI)Ա0WWĂ9o.r"־@ </hC&7,߈hfG~hyQ{y_'|+#|B; LIݑ71W5m{uMkiRe<ǁ"?6Vd8aw=؞`<)"B :p  8]@8wrw{nNDr=㱯'&*D̐գCX[?:l=  endstream endobj 13 0 obj <> endobj 18 0 obj <>stream xUiTW BwJL5Ni%"bP2fw4!q(AZqE h ( L<:I&G3˭̙אq;?}߽hՅi=ĬU&uv8G~vMG-*{)=(!AGGv   'OX8aFͬMM͚5_eaEj"CMz`  |V'c>G$A0t|\*V/ҪESf^׿FFk `>«xIPNLND$ZyO5 VA[֥֠ky`Mf#뉅3ZYk$b\Xx?Fkk3oL!75FuU5XxeuY%ŤSH\dAHh oOBʬ >άǿZe2l}o}Z-.%8F_nU"){'o%D(j͠6j Tb6>=cN_EQIT,FSqKSxjB%P R*ZDEST 5%DRQ6Gz$-Ѝ.#]\~t+]+v2f$sbӠKl@;-awOHme&)w}|4{`sIAFg:޾^"  6>F<֐m7}ٛ'VGO?,Glh)V-y%H ' O/SG 6i^0UMi4% Y/w7U)JOT֢訩4L布A[tb;C{ۥ'K{!ȡ,ƾb['VBh "o9<+Xßa f!ƿsXu_ 鲮Ʈ?+}7N'rOIk^qxxFӉna7ѓU>6pyRӆ.# "!3mjuuw>4 q8oÉGG`x>|Ur&{Ƽ њmim}߫TNUݸ7sgƶ"P|B-(;l?^PHL׌mozl+ԃIy+svh$+> ;g`95gIDFs8(sw͛Ҭe۷`sF 7M( ū2ɯHa6eڄu0L"N$fǢI&|&Axg Δ\R P.M;X+LpZ.5>G[!^fNLq]B.[n*^ @.qVх̔NOMǒ= EyVYl[[e5 S E%6yΞ {6'0 ]-:t5aWS _8iI*Bv8`1 u6P6`~lmWNQl(ElO/Ouo>T l\{e6^}*dwD_ϑ99fEiy/ܸɼ'+xzGO?<L?{m_mY_d){PO& T ;oι;fzWbYy9>l$2\} XpwO|9`TD棶T[9Yy%(%*g5VtȅFdܖKLd\sa+ k_+7Zk׿>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 20 0000000000 65535 f 0000002704 00000 n 0000011909 00000 n 0000002645 00000 n 0000002494 00000 n 0000000015 00000 n 0000002474 00000 n 0000002769 00000 n 0000002892 00000 n 0000003882 00000 n 0000003163 00000 n 0000004876 00000 n 0000003570 00000 n 0000007977 00000 n 0000002810 00000 n 0000002840 00000 n 0000004106 00000 n 0000005193 00000 n 0000008237 00000 n 0000010548 00000 n trailer << /Size 20 /Root 1 0 R /Info 2 0 R /ID [<8698D7B42896D1E67705F281C74286BB><8698D7B42896D1E67705F281C74286BB>] >> startxref 12027 %%EOF rrcov/vignettes/CovControl.pdf0000644000176200001440000002140412763517421016211 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xXM8WdrIm咭p ŘZjK1c*Fk|'%)|L?gd{N(OMdJ_<)*MIm?.XV;/qO$ϟ;kr%/`yc;<>g]KJ-@))'2Y|cSWכwo_ ;r Wpq|NP4arHjsneјŦh (;;Paisax.F* ;^JS׀1,J>T@5* P ڪP=@E=s:Ceu00/lMr Z`GxKCEx=t̮#6i>&Z;TYChSJÙ(6CVu|1QXP 0Ο0 ag|DܲnebpALִVGzkmR9d^F]Դ>*xg̮K|zc8ߔ\ DS1`b݅)40)JS뢐ܷMTԧ&Awr0**qo,`K@tPG`GPvG7nw36}`&,(%GaVŎOvEBAY]=86KQB7mp%}mqϘ=65U2 xu{ XLdf1?U o<4buXڜf4ͮڌ HKŐE2eRxo S,C;YOx>'4CnF_Y^2?z{OxB''D Dn<"U/a79hƺ;C !" ᝋ!=J?ɂ}}2Д2#endstream endobj 6 0 obj 1147 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 12 0 obj <> endobj 13 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 9 0 obj <> endobj 14 0 obj <>stream xTmPT .7ƽEBQdQM`i]v.|29EI j4%B Ѩ:""8Ŷ8Ilk(wNB3y<粌:aYvZ_z]6C*D)UxMf>S4 6A3WӕS]A /.] EgBe$AtQ)>Q \@%-/磔(_~ Y*\ 6# #ټ(^r$dEOQNH H [$F~GH"csU#ҸFh+W%_Ɉ"ZS3V9+4i*"ld葐,T2E(.m#TH= ow dȭHV2a!sXȁ )d _G4sbr{20:zqwdVSWm]Ӏ(0" \G)rdY{Tz]m]zp7ϙn7>6arُ)wJn_OMdҎe$,&bI<=j>r[qe4&$n",{c-<1jwn`~tMp߉Fᶎ_6ܺ3}7Tf╃B;(P\^%[or$a CТ^sO!>scx`X_G9~k1IN&>jC !s.Szlv]ecGx t{ eQcєoB $4!SgE&◒d5D =5_oF6z>t-6ê8^LG& 7p)wqu{cGŞ"9DqA$Q+Dzs!@Mc`;a!t"Py}}lڝ}E&gDsyxUTؒP\Hz}Fz1mY@%d{<G\pWg ˖sH/*zѧX iH> endobj 15 0 obj <>stream xUU TW*QZpEAqTYҠP!"uBBh#("1ATZn5eFyx2a2qΩsz)E4Hfٹciq8^`l<d-AҲquQ|FR^n3"@v͂8U:n$~5?3) QI&<0@#a*Zx?f>GDt 6`ssnjO/7=B.;-zIC ѫ' ^3uF$,Շ{p KL„[Myg mIڧ kto ޮRF{yo#=p]ن8h Mܘ=eaH ^ψ` 7Q6"Σ{nd 餶 ` Xڀ)%Z:9-Gk/o:L @֝u <LJ9oKѡ?I8 M*ܭ|7(JlU8,3XC0e`U$hA6{u3t= +C; 7#76n1 66x vK'ܶtIuXy#7 Ǭ=;Fu?/jtA>VK"߮ &9Uxip!&Ԋv`Q9촵y+QJ-:[}UܟO-ң'x-'87ְQ <ݗ YT_WaiPц/5&AbVM[#Ղ>液oMR%j8O {]r:)?W TpRUjͲ:9o娨صU(\E!1&-Z~ΰOP7m6^ ]0BA(Zbʘ={ :g#vIUQ)C@gvm:SqYĩmcˆ&`<1 %Zݢ8|Zx{%,?!В^kC9F_-.f&\6bn/xG]K!YE:ĜlͦK7>RG  *$ U-z\߯Y4j宅*btv-8dXi/799 xG!sY_rso,>H{ΏXT6>X)-JeX&oE-^e:өb==x endstream endobj 16 0 obj <>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 17 0000000000 65535 f 0000001463 00000 n 0000008353 00000 n 0000001404 00000 n 0000001252 00000 n 0000000015 00000 n 0000001232 00000 n 0000001528 00000 n 0000001640 00000 n 0000002321 00000 n 0000001930 00000 n 0000004331 00000 n 0000001569 00000 n 0000001599 00000 n 0000002566 00000 n 0000004632 00000 n 0000006992 00000 n trailer << /Size 17 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 8471 %%EOF rrcov/vignettes/mybiblio.bib0000644000176200001440000020364713713073471015723 0ustar liggesusers @STRING(AJS = "Austrian Journal of Statistics") @STRING(JASA = "Journal of the American Statistical Association") @STRING(JCGS = "Journal of Computational and Graphical Statistics") @STRING(JMA = "Journal of Multivariate Analysis") @STRING(CSDA = "Computational Statistics \& Data Analysis") @STRING(SMA-JISS = "Statistical Methods and Applications") @STRING(JSS = "Journal of Statistical Software") @STRING(WRR = "Water Resource Research") @STRING(JRSS-A = "Journal of the Royal Statistical Society: Series A (Statistics in Society)") @STRING(JRSS-B = "Journal of the Royal Statistical Society: Series B (Statistical Methodology)") @STRING(JRSS-C = "Journal of the Royal Statistical Society: Series C (Applied Statistics)") @STRING(JRSS-D = "Journal of the Royal Statistical Society: Series D (The Statistican)") @STRING(WILEY = "{John Wiley \& Sons}") %% The Annals of Mathematical Statistics was published between 1930 and 1972 %% by the Institute of Mathematical Statistics. The journal was superseded in %% 1973 by The Annals of Probability and The Annals of Statistics. @incollection{ agullo:96, author = {J. J. Agull\'o }, title = {Exact Iterative Computation of the Multivariate {M}inimum {V}olume {E}llipsoid Estimator with a Branch and Bound Algorithm}, booktitle = {Proceedings in Computational Statistics, COMPSTAT`96}, publisher = {Physica Verlag}, year = {1996}, address = {Heidelberg}, editor = {A. Prat}, pages = {175--180}, } @book{ alexander, author = {Alexander, Christopher and Ishikawa, Sara and Silverstein, Murray}, title = {A Pattern Language: Towns, Buildings, Construction (Center for Environmental Structure Series)}, year = {1977}, publisher = {Oxford University Press}, month = {August} } @BOOK{ anderson:58, AUTHOR = {T. W. Anderson}, TITLE = {An Introduction to Multivariate Statistical Analysis}, PUBLISHER= WILEY, ADDRESS = {New York}, YEAR = {1958} } @incollection{ atkinson:91, author = {Atkinson, A.C. and Weisberg, S.}, title = {Simulated Annealing for the Detection of Multiple Outliers Using Least Squares and Least Median of Squares Fitting}, booktitle = {Directions in Robust Statistics and Diagnostics, Part 1}, publisher = {Springer-Verlag}, pages = {7--20}, editor = {Stahel, W. and Weisberg, S.}, year = {1991}, } @BOOK{ atkinson:2000, AUTHOR = {Atkinson, A. C. and Riani, M.}, TITLE = {Robust Diagnostic Regression Analysis}, PUBLISHER = {Springer-Verlag}, YEAR = {2000}, ADDRESS = {New York }, } @ARTICLE{ blount:99, author = {Brian Blount and Siddhartha Chatterjee}, title = {An Evaluation of {J}ava for Numerical Computing}, journal = {Scientific Programing}, volume = {7}, number = {2}, year = {1999}, issn = {1058-9244}, pages = {97--110}, publisher = {IOS Press}, address = {Amsterdam, The Netherlands, The Netherlands}, } @incollection{ boisvert:98, author = "Ronald F. Boisvert and Jack J. Dongarra and Roldan Pozo and Karin A. Remington and G. W. Stewart", title = "Developing Numerical Libraries in {Java}", booktitle = "ACM 1998 Workshop on Java for High-Performance Network Computing", publisher = {ACM SIGPLAN}, pages = "??--??", year = "1998", url = "citeseer.ist.psu.edu/article/boisvert98developing.html" } @ARTICLE{ boisvert:2001, author = {Ronald F. Boisvert and Jos\'{e} Moreira and Michael Philippsen and Roldan Pozo}, title = {Java and Numerical Computing}, journal = {Computing in Science and Engineering}, volume = {3}, number = {2}, year = {2001}, pages = {18--24}, doi = {http://doi.ieeecomputersociety.org/10.1109/5992.908997}, url = "citeseer.ist.psu.edu/499657.html" } @ARTICLE{ brien:92, AUTHOR = "Peter C. O'Brien", TITLE = "Robust Procedures for Testing Equality of Covariance Matrices", JOURNAL = "Biometrics", PAGES = "819--827", YEAR = "1992", VOLUME = "48", NUMBER = "3" } @ARTICLE{ butler:1993, AUTHOR = "Butler, R.W. and Davies, P.L. and Jhun, M.", TITLE = "Asympthotic for the Minimum Covariance Determinant Estimator", JOURNAL = "The Annals of Statistics", PAGES = "1385-1401", YEAR = "1993", VOLUME = "21", } @ARTICLE{ campbell:80, AUTHOR = "Campbell, N. A.", TITLE = "Procedures in Multivariate Analysis {I}: Robust Covariance Estimation", JOURNAL = "Applied Statistics", PAGES = "231--237", YEAR = "1980", VOLUME = "29", } @ARTICLE{ campbell:82, AUTHOR = "Campbell, N. A.", TITLE = "Robust Procedures in Multivariate Analysis II: Robust Canonical Variate Analysis", JOURNAL = "Applied Statistics", PAGES = "1--8", YEAR = "1982", VOLUME = "31", NUMBER = "1", } @BOOK{ chambers:98, AUTHOR = {J. M. Chambers}, TITLE = {Programming with Data: A Guide to the S Language}, PUBLISHER= {Springer-Verlag}, YEAR = {1998}, ADDRESS = {New York} } @ARTICLE{ Chakraborty-Chaudhuri, AUTHOR = "Chakraborty, B. and Chaudhuri, P.", TITLE = "On the Use of Genetic Algorithm with Elitism in Robust and Nonparametric Multivariate Estimation", JOURNAL = "Austrian Journal of Statistics", PAGES = "13--27", YEAR = "2003", VOLUME = "30", } @ARTICLE{ chork, AUTHOR = "Chork, C. Y. and Rousseeuw, P. J. ", TITLE = "Integrating a High Beakdown Option into Discriminant Analysis in Exploration Geochemistry", JOURNAL = "Journal of Geochemical Exploration", PAGES = "191--203", YEAR = "1992", VOLUME = "43", } @ARTICLE{ croux-dehon:01, AUTHOR = "C. Croux and C. Dehon", TITLE = "Robust Linear Discriminant Analysis Using {S}-Estimators", JOURNAL = "The Canadian Journal of Statistics", PAGES = "473-492", YEAR = "2001", VOLUME = "29", } @ARTICLE{ croux-haesbroeck:99, AUTHOR = "Croux, C. and Haesbroeck, G.", TITLE = "Influence Function and Efficiency of the Minimum Covariance Determinant Scatter Matrix Estimator", JOURNAL = JMA, PAGES = "161-190", YEAR = "1999", VOLUME = "71", } @ARTICLE{ croux-Haesbroeck:2000, AUTHOR = {Croux, C. and Haesbroeck, G.}, TITLE = {Principal Components Analysis Based on Robust Estimators of the Covariance or Correlation Matrix: Influence Functions and Efficiencies}, JOURNAL = {Biometrika}, PAGES = {603--618}, YEAR = {2000}, VOLUME = {87}, NUMBER = {}, } @incollection{ croux-Ruiz-Gazen:1996, author = {Croux, C. and Ruiz-Gazen, A.}, title = {A Fast Algorithm for Robust Principal Components Based on Projection Pursuit}, booktitle = {Proceedings in Computational Statistics, COMPSTAT`96}, publisher = {Physica Verlag}, year = {1996}, address = {Heidelberg }, editor = {A. Prat}, pages = {211--216}, } @ARTICLE{ croux-Ruiz-Gazen:2005, AUTHOR = {Croux, C. and Ruiz-Gazen, A.}, TITLE = {High Breakdown Estimators for Principal Components: The Projection-pursuit Approach Revisited}, JOURNAL = JMA, PAGES = {206--226}, YEAR = {2005}, VOLUME = {95}, NUMBER = {}, } @ARTICLE{ croux-filzmoser-oliveira-pppca, AUTHOR = {Croux, C. and Filzmoser, P. and Oliveira, M.R.}, TITLE = {Algorithms for Projection-pursuit Robust Principal Component Analysis}, JOURNAL = {Chemometrics and Intelligent Laboratory Systems}, PAGES = {218--225}, YEAR = {2007}, VOLUME = {87}, NUMBER = {218}, } @ARTICLE{ croux-joossens:05, AUTHOR = "Croux, C. and Joossens, K.", TITLE = "Influence of Observations on the Misclassification Probability in Quadratic Discriminant Analysis", JOURNAL = JMA, PAGES = "384--403", YEAR = "2005", VOLUME = "96", } @ARTICLE{ Daigle:1992, AUTHOR = {G. Daigle and L. Rivest}, TITLE = {A Robust Biplot}, JOURNAL = {The Canadian Journal of Statistics}, PAGES = {241--255}, YEAR = {1992}, VOLUME = {20}, NUMBER = {3}, } @ARTICLE{ davidson:1998, author = {Russell Davidson and James G. Mackinnon}, title = {Graphical Methods for Investigating the Size and Power of Hypothesis Tests}, journal = {The Manchester School of Economic \& Social Studies}, year = {1998}, volume = {66}, NUMBER = {1}, pages = {1--26}, MONTH = {January}, NOTE = {available at http://ideas.repec.org/a/bla/manch2/v66y1998i1p1-26.html} } @ARTICLE{ davies:87, AUTHOR = "Davies, P.L.", TITLE = "Asymptotic Behavior of {S}-Estimators of Multivariate Location Parameters and Dispersion Matrices", JOURNAL = "The Annals of Statistics", PAGES = "1269--1292", YEAR = "1987", VOLUME = "15", } @ARTICLE{ dempster:1977, author = {A. P. Dempster and M. N. Laird and D. B. Rubin}, title = {Maximum Likelihood from Incomplete Data via the {EM} Algorithm}, journal = JRSS-B, volume = {39}, number = {}, year = {1977}, pages = {1--22}, } @ARTICLE{ devlin:81, author = {Devlin, S. J. and Gnanadesikan, R. and Kettenring, J. R.}, title = {Robust Estimation of Dispersion Matrices and Principal Components}, journal = JASA, volume = {76}, number = {}, year = {1981}, pages = {354--362}, } @ARTICLE{ filzmoser:2005, author = {Peter Filzmoser and Robert G. Garrett and Clemens Reimann}, title = {Multivariate Outlier Detection in Explortion Geochemistry}, journal = {Computers \& Geosciences}, volume = {31}, number = {}, year = {2005}, pages = {579--587}, } @incollection{ filzmoser:2008, author = {Peter Filzmoser and Sven Serneels and Ricardo Maronna and P. J. van Espen}, title = {Robust Multivariate Methods in Chemometrics}, booktitle = {Comprehensive Chemometrics}, publisher = {}, year = {2008}, address = {}, editor = {B. Walczak and R. T. Ferre and S. Brown}, pages = {}, NOTE = {to appear} } @ARTICLE{ friedman:89, AUTHOR = "Friedman, J. H. ", TITLE = "Regularized Discriminant Analysis", JOURNAL = "Journal of the American Statistical Association", PAGES = "165-175", YEAR = "1989", VOLUME = "84", } @ARTICLE{ gabriel, AUTHOR = {K. R. Gabriel}, TITLE = {The Biplot Graphical Display of Matrices with Application to Principal Component Analysis}, JOURNAL = {Biometrika}, PAGES = {453--467}, YEAR = {1971}, VOLUME = {58}, NUMBER = {}, } @ARTICLE{ Gelper-Croux, AUTHOR = {Sarah Gelper and Christophe Croux}, TITLE = {Multivariate Out-of-sample Tests for {G}ranger Causality}, JOURNAL = CSDA, PAGES = {3319-3329}, YEAR = {2007}, VOLUME = {51}, } @ARTICLE{ Gnanadesikan-Kettenring:1972, AUTHOR = "R. Gnanadesikan and J. R. Kettenring", TITLE = "Robust Estimates, Residuals, and Outlier Detection with Multiresponse Data", JOURNAL = "Biometrics", PAGES = "81--124", YEAR = "1972", VOLUME = "28", NUMBER = {} } %\bibitem[Van Gelder and Neykov (1998)]{GelderNeykov98} %Van Gelder, P. H. A. J. M. and Neykov, N. M. (1998), Regional %Frequency Analysis of Extreme Water Levels Along the Dutch Coast Using %L-moments: Some Preliminary Results. In: \textit{Stochastic Models of %Hydrological Processes and their Applications to Problems of %Environmental Preservation}, NATO Advanced Workshop, Moskow, Russia, %23-27 November 1998, 14--20. %\bibitem[Van Gelder et al. (2000)]{VanGelder00} %Van Gelder, P. H. A. J. M., Neykov, N. M., Neytchev, P. N., Vrijling, %J. K. and Chbab, H. (2000), Probability Distributions of Annual %Maximum River Discharges in North-western and Central Europe. In: %\textit{Foresight and Precaution}, Cottam, M. P., D.V. Harvey, R.P. %Pape and J. Tait (eds.), A. A. Balkema publishing, 899--903. @incollection{ habemma:74, author = {Habemma, J.D.F, Hermans, J. and van den Broek, K.}, title = {Stepwise Discriminant Analysis Program Using Density Estimation}, booktitle = {Proceedings in Computational Statistics, COMPSTAT`1974}, publisher = {Physica Verlag}, year = {1974}, address = {Heidelberg }, editor = {}, pages = {101-110}, } @ARTICLE{ hadi:94, author = {Hadi, A.S. and Simonoff, J.F.}, title = {Procedures for Identification of Multiple Outliers in Linear Models}, journal = JASA, volume = {88}, number = {}, year = {1994}, pages = {1264--1272}, } @BOOK{ hampel:1986, AUTHOR = {Hampel,F.R. and Ronchetti, E.M. and Rousseeuw P. J. and Stahel, W. A.}, TITLE = {Robust Statistics. The Approach Based on Infuence Functions}, PUBLISHER= WILEY, YEAR = 1986 } @ARTICLE{ hardin:2005, AUTHOR = {Hardin, J. and Rocke, D.M.}, TITLE = {The Distribution of Robust Distances}, JOURNAL = JCGS, PAGES = {910--927}, YEAR = {2005}, VOLUME = {14}, } @ARTICLE{ hawkins:94, author = {Douglas M. Hawkins}, title = {The Feasible Solution Algorithm for the Minimum Covariance Determinant Estimator in Multivariate Data}, journal = CSDA, volume = {17}, number = {2}, year = {1994}, issn = {0167-9473}, pages = {197--210}, publisher = {Elsevier Science Publishers B. V.}, address = {Amsterdam, The Netherlands, The Netherlands}, } @ARTICLE{ hawkins:97, AUTHOR = "Hawkins, D. M. and McLachlan, G. J.", TITLE = "High Breakdown Linear Discriminant Analysis", JOURNAL = "Journal of the American Statistical Association", PAGES = "136-143", YEAR = "1997", VOLUME = "92", } @ARTICLE{ hawkins:99, author = {Douglas M. Hawkins and David J. Olive}, title = {Improved Feasible Solution Algorithms for High Breakdown Estimation}, journal = CSDA, volume = {30}, number = {1}, year = {1999}, issn = {0167-9473}, pages = {1--11}, publisher = {Elsevier Science Publishers B. V.}, address = {Amsterdam, The Netherlands, The Netherlands}, } @ARTICLE{ he:2000, AUTHOR = "He, X. and Fung, W.K.", TITLE = "High Breakdown Estimation for Multiple Populations with Applications to Discriminant Analysis", JOURNAL = JMA, PAGES = "151-162", YEAR = "2000", VOLUME = "72", } @ARTICLE{ he:1996, AUTHOR = "Xuming He and Gang Wang", TITLE = "Cross-checking using the Minimum Volume Ellipsoid Estimator", JOURNAL = "Statistica Sinica", PAGES = "367--374", YEAR = "1996", VOLUME = "6", } @ARTICLE{ hubert-ROBPCA:2005, AUTHOR = "M. Hubert and P. J. Rousseeuw and Karlien {Vanden Branden}", TITLE = "ROBPCA: A New Approach to Robust Principal Component Analysis", JOURNAL = "Technometrics", PAGES = "64-79", YEAR = "2005", VOLUME = "47", } @ARTICLE{ hubert:04, AUTHOR = "Hubert, M. and Van Driessen, K.", TITLE = "Fast and Robust Discriminant Analysis", JOURNAL = CSDA, PAGES = "301-320", YEAR = "2004", VOLUME = "45", } @ARTICLE{ hubert:2007-CV, AUTHOR = {Mia Hubert and Sanne Engelen}, TITLE = {Fast Cross-Validation of High Breakdown Resampling Methods for {PCA}}, JOURNAL = CSDA, PAGES = {5013-5024}, YEAR = {2007}, VOLUME = {51}, } @incollection{ hubert-actuar, author = {M. Hubert and P. J. Rousseeuw and S. van Aelst}, title = {Robustness}, booktitle = {Encyclopedia of Actuarial Sciences}, publisher = WILEY, ADDRESS = {New York}, year = {2004}, editor = {J. Teugels and B. Sundt}, pages = {1515--1529} } @incollection{ hubert:2005, author = {M. Hubert and P. J. Rousseeuw and S. van Aelst}, title = {Multivariate Outlier Detection and Robustness}, booktitle = {Data Mining and Data Visualization, Handbook of Statistics, vol. 24}, publisher = {Elsevier, North-Holland}, year = {2005}, editor = {C. R. Rao and E. J. Wegman and J. L. Solka}, pages = {263--302} } @ARTICLE{ hubert:2006, AUTHOR = {Rousseeuw, P. J. and Debruyne, M. and Engelen, S. and Hubert, M}, TITLE = {Robustness and Outlier Detection in Chemometrics}, JOURNAL = {CRITICAL REVIEWS IN ANALYTICAL CHEMISTRY}, PAGES = {221--242}, YEAR = {2006}, VOLUME = {36}, } @TECHREPORT{ hubert:2007TR-PCA, AUTHOR = {M. Hubert and P. J. Rousseeuw and T. Verdonck}, TITLE = {Robust {PCA} for Skewed Data}, INSTITUTION = {Katholieke Universitet Leuven}, TYPE = {Technical Report}, NUMBER = {TR-07-03}, YEAR = {2007}, NOTE = {Department of Mathematics}, } @ARTICLE{ hubert:2008-PCA, AUTHOR = {M. Hubert and P. J. Rousseeuw and T. Verdonck}, TITLE = {Robust {PCA} for Skewed Data and its Outlier Map}, JOURNAL = CSDA, PAGES = {2264--2274}, YEAR = {2009}, VOLUME = {53}, NUMBER = {6}, } @ARTICLE{ hubert:2008-outlier, AUTHOR = {Mia Hubert and Stephan {Van der Veeken}}, TITLE = {Outlier Detection for Skewed Data}, JOURNAL = {Journal of Chemometrics}, PAGES = {235--246}, YEAR = {2008}, VOLUME = {22}, NUMBER = {3--4}, } @ARTICLE{ hubert:2008, AUTHOR = {Mia Hubert and P. J. Rousseeuw and S. van Aelst}, TITLE = {High-Breakdown Robust Multivariate Methods}, JOURNAL = {Statistical Science}, PAGES = {92--119}, YEAR = {2008}, VOLUME = {23}, NOTE = {} } @MISC{ hubert-debruyne:2008, AUTHOR = {M. Debruyne and M. Hubert}, TITLE = {The Influence Function of the {S}tahel-{D}onoho Covariance Estimator of Smallest Outlyingness}, JOURNAL = {Statistics and Probability Letters}, PAGES = {}, YEAR = {}, VOLUME = {}, NOTE = {in press}, doi = {http://dx.doi.org/doi:10.1016/j.spl.2008.08.006} } @ARTICLE{ hubert-engelen:2004, AUTHOR = {S. Engelen and M. Hubert}, TITLE = {Robust {PCA} and Classification in Biosciences}, JOURNAL = {Bioinformatics}, PAGES = {1728--1736}, YEAR = {2004}, VOLUME = {20}, NOTE = {}, } @ARTICLE{ H90, AUTHOR = {Hosking, J. R. M.}, TITLE = {L-moments: Analysis and estimation of distributions using linear combinations of order statistics}, JOURNAL = JRSS-B, PAGES = {105--124}, YEAR = {1990}, VOLUME = {52}, } @ARTICLE{ HW93, AUTHOR = "Hosking, J. R. M. and J. R. Wallis", TITLE = "Some statistics useful in {R}egional {F}requency {A}nalysis", JOURNAL = WRR, PAGES = "271--281", YEAR = "1993", VOLUME = "29", } @BOOK{ HW97, AUTHOR = "Hosking, J. R. M. and J. R. Wallis", TITLE = "Regional Frequency Analysis: An Approach Based on L-moments", PUBLISHER = "Cambridge University Press", YEAR = "1997", } @incollection{ jennrich:77, author = {Jennrich, R. I.}, title = {Stepwise Discriminant Analysis}, booktitle = {Statistical Methods for Digital Computers}, publisher = WILEY, year = {1977}, address = {New York}, editor = {K. Enslein, A. Ralston and H.S.Wilf}, pages = {76--95}, } @BOOK{ johnson-wichern, AUTHOR = "R. A. Johnson and D. W. Wichern", TITLE = "Applied Multivariate Statistical Analysis", PUBLISHER = "Prentice Hall", YEAR = "2002", ADDRESS = "International", NOTE = "fifth edition" } @inproceedings{ karnel:1991, author = {Gerald Karnel}, title = {Robust canonical correlation and correspondence analysis}, booktitle = {ICOSCO-I: conference proceedings on The frontiers of statistical scientific theory \& industrial applications (Vol. II)}, year = {1991}, isbn = {0-935950-28-1}, pages = {335--354}, location = {Cesme, Izmir, Turkey}, publisher = {American Sciences Press}, address = {Syracuse, NY, USA}, } @ARTICLE{ krusinska:88, AUTHOR = "Krusinska, E. and Liebhart, J.", TITLE = "Robust Selection of the most Discriminative Variables in the Dichotomous Problem with Application to some Respiratory Desease Data", JOURNAL = "Biometrical Journal", PAGES = "295--304", YEAR = "1988", VOLUME = "30", } @ARTICLE{ krusinska:88a, AUTHOR = "Krusinska, E.", TITLE = "Robust methods in discriminant analysis", JOURNAL = "Rivista di Statistica Applicada", PAGES = "239--253", YEAR = "1988", VOLUME = "21", NUMBER = "3" } @ARTICLE{ krusinska:89, AUTHOR = "Krusinska, E. and Liebhart, J.", TITLE = "Some Further Remarks on the Robust Selection of Variables in Discriminant Analysis", JOURNAL = "Biometrical Journal", PAGES = "227--233", YEAR = "1989", VOLUME = "31", } @ARTICLE{ kumar:2005, AUTHOR = "Kumar, R. and Chatterjee, C.", TITLE = "Regional flood frequency analysis using L-moments for North Brahmaputra region of India", JOURNAL = "Journal of Hydrologic Engineering, American Society of Civil Engineers", PAGES = "1--7", YEAR = "2005", VOLUME = "10", } @ARTICLE{ lachenbruch-michey:68, AUTHOR = "Lachenbruch, P. A. and Michey, M. R.", TITLE = "Estimation of Error Rates in Discriminant Analysis", JOURNAL = "Technometrics", PAGES = "1--11", YEAR = "1968", VOLUME = "10", } @BOOK{ lachenbruch:1975, AUTHOR = "Lachenbruch, P. A.", TITLE = "Discriminant Analysis", PUBLISHER = "Hafner", YEAR = "1975", ADDRESS = "New York", } @ARTICLE{ li:1985, author = {G. Li and Z. Chen}, title = {Projection-Pursuit Approach to Robust Dispersion Matrices and Principal Components: Primary Theory and {M}onte {C}arlo}, journal = JASA, volume = {80}, number = {}, year = {1985}, pages = {759--766}, } @ARTICLE{ LittleAndSmith:87, AUTHOR = "Little, R. J. A. and Smith, P. J.", TITLE = "Editing and imputation for quantitative data", JOURNAL = "Journal of the American Statistical Association", PAGES = "58--69", YEAR = "1987", VOLUME = "82", } @BOOK{ LittleAndRubin:1987, AUTHOR = {R. J. A. Little and D. B. Rubin}, TITLE = {Statistical Analysis with Missing Data}, publisher = WILEY, YEAR = "1987", ADDRESS = "New York", } @ARTICLE{ Little:88, AUTHOR = "Little, R. J. A.", TITLE = "Robust estimation of the mean and covariance matrix from data with missing values", JOURNAL = "Applied Statistics", PAGES = "23--38", YEAR = "1988", VOLUME = "37", } @ARTICLE{ boente-fraiman:1999, AUTHOR = "Boente, G. and Fraiman, R.", TITLE = "Discussion of 'Robust principal components for functional data' by Locantore et al.", JOURNAL = "Test", PAGES = "1--28", YEAR = "1999", VOLUME = "8", } @ARTICLE{ locantore:1999, AUTHOR = "Locantore, N. and Marron, J.S. and Simpson, D.G. and Tripoli, N. and Zhang, J.T. and Cohen, K.L.", TITLE = "Robust Principal Components for Functional Data", JOURNAL = "Test", PAGES = "1--28", YEAR = "1999", VOLUME = "8", } @ARTICLE{ lopuhaa:1989, AUTHOR = "H. P. {Lopuha\"a}", TITLE = "On the Relation Between {S}-Estimators and {M}-estimators of Multivariate Location and Covariance", JOURNAL = "The Annals of Statistics", PAGES = "1662--1683", YEAR = "1989", VOLUME = "17", } @ARTICLE{ lopuhaa-rousseeuw, AUTHOR = "{Lopuha\"a}, H. P. and Rousseeuw, P. J.", TITLE = "Breakdown Points of Affine Equivariant Estimators of Multivariate Location and Covariance Matrices", JOURNAL = "The Annals of Statistics", PAGES = "229--248", YEAR = "1991", VOLUME = "19", } @BOOK{ Marazzi:1993, AUTHOR = "A. Marazzi", TITLE = "Algorithms, Routines and S Functions for Robust Statistics", PUBLISHER = "Wadsworth and Brooks/Cole", YEAR = "1993", ADDRESS = "", } @ARTICLE{ Marazzi:2006, AUTHOR={ Alfio Marazzi and Voctor Yohai}, TITLE={Robust Box-Cox transformations based on minimum residual autocorrelation}, JOURNAL=CSDA, YEAR=2006, VOLUME={50}, NUMBER={10}, PAGES={2752--2768}, MONTH={June}, NOTE={available at http://ideas.repec.org/a/eee/csdana/v50y2006i10p2752-2768.html} } @BOOK{ mardia, AUTHOR = {K. V. Mardia and J. T. Kent and J. M. Bibby}, TITLE = {Multivariate Analysis}, PUBLISHER= {Academic Press}, ADDRESS = {London}, YEAR = 1979 } @ARTICLE{ maronna:95, AUTHOR = "Maronna, R. A. and Yohai, V. J.", TITLE = "The Behavoiur of the {S}tahel-{D}onoho Robust Multivariate Estimator", JOURNAL = "Journal of the American Statistical Association", PAGES = "330--341", YEAR = "1995", VOLUME = "90", } @incollection{ maronna:98, author = {Maronna, R. A. and Yohai, V. J.}, title = {Robust Estimation of Multivariate Location and Scatter}, booktitle = {Encyclopedia of Statistical Sciences, Updated volume 2}, publisher = WILEY, year = {1998}, address = {New York}, editor = {S. Kotz, C. Read and D. Banks}, pages = {589--596}, } @ARTICLE{ maronna:2002, AUTHOR = "R. A. Maronna and R. H. Zamar", TITLE = "Robust Estimation of Location and Dispersion for High-Dimensional Datasets", JOURNAL = "Technometrics", PAGES = "307--317", YEAR = "2002", VOLUME = "44", } @ARTICLE{ maronna:2005, AUTHOR = "Maronna, R. A.", TITLE = "Principal Components and Orthogonal Regression Based on Robust Scales", JOURNAL = "Technometrics", PAGES = "264--273", YEAR = "2005", VOLUME = "47", } @BOOK{ maronna:2006, AUTHOR = "R. A. Maronna and D. Martin and V. Yohai", TITLE = "Robust Statistics: Theory and Methods", PUBLISHER = WILEY, YEAR = "2006", ADDRESS = "New York", } @BOOK{ mclachlan:1992, AUTHOR = "MacLachlan, Geoffrey J.", TITLE = "Discriminant analysis and statistical pattern recognition", PUBLISHER = WILEY, YEAR = "1992", ADDRESS = "New York", } @ARTICLE{ moller, author = {S. Frosch Moller and J. von Frese and R. Bro}, title = {Robust methods for multivariate data analysis}, journal = {JOURNAL OF CHEMOMETRICS}, volume = {19}, number = {}, year = {2005}, pages = {549--563}, publisher = {}, address = {}, } @article{ morgenthaler:2007, author = {Stephan Morgenthaler}, title = {A Survey of Robust Statistics}, journal = SMA-JISS, month = {February}, number = {3}, pages = {271--293}, publisher = {Springer-Verlag}, volume = {15}, year = {2007} } @ARTICLE{ moreira:2000, author = {J. E. Moreira and S. P. Midkiff and M. Gupta and P. V. Artigas and M. Snir and R. D. Lawrence}, title = {Java programming for high-performance numerical computing}, journal = {IBM Systems Journal}, volume = {39}, number = {1}, year = {2000}, issn = {0018-8670}, pages = {21--56}, publisher = {IBM Corp.}, address = {Riverton, NJ, USA}, } @ARTICLE{ naga:1990, AUTHOR = {R. Naga and G. Antille}, TITLE = {Stability of Robust and Non-robust Principal Component Analysis}, JOURNAL = CSDA, PAGES = {169--174}, YEAR = {1990}, VOLUME = {10}, } @ARTICLE{ Nath-Pavur, AUTHOR = "Nath, R. and Pavur, R.", TITLE = "A new Statistic in the One Way Multivariate Analysis of Variance", JOURNAL = CSDA, PAGES = "297--315", YEAR = "1985", VOLUME = "2", } @ARTICLE{ neyko:2003, AUTHOR = "Mueller, Ch. and Neykov, N.M.", TITLE = "Breakdown Points of the Trimmed Likelihood and Related Estimators in Generalized Linear Models", JOURNAL = "Journal of Statistical Planning and Inference", PAGES = "503--519", YEAR = "2003", VOLUME = "116", } @ARTICLE{ pardoe-yin-cook, AUTHOR = "Iain Pardoe and Xiangrong Yin and Dennis R. Cook", TITLE = "Graphical Tools for Quadratic Discriminant Analysis", JOURNAL = "Technometrics", PAGES = "172--183", YEAR = "2007", VOLUME = "49", } @ARTICLE{ pena:01, AUTHOR = "Pe\~{n}a, D. and Prieto, F.J.", TITLE = "Multivariate Outlier Detection and Robust Covariance Matrix Estimation", JOURNAL = "Technometrics", PAGES = "286--301", YEAR = "2001", VOLUME = "43", } @ARTICLE{ pison:2002, AUTHOR = "Pison, G. and Van Aelst, S. and Willems, G.", TITLE = "Small Sample Corrections for {LTS} and {MCD}", JOURNAL = "Metrika", PAGES = "111--123", YEAR = "2002", VOLUME = "55", } @BOOK{ Puri-Sen, AUTHOR ="Puri, M.L. and Sen, P.K.", TITLE ="Nonparametric Methods in Multivariate Analysis", PUBLISHER=WILEY, YEAR = "1971", PAGES = "184--186", } @ARTICLE { rao:59, author = {Rao, C.R.}, title = {Some Problems Involving Linear Hypotheses in Multivariate Analysis}, year = {1959}, volume = {46}, pages = {49--58}, journal = {Biometrika} } @Book{ Sarkar:2008, title = {\pkg{lattice}: Multivariate Data Visualization with \proglang{R}}, author = {Deepayan Sarkar}, address = {New York}, publisher = {Springer-Verlag}, year = {2008} } @ARTICLE{ reaven-miller, AUTHOR = "Reaven, G. M. and Miller, R. G.", TITLE = "An Attempt to Define the Nature of Chemical Diabetes Using a Multidimensional Analysis", JOURNAL = "Diabetologia", PAGES = "17--24", YEAR = "1979", VOLUME = "16" } @ARTICLE{ reimann:2007, AUTHOR = "Reimann, C. and Arnoldussen, A. and Boyd, R. and Finne, Tor Erik and Koller, F and Nordgullen, O and Englmair, P.", TITLE = "Element contents in leaves of four plant species (birch, mountain ash, fern and spruce) along anthropogenic and geogenic concentration gradients", JOURNAL = "Science of the Total Environment", PAGES = "416--433", YEAR = "2007", VOLUME = "377", } @MISC{ riani:2008, title = {Controlling the Size of Multivariate Outlier Tests with the {MCD} Estimator of Scatter}, author = {Andrea Cerioli and Marco Riani and Anthony C. Atkinson}, abstract = {Abstract\ \ Multivariate outlier detection requires computation of robust distances to be compared with appropriate cut-off points. In this paper we propose a new calibration method for obtaining reliable cut-off points of distances derived from the MCD estimator of scatter. These cut-off points are based on a more accurate estimate of the extreme tail of the distribution of robust distances. We show that our procedure gives reliable tests of outlyingness in almost all situations of practical interest, provided that the sample size is not much smaller than 50. Therefore, it is a considerable improvement over all the available MCD procedures, which are unable to provide good control over the size of multiple outlier tests for the data structures considered in this paper.}, journal = {Statistics and Computing}, volume = {}, number = {}, year = {2008}, pages = {}, doi = {http://dx.doi.org/10.1007/s11222-008-9096-5}, posted-at = {2008-11-21 04:06:43}, url = {http://dx.doi.org/10.1007/s11222-008-9096-5} } @ARTICLE{ ronchetti:85, AUTHOR = "Ronchetti, E.", TITLE = "Robust Model Selection in Regression", JOURNAL = "Statistics and Probability Letters", PAGES = "21--23", YEAR = "1985", VOLUME = "3", } @ARTICLE{ rousseeuw:84, AUTHOR = "Rousseeuw, P. J.", TITLE = "Least Median of Squares Regression", JOURNAL = "Journal of the American Statistical Association", PAGES = "851--857", YEAR = "1984", VOLUME = "79", } @incollection{ rousseeuw:85, author = {Rousseeuw, P. J.}, title = {Multivariate Estimation with High Breakdown Point}, booktitle = {Mathematical Statistics and Applications Vol. B}, publisher = {Reidel Publishing}, year = {1985}, address = {Dordrecht}, editor = {W. Grossmann and G. Pflug and I. Vincze and W. Wertz}, pages = {283--297}, } @BOOK{ rousseeuw-leroy, AUTHOR = "Rousseeuw, P. J. and Leroy, A. M.", TITLE = "Robust Regression and Outlier Detection", PUBLISHER = WILEY, YEAR = "1987", ADDRESS = "New York", } @incollection{ Rousseeuw-van-Zomeren, author = {Rousseeuw, P. J. and van Zomeren, B. C.}, title = {Robust Distances: Simulation and Cutoff Values}, booktitle = {Directions in Robust Statistics and Diagnostics, Part II}, publisher = {Springer-Verlag}, year = {1991}, address = {New York}, editor = {W. Stahel and S. Weisberg}, pages = {}, } @ARTICLE{ rousseeuw-vandriessen, AUTHOR = "Rousseeuw, P. J. and Van Driessen, K", TITLE = "A Fast Algorithm for the Minimum Covariance Determinant Estimator", JOURNAL = "Technometrics", PAGES = "212--223", YEAR = "1999", VOLUME = "41", } @ARTICLE{ rousseeuw-vandriessen:LTS, AUTHOR = {Rousseeuw, P. J. and Van Driessen, K.}, TITLE = {Computing {LTS} Regression for Large Data Sets}, JOURNAL = {Data Mining and Knowledge Discovery}, month = {January}, number = {1}, PAGES = {29--45}, YEAR = {2006}, VOLUME = {12}, publisher = {Springer-Verlag}, } @ARTICLE{ rousseeuw-willems:2002, AUTHOR = "Willems, G. and Pison, G. and Rousseeuw, P. J. and Van Aelst, S.", TITLE = "A Robust {Hotelling} Test", JOURNAL = "Metrika", PAGES = "125--138", YEAR = "2002", VOLUME = "55", } @ARTICLE{ rocke:93, AUTHOR = "Woodruff, D. L. and Rocke, D. M. ", TITLE = "Heuristic Search Algorithms for the Minimum Volume Ellipsoid", JOURNAL = JCGS, PAGES = "69--95", YEAR = "1993", VOLUME = "2", } @ARTICLE{ rocke:94, AUTHOR = "Woodruff, D. L. and Rocke, D. M.", TITLE = "Computable Robust Estimation of Multivariate Location and Shape in High Dimension Using Compound Estimators", JOURNAL = "Journal of the American Statistical Association", PAGES = "888--896", YEAR = "1994", VOLUME = "89", } @ARTICLE{ rocke:96, AUTHOR = "Rocke, D. M. and Woodruff, D. L.", TITLE = "Identification of Outliers in Multivariate Data", JOURNAL = "Journal of the American Statistical Association", PAGES = "1047--1061", YEAR = "1996", VOLUME = "91", } @ARTICLE{ rocke:96a, AUTHOR = "Rocke, D. M.", TITLE = "Robustness Properties of {S}-Estimators of Multivariate Location and Shape in High Dimension", JOURNAL = "The Annals of Statistics", PAGES = "1327--1345", YEAR = "1996", VOLUME = "24", } @ARTICLE{ rocke:97, AUTHOR = "Rocke, D. M. and Woodruff, D. L.", TITLE = "Robust Estimation of Multivariate Location and shape", JOURNAL = "Journal of Statistical Planning and Inference", PAGES = "245--255", YEAR = "1997", VOLUME = "57", } @ARTICLE{ rocke:2005, AUTHOR = "Shagufta Aslam and David M. Rocke", TITLE = "A Robust Testing Procedure for the Equality of Covariance Matrices", JOURNAL = CSDA, PAGES = "863--874", YEAR = "2005", VOLUME = "49", } @article{ rubin:76, author = {Rubin, D. B.}, title = {Inference and Missing Data}, year = {1976}, volume = {63}, pages = {581--592}, journal = {Biometrika} } @ARTICLE{ ruppert:1992, AUTHOR = {D. Ruppert}, TITLE = {Computing {S}-Estimators for Regression and Multivariate Location/Dispersion}, JOURNAL = JCGS, PAGES = {253--270}, YEAR = {1992}, VOLUME = {1}, } @BOOK{ friendly-categorical, AUTHOR = {Michael Friendly}, TITLE = {Visualizing Categorical Data}, YEAR = {2000}, PUBLISHER = {SAS Insitute}, ADDRESS = {Carey, NC} } @MISC{ sas-robcov, AUTHOR = "Michael Friendly", TITLE = "SAS Graphic Programs and Macros", JOURNAL = "", YEAR = "2007", HOWPUBLISHED = "http://www.math.yorku.ca/SCS/sasmac/", } @ARTICLE{ salibian:2005, AUTHOR = "Salibian-Barrera, M. and Yohai, V. J.", TITLE = "A Fast Algorithm for {S}-regression Estimates", JOURNAL = JCGS, PAGES = "414--427", YEAR = "2006", VOLUME = "15", } @ARTICLE{ serneels-pca-missing:2008, author ={Serneels, Sven and Verdonck, Tim}, title ={Principal Component Analysis for Data Containing Outliers and Missing Elements}, journal =CSDA, year =2008, volume ={52}, number ={3}, pages ={1712--1727}, month ={January}, url ={http://ideas.repec.org/a/eee/csdana/v52y2008i3p1712-1727.html} } @ARTICLE{ Siani-Peretti, AUTHOR = "Siani, C. and de Peretti, C.", TITLE = "Analysing the Performance of Bootstrap Neural Tests for Conditional Heteroskedasticity in {ARCH-M} Models", JOURNAL = CSDA, PAGES = "2442--2460", YEAR = "2006", VOLUME = "51", } @ARTICLE{ song:2000, AUTHOR = "Moon Sup Song and Young Joo Yoon and Youngjo Lee", TITLE = "A Study on High Breakdown Discriminant Analysis: A Monte Carlo Simulation", JOURNAL = "The Korean Communications in Statistics", PAGES = "225--232", YEAR = "2000", VOLUME = "7", } @misc{ song-study-discrimination, author = "Moon Sup Song", title = "A Study on Robust Two-Group Discrimination Based on GM-Estimators", url = "citeseer.ist.psu.edu/418237.html" } @article{ jain-statistical-pattern-recognition, author = "Anil K. Jain and Robert P. W. Duin and Jianchang Mao", title = "Statistical Pattern Recognition: A Review", journal = "IEEE Transactions on Pattern Analysis and Machine Intelligence", volume = "22", number = "1", pages = "4--37", year = "2000", url = "citeseer.ist.psu.edu/jain00statistical.html" } @TECHREPORT{ stahel-phd:81, AUTHOR = {Stahel, W. A.}, TITLE = {Robuste Sch\"atzungen: {I}nfinitesimale Optimalit\"at und Sch\"atzungen von Kovarianzmatrizen}, TYPE = {Ph.D. thesis no. 6881}, INSTITUTION = {Swiss Federal Institute of Technology ({ETH})}, ADDRESS = {Z\"urich}, YEAR = {1981}, URL = {http://e-collection.ethbib.ethz.ch/view/eth:21890}, } @TECHREPORT{ stahel:81, AUTHOR = {Stahel, W. A.}, TITLE = {Breakdown of Covariance Estimators}, INSTITUTION = {ETH Zurich}, TYPE = {Research Report}, NUMBER = {31}, YEAR = {1981}, NOTE = {{F}achgruppe f{\"u}r {S}tatistik}, } @TECHREPORT{ donoho:82, AUTHOR = {D. L. Donoho}, TITLE = {Breakdown Properties of Multivariate Location Estimators}, INSTITUTION = {Harvard University}, ADDRESS = {Boston}, NUMBER = {}, YEAR = {1982}, URL = {http://www-stat.stanford.edu/~donoho/Reports/Oldies/BPMLE.pdf}, } @incollection{ donoho-huber, AUTHOR = {D. L. Donoho and P. J. Huber}, TITLE = {The Notion of Breakdown Point}, BOOKTITLE = {A Festschrift for Erich Lehmann}, ADDRESS = {Wadsworth, Belmont, CA}, YEAR = {1983}, EDITOR = {P. Bikel and K. Doksum and J. L. Hodges} } @article{ stromberg:2004, author = {Arnold Stromberg}, title = {Why Write Statistical Software? {T}he Case of Robust Statistical Methods}, journal = JSS, volume = {10}, number = {5}, pages = {1--8}, day = {26}, month = {4}, year = {2004}, URL = {http://www.jstatsoft.org/v10/i05}, } @incollection{ todorov:90, author = {Todorov, V. and Neykov, N.M. and Neytchev, P.N.}, title = {Robust Selection of Variables in the Discriminant Analysis Based on {MVE} and {MCD} Estimators}, booktitle = {Proceedings in Computational Statistics, COMPSTAT 1990}, publisher = {Physica Verlag}, year = {1990}, address = {Heidelberg}, editor = {Konstantin Momirovic and Vesna Mildner}, pages = {193--198}, } @ARTICLE{ todorov:92, AUTHOR = "Todorov, V.", TITLE = "Computing the Minimum Covariance Determinant Estimator ({MCD}) by Simulated Annealing", JOURNAL = CSDA, PAGES = "515--525", YEAR = "1992", VOLUME = "14", } @ARTICLE{ todorov:94, AUTHOR = "Todorov, V. and Neykov, N.M. and Neytchev, P.N.", TITLE = "Robust Two-group Discrimination by Bounded Influence Regression", JOURNAL = CSDA, PAGES = "289--302", YEAR = "1994", VOLUME = "17", } @incollection{ todorov-compstat:94, author = {Todorov, V. and Neykov, N.M. and Neytchev, P.N.}, title = {Stability of (High-breakdown Point) Robust Principal Components Analysis}, booktitle = {Short Communications in Computational Statistics, COMPSTAT 1994}, publisher = {Physica Verlag}, year = {1994}, address = {Heidelberg}, editor = {R. Dutter and W. Grossmann}, pages = {90--92}, } @incollection{ todorov:02, author = {Todorov, Valentin}, title = {Java and Computing for Robust Statistics}, booktitle = {Developments in Robust Statistics}, publisher = {Physica Verlag}, year = {2003}, address = {Heidelberg}, editor = {R. Dutter and P. Filzmoser and U. Gather and P. J. Rousseeuw}, pages = {404--416}, } @ARTICLE{ todorov-ldastp, AUTHOR = {Todorov, Valentin}, TITLE = {Robust Selection of Variables in Linear Discriminant Analysis}, JOURNAL = SMA-JISS, PAGES = {395--407}, YEAR = {2007}, VOLUME = {15}, } @ARTICLE{ todorov-roblda, AUTHOR = "Valentin Todorov and Ana M. Pires", TITLE = "Comparative Performance of Several Robust Linear Discriminant Analysis Methods", JOURNAL = "REVSTAT Statistical Journal", PAGES = "63--83", YEAR = "2007", VOLUME = "5", } @ARTICLE{ todorov-neyko-etal, AUTHOR = "Neykov, N. M. and Neytchev, P. N. and Van Gelder, P. H. A. J. M. and Todorov, V.", TITLE = "Robust Detection of Discordant Sites in Regional Frequency Analysis", JOURNAL = WRR, PAGES = "W06417", YEAR = "2007", VOLUME = "43", } @ARTICLE{ todorov-manova, AUTHOR = {Valentin Todorov and Peter Filzmoser}, TITLE = {Robust Statistic for the One-way {MANOVA}}, JOURNAL = CSDA, PAGES = {37--48}, YEAR = {2010}, VOLUME = {54}, } @MISC{ todorov-cf, AUTHOR = "Valentin Todorov", TITLE = "A Note on the {MCD} Consistency and Small Sample Correction Factors", JOURNAL = "", PAGES = "", YEAR = "2008", VOLUME = "", NOTE = "Unpublished manuscript, in preparation", } @MISC{ todorov-constructors, AUTHOR = "Peter Ruckdeschel and Matthias Kohl and Valentin Todorov", TITLE = "Structured User Interfaces via Generating Functions ", JOURNAL = "", PAGES = "", YEAR = "2009", VOLUME = "", NOTE = "Unpublished manuscript, in preparation", } @MANUAL{ todorov-rrcov, AUTHOR = {Valentin Todorov}, TITLE = {\pkg{rrcov}: {S}calable Robust Estimators with High Breakdown Point}, YEAR = {2009}, NOTE = {\proglang{R}~package version~0.5-03}, URL = {http://CRAN.R-project.org/package=rrcov}, } @ARTICLE{ todorov-oof, AUTHOR = {Valentin Todorov and Peter Filzmoser}, TITLE = {An Object Oriented Framework for Robust Multivariate Analysis}, JOURNAL = JSS, PAGES = {1--47}, YEAR = {2009}, VOLUME = {32}, NUMBER = {3}, URL = {https://www.jstatsoft.org/article/view/v032i03}, } @MANUAL{ robustbase, title = {\pkg{robustbase}: {B}asic Robust Statistics}, author = {Peter J. Rousseeuw and Christophe Croux and Valentin Todorov and Andreas Ruckstuhl and Matias Salibian-Barrera and Tobias Verbeke and Martin Maechler}, year = {2009}, note = {\proglang{R}~package version~0.4-5}, URL = {http://CRAN.R-project.org/package=robustbase}, } @MANUAL{ filzmoser-mvoutlier, AUTHOR = {Moritz Gschwandtner and Peter Filzmoser}, TITLE = {\pkg{mvoutlier}: {M}ultivariate Outlier Detection Based on Robust Methods}, YEAR = {2007}, NOTE = {\proglang{R}~package version~1.3}, URL = {http://CRAN.R-project.org/package=mvoutlier}, } @MANUAL{ Asquith, AUTHOR = {Asquith, W. H.}, TITLE = {The lmomco Package: Reference manual}, YEAR = {2006}, URL={http://cran.R-project.org/packages=lmomco.pdf}, } @Manual{ RLanguage, title = {\proglang{R}: {A} Language and Environment for Statistical Computing}, author = {{\proglang{R} Development Core Team}}, organization = {\proglang{R} Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2009}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org/} } @Manual{ filzmoser-pcaPP, title = {\pkg{pcaPP}: {R}obust {PCA} by Projection Pursuit}, author = {Peter Filzmoser and Heinrich Fritz and Klaudius Kalcher}, year = {2009}, note = {\proglang{R}~package version~1.7}, url = {http://CRAN.R-project.org/package=pcaPP}, } @Manual{ konis-robust, title = {\pkg{robust}: {I}nsightful Robust Library}, author = {Jiahui Wang and Ruben Zamar and Alfio Marazzi and Victor Yohai and Matias Salibian-Barrera and Ricardo Maronna and Eric Zivot and David Rocke and Doug Martin and Kjell Konis}, year = {2008}, note = {\proglang{R}~package version~0.3-4}, url = {http://CRAN.R-project.org/package=robust}, } @Manual{ locfit, title = {\pkg{locfit}: {L}ocal Regression, Likelihood and Density Estimation.}, author = {Catherine Loader}, year = {2007}, note = {\proglang{R}~package version~1.5-4}, url = {http://CRAN.R-project.org/package=locfit}, } @Manual{ mclust, title = {\pkg{mclust}: {M}odel-Based Clustering / Normal Mixture Modeling}, author = {Chris Fraley and Adrian Raftery}, year = {2009}, note = {\proglang{R}~package version~3.2}, url = {http://CRAN.R-project.org/package=mclust}, } @Manual{ Rfwdmv, title = {\pkg{Rfwdmv}: {F}orward Search for Multivariate Data}, author = {Anthony Atkinson and Andrea Cerioli and Marco Riani}, year = {2005}, note = {\proglang{R}~package version~0.72-2}, url = {http://CRAN.R-project.org/package=Rfwdmv}, } @incollection{ Tukey:89, author = {Tukey, John}, title = {Robust Statistics: From an Intelectual Game to Every Day Use}, booktitle = {Directions in Robust Statistics and Diagnostics, Part II}, publisher = {Springer-Verlag}, year = {1989}, address = {New York}, editor = {W.Stahel and S.Weisberg}, pages = {}, } @ARTICLE{ tyler:1996, AUTHOR = "J. T. Kent and D. E. Tyler", TITLE = "Constrained {M}~estimation of Multivariate Location and Scatter", JOURNAL = "The Annals of Statistics", PAGES = "1346--1370", YEAR = "1996", VOLUME = "24", } @ARTICLE{ vandev:93, AUTHOR = "Vandev, D.L.", TITLE = "A Note on Breakdown Point of the Least Median Squares and Least Trimmed Squares", JOURNAL = "Statistics and Probability Letters", PAGES = "117--119", YEAR = "1993", VOLUME = "16", } @incollection{ vandev-neykov, author = {Vandev, D. L. and Neykov, N. M.}, title = {Robust maximum likelihood in the Gaussian case, In New Directions in Data Analysis and Robustness}, booktitle = {New Directions in Data Analysis and Robustness}, publisher = {Birkhauser Verlag}, year = {1993}, address = {Basel}, editor = {Morgenthaler, S. and Ronchetti, E. and Stahel, W. A.}, pages = {259--264}, } @ARTICLE{ verboon:1994, AUTHOR={Peter Verboon and Ivo Lans}, TITLE={Robust Canonical Discriminant Analysis}, JOURNAL={Psychometrika}, YEAR=1994, VOLUME={59}, NUMBER={4}, PAGES={485-507}, MONTH={December}, NOTE={available at http://ideas.repec.org/a/spr/psycho/v59y1994i4p485-507.html} } @TECHREPORT{ Victoria-Feser:2003.04, AUTHOR={Samuel Copt and Maria-Pia Victoria-Feser}, TITLE={Variable Fast Algorithms for Computing High Breakdown Covariance Matrices with Missing Data}, YEAR=2003, MONTH=Aug, INSTITUTION={D{\'e}partement d'Econom{\'e}trie, Universit{\'e} de Gen{\'e}ve}, TYPE={Cahiers du D{\'e}partement d'Econom{\'e}trie}, NOTE={available at http://ideas.repec.org/p/gen/geneem/2003.04.html}, NUMBER={2003.04} } @incollection{ Victoria-Feser:2004, AUTHOR = {Samuel Copt and Maria-Pia Victoria-Feser}, TITLE = {Fast Algorithms for Computing High Breakdown Covariance Matrices with Missing Data}, BOOKTITLE = {Theory and Applications of Recent Robust Methods, Statistics for Industry and Technology Series}, YEAR = {2004}, EDITOR = {Hubert, M. and Pison, G. and Struyf, A. and Van Aelst, S.}, PAGES = {}, PUBLISHER = {Birkhauser Verlag}, ADDRESS = {Basel} } @ARTICLE{ Victoria-Feser:2002, AUTHOR = {Cheng, T. C. and Maria-Pia Victoria-Feser}, TITLE = {High Breakdown Estimation of Multivariate Location and Scale With Missing Observations}, JOURNAL = {British Journal of Mathematical and Statistical Psychology }, YEAR = {2002}, VOLUME = {55}, PAGES = {317--335} } @BOOK{ webb, abstract = {{Statistical pattern recognition is a very active area of study and research, which has seen many advances in recent years. New and emerging applications - such as data mining, web searching, multimedia data retrieval, face recognition, and cursive handwriting recognition - require robust and efficient pattern recognition techniques. Statistical decision making and estimation are regarded as fundamental to the study of pattern recognition.


Statistical Pattern Recognition, Second Edition has been fully updated with new methods, applications and references. It provides a comprehensive introduction to this vibrant area - with material drawn from engineering, statistics, computer science and the social sciences - and covers many application areas, such as database design, artificial neural networks, and decision support systems.


* Provides a self-contained introduction to statistical pattern recognition.
* Each technique described is illustrated by real examples.
* Covers Bayesian methods, neural networks, support vector machines, and unsupervised classification.
* Each section concludes with a description of the applications that have been addressed and with further developments of the theory.
* Includes background material on dissimilarity, parameter estimation, data, linear algebra and probability.
* Features a variety of exercises, from 'open-book' questions to more lengthy projects.


The book is aimed primarily at senior undergraduate and graduate students studying statistical pattern recognition, pattern processing, neural networks, and data mining, in both statistics and engineering departments. It is also an excellent source of reference for technical professionals working in advanced information development environments.

For further information on the techniques and applications discussed in this book please visit\&\#160;www.statistical-pattern-recognition.net } {"Statistical pattern recognition is a very active area of study and research, which has seen many advances in recent years. New and emerging applications - such as data mining, web searching, multimedia data retrieval, face recognition, and cursive handwriting recognition - require robust and efficient pattern recognition techniques. Statistical decision making and estimation are regarded as fundamental to the study of pattern recognition. Statistical Pattern Recognition, Second Edition has been fully updated with new methods, applications and references. It provides a comprehensive introduction to this vibrant area - with material drawn from engineering, statistics, computer science and the social sciences - and covers many application areas, such as database design, artificial neural networks, and decision support systems. Provides a self-contained introduction to statistical pattern recognition. Each technique described is illustrated by real examples. Covers Bayesian methods, neural networks, support vector machines, and unsupervised classification. Each section concludes with a description of the applications that have been addressed and with further developments of the theory. Includes background material on dissimilarity, parameter estimation, data, linear algebra and probability. Features a variety of exercises, from 'open-book' questions to more lengthy projects. The book is aimed primarily at senior undergraduate and graduate students studying statistical pattern recognition, pattern processing, neural networks, and data mining, in both statistics and engineering departments. It is also an excellent source of reference for technical professionals working in advanced information development environments."}}, author = {Webb, Andrew R. }, isbn = {0470845147}, keywords = {pattern-recognition}, month = {October}, publisher = WILEY, title = {Statistical Pattern Recognition, 2nd Edition}, url = {http://www.amazon.ca/exec/obidos/redirect?tag=citeulike09-20\&path=ASIN/0470845147}, year = {2002} } %========================================================================== %========================================================================= @BOOK{ cookwisb, AUTHOR = "Cook, R. D. and Weisberg, S.", TITLE = "Residuals and Influence in Regression", PUBLISHER = "Chapman and Hall", YEAR = "1982", } @ARTICLE{ bartlett, AUTHOR = "Bartlett, M.", TITLE = "An inverse matrix adjustment arising in disccriminant analysis", JOURNAL = "Annals of Mathematical Statistics", PAGES = "107-111", YEAR = "1951", VOLUME = "22", } @ARTICLE{ willems-zamar, AUTHOR = "Willems, G. and Joe H. and Zamar R.H.", TITLE = "Diagnosing Multivariate Outliers Detected by Robust Estimators", JOURNAL = "", PAGES = "", YEAR = "2008", VOLUME = "", } @TECHREPORT{ wood, AUTHOR = "Woodbury, M.", TITLE = "Inverting modified matrices", INSTITUTION = "Princeton University", TYPE = "Technical Report", NUMBER = "42", YEAR = "1950", NOTE = "Statistical Techniques Research Group", } @incollection{ acd+j:91, author = {Davison, A. C. and Snell, E. J. }, title = {Residuals and Diagnostics}, booktitle = {Statistical Theory and Modelling }, publisher = {Chapman and Hall }, year = {1991}, address = {London }, editor = {Hinkley, D. V. and Reid, N. and Snell, E. J. }, pages = {83--106}, } @article{ cook:77, author = {Cook, R. D. }, title = {Detection of influential observations in linear regression}, journal = {Technometrics }, year = {1977}, volume = {19}, pages = {15--18} } @article{ aca:82, author = {Atkinson, A. C. }, title = {Optimum biased coin designs for sequential clinical trials with prognostic factors}, year = {1982}, volume = {69}, pages = {61--67}, journal = {Biometrika} } @book{ mcc+n:89, author = {McCullagh, P. and Nelder, J. A. }, title = {Generalized Linear Models (2nd edition)}, publisher = {Chapman and Hall }, year = {1989}, address = {London } } @article{ efr:78, author = {Efron, B. }, title = {Regression and {ANOVA} with Zero--One data: measures of residual variation}, year = {1978}, volume = {73}, pages = {113--121}, journal = {Journal of the American Statistical Association } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Outliers, Sampling Serveys %%% @BOOK{ barnett:1994, AUTHOR = {Barnett, V. and Lewis, T.}, TITLE = {Outliers in Statistical Data}, PUBLISHER = WILEY, YEAR = {1994}, ADDRESS = {}, } @Article{ Beguin:2004, author={C\`{e}dric B\`{e}guin and Beat Hulliger}, title={Multivariate Outlier Detection in Incomplete Survey Data: the Epidemic Algorithm and Transformed Rank Correlations}, journal=JRSS-B, year=2004, volume={127}, number={2}, pages={275-294}, month={}, url={http://ideas.repec.org/a/bla/jorssa/v167y2004i2p275-294.html} } @ARTICLE{ chambers:2004, author={Ray Chambers and Adandatilde;o Hentges and Xinqiang Zhao}, title={Robust Automatic Methods for Outlier and Error Detection}, journal=JRSS-A, year=2004, volume={127}, number={2}, pages={323-339}, month={}, url={http://ideas.repec.org/a/bla/jorssa/v167y2004i2p323-339.html} } @incollection{ franklin:1997, author = {Sarah Franklin and Marie Brodeur}, title = {A Practical Application of A Robust Multivariate Outlier Detection Method}, booktitle = {Proceedings of the Survey Research Methods Section, ASA (1997)}, publisher = {}, pages = {186--197}, editor = {}, year = {1997}, url={http://www.amstat.org/sections/srms/proceedings} } @incollection{ franklin:2000, author = {Sarah Franklin and Marie Brodeur and Steven Thomas}, title = {Robust Multivariate Outlier Detection Using Mahalanobis' Distance and Stahel-Donoho Estimators}, booktitle = {ICES - II, International Conference on Establishment Surveys - II}, publisher = {}, pages = {}, editor = {}, year = {2000}, url={} } @incollection{ hulliger:2007, author = {Beat Hulliger}, title = {Multivariate Outlier Detection and Treatment in Business Surveys}, booktitle = {ICES - III, International Conference on Establishment Surveys - III}, publisher = {}, pages = {}, editor = {}, year = {2007}, url={} } @ARTICLE{ Ghosh-Dastidar:2006, AUTHOR = {Bonnie Ghosh-Dastidar and J. L. Schafer}, TITLE = {Outlier Detection and Editing Procedures for Continuous Multivariate Data}, JOURNAL = {Journal of Official Statistics}, PAGES = {487-506}, YEAR = {2006}, VOLUME = {22}, NUMBER = {3} } @incollection{ santos-pereira-detection:2002, author = {Carla M. Santos-Pereira and Ana M. Pires}, title = {Detection of Outliers in Multivariate Data: A Method Based on Clustering and Robust Estimators}, booktitle = {Proceedings in Computational Statistics, COMPSTAT`2002}, publisher = {Physica Verlag}, year = {2002}, address = {Heidelberg }, editor = {H{\"a}rdle, W. and R{\"o}nz, B.}, pages = {291--296}, url = {citeseer.ist.psu.edu/545222.html} } @BOOK{ Schafer:1997, AUTHOR = {J.L. Schafer}, TITLE = {Analysis of Incomplete Multivariate Data}, PUBLISHER = {Chapman and Hall}, YEAR = {1997}, ADDRESS = {London}, } @ARTICLE{ smith:1987, AUTHOR = {Smith, T.M.F.}, TITLE = {Influential observations in survey sampling}, JOURNAL = {Applied Statistics}, PAGES = {143--152}, YEAR = {1987}, VOLUME = {}, } @ARTICLE{ Ton-de-Waal:2005, author={Ton de Waal and Wieger Coutinho}, title={Automatic Editing for Business Surveys: An Assessment of Selected Algorithms}, journal={International Statistical Review}, year=2005, volume={73}, number={1}, pages={73--102}, month={}, url={} } @ARTICLE{ Zijlstra:2007, AUTHOR = {Wobbe P. Zijlstra and L. Andries van der Ark and Klaas Sijtsma}, TITLE = {Outlier Detection in Test and Questionnaire Data}, JOURNAL = {Multivariate Behavioral Research}, PAGES = {531--555}, YEAR = {2007}, VOLUME = {4}, ISSUE = {3}, } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Software development references %% @BOOK{ gamma, AUTHOR = "Gamma, E. and Helm, R. and Johnson, R. and Vlissides, J.", TITLE = "Design Patterns: Elements of Reusable Object-oriented Software", PUBLISHER = "Addison-Wesley", ADDRESS = "Reading", YEAR = "1995" } @BOOK{ grand, AUTHOR = "Grand, M.", TITLE = "Patterns in Java, Volume 1.", PUBLISHER = WILEY, ADDRESS = "New York", YEAR = "1998" } @misc{ manolescu:why-java, author = "Dragos Manolescu and Adrian Kunzle", title = "Why Java is Not Suitable for Object-Oriented Frameworks", howpublished = {OOPSLA 2001 Proceedings Companion}, month = oct, year = 2001, note = "Available on the Web from \url{http://micro-workflow.com/}", url = {citeseer.ist.psu.edu/465868.html} } @article{ meusel:documentation-oo-framework, author = "Matthias Meusel and Krzysztof Czarnecki and Wolfgang K{\"o}pf", title = "A Model for Structuring User Documentation of Object- Oriented Frameworks Using Patterns and Hypertext", journal = "Lecture Notes in Computer Science", volume = "1241", pages = "496--??", year = "1997", url = "citeseer.ist.psu.edu/meusel97model.html" } @TECHREPORT{ argo:phd, AUTHOR = {Jason Elliot Robbins}, TITLE = {Cognitive Support Features for Software Development Tools}, INSTITUTION = {University of California}, ADDRESS = {Irvine}, TYPE = {Ph.D. thesis}, NUMBER = {}, YEAR = {1999}, NOTE = {}, URL = {http://argouml.tigris.org/docs/robbins_dissertation/}, } @ARTICLE{ argo:2000, AUTHOR = {Jason Elliot Robbins and D. F. Redmiles}, TITLE = {Cognitive Support, {UML} Adherence, and {XMI} Interchange in {A}rgo/{UML}}, JOURNAL = {Information and Software Technology}, VOLUME = {42}, PAGES = {79--89}, YEAR = {2000}, } @ARTICLE{ argo:2006, AUTHOR = {Mei Zhang}, TITLE = {Argo{UML}}, JOURNAL = {Journal of Computing Sciences in Colleges}, VOLUME = {21}, NUMBER = {5}, PAGES = {6--7}, YEAR = {2006}, } @TECHREPORT{ umlInfra, AUTHOR = {OMG}, TITLE = {{OMG} Unified Modeling Language ({OMG UML}), {I}nfrastructure, {V}2.2}, YEAR = {2009}, MONTH = {February}, TYPE = {Current formally adopted specification}, INSTITUTION = {Object Management Group}, URL = {http://www.omg.org/spec/UML/2.2/Infrastructure/PDF}, } @TECHREPORT{ umlSuper, AUTHOR = {OMG}, TITLE = {{OMG} Unified Modeling Language ({OMG UML}), {S}uperstructure, {V}2.2}, YEAR = {2009}, MONTH = {February}, TYPE = {Current formally adopted specification}, INSTITUTION = {Object Management Group}, URL = {http://www.omg.org/spec/UML/2.2/Superstructure/PDF}, } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% DATA SET REFERENCES %% @MISC{ fish-catch-data:2006, AUTHOR = "Juha Puranen", TITLE = "Fish Catch Data Set", JOURNAL = "Journal of Statistical Education", YEAR = "2006", HOWPUBLISHED = "http://www.amstat.org/publications/jse/datasets/fishcatch.txt", } @MISC{ UCI-KDD-1999, AUTHOR = {S. Hettich and S. D. Bay}, TITLE = {The UCI KDD Archive}, JOURNAL = {}, YEAR = {1999}, PUBLISHER = {University of California, Department of Information and Computer Science}, ADDRESS = {Irvine, CA}, HOWPUBLISHED = {http://kdd.ics.uci.edu}, URL = {http://kdd.ics.uci.edu}, } @misc{ UCI:2007, author = "A. Asuncion and D.J. Newman", year = "2007", title = "{UCI} Machine Learning Repository", url = "http://www.ics.uci.edu/$\sim$mlearn/{MLR}epository.html", institution = "University of California, Irvine, School of Information and Computer Sciences" } rrcov/vignettes/rrcov.Rnw0000644000176200001440000033555713564765137015303 0ustar liggesusers% -*- TeX -*- -*- Soft -*- \documentclass[article,shortnames,nojss]{jss} %\VignetteIndexEntry{An Object-Oriented Framework for Robust Multivariate Analysis} %\VignetteKeywords{robustness, multivariate analysis, MCD, R, statistical design patterns} %\VignettePackage{rrcov} \usepackage{amsmath} %% need for subequations \usepackage{amssymb} \usepackage{amsfonts} \usepackage[english]{babel} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\vv}[1]{\mbox{\boldmath$#1$}} \newcommand{\xv}{\mbox{\boldmath$x$}} \newcommand{\yv}{\mbox{\boldmath$y$}} \newcommand{\zv}{\mbox{\boldmath$z$}} \newcommand{\mv}{\mbox{\boldmath$m$}} \newcommand{\tv}{\mbox{\boldmath$t$}} \newcommand{\xbarv}{\mbox{\boldmath$\bar x$}} \newcommand{\uv}{\mbox{\boldmath$u$}} \newcommand{\muv}{\mbox{\boldmath$\mu$}} \newcommand{\nuv}{\mbox{\boldmath$\nu$}} \newcommand{\deltav}{\mbox{\boldmath$\delta$}} \newcommand{\chiv}{\mbox{\boldmath$\chi$}} \newcommand{\ov}{\mbox{\boldmath$0$}} \newcommand\MCD{\mathit{MCD}} \newcommand\MVE{\mathit{MVE}} \newcommand\OGK{\mathit{OGK}} \newcommand\diag{\mathrm{diag}} %\newcommand\det{\mathrm{det}} \newcommand{\class}[1]{``\code{#1}''} \newcommand{\fct}[1]{\code{#1()}} %% almost as usual \author{Valentin Todorov\\UNIDO \And Peter Filzmoser\\Vienna University of Technology} \title{An Object Oriented Framework for Robust Multivariate Analysis} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Valentin Todorov, Peter Filzmoser} %% comma-separated \Plaintitle{Object Oriented Framework for Robust Multivariate Analysis} %% without formatting \Shorttitle{OOF for Robust Multivariate Analysis} %% a short title (if necessary) %% an abstract and keywords \Abstract{ \noindent This introduction to the \proglang{R} package \pkg{rrcov} is a (slightly) modified version of \cite{todorov-oof}, published in the \emph{Journal of Statistical Software}. \noindent Taking advantage of the \proglang{S}4 class system of the programming environment \proglang{R}, which facilitates the creation and maintenance of reusable and modular components, an object oriented framework for robust multivariate analysis was developed. The framework resides in the packages \pkg{robustbase} and \pkg{rrcov} and includes an almost complete set of algorithms for computing robust multivariate location and scatter, various robust methods for principal component analysis as well as robust linear and quadratic discriminant analysis. The design of these methods follows common patterns which we call statistical design patterns in analogy to the design patterns widely used in software engineering. The application of the framework to data analysis as well as possible extensions by the development of new methods is demonstrated on examples which themselves are part of the package \pkg{rrcov}. } \Keywords{robustness, multivariate analysis, MCD, \proglang{R}, statistical design patterns} \Plainkeywords{robustness, multivariate analysis, MCD, R, statistical design patterns} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Valentin Todorov\\ Research and Statistics Branch\\ United Nations Industrial Development Organization (UNIDO)\\ Vienna International Centre\\ P.O.Box 300, 1400, Vienna, Austria\\ E-mail: \email{valentin.todorov@chello.at}\\ % URL: \url{http://statmath.wu-wien.ac.at/~zeileis/} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bi}{\begin{itemize}} \newcommand{\ei}{\end{itemize}} \newcommand{\be}{\begin{enumerate}} \newcommand{\ee}{\end{enumerate}} \renewcommand{\v}[1]{\mathbf{#1}} %% Sweave options for the complete document %%\SweaveOpts{keep.source=TRUE} %%\SweaveOpts{prefix.string=images/oofgen/oof} \SweaveOpts{prefix.string=ooframework} \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. %\section[About Java]{About \proglang{Java}} \section[Introduction]{Introduction} %% Note: If there is markup in \(sub)section, then it has to be escape as above. Outliers are present in virtually every data set in any application domain, and the identification of outliers has a hundred years long history. Many researchers in science, industry and economics work with huge amounts of data and this even increases the possibility of anomalous data and makes their (visual) detection more difficult. Taking into account the multivariate aspect of the data, the outlyingness of the observations can be measured by the Mahalanobis distance which is based on location and scatter estimates of the data set. In order to avoid the masking effect, robust estimates of these parameters are called for, even more, they must possess a positive breakdown point. The estimates of the multivariate location vector $\muv$ and the scatter matrix $\v{\Sigma}$ are also a cornerstone in the analysis of multidimensional data, since they form the input to many classical multivariate methods. The most common estimators of multivariate location and scatter are the sample mean $\xbarv$ and the sample covariance matrix $\v{S}$, i.e., the corresponding MLE estimates. These estimates are optimal if the data come from a multivariate normal distribution but are extremely sensitive to the presence of even a few outliers (atypical values, anomalous observations, gross errors) in the data. If outliers are present in the input data they will influence the estimates $\xbarv$ and $\v{S}$ and subsequently worsen the performance of the classical multivariate procedure based on these estimates. Therefore it is important to consider robust alternatives to these estimators and actually in the last two decades much effort was devoted to the development of affine equivariant estimators possessing a high breakdown point. The most widely used estimators of this type are the minimum covariance determinant (MCD) estimator of \citet{rousseeuw:85} for which also a fast computing algorithm was constructed---\citet{rousseeuw-vandriessen}, the S~estimators \citep{davies:87} and the Stahel-Donoho estimator introduced by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} and studied by \citet{maronna:95}. If we give up the requirement for affine equivariance, estimators like the one of \citet{maronna:2002} are available and the reward is an extreme gain in speed. Substituting the classical location and scatter estimates by their robust analogues is the most straightforward method for robustifying many multivariate procedures like principal components, discriminant and cluster analysis, canonical correlation, etc. The reliable identification of multivariate outliers which is an important task in itself, is another approach to robustifying many classical multivariate methods. Some of these estimates and procedures became available in the popular statistical packages like \proglang{S-PLUS}, \proglang{SAS}, \proglang{MATLAB} as well as in \proglang{R} but nevertheless it is recognized that the robust methods have not yet replaced the ordinary least square techniques as it could be expected \citep{morgenthaler:2007, stromberg:2004}. One reason is the lack of easily accessible and easy to use software, that is software which presents the robust procedures as extensions to the classical ones---similar input and output, reasonable defaults for most of the estimation options and visualization tools. As far as the easiness of access is concerned, the robust statistical methods should be implemented in the freely available statistical software package \proglang{R}, \citep{RLanguage}, which provides a powerful platform for the development of statistical software. These requirements have been defined in the project ``Robust Statistics and \proglang{R}'', see \url{http://www.statistik.tuwien.ac.at/rsr/}, and a first step in this direction was the initial development of the collaborative package \pkg{robustbase}, \citep{robustbase}, with the intention that it becomes the \textit{essential robust statistics} \proglang{R} package covering the methods described in the recent book \citet{maronna:2006}. During the last decades the object oriented programming paradigm has revolutionized the style of software system design and development. A further step in the software reuse are the object oriented frameworks \citep[see][]{gamma} which provide technology for reusing both the architecture and the functionality of software components. Taking advantage of the new \proglang{S}4 class system \citep{chambers:98} of \proglang{R} which facilitate the creation of reusable and modular components an object oriented framework for robust multivariate analysis was implemented. The goal of the framework is manyfold: \be \item{to provide the end-user with a flexible and easy access to newly developed robust methods for multivariate data analysis;} \item{to allow the programming statisticians an extension by developing, implementing and testing new methods with minimum effort, and } \item{to guarantee the original developers and maintainer of the packages a high level of maintainability.} \ee The framework includes an almost complete set of algorithms for computing robust multivariate location and scatter, such as minimum covariance determinant, different S~estimators (SURREAL, FAST-S, Bisquare, Rocke-type), orthogonalized Gnanadesikan--Kettenring (OGK) estimator of \citet{maronna:2002}. The next large group of classes are the methods for robust principal component analysis (PCA) including ROBPCA of \citet{hubert-ROBPCA:2005}, spherical principal components (SPC) of \citet{locantore:1999}, the projection pursuit algorithms of \citet{croux-Ruiz-Gazen:2005} and \citet{croux-filzmoser-oliveira-pppca}. Further applications implemented in the framework are linear and quadratic discriminant analysis \citep[see][for a review]{todorov-roblda}, multivariate tests \citep{rousseeuw-willems:2002, todorov-manova} and outlier detection tools. The application of the framework to data analysis as well as the development of new methods is illustrated on examples, which themselves are part of the package. Some issues of the object oriented paradigm as applied to the \proglang{R} object model (naming conventions, access methods, coexistence of \proglang{S}3 and \proglang{S}4 classes, usage of UML, etc.) are discussed. The framework is implemented in the \proglang{R} packages \pkg{robustbase} and \pkg{rrcov}, \citep{todorov-rrcov}, which are available from Comprehensive \proglang{R} Archive Network (CRAN) at \url{http://CRAN.R-project.org} under the GNU General Public License. The rest of the paper is organized as follows. In the next Section~\ref{oof-sec:objmodel} the design principles and the structure of the framework is presented as well as some related object oriented concepts are discussed. As a main tool for modeling of the robust estimation methods a statistical design pattern is proposed. Section~\ref{oof-sec:ex-intro} facilitates the quick start by an example session giving a brief overview of the framework. Section~\ref{oof-sec:multi} describes the robust multivariate methods, their computation and implementation. The Sections~\ref{oof-sec:cov}, \ref{oof-sec:pca} and \ref{oof-sec:lda} are dedicated to the estimation of multivariate location and scatter, principal component analysis and discriminant analysis, respectively. For each domain the object model, the available visualization tools, an example, and other relevant information are presented. We conclude in Section~\ref{oof-sec:conclusions} with discussion and outline of the future work. \section{Design approach and structure of the framework} \label{oof-sec:objmodel} In classical multivariate statistics we rely on parametric models based on assumptions about the structural and the stochastic parts of the model for which optimal procedures are derived, like the least squares estimators and the maximum likelihood estimators. The corresponding robust methods can be seen as extensions to the classical ones which can cope with deviations from the stochastic assumptions thus mitigating the dangers for classical estimators. The developed statistical procedures will remain reliable and reasonably efficient even when such deviations are present. For example in the case of location and covariance estimation the classical theory yields the sample mean $\xbarv$ and the sample covariance matrix $\v{S}$, i.e., the corresponding MLE estimates as an optimal solution. One (out of many) robust alternatives is the minimum covariance determinant estimator. When we consider this situation from an object oriented design point of view we can think of an abstract base class representing the estimation problem, a concrete realization of this object---the classical estimates, and a second concrete derivative of the base class representing the MCD estimates. Since there exist many other robust estimators of multivariate location and covariance which share common characteristics we would prefer to add one more level of abstraction by defining an abstract ``robust'' object from which all other robust estimators are derived. We encounter a similar pattern in most of the other multivariate statistical methods like principal component analysis, linear and quadratic discriminant analysis, etc. and we will call it a \textit{statistical design pattern}. A schematic representation as an \textit{UML diagram} is shown in Figure~\ref{oof-fig:objmodel}. \begin{figure}[h!] \begin{center} \includegraphics[width=1.0\textwidth]{AModel} \label{oof-fig:objmodel} \caption{Class diagram of the statistical design pattern for robust estimation methods.} \end{center} \end{figure} The following simple example demonstrates the functionality. We start with a generic object model of a robust and the corresponding classical multivariate method with all the necessary interfaces and functionalities and then concretize it to represent the desired class hierarchy. The basic idea is to define an abstract \proglang{S}4 class which has as slots the common data elements of the result of the classical method and its robust counterparts (e.g., \code{Pca}). For this abstract class we can implement the standard in \proglang{R} generic functions like \code{print()}, \code{summary()}, \code{plot()} and maybe also \code{predict()}. Now we can derive and implement a concrete class which will represent the classical method, say \code{PcaClassic}. Further we derive another abstract class which represents a potential robust method we are going to implement, e.g., \code{PcaRobust}---it is abstract because we want to have a ``placeholder'' for the robust methods we are going to develop next. The generic functions that we implemented for the class \code{Pca} are still valid for \code{PcaRobust} but whenever necessary we can override them with new functionality. Now we have the necessary platform and of course we have had diligently documented everything we have implemented so far---this is our investment in the future development of robust methods from this family. The framework at its current expansion stage provides such platform for several important families of multivariate methods. It is time to dedicate our effort to the development and implementation of our new robust method/class, say \code{PcaHubert} and only to this---here comes the first obvious benefit from the framework---we do not need to care for the implementation of \code{print()}, \code{summary()}, \code{plot()} and \code{predict()} neither for their documentation or testing. In contrast to the \proglang{S}3 class system the \proglang{S}4 system requires the creation of objects to be done by the \code{new()} function which will perform the necessary validity checks. We go one step further and require that the \code{new()} function is not used directly but only through special functions known in \proglang{R} as \textit{generating functions} or as \textit{constructors} in the conventional object oriented programming languages. A constructor function has the same name as the corresponding class, takes the estimation options as parameters, organizes the necessary computations and returns an object of the class containing the results of the computation. It can take as a parameter also a \textit{control object} which itself is an \proglang{S}4 object and contains the estimation options. More details on the generating functions and their application for structuring the user interface can be found in \citet{todorov-constructors}. The main part of the framework is implemented in the package \pkg{rrcov} but it relies on code in the packages \pkg{robustbase} and \pkg{pcaPP} \citep{filzmoser-pcaPP}. The structure of the framework and its relation to other \proglang{R} packages is shown in Figure~\ref{oof-fig:structure}. \begin{figure}[h!] \begin{center} \includegraphics[width=0.8\textwidth]{Structure} \label{oof-fig:structure} \caption{Class diagram: structure of the framework and relation to other \proglang{R} packages.} \end{center} \end{figure} The framework can be used by other packages, like for example by \pkg{robust} \citep[see][]{konis-robust} or can be further extended. In Figure~\ref{oof-fig:structure} a hypothetical package \pkg{rrcovNA} is shown, which could extend the available robust multivariate methods with options for dealing with missing values. In the rest of this section some object-oriented programming (OOP) concepts will be discussed which are essential for understanding the framework. \newpage \subsection{UML diagrams} \label{oof-sec:UML} Throughout this paper we exploit UML class diagrams to give a clear picture of the framework and its components. UML stands for \textit{Unified Modeling Language}---an object-oriented system of notation which has evolved from previous works of Grady Booch, James Rumbaugh and Ivar Jacobson to become a tool accepted by the Object Management Group (OMG) as the standard for modeling object oriented programs \citep[see][]{umlInfra, umlSuper}. A class diagram models the structure and contents of a system by depicting classes, packages, objects and the relations among them with the aim to increase the ease of understanding the considered application. A class is denoted by a box with three compartments which contain the name, the attributes (slots) and operations (methods) of the class, respectively. The class name in italics indicates that the class is abstract. The bottom two compartments could be omitted or they can contain only the key attributes and operations which are useful for understanding the particular diagram. Each attribute is followed by its type and each operation---by the type of its return value. We use the \proglang{R} types like \code{numeric}, \code{logical}, \code{vector}, \code{matrix}, etc. but the type can be also a name of an \proglang{S}4 class. Relationships between classes are denoted by lines or arrows with different form. The inheritance relationship is depicted by a large empty triangular arrowhead pointing to the base class. Composition means that one class contains another one as a slot (not to be mistaken with the keyword ``contains'' signalling inheritance in \proglang{R}). This relation is represented by an arrow with a solid diamond on the side of the composed class. If a class ``uses'' another one or depends on it, the classes are connected by a dashed arrow (dependence relation). Packages can also be present in a class diagram---in our case they correspond more or less to \proglang{R} packages---and are shown as tabbed boxes with the name of the package written in the tab (see Figure~\ref{oof-fig:structure}). All UML diagrams of the framework were created with the open source UML tool \pkg{ArgoUML} \citep{argo:phd, argo:2000} which is available for download from \url{http://argouml.tigris.org/}. \subsection{Design patterns} \label{oof-sec:patterns} Design patterns are usually defined as general solutions to recurring design problems and refer to both the description of a solution and an instance of that solution solving a particular problem. The current use of the term design patterns originates in the writings of the architect Christopher Alexander devoted to urban planning and building architecture \citep{alexander} but it was brought to the software development community by the seminal book of \citet{gamma}. A design pattern can be seen as a template for how to solve a problem which can be used in many different situations. Object-Oriented design patterns are about classes and the relationships between classes or objects at abstract level, without defining the final classes or objects of the particular application. In order to be usable, design patterns must be defined formally and the documentation, including a preferably evocative name, describes the context in which the pattern is used, the pattern structure, the participants and collaboration, thus presenting the suggested solution. Design patterns are not limited to architecture or software development but can be applied in any domain where solutions are searched for. During the development of the here presented framework several design patterns were identified, which we prefer to call \textit{statistical design patterns}. The first one was already described earlier in this section and captures the relations among a classical and one or more alternative robust multivariate estimators. Another candidate is the control object encapsulating the estimation parameters and a third one is the factory-like construct which suggests selection of a robust estimation method and creation of the corresponding objects based on the data set characteristics (see Section~\ref{oof-sec:cov}). The formal description of these design patterns is beyond the scope of this work and we will limit the discussion to several examples. \subsection{Accessor methods} \label{oof-sec:accessors} One of the major characteristics and advantages of object oriented programming is the encapsulation. Unfortunately real encapsulation (information hiding) is missing in \proglang{R}, but as far as the access to the member variables is concerned this could be mitigated by defining accessor methods (i.e., methods used to examine or modify the slots (member variables) of a class) and ``advising'' the users to use them instead of directly accessing the slots. The usual way of defining accessor functions in \proglang{R} is to use the same name as the name of the corresponding slot. For example for the slot \code{a} these are: \begin{Scode} R> cc <- a(obj) R> a(obj) <- cc \end{Scode} In many cases this is not possible, because of conflicts with other existing functions. For example it is not possible to define an accessor function \code{cov()} for the slot \code{cov} of class \code{Cov}, since the function \code{cov()} already exists in the \code{base} \proglang{R}. Also it is not immediately seen if a slot is ``read only'' or can be modified by the user (unfortunately, as already mentioned, every slot in \proglang{R} can be modified by simply using \code{obj@a <- cc}). In \pkg{rrcov} a notation was adopted, which is usual in \proglang{Java}: the accessors are defined as \code{getXxx()} and \code{setXxx()} (if a \code{setXxx()} method is missing, we are ``not allowed'' to change the slot). The use of accessor methods allows to perform computations on demand (\code{getMah(mcd)} computes the Mahalanobis distances, stores them into the object and returns them) or even have ``virtual'' slots which are not at all stored in the object (e.g., \code{getCorr(mcd)} computes each time and returns the correlation matrix without storing it). \subsection{Naming conventions} \label{oof-sec:naming} %% %From Sun: "Class names should be nouns, in mixed case with the first letter of each %internal word capitalized. Methods should be verbs, in mixed case with the first %letter lowercase, with the first letter of each internal word capitalized." %% %No coding rules in R: the R Internals manual that is shipped with R %also has a section on coding standards: %http://cran.r-project.org/doc/manuals/R-ints.html#R-coding-standards %though this is quite short and does not go much beyond the basic indentation %% There is no agreed naming convention (coding rules) in \proglang{R} but to facilitate the framework usage several simple rules are in order, following the recommended Sun's \proglang{Java} coding style (see \url{http://java.sun.com/docs/codeconv/}): \bi \item{Class, function, method and variable names are alphanumeric, do not contain ``-'' or ``.'' but rather use interchanging lower and upper case.} \item{Class names start with an uppercase letter.} \item{Methods, functions, and variables start with a lowercase letter.} \item{Exceptions are functions returning an object of a given class (i.e., generating functions or constructors)---they have the same name as the class.} \item{Variables and methods which are not intended to be seen by the user---i.e., private members---start with ``.''.} \item{Violate these rules whenever necessary to maintain compatibility.} \ei \section{Example session} \label{oof-sec:ex-intro} In this section we will introduce the base functionalities of the framework by an example session. First of all we have to load the package \pkg{rrcov} which will cause all necessary packages to be loaded too. The framework includes many example data sets but here we will load only those which will be used throughout the following examples. For the rest of the paper it will be assumed that the package has been loaded already. <>= ## set the prompt to "R> " and the continuation to "+ " options(prompt="R> ", continue="+ ") @ <>= ## ## Load the 'rrcov' package and the first two data sets to be ## used throughout the examples ## library("rrcov") data("delivery") delivery.x <- delivery[,1:2] # take only the X part data("hbk") hbk.x <- hbk[,1:3] # take only the X part @ Most of the multivariate statistical methods are based on estimates of multivariate location and covariance, therefore these estimates play a central role in the framework. We will start with computing the robust \textit{minimum covariance determinant} estimate for the data set \code{delivery} from the package \pkg{robustbase}. The data set \citep[see][Table~23, p.~155]{rousseeuw-leroy} contains delivery time data in 25 observations with 3 variables. The aim is to explain the time required to service a vending machine \code{(Y)} by means of the number of products stocked \code{(X1)} and the distance walked by the route driver \code{(X2)}. For this example we will consider only the $\v{X}$ part of the data set. After computing its robust location and covariance matrix using the MCD method implemented in the function \code{CovMcd()} we can print the results by calling the default \code{show()} method on the returned object \code{mcd} as well as summary information by the \code{summary()} method. The standard output contains the robust estimates of location and covariance. The summary output contains additionally the eigenvalues of the covariance matrix and the robust distances of the data items (Mahalanobis type distances computed with the robust location and covariance instead of the sample ones). <>= ## ## Compute MCD estimates for the delivery data set ## - show() and summary() examples ## mcd <- CovMcd(delivery.x) mcd summary(mcd) @ <>= ## ## Example plot of the robust against classical ## distances for the delivery data set ## plot(mcd, which="dd") @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=0.8\textwidth} \includegraphics{ooframework-intro-plot} \caption{Example plot of the robust against classical distances for the \code{delivery} data set.} \label{oof-fig:intro} \end{figure} \end{center} Now we will show one of the available plots by calling the \code{plot()} method---in Figure~\ref{oof-fig:intro} the Distance-Distance plot introduced by \citet{Rousseeuw-van-Zomeren} is presented, which plots the robust distances versus the classical Mahalanobis distances and allows to classify the observations and identify the potential outliers. The description of this plot as well as examples of more graphical displays based on the covariance structure will be shown in Section~\ref{oof-sec:cov}. Apart from the demonstrated MCD method the framework provides many other robust estimators of multivariate location and covariance, actually almost all of the well established estimates in the contemporary robustness literature. The most fascinating feature of the framework is that one will get the output and the graphs in the same format, whatever estimation method was used. For example the following code lines will compute the S~estimates for the same data set and provide the standard and extended output (not shown here). <>= ## ## Compute the S-estimates for the delivery data set ## and provide the standard and extended output ## est <- CovSest(delivery.x, method="bisquare") est summary(est) @ Nevertheless, this variety of methods could pose a serious hurdle for the novice and could be quite tedious even for the experienced user. Therefore a shortcut is provided too---the function \code{CovRobust()} can be called with a parameter set specifying any of the available estimation methods, but if this parameter set is omitted the function will decide on the basis of the data size which method to use. As we see in the example below, in this case it selects the Stahel-Donoho estimates. For details and further examples see Section~\ref{oof-sec:cov}. <>= ## ## Automatically select the appropriate estimator according ## to the problem size - in this example the Stahel-Donoho estimates ## will be selected. ## est <- CovRobust(delivery.x) est @ \section{Robust multivariate methods} \label{oof-sec:multi} \subsection{Multivariate location and scatter} \label{oof-sec:cov} The framework provides an almost complete set of estimators for multivariate location and scatter with high breakdown point. The first such estimator was proposed by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} and it is recommended for small data sets, but the most widely used high breakdown estimator is the minimum covariance determinant estimate \citep{rousseeuw:85}. Several algorithms for computing the S~estimators \citep{davies:87} are provided \citep{ruppert:1992, rocke:94, rocke:96a, salibian:2005}. The minimum volume ellipsoid (MVE) estimator \citep{rousseeuw:85} is also included since it has some desirable properties when used as initial estimator for computing the S~estimates \citep[see][p. 198]{maronna:2006}. In the rest of this section the definitions of the different estimators of location and scatter will be briefly reviewed and the algorithms for their computation will be discussed. Further details can be found in the relevant references. The object model is presented and examples of its usage, as well as further examples of the graphical displays are given. \subsubsection{The Minimum covariance determinant estimator and its computation} \label{oof-sec:cov-mcd} The MCD estimator for a data set $\{\xv_1, \ldots, \xv_n\}$ in $\Re^p$ is defined by that subset $\{\xv_{i_1}, \ldots, \xv_{i_h}\}$ of $h$ observations whose covariance matrix has the smallest determinant among all possible subsets of size $h$. The MCD location and scatter estimate $\v{T}_{\MCD}$ and $\v{C}_{\MCD}$ are then given as the arithmetic mean and a multiple of the sample covariance matrix of that subset \begin{eqnarray} \label{oof-eq:mcd} \v{T}_{\MCD} &=& \frac{1}{h}\sum^{h}_{j=1} \xv_{i_j} \nonumber\\ \v{C}_{MCD} &=& c_{ccf}c_{sscf}\frac{1}{h-1}\sum^{h}_{j=1} (\xv_{i_j}-\v{T}_{\MCD})(\xv_{i_j}-\v{T}_{\MCD})^{\top}. \end{eqnarray} The multiplication factors $c_{ccf}$ (consistency correction factor) and $c_{sscf}$ (small sample correction factor) are selected so that $\v{C}$ is consistent at the multivariate normal model and unbiased at small samples \citep[see][]{butler:1993, croux-haesbroeck:99, pison:2002, todorov-cf}. A recommendable choice for $h$ is $\lfloor(n+p+1)/2\rfloor$ because then the BP of the MCD is maximized, but any integer $h$ within the interval $[(n + p + 1)/2,n]$ can be chosen, see \citet{rousseeuw-leroy}. Here $\lfloor z\rfloor$ denotes the integer part of $z$ which is not less than $z$. If $h = n$ then the MCD location and scatter estimate $\v{T}_{\MCD}$ and $\v{C}_{\MCD}$ reduce to the sample mean and covariance matrix of the full data set. The computation of the MCD estimator is far from being trivial. The naive algorithm would proceed by exhaustively investigating all subsets of size $h$ out of $n$ to find the subset with the smallest determinant of its covariance matrix, but this will be feasible only for very small data sets. Initially MCD was neglected in favor of MVE because the simple resampling algorithm was more efficient for MVE. Meanwhile several heuristic search algorithms \citep[see][]{todorov:92, rocke:94, hawkins:94} and exact algorithms \citep[][]{agullo:96} were proposed but now a very fast algorithm due to \citet{rousseeuw-vandriessen} exists and this algorithm is usually used in practice. The algorithm is based on the C-step which moves from one approximation $(\v{T}_1, \v{C}_1)$ of the MCD estimate of a data set $\v{X}=\{\xv_1, \ldots, \xv_n\}$ to the next one $(\v{T}_2, \v{C}_2)$ with possibly lower determinant $\det(\v{C}_2) \le \det(\v{C}_1)$ by computing the distances $d_1, \ldots, d_n$ relative to $(\v{T}_1, \v{C}_1)$, i.e., \begin{equation} \label{oof-eq:mah} d_i=\sqrt{(\xv_i-\v{T}_1)^{\top}\v{C}_1^{-1}(\xv_i-\v{T}_1)} \end{equation} and then computing $(\v{T}_2, \v{C}_2)$ for those $h$ observations which have smallest distances. ``C'' in C-step stands for ``concentration'' since we are looking for a more ``concentrated'' covariance matrix with lower determinant. \citet{rousseeuw-vandriessen} have proven a theorem stating that the iteration process given by the C-step converges in a finite number of steps to a (local) minimum. Since there is no guarantee that the global minimum of the MCD objective function will be reached, the iteration must be started many times from different initial subsets, to obtain an approximate solution. The procedure is very fast for small data sets but to make it really ``fast'' also for large data sets several computational improvements are used. \bi \item{\textit{initial subsets}: It is possible to restart the iterations from randomly generated subsets of size $h$, but in order to increase the probability of drawing subsets without outliers, $p+1$ points are selected randomly. These $p+1$ points are used to compute ($\v{T}_0,\v{C}_0)$. Then the distances $d_1,\ldots, d_n$ are computed and sorted in increasing order. Finally the first $h$ are selected to form the initial $h-$subset $H_0$.} \item{\textit{reduced number of C-steps}: The C-step involving the computation of the covariance matrix, its determinant and the relative distances, is the most computationally intensive part of the algorithm. Therefore instead of iterating to convergence for each initial subset only two C-steps are performed and the 10 subsets with lowest determinant are kept. Only these subsets are iterated to convergence. } \item{\textit{partitioning}: For large $n$ the computation time of the algorithm increases mainly because all $n$ distances given by Equation~(\ref{oof-eq:mah}) have to be computed at each iteration. An improvement is to partition the data set into a maximum of say five subsets of approximately equal size (but not larger than say 300) and iterate in each subset separately. The ten best solutions for each data set are kept and finally only those are iterated on the complete data set. } \item{\textit{nesting}: Further decrease of the computational time can be achieved for data sets with $n$ larger than say 1500 by drawing 1500 observations without replacement and performing the computations (including the partitioning) on this subset. Only the final iterations are carried out on the complete data set. The number of these iterations depends on the actual size of the data set at hand.} \ei The MCD estimator is not very efficient at normal models, especially if $h$ is selected so that maximal BP is achieved. To overcome the low efficiency of the MCD estimator, a reweighed version can be used. For this purpose a weight $w_i$ is assigned to each observation $\xv_i$, defined as $w_i=1$ if $(\xv_i-\v{T}_{\MCD})^{\top}\v{C}_{\MCD}^{-1}(\xv_i-\v{T}_{\MCD}) \le \chi^2_{p,0.975}$ and $w_i=0$ otherwise, relative to the raw MCD estimates $(\v{T}_{\MCD}, \v{C}_{\MCD})$. Then the reweighted estimates are computed as \begin{eqnarray} \label{oof-eq:mcd-rew} \v{T}_R &=& \frac{1}{\nu}\sum^{n}_{i=1}{w_i\xv_i},\nonumber\\ \v{C}_R &=& c_{r.ccf}c_{r.sscf}\frac{1}{\nu-1}\sum^n_{i=1}{w_i(\xv_i-\v{T}_R)(\xv_i-\v{T}_R)^{\top}}, \end{eqnarray} where $\nu$ is the sum of the weights, $\nu =\sum^n_{i=1}{w_i}$. Again, the multiplication factors $c_{r.ccf}$ and $c_{r.sscf}$ are selected so that $\v{C}_R$ is consistent at the multivariate normal model and unbiased at small samples \citep[see][and the references therein]{pison:2002, todorov-cf}. These reweighted estimates $(\v{T}_R,\v{C}_R)$ which have the same breakdown point as the initial (raw) estimates but better statistical efficiency are computed and used by default. \subsubsection{The Minimum volume ellipsoid estimates} \label{oof-sec:cov-mve} The minimum volume ellipsoid estimator searches for the ellipsoid of minimal volume containing at least half of the points in the data set $\v{X}$. Then the location estimate is defined as the center of this ellipsoid and the covariance estimate is provided by its shape. Formally the estimate is defined as these $\v{T}_{\MVE},\v{C}_{\MVE}$ that minimize $\det(\v{C})$ subject to \begin{equation} \label{oof-eq:mve} \#\{i:(\xv_i - \v{T})^{\top}\v{C}^{-1}(\xv_i - \v{T}) \le c^2\} \ge \left \lfloor \frac{n+p+1}{2} \right \rfloor, \end{equation} where \# denotes the cardinality. The constant $c$ is chosen as $\chi^2_{p,0.5}$. The search for the approximate solution is made over ellipsoids determined by the covariance matrix of $p+1$ of the data points and by applying a simple but effective improvement of the sub-sampling procedure as described in \citet{maronna:2006}, p. 198. Although there exists no formal proof of this improvement (as for MCD and LTS), simulations show that it can be recommended as an approximation of the MVE. The MVE was the first popular high breakdown point estimator of location and scatter but later it was replaced by the MCD, mainly because of the availability of an efficient algorithm for its computation \citep{rousseeuw-vandriessen}. Recently the MVE gained importance as initial estimator for S~estimation because of its small maximum bias \citep[see][Table~6.2, p.~196]{maronna:2006}. \subsubsection{The Stahel-Donoho estimator} \label{oof-sec:cov-sde} The first multivariate equivariant estimator of location and scatter with high breakdown point was proposed by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} but became better known after the analysis of \citet{maronna:95}. For a data set $\v{X}=\{\xv_1,\ldots,\xv_n\}$ in $\Re^p$ it is defined as a weighted mean and covariance matrix of the form given by Equation~(\ref{oof-eq:mcd-rew}) where the weight $w_i$ of each observation is inverse proportional to the ``outlyingness'' of the observation. Let the univariate outlyingness of a point $\xv_i$ with respect to the data set $\v{X}$ along a vector $\v{a} \in \Re^p, ||\v{a}|| \ne \v{0}$ be given by \begin{equation} \label{oof-eq:sde1} r(\xv_i,\v{a}) = \frac{|\xv^{\top}\v{a}-m(\v{a}^{\top}\v{X})|}{s(\v{a}^{\top}\v{X})}~~~i=1,\ldots,n \end{equation} where $(\v{a}^{\top}\v{X})$ is the projection of the data set $\v{X}$ on $\v{a}$ and the functions $m()$ and $s()$ are robust univariate location and scale statistics, for example the median and MAD, respectively. Then the multivariate outlyingness of $\xv_i$ is defined by \begin{equation} \label{oof-eq:sde2} r_i=r(\xv_i) = \max_{\v{a}} r(\xv_i,\v{a}). \end{equation} The weights are computed by $w_i=w(r_i)$ where $w(r)$ is a nonincreasing function of $r$ and $w(r)$ and $w(r)r^2$ are bounded. \citet{maronna:95} use the weights \begin{equation} \label{oof-eq:sde-weight} w(r)=\min \left ( 1,\left (\frac{c}{t} \right )^2 \right ) \end{equation} with $c=\sqrt{\chi^2_{p,\beta}}$ and $\beta=0.95$, that are known in the literature as ``Huber weights''. Exact computation of the estimator is not possible and an approximate solution is found by subsampling a large number of directions $\v{a}$ and computing the outlyingness measures $r_i, i=1,\ldots,n$ for them. For each subsample of $p$ points the vector $\v{a}$ is taken as the norm 1 vector orthogonal to the hyperplane spanned by these points. It has been shown by simulations \citep{maronna:2006} that one step reweighting does not improve the estimator. \subsubsection{Orthogonalized Gnanadesikan/Kettenring} \label{oof-sec:cov-ogk} The MCD estimator and all other known affine equivariant high-breakdown point estimates are solutions to a highly non-convex optimization problem and as such pose a serious computational challenge. Much faster estimates with high breakdown point can be computed if one gives up the requirements of affine equivariance of the covariance matrix. Such an algorithm was proposed by \citet{maronna:2002} which is based on the very simple robust bivariate covariance estimator $s_{jk}$ proposed by \citet{Gnanadesikan-Kettenring:1972} and studied by \citet{devlin:81}. For a pair of random variables $Y_j$ and $Y_k$ and a standard deviation function $\sigma()$, $s_{jk}$ is defined as \begin{equation} \label{oof-eq:GK} s_{jk}=\frac{1}{4}\left(\sigma \left(\frac{Y_j}{\sigma(Y_j)}+\frac{Y_k}{\sigma(Y_k)}\right)^2 - \sigma \left(\frac{Y_j}{\sigma(Y_j)}-\frac{Y_k}{\sigma(Y_k)}\right)^2\right). \end{equation} If a robust function is chosen for $\sigma()$ then $s_{jk}$ is also robust and an estimate of the covariance matrix can be obtained by computing each of its elements $s_{jk}$ for each $j=1,\ldots,p$ and $k=1,\ldots,p$ using Equation~(\ref{oof-eq:GK}). This estimator does not necessarily produce a positive definite matrix (although symmetric) and it is not affine equivariant. \citet{maronna:2002} overcome the lack of positive definiteness by the following steps: \bi \item{Define $\yv_i=\vv{D}^{-1}\xv_i, i=1,\ldots,n$ with $\v{D}=\diag(\sigma(X_1),\ldots,\sigma(X_p))$ where $X_l, l=1,\ldots,p$ are the columns of the data matrix $\vv{X}=\{\xv_1, \ldots, \xv_n\}$. Thus a normalized data matrix $\vv{Y}=\{\yv_1, \ldots, \yv_n\}$ is computed.} \item{Compute the matrix $\vv{U}=(u_{jk})$ as $u_{jk}= s_{jk}=s(Y_j, Y_k)$ if $j \ne k$ or $u_{jk}= 1$ otherwise. Here $Y_l, l=1,\ldots,p$ are the columns of the transformed data matrix $\vv{Y}$ and $s(.,.)$ is a robust estimate of the covariance of two random variables like the one in Equation~(\ref{oof-eq:GK}).} \item{Obtain the ``principal component decomposition'' of $\vv{Y}$ by decomposing $\vv{U}=\vv{E}\vv{\Lambda}\vv{E}^{\top}$ where $\vv{\Lambda}$ is a diagonal matrix $\vv{\Lambda}=\diag(\lambda_1,\ldots,\lambda_p)$ with the eigenvalues $\lambda_j$ of $\vv{U}$ and $\vv{E}$ is a matrix with columns the eigenvalues $\vv{e}_j$ of $\vv{U}$.} \item{Define $\zv_i=\vv{E}^{\top}\yv_i=\vv{E}^{\top}\vv{D}^{-1}\xv_i$ and $\vv{A}=\vv{D}\vv{E}$. Then the estimator of $\vv{\Sigma}$ is $\vv{C}_{\OGK}=\vv{A}\vv{\Gamma}\vv{A}^{\top}$ where $\vv{\Gamma}=\diag(\sigma(Z_j)^2), j=1,\ldots,p$} and the location estimator is $\vv{T}_{\OGK}=\vv{A}\mv$ where $\mv=m(\zv_i) = (m(Z_1),\ldots,m(Z_p))$ is a robust mean function. \ei This can be iterated by computing $\vv{C}_{\OGK}$ and $\vv{T}_{\OGK}$ for $\vv{Z}=\{\zv_1, \ldots, \zv_n\}$ obtained in the last step of the procedure and then transforming back to the original coordinate system. Simulations \citep{maronna:2002} show that iterations beyond the second did not lead to improvement. Similarly as for the MCD estimator a one-step reweighting can be performed using Equations~(\ref{oof-eq:mcd-rew}) but the weights $w_i$ are based on the 0.9 quantile of the $\chi^2_p$ distribution (instead of 0.975) and the correction factors $c_r.ccf$ and $c_r.sscf$ are not used. In order to complete the algorithm we need a robust and efficient location function $m()$ and scale function $\sigma()$, and one proposal is given in \citet{maronna:2002}. Further, the robust estimate of covariance between two random vectors $s()$ given by Equation~(\ref{oof-eq:GK}) can be replaced by another one. In the framework two such functions are predefined but the user can provide as a parameter an own function. \subsubsection{S estimates} \label{oof-sec:cov-s} S~estimators of $\muv$ and $\v{\Sigma}$ were introduced by \citet{davies:87} and further studied by \citet{lopuhaa:1989} \citep[see also][p. 263]{rousseeuw-leroy}. For a data set of $p$-variate observations $\{\xv_1, \ldots, \xv_n\}$ an S~estimate $(\v{T},\v{C})$ is defined as the solution of $\sigma(d_1,\ldots,d_n)= \min$ where $d_i=(\xv-\v{T})^{\top}\v{C}^{-1}(\xv-\v{T})$ and $\det(\v{C})=1$. Here $\sigma=\sigma(\zv)$ is the M-scale estimate of a data set $\zv=\{z_1,\ldots,z_n\}$ defined as the solution of $\frac{1}{n}\Sigma\rho(z/\sigma)=\delta$ where $\rho$ is nondecreasing, $\rho(0)=0$ and $\rho(\infty)=1$ and $\delta \in(0,1)$. An equivalent definition is to find the vector $\v{T}$ and a positive definite symmetric matrix $\v{C}$ that minimize $\det(\v{C})$ subject to \begin{equation} \label{oof-eq:s-def} \frac{1}{n}\sum_{i=1}^{n}\rho(d_i)=b_0 \end{equation} with the above $d_i$ and $\rho$. As shown by \citet{lopuhaa:1989} S~estimators have a close connection to the M~estimators and the solution $(\v{T},\v{C})$ is also a solution to an equation defining an M~estimator as well as a weighted sample mean and covariance matrix: \begin{eqnarray} \label{oof-eq:s-iter} d_i^{j}&=&[(\xv_i-\v{T}^{(j-1)})^{\top}\v{(C}^{(j-1)})^{-1}(\xv-\v{T}^{(j-1)})]^{1/2} \nonumber\\ \v{T}^{(j)} &=& \frac{\Sigma w(d_i^{(j)})\xv_i}{\Sigma w(d_i^{(j)})} \nonumber\\ \v{C}^{(j)} &=& \frac{\Sigma w(d_i^{(j)})(\xv_i-\v{T}^{(j)})(\xv_i-\v{T}^{(j)})^{\top}}{\Sigma w(d_i^{(j)})} \end{eqnarray} The framework implements the S~estimates in the class \code{CovSest} and provides four different algorithms for their computation. \be \item{\emph{SURREAL}: This algorithm was proposed by \citet{ruppert:1992} as an analog to the algorithm proposed by the same author for computing S~estimators of regression.} \item{\emph{Bisquare S~estimation with HBDP start}: S~estimates with the biweight $\rho$ function can be obtained using the Equations~(\ref{oof-eq:s-iter}) by a reweighted sample covariance and reweighted sample mean algorithm as described in \citet{maronna:2006}. The preferred approach is to start the iteration from a bias-robust but possibly inefficient estimate which is computed by some form of sub-sampling. Since \citet{maronna:2006} have shown that the MVE has smallest maximum bias (Table~6.2, p.~196) it is recommended to use it as initial estimate.} \item{\emph{Rocke type S~estimates}: In \citet{rocke:96a} it is shown that S~estimators in high dimensions can be sensitive to outliers even if the breakdown point is set to 50\%. Therefore they propose a modified $\rho$ function called translated biweight (or t-biweight) and replace the standardization step given in Equation~(\ref{oof-eq:s-def}) with a standardization step consisting of equating the median of $\rho(d_i)$ with the median under normality. The estimator is shown to be more outlier resistant in high dimensions than the typical S~estimators. The specifics of the iteration are given in \citet{rocke:96}, see also \citet{maronna:2006}. As starting values for the iteration any of the available methods in the framework can be used. The recommended (and consequently the default) one is the MVE estimator computed by \code{CovMve()}.} \item{\emph{Fast~S~estimates}: \citet{salibian:2005} proposed a fast algorithm for regression S~estimates similar to the FAST-LTS algorithm of \citet{rousseeuw-vandriessen:LTS} and borrowing ideas from the SURREAL algorithm of \citet{ruppert:1992}. Similarly, the FAST-S algorithm for multivariate location and scatter is based on modifying each candidate to improve the S-optimality criterion thus reducing the number of the necessary sub-samples required to achieve desired high breakdown point with high probability.} \ee \subsubsection{Object model for robust location and scatter estimation} \label{oof-sec:cov-objmodel} The object model for the \proglang{S}4 classes and methods implementing the different multivariate location and scatter estimators follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-cov}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{CovModel} \caption{Object model for robust location and scatter estimation.} \label{fig:uml-cov} \end{center} \end{figure} The abstract class \code{Cov} serves as a base class for deriving all classes representing classical and robust location and scatter estimation methods. It defines the common slots and the corresponding accessor methods, provides implementation for the general methods like \code{show()}, \code{plot()} and \code{summary()}. The slots of \code{Cov} hold some input or default parameters as well as the results of the computations: the location, the covariance matrix and the distances. The \code{show()} method presents brief results of the computations and the \code{summary()} method returns an object of class \code{SummaryCov} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new data (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. The classical location and scatter estimates are represented by the class \code{CovClassic} which inherits directly from \code{Cov} (and uses all slots and methods defined there). The function \code{CovClassic()} serves as a constructor (generating function) of the class. It can be called by providing a data frame or matrix. As already demonstrated in Section~\ref{oof-sec:ex-intro} the methods \code{show()} and \code{summary()} present the results of the computations. The \code{plot()} method draws different diagnostic plots which are shown in one of the next sections. The accessor functions like \code{getCenter()}, \code{getCov()}, etc. are used to access the corresponding slots. Another abstract class, \code{CovRobust} is derived from \code{Cov}, which serves as a base class for all robust location and scatter estimators. The classes representing robust estimators like \code{CovMcd}, \code{CovMve}, etc. are derived from \code{CovRobust} and provide implementation for the corresponding methods. Each of the constructor functions \code{CovMcd()}, \code{CovMve()},\code{CovOgk()}, \code{CovMest()} and \code{CovSest()} performs the necessary computations and returns an object of the class containing the results. Similarly as the \code{CovClassic()} function, these functions can be called either with a data frame or a numeric matrix. \subsubsection{Controlling the estimation options} \label{oof-sec:cov-control} Although the different robust estimators of multivariate location and scatter have some controlling options in common, like the tracing flag \code{trace} or the numeric tolerance \code{tolSolve} to be used for inversion (\code{solve}) of the covariance matrix in \code{mahalanobis()}, each of them has more specific options. For example, the MCD and MVE estimators (\code{CovMcd()} and \code{CovMve()}) can specify \code{alpha} which controls the size of the subsets over which the determinant (the volume of the ellipsoid) is minimized. The allowed values are between 0.5 and 1 and the default is 0.5. Similarly, these estimators have parameters \code{nsamp} for the number of subsets used for initial estimates and \code{seed} for the initial seed for \proglang{R}'s random number generator while the M and S~estimators (\code{CovMest} and \code{CovSest}) have to specify the required breakdown point (allowed values between $(n - p)/(2*n)$ and 1 with default 0.5) as well as the asymptotic rejection point, i.e., the fraction of points receiving zero weight \citep{rocke:96}. These parameters can be passed directly to the corresponding constructor function but additionally there exists the possibility to use a control object serving as a container for the parameters. The object model for the control objects shown in Figure~\ref{oof-fig:cov-control} follows the proposed class hierarchy---there is a base class \code{CovControl} which holds the common parameters and from this class all control classes holding the specific parameters of their estimators are derived. These classes have only a constructor function for creating new objects and a method \code{restimate()} which takes a data frame or a matrix, calls the corresponding estimator to perform the calculations and returns the created class with the results. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{CovControl} \caption{Object model of the control classes for robust location and scatter estimation.} \label{oof-fig:cov-control} \end{center} \end{figure} Apart from providing a structured container for the estimation parameters this class hierarchy has the following additional benefits: \bi \item{the parameters can be passed easily to another multivariate method, for example the principal components analysis based on a covariance matrix \code{PcaCov()} (see Section~\ref{oof-sec:pca}) can take a control object which will be used to estimate the desired covariance (or correlation) matrix. In the following example a control object holding the parameters for S~estimation will be created and then \code{PcaCov()} will be called with this object.} <>= set.seed(1234) @ <>= ## ## Controlling the estimation options with a control object ## control <- CovControlSest(method="biweight") PcaCov(hbk.x, cov.control=control) @ \item{the class hierarchy of the control objects allows to handle different estimator objects using a uniform interface thus leveraging one of the most important features of the object oriented programming, the polymorphism. In the following example we create a list containing different control objects and then via \code{sapply} we call the generic function \code{restimate()} on each of the objects in the list. The outcome will be a list containing the objects resulting from these calls (all are derived from \code{CovRobust}). This looping over the different estimation methods is very useful for implementing simulation studies.} <>= ## ## Controlling the estimation options: example ## of looping through several estimators ## cc <- list(CovControlMcd(), CovControlMest(), CovControlOgk(), CovControlSest(), CovControlSest(method="rocke")) clist <- sapply(cc, restimate, x=delivery.x) sapply(clist, data.class) sapply(clist, getMeth) @ \ei \subsubsection[A generalized function for robust location and covariance estimation: CovRobust()]{A generalized function for robust location and covariance estimation: \code{CovRobust()}} \label{oof-sec:cov-covrobust} The provided variety of estimation methods, each of them with different parameters as well as the object models described in the previous sections can be overwhelming for the user, especially for the novice who does not care much about the technical implementation of the framework. Therefore a function is provided which gives a quick access to the robust estimates of location and covariance matrix. This function is loosely modeled around the \textit{abstract factory design pattern} \citep[see][page 87]{gamma} in the sense that it creates concrete objects of derived classes and returns the result over a base class interface. The class \code{CovRobust} is abstract (defined as \textit{VIRTUAL}) and no objects of it can be created but any of the classes derived from \code{CovRobust}, such as \code{CovMcd} or \code{CovOgk}, can act as an object of class \code{CovRobust}. The function \code{CovRobust()} which is technically not a constructor function can return an object of any of the classes derived from \code{CovRobust} according to the user request. This request can be specified in one of three forms: \bi \item{If only a data frame or matrix is provided and the control parameter is omitted, the function decides which estimate to apply according to the size of the problem at hand. If there are less than 1000 observations and less than 10 variables or less than 5000 observations and less than 5 variables, Stahel-Donoho estimator will be used. Otherwise, if there are less than 50000 observations, either bisquare S~estimates (in case of less than 10 variables) or Rocke type S~estimates (for 10 to 20 variables) will be used. In both cases the S iteration starts at the initial MVE estimate. And finally, if there are more than 50000 observations and/or more than 20 variables the Orthogonalized Quadrant Correlation estimator (\code{CovOgk} with the corresponding parameters) is used. This is illustrated by the following example.} <>= ## ## Automatically select the appropriate estimator according ## to the problem size. ## getMeth(CovRobust(matrix(rnorm(40), ncol=2))) # 20x2 - SDE getMeth(CovRobust(matrix(rnorm(16000), ncol=8))) # 2000x8 - bisquare S getMeth(CovRobust(matrix(rnorm(20000), ncol=10))) # 2000x10 - Rocke S getMeth(CovRobust(matrix(rnorm(200000), ncol=2))) # 100000x2 - OGK @ \item{The simplest way to choose an estimator is to provide a character string with the name of the estimator---one of \code{"mcd"}, \code{"ogk"}, \code{"m"}, \code{"s-fast"}, \code{"s-rocke"}, etc.} <>= ## ## Rocke-type S-estimates ## getMeth(CovRobust(matrix(rnorm(40), ncol=2), control="rocke")) @ \item{If it is necessary to specify also some estimation parameters, the user can create a control object (derived from \code{CovControl}) and pass it to the function together with the data. For example to compute the OGK estimator using the median absolute deviation (MAD) as a scale estimate and the quadrant correlation (QC) as a pairwise correlation estimate we create a control object \code{ctrl} passing the parameters \code{s_mad} and \code{s_qc} to the constructor function and then call \code{CovRobust} with this object. The last command line illustrates the accessor method for getting the correlation matrix of the estimate as well as a nice formatting method for covariance matrices.} <>= ## ## Specify some estimation parameters through a control object. ## The last command line illustrates the accessor method ## for getting the correlation matrix of the estimate ## as well as a nice formatting method for covariance ## matrices. ## data("toxicity") ctrl <- CovControlOgk(smrob = "s_mad", svrob = "qc") est <- CovRobust(toxicity, ctrl) round(getCenter(est),2) as.dist(round(getCorr(est), 2)) @ \ei \subsubsection{Visualization of the results} \label{oof-sec:cov-vis} The default plot accessed through the method \code{plot()} of class \code{CovRobust} is the Distance-Distance plot introduced by \citet{Rousseeuw-van-Zomeren}. An example of this graph, which plots the robust distances versus the classical Mahalanobis distances is shown in Figure~\ref{oof-fig:intro}. The dashed line represents the points for which the robust and classical distances are equal. The horizontal and vertical lines are drawn at values $x=y=\sqrt{\chi_{p,0.975}^2}$. Points beyond these lines can be considered as outliers and are identified by their labels. The other available plots are accessible either interactively or through the \code{which} parameter of the \code{plot()} method. The left panel of Figure~\ref{oof-fig:cov-lattice} shows an example of the distance plot in which robust and classical Mahalanobis distances are shown in parallel panels. The outliers have large robust distances and are identified by their labels. The right panel of Figure~\ref{oof-fig:cov-lattice} shows a Quantile-Quantile comparison plot of the robust and the classical Mahalanobis distances versus the square root of the quantiles of the chi-squared distribution. <>= ## ## Distance plot and Chi-square Q-Q plot of the robust and classical distances ## Lattice plots (currently not available in rrcov) ## library("lattice") library("grid") library("rrcov") data("delivery") X <- delivery[,1:2] myPanel.dd <- function(x, y, subscripts, cutoff, ...) { panel.xyplot(x, y, ...) panel.abline(h=cutoff,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] xrange<-range(y) adj <- (xrange[2]-xrange[1])/20 ltext(x[ind] + adj, y[ind] + adj, ind, cex=1.0) } } myPanel.qchi <- function(x, y, subscripts, cutoff, ...) { y <- sort(y, index.return=TRUE) iy <- y$ix y <- y$x panel.xyplot(x, y, ...) panel.abline(0,1,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- (n-id.n+1):n xrange<-range(y) adj <- (xrange[2]-xrange[1])/50 ltext(x[ind] + adj, y[ind] + adj, iy[ind], cex=1.0) } } n<-nrow(X) p <- ncol(X) cutoff <- sqrt(qchisq(0.975, p)) mm <- covMcd(X) dd1 <- sqrt(mm$mah) # robust distances vv<-cov.wt(X) dd2 <- sqrt(mahalanobis(X,vv$center,vv$cov)) # classical distances dd<-c(dd1,dd2) # both robust and classical distances gr <- as.factor(c(rep(1,n), rep(2,n))) levels(gr)[1] <- "Robust" levels(gr)[2] <- "Classical" qq <- sqrt(qchisq(((1:n)-1/3)/(n+1/3), p)) ind.dd <- c(1:n, 1:n) ind.qchi <- c(qq, qq) dplot <- xyplot(dd~ind.dd|gr, cutoff=cutoff, panel = myPanel.dd, xlab="Index", ylab="Mahalanobis distance", main="Distance Plot", col = "darkred", scales=list(cex=1.0)) qplot <- xyplot(dd~ind.qchi|gr, cutoff=cutoff, panel = myPanel.qchi, xlab="Quantiles of the chi-squared distribution", ylab="Mahalanobis distance", main="Chi-Square QQ-Plot", col = "darkred", scales=list(cex=1.0)) plot(dplot, split = c(1, 1, 2, 1), more = TRUE) plot(qplot, split = c(2, 1, 2, 1), more = FALSE) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-cov-plot-lattice} \caption{Distance plot and Chi-square Q-Q plot of the robust and classical distances.} \label{oof-fig:cov-lattice} \end{figure} \end{center} The next plot shown in Figure~\ref{oof-fig:cov-ellipse} presents a scatter plot of the data on which the 97.5\% robust and classical confidence ellipses are superimposed. Currently this plot is available only for bivariate data. The observations with distances larger than $\sqrt{\chi_{p,0.975}^2}$ are identified by their subscript. In the right panel of Figure~\ref{oof-fig:cov-ellipse} a \code{screeplot} of the \code{milk} data set is shown, presenting the robust and classical eigenvalues. <>= ## ## a) scatter plot of the data with robust and classical confidence ellipses. ## b) screeplot presenting the robust and classical eigenvalues ## data("milk") usr<-par(mfrow=c(1,2)) plot(CovMcd(delivery[,1:2]), which="tolEllipsePlot", classic=TRUE) plot(CovMcd(milk), which="screeplot", classic=TRUE) par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-cov-plot-ellipse} \caption{Robust and classical tolerance ellipse for the \code{delivery} data and robust and classical screeplot for the \code{milk} data.} \label{oof-fig:cov-ellipse} \end{figure} \end{center} \subsection{Principal component analysis} \label{oof-sec:pca} Principal component analysis is a widely used technique for dimension reduction achieved by finding a smaller number $q$ of linear combinations of the originally observed $p$ variables and retaining most of the variability of the data. Thus PCA is usually aiming at a graphical representation of the data in a lower dimensional space. The classical approach to PCA measures the variability through the empirical variance and is essentially based on computation of eigenvalues and eigenvectors of the sample covariance or correlation matrix. Therefore the results may be extremely sensitive to the presence of even a few atypical observations in the data. These discrepancies will carry over to any subsequent analysis and to any graphical display related to the principal components such as the biplot. %%% Example - hbk data The following example in Figure~\ref{oof-fig:pca-hbk} illustrates the effect of outliers on the classical PCA. The data set \code{hbk} from the package \pkg{robustbase} consists of 75 observations in 4 dimensions (one response and three explanatory variables) and was constructed by Hawkins, Bradu and Kass in 1984 for illustrating some of the merits of a robust technique \citep[see][]{rousseeuw-leroy}. The first 10 observations are bad leverage points, and the next four points are good leverage points (i.e., their $\xv$ are outlying, but the corresponding $y$ fit the model quite well). We will consider only the X-part of the data. The left panel shows the plot of the scores on the first two classical principal components (the first two components account for more than 98\% of the total variation). The outliers are identified as separate groups, but the regular points are far from the origin (where the mean of the scores should be located). Furthermore, the ten bad leverage points 1--10 lie within the 97.5\% tolerance ellipse and influence the classical estimates of location and scatter. The right panel shows the same plot based on robust estimates. We see that the estimate of the center is not shifted by the outliers and these outliers are clearly separated by the 97.5\% tolerance ellipse. \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} <>= ## ## Principal Component Analysis example: ## Plot of the first two principal components of the ## Hawkins, Bradu and Kass data set: classical and robust ## par(mfrow=c(1,2)) pca <- PcaClassic(hbk.x, k=2) cpca <- list(center=c(0,0), cov=diag(pca@eigenvalues), n.obs=pca@n.obs) rrcov:::.myellipse(pca@scores, xcov=cpca, main="Classical", xlab="PC1", ylab="PC2", ylim=c(-30,30), id.n=0) abline(v=0) abline(h=0) text(-29,6,labels="1-10", cex=0.8) text(-37,-13,labels="14", cex=0.8) text(-31,-5,labels="11-13", cex=0.8) hub <- PcaHubert(hbk.x, k=2, mcd=TRUE) chub <- list(center=c(0,0), cov=diag(hub@eigenvalues), n.obs=hub@n.obs) rrcov:::.myellipse(hub@scores, xcov=chub, main="Robust (MCD)", xlab="PC1", ylab="PC2", xlim=c(-10,45), ylim=c(-25,15), id.n=0) abline(v=0) abline(h=0) text(30,-9,labels="1-10", cex=0.8) text(36,-11,labels="11", cex=0.8) text(42,-4,labels="12", cex=0.8) text(41,-11,labels="13", cex=0.8) text(44,-15,labels="14", cex=0.8) @ \caption{Plot of the first two principal components of the Hawkins, Bradu and Kass data set: classical and robust.} \label{oof-fig:pca-hbk} \end{figure} \end{center} PCA was probably the first multivariate technique subjected to robustification, either by simply computing the eigenvalues and eigenvectors of a robust estimate of the covariance matrix or directly by estimating each principal component in a robust manner. Different approaches to robust PCA are briefly presented in the next subsections with the emphasis on those methods which are available in the framework. Details about the methods and algorithms can be found in the corresponding references. The object model is described and examples are given. \subsubsection{PCA based on robust covariance matrix (MCD, OGK, MVE, etc.)} The most straightforward and intuitive method to obtain robust PCA is to replace the classical estimates of location and covariance by their robust analogues. In the earlier works M~estimators of location and scatter were used for this purpose \citep[see][]{devlin:81, campbell:80} but these estimators have the disadvantage of low breakdown point in high dimensions. To cope with this problem \citet{naga:1990} used the MVE estimator and \citet{todorov-compstat:94} used the MCD estimator. \citet{croux-Haesbroeck:2000} investigated the properties of the MCD estimator and computed its influence function and efficiency. The package \pkg{stats} in base \proglang{R} contains the function \code{princomp()} which performs a principal components analysis on a given numeric data matrix and returns the results as an object of \proglang{S}3 class \code{princomp}. This function has a parameter \code{covmat} which can take a covariance matrix, or a covariance list as returned by \code{cov.wt}, and if supplied, it is used rather than the covariance matrix of the input data. This allows to obtain robust principal components by supplying the covariance matrix computed by \code{cov.mve} or \code{cov.mcd} from the package \pkg{MASS}. One could ask why is it then necessary to include such type of function in the framework (since it already exists in the base package). The essential value added of the framework, apart from implementing many new robust multivariate methods is the unification of the interfaces by leveraging the object orientation provided by the \proglang{S}4 classes and methods. The function \code{PcaCov()} computes robust PCA by replacing the classical covariance matrix with one of the robust covariance estimators available in the framework---MCD, OGK, MVE, M, S or Stahel-Donoho, i.e., the parameter \code{cov.control} can be any object of a class derived from the base class \code{CovControl}. This control class will be used to compute a robust estimate of the covariance matrix. If this parameter is omitted, MCD will be used by default. Of course any newly developed estimator following the concepts of the framework can be used as input to the function \code{PcaCov()}. \subsubsection{Projection pursuit methods} The second approach to robust PCA uses \textit{projection pursuit} (PP) and calculates directly the robust estimates of the eigenvalues and eigenvectors. Directions are seeked for, which maximize the variance (classical PCA) of the data projected onto them. Replacing the variance with a robust measure of spread yields robust PCA. Such a method was first introduced by \citet{li:1985} using an M~estimator of scale $S_n$ as a \textit{projection index (PI)}. They showed that the PCA estimates inherit the robustness properties of the scale estimator $S_n$. Unfortunately, in spite of the good statistical properties of the method, the algorithm they proposed was too complicated to be used in practice. A more tractable algorithm in these lines was first proposed by \citet{croux-Ruiz-Gazen:1996} and later improved by \citet{croux-Ruiz-Gazen:2005}. To improve the performance of the algorithm for high dimensional data a new improved version was proposed by \citet{croux-filzmoser-oliveira-pppca}. The latter two algorithms are available in the package \pkg{pcaPP} \citep[see][]{filzmoser-pcaPP} as functions \code{PCAproj()} and \code{PCAgrid()}. In the framework these methods are represented by the classes \code{PcaProj} and \code{PcaGrid}. Their generating functions provide simple wrappers around the original functions from \pkg{pcaPP} and return objects of the corresponding class, derived from \code{PcaRobust}. A major advantage of the PP-approach is that it searches for the eigenvectors consecutively and in case of high dimensional data when we are interested in only the first one or two principal components this results in reduced computational time. Even more, the PP-estimates cope with the main drawback of the covariance-based estimates---they can be computed for data matrices with more variables than observations. \subsubsection{Hubert method (ROBPCA)} The PCA method proposed by \citet{hubert-ROBPCA:2005} tries to combine the advantages of both approaches---the PCA based on a robust covariance matrix and PCA based on projection pursuit. A brief description of the algorithm follows, for details see the relevant references \citep{hubert:2008}. Let $n$ denote the number of observations, and $p$ the number of original variables in the input data matrix $\v{X}$. The ROBPCA algorithm finds a robust center $\mv$ of the data and a loading matrix $\v{P}$ of dimension $p \times k$. Its columns are orthogonal and define a new coordinate system. The scores $\v{T}$, an $n \times k$ matrix, are the coordinates of the centered observations with respect to the loadings: \begin{equation} \label{oof-eq:pca-scores} \v{T}=(\v{X}-\v{1}\mv^{\top})\v{P} \end{equation} where $\v{1}$ is a column vector with all $n$ components equal to 1. The ROBPCA algorithm yields also a robust covariance matrix (often singular) which can be computed as \begin{equation} \label{oof-eq:pca-S} \v{S}=\v{PLP}^{\top} \end{equation} where $\v{L}$ is the diagonal matrix with the eigenvalues $l_1, \dots, l_k$. This is done in the following three main steps: \paragraph{Step 1:} The data are preprocessed by reducing their data space to the subspace spanned by the $n$ observations. This is done by singular value decomposition of the input data matrix. As a result the data are represented in a space whose dimension is $rank(\v{X})$, being at most $n-1$ without loss of information. \paragraph{Step 2:} In this step a measure of outlyingness is computed for each data point. For this purpose the data points are projected on the $n(n-1)/2$ univariate directions through each two points. If $n$ is too large, \code{maxdir} directions are chosen at random (\code{maxdir} defaults to 250 but can be changed by the user). On every direction the univariate MCD estimator of location and scale is computed and the standardized distance to the center is measured. The largest of these distances (over all considered directions) is the outlyingness measure of the data point. The $h$ data points with smallest outlyingness measure are used to compute the covariance matrix $\v{\Sigma}_h$ and to select the number $k$ of principal components to retain. This is done by finding $k$ such that $l_k/l_1 \ge 10^{-3}$ and $\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j \ge 0.8$. Alternatively the number of principal components $k$ can be specified by the user after inspecting the scree plot. \paragraph{Step 3:} The data points are projected on the $k$-dimensional subspace spanned by the $k$ eigenvectors corresponding to the largest $k$ eigenvalues of the matrix $\v{\Sigma}_h$. The location and scatter of the projected data are computed using the reweighted MCD estimator, and the eigenvectors of this scatter matrix yield the robust principal components. \subsubsection{Spherical principal components (SPC)} The spherical principal components procedure was first proposed by \cite{locantore:1999} as a method for functional data analysis. The idea is to perform classical PCA on the data, projected onto a unit sphere. The estimates of the eigenvectors are consistent if the data are elliptically distributed \cite[see][]{boente-fraiman:1999} and the procedure is extremely fast. Although not much is known about the efficiency of this method, the simulations of \cite{maronna:2005} show that it has very good performance. If each coordinate of the data is normalized using some kind of robust scale, like for example the MAD, and then SPC is applied, we obtain ``elliptical PCA'', but unfortunately this procedure is not consistent. \subsubsection{Object model for robust PCA and examples} \label{oof-sec:pca-objmodel} The object model for the \proglang{S}4 classes and methods implementing the principal component analysis methods follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-pca}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{PcaModel} \caption{Object model for robust Principal Component Analysis.} \label{fig:uml-pca} \end{center} \end{figure} The abstract class \code{Pca} serves as a base class for deriving all classes representing classical and robust principal components analysis methods. It defines the common slots and the corresponding accessor methods, provides implementation for the general methods like \code{show()}, \code{plot()}, \code{summary()} and \code{predict()}. The slots of \code{Pca} hold some input or default parameters like the requested number of components as well as the results of the computations: the eigenvalues, the loadings and the scores. The \code{show()} method presents brief results of the computations, and the \code{predict()} method projects the original or new data to the space spanned by the principal components. It can be used either with new observations or with the scores (if no new data are provided). The \code{summary()} method returns an object of class \code{SummaryPca} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new information (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. Classical principal component analysis is represented by the class \code{PcaClassic} which inherits directly from \code{Pca} (and uses all slots and methods defined there). The function \code{PcaClassic()} serves as a constructor (generating function) of the class. It can be called either by providing a data frame or matrix or a formula with no response variable, referring only to numeric variables. Let us consider the following simple example with the data set \code{hbk} from the package \pkg{robustbase}. The code line \begin{Scode} R> PcaClassic(hbk.x) \end{Scode} can be rewritten as (and is equivalent to) the following code line using the formula interface \begin{Scode} R> PcaClassic(~ ., data = hbk.x) \end{Scode} The function \code{PcaClassic()} performs the standard principal components analysis and returns an object of the class \code{PcaClassic}. <>= ## ## Classical PCA ## pca <- PcaClassic(~., data=hbk.x) pca summary(pca) plot(pca) getLoadings(pca) @ The \code{show()} method displays the standard deviations of the resulting principal components, the loadings and the original call. The \code{summary()} method presents the importance of the calculated components. The \code{plot()} draws a PCA diagnostic plot which is shown and described later. The accessor functions like \code{getLoadings()}, \code{getEigenvalues()}, etc. are used to access the corresponding slots, and \code{predict()} is used to rotate the original or new data to the space of the principle components. Another abstract class, \code{PcaRobust} is derived from \code{Pca}, which serves as a base class for all robust principal components methods. The classes representing robust PCA methods like \code{PcaHubert}, \code{PcaLocantore}, etc. are derived from \code{PcaRobust} and provide implementation for the corresponding methods. Each of the constructor functions \code{PcaCov()}, \code{PcaHubert()}, \code{PcaLocantore()}, \code{PcaGrid()} and \code{PcaProj()} performs the necessary computations and returns an object of the class containing the results. In the following example the same data are analyzed using the projection pursuit method \code{PcaGrid()}. <>= ## ## Robust PCA ## rpca <- PcaGrid(~., data=hbk.x) rpca summary(rpca) @ Similar to the function \code{PcaClassic()}, these functions can be called either with a data frame or matrix or by a formula interface. \subsubsection{Visualization of PCA results} \label{oof-sec:pca-vis} One of the most important applications of PCA, besides dimensionality reduction is data visualization. In the framework several plots for visualizing the results of the analysis are available. The \code{plot()} methods are implemented in the base class \code{Pca} and thus they are available for all objects derived from the class \code{Pca} no matter if classical and robust. The most straightforward plot is the \textit{screeplot} which plots the variances against the number of principal components (similar to the screeplot for the standard \code{prcomp()} and \code{princomp()} functions). It is a useful tool for determining the number of relevant principal components. An example of the classical and robust screeplot for the \code{milk} data from \pkg{robustbase} is shown in Figure~\ref{oof-fig:pca-screeplot}. <>= ## ## Screeplot for classical and robust PCA of the milk data set. ## usr <- par(mfrow=c(1,2)) screeplot(PcaClassic(milk), type="lines", main="Screeplot: classical PCA", sub="milk data") screeplot(PcaHubert(milk), type="lines", main="Screeplot: robust PCA", sub="milk data") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-screeplot} \caption{Screeplot for classical and robust PCA of the \code{milk} data set.} \label{oof-fig:pca-screeplot} \end{figure} \end{center} Another plot borrowed from standard \proglang{R} is the \textit{biplot}. The biplot \citep{gabriel} represents both the observations and variables in the plane of (the first) two principal components allowing the visualization of the magnitude and sign of each variable's contribution to these principal components. Each observation (row of scores) is represented as a point in the biplot and each variable is represented as an arrow. The arrows graphically indicate the proportion of the original variance explained by the (first) two principal components and their direction indicates the relative loadings on these components. Figure~\ref{oof-fig:pca-biplot} shows an example of the robust biplot of the \code{un86} data set which contains seven socioeconomic variables observed for 73 countries. The data set is from World Statistics in Brief, Number 10, a 1986 UN publication. It was used in \citet{Daigle:1992} to illustrate a robust biplot method. <>= ## ## Robust biplot for the UN86 data ## data("un86") set.seed(9) usr<-par(mfrow=c(1,2)) biplot(PcaCov(un86, corr=TRUE, cov.control=NULL), main="Classical biplot", col=c("gray55", "red")) biplot(PcaCov(un86, corr=TRUE), main="Robust biplot", col=c("gray55", "red")) par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-biplot} \caption{Classical (left panel) and robust (right panel) biplot for the \code{UN86} data.} \label{oof-fig:pca-biplot} \end{figure} \end{center} %% diagnostic plot (outlier map) In the context of PCA \citet{hubert-ROBPCA:2005} defined a \textit{diagnostic plot} or \textit{outlier map} which helps to distinguish between the regular observations and the different types of outliers. This plot is based on the \textit{score distances} and \textit{orthogonal distances} computed for each observation. The score distances are given by \begin{equation} \label{oof-eq:pca-SD} SD_i=\sqrt{\sum_{j=1}^k{\frac{t_{ij}^2}{l_j}}},~~~~ i=1,\ldots,n \end{equation} where $t_{ij}$ are the elements of the scores from (\ref{oof-eq:pca-scores}) and $l_j$ are the eignevalues (the diagonal elements of the matrix $\v{L}$ in (\ref{oof-eq:pca-S})). The orthogonal distances $OD_i$ of each observation to the subspace spanned by the first $k$ ($1\le k \le r$, $r$ is the rank of the data) principal components are defined by \begin{equation} \label{oof-eq:pca-OD} OD_i=||\xv_i - \hat{\muv} - \v{P}^{(k)}\tv_i^{(k)}||,~~~~ i=1,\ldots,n \end{equation} where $\xv_i$ denotes the $i$th observation, $\hat{\muv}$ is the estimated center of the data, $\tv_i^{(k)}$ is the $i$th score vector in the space of the first $k$ principal components and the matrix $\v{P}^{(k)}$ contains the first $k$ estimated eigenvectors in its columns. The diagnostic plot is constructed by plotting the score distances on the horizontal axis, the orthogonal distances on the vertical axis and drawing two cutoff lines which will help to classify the observations. The cutoff value on the horizontal axis (for the score distances) is taken as the 97.5\% quantile of $\chi_k^2$ distribution, i.e., $c_h=\sqrt{\chi^2_{k,0.975}}$. For the cutoff value on the vertical axis (for the orthogonal distances) the Wilson-Hilferty transformation for a $\chi^2$ distribution is used (which assumes that the $OD_i$ to the power of 2/3 are approximately normally distributed). The parameters $\mu$ and $\sigma$ of the normal distribution can be estimated by the median and MAD of the values $OD_i^{2/3}$, and the critical value can be taken as $c_v=(\hat{\mu} + \hat{\sigma}z_{0.975})^{3/2}$ where $z_{0.975}$ is the the 97.5\% quantile of the standard normal distribution. An example of the classical and robust diagnostic plot for the \code{hbk} data set from \pkg{robustbase} is shown in Figure~\ref{oof-fig:pca-diagplot}. <>= ## ## An example of the classical and robust diagnostic ## plot for the hbk data set ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=2), sub="data set: hbk, k=2") plot(PcaHubert(hbk.x, k=2), sub="data set: hbk, k=2") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-diagplot} \caption{Classical and robust diagnostic plot for the \code{hbk} data with $k=2$.} \label{oof-fig:pca-diagplot} \end{figure} \end{center} If $k=p$ the orthogonal distances are not meaningful and the diagnostic plot shows a simple distance plot of the score distances (distances vs index). An example is shown in Figure~\ref{oof-fig:pca-distplot}. <>= ## ## If k=p the orthogonal distances are not meaningful and ## simple distance plot of the score distances will be shown ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=3), sub="data set: hbk.x, k=3") plot(PcaHubert(hbk.x, k=3), sub="data set: hbk.x, k=3") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-distplot} \caption{Classical and robust diagnostic plot for the x-part of the \code{hbk} data set with $k=3=p$.} \label{oof-fig:pca-distplot} \end{figure} \end{center} \subsection{Linear and quadratic discriminant analysis} \label{oof-sec:lda} The problem of discriminant analysis arises when one wants to assign an individual to one of $g$ populations at the basis of a $p$-dimensional feature vector $\xv$. Let the $p$-dimensional random variable $\xv_k$ come from a population $\pi_k$ with underlying density $\v{f}_k$. Further let the prior probability of group $k$, i.e., the probability that an individual comes from population $\pi_k$ be $\alpha_k$, $\Sigma_{k=1}^g \alpha_k = 1$. The prior probabilities $\alpha_k$ are usually estimated by the empirical frequencies $n_k$ in the $k$-th group of the training set, i.e., $\hat{\alpha}_k=n_k/\Sigma_{j=1}^gn_j$. Then the Bayesian discriminant rule assigns an observation $\xv$ to that population $\pi_k$ for which the expression $\ln(\alpha_k \v{f}_k(\xv))$ is maximal over all groups $k=1,\ldots,g$. Usually it is assumed that the $k$ populations $\pi_k$ are $p$-dimensional normally distributed, \begin{equation} \label{oof-eq:discrim-distr} \pi_k \sim N({\muv}_k,\v{\Sigma}_k)~~~~~k=1,\ldots,g. \end{equation} With this assumption the discriminant rule is equivalent to maximizing the discriminant scores $D_k(\xv)$ given by \begin{equation} \label{oof-eq:QDA} D_k(\xv) = -\frac{1}{2}\ln|\v{\Sigma}_k| - \frac{1}{2}(\xv-\muv_k)^{\top}\v{\Sigma}_k^{-1}(\xv-\muv_k) + \ln(\alpha_k)~~~~~(k=1,\ldots,g), \end{equation} and individual $\xv$ is assigned to $\pi_k$ if \begin{equation} \label{oof-eq:QDA-rule} D_k(\xv)=\arg\max_j D_j(\xv). \end{equation} The application of the discrimination rule given by Equations~(\ref{oof-eq:QDA}) and (\ref{oof-eq:QDA-rule}) is referred to as quadratic discriminant analysis (QDA), since the groups are separated by quadratic boundaries. If it is further assumed that all group covariance matrices are equal $(\v{\Sigma}_{1}= \ldots= \v{\Sigma}_g=\v{\Sigma})$, then the overall probability of misclassification is minimized by assigning a new observation $\xv$ to population $\pi_k$ which maximizes \begin{equation} \label{oof-eq:LDA} %%%%%%%%d_k(\xv)=\frac{1}{2}(\xv-\muv_k)^{\top}\v{\Sigma}^{-1}(\xv-\muv_k) + \ln(\alpha_k)~~~~~(k=1,\ldots,g). d_k(\xv)=\xv^{\top}\v{\Sigma}^{-1}\muv_k - \frac{1}{2}\muv_k^{\top}\v{\Sigma}^{-1}\muv_k + \ln(\alpha_k)~~~~~(k=1,\ldots,g). \end{equation} The application of the discriminant rule given by Equation~(\ref{oof-eq:LDA}) is referred to as linear discriminant analysis (LDA), since the scores $d_k(\xv)$ are linear in $\xv$. If the means $\muv_k, k=1,\ldots,g$, and the common covariance matrix $\v{\Sigma}$ are unknown, which is usually the case, a training set consisting of samples drawn from each of the populations is required. In classical QDA and LDA the sample group means and sample covariance matrices are used to estimate $\muv_k$, $\v{\Sigma}_k$ and $\v{\Sigma}$. The prior probabilities can be estimated by the relative frequencies of observations in each particular group. Both QDA and LDA using the classical estimates in (\ref{oof-eq:QDA}) and (\ref{oof-eq:LDA}) are vulnerable to the presence of outliers. The problem of the non-robustness of the classical estimates in the setting of the quadratic and linear discriminant analysis has been addressed by many authors: \citet*{todorov:90, todorov:94} replaced the classical estimates by MCD estimates; \citet*{chork} used MVE instead; \citet*{hawkins:97} defined the minimum within-group covariance determinant estimator (MWCD) especially for the case of linear discriminant analysis; \citet*{he:2000} and \citet*{croux-dehon:01} used S~estimates; \citet*{hubert:04} applied the MCD estimates computed by the FAST-MCD algorithm. For a recent review and comparison of these methods see \citet{todorov-roblda}. A robust version of quadratic discriminant analysis can be obtained by substituting the parameters $\muv_k$, $\v{\Sigma}_k$ by their robust estimates. For this purpose the reweighted MCD estimates, S~estimates or OGK can be used. In the case of linear discriminant analysis a robust version of the common covariance matrix $\v{\Sigma}$ is necessary. There are several methods for estimating the common covariance matrix based on a high breakdown point estimator which are considered in one of the next subsections. \subsubsection{Object model for robust LDA and QDA} The object model for the \proglang{S}4 classes and methods implementing the linear and quadratic discriminant analysis methods follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-lda-qda}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{DAModel} \caption{Object models for robust linear discriminant analysis and quadratic discriminant analysis.} \label{fig:uml-lda-qda} \end{center} \end{figure} The abstract classes \code{Lda} and \code{Qda} serve as base classes for deriving all classes representing classical and robust methods for linear and quadratic discriminant analysis methods. They define the common slots and the corresponding accessor methods, provide implementation for the general methods like \code{show()}, \code{plot()}, \code{summary()} and \code{predict()}. This base classes also host several utility functions which are not directly exported but are documented and can be used by quoting the namespace. The slots of \code{Lda} hold some input or default parameters like the prior probabilities, the original data matrix and the grouping variable as well as the results of the computations: the group means and the common covariance matrix, the linear discriminant functions and the corresponding constants. The \code{show()} method presents brief results of the computations, and \code{predict()} can be used either for classifying new observations or for the evaluation of the discriminant rules on the basis of the training sample. The method \code{predict()} returns an object of class \code{PredictLda} which has its own \code{show()} method to print the results of the classification or evaluation. The \code{summary()} method returns an object of class \code{SummaryLda} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new data (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. Classical linear discriminant analysis is represented by the class \code{LdaClassic} which inherits directly from \code{Lda} (and uses all slots and methods defined there). The function \code{LdaClassic()} serves as a constructor (generating function) of the class. It can be called either by providing a data frame or matrix and a grouping variable (factor) or a formula specifying the model to be used. Let us consider the following simple example with the data set \code{diabetes}: the grouping variable is \code{diabetes$group} and the three explanatory variables are \code{glucose}, \code{insulin} and \code{sspg}. The code \begin{Scode} R> x <- diabetes[, c("glucose", "insulin", "sspg")] R> grpvar <- diabetes$group R> LdaClassic(x, grpvar) \end{Scode} can be rewritten as (and is equivalent to) the following code using the formula interface: \begin{Scode} R> LdaClassic(group ~ ., data = diabetes) \end{Scode} The function \code{LdaClassic()} performs standard linear discriminant analysis and returns an object of class \code{LdaClassic}. Another abstract class, \code{LdaRobust} is derived from \code{Lda}, which serves as a base class for all robust linear discriminant analysis methods. The only slot added in this class is a character variable specifying the robust method to be used. The class \code{Linda} is derived from \code{LdaRobust} and provides implementation for all methods for robust LDA currently available in the framework. If we wanted to be precisely object oriented, we should define a separate class for each robust method---for example \code{LdaRobustMcd}, \code{LdaRobustFsa}, etc. but this would lead to explosion of the necessary code and documentation. The constructor function \code{Linda()} takes a character parameter \code{method} specifying which robust location and scatter estimator to use and how to compute the common covariance matrix and returns an object of class \code{Linda}. Similarly as the function \code{LdaClassic()}, \code{Linda()} can be called either with a data matrix and grouping variable or by a formula interface. \subsubsection{Computing the common covariance matrix} \label{oof-sec:common-cov} The easiest way to estimate the common covariance matrix $\v{\Sigma}$ is to obtain the estimates of the group means $\muv_k$ and group covariance matrices $\v{\Sigma}_k$ from the individual groups as $(\mv_k,\v{C}_k), k=1,\ldots,g$, and then pool the estimates $\v{C}_k, k=1,\ldots,g$ to yield the common covariance matrix \begin{equation} \v{C} = {\sum_{k=1}^g{n_k\v{C}_k} \over \sum_{k=1}^g{n_k-g}}. \end{equation} This method, using MVE and MCD estimates, was proposed by \citet{todorov:90, todorov:94} and was also used, based on the MVE estimator by \citet*{chork}. \newline \citet*{croux-dehon:01} applied this procedure for robustifying linear discriminant analysis based on S~estimates. A drawback of this method is that the same trimming proportions are applied to all groups which could lead to a loss of efficiency if some groups are outlier free. We will denote this method as ``$A$'' and the corresponding estimator as XXX-A. For example, in the case of the MCD estimator this will be MCD-A. Another method was proposed by \citet*{he:2000} for the S~estimates and was later adapted by \citet*{hubert:04} for the MCD estimates. Instead of pooling the group covariance matrices, the observations are centered and pooled to obtain a single sample for which the covariance matrix is estimated. It starts by obtaining the individual group location estimates $\tv_k, k=1,\ldots,g$, as the reweighted MCD location estimates of each group. These group means are swept from the original observations $\xv_{ik}~(i=1,\ldots,n_k;~k=1,\ldots,g)$ to obtain the centered observations \begin{eqnarray} \v{Z} = \{\zv_{ik}\}, ~~~~~\zv_{ik} = \xv_{ik} - \tv_k. \end{eqnarray} The common covariance matrix $\v{C}$ is estimated as the reweighted MCD covariance matrix of the centered observations $\v{Z}$. The location estimate $\deltav$ of $\v{Z}$ is used to adjust the group means $\mv_k$ and thus the final group means are \begin{equation} \mv_k = {\tv_k + \deltav}. \end{equation} This process could be iterated until convergence, but since the improvements from such iterations are negligible \citep[see][]{ he:2000, hubert:04} we are not going to use it. This method will be denoted by ``$B$'' and as already mentioned, the corresponding estimator as XXX-B, for example MCD-B. The third approach is to modify the algorithm for high breakdown point estimation itself in order to accommodate the pooled sample. \citet*{he:2000} modified Ruperts's SURREAL algorithm for S~estimation in case of two groups. \citet*{hawkins:97} defined the minimum within-group covariance determinant estimator which does not apply the same trimming proportion to each group but minimizes directly the determinant of the common within groups covariance matrix by pairwise swaps of observations. Unfortunately their estimator is based on the Feasible Solution Algorithm \citep[see][and the references therein]{hawkins:97}, which is extremely time consuming as compared to the FAST-MCD algorithm. \citet*{hubert:04} proposed a modification of this algorithm taking advantage of the FAST-MCD, but it is still necessary to compute the MCD for each individual group. This method will be denoted by MCD-C. Using the estimates $\mv^0_k$ and $\v{C}_0$ obtained by one of the methods, we can calculate the initial robust distances \citep{Rousseeuw-van-Zomeren} \begin{equation} RD^0_{ik}= \sqrt{(\xv_{ik}-\mv^0_k)^{\top}\v{C}_0^{-1}(\xv_{ik}-\mv^0_k)}. \end{equation} With these initial robust distances we can define a weight for each observation $\xv_{ik}, ~ i=1, \ldots , n_k$ and $k=1, \ldots, g$, by setting the weight to $1$ if the corresponding robust distance is less or equal to a suitable cut-off, usually $\sqrt{\chi^2_{p,0.975}}$, and to 0 otherwise, i.e., \begin{equation} \label{oof-eq:mdiv} w_{ik} = \begin{cases} 1&RD^0_{ik} \leq \sqrt{\chi^2_{p,0.975}} \\ 0&\text{otherwise}.\\ \end{cases} \end{equation} With these weights we can calculate the final reweighted estimates of the group means, $\mv_k$, and the common within-groups covariance matrix, $\v{C}$, which are necessary for constructing the robust classification rules, \begin{eqnarray} \mv_k &=& (\sum^{n_k}_{i=1}{w_{ik}\xv_{ik}})/\nu_k, \nonumber\\ \v{C} &=& \frac{1}{\nu-g}\sum^g_{k=1}\sum^{n_k}_{i=1}{w_{ik}(\xv_{ik}-\mv_k)(\xv_{ik}-\mv_k)^{\top}}, \end{eqnarray} where $\nu_k$ are the sums of the weights within group $k$, for $k=1,\ldots,g$, and $\nu$ is the total sum of weights, \begin{equation} \nu_k =\sum^{n_k}_{i=1}{w_{ik}}, ~~~~\nu = \sum^{g}_{k=1}{\nu_k}. \nonumber \end{equation} \subsubsection{Evaluation of the discriminant rules} In order to evaluate and compare different discriminant rules, their discriminating power has to be determined in the classification of future observations, i.e., we need an estimate of the overall probability of misclassification. A number of methods to estimate this probability exists in the literature---see for example \citet{lachenbruch:1975}. The \textit{apparent error rate} (known also as resubstitution error rate or reclassification error rate) is the most straightforward estimator of the actual error rate in discriminant analysis and is calculated by applying the classification criterion to the same data set from which it was derived. The number of misclassified observations for each group is divided by the group sample size. An estimate of the apparent error rate is calculated by the method \code{predict()} of the class \code{Lda}. Examples are given in the next section. It is well known that this method is too optimistic (the true error is likely to be higher). If there are plenty of observations in each class, the error rate can be estimated by splitting the data into training and validation set. The first one is used to estimate the discriminant rules and the second to estimate the misclassification error. This method is fast and easy to apply but it is wasteful of data. Another method is the \textit{leave-one-out} \textit{cross-validation} \citep{lachenbruch-michey:68} which proceeds by removing one observation from the data set, estimating the discriminant rule, using the remaining $n-1$ observations and then classifying this observation with the estimated discriminant rule. For the classical discriminant analysis there exist updating formulas which avoid the re-computation of the discriminant rule at each step, but no such formulas are available for the robust methods. Thus the estimation of the error rate by this method can be very time consuming depending on the size of the data set. Nevertheless, \pkg{rrcov} provides an (internal, not exported) function \code{rrcov:::.CV()} which calculates the leave-one-out cross-validation error rate by ``brute force'', but the user should be aware that its usage is appropriate only for moderate data sets. An improvement will be the implementation of a cross-validation technique similar to the one proposed by \citet{hubert:2007-CV}. \subsubsection{Example: Diabetes data} \label{oof:sec-diabetes} As an example for demonstrating the usage of the robust discriminant analysis classes and methods we use the \code{diabetes} data set, which was analyzed by \citet*{reaven-miller} in an attempt to examine the relationship between chemical diabetes and overt diabetes in 145 nonobese adult subjects. Their analysis was focused on three primary variables and the 145 individuals were classified initially on the basis of their plasma glucose levels into three groups: normal subjects, chemical diabetes and overt diabetes. This data set was also analyzed by \citet*{hawkins:97} in the context of robust linear discriminant analysis. The data set is available in several \proglang{R} packages: \code{diabetes} in package \pkg{mclust} \citep{mclust}, \code{chemdiab} in package \pkg{locfit} \citep{locfit} and \code{diabetes.dat} in \pkg{Rfwdmv} \citep{Rfwdmv}. We are going to use the one from \pkg{mclust} in which the value of the second variable, $insulin$, on the 104th observation, is 45 while for the other data sets this value is 455 (note that 45 is more likely to be an outlier in this variable than 455). We start with bringing the data set \code{diabetes} from package \pkg{mclust} into the workspace by typing <>= data("diabetes") @ Using the package \pkg{lattice} \citep{Sarkar:2008} we produce a three dimensional cloud plot of the data (Figure~\ref{lda-cloud}). << lda-cloud, fig=FALSE>>= library("lattice") # load the graphical library ## set different plot symbols - important for black-and-white print sup.sym <- trellis.par.get("superpose.symbol") sup.sym$pch <- c(1,2,3,4,5) trellis.par.set("superpose.symbol", sup.sym) cloud.plt <- cloud(insulin ~ glucose + sspg, groups = group, data = diabetes, auto.key=TRUE) @ \begin{center} \begin{figure}[h!] << lda-cloud-fig, fig=TRUE>>= print(cloud.plt) @ \caption{Three dimensional scatter plot of the \code{diabetes} data.} \label{lda-cloud} \end{figure} \end{center} We will first apply the classical linear discriminant analysis as implemented in \code{LdaClassic()} by the formula interface of the function---the grouping variable is \code{class} and all the remaining variables in \code{diabetes} are used as predictor variables. The \code{show()} method will present the results of the computations: the group means, the (common) within group covariance matrix, the linear discriminant functions together with the corresponding constants. The prior probabilities (either provided by the user or estimated as a proportion of the groups) are also presented. << lda-classic>>= lda <- LdaClassic(group~glucose+insulin+sspg, data=diabetes) lda @ Now the \code{predict()} method can be used on the \code{Lda} object (\code{Lda} is the base class for both \code{LdaClassic} and \code{LdaRobust}) in order to classify new observations. The method returns an object of class \code{PredictLda} which has its own \code{show()} method. If no new data are supplied, the training sample will be reclassified and a classification table will be produced to estimate the apparent error rate of the classification rules. << lda-classic-predict>>= predict(lda) @ Robust linear discriminant analysis can be performed in a similar way but using the function \code{Linda} (which will create an object of class \code{Linda}). As before the \code{predict()} method called without new data returns a classification table of the training subsample. Using the internal convenience function \code{rrcov:::.AER()} we can calculate and print the apparent error rate (which now is equal to 0.1103 and is lower than the obtained with the classical LDA 0.1310). << lda-robust>>= rlda <- Linda(group~glucose+insulin+sspg, data=diabetes) rlda rlda.predict <- predict(rlda) cat("\nApparent error rate: ", round(rrcov:::.AER(rlda.predict@ct),4)) @ In the above example we did not specify which method for computing the common covariance matrix should be used (thus using the default method ``MCD-B'' described above). We could choose the method by providing the \code{method} parameter to the function \code{Linda()}. For example the following call \begin{Scode} R> rlda <- Linda(group~glucose+insulin+sspg, data = diabetes, method = "fsa") \end{Scode} will use the \citet*{hawkins:97} \textit{feasible solution algorithm} method. The variance-covariance structures of the three classes in the \code{diabetes} data set differ substantially and we can expect improved results if quadratic discriminant analysis is used. Robust quadratic discriminant analysis is performed by the function \code{QdaCov()} which will return an object of class \code{QdaCov}. << qda-robust>>= rqda <- QdaCov(group~glucose+insulin+sspg, data=diabetes) rqda rqda.predict <- predict(rqda) cat("\nApparent error rate: ", round(rrcov:::.AER(rqda.predict@ct),4)) @ The accuracy of the prediction improves compared to the linear discriminant analysis. \section{Conclusions} \label{oof-sec:conclusions} In this paper we presented an object oriented framework for robust multivariate analysis developed in the \proglang{S}4 class system of the programming environment \proglang{R}. The main goal of the framework is to support the usage, experimentation, development and testing of robust multivariate methods as well as simplifying comparisons with related methods. It minimizes the effort for performing any of the following tasks: \bi \item{application of the already existing robust multivariate methods for practical data analysis;} \item{implementation of new robust multivariate methods or variants of the existing ones;} \item{evaluation of existing and new methods by carrying out comparison studies.} \ei A major design goal was the openness to extensions by the development of new robust methods in the package \pkg{rrcov} or in other packages depending on \pkg{rrcov}. Further classes implementing robust multivariate methods like principal component regression and partial least squares will follow but the user is encouraged to develop own methods using the proposed reusable statistical design patterns. \section*{Acknowledgements} We wish to express our thanks to the organizers of and participants in the ``Robust Statistics and \proglang{R}'' workshops for the valuable comments and suggestions which were a major input for the development of this framework. We are also grateful to many people, notably Matias Salibian-Barrera, Victor Yohai, Kjell Konis, and Christophe Croux for the provided code. The careful review and constructive comments of the editor and the anonymous reviewers helped us to substantially improve the manuscript. The views expressed herein are those of the authors and do not necessarily reflect the views of the United Nations Industrial Development Organization (UNIDO). \bibliography{mybiblio} \end{document} rrcov/vignettes/PcaModel.pdf0000644000176200001440000003022512763517421015606 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xYKs6WVx챙NzHgķf,Pbqjґ^ S^">__!9|L9]"_f~&՚-b{so_HFYAoX+[K9>o<: |uis+e~eWMcMj6r)m2#Tw*w7Q) ?z,-췷 ̮85uTuxzoL s6"FI%s6iv9ͱ&svwjw= ̼00GaV{ \Yqd(%Ē^^Z|/W^Mփ-gf3$rSY(Ǭ ?k %8p'8儀Xh.X&PFK֠9vX0@W.T)U4nzdBRNS4P'j1oXFp9ImP}ɲWiUPq%E4f@BIʀJUd ǶlxS%ix]B.ѵM5zO_9(n'Dy'q];Z.z|%|pMp='؆E>:o BoeF$lŠJA.`ZɈ5͟aPL'VYGjp@XPJl ~y]<ǡ-dafq+A}m ~Q{m$0Mq+ B;m=J,U4%nVS?+76 @u=%`2qjxI`HOh0Ai3Ǿ^A^Hbr|MKvR!-(?A)8"Oi];K>#8+W[T(lO1l߫ѣc-˩"96x)Hz7Z $>H*GG ۄbac7oڠpx,f6a[>ϑ. 3ˢ0p6Cߞ_ HS(wdtFvv|%#lPeI)%?s? v(>Y@romPN G2DUFw#1\_%-3GB[Ni#Q˧ixJpv: SX-ԇ3MʯXv,p|u%tkDZ̅[ɑec? 75ݱSuL> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 14 0 obj <> endobj 15 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <>stream xSkPWٮQHBnVQA]D[5$XdCvDy+>DʳZ!iS:v2Μet#ؿw9s  * eX}l:d[iwt8M!N=0>bTю&A^W|:Q|8i]ѡU1'1>9x޼pl0 [x1JAL )rh3ih 420,cRD9Q1(6-r:hO#gA8ćU<"Ldef7̴|F 2,Z@!Ƥcz77p&-eD.0fɌqkF{2gdqYj^`1H7O: of6W.e0[)c=Y EnWTkf<{?#4kaV%hh2Z'hc#b6 "8"@,"$b5N׃"xbz\yktx0x)nLO1Z ']4Z<JJpNix8X+&5~z$PRFl5'b*tz/4p7n+ϩηU)3᠛2L<~},5ߦ$a*O :;~@woIAVK=ؓ j؄46Yfԟ[>,N B=ԫ!/_x>/}]k1% ҂JK)!8T$L*i0A衮l-tI~[\ݑoowQ{zۆ{Yu 1l  սeYRv0z\k6E)}@p>Q lOqخ^Nv,HV\C*={ p^}՝AΧ{wc!qҡ }]ÝG0S<1^ FI7-INdkSZ4Onh3y{mR/ +`f$̘.:z(Te'Mƺ|vT8վ.KaxI<'M` pu9aBcN5D[qxҩ; 5c1Dr—+jxO>޵3S0&Qm[Tx׵՟WUTVUU-B,l1G:Ws)7BeueYs$Kf .zՒJx')̷x<-q',w^e7A p endstream endobj 11 0 obj <> endobj 17 0 obj <>stream xUV TSW}ϐʧ>&PAQȧ ~@ kȔ "B X,2& j缬 N[g^r9g4e2iYn\9 i QV?gP̐T7Ya g@xChzyL_FfAVjrJ>:rüyqYx|sSUdLR儥*7fˣUr<2)97=>^Re(P%f$e&m JN I ݚ==>_YށSqJʟr©ʎVP EQ`ʍʝrbՔZCRT,FQ45HMfX(JJ%Q5Ol:6nž (OtdI qߌ5sbX?v {䲸؉&Ol ͅѳjNJiL)j1aF (?yԛO3P =)j>Xk%(9c&V'M )VC!mc륒oYFNG4xfE/Lgl}S9nlsѦx9wY;2saHH  0Wb)c8]o!rX &IaZDpRhWm<} '+៷")$`y_'3/5]3׵"aW3)-QH%b{!Lֶ_xB!zOfna<~FْF5H?W@ ܝ;r@^+mi][w/@?py̾=;Tʕ$,g V 3o(8-*Os4G*5l5xmJ2ڊU0;GO_L&y"C>,*?9ld-XŭGAP'B)ѣ8j|2LN`* 9+%:O_wGGo@n"TT\${; 'Y 7O .XL H{<',G7h';#54i~Q([ sg/q0cI11aGZzzƬu"|eJeTN|]MOop%Gik9I vn2ޓuC'߮ "UY`, +;m ԁzr"T ֠$ZE~  ԏPiRlD/u[jGd)% oa3bDxG)Ͽ*%YmݐTv"OsuF A_o`{RYjr^ja&bOxgL%atڽ;,{"Êoy?N YBe :`B {GIjEp<}iPՇ?9%fwU6?a!`eǀ.K6{*dP4Yd3>' N$bub/BbA2$qjv-.뵒脼Bʣ܃ߕ uoI*. VK_a]]XB%R2=oLoB8$LSaP)`{7 d Cx/ơs5hƾ<~Q3|rg,x3kSiL[9G9Y83H~μ1895#hLIhcA4elDFwX]U/U&H3(Vsѿ]׏ަXY.RvÓvLr+hj-4&Gek@e+IMAB[n4) őSep]jS#`8[Bؑ?\CZkXVxxo]!2+Ʌ[YojXI?nlR_4$yq@o۠$oV-\K=|X)|R52ca6uoF[o5rz ^0mm_1BL}y,$l! zH~q8B6{,G !\* dXqalLDJn-{a-JTCZQO1S3/1ʨ endstream endobj 13 0 obj <> endobj 18 0 obj <>stream xUkTSWMʽ" .U[A" X@t4$7!6/u\y(B "@ (ZYʣV;XkQsw~ܵ9{KnI^R?9ʤW ۩hƏu.K,x˽ ۝8:fPP'?2e' ON0-dҤ&ݢf٘isa2k ZuZ#9d6F[8̲-e4:=,HLZ&2(LRv^bTʆ0lɨt&52JjfU&SfƘYAg52ZhcՌ*}ZH5&1[Ln*dYUIъ,Mka3c`OI-TfSVل<,Yzš BUgԾXXҢֳVW\1Zi6&כ:ktl+3B{9yۢiA/U&3dt 蕆LLD4D㉥F$)D0J,"f!2"H#QDEDx8IFƒon+ZI/zyh=8!D'T8j|y @;wd( ~WʗoC>z"Nm:=SUU I|8xC!m#m3]'|⺐8*ݜKg'Hl ' "Ow4bx4fwAVFQ=dN$k?oRQK)opG u8e1 dhN"Q R !_ytn_P`yO__k-h< y i@ *WV/0e!hz/P4>5W׵I'#Y1>$#6&&ӖשPps9-66oNkD$(m)y0FATaxҲp"̯ϋgY}y%j~dt@ "x҅F3v}u*I`/ oe^ O-b .Q ELF׳g-8nK|_|%ȊJ=\1׾ϵ3O C(EE 5jrN}T{bcd%ª]0٥:p~-sLz!hFo_ eؗߩϚɚqĺ.GHhA,Mx;CxSn+%+ QtF )Bwn@MFpcg)`}0z__eK֪siťvl>%0RPP{d5EWVui>D|Ikzy`f`A"jB~Am,dӮNYc34c^ͫ7qI#5S'|x-r4,HMK;#41Jmu"`5XA1{C0=0 B?p_z^gZhz\Cqگ-F^7bA x g1=6R|C]r!>np6L6 }!` 4׋\l;c9Qn>aЉ0֝Y>;&61ͿPK_FSŗ>$GZ{6yO.gi)\(6|ԜupoL >@AZXpRyKI}ޝFhDc8Һ?:onh>n^#GwP/aMV׵CV:u Y";pW1%!ħ5[&77iM[ܩ8n!aѥJT 肬|ĐEʮ^׀UȨ{3R endstream endobj 19 0 obj <>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 20 0000000000 65535 f 0000001937 00000 n 0000011765 00000 n 0000001878 00000 n 0000001726 00000 n 0000000015 00000 n 0000001706 00000 n 0000002002 00000 n 0000002125 00000 n 0000003097 00000 n 0000002380 00000 n 0000004895 00000 n 0000002783 00000 n 0000007890 00000 n 0000002043 00000 n 0000002073 00000 n 0000003333 00000 n 0000005203 00000 n 0000008152 00000 n 0000010404 00000 n trailer << /Size 20 /Root 1 0 R /Info 2 0 R /ID [<826AC04CA3F96390DE3A0845DCD8C470><826AC04CA3F96390DE3A0845DCD8C470>] >> startxref 11883 %%EOF rrcov/vignettes/Structure.pdf0000644000176200001440000001141612763517421016123 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xRN0W8N&7ġ m%DT}֎ؽDdv3-p+mw +-HF` _)KC{ݭ>4d 6; A#?lz^72vT2,J'CihFs vXVs"9 ma6f̷o?_/E%^o o@g.< }x^`MNdB%y!M)fHk/TxSg|3DMu;_mspyY"/ɡ:edYUpCQ3"Q6g|ŤN1_&X~P;g)'(H* oendstream endobj 6 0 obj 365 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 12 0 obj <>stream xSPTU~o} b<5݋%""d(DHf]^-f(z D ?Y1d?&2j&rO؉:a`aqM2VMLW]ԴǗ_gkȀ!è׎!?1Dn!C('4X3ijg)( =tk;ql ]6oO\R , p?ma_yދn~uB9_]_5G{K53đ 'ɈOsEsQtd[5B1t6ۢgxz8rr@QUY >$i$HF+Lj>V/>7ncdž(\ gU @K'*:9n,lx~~kUscokg"5oh7&4o!?O>0>s"7?/B'mSyy 2([ Oy@>=|m> u$JLԺđ l @ endstream endobj 13 0 obj <>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 14 0000000000 65535 f 0000000679 00000 n 0000004327 00000 n 0000000620 00000 n 0000000469 00000 n 0000000015 00000 n 0000000450 00000 n 0000000744 00000 n 0000000845 00000 n 0000001135 00000 n 0000000785 00000 n 0000000815 00000 n 0000001376 00000 n 0000002966 00000 n trailer << /Size 14 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 4445 %%EOF rrcov/vignettes/DAModel.pdf0000644000176200001440000003005212763517421015365 0ustar liggesusers%PDF-1.4 %쏢 5 0 obj <> stream xYv7N2>9i\DnC6E.$Bfǝ߫7{/նw2^u*n^Vk RQz}Y/uo8:<.6]ѽܖl2]~o twv֚n5ŋ7˗,~^\(-J2NtFzж c7ay$J^&v_޽x!Qe~xa;?ħvZvi ڇ~'̫L56%Y=Y_CvχnOڭW~j8jpXӉ7m>7t=<{fyXvM;w,`(>4!XK K0բQ'C|'G a!Ӑ%onnԱl팕6# EJR$Rjz (鉡RH4Tch T# WB\$Q7IzYo8ibtN0]R^qGbI Z8(,ǐ /@|+=l3JĠLn1ې#n̞ >Xڙ<2QfLzϚ)7K BYtiUL69`u5\ke8F5ܮw yu#-Uբ(59vLp": ℟L0p8&HaF<*/a\ JE۹[a-kH8)F{!a<]jd4• lRgJ!K7xMԎ `S1$iN)EtRȃۺ%p3p:N͑VzX'IbHqP-Cp8 IךZ(|>X)A!Q^mZuK0Fl1E),ڪ^z*#X*kٖ v6m0UDmpc z$! B$#AiCL@ǤI( j2SLh9&7sejJ7d.bԩiC|^r#fO9(Sq]̓C=a}jɳ?(=E߫&- F)=iN5:C[lj\&:J_}pb<߻3|F8SfT<}o.,6('k7u`R-^֛0ELJTGr5 ^(J=I!u,(s>ϩBoQb?8\4tvd%Iv8tn䒲]1RV[-ĎegU*9*aMJ18M q\=)2C-CjJ28JM" SMUŘWeB2H yJC8_AOy}vTx$5|pb%=5^<l6=7 `^7vt.PJ\A&C8٠p\ .Oh; k[XĖyVxr , rvg@vN^?AlCfB^F"?;b#6772Z)Y!o31z!iO -&,Qi?|C vSO%,$c U1!,M,Ҋ9DREA,E!R &z.$buq^D!$]-endstream endobj 6 0 obj 2025 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 14 0 obj <> endobj 15 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 12 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <>stream xS}Pem3Dԣ{H #ALDQ=Xٻ=v+>DKtm25-Lˏa(-5:=DhAnZIx`@l8ZF-ʚ*>%.r10V#O өNΡJW¸=hjlo'K,'0N# G99aⶳMjIk>W^5}>]헺Le{N _4ʚkm5Bh}_Nv$=,*j[OJ C 6?8T endstream endobj 11 0 obj <> endobj 17 0 obj <>stream xUU TGfAP&#( "|/(("*?a'1~htŰ DQ FYJ(ѐ#Y̾Ը5lNN9uUu()iˑiFa|5(9q̡r2ę$J@ˣ6zgg$%g#W9̙glCd> Y)I*Lb&g(T) 9YxUL! OHI("_qu&̤씈ܭiyJټ5B(ʍ |);*ZAQ ʟrVRT$HPQ*j5DyQT0ESf5N) @Ps hV0M/2m7=[e50 v5{hΚ[!7Q(|T)NGa=cU}i~*_)3/Љ_}uļdd1*(?-cwBHձcP0j:@͇?LVwz~ 7dCWhdEqBXm`LhWD K{zOa;ZԤB. { L>(.b A|eLKJr%YP 8 Q!{-܂5XFxgЬIr>g`֋ \FiU'<{A4:a ?[jF 7+>$7G%Ls4vǾZLj/KW^;';˃)}TWu<E.-I NEx& v]>a2^#XTfO*eHP=CB 0̲ImH޼Z P VٔՉ8z4B0R O6o^<_*r{ f`v* .4_;WOy~Ád5s.i2t&TgX䏢к闶t S|xNG KMmQ;>Pa;h$C>s ].?҅+>֋{S@y{' ޫ6"Y Ŀk IT4]8yv5|R*mH]^cw1iW';,eﭮ'X.\X{1Zz>uMԁqJ"sU9iWR}ML`O-&>76H5]ָ &)չ(2&f׺Ҫ\ɎO6pA<3 !k.ڞWSU˫;U,.LOtIM;e?$"ޮVqeTܜ|]18ne?gwO ,;Wl^DUşt;?Qv4H?# 3ID `6Y쪯gDOGƋl>N/ą`Џ\T+?eJ!`͏Y(mݘ3-Aɍ_~|2ȿ4n5$ -N}lvԆ^Dt:H=ZGM?Xd6oz,D:>whtXYK@6 ϺY_$"]/jm =F|MXR8z,= }(76VhG.,rW0/U/g8f-z`K7jHMS}TV#/UlJdeR_ 0yNhisKq!v4WܑjA娴0$=2S6| J8~T)G|~s!\Ȁ7.AX-|̀%Ă?Eax-D3cE=߼yL38 ûg75*o|nh$5E[)8Gp֎ bDlk;Œ9k#<+=V`'zP@ Ԇ` & 1 &eD7` pR@,V2ضR9{8c,TCZQh&<}_#&) endstream endobj 13 0 obj <> endobj 18 0 obj <>stream xTmTa?WD ;WTDXZa ,uwݝI-1+"X\+J j8шD56XMj4T}g{w!Q?{{y}:aY6$%miNTFKAJ ߣf)PpzK!w/*@z_+ %%hRrr2ZA?EP(. 9 KT$4;'sM(ΔLCpm(tM,"8xT$m`,*ʢp'T72#SМPn@r .v5ݨevȂ[5@Oϋ$.4Br%춸D(cnq@\bnTDoZ%Ki 1,:HYEfP^ tJݢ{r f&qUyz.ki+z/nV-ڗQɳMcfHa\<,敖vId &e211b3̫uˤ1 GèFd3OX[> FUNQQՄkij)\  /{UoHv] ?hÕ"yYŠ8&!J$iaQǚ ubƭC~]͆:܂WںGx$qx_oyE5]䵋'_:4@nѓ':s 9C/uT 4_pᓿ"#8d0ݾNz2$g>֧/}{[]3_{z*gJYEQSGc K2a  7 wqTlAƬ _7X "5ڒ7Ger =G x_%Ƨ[:$X >;e3~)#caۮ\E2 V`mJV۱'#,E\BqH2u=<ծJ}=^ћdx |mV}!UꡌX*ܹʣ|O0!zw$BؽGM<1hW,` ^VJڽp7[}B߼+\^"} "ث6+haĭo!b]' r#] C' ^ 1;tÏ̞ɇG8yi)(4osx^>|V>lf\Kt2EB?uI qdBNE~|[!mT6)AzN!ci]xmwnՇ+`z𖊚 \_j]jcx{;;9Hok΅iT͹gpRr2dTn{􇚽 7a>n^kL!N=iWSm{?_Vh}iD};%QZ]M!"芶UPP$NRlpv9ΎM&1Dsn>I$W4qk'\k&&Ol\P}CEFv㎨N\ÒBx3Dۺ?M9O p ՑK&VCf`xДyY يOCⴄ Xü>?oQG"s%΁hR_ǹСYgI,9D2Hmن{sسꭷW+*#O|MN.ѾX\-=$h s)Eo8[1UT-*aOhrf |"[ݗv:\l }'+u3?!i;lc{A:"'ŖEݺpAyawaaTW¨a ? endstream endobj 19 0 obj <>stream UnknownApplication Untitled endstream endobj 2 0 obj <>endobj xref 0 20 0000000000 65535 f 0000002341 00000 n 0000011658 00000 n 0000002282 00000 n 0000002130 00000 n 0000000015 00000 n 0000002110 00000 n 0000002406 00000 n 0000002529 00000 n 0000003495 00000 n 0000002794 00000 n 0000005340 00000 n 0000003189 00000 n 0000008024 00000 n 0000002447 00000 n 0000002477 00000 n 0000003733 00000 n 0000005643 00000 n 0000008278 00000 n 0000010297 00000 n trailer << /Size 20 /Root 1 0 R /Info 2 0 R /ID [<5F375D9D567AAD1A41382AB0E466AC53><5F375D9D567AAD1A41382AB0E466AC53>] >> startxref 11776 %%EOF rrcov/R/0000755000176200001440000000000014200564340011604 5ustar liggesusersrrcov/R/CovOgk.R0000644000176200001440000001213112763517421013127 0ustar liggesusersCovOgk <- function(x, niter = 2, beta = 0.9, control) { metodo2 <- function(XX) { n <- nrow(XX) p <- ncol(XX) sigma <- apply(XX, 2, mrob)[2,] Y <- XX %*% diag(1/sigma) U <- matrix(1, p, p) for(i in 1:p) for(j in i:p) { U[j, i] <- U[i, j] <- vrob(Y[,i], Y[,j]) } diag(U) <- 1 E <- eigen(U)$vectors A <- diag(sigma) %*% E Z <- Y %*% E restau <- apply(Z, 2, mrob) sigma <- as.vector(restau[2,]) cov <- A %*% diag(sigma^2) %*% t(A) loc <- A %*% restau[1,] list(cov = cov, center = loc, AA = A, ZZ = Z) } ## Analize 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. ## The functions 'mrob()' and 'vrob()' can be supplied only via the control ## object. If no control object is passed these function will be taken ## from the default one defcontrol <- CovControlOgk() # default control mrob <- defcontrol@mrob vrob <- defcontrol@vrob smrob <- defcontrol@smrob svrob <- defcontrol@svrob if(!missing(control)){ # a control object was supplied if(niter == defcontrol@niter) niter <- control@niter if(beta == defcontrol@beta) beta <- control@beta mrob <- control@mrob vrob <- control@vrob smrob <- control@smrob svrob <- control@svrob } if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] if(p < 2) stop("Need at least 2 columns ") if(n <= 0) stop("All observations have missing values!") call <- match.call() ## If the user has supplied own mrob and vrob use the pure R version ## with this functions. Otherwise call the C implementation if(!is.null(mrob)){ ## iterate two times to obtain OGK2 first <- metodo2(x) cov <- first$cov center <- as.vector(first$center) ZZ <- first$ZZ if(niter >= 2){ second <- metodo2(first$ZZ) cov <- first$AA %*% second$cov %*% t(first$AA) center <- as.vector(first$AA %*% as.vector(second$center)) ZZ <- second$ZZ } dimnames(cov) <- list(dimn[[2]], dimn[[2]]) names(center) <- dimn[[2]] ## compute distances and weights ## do not invert cov to compute the distances, use the transformed data ## ## dist2 <- mahalanobis(X, center, cov) ## musigma <- apply(ZZ,2,mrob) ZZ <- sweep(ZZ, 2, musigma[1,]) ZZ <- sweep(ZZ, 2, musigma[2,], '/') dist2 <- rowSums(ZZ^2) cdelta <- median(dist2)/qchisq(0.5, p) cov <- cdelta * cov quantiel <- qchisq(beta, p) qq <- (quantiel * median(dist2))/qchisq(0.5, p) wt <- ifelse(dist2 < qq, 1, 0) sum.wt <- sum(wt) } else { if(!(smrob %in% c("scaleTau2", "s_mad"))) stop(paste("Scale function not defined: ", smrob)) if(!(svrob %in% c("gk", "qc"))) stop(paste("Bivariate covariance function not defined: ", svrob)) storage.mode(x) <- "double" opw <- .Call("covOPW", x, as.integer(niter), smrob, svrob) dimnames(opw$cov) <- list(dimn[[2]], dimn[[2]]) names(opw$center) <- dimn[[2]] dist2 <- opw$distances cdelta <- median(dist2)/qchisq(0.5, p) cov <- opw$cov <- cdelta * opw$cov center <- opw$center quantiel <- qchisq(beta, p) qq <- (quantiel * median(dist2))/qchisq(0.5, p) wt <- ifelse(dist2 < qq, 1, 0) sum.wt <- sum(wt) } ## compute the reweighted estimates: OGK2(0.9) wcenter <- colSums(x*wt)/sum.wt X <- sqrt(wt) * sweep(x, 2, wcenter) wcov <- (t(X) %*% X)/sum.wt ## Compute consistency correction factor for the reweighted cov qdelta.rew <- qchisq(sum(wt)/n, p) cdeltainvers.rew <- pgamma(qdelta.rew/2, p/2 + 1)/(sum(wt)/n) cnp2 <- 1/cdeltainvers.rew ## wcov <- cnp2 * wcov method="Orthogonalized Gnanadesikan-Kettenring Estimator" ans <- new("CovOgk", call = call, iter=niter, crit=1, cov=wcov, center=wcenter, n.obs=n, raw.cov=cov, raw.center=center, raw.mah = dist2, raw.wt = wt, X = x, method=method) ans } rrcov/R/AllGenerics.R0000644000176200001440000000622512763517421014136 0ustar liggesuserssetGeneric("plot") setGeneric("summary") setGeneric("psi", function(obj, x) standardGeneric("psi")) setGeneric("wt", function(obj, x) standardGeneric("wt")) setGeneric("vt", function(obj, x) standardGeneric("vt")) setGeneric("erho", function(obj) standardGeneric("erho")) setGeneric("erhoLim", function(obj) standardGeneric("erhoLim")) setGeneric("erhoLimD", function(obj) standardGeneric("erhoLimD")) setGeneric("arpLim", function(obj) standardGeneric("arpLim")) setGeneric("csolve", function(obj) standardGeneric("csolve")) setGeneric("iterM", function(obj, x, t1, s, eps, maxiter) standardGeneric("iterM")) setGeneric("isClassic", function(obj) standardGeneric("isClassic")) setGeneric("isSingular", function(obj) standardGeneric("isSingular")) setGeneric("getMeth", function(obj) standardGeneric("getMeth")) if(!isGeneric("getCenter")) setGeneric("getCenter", function(obj) standardGeneric("getCenter")) if(!isGeneric("getScale")) setGeneric("getScale", function(obj) standardGeneric("getScale")) setGeneric("getCov", function(obj) standardGeneric("getCov")) setGeneric("getCorr", function(obj) standardGeneric("getCorr")) setGeneric("getData", function(obj) standardGeneric("getData")) setGeneric("getDistance", function(obj) standardGeneric("getDistance")) setGeneric("getEvals", function(obj) standardGeneric("getEvals")) setGeneric("getDet", function(obj) standardGeneric("getDet")) setGeneric("getShape", function(obj) standardGeneric("getShape")) setGeneric("getFlag", function(obj, prob=0.975) standardGeneric("getFlag")) setGeneric("getRaw", function(obj) standardGeneric("getRaw")) setGeneric("restimate", function(obj, x, ...) standardGeneric("restimate")) if(!isGeneric("predict")) setGeneric("predict", function(object, ...) standardGeneric("predict")) if(!isGeneric("screeplot")) setGeneric("screeplot", function(x, ...) standardGeneric("screeplot")) if(!isGeneric("biplot")) setGeneric("biplot", function(x, ...) standardGeneric("biplot")) if(!isGeneric("scorePlot")) setGeneric("scorePlot", function(x, ...) standardGeneric("scorePlot")) if(!isGeneric("getQuan")) setGeneric("getQuan", function(obj) standardGeneric("getQuan")) # returns the number of observations used # in the computation of the PCA (n for classic) if(!isGeneric("getLoadings")) setGeneric("getLoadings", function(obj) standardGeneric("getLoadings")) if(!isGeneric("getEigenvalues")) setGeneric("getEigenvalues", function(obj) standardGeneric("getEigenvalues")) if(!isGeneric("getSdev")) setGeneric("getSdev", function(obj) standardGeneric("getSdev")) if(!isGeneric("getScores")) setGeneric("getScores", function(obj) standardGeneric("getScores")) if(!isGeneric("getPrcomp")) setGeneric("getPrcomp", function(obj) standardGeneric("getPrcomp")) # return a prcomp() compatible object to use the # available standard plots (i.e. a list with # with sdev, scale, scores, rotation) rrcov/R/adjoutlyingness.R0000644000176200001440000001601613711567124015166 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 ## ^^^^^^^^^^^^^^^^^^^^^^^^ ## VT::02.08.2020 - mc() will not converge in some cases, particularly in ## the new version of PcaHubert() in rrcov, with option for adjustment ## for skewed data. Add a parameter mcfun which defaults to mc, ## but can be replaced by another function, e.g. the mcVT(), given below ## which is secured to non-convergence by tryCatch(). mcVT <- function(x) { result = tryCatch({ suppressWarnings(mc(x)) }, error = function(e) { mc(x, doScale=FALSE) }) result } 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), mcfun=mc, 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 ## VT::02.08.2020 - mc() will not converge in some cases, ## e.g. generate a matrix a <- matrix(rnorm(50*30), nrow=50, ncol=30) ## replace the function mc() by, say mcfun() which will do tryCatch() ## and if it did not converge will retry with doScale=FALSE, this ## works always. ## tmc <- apply(Y, 2, mc) ## original Antwerpen *wrongly*: tmc <- mc(Y) tmc <- apply(Y, 2, mcfun) ## now we can replace the call to the medcouple function mc() ## == 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)) } } rrcov/R/CovMrcd.R0000644000176200001440000000464313575156451013311 0ustar liggesusersCovMrcd <- function(x, alpha=control@alpha, h=control@h, maxcsteps=control@maxcsteps, initHsets=NULL, save.hsets=FALSE, rho=control@rho, target=control@target, maxcond=control@maxcond, trace=control@trace, control=CovControlMrcd()) { if(is.data.frame(x)) x <- data.matrix(x, rownames.force=FALSE) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : ok <- is.finite(x %*% rep.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] dimn <- dimnames(x) mcd <- .detmrcd (x, alpha=alpha, h=h, hsets.init = initHsets, save.hsets=save.hsets, # full.h=full.h, rho=rho, target=if(target=="identity") 0 else 1, maxcsteps=maxcsteps, trace=as.integer(trace)) alpha <- mcd$alpha h <- mcd$h ans <- list(call = match.call(), method = sprintf("MRCD(alpha=%g ==> h=%d)", alpha, h)) ans$method <- paste("Minimum Regularized Covariance Determinant", ans$method) ans$cov <- mcd$initcovariance ans$center <- as.vector(mcd$initmean) ans$n.obs <- n ans$best <- sort(as.vector(mcd$best)) ans$alpha <- alpha ans$quan <- h ans$crit <- mcd$mcdestimate ans$mah <- mahalanobis(x, mcd$initmean, mcd$icov, inverted=TRUE) if(length(dimn[[1]])) dimnames(x)[[1]] <- dimn[[1]][ok] else dimnames(x) <- list(seq(along = ok)[ok], NULL) ans$X <- x if(trace) cat(ans$method, "\n") ans <- c(ans, mcd[c("calpha", "iBest","n.csteps", if(save.hsets) "initHsets", "icov","rho", "target")]) class(ans) <- "mcd" if(!is.null(nms <- dimn[[2]])) { dimnames(ans$cov) <- list(nms, nms) dimnames(ans$icov) <- list(nms, nms) names(ans$center) <- nms } new("CovMrcd", call= ans$call, crit=ans$crit, cov=ans$cov, icov=ans$icov, rho=ans$rho, target=ans$target, center=ans$center, n.obs=ans$n.obs, mah = ans$mah, X = ans$X, method=ans$method, best=ans$best, alpha=ans$alpha, quan=ans$quan, cnp2 = ans$calpha) } rrcov/R/PcaClassic.R0000644000176200001440000001201214131110764013730 0ustar liggesusers##setGeneric("PcaClassic", function(x, ...) standardGeneric("PcaClassic")) ##setMethod("PcaClassic", "formula", PcaClassic.formula) ##setMethod("PcaClassic", "ANY", PcaClassic.default) setMethod("getQuan", "PcaClassic", function(obj) obj@n.obs) ## The S3 version PcaClassic <- function (x, ...) UseMethod("PcaClassic") PcaClassic.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a `standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaClassic.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaClassic") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaClassic.default <- function(x, k=ncol(x), kmax=ncol(x), scale=FALSE, signflip=TRUE, crit.pca.distances=0.975, trace=FALSE, ...) { cl <- match.call() if(missing(x)){ stop("You have to provide at least some data") } data <- as.matrix(x) n <- nrow(data) p <- ncol(data) Xsvd <- .classPC(data, scale=scale, signflip=signflip, scores=TRUE) if(Xsvd$rank == 0) { stop("All data points collapse!") } myrank <- Xsvd$rank if(is.logical(scale) && !scale) # no scaling, the defult Xsvd$scale <- vector('numeric', p) + 1 if(trace) { cat("\nDimension of the input matrix x:\n", dim(x)) cat("\nInput parameters [k, kmax, rank(x)]: ", k, kmax, Xsvd$rank, "\n") } ## ## verify and set the input parameters: k and kmax ## kmax <- max(min(kmax, Xsvd$rank),1) if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } if(k != 0) k <- min(k, ncol(data)) else { ## k <- min(kmax, ncol(data)) ## if(trace) ## cat("The number of principal components is set to ", k, ".\n", sep="") ## Find the number of PC 'k' ## Use the test l_k/l_1 >= 10.E-3, i.e. the ratio of ## the k-th eigenvalue to the first eigenvalue (sorted decreasingly) is larger than ## 10.E/3 and the fraction of the cumulative dispersion is larger or equal 80% ## test <- which(Xsvd$eigenvalues/Xsvd$eigenvalues[1] <= 1.E-3) k <- if(length(test) != 0) min(min(Xsvd$rank, test[1]), kmax) else min(Xsvd$rank, kmax) cumulative <- cumsum(Xsvd$eigenvalues[1:k])/sum(Xsvd$eigenvalues) if(cumulative[k] > 0.8) { k <- which(cumulative >= 0.8)[1] } if(trace) cat("\n k, kmax, rank, p: ", k, kmax, Xsvd$rank, ncol(data), "\n") if(trace) cat("The number of principal components is defined by the algorithm. It is set to ", k,".\n", sep="") } if(trace) cat("\nTo be used [k, kmax, ncol(data), rank(data)]=",k, kmax, ncol(data), Xsvd$rank, "\n") loadings <- Xsvd$loadings[, 1:k, drop=FALSE] eigenvalues <- as.vector(Xsvd$eigenvalues[1:k]) center <- as.vector(Xsvd$center) scores <- Xsvd$scores[, 1:k, drop=FALSE] scale <- Xsvd$scale eig0 <- as.vector(Xsvd$eigenvalues) totvar0 <- sum(eig0) if(is.list(dimnames(data)) && !is.null(dimnames(data)[[1]])) { dimnames(scores)[[1]] <- dimnames(data)[[1]] } else { dimnames(scores)[[1]] <- 1:n } dimnames(scores)[[2]] <- as.list(paste("PC", seq_len(ncol(scores)), sep = "")) dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) ## fix up call to refer to the generic, but leave arg name as 'formula' cl[[1]] <- as.name("PcaClassic") res <- new("PcaClassic", call=cl, rank=myrank, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=scale, scores=scores, k=k, n.obs=n, eig0=eig0, totvar0=totvar0) ## Compute distances and flags res <- pca.distances(res, data, Xsvd$rank, crit.pca.distances) return(res) } rrcov/R/utils.R0000644000176200001440000000404313567467676013125 0ustar liggesusers## Moore-Penrose pseudoinverse .pinv <- function(X, tol=.Machine$double.eps) { X <- as.matrix(X) xsvd <- svd(X) nze <- sum( xsvd$d > (tol*xsvd$d[1]) ) return (if(nze > 1L) xsvd$v[,1:nze] %*% diag(1/xsvd$d[1:nze]) %*% t(xsvd$u[,1:nze]) else outer(xsvd$v[,1],xsvd$u[,1]) / xsvd$d[1] ) } .isSingular <- function(mat) { ## return( - (determinant(mat, logarithm = TRUE)$modulus[1] - 0)/ncol(mat) > 50) p <- ncol(mat) if(!is.qr(mat)) mat <- qr(mat) return(mat$rank < p) } .check_vars_numeric <- function(mf) { ## we need to test just the columns which are actually used. mt <- attr(mf, "terms") mterms <- attr(mt, "factors") mterms <- rownames(mterms)[apply(mterms, 1, any)] any(sapply(mterms, function(x) is.factor(mf[,x]) || !is.numeric(mf[,x]))) } vecnorm <- function(x, p=2) sum(x^p)^(1/p) ## ## Several Matlab-like utility functions ====================================================== ## ## ## Return the square root of a symetric positive definite matrix sqrtm <- function(A){ ## ## [E D] = eig(A); sqrtm(A) = E * sqrt(D) * E' ## if(!is.matrix(A) || ncol(A) != nrow(A)) stop("The matrix A must be a square matrix\n") ee <- eigen(A) if(any(ee$values < 0)) { stop("The matrix A must be positive definite.") } ee$vectors %*% diag(sqrt(ee$values)) %*% t(ee$vectors) } ## Return an n by p matrix of ones ##ones <- function(n=1, p=1){ ## matrix(1, nrow=n, ncol=p) ##} ## Return an n by p matrix of zeros ##zeros <- function(n=1, p=1){ ## matrix(0, nrow=n, ncol=p) ##} ## ## a=[1 2 ; 3 4]; ## repmat(a,2,3) ## ## ## a <- matrix(1:4,2,byrow=T) ## repmat(a,2,3) ## ## ## a <- 1:4; n=10 ## matrix(rep(a, times=n), nrow=n, byrow=TRUE) ## ##repmat <- function(A, n, p) { ## ## if(is.vector(A)) # we need a column matrix, not a vector, speaking in R terms ## A <- t(A) ## kronecker(matrix(1,n,p), A) ##} rrcov/R/zzz.R0000644000176200001440000000057312763517421012603 0ustar liggesusers.onAttach <- function(lib, pkg) { where <- match(paste("package:", pkg, sep = ""), search()) ver <- read.dcf(file.path(lib, pkg, "DESCRIPTION"), "Version") ver <- as.character(ver) title <- read.dcf(file.path(lib, pkg, "DESCRIPTION"), "Title") title <- as.character(title) packageStartupMessage(paste(title, " (version ", ver, ")\n", sep = "")) } rrcov/R/donostah.R0000644000176200001440000001341312763517421013562 0ustar liggesusersdonostah <- function(x, control) { if(missing(control)) control <- covRob.control(estim="donostah") n <- nrow(x) p <- ncol(x) center <- control$center nresamp <- control$nresamp maxres <- control$maxres prob <- control$prob eps <- control$eps if(!control$random.sample) { if(exists(".Random.seed", where = 1)) { random.seed <- get(".Random.seed", pos = 1) on.exit(assign(".Random.seed", random.seed, pos = 1)) } set.seed(21) } if(casefold(nresamp) == "auto") nresamp <- ceiling(log(1 - control$prob)/log(1 - (1 - control$eps)^(p+1))) else if(!is.integer(nresamp)) stop("nresamp must be a nonnegative integer or ", dQuote("auto")) if(nresamp != 0) nresamp <- max(1000, nresamp) if(casefold(maxres) == "auto") maxres <- 2 * nresamp else if(!is.integer(maxres)) stop(sQuote("maxres"), " is not a positive integer") tune <- sqrt(qchisq(control$tune, p)) icent <- 1 locat <- double(p) covmat <- matrix(0.0, p, p) storage.mode(covmat) <- "double" wk <- double(4*n+p) iwork <- integer(4*n+p) nresper <- 0 w <- double(n) z <- double(n) if(length(center) == 1 && !center) center <- rep(0, p) if(length(center) > 1) { if(length(center) != p) stop("the dimension of ", sQuote("center"), " does not match the ", "dimension of ", sQuote("x")) x <- sweep(x, 2, center) icent <- 0 } sdlist <- .Fortran("rlds", n = as.integer(n), p = as.integer(p), nresamp = as.integer(nresamp), x = as.double(x), tune = as.double(tune), wk = as.double(wk), center = as.double(locat), cov = covmat, maxres = as.integer(maxres), nresper = as.integer(nresper), weights = as.double(w), outlyingness = as.double(z), icent = as.integer(icent), iwork = as.integer(iwork), PACKAGE = "rrcov") dist <- mahalanobis(x, center = if(length(center) > 1) rep(0, p) else sdlist$center, cov = sdlist$cov) consistency.correction <- median(dist) / qchisq(.5, p) sdlist$cov <- sdlist$cov * consistency.correction sdlist$dist <- dist / consistency.correction if(length(center) > 1) sdlist$center <- center sdlist[c("cov", "center", "dist")] } covRob.control <- function(estim, ...) { estim <- casefold(estim) control <- list(...) control$estim <- estim if(estim == "donostah") { if(is.null(control$nresamp)) control$nresamp <- "auto" if(is.null(control$maxres)) control$maxres <- "auto" if(is.null(control$random.sample)) control$random.sample <- FALSE if(is.null(control$center)) control$center <- TRUE if(is.null(control$tune)) control$tune <- 0.95 if(is.null(control$prob)) control$prob <- 0.99 if(is.null(control$eps)) control$eps <- 0.5 control <- control[c("estim", "nresamp", "maxres", "random.sample", "center", "tune", "prob", "eps")] } else if(estim == "mcd" || estim == "weighted") { ## For backwards compatibility we support the use of quan and ntrial ## ## to specify alpha and nsamp for estim = "mcd", estim = "weighted" ## ## and estim = "M". Providing both quan and alpha or both ntrial and ## ## nsamp will result in an error. ## if(is.null(control$alpha)) control$alpha <- ifelse(is.null(control$quan), 0.5, control$quan) if(is.null(control$nsamp)) control$nsamp <- ifelse(is.null(control$ntrial), 500, control$ntrial) if(is.null(control$trace)) control$trace <- FALSE if(is.null(control$use.correction)) control$use.correction <- TRUE if(is.null(control$tolSolve)) control$tolSolve <- 1e-14 if(is.null(control$seed)) control <- control[c("estim", "alpha", "nsamp", "trace", "use.correction", "tolSolve")] else control <- control[c("estim", "alpha", "nsamp", "seed", "trace", "use.correction", "tolSolve")] } else if(estim == "m") { if(is.null(control$alpha)) control$alpha <- ifelse(is.null(control$quan), 0.5, control$quan) if(is.null(control$nsamp)) control$nsamp <- ifelse(is.null(control$ntrial), 500, control$ntrial) if(is.null(control$trace)) control$trace <- FALSE if(is.null(control$use.correction)) control$use.correction <- TRUE if(is.null(control$tolSolve)) control$tolSolve <- 1e-14 if(is.null(control$seed)) init.control <- control[c("estim", "alpha", "nsamp", "trace", "use.correction", "tolSolve")] else init.control <- control[c("estim", "alpha", "nsamp", "seed", "trace", "use.correction", "tolSolve")] init.control$estim = "mcd" control$init.control <- init.control if(is.null(control$r)) control$r <- 0.45 if(is.null(control$arp)) control$arp <- 0.05 if(is.null(control$eps)) control$eps <- 1e-03 if(is.null(control$maxiter)) control$maxiter <- 120 control <- control[c("estim", "r", "arp", "eps", "maxiter", "init.control")] } else control <- control["estim"] control } rrcov/R/PcaLocantore.R0000644000176200001440000001604414131112155014302 0ustar liggesuserssetClass("PcaLocantore", representation(delta = "numeric", quan = "numeric"), contains="PcaRobust") setMethod("getQuan", "PcaLocantore", function(obj) obj@n.obs) ## The S3 version PcaLocantore <- function (x, ...) UseMethod("PcaLocantore") PcaLocantore.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a `standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaLocantore.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaLocantore") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaLocantore.default <- function(x, k=ncol(x), kmax=ncol(x), delta = 0.001, na.action = na.fail, scale=FALSE, signflip=TRUE, crit.pca.distances=0.975, trace=FALSE, ...) { cl <- match.call() if(missing(x)){ stop("You have to provide at least some data") } y <- data <- x <- as.matrix(x) n <- nrow(y) p <- ncol(y) ## ## verify and set the input parameters: k and kmax ## myrank <- rankMM(x) kmax <- max(min(floor(kmax), myrank),1) if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } if(k != 0) k <- min(k, ncol(data)) ###################################################################### ## VT::4.08.2016 ## if scale = TRUE, scale with mad, otherwise scale can be a vector ## of length p, or a function ## use the undocumented function doScale() from robustbase ## if(is.logical(scale)) scale <- if(scale) mad else NULL if(!is.null(scale)) { x.scaled <- doScale(x, center=NULL, scale=scale) sc <- x.scaled$scale data <- x.scaled$x }else { sc <- vector('numeric', p) + 1 data <- x } ## if(is.logical(scale)) ## { ## if(scale) ## { ## sc <- apply(x, 2L, sd) ## data <- sweep(data, 2L, sc, "/", check.margin=FALSE) ## } ## } ## else if(is.numeric(scale) && length(scale) == p) ## { ## data <- sweep(data, 2L, scale, "/", check.margin = FALSE) ## sc <- scale ## } ## else stop("length of 'scale' must equal the number of columns of 'x'") ## attr(data, "scaled:scale") <- sc ## Center with the spatial median and project on the sphere spa = spatial.median(data, delta) mu = spa$mu ep = spa$ep tt = matrix(mu, n, p, byrow=TRUE) data = data-tt for(i in 1:n) { z = sqrt(sum((data[i, ])^2)) y[i, ] = 0 * data[i, ] if(z > ep) { y[i, ] = (data[i, ] )/z } } ## no scaling - we have already scaled with MAD if(k == 0) # let PcaClassic guess the number of components to select { out = PcaClassic(y, k=k, kmax=kmax, scale=FALSE, signflip=signflip, ...) k <- out@k } ## This will return all components, later we will select the first k out = PcaClassic(y, scale=FALSE, signflip=signflip, ...) scores = y %*% out@loadings # these are (slightly) diferent from the scores returned by PcaClassic # because PcaClassic will center by the mean the already centered data # use these scores to compute the standard deviations (mad) sdev = apply(scores, 2, "mad") names2 = names(sdev) orsdev = order(sdev) # sort the sdevs (although almost always they will be sorted) orsdev = rev(orsdev) # use them to sort the loadings, etc. sdev = sdev[orsdev] scores = scores[,orsdev, drop=FALSE] loadings = out@loadings[,orsdev, drop=FALSE] names(sdev)=names2 dimnames(scores)[[2]]=names2 dimnames(loadings)[[2]]=names2 ## scale is a vector of 1s with length p (if FALSE), a vector with column mad (if TRUE) or ## any other vector with length p (posibly computed by doScale()) scale <- sc center <- doScale(t(as.vector(mu)), center=NULL, scale=1/scale)$x # rescale back to the original data scores <- doScale(x, center, scale)$x %*% loadings # compute the scores scores <- scores[, 1:k, drop=FALSE] # select only fist k loadings <- loadings[, 1:k, drop=FALSE] eigenvalues <- (sdev^2)[1:k] eig0 <- sdev^2 totvar0 <- sum(eig0) ###################################################################### names(eigenvalues) <- NULL if(is.list(dimnames(data))) { ##dimnames(scores)[[1]] <- dimnames(data)[[1]] rownames(scores) <- rownames(data) } dimnames(scores)[[2]] <- as.list(paste("PC", seq_len(ncol(scores)), sep = "")) dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) ## fix up call to refer to the generic, but leave arg name as cl[[1]] <- as.name("PcaLocantore") res <- new("PcaLocantore", call=cl, rank=myrank, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=scale, scores=scores, k=k, n.obs=n, eig0=eig0, totvar0=totvar0) ## Compute distances and flags res <- pca.distances(res, x, p, crit.pca.distances) return(res) } ## computes the spatial median spatial.median <- function(x, delta) { dime = dim(x) n=dime[1] p=dime[2] delta1=delta*sqrt(p) mu0=apply(x,2,median) h=delta1+1 tt=0 while(h>delta1) { tt=tt+1 TT=matrix(mu0,n,p,byrow=TRUE) U=(x-TT)^2 w=sqrt(apply(U,1,sum)) w0=median(w) ep=delta*w0 z=(w<=ep) w[z]=ep w[!z]=1/w[!z] w=w/sum(w) x1=x for(i in 1:n) x1[i,]=w[i]*x[i,] mu=apply(x1,2,sum) h=sqrt(sum((mu-mu0)^2)) mu0=mu } out=list(mu=mu0,ep=ep) out } rrcov/R/AllClasses.R0000644000176200001440000004247114131110414013755 0ustar liggesuserssetClass("PsiFun", representation(n = "numeric", p = "numeric", r = "numeric", alpha = "numeric", c1 = "numeric")) setClass("PsiBwt", representation(M = "numeric"), contains="PsiFun") ## Define class unions for optional slots, e.g. for definition ## of slots which will be computed on demand, like the ## mahalanobis/robust distances setClassUnion("Uvector", c("vector", "NULL")) setClassUnion("Unumeric", c("numeric", "NULL")) setClassUnion("Cnumeric", c("numeric", "character")) setClassUnion("Umatrix", c("matrix", "NULL")) setClassUnion("Ulist", c("list", "NULL")) setClassUnion("Ufunction", c("function", "character", "NULL")) setClassUnion("Utable", c("table", "NULL")) ## This is a virtual base class for control objects. Each robust ## method like CovMest, CovOgk, etc. will derive a subclass with ## the necessary control parameters, e.g. CovControlMest will ## contain the control parameters for CovMest. setClass("CovControl", representation(trace="logical", tolSolve="numeric", "VIRTUAL")) setClassUnion("UCovControl", c("CovControl", "NULL")) setClass("Cov", representation(call = "language", cov = "matrix", center = "vector", det = "numeric", n.obs = "numeric", mah = "Uvector", flag = "Uvector", method = "character", singularity = "Ulist", X = "Umatrix", "VIRTUAL"), prototype=list(det=-1)) setClassUnion("UCov", c("Cov", "NULL")) setClass("SummaryCov", representation(covobj = "Cov", evals = "vector")) setClass("CovClassic", contains="Cov") setClass("CovRobust", representation(iter="numeric", crit="numeric", wt="Uvector", "VIRTUAL"), contains="Cov") setClass("SummaryCovRobust", representation(), contains="SummaryCov") setClass("CovMest", representation(vt="vector"), contains="CovRobust") setClass("CovMcd", representation(alpha = "numeric", quan = "numeric", best = "Uvector", raw.cov = "matrix", raw.center = "vector", raw.mah = "Uvector", raw.wt = "Uvector", raw.cnp2 = "numeric", cnp2 = "numeric"), contains="CovRobust") setClass("CovMrcd", representation(alpha = "numeric", quan = "numeric", best = "Uvector", cnp2 = "numeric", icov = "matrix", rho = "numeric", target="matrix"), contains="CovRobust") setClass("CovOgk", representation(raw.cov = "matrix", raw.center = "vector", raw.mah = "Uvector", raw.wt = "Uvector"), contains="CovRobust") setClass("CovMve", representation(alpha = "numeric", quan = "numeric", best = "Uvector", raw.cov = "matrix", raw.center = "vector", raw.mah = "Uvector", raw.wt = "Uvector", raw.cnp2 = "numeric", cnp2 = "numeric"), contains="CovRobust") setClass("CovSest", representation(iBest = "numeric", nsteps = "Uvector", initHsets = "Umatrix", cc = "numeric", kp = "numeric"), contains="CovRobust") setClass("CovSde", representation(), contains="CovRobust") setClass("CovMMest", representation(c1 ="numeric", sest = "CovSest"), contains="CovRobust") ## Control parameters for CovMcd setClass("CovControlMcd", representation(alpha="numeric", nsamp="Cnumeric", scalefn="Ufunction", maxcsteps="numeric", seed="Uvector", use.correction="logical"), prototype = list(alpha=0.5, nsamp=500, scalefn=NULL, maxcsteps=200, seed=NULL, trace=FALSE, tolSolve=1e-14, use.correction=TRUE), contains="CovControl") ## Control parameters for CovMrcd setClass("CovControlMrcd", representation(alpha="numeric", h="Unumeric", maxcsteps="numeric", rho="Unumeric", target = "character", maxcond = "numeric"), prototype = list(alpha=0.5, h=NULL, maxcsteps=200, rho=NULL, target="identity", maxcond=50, trace=FALSE, tolSolve=1e-14), contains="CovControl") ## Control parameters for CovMest setClass("CovControlMest", representation(r="numeric", arp="numeric", eps="numeric", maxiter="numeric"), prototype = list(r=0.45, arp=0.05, eps=1e-3, maxiter=120, trace=FALSE, tolSolve=1e-14), contains="CovControl" ) ## Control parameters for CovOgk ## ## Computes robust univariate mu and sigmma of the vector x ## - sigma: tau scale Yohai and Zamar (1988) - a truncated ## standard deviation ## - mu: weighted mean ## ## Returns a vector of length two with the calculated mu and sigma ## .mrobTau <- function(x, c1 = 4.5, c2 = 3.0, ...) #c2=2.36075 { return(scaleTau2(x, mu.too=TRUE)) # use scaleTau2 from package robustbase if(FALSE) { m0 <- median(x) # MED s0 <- median(abs(x - m0)) # MAD r <- abs(x-m0)/s0 wt <- (1 - (r/c1)^2)^2 wt <- ifelse(r <= c1, wt, 0) # wt = weigths w(x,c1) m <- sum(x*wt)/sum(wt) # mu = weighted mean r <- (x-m)/s0 r <- r^2 r[r > c2^2] <- c2^2 # rho(x,c2) s2 <- s0^2 / length(x) * sum(r) # sigma = tau scale (Yohai&Zamar 1988) # truncated standard deviation c(m, sqrt(s2)) } } ## ## Compute a robust estimate of the covariance of two random ## variables x1 and x2. ## Use the estimate defined by Gnanadesikan and Kettenring (1972): ## cov(X,Y)=1/4 * (sigma(X+Y)^2 - sigma(X-Y)^2) ## where sigma is a robust univariate scale. ## As sigma is used the tau scale estimate defined above - mrobTau() ## .vrobGK <- function(x1, x2, ...) { (.mrobTau(x1+x2, ...)[2]^2 - .mrobTau(x1-x2, ...)[2]^2)/4.0 } setClass("CovControlOgk", representation(niter="numeric", beta="numeric", mrob="Ufunction", # mrob=.mrobTau vrob="Ufunction", # vrob=.vrobGK smrob="character", svrob="character"), prototype = list(niter=2, beta=0.90, mrob=NULL, vrob=.vrobGK, smrob="scaleTau2", svrob="gk", trace=FALSE, tolSolve=1e-14), contains="CovControl" ) ## Control parameters for CovMve setClass("CovControlMve", representation(alpha="numeric", nsamp="numeric", seed="Uvector"), prototype = list(alpha=0.5, nsamp=500, seed=NULL, trace=FALSE, tolSolve=1e-14), contains="CovControl") ## Control parameters for CovSest setClass("CovControlSest", representation(bdp="numeric", arp="numeric", eps="numeric", maxiter="numeric", nsamp="numeric", seed="Uvector", method="character"), prototype = list(bdp=0.5, arp=0.1, eps=1e-5, maxiter=120, nsamp=500, seed=NULL, trace=FALSE, tolSolve=1e-14, method="sfast"), contains="CovControl") CovControlSest <- function (bdp=0.5, arp=0.1, eps=1e-5, maxiter=120, nsamp=500, seed=NULL, trace=FALSE, tolSolve=1e-14, method="sfast") { new("CovControlSest", bdp=bdp, arp=arp, eps=eps, maxiter=maxiter, nsamp=nsamp, seed=seed, trace=trace, tolSolve=tolSolve, method=method) } ## Control parameters for CovSde setClass("CovControlSde", representation(nsamp="numeric", maxres="numeric", tune="numeric", eps="numeric", prob="numeric", seed="Uvector"), prototype = list(tune=0.95, eps=0.5, prob=0.99, seed=NULL, trace=FALSE, tolSolve=1e-14), contains="CovControl") ## Control parameters for CovMMest setClass("CovControlMMest", representation(bdp="numeric", eff="numeric", maxiter="numeric", sest="CovControlSest"), prototype = list(bdp=0.5, eff=0.95, maxiter=50, sest=CovControlSest(), trace=FALSE, tolSolve=10e-14), contains="CovControl" ) ###################### PCA #################################### setClass("Pca", representation(call = "language", center = "vector", scale = "Uvector", rank = "numeric", loadings = "matrix", eigenvalues = "vector", scores = "matrix", k = "numeric", sd = "Uvector", od = "Uvector", cutoff.sd = "numeric", cutoff.od = "numeric", crit.pca.distances = "numeric", flag = "Uvector", n.obs = "numeric", eig0 = "vector", totvar0 = "numeric", "VIRTUAL")) setClass("SummaryPca", representation(pcaobj = "Pca", importance ="matrix")) setClass("PcaClassic", contains="Pca") setClass("PcaRobust", representation("VIRTUAL"), contains="Pca") setClass("PcaHubert", representation(alpha = "numeric", quan = "numeric", skew = "logical", ao = "Uvector"), contains="PcaRobust") setClass("PcaLocantore", representation(), contains="PcaRobust") setClass("PcaCov", representation(quan = "numeric"), contains="PcaRobust") setClass("PcaProj", representation(), contains="PcaRobust") setClass("PcaGrid", representation(), contains="PcaRobust") ###################### LDA #################################### setClass("Lda", representation(call = "language", prior = "vector", counts = "vector", center = "matrix", cov = "matrix", ldf = "matrix", ldfconst = "vector", method = "character", X = "Umatrix", grp = "factor", covobj = "UCov", control = "UCovControl", "VIRTUAL")) setClass("SummaryLda", representation(ldaobj = "Lda")) setClass("LdaClassic", contains="Lda") setClass("LdaRobust", representation("VIRTUAL"), contains="Lda") setClass("PredictLda", representation(classification = "factor", posterior = "matrix", x = "matrix", ct="Utable")) setClass("Linda", representation( l1med = "logical"), contains="LdaRobust") setClass("LdaPP", representation( raw.ldf = "matrix", raw.ldfconst = "vector"), contains="LdaRobust") ###################### QDA #################################### setClass("Qda", representation(call = "language", prior = "vector", counts = "vector", center = "matrix", cov = "array", covinv = "array", covdet = "vector", method = "character", X = "Umatrix", grp = "factor", control = "UCovControl", "VIRTUAL")) setClass("SummaryQda", representation(qdaobj = "Qda")) setClass("QdaClassic", contains="Qda") setClass("QdaRobust", representation("VIRTUAL"), contains="Qda") setClass("PredictQda", representation(classification = "factor", posterior = "matrix", x = "matrix", ct="Utable")) setClass("QdaCov", contains="QdaRobust") rrcov/R/QdaClassic.R0000644000176200001440000001046612763517421013757 0ustar liggesusers## The S3 version QdaClassic <- function (x, ...) UseMethod("QdaClassic") QdaClassic.formula <- function(formula, data, ..., subset, na.action) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- QdaClassic.default(x, grouping, ...) ## res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as formula cl <- match.call() cl[[1]] <- as.name("QdaClassic") res@call <- cl ## res$contrasts <- attr(x, "contrasts") ## res$xlevels <- .getXlevels(Terms, m) ## res$na.action <- attr(m, "na.action") res } QdaClassic.default <- function(x, grouping, prior = proportions, tol = 1.0e-4, ...) { if(is.null(dim(x))) stop("x is not a matrix") xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(length(grouping) == 1) { # this is the number of groups and the groups are of equal size ng = grouping ni = n/ng if(ng*ni < n) stop("nrow(x) is not divisible by the number of groups") grouping <- rep(0,0) for(i in 1:ng) grouping <- c(grouping, rep(i,ni)) }else if(length(grouping) > 1 && length(grouping) < n) { # grouping contains a vector with the group sizes ng <- length(grouping) if(sum(grouping) != n) stop("nrow(x) is not equal to n1+n2+...+nn") gx <- rep(0,0) for(i in 1:ng) gx <- c(gx, rep(i,grouping[i])) grouping <- gx } if(n != length(grouping)) stop("nrow(x) and length(grouping) are different") g <- as.factor(grouping) lev <- lev1 <- levels(g) counts <- as.vector(table(g)) if(!missing(prior)) { if(any(prior < 0) || round(sum(prior), 5) != 1) stop("invalid prior") if(length(prior) != nlevels(g)) stop("prior is of incorrect length") prior <- prior[counts > 0] } if(any(counts == 0)) { warning(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) lev1 <- lev[counts > 0] g <- factor(g, levels=lev1) counts <- as.vector(table(g)) } proportions <- counts/n ng <- length(proportions) names(g) <- NULL names(prior) <- levels(g) xcov <- .allcovClass(x, grouping) ## inv <- solve(xcov$wcov) ## ldf <- xcov$means %*% inv ## ldfconst <- diag(log(prior) - ldf %*% t(xcov$means)/2) return (new("QdaClassic", call=xcall, prior=prior, counts=counts, center=xcov$means, cov=xcov$cov, covinv=xcov$covinv, covdet=xcov$covdet, method="Quadratic Discriminant Analysis (QDA)", control=NULL, X=x, grp=g)) } .allcovClass <- function(x, grouping){ xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) dimn <- dimnames(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts/n) # compute group means and covariance matrices for each group mX <- matrix(0,ng,p) covX <- array(0,c(p,p,ng)) covInv <- array(0,c(p,p,ng)) covdet <- vector(mode="numeric", length=ng) for(i in 1:ng){ tmpc <- cov.wt(as.matrix(x[which(g == lev[i]),])) mX[i,] <- tmpc$center covX[,,i] <- tmpc$cov covInv[,,i] <- solve(tmpc$cov) covdet[i] <- det(tmpc$cov) } dimnames(mX) <- list(levels(g), dimn[[2]]) dimnames(covX) <- list(dimn[[2]], dimn[[2]], levels(g)) dimnames(covInv) <- list(dimn[[2]], dimn[[2]], levels(g)) names(covdet) <- levels(g) ans <- list(call=xcall, means=mX, cov=covX, covinv=covInv, covdet=covdet) class(ans) <- "allcov" return(ans) } rrcov/R/detmrcd.R0000644000176200001440000005663014040126773013371 0ustar liggesusers## @title Compute the Minimum Regularized Covariance Determinant (MRCD) estimator ## @references Paper available at: http://dx.doi.org/10.2139/ssrn.2905259. ## @param x a numerical matrix. The columns represent variables, and rows represent observations. ## @param alpha the proportion of the contamination (between 0.5 and 1) ## @param h the size of the subset (between ceiling(n/2) and n) ## @param initHsets NULL or a K x h integer matrix of initial subsets of observations ## of size h (specified by the indices in 1:n). If provided, then the initial ## shape estimates are not calculated. ## @param save.hsets ## @param maxcsteps maximum number of generalized C-steps for each initial subset (default 200) ## @param maxcond maximum condition number allowed (see step 3.4 in algorithm 1) (default 50) ## @param minscale minimum scale allowed (default 0.001) ## @param target = c("identity", "equicorrelation"). Structure of the robust ## positive definite target matrix: (default) "identity": target matrix is ## diagonal matrix with robustly estimated univariate scales on the diagonal or ## "equicorrelation": non-diagonal target matrix that incorporates an ## equicorrelation structure (see (17) in paper) ## @param trace ## @return A list with the following elements: ## \describe{ ## \item{icov}{inverse of the covariance matrix} ## \item{rho}{regularization parameter} ## \item{target}{the target matrix used} ## } ## .detmrcd <- function(x, h=NULL, alpha=.75, rho=NULL, maxcond=50, minscale=0.001, target=0, maxcsteps = 200, hsets.init=NULL, save.hsets=missing(hsets.init), full.h = save.hsets, trace=FALSE) { ## NOTES: VT ## ## - use r6pack from robustbase ## - X check subset #5 - something is wrong there ## - X mX is not back transformed to compensate the SVD rescaling ## ==> the distances returned by MWRCD are different from ## the distances computed outside of MWRCD. ## ## - X MRCD works with the transposed matrix X - it shoould be transposed inside the function ## - Help of CovMcd - remove data.matrix from the example ## - X What is doing the parameter 'bc'? Can be omitted - bc removed ## - X parameter 'initrho' is never used: remove it ## - X scfactor(alpha, p) is equivalent to robustbase:::.MCDcons(p, alpha) - replaced ## - X condnumber () is never used - remove it - removed ## - X robustbase:::r6pack() will not work for p > n, because there is a check svd$rank < p - comment out the check ## - X using kendal's tau cor.fk from pcaPP - replace by spearman. Later we could move cor.fk() from pcaPP into robustbase ## - X No SVD if the target matrix is the Identity; if equicorrelation, the eigenvectors are a helmert matrix ##---------------------------------------------------------------- ## @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, adjust.eignevalues=TRUE, scaled=TRUE, scalefn=Qn) { ## 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 <- robustbase:::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) ## VT::15.11.2019 ## No need of the code below in MRCD. ## Instead of computing md and sorting, just return hsets. ## if(!adjust.eignevalues) return (hsets) ## 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) ## VT::15.10.2018 - we do not need this check, because we are using r6pack ## also for MRCD. Comment it out , maybe should move it to detmcd: FIXME ## 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 } # Return target correlation matrix with given structure # input: # mX: the p by n matrix of the data # target: structure of the robust positive definite target matrix (default=1) # 0: identity matrix # 1: non-diagonal matrix with an equicorrelation structure (see (17) in paper) # output: # the target correlation matrix .TargetCorr <- function(mX, target=1, mindet=0) { p <- dim(mX)[1] I <- diag(1, p) if(target == 0){ R <- I } else if(target == 1) { ## cortmp <- cor.fk(t(mX)) # from pcaPP ## cortmp <- cor(t(mX), method="kendal") # very slow cortmp <- cor(t(mX), method="spearman") cortmp <- sin(1/2 * pi * cortmp) constcor <- mean(cortmp[upper.tri(cortmp, diag=FALSE)]) # KB: add bound to ensure positive definiteness; see paper page 7, below (17) if(constcor <= min(c(0, (-1/(p-1) + 0.01)))){ constcor <- min(c(0,(-1/(p-1) + 0.01))) } J <- matrix(1, p, p) R <- constcor * J + (1-constcor) * I } return(R) } eigenEQ <- function(T) { rho <- T[1,2] d <- ncol(T) helmert <- matrix(0, nrow=d, ncol=d) helmert[, 1] <- rep(1/sqrt(d), d) for(j in 2:ncol(helmert)) { helmert[1:(j-1), j] <- 1/sqrt(j*(j-1)) helmert[j, j] <- -(j-1)/sqrt(j*(j-1)) } out <- NULL out$values <- c(1 + (d-1)*rho, rep(1-rho, d-1)) out$vectors <- helmert out } # compute the regularized covariance # input: # XX, the p by n (or h) matrix of the data (not necessarily demeaned) # vMu: the initial mean (p-vector) # rho: the regularization parameter # mT: the target matrix # scfac: the scaling factor # bcd: diagonal matrix used for rescaling (ratio of scales of target and mcd component) # target: structure of the robust positive definite target matrix (default=1) # 0: identity matrix # 1: non-diagonal matrix with an equicorrelation structure (see (17) in paper) # invert: if true, gives also inverted regularized covariance # # output (a list): # rho: the regularization parameter # mT: the target matrix # cov: the covariance matrix based on subset (without regularization step) # rcov: the regularized covariance matrix # inv_rcov: the inverse of the regularized covariance matrix (if invert=True) .RCOV <- function(XX, vMu, rho=NULL, mT, scfac, target=1, invert=FALSE) { mE <- XX-vMu n <- dim(mE)[2] p <- dim(mE)[1] mS <- mE %*% t(mE)/n rcov <- rho * mT + (1-rho) * scfac * mS if(invert) { if(p > n) { nu <- (1-rho) * scfac mU <- mE/sqrt(n) inv_rcov <- .InvSMW(rho=rho, mT=mT, nu=nu, mU=mU) }else { inv_rcov = chol2inv(chol(rcov)) } return(list(rho=rho, mT=mT, cov=mS, rcov=rcov, inv_rcov=inv_rcov)) } else return(list(rho=rho, mT=mT, cov=mS, rcov=rcov)) } ## Compute inverse of covariance matrix using Sherman-Morrison-Woodbury ## identity when dimension is larger than sample size # # input: # rho: the regularization parameter # mT: the target matrix # nu: the scaling factor multiplied with (1-rho) # mU: the scaled data # output: # the inverse of the covariance matrix .InvSMW <- function(rho, mT, nu, mU) { p = dim(mT)[1] pp = dim(mU) vD = sqrt(diag(mT)) imD = diag(vD^(-1)) R = imD %*% mT %*% imD constcor = R[2, 1] I = diag(1, p) J = matrix(1, p, p) imR = 1/(1-constcor) * (I - constcor/(1 + (p-1) * constcor) * J) imB = (rho)^(-1) * imD %*% imR %*% imD Temp <- base::chol2inv(base::chol(diag(pp[2]) + nu * (t(mU) %*% (imB %*% mU)))) return(imB - (imB%*%mU) %*% (nu * Temp) %*% (t(mU)%*%imB)) } # Apply generalized C-steps to obtain optimal subset # input: # mX: the p by T matrix of the residuals or data, not necessarily demeaned # rho: the regularization parameter # mT: the target matrix # target: structure of the robust positive definite target matrix (default=1) # 0: identity matrix # 1: non-diagonal matrix with an equicorrelation structure (see (17) in paper) # vMu: the initial mean (as vector) # mIS: the p by p matrix of the initial inverted covariance # h: the size of the subset OR alpha: the proportion of the contamination # maxcsteps: the maximal number of iteration of the C-step algorithm # index: the initial subset H_0 # output (a list) # index: the optimal h-subset # numit: the number of iterations # mu: the vector with means # cov: the regularized covariance estimate # icov: the inverse of the regularized covariance matrix # rho: the regularization parameter # mT: the target matrix # dist: the Mahalanobis distances using the MRCD estimates # scfac: the scaling factor .cstep_mrcd <- function(mX, rho=NULL, mT=NULL, target=1, vMu=NULL, mIS=NULL, h, scfac, index=NULL, maxcsteps=50) { n <- dim(mX)[2] p <- dim(mX)[1] # random choice if(is.null(index)) index <- sample(1:n, h) # if no index is given we sample one... XX <- mX[, index] # p x h if(is.null(vMu)) vMu = rowMeans(XX) if(is.null(mIS)){ ret = .RCOV(XX=XX, vMu=vMu, rho=rho, mT=mT, scfac=scfac, target=target, invert=T) mIS = ret$inv_rcov } vdst = diag(t(mX-vMu) %*% (mIS %*% (mX-vMu))) #vdst = apply(mX-vMu,2,ftmp) index = sort(sort.int(vdst, index.return=T)$ix[1:h]) iter = 1 while(iter < maxcsteps){ XX <- mX[,index] vMu <- rowMeans(XX) ret <- .RCOV(XX=XX, vMu=vMu, rho=rho, mT=mT, target=target, scfac=scfac, invert=T) mIS <- ret$inv_rcov vdst <- diag(t(mX-vMu) %*% (mIS %*% (mX-vMu))) nndex <- sort(sort.int(vdst,index.return=T)$ix[1:h]) if(all(nndex == index)) break index <- nndex iter <- iter+1 } return(list(index=index, numit=iter, mu=vMu, cov=ret$rcov, icov=ret$inv_rcov, rho=ret$rho, mT=ret$mT, dist=vdst, scfac=scfac)) } mX <- t(x) # we want the transposed data matrix ## several parametrs which we do not want toexpose to the user. mindet <- 0 # minimum determinant allowed for target matrix objective <- "geom" # objective function to determine optimal subset, see (3) in paper # 'det': typically one minimizes the determinant of the sample covariance based on the subset # 'geom': p-th root of determinant or standardized generalized variance (for numerical reasons) n <- dim(mX)[2] p <- dim(mX)[1] if(!is.null(h)) alpha <- h/n else if(!is.null(alpha)) h <- ceiling(alpha*n) else stop("Either 'h' (number of observations in a subset) or 'alpha' (proportion of observations) has to be supplied!") if(alpha < 1/2 | alpha > 1) stop("'alpha' must be between 0.5 and 1.0!") ## VT::21.04.2021 - h has to be an integer (a non-integer h will break the sprintf at the end). h <- as.integer(h) # choose objective function to determine optimal subset if (objective == 'det'){ obj <- function(x) det(x) }else if (objective == 'geom'){ obj <- function(x) { det(x)^(1/p) } #geometric mean of eigenvalues } ## 1. Standardize the p variables: compute standardized observations u_i, see (6) in paper, using median and Qn estimator vmx <- apply(mX, 1, median) vsd <- apply(mX, 1, Qn) vsd[vsd < minscale] <- minscale Dx <- diag(vsd) mU <- scale(t(mX), center=vmx, scale=vsd) mX <- t(mU) mT <- .TargetCorr(mX, target=target, mindet=mindet) ## 2. Perform singular value decomposition of target matrix and compute observations w_i if(target == 1){ mTeigen <- eigenEQ(mT) mQ <- mTeigen$vectors mL <- diag(mTeigen$values) msqL <- diag(sqrt(mTeigen$values)) misqL <- diag(sqrt(mTeigen$values)^(-1)) mW <- mU %*% mQ %*% misqL mX <- t(mW) } mT = diag(p) ## 3.1-3.2 Follow Hubert et al. (2012) to obtain 6 initial ## scatter matrices (if scatter matrix is not invertible, ## use its regularized version) ## 3.3 Determine subsets with lowest Mahalanobis distance ## Assume that 'hsets.init' already contains h-subsets: the first h observations each ## VT::15.11.2019 - added adjust.eignevalues=FALSE, this will set automatically full.h=FALSE if(is.null(hsets.init)) { hsets.init <- r6pack(x=t(mX), h=h, full.h=FALSE, adjust.eignevalues=FALSE, scaled=FALSE, scalefn=Qn) 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") if(full.h && dh[1] != n) warning("'full.h' is true, but 'hsets.init' has less than n rows") if(min(hsets.init) < 1 || max(hsets.init) > n) stop("'hsets.init' must be in {1,2,...,n}; n = ", n) } hsets.init <- hsets.init[1:h, ] scfac <- .MCDcons(p, h/n) # for consistency with MCD ## 3.4 Determine smallest value of rho_i for each subset rho6pack <- condnr <- c() nsets <- ncol(hsets.init) if(is.null(rho)) { for(k in 1:nsets){ mXsubset <- mX[ , hsets.init[, k]] vMusubset <- rowMeans(mXsubset) mE <- mXsubset-vMusubset mS <- mE%*%t(mE)/(h-1) if(all(mT == diag(p))) { veigen <- eigen(scfac * mS)$values e1 <- min(veigen) ep <- max(veigen) fncond <- function(rho) { condnr <- (rho + (1-rho) * ep) / (rho + (1-rho) * e1) return(condnr - maxcond) } } else { fncond <- function(rho) { rcov <- rho*mT + (1-rho) * scfac * mS temp <- eigen(rcov)$values condnr <- max(temp) / min(temp) return(condnr - maxcond) } } out <- try(uniroot(f=fncond, lower=0.00001, upper=0.99), silent=TRUE) if(class(out) != "try-error") { rho6pack[k] <- out$root }else { grid <- c(0.000001, seq(0.001, 0.99, by=0.001), 0.999999) if(all(mT == diag(p))) { objgrid <- abs(fncond(grid)) irho <- min(grid[objgrid == min(objgrid)]) }else { objgrid <- abs(apply(as.matrix(grid), 1, "fncond")) irho <- min(grid[objgrid == min(objgrid)]) } rho6pack[k] <- irho } } ## 3.5 Set rho as max of the rho_i's obtained for each subset in previous step cutoffrho <- max(c(0.1, median(rho6pack))) rho <- max(rho6pack[rho6pack <= cutoffrho]) Vselection <- seq(1, nsets) Vselection[rho6pack > cutoffrho] = NA if(sum(!is.na(Vselection)) == 0){ stop("None of the initial subsets is well-conditioned") } initV <- min(Vselection, na.rm=TRUE) setsV <- Vselection[!is.na(Vselection)] setsV <- setsV[-1] }else{ setsV <- 1:ncol(hsets.init) initV <- 1 } ## 3.6 For each of the six initial subsets, repeat the generalized ## C-steps (from Theorem 1) until convergence ## ## 3.7 Choose final subset that has lowest determinant among the ## ones obtained from the six initial subsets hset.csteps <- integer(nsets) ret <- .cstep_mrcd(mX=mX, rho=rho, mT=mT, target=target, h=h, scfac=scfac, index=hsets.init[, initV], maxcsteps=maxcsteps) objret <- obj(ret$cov) hindex <- ret$index best6pack <- initV for(k in setsV){ if(trace) { if(trace >= 2) cat(sprintf("H-subset %d = observations c(%s):\n-----------\n", k, paste(hsets.init[1:h, k], collapse=", "))) else cat(sprintf("H-subset %d: ", k)) } tmp <- .cstep_mrcd(mX=mX, rho=rho, mT=mT, target=target, h=h, scfac=scfac, index=hsets.init[,k], maxcsteps=maxcsteps) objtmp <- obj(tmp$cov) hset.csteps[k] <- tmp$numit if(trace) cat(sprintf("%3d csteps, obj=log(det|.|)=%g", k, objtmp)) if(objtmp < objret){ if(trace) cat(" = new optim.\n") ret <- tmp objret <- objtmp hindex <- tmp$index best6pack <- k } else if(objtmp == objret) # store as well best6pack <- c(best6pack, k) else if(trace) cat("\n") } c_alpha <- ret$scfac #scaling factor mE <- mX[, hindex] - ret$mu weightedScov <- mE %*% t(mE)/(h-1) D <- c_alpha * diag(1, p) ## MRCD estimates of the standardized data W (inner part of (12) in paper) MRCDmu = rowMeans(mX[,hindex]) MRCDcov = rho*mT + (1-rho) * c_alpha * weightedScov ## Computing inverse of scaled covariance matrix, using SMW identity ## if data is fat (inner part of (14) and (15) in paper). if(p > n & target <= 1){ # !!!! formula InvSMW is used when T is equicorrelation nu <- (1-rho) * c_alpha mU <- mE/sqrt(h-1) iMRCDcov <- .InvSMW(rho=rho, mT=mT, nu=nu, mU=mU) }else iMRCDcov <- chol2inv(chol(MRCDcov)) ## Backtransforming the rescaling steps that we applied in ## the beginning (outer part of (11) and (12) in paper) # transformations due to SVD on target matrix if(target == 1) { ##VT::12.12 - corrected the restoration of X after SVD transformation mX <- t(t(mX) %*% msqL %*% t(mQ)) ## mX <- t(t(mX) %*% mQ %*% msqL) MRCDmu <- mQ %*% msqL %*% MRCDmu MRCDcov <- mQ %*% msqL %*% MRCDcov %*% msqL %*% t(mQ) iMRCDcov <- mQ %*% misqL %*% iMRCDcov %*% misqL %*% t(mQ) mT <- mQ %*% msqL %*% mT %*% msqL %*% t(mQ) } # transformations due to rescaling median and Qn mX <- t(t(mX) %*% Dx) + vmx MRCDmu <- Dx %*% MRCDmu + vmx MRCDcov <- Dx %*% MRCDcov %*% Dx mT <- Dx %*% mT %*% Dx iDx <- diag(1/diag(Dx)) iMRCDcov <- iDx %*% iMRCDcov %*% iDx ## Compute the Mahalanobis distances based on MRCD estimates dist <- mahalanobis(t(mX), center=MRCDmu, cov=iMRCDcov, inverted=TRUE) objret <- determinant(MRCDcov)$modulus[1] ret <- list(alpha=alpha, h=h, initmean=as.numeric(MRCDmu), initcovariance=MRCDcov, icov=iMRCDcov, rho=rho, best=hindex, mcdestimate=objret, mah=dist, target=mT, iBest = best6pack, n.csteps=hset.csteps, initHsets=if(save.hsets) hsets.init, calpha=c_alpha ) return (ret) } rrcov/R/psifun.R0000644000176200001440000000413712763517421013252 0ustar liggesusers## Internal functions, used for ## computing expectations ## .chiInt <- function(p,a,c1) ## partial expectation d in (0,c1) of d^a under chi-squared p return(exp(lgamma((p+a)/2)-lgamma(p/2))*2^{a/2}*pchisq(c1^2,p+a)) .chiInt2 <- function(p,a,c1) ## partial expectation d in (c1,\infty) of d^a under chi-squared p return(exp(lgamma((p+a)/2)-lgamma(p/2))*2^{a/2}*(1-pchisq(c1^2,p+a)) ) ## ## derivatives of the above functions wrt c1 ## .chiIntD <- function(p,a,c1) return(exp(lgamma((p+a)/2)-lgamma(p/2))*2^{a/2}*dchisq(c1^2,p+a)*2*c1) .chiInt2D <- function(p,a,c1) return(-exp(lgamma((p+a)/2)-lgamma(p/2))*2^{a/2}*dchisq(c1^2,p+a)*2*c1) setMethod("iterM", "PsiFun", function(obj, x, t1, s, eps=1e-3, maxiter=20){ ## M-estimation from starting point (t1, s) for translated ## biweight with median scaling (Rocke & Woodruf (1993)) ## - obj contains the weight function parameters, e.g. ## obj@c1 and obj@M are the constans for the translated ## biweight ## - eps - precision for the convergence algorithm ## - maxiter - maximal number of iterations # x <- as.matrix(x) n <- nrow(x) p <- ncol(x) crit <- 100 iter <- 1 w1d <- w2d <- rep(1,n) while(crit > eps & iter <= maxiter) { t.old <- t1 s.old <- s wt.old <- w1d v.old <- w2d ## compute the mahalanobis distances with the current estimates t1 and s d <- sqrt(mahalanobis(x, t1, s)) # Compute k = sqrt(d[(n+p+1)/2])/M # and ajust the distances d = sqrt(d)/k h <- (n+p+1)%/%2 d <- d*sqrt(qchisq(h/(n+1), p))/(sort(d)[h]) # compute the weights w1d <- wt(obj, d) w2d <- vt(obj, d) ## compute reweighted mean and covariance matrix t1 <- colSums(w1d*x)/sum(w1d) xx <- sqrt(w1d)*sweep(x, 2, t1) s <- p*(t(xx) %*% xx)/sum(w2d) ## check convergence crit <- max(abs(w1d-wt.old))/max(w1d) iter <- iter+1 } return(list(t1=t1, s=s, iter=iter, wt=w1d, vt=w2d)) }) rrcov/R/Pca.R0000644000176200001440000005273714200536711012451 0ustar liggesuserssetMethod("names", "Pca", function(x) slotNames(x)) setMethod("$", c("Pca"), function(x, name) slot(x, name)) setMethod("getCenter", "Pca", function(obj) obj@center) setMethod("getScale", "Pca", function(obj) obj@scale) setMethod("getLoadings", "Pca", function(obj) obj@loadings) setMethod("getEigenvalues", "Pca", function(obj) obj@eigenvalues) setMethod("getSdev", "Pca", function(obj) sqrt(obj@eigenvalues)) setMethod("getScores", "Pca", function(obj) obj@scores) setMethod("getPrcomp", "Pca", function(obj) { ret <- list(sdev=sqrt(obj@eigenvalues), rotation=obj@loadings, center=obj@center, scale=obj@scale, x=obj@scores) class(ret) <- "prcomp" ret }) ## ## Follow the standard methods: show, print, plot ## setMethod("show", "Pca", function(object) myPcaPrint(object)) setMethod("summary", "Pca", function(object, ...){ vars <- getEigenvalues(object) vars <- vars/sum(vars) ## If k < p, use the stored initial eigenvalues and total explained variance, if any if(length(vars) < object@rank) { if(length(object@eig0) > 0 && length(object@totvar0) > 0) { vars <- object$eig0/object$totvar0 vars <- vars[1:object$k] } else vars <- NULL } importance <- if(is.null(vars)) rbind("Standard deviation" = getSdev(object)) else rbind("Standard deviation" = getSdev(object), "Proportion of Variance" = round(vars,5), "Cumulative Proportion" = round(cumsum(vars), 5)) colnames(importance) <- colnames(getLoadings(object)) new("SummaryPca", pcaobj=object, importance=importance) }) setMethod("show", "SummaryPca", function(object){ cat("\nCall:\n") print(object@pcaobj@call) digits = max(3, getOption("digits") - 3) cat("Importance of components:\n") print(object@importance, digits = digits) if(nrow(object@importance) == 1) cat("\nNOTE: Proportion of Variance and Cumulative Proportion are not shown", "\nbecause the chosen number of components k =", object@pcaobj@k, "\nis smaller than the rank of the data matrix =", object@pcaobj@rank, "\n") invisible(object) }) ## setMethod("print", "Pca", function(x, ...) myPcaPrint(x, ...)) setMethod("predict", "Pca", function(object, ...){ predict(getPrcomp(object), ...) }) setMethod("screeplot", "Pca", function(x, ...){ pca.screeplot(x, ...) }) setMethod("biplot", "Pca", function(x, choices=1L:2L, scale=1, ...){ if(length(getEigenvalues(x)) < 2) stop("Need at least two components for biplot.") lam <- sqrt(getEigenvalues(x)[choices]) scores <- getScores(x) n <- NROW(scores) lam <- lam * sqrt(n) if(scale < 0 || scale > 1) warning("'scale' is outside [0, 1]") if(scale != 0) lam <- lam^scale else lam <- 1 xx <- t(t(scores[, choices]) / lam) yy <- t(t(getLoadings(x)[, choices]) * lam) .biplot(xx, yy, ...) invisible() }) setMethod("scorePlot", "Pca", function(x, i=1, j=2, ...){ pca.scoreplot(obj=x, i=i, j=j, ...) }) ## The __outlier map__ (diagnostic plot, distance-distance plot) ## visualizes the observations by plotting their orthogonal ## distance to the robust PCA subspace versus their robust ## distances within the PCA subspace. This allows to classify ## the data points into 4 types: regular observations, good ## leverage points, bad leverage points and orthogonal outliers. ## The outlier plot is only possible when k < r (the number of ## selected components is less than the rank of the matrix). ## Otherwise a __distance plot__ will be shown (distances against ## index). ## ## The __screeplot__ shows the eigenvalues and is helpful to select ## the number of principal components. ## ## The __biplot__ is plot which aims to represent both the ## observations and variables of a matrix of multivariate data ## on the same plot. ## ## The __scoreplot__ shows a scatterplot of i-th against j-th score ## of the Pca object with superimposed tollerance (0.975) ellipse ## ## VT::17.06.2008 ##setMethod("plot", "Pca", function(x, y="missing", setMethod("plot", signature(x="Pca", y="missing"), function(x, y="missing", id.n.sd=3, id.n.od=3, ...){ if(all(x@od > 1.E-06)) pca.ddplot(x, id.n.sd, id.n.od, ...) else pca.distplot(x, id.n.sd, ...) }) myPcaPrint <- function(x, print.x=FALSE, print.loadings=FALSE, ...) { if(!is.null(cl <- x@call)) { cat("Call:\n") dput(cl) cat("\n") } cat("Standard deviations:\n"); print(sqrt(getEigenvalues(x)), ...) if(print.loadings) { cat("\nLoadings:\n"); print(getLoadings(x), ...) } if (print.x) { cat("\nRotated variables:\n"); print(getScores(x), ...) } invisible(x) } ## Internal function to calculate the score and orthogonal distances and the ## appropriate cutoff values for identifying outlying observations ## ## obj - the Pca object. From this object will be used: ## - k, eigenvalues, scores ## - center and scale ## data - the original data (not centered and scaled) ## r - rank ## crit - criterion for computing cutoff for SD and OD ## ## - cutoff for score distances: sqrt(qchisq(crit, k)) ## - cutoff for orthogonal distances: Box (1954) ## pca.distances <- function(obj, data, r, crit=0.975) { .distances(data, r, obj, crit) } .distances <- function(data, r, obj, crit=0.975) { ## VT::28.07.2020 - - add adjusted for skewed data mode. The 'skew' ## parameter will be used only in PcaHubert() to control how to ## calculate the distances and their cutoffs. skew <- inherits(obj,"PcaHubert") && obj$skew ## remember the criterion, could be changed by the user obj@crit.pca.distances <- crit ## compute the score distances and the corresponding cutoff value n <- nrow(data) smat <- diag(obj@eigenvalues, ncol=ncol(obj@scores)) ## VT::02.06.2010: it can happen that the rank of the matrix ## is nk=ncol(scores), but the rank of the diagonal matrix of ## eigenvalues is lower: for example if the last singular ## value was 1E-7, the last eigenvalue will be sv^2=1E-14 ## nk <- min(ncol(obj@scores), rankMM(smat)) if(nk < ncol(obj@scores)) warning(paste("Too small eigenvalue(s): ", obj@eigenvalues[ncol(obj@scores)], "- the diagonal matrix of the eigenvalues cannot be inverted!")) obj@sd <- sqrt(mahalanobis(as.matrix(obj@scores[,1:nk]), rep(0, nk), diag(obj@eigenvalues[1:nk], ncol=nk))) obj@cutoff.sd <- sqrt(qchisq(crit, obj@k)) if(skew) { ## In this case (only valid when called from PcaHubert) the ## SD are the observations' adjusted outlyingness, and the corresponding ## cutoff value is derived in the same way as for the orthogonal distances. obj@sd <- obj@ao obj@cutoff.sd <- .crit.od(obj@sd, crit=crit, method="skewed") } ## Compute the orthogonal distances and the corresponding cutoff value ## For each point this is the norm of the difference between the ## centered data and the back-transformed scores ## obj@od <- apply(data - repmat(obj@center, n, 1) - obj@scores %*% t(obj@loadings), 1, vecnorm) ## VT::21.06.2016 - the data we get here is the original data - neither centered nor scaled. ## - center and scale the data ## obj@od <- apply(data - matrix(rep(obj@center, times=n), nrow=n, byrow=TRUE) - obj@scores %*% t(obj@loadings), 1, vecnorm) obj@od <- apply(scale(data, obj@center, obj@scale) - obj@scores %*% t(obj@loadings), 1, vecnorm) if(is.list(dimnames(obj@scores))) { names(obj@od) <- dimnames(obj@scores)[[1]] } ## The orthogonal distances make sence only if the number of PCs is less than ## the rank of the data matrix - otherwise set it to 0 obj@cutoff.od <- 0 if(obj@k != r) { ## the method used for computing the cutoff depends on (a) classic/robust and (b) skew mx <- if(inherits(obj,"PcaClassic")) "classic" else if(skew) "skewed" else "medmad" obj@cutoff.od <- .crit.od(obj@od, crit=crit, method=mx) } ## flag the observations with 1/0 if the distances are less or equal the ## corresponding cutoff values obj@flag <- obj@sd <= obj@cutoff.sd if(obj@cutoff.od > 0) obj@flag <- (obj@flag & obj@od <= obj@cutoff.od) return(obj) } ## Adjusted for skewness cutoff of the orthogonal distances: ## - cutoff = the largest od_i smaller than Q3({od}) + 1.5 * exp(3 * medcouple({od})) * IQR({od}) ## .crit.od <- function(od, crit=0.975, method=c("medmad", "classic", "umcd", "skewed"), quan) { method <- match.arg(method) if(method == "skewed") { mc <- robustbase::mc(od, maxit=1000) e3mc <- if(mc < 0) 1 else exp(3*mc) cx <- quantile(od, 0.75) + 1.5 * e3mc * IQR(od) cv <- max(od[which(od < cx)]) # take the largest od, smaller than cx } else { od <- od^(2/3) if(method == "classic") { t <- mean(od) s <- sd(od) }else if(method == "umcd") { ms <- unimcd(od, quan=quan) t <- ms$tmcd s <- ms$smcd }else { t <- median(od) s <- mad(od) } cv <- (t + s * qnorm(crit))^(3/2) } cv } ## Flip the signs of the loadings ## - comment from Stephan Milborrow ## .signflip <- function(loadings) { if(!is.matrix(loadings)) loadings <- as.matrix(loadings) apply(loadings, 2, function(x) if(x[which.max(abs(x))] < 0) -x else x) } ## This is from MM in robustbase, but I want to change it and ## therefore took a copy. Later will update in 'robustbase' ## I want to use not 'scale()', but doScale to which I can pass also ## a function. .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) if(is.logical(scale)) scale <- if(scale) sd else vector('numeric', p) + 1 else if(is.null(scale)) scale <- vector('numeric', p) + 1 if(is.logical(center)) center <- if(center) mean else vector('numeric', p) else if(is.null(center)) center <- vector('numeric', p) x.scaled <- doScale(x, center=center, scale=scale) x <- x.scaled$x center <- x.scaled$center scale <- x.scaled$scale if(via.svd) { svd <- svd(x, nu=0) rank <- rankMM(x, sv=svd$d) loadings <- svd$v[,1:rank] 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) } ## VT::19.08.2016 ## classSVD and kernelEVD are no more used - see .classPC ## ## VT::15.06.2010 - Added scaling and flipping of the loadings ## classSVD <- function(x, scale=FALSE, signflip=TRUE){ if(!is.numeric(x) || !is.matrix(x)) stop("'x' must be a numeric matrix") else if(nrow(x) <= 1) stop("The sample size must be greater than 1 for svd") n <- nrow(x) p <- ncol(x) center <- apply(x, 2, mean) x <- scale(x, center=TRUE, scale=scale) if(scale) scale <- attr(x, "scaled:scale") svd <- svd(x/sqrt(n-1)) rank <- rankMM(x, sv=svd$d) eigenvalues <- (svd$d[1:rank])^2 loadings <- svd$v[,1:rank] ## VT::15.06.2010 - signflip: flip the sign of the loadings if(!is.matrix(loadings)) loadings <- data.matrix(loadings) if(signflip) loadings <- .signflip(loadings) scores <- x %*% loadings list(loadings=loadings, scores=scores, eigenvalues=eigenvalues, rank=rank, center=center, scale=scale) } ## VT::15.06.2010 - Added scaling and flipping of the loadings ## kernelEVD <- function(x, scale=FALSE, signflip=TRUE){ if(!is.numeric(x) || !is.matrix(x)) stop("'x' must be a numeric matrix") else if(nrow(x) <= 1) stop("The sample size must be greater than 1 for svd") n <- nrow(x) p <- ncol(x) if(n > p) classSVD(x, scale=scale, signflip=signflip) else { center <- apply(x, 2, mean) x <- scale(x, center=TRUE, scale=scale) if(scale) scale <- attr(x, "scaled:scale") e <- eigen(x %*% t(x)/(n-1)) tolerance <- n * max(e$values) * .Machine$double.eps rank <- sum(e$values > tolerance) eigenvalues <- e$values[1:rank] loadings <- t((x/sqrt(n-1))) %*% e$vectors[,1:rank] %*% diag(1/sqrt(eigenvalues)) ## VT::15.06.2010 - signflip: flip the sign of the loadings if(signflip) loadings <- .signflip(loadings) scores <- x %*% loadings ret <- list(loadings=loadings, scores=scores, eigenvalues=eigenvalues, rank=rank, center=center, scale=scale) } } pca.screeplot <- function (obj, k, type = c("barplot", "lines"), main = deparse1(substitute(obj)), ...) { type <- match.arg(type) pcs <- if(is.null(obj@eig0) || length(obj@eig0) == 0) obj@eigenvalues else obj@eig0 k <- if(missing(k)) min(10, length(pcs)) else min(k, length(pcs)) xp <- seq_len(k) dev.hold() on.exit(dev.flush()) if (type == "barplot") barplot(pcs[xp], names.arg = names(pcs[xp]), main = main, ylab = "Variances", ...) else { plot(xp, pcs[xp], type = "b", axes = FALSE, main = main, xlab = "", ylab = "Variances", ...) axis(2) axis(1, at = xp, labels = names(pcs[xp])) } invisible() } ## Score plot of the Pca object 'obj' - scatterplot of ith against jth score ## with superimposed tollerance (0.975) ellipse pca.scoreplot <- function(obj, i=1, j=2, main, id.n, ...) { if(missing(main)) { main <- if(inherits(obj,"PcaClassic")) "Classical PCA" else "Robust PCA" } x <- cbind(getScores(obj)[,i], getScores(obj)[,j]) rownames(x) <- rownames(getScores(obj)) ## VT::11.06.2012 ## Here we assumed that the scores are not correlated and ## used a diagonal matrix with the eigenvalues on the diagonal to draw the ellipse ## This is not the case with PP methods, therefore we compute the covariance of ## the scores, considering only the non-outliers ## (based on score and orthogonal distances) ## ## ev <- c(getEigenvalues(obj)[i], getEigenvalues(obj)[j]) ## cpc <- list(center=c(0,0), cov=diag(ev), n.obs=obj@n.obs) flag <- obj@flag cpc <- cov.wt(x, wt=flag) ## We need to inflate the covariance matrix with the proper size: ## see Maronna et al. (2006), 6.3.2, page 186 ## ## - multiply the covariance by quantile(di, alpha)/qchisq(alpha, 2) ## where alpha = h/n ## ## mdx <- mahalanobis(x, cpc$center, cpc$cov) ## alpha <- length(flag[which(flag != 0)])/length(flag) ## cx <- quantile(mdx, probs=alpha)/qchisq(p=alpha, df=2) ## cpc$cov <- cx * cpc$cov .myellipse(x, xcov=cpc, xlab=paste("PC",i,sep=""), ylab=paste("PC",j, sep=""), main=main, id.n=id.n, ...) abline(v=0) abline(h=0) } ## Distance-distance plot (or diagnostic plot, or outlier map) ## Plots score distances against orthogonal distances pca.ddplot <- function(obj, id.n.sd=3, id.n.od=3, main, xlim, ylim, off=0.02, ...) { if(missing(main)) { main <- if(inherits(obj,"PcaClassic")) "Classical PCA" else "Robust PCA" } if(all(obj@od <= 1.E-06)) warning("PCA diagnostic plot is not defined") else { if(missing(xlim)) xlim <- c(0, max(max(obj@sd), obj@cutoff.sd)) if(missing(ylim)) ylim <- c(0, max(max(obj@od), obj@cutoff.od)) plot(obj@sd, obj@od, xlab="Score distance", ylab="Orthogonal distance", main=main, xlim=xlim, ylim=ylim, type="p", ...) abline(v=obj@cutoff.sd) abline(h=obj@cutoff.od) label.dd(obj@sd, obj@od, id.n.sd, id.n.od, off=off) } invisible(obj) } ## Distance plot, plots score distances against index pca.distplot <- function(obj, id.n=3, title, off=0.02, ...) { if(missing(title)) { title <- if(inherits(obj,"PcaClassic")) "Classical PCA" else "Robust PCA" } ymax <- max(max(obj@sd), obj@cutoff.sd) plot(obj@sd, xlab="Index", ylab="Score distance", ylim=c(0,ymax), type="p", ...) abline(h=obj@cutoff.sd) label(1:length(obj@sd), obj@sd, id.n, off=off) title(title) invisible(obj) } label <- function(x, y, id.n=3, off=0.02){ xrange <- par("usr") xrange <- xrange[2] - xrange[1] if(id.n > 0) { n <- length(y) ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] if(is.character(names(y))) lab <- names(y[ind]) else lab <- ind text(x[ind] - off*xrange, y[ind], lab) } } label.dd <- function(x, y, id.n.sd=3, id.n.od=3, off=0.02){ xrange <- par("usr") xrange <- xrange[2] - xrange[1] if(id.n.sd > 0 && id.n.od > 0) { n <- length(x) ind.sd <- sort(x, index.return=TRUE)$ix ind.sd <- ind.sd[(n - id.n.sd + 1):n] ind.od <- sort(y, index.return=TRUE)$ix ind.od <- ind.od[(n - id.n.od + 1):n] lab <- ind.od if(is.character(names(y))) lab <- names(y[ind.od]) text(x[ind.od] - off*xrange, y[ind.od], lab) lab <- ind.sd if(is.character(names(x))) lab <- names(x[ind.sd]) text(x[ind.sd] - off*xrange, y[ind.sd], lab) } } ## VT::30.09.2009 - add a parameter 'classic' to generate a default caption ## "Robust biplot" or "Classical biplot" for a robust/classical ## PCA object, resp. ## --- do not use it for now --- ## .biplot <- function(x, y, classic, var.axes = TRUE, col, cex = rep(par("cex"), 2), xlabs = NULL, ylabs = NULL, expand=1, xlim = NULL, ylim = NULL, arrow.len = 0.1, main = NULL, sub = NULL, xlab = NULL, ylab = NULL, ...) { n <- nrow(x) p <- nrow(y) ## if(is.null(main)) ## main <- if(classic) "Classical biplot" else "Robust biplot" if(missing(xlabs)) { xlabs <- dimnames(x)[[1L]] if(is.null(xlabs)) xlabs <- 1L:n } xlabs <- as.character(xlabs) dimnames(x) <- list(xlabs, dimnames(x)[[2L]]) if(missing(ylabs)) { ylabs <- dimnames(y)[[1L]] if(is.null(ylabs)) ylabs <- paste("Var", 1L:p) } ylabs <- as.character(ylabs) dimnames(y) <- list(ylabs, dimnames(y)[[2L]]) if(length(cex) == 1L) cex <- c(cex, cex) pcol <- par("col") if(missing(col)) { col <- par("col") if(!is.numeric(col)) col <- match(col, palette(), nomatch=1L) col <- c(col, col + 1L) } else if(length(col) == 1L) col <- c(col, col) unsigned.range <- function(x) c(-abs(min(x, na.rm=TRUE)), abs(max(x, na.rm=TRUE))) rangx1 <- unsigned.range(x[, 1L]) rangx2 <- unsigned.range(x[, 2L]) rangy1 <- unsigned.range(y[, 1L]) rangy2 <- unsigned.range(y[, 2L]) if(missing(xlim) && missing(ylim)) xlim <- ylim <- rangx1 <- rangx2 <- range(rangx1, rangx2) else if(missing(xlim)) xlim <- rangx1 else if(missing(ylim)) ylim <- rangx2 ratio <- max(rangy1/rangx1, rangy2/rangx2)/expand on.exit(par(op)) op <- par(pty = "s") if(!is.null(main)) op <- c(op, par(mar = par("mar")+c(0,0,1,0))) plot(x, type = "n", xlim = xlim, ylim = ylim, col = col[[1L]], xlab = xlab, ylab = ylab, sub = sub, main = main, ...) text(x, xlabs, cex = cex[1L], col = col[[1L]], ...) par(new = TRUE) plot(y, axes = FALSE, type = "n", xlim = xlim*ratio, ylim = ylim*ratio, xlab = "", ylab = "", col = col[[1L]], ...) ## axis(3, col = col[2L], ...) ## axis(4, col = col[2L], ...) ## box(col = col[1L]) axis(3, col = pcol, ...) axis(4, col = pcol, ...) box(col = pcol) text(y, labels=ylabs, cex = cex[2L], col = col[[2L]], ...) if(var.axes) arrows(0, 0, y[,1L] * 0.8, y[,2L] * 0.8, col = col[[2L]], length=arrow.len) invisible() } rrcov/R/PcaProj.R0000644000176200001440000000704714200221615013270 0ustar liggesuserssetMethod("getQuan", "PcaProj", function(obj) obj@n.obs) ## The S3 version PcaProj <- function (x, ...) UseMethod("PcaProj") PcaProj.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a 'standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaProj.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaProj") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaProj.default <- function(x, k=0, kmax=ncol(x), scale=FALSE, na.action = na.fail, crit.pca.distances=0.975, trace=FALSE, ...) { cl <- match.call() if(missing(x)){ stop("You have to provide at least some data") } data <- as.matrix(x) n <- nrow(data) p <- ncol(data) ## ## verify and set the input parameters: k and kmax ## myrank <- rankMM(data) kmax <- max(min(floor(kmax), myrank),1) if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } if(k != 0) k <- min(k, ncol(data)) else { k <- min(kmax, ncol(data)) if(trace) cat("The number of principal components is defined by the algorithm. It is set to ", k,".\n", sep="") } if(is.logical(scale)) { scale <- if(scale) sd else NULL } out <- PCAproj(data, k, scale=scale, ...) center <- out$center scale <- out$scale sdev <- out$sdev loadings <- as.matrix(out$loadings[, 1:k]) ## VT::31.07.2020 ## scores <- predict(out) ## scores <- as.matrix(scores[, 1:k]) scores <- (data - matrix(rep(center, nrow(data)), nrow = nrow(data), byrow = TRUE)) %*% loadings eigenvalues <- (sdev^2)[1:k] ###################################################################### names(eigenvalues) <- NULL if(is.list(dimnames(data))) rownames(scores) <- rownames(data) # dimnames(scores)[[1]] <- dimnames(data)[[1]] dimnames(scores)[[2]] <- paste("PC", seq_len(ncol(scores)), sep = "") dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaProj") res <- new("PcaProj", call=cl, rank=myrank, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=scale, scores=scores, k=k, n.obs=n) ## Compute distances and flags res <- pca.distances(res, data, p, crit.pca.distances) return(res) } rrcov/R/Linda.R0000644000176200001440000003213713573713670013002 0ustar liggesusers## The S3 version Linda <- function (x, ...) UseMethod("Linda") Linda.formula <- function(formula, data, ..., subset, na.action) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- Linda.default(x, grouping, ...) ## res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as 'formula' cl <- match.call() cl[[1]] <- as.name("Linda") res@call <- cl ## res$contrasts <- attr(x, "contrasts") ## res$xlevels <- .getXlevels(Terms, m) ## res$na.action <- attr(m, "na.action") res } Linda.default <- function(x, grouping, prior = proportions, tol = 1.0e-4, method = c("mcd", "mcdA", "mcdB", "mcdC", "fsa", "mrcd", "ogk"), alpha=0.5, l1med=FALSE, cov.control, trace=FALSE, ...) { if(is.null(dim(x))) stop("x is not a matrix") method <- match.arg(method) xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(length(grouping) == 1) { ## this is the number of groups and the groups are of equal size ng = grouping ni = n/ng if(ng*ni < n) stop("nrow(x) is not divisible by the number of groups") grouping <- rep(0,0) for(i in 1:ng) grouping <- c(grouping, rep(i,ni)) }else if(length(grouping) > 1 && length(grouping) < n) { ## grouping contains a vector with the group sizes ng <- length(grouping) if(sum(grouping) != n) stop("nrow(x) is not equal to n1+n2+...+nn") gx <- rep(0,0) for(i in 1:ng) gx <- c(gx, rep(i,grouping[i])) grouping <- gx } if(n != length(grouping)) stop("nrow(x) and length(grouping) are different") g <- as.factor(grouping) lev <- lev1 <- levels(g) counts <- as.vector(table(g)) if(!missing(prior)) { if(any(prior < 0) || round(sum(prior), 5) != 1) stop("invalid prior") if(length(prior) != nlevels(g)) stop("prior is of incorrect length") prior <- prior[counts > 0] } if(any(counts == 0)) { warning(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) lev1 <- lev[counts > 0] g <- factor(g, levels=lev1) counts <- as.vector(table(g)) } proportions <- counts/n ng <- length(proportions) names(g) <- NULL names(prior) <- levels(g) if(missing(cov.control)) cov.control <- if(method == "mrcd") CovControlMrcd(alpha=alpha) else if(method == "ogk") CovControlOgk() else if(method %in% c("mcd", "mcdA", "mcdB", "mcdC")) CovControlMcd(alpha=alpha) else NULL if(method == "mcdC" && !inherits(cov.control, "CovControlMcd")) stop("Method 'C' is defined only for MCD estimates!") if(method == "mcdA" && !inherits(cov.control, "CovControlMcd")) stop("Method 'A' is defined only for MCD estimates!") if(method == "mrcd" && !inherits(cov.control, "CovControlMrcd")) stop("Method 'mrcd' is defined only for MRCD estimates!") if(method == "ogk" && !inherits(cov.control, "CovControlOgk")) stop("Method 'ogk' is defined only for OGK estimates!") if(inherits(cov.control, "CovControlMrcd")) method <- "mrcd" if(inherits(cov.control, "CovControlOgk")) method <- "ogk" if(method == "fsa"){ if(nrow(x) > 5000 | ncol(x) > 100) stop("Method 'fsa' can handle at most 5000 cases and 100 variables!") xcov <- .wcovMwcd(x, grouping, alpha=alpha, trace=trace) } else if(method == "mcdA"){ xcov <- .wcovMcd(x, grouping, method="A", cov.control=cov.control) } else if(method == "mcd" || method == "mrcd" || method == "mcdB" || method == "ogk"){ xcov <- .wcovMcd(x, grouping, method="B", l1med=l1med, cov.control=cov.control) } else if(method == "mcdC"){ xcov <- .wcovMcd(x, grouping, method="C", l1med=l1med, cov.control=cov.control) } else { stop(paste("Unknown method called: ", method)) } ## VT::27.11.2019 ## inv <- solve(xcov$wcov) inv <- if(!is.null(xcov$winv)) xcov$winv else if(!.isSingular(xcov$wcov)) solve(xcov$wcov) else .pinv(xcov$wcov) ldf <- xcov$means %*% inv ldfconst <- diag(log(prior) - ldf %*% t(xcov$means)/2) if(!is.null(xcov$raw.means) && !is.null(xcov$raw.wcov)){ raw.means <- xcov$raw.means raw.wcov <- xcov$raw.wcov ## inv <- solve(raw.wcov) inv <- if(!.isSingular(raw.wcov)) solve(raw.wcov) else .pinv(raw.wcov) raw.ldf <- raw.means %*% inv raw.ldfconst <- diag(log(prior) - raw.ldf %*% t(raw.means)/2) }else{ raw.means <- xcov$means raw.wcov <- xcov$wcov raw.ldf <- ldf raw.ldfconst <- ldfconst } return (new("Linda", call=xcall, prior=prior, counts=counts, center=xcov$means, cov=xcov$wcov, ldf = ldf, ldfconst = ldfconst, method=method, l1med=l1med, X=x, grp=g, covobj=xcov$covobj, control=cov.control)) } .wcovMcd <- function(x, grouping, method = c("A", "B", "C"), alpha=0.5, l1med=FALSE, cov.control){ xcall <- match.call() method <- match.arg(method) x <- as.matrix(x) n <- nrow(x) p <- ncol(x) dimn <- dimnames(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts/n) # compute group means and covariance matrices for each group mX <- matrix(0,ng,p) covX <- array(0,c(p,p,ng)) sumwt <- array(0,ng) raw.mX <- matrix(0,ng,p) raw.covX <- array(0,c(p,p,ng)) raw.sumwt <- array(0,ng) if(method == "A" | !l1med) { for(i in 1:ng){ mcd <- if(!is.null(cov.control)) restimate(cov.control, x[which(g == lev[i]),]) else Cov(x[which(g == lev[i]),]) mX[i,] <- getCenter(mcd) if(inherits(mcd, "CovMcd")) { sumwt[i] <- sum(mcd@wt) covX[,,i] <- getCov(mcd) * sumwt[i] raw.mX[i,] <- mcd@raw.center raw.sumwt[i] <- length(mcd@best) raw.covX[,,i] <- mcd@raw.cov * raw.sumwt[i] } } } else { for(i in 1:ng){ mX[i,] <- l1median(x[which(g == lev[i]),]) } } if(method == "A"){ #Method A: pool the covariance matrices wcov <- matrix(0,p,p) for(i in 1:ng){ wcov <- wcov + covX[,,i] } wcov <- wcov/(sum(sumwt)-ng) final.xcov <- list(wcov=wcov, means=mX, covobj=NULL) ## pool the raw estimates wcov <- matrix(0,p,p) for(i in 1:ng){ wcov <- wcov + raw.covX[,,i] } wcov <- wcov/(sum(raw.sumwt)-ng) mX <- raw.mX mah <- mahalanobis(x-mX[g,], rep(0,p), wcov) weights <- ifelse(mah< qchisq(0.975, p), 1, 0) method <- "mcd-A" }else if(method == "B"){ #Method B: center the data and compute the covariance matrix #of the centered data mcd <- if(!is.null(cov.control)) restimate(cov.control, x - mX[g,]) else Cov(x - mX[g,]) winv <- if("icov" %in% slotNames(mcd)) mcd@icov else NULL final.xcov <- list(wcov=getCov(mcd), winv=winv, means=t(t(mX)+getCenter(mcd)), covobj=mcd) if(inherits(mcd, "CovMcd")) { wcov <- mcd@raw.cov mX <- t(t(mX)+mcd@raw.center) mah <- mcd@raw.mah weights <- mcd@raw.wt }else { wcov <- getCov(mcd) mX <- t(t(mX)+getCenter(mcd)) mah <- weights <- NULL } method <- "mcd-B" }else if(method == "C"){ ## Method C is more or less the same as Method B, but the means ## are computed as the means of the Hi observations from mcd$best ## and the covariance matrix is the raw.cov ## ## Center the data and compute the means and covariance matrix ## of the centered data as in Method B mcd <- restimate(cov.control, x - mX[g,]) ## compute the group means as the means of these observations which are in ## mcd@best, i.e. in case of two groups, if H=best ## partition H in H1 and H2 and compute mi as the mean of the Hi observations ## respectively. ## Take the raw covariance matrix as within group cov for(i in 1:ng){ tmpc <- cov.wt(as.matrix(x[mcd@best[which(mcd@best%in% which(g == lev[i]))],])) mX[i,] <- tmpc$center } wcov <- mcd@raw.cov mah <- mahalanobis(x-mX[g,], rep(0,p), wcov) weights <- ifelse(mah< qchisq(0.975, p), 1, 0) final.xcov <- .wcov.wt(x, g, weights) method <- "mcd-C" }else{ stop("Unknown method specified: ", method) } dimnames(wcov) <- list(dimn[[2]], dimn[[2]]) dimnames(mX) <- list(levels(g), dimn[[2]]) dimnames(final.xcov$wcov) <- list(dimn[[2]], dimn[[2]]) dimnames(final.xcov$means) <- list(levels(g), dimn[[2]]) ans <- list(call=xcall, means=final.xcov$means, wcov=final.xcov$wcov, winv=final.xcov$winv, method=method, raw.means=mX, raw.wcov=wcov, raw.mah=mah, raw.wt=weights, covobj=final.xcov$covobj) class(ans) <- "wcov" return(ans) } .wcovMwcd <- function(x, grouping, alpha=0.5, trace=0){ quan.f <- function(alpha, n, rk) { quan <- floor(2 * floor((n+rk+1)/2) - n + 2 * (n - floor((n+rk+1)/2)) * alpha) return(quan) } xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) quan <- quan.f(alpha, n, p) dimn <- dimnames(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts/n) grouping <- as.integer(g) # transpose x, as necessary for the FSADA subroutine X <- t(x) storage.mode(X) <- "double" storage.mode(n) <- "integer" storage.mode(p) <- "integer" storage.mode(ng) <- "integer" # NG storage.mode(grouping) <- "integer" # IGRP xmean <- matrix(0, nrow = p * ng, ncol = 1) # XM storage.mode(xmean) <- "double" xcov <- matrix(0, nrow = p * p, ncol = 1) # XC storage.mode(xcov) <- "double" storage.mode(counts) <- "double" # XND storage.mode(quan) <- "integer" # IHALF nsamp <- 0 storage.mode(nsamp) <- "integer" # NIT inbest <- matrix(10000, nrow = quan, ncol = 1) # IDSAV storage.mode(inbest) <- "integer" seed <- 0 storage.mode(seed) <- "integer" # MRAND deter <- 0 # DETC storage.mode(deter) <- "double" ierr <- 0 # IERR storage.mode(ierr) <- "integer" mwcd <- .Fortran("fsada", X, n, p, ng, grouping, xmean = xmean, xcov = xcov, counts, quan, nsamp, best = inbest, seed, ierr = ierr, detc = deter, itrace=as.integer(trace), PACKAGE="rrcov") xcov <- mwcd$xcov xmean <- mwcd$xmean dim(xcov) <- c(p, p) dim(xmean) <- c(p,ng) xmean <- t(xmean) dimnames(xcov) <- list(dimn[[2]], dimn[[2]]) dimnames(xmean) <- list(levels(g), dimn[[2]]) ## Compute the consistency correction factor for the raw MCD ## (see calfa in croux and haesbroeck) qalpha <- qchisq(quan/n, p) calphainvers <- pgamma(qalpha/2, p/2 + 1)/(quan/n) calpha <- 1/calphainvers correct <- 1 if(p == 1) { scale <- sqrt(calpha) * as.double(xcov) * sqrt(correct) }else { ## Apply correction factor to the raw estimates and use them to compute weights xcov <- calpha * xcov * correct mah <- mahalanobis(x-xmean[g,], rep(0,p), xcov) weights <- ifelse(mah< qchisq(0.975, p), 1, 0) final.cov <- .wcov.wt(x, g, weights) } ans <- list(call=xcall, raw.means=xmean, raw.wcov=xcov, raw.mah=mah, raw.wt=weights, means=final.cov$means, wcov=final.cov$wcov, covobj=NULL) class(ans) <- "wcov" return(ans) } rrcov/R/CovClassic.R0000644000176200001440000001005313362505240013761 0ustar liggesusers## Just a shortcut and for competability with older versions ## same as CovClassic() ## Cov <- function(x, unbiased = TRUE) { return (CovClassic(x, unbiased)) } CovClassic <- function(x, unbiased = TRUE) { if(is.data.frame(x)) x <- data.matrix(x) else if(!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] ## if(n < p) ## stop("Need at least p=(number of variables) observations ") if(n <= 0) stop("All observations have missing values!") call = match.call() method = "Classical Estimator." ans <- cov.wt(x) nobs <- nrow(x) if(!unbiased) ans$cov <- (ans$cov * (nobs-1))/nobs new("CovClassic", call=call, cov=ans$cov, center=ans$center, n.obs=ans$n.obs, method=method, X=x) } ## VT::17.06.2008 ##setMethod("plot", "CovClassic", function(x, y="missing", setMethod("plot", signature(x="CovClassic", y="missing"), function(x, y="missing", which=c("all", "distance", "qqchi2", "tolEllipsePlot", "screeplot", "pairs"), ask = (which=="all" && dev.interactive(TRUE)), cutoff, id.n, tol = 1e-7, ...) { data <- getData(x) ## parameters and preconditions if(is.vector(data) || is.matrix(data)) { if(!is.numeric(data)) stop( "x is not a numeric dataframe or matrix.") } else if(is.data.frame(data)) { if(!all(sapply(data,data.class) == "numeric")) stop( "x is not a numeric dataframe or matrix.") } n <- dim(data)[1] p <- dim(data)[2] if(length(getCenter(x)) == 0 || length(getCov(x)) == 0) stop( "Invalid object: attributes center and cov missing!") if(length(getCenter(x)) != p) stop( "Data set and provided center have different dimensions!") ## Check for singularity of the cov matrix if(isSingular(x)) stop("The covariance matrix is singular!") if(missing(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) 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,"}") } ccov <- x rd <- md <- sqrt(getDistance(x)) which <- match.arg(which) op <- if (ask) par(ask = TRUE) else list() on.exit(par(op)) ## index plot of mahalanobis distances if(which == "all" || which == "distance") { .mydistplot(md, cutoff, classic=TRUE, id.n=id.n, ...) } ## qq-plot of the mahalanobis distances versus the ## quantiles of the chi-squared distribution if(which == "all" || which == "qqchi2") { .qqplot(md, p, cutoff=cutoff, classic=TRUE, id.n=id.n, ...) } if(which == "all" || which == "tolEllipsePlot") { if(p == 2) .tolellipse(ccov = x, cutoff=cutoff, id.n=id.n, tol=tol, ...) else if(which != "all") warning("Warning: For tolerance ellipses the dimension must be 2!") } if(which == "tolEllipsePlot" || which == "pairs") { if(which == "tolEllipsePlot" & length(dim(data)) >= 2 && dim(data)[2] == 2){ if(!is.null(rd)){ .tolellipse(rcov=x, cutoff=cutoff, id.n=id.n, tol=tol, ...) } }else if(length(dim(data)) >= 2 && dim(data)[2] <= 10) { .rrpairs(x, ...) }else if(which != "all") warning("Warning: For tolerance ellipses the dimension must be less than 10!") } if(which == "all" || which == "screeplot") { myscreeplot(ccov=x) } }) ## end { plot("CovClassic") } rrcov/R/CovSest.R0000644000176200001440000011366513711101726013332 0ustar liggesusers## TO DO ## ## - 'best', 'exact' and 'deterministic' options for nsamp, as in CovMcd ## CovSest <- function(x, bdp=0.5, arp=0.1, eps=1e-5, maxiter=120, nsamp=500, seed=NULL, trace=FALSE, tolSolve=1e-14, scalefn, maxisteps=200, initHsets = NULL, save.hsets = FALSE, method=c("sfast", "surreal", "bisquare", "rocke", "suser", "sdet"), control, t0, S0, initcontrol ) { ## Analize 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. method <- match.arg(method) if(!missing(control)){ defcontrol <- CovControlSest() # default control if(bdp == defcontrol@bdp) bdp <- control@bdp # for s-fast and surreal if(arp == defcontrol@arp) arp <- control@arp # for rocke type if(eps == defcontrol@eps) eps <- control@eps # for bisquare and rocke if(maxiter == defcontrol@maxiter) maxiter <- control@maxiter # for bisquare and rocke if(nsamp == defcontrol@nsamp) nsamp <- control@nsamp if(is.null(seed) || seed == defcontrol@seed) seed <- control@seed if(trace == defcontrol@trace) trace <- control@trace if(tolSolve == defcontrol@tolSolve) tolSolve <- control@tolSolve if(method == defcontrol@method) method <- control@method } if(length(seed) > 0) { if(exists(".Random.seed", envir=.GlobalEnv, inherits=FALSE)) { seed.keep <- get(".Random.seed", envir=.GlobalEnv, inherits=FALSE) on.exit(assign(".Random.seed", seed.keep, envir=.GlobalEnv)) } assign(".Random.seed", seed, envir=.GlobalEnv) } if(!missing(nsamp) && !is.numeric(nsamp)) stop("Number of trials nsamp must be a positive number!") if(!missing(nsamp) && is.numeric(nsamp) && nsamp <= 0) stop("Invalid number of trials nsamp = ",nsamp, "!") if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) xcall <- match.call() ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] if(n <= p + 1) stop(if (n <= p) "n <= p -- you can't be serious!" else "n == p+1 is too small sample size") if(n < 2 * p) { ## p+1 < n < 2p warning("n < 2 * p, i.e., possibly too small sample size") } if(method == "surreal" && nsamp == 500) # default nsamp = 600*p ## compute the constants c1 and kp ## c1 = Tbsc(bdp, p) ## kp = (c1/6) * Tbsb(c1, p) cobj <- .csolve.bw.S(bdp, p) cc <- cobj$cc kp <- cobj$kp if(trace) cat("\nFAST-S...: bdp, p, cc, kp=", bdp, p, cc, kp, "\n") if(missing(scalefn) || is.null(scalefn)) { scalefn <- if(n <= 1000) Qn else scaleTau2 } mm <- if(method == "sfast") ..CSloc(x, nsamp=nsamp, kp=kp, cc=cc, trace=trace) else if(method == "suser") ..fastSloc(x, nsamp=nsamp, kp=kp, cc=cc, trace=trace) else if(method == "surreal") ..covSURREAL(x, nsamp=nsamp, kp=kp, c1=cc, trace=trace, tol.inv=tolSolve) else if(method == "bisquare") ..covSBic(x, arp, eps, maxiter, t0, S0, nsamp, seed, initcontrol, trace=trace) else if(method == "rocke") ..covSRocke(x, arp, eps, maxiter, t0, S0, nsamp, seed, initcontrol, trace=trace) else ..detSloc(x, hsets.init=initHsets, save.hsets=save.hsets, scalefn=scalefn, kp=kp, cc=cc, trace=trace) ans <- new("CovSest", call = xcall, iter=mm$iter, crit=mm$crit, cov=mm$cov, center=mm$center, n.obs=n, iBest=0, cc=mm$cc, kp=mm$kp, X = as.matrix(x), method=mm$method) if(method == "sdet") { ans@iBest <- mm$iBest ans@nsteps <- mm$hset.csteps if(save.hsets) ans@initHsets <- mm$initHsets } ans } ## ## Compute the constants kp and c1 for the Tukey Biweight rho-function for S ## .csolve.bw.S <- function(bdp, p) { ## Compute the constant kp (used in Tbsc) Tbsb <- function(c, p) { ksiint <- function(c, s, p) { (2^s) * gamma(s + p/2) * pgamma(c^2/2, s + p/2)/gamma(p/2) } y1 = ksiint(c,1,p)*3/c - ksiint(c,2,p)*3/(c^3) + ksiint(c,3,p)/(c^5) y2 = c*(1-pchisq(c^2,p)) return(y1 + y2) } ## Compute the tunning constant c1 for the S-estimator with ## Tukey's biweight function given the breakdown point (bdp) ## and the dimension p Tbsc <- function(bdp, p) { eps = 1e-8 maxit = 1e3 cnew <- cold <- sqrt(qchisq(1 - bdp, p)) ## iterate until the change is less than the tollerance or ## max number of iterations reached for(iter in 1:maxit) { cnew <- Tbsb(cold, p)/bdp if(abs(cold - cnew) <= eps) break cold <- cnew } return(cnew) } cc = Tbsc(bdp, p) kp = (cc/6) * Tbsb(cc, p) return(list(cc=cc, kp=kp)) } ## ## A fast procedure to compute an S-estimator similar to the one proposed ## for regression by Salibian-Barrera, M. and Yohai, V.J. (2005), ## "A fast algorithm for S-regression estimates". This current C implemention ## is by Valentin Todorov. ## ## Input: ## x - a data matrix of size (n,p) ## nsamp - number of sub-samples (default=20) ## k - number of refining iterations in each subsample (default=2) ## best.r - number of "best betas" to remember from the subsamples. ## These will be later iterated until convergence (default=5) ## kp, cc - tunning constants for the S-estimator with Tukey's biweight ## function given the breakdown point (bdp) and the dimension p ## ## Output: a list with components ## center - robust estimate of location (vector: length) ## cov - robust estimate of scatter (matrix: p,p) ## crit - value of the objective function (number) ## ..CSloc <- function(x, nsamp=500, kstep=2, best.r=5, kp, cc, trace=FALSE) { dimn <- dimnames(x) if(!is.matrix(x)) x = as.matrix(x) n <- nrow(x) p <- ncol(x) maxit <- 200 # max number of iterations rtol <- 1e-7 # convergence tolerance b <- .C("sest", as.double(x), as.integer(n), as.integer(p), as.integer(nsamp), center = as.double(rep(0,p)), cov = as.double(rep(0,p*p)), scale = as.double(0), as.double(cc), as.double(kp), as.integer(best.r), # number of (refined) to be retained for full iteration as.integer(kstep), # number of refining steps for each candidate as.integer(maxit), # number of (refined) to be retained for full iteration as.double(rtol), converged = logical(1) ) scale <- b$scale center <- b$center cov <- matrix(b$cov, nrow=p) if(scale < 0) cat("\nC function sest() exited prematurely!\n") ## names(b)[names(b) == "k.max"] <- "k.iter" # maximal #{refinement iter.} ## FIXME: get 'res'iduals from C if(!is.null(nms <- dimn[[2]])) { names(center) <- nms dimnames(cov) <- list(nms,nms) } return(list( center=as.vector(center), cov=cov, crit=scale, iter=nsamp, kp=kp, cc=cc, method="S-estimates: S-FAST")) } ## ## A fast procedure to compute an S-estimator similar to the one proposed ## for regression by Salibian-Barrera, M. and Yohai, V.J. (2005), ## "A fast algorithm for S-regression estimates". This version for ## multivariate location/scatter is adapted from the one implemented ## by Kristel Joossens, K.U. Leuven, Belgium ## and Ella Roelant, Ghent University, Belgium. ## ## Input: ## x - a data matrix of size (n,p) ## nsamp - number of sub-samples (default=20) ## k - number of refining iterations in each subsample (default=2) ## best.r - number of "best betas" to remember from the subsamples. ## These will be later iterated until convergence (default=5) ## kp, cc - tunning constants for the S-estimator with Tukey's biweight ## function given the breakdown point (bdp) and the dimension p ## ## Output: a list with components ## center - robust estimate of location (vector: length) ## cov - robust estimate of scatter (matrix: p,p) ## crit - value of the objective function (number) ## ..fastSloc <- function(x, nsamp, k=2, best.r=5, kp, cc, trace=FALSE) { ## NOTES: ## - in the functions rho, psi, and scaledpsi=psi/u (i.e. the weight function) ## is used |x| <= c1 ## ## - function resdis() to compute the distances is used instead of ## mahalanobis() - slightly faster ## The bisquare rho function: ## ## | x^2/2 - x^4/2*c1^2 + x^6/6*c1^4 |x| <= c1 ## rho(x) = | ## | c1^2/6 |x| > c1 ## rho <- function(u, cc) { w <- abs(u) <= cc v <- (u^2/2 * (1 - u^2/cc^2 + u^4/(3*cc^4))) * w + (1-w) * (cc^2/6) v } ## The corresponding psi function: psi = rho' ## ## | x - 2x^3/c1^2 + x^5/c1^4 |x| <= c1 ## psi(x) = | ## | 0 |x| > c1 ## ## using ifelse is 3 times slower psi <- function(u, c1) { ##ifelse(abs(u) < c1, u - 2 * u^3/c1^2 + u^5/c1^4, 0) pp <- u - 2 * u^3/c1^2 + u^5/c1^4 pp*(abs(u) <= c1) } ## weight function = psi(u)/u scaledpsi <- function(u, cc) { ##ifelse(abs(xx) < c1, xx - 2 * xx^3/c1^2 + xx^5/c1^4, 0) pp <- (1 - (u/cc)^2)^2 pp <- pp * cc^2/6 pp*(abs(u) <= cc) } ## the objective function, we solve loss.S(u, s, cc) = b for "s" loss.S <- function(u, s, cc) mean(rho(u/s, cc)) norm <- function(x) sqrt(sum(x^2)) ## Returns square root of the mahalanobis distances of x with respect to mu and sigma ## Seems to be somewhat more efficient than sqrt(mahalanobis()) - by factor 1.4! resdis <- function(x, mu, sigma) { central <- t(x) - mu sqdis <- colSums(solve(sigma, central) * central) dis <- sqdis^(0.5) dis } ## Computes Tukey's biweight objective function (scale) ## (respective to the mahalanobis distances u) using the ## rho() function and the konstants kp and c1 scaleS <- function(u, kp, c1, initial.sc=median(abs(u))/.6745) { ## find the scale, full iterations maxit <- 200 eps <- 1e-20 sc <- initial.sc for(i in 1:maxit) { sc2 <- sqrt(sc^2 * mean(rho(u/sc, c1)) / kp) if(abs(sc2/sc - 1) <= eps) break sc <- sc2 } return(sc) } ## ## Do "k" iterative reweighting refining steps from "initial.mu, initial.sigma" ## ## If "initial.scale" is present, it's used, o/w the MAD is used ## ## k = number of refining steps ## conv = 0 means "do k steps and don't check for convergence" ## conv = 1 means "stop when convergence is detected, or the ## maximum number of iterations is achieved" ## kp and cc = tuning constants of the equation ## re.s <- function(x, initial.mu, initial.sigma, initial.scale, k, conv, kp, cc) { n <- nrow(x) p <- ncol(x) rdis <- resdis(x, initial.mu, initial.sigma) if(missing(initial.scale)) { initial.scale <- scale <- median(abs(rdis))/.6745 } else { scale <- initial.scale } ## if conv == 1 then set the max no. of iterations to 50 magic number alert!!! if(conv == 1) k <- 50 mu <- initial.mu sigma <- initial.sigma for(i in 1:k) { ## do one step of the iterations to solve for the scale scale.super.old <- scale scale <- sqrt(scale^2 * mean(rho(rdis/scale, cc)) / kp) ## now do one step of reweighting with the "improved scale" weights <- scaledpsi(rdis/scale, cc) W <- weights %*% matrix(rep(1,p), ncol=p) xw <- x * W/mean(weights) mu.1 <- apply(xw,2,mean) res <- x - matrix(rep(1,n),ncol=1) %*% mu.1 sigma.1 <- t(res) %*% ((weights %*% matrix(rep(1,p), ncol=p)) * res) sigma.1 <- (det(sigma.1))^(-1/p) * sigma.1 if(.isSingular(sigma.1)) { mu.1 <- initial.mu sigma.1 <- initial.sigma scale <- initial.scale break } if(conv == 1) { ## check for convergence if(norm(mu - mu.1) / norm(mu) < 1e-20) break ## magic number alert!!! } rdis <- resdis(x,mu.1,sigma.1) mu <- mu.1 sigma <- sigma.1 } rdis <- resdis(x,mu,sigma) ## get the residuals from the last beta return(list(mu.rw = mu.1, sigma.rw=sigma.1, scale.rw = scale)) } ################################################################################################ n <- nrow(x) p <- ncol(x) best.mus <- matrix(0, best.r, p) best.sigmas <- matrix(0,best.r*p,p) best.scales <- rep(1e20, best.r) s.worst <- 1e20 n.ref <- 1 for(i in 1:nsamp) { ## Generate a p+1 subsample in general position and compute ## its mu and sigma. If sigma is singular, generate another ## subsample. ## FIXME ---> the singularity check 'det(sigma) < 1e-7' can ## in some cases give TRUE, e.g. milk although ## .isSingular(sigma) which uses qr(mat)$rank returns ## FALSE. This can result in many retrials and thus ## speeding down! ## singular <- TRUE iii <- 0 while(singular) { iii <- iii + 1 if(iii > 10000) { cat("\nToo many singular resamples: ", iii, "\n") iii <- 0 } indices <- sample(n, p+1) xs <- x[indices,] mu <- colMeans(xs) sigma <- cov(xs) ##singular <- det(sigma) < 1e-7 singular <- .isSingular(sigma) } sigma <- det(sigma)^(-1/p) * sigma ## Perform k steps of iterative reweighting on the elemental set if(k > 0) { ## do the refining tmp <- re.s(x=x, initial.mu=mu, initial.sigma=sigma, k=k, conv=0, kp=kp, cc=cc) mu.rw <- tmp$mu.rw sigma.rw <- tmp$sigma.rw scale.rw <- tmp$scale.rw rdis.rw <- resdis(x, mu.rw, sigma.rw) } else { ## k = 0 means "no refining" mu.rw <- mu sigma.rw <- sigma rdis.rw <- resdis(x, mu.rw, sigma.rw) scale.rw <- median(abs(rdis.rw))/.6745 } if(i > 1) { ## if this isn't the first iteration.... ## check whether new mu/sigma belong to the top best results; if so keep ## mu and sigma with corresponding scale. scale.test <- loss.S(rdis.rw, s.worst, cc) if(scale.test < kp) { s.best <- scaleS(rdis.rw, kp, cc, scale.rw) ind <- order(best.scales)[best.r] best.scales[ind] <- s.best best.mus[ind,] <- mu.rw bm1 <- (ind-1)*p; best.sigmas[(bm1+1):(bm1+p),] <- sigma.rw s.worst <- max(best.scales) } } else { ## if this is the first iteration, then this is the best solution anyway... best.scales[best.r] <- scaleS(rdis.rw, kp, cc, scale.rw) best.mus[best.r,] <- mu.rw bm1 <- (best.r-1)*p; best.sigmas[(bm1+1):(bm1+p),] <- sigma.rw } } ## do the complete refining step until convergence (conv=1) starting ## from the best subsampling candidate (possibly refined) super.best.scale <- 1e20 for(i in best.r:1) { index <- (i-1)*p tmp <- re.s(x=x, initial.mu=best.mus[i,], initial.sigma=best.sigmas[(index+1):(index+p),], initial.scale=best.scales[i], k=0, conv=1, kp=kp, cc=cc) if(tmp$scale.rw < super.best.scale) { super.best.scale <- tmp$scale.rw super.best.mu <- tmp$mu.rw super.best.sigma <- tmp$sigma.rw } } super.best.sigma <- super.best.scale^2*super.best.sigma return(list( center=as.vector(super.best.mu), cov=super.best.sigma, crit=super.best.scale, iter=nsamp, kp=kp, cc=cc, method="S-estimates: S-FAST")) } ## ## Computes S-estimates of multivariate location and scatter by the Ruppert's ## SURREAL algorithm using Tukey's biweight function ## data - the data: a matrix or a data.frame ## nsamp - number of random (p+1)-subsamples to be drawn, defaults to 600*p ## kp, c1 - tunning constants for the S-estimator with Tukey's biweight ## function given the breakdown point (bdp) and the dimension p ## ..covSURREAL <- function(data, nsamp, kp, c1, trace=FALSE, tol.inv) { ## --- now suspended --- ## ## Compute the tunning constant c1 for the S-estimator with ## Tukey's biweight function given the breakdown point (bdp) ## and the dimension p vcTukey<-function(bdp, p) { cnew <- sqrt(qchisq(1 - bdp, p)) maxit <- 1000 epsilon <- 10^(-8) error <- 10^6 contit <- 1 while(error > epsilon & contit < maxit) { cold <- cnew kp <- vkpTukey(cold,p) cnew <- sqrt(6*kp/bdp) error <- abs(cold-cnew) contit <- contit+1 } if(contit == maxit) warning(" Maximum iterations, the last values for c1 and kp are:") return (list(c1 = cnew, kp = kp)) } ## Compute the constant kp (used in vcTukey) vkpTukey<-function(c0, p) { c2 <- c0^2 intg1 <- (p/2)*pchisq(c2, (p+2)) intg2 <- (p+2)*p/(2*c2)*pchisq(c2, (p+4)) intg3 <- ((p+4)*(p+2)*p)/(6*c2^2)*pchisq(c2, (p+6)) intg4 <- (c2/6)*(1-pchisq(c2, p)) kp <- intg1-intg2+intg3+intg4 return(kp) } ## Computes Tukey's biweight objective function (scale) ## (respective to the mahalanobis distances dx) scaleS <- function(dx, S0, c1, kp, tol) { S <- if(S0 > 0) S0 else median(dx)/qnorm(3/4) test <- 2*tol rhonew <- NA rhoold <- mean(rhobiweight(dx/S,c1)) - kp while(test >= tol) { delta <- rhoold/mean(psibiweight(dx/S,c1)*(dx/(S^2))) mmin <- 1 control <- 0 while(mmin < 10 & control != 1) { rhonew <- mean(rhobiweight(dx/(S+delta),c1))-kp if(abs(rhonew) < abs(rhoold)) { S <- S+delta control <- 1 }else { delta <- delta/2 mmin <- mmin+1 } } test <- if(mmin == 10) 0 else (abs(rhoold)-abs(rhonew))/abs(rhonew) rhoold <- rhonew } return(abs(S)) } rhobiweight <- function(xx, c1) { lessc1 <- (xx^2)/2-(xx^4)/(2*(c1^2))+(xx^6)/(6*c1^4) greatc1 <- (c1^2)/6 lessc1 * abs(xx=c1) } psibiweight <- function(xx, c1) { (xx - (2*(xx^3))/(c1^2)+(xx^5)/(c1^4))*(abs(xx) ceiling(nsamp*0.2)) { if(l == ceiling(nsamp*(0.5))) laux <- 2 if(l == ceiling(nsamp*(0.8))) laux <- 4 epsilon <- runif(1) epsilon <- epsilon^laux muJ <- epsilon*muJ + (1-epsilon)*mutil covJ <- epsilon*covJ + (1-epsilon)*covtil } covJ <- det(covJ) ^ -mb * covJ md<-sqrt(mahalanobis(data, muJ, covJ, tol.inv=tol.inv)) if(mean(rhobiweight(md/Stil, c1)) < kp) { if(Stil < 5e10) Stil <- scaleS(md, Stil, c1, kp, tol) else Stil <- scaleS(md, 0, c1, kp, tol) mutil <- muJ covtil <- covJ psi <- psibiweight(md, c1*Stil) u <- psi/md ubig <- diag(u) ux <- ubig%*%data muJ <- apply(ux, 2, mean)/mean(u) xcenter <- scale(data, center=muJ,scale=FALSE) covJ <- t(ubig%*%xcenter)%*%xcenter covJ <- det(covJ) ^ -mb * covJ control <- 0 cont <- 1 while(cont < 3 && control != 1) { cont <- cont + 1 md <- sqrt(mahalanobis(data, muJ, covJ, tol.inv=tol.inv)) if(mean(rhobiweight(md/Stil, c1)) < kp) { mutil <- muJ covtil <- covJ control <- 1 if(Stil < 5e10) Stil<-scaleS(md, Stil, c1, kp, tol) else Stil<-scaleS(md, 0, c1, kp, tol) }else { muJ <- (muJ + mutil)/2 covJ <- (covJ + covtil)/2 covJ <- det(covJ) ^ -mb * covJ } } } } covtil <- Stil^2 * covtil return (list(center = mutil, cov = covtil, crit = Stil, iter = nsamp, kp=kp, cc=c1, method="S-estimates: SURREAL") ) } ## ## Compute the S-estimate of location and scatter using the bisquare function ## ## NOTE: this function is equivalent to the function ..covSRocke() for computing ## the rocke type estimates with the following diferences: ## - the call to .iter.rocke() instead of iter.bic() ## - the mahalanobis distance returned by iter.bic() is sqrt(mah) ## ## arp - not used, i.e. used only in the Rocke type estimates ## eps - Iteration convergence criterion ## maxiter - maximum number of iterations ## t0, S0 - initial HBDM estimates of center and location ## nsamp, seed - if not provided T0 and S0, these will be used for CovMve() ## to compute them ## initcontrol - if not provided t0 and S0, initcontrol will be used to compute ## them ## ..covSBic <- function(x, arp, eps, maxiter, t0, S0, nsamp, seed, initcontrol, trace=FALSE){ dimn <- dimnames(x) dx <- dim(x) n <- dx[1] p <- dx[2] method <- "S-estimates: bisquare" ## standarization mu <- apply(x, 2, median) devin <- apply(x, 2, mad) x <- scale(x, center = mu, scale=devin) ## If not provided initial estimates, compute them as MVE ## Take the raw estimates and standardise the covariance ## matrix to determinant=1 if(missing(t0) || missing(S0)){ if(missing(initcontrol)) init <- CovMve(x, nsamp=nsamp, seed=seed) else init <- restimate(initcontrol, x) cl <- class(init) if(cl == "CovMve" || cl == "CovMcd" || cl == "CovOgk"){ t0 <- init@raw.center S0 <- init@raw.cov ## xinit <- cov.wt(x[init@best,]) ## t0 <- xinit$center ## S0 <- xinit$cov detS0 <-det(S0) detS02 <- detS0^(1.0/p) S0 <- S0/detS02 } else{ t0 <- init@center S0 <- init@cov } } ## initial solution center <- t0 cov <- S0 out <- .iter.bic(x, center, cov, maxiter, eps, trace=trace) center <- out$center cov <- out$cov mah <- out$mah iter <- out$iter kp <- out$kp cc <- out$cc mah <- mah^2 med0 <- median(mah) qchis5 <- qchisq(.5,p) cov <- (med0/qchis5)*cov mah <- (qchis5/med0)*mah DEV1 <- diag(devin) center <- DEV1%*%center+mu cov <- DEV1%*%cov%*%DEV1 center <- as.vector(center) crit <- determinant(cov, logarithm = FALSE)$modulus[1] if(!is.null(nms <- dimn[[2]])) { names(center) <- nms dimnames(cov) <- list(nms,nms) } return (list(center=center, cov=cov, crit=crit, method=method, iter=iter, kp=kp, cc=cc, mah=mah) ) } ## ## Compute the S-estimate of location and scatter using Rocke type estimator ## ## see the notes to ..covSBic() ## ..covSRocke <- function(x, arp, eps, maxiter, t0, S0, nsamp, seed, initcontrol, trace=FALSE){ dimn <- dimnames(x) dx <- dim(x) n <- dx[1] p <- dx[2] method <- "S-estimates: Rocke type" ## standarization mu <- apply(x, 2, median) devin <- apply(x, 2, mad) x <- scale(x, center = mu, scale=devin) ## If not provided initial estimates, compute them as MVE ## Take the raw estimates and standardise the covariance ## matrix to determinant=1 if(missing(t0) || missing(S0)){ if(missing(initcontrol)) init <- CovMve(x, nsamp=nsamp, seed=seed) else init <- restimate(initcontrol, x) cl <- class(init) if(cl == "CovMve" || cl == "CovMcd" || cl == "CovOgk"){ t0 <- init@raw.center S0 <- init@raw.cov ## xinit <- cov.wt(x[init@best,]) ## t0 <- xinit$center ## S0 <- xinit$cov detS0 <-det(S0) detS02 <- detS0^(1.0/p) S0 <- S0/detS02 } else{ t0 <- init@center S0 <- init@cov } } ## initial solution center <- t0 cov <- S0 out <- .iter.rocke(x, center, cov, maxiter, eps, alpha=arp, trace=trace) center <- out$center cov <- out$cov mah <- out$mah iter <- out$iter # mah <- mah^2 med0 <- median(mah) qchis5 <- qchisq(.5,p) cov <- (med0/qchis5)*cov mah <- (qchis5/med0)*mah DEV1 <- diag(devin) center <- DEV1%*%center+mu cov <- DEV1%*%cov%*%DEV1 center <- as.vector(center) crit <- determinant(cov, logarithm = FALSE)$modulus[1] if(!is.null(nms <- dimn[[2]])) { names(center) <- nms dimnames(cov) <- list(nms,nms) } return (list(center=center, cov=cov, crit=crit, method=method, iter=iter, kp=0, cc=0, mah=mah) ) } .iter.bic <- function(x, center, cov, maxiter, eps, trace) { stepS <- function(x, b, cc, mah, n, p) { p2 <- (-1/p) w <- w.bi(mah,cc) w.v <- matrix(w,n,p) tn <- colSums(w.v*x)/sum(w) xc <- x-t(matrix(tn,p,n)) vn <- t(xc)%*%(xc*w.v) eii <- eigen(vn, symmetric=TRUE, only.values = TRUE) eii <- eii$values aa <- min(eii) bb <- max(eii) condn <- bb/aa cn <- NULL fg <- TRUE if(condn > 1.e-12) { fg <- FALSE cn <- (det(vn)^p2)*vn } out1 <- list(tn, cn, fg) names(out1) <- c("center", "cov", "flag") return(out1) } scale.full <- function(u, b, cc) { #find the scale - full iterations max.it <- 200 s0 <- median(abs(u))/.6745 s.old <- s0 it <- 0 eps <- 1e-4 err <- eps + 1 while(it < max.it && err > eps) { it <- it+1 s.new <- s.iter(u,b,cc,s.old) err <- abs(s.new/s.old-1) s.old <- s.new } return(s.old) } rho.bi <- function(x, cc) { ## bisquared rho function dif <- abs(x) - cc < 0 ro1 <- (x^2)/2 - (x^4)/(2*(cc^2)) + (x^6)/(6*(cc^4)) ro1[!dif] <- cc^2/6 return(ro1) } psi.bi <- function(x, cc) { ## bisquared psi function dif <- abs(x) - cc < 0 psi1 <- x - (2*(x^3))/(cc^2) + (x^5)/(cc^4) psi1[!dif] <- 0 return(psi1) } w.bi <- function(x, cc) { ## bicuadratic w function dif <- abs(x) - cc < 0 w1 <- 1 - (2*(x^2))/(cc^2) + (x^4)/(cc^4) w1[!dif] <- 0 w1 } s.iter <- function(u, b, cc, s0) { # does one step for the scale ds <- u/s0 ro <- rho.bi(ds, cc) snew <- sqrt(((s0^2)/b) * mean(ro)) return(snew) } ################################################################################## ## main routine for .iter.bic() cc <- 1.56 b <- cc^2/12 dimx <- dim(x) n <- dimx[1] p <- dimx[2] if(trace) cat("\nbisquare.: bdp, p, c1, kp=", 0.5, p, cc, b, "\n") mah <- sqrt(mahalanobis(x, center, cov)) s0 <- scale.full(mah, b, cc) mahst <- mah/s0 ## main loop u <- eps + 1 fg <- FALSE it <- 0 while(u > eps & !fg & it < maxiter) { it <- it + 1 out <- stepS(x, b, cc, mahst, n, p) fg <- out$flag if(!fg) { center <- out$center cov <- out$cov mah <- sqrt(mahalanobis(x, center, cov)) s <- scale.full(mah, b, cc) mahst <- mah/s u <- abs(s-s0)/s0 s0 <- s } } list(center=center, cov=cov, mah=mah, iter=it, kp=b, cc=cc) } .iter.rocke <- function(x, mu, v, maxit, tol, alpha, trace) { rho.rk2 <- function(t, p, alpha) { x <- t z <- qchisq(1-alpha, p) g <- min(z/p - 1, 1) uu1 <- (x <= 1-g) uu2 <- (x > 1-g & x <= 1+g) uu3 <- (x > 1+g) zz <- x x1 <- x[uu2] dd <- ((x1-1)/(4*g))*(3-((x1-1)/g)^2)+.5 zz[uu1] <- 0 zz[uu2] <- dd zz[uu3] <- 1 return(zz) } w.rk2 <- function(t, p, alpha) { x <- t z <- qchisq(1-alpha, p) g <- min(z/p - 1, 1) uu1 <- (x <= (1-g) ) uu2 <- (x > 1-g & x <= 1+g) uu3 <- (x > (1+g)) zz <- x x1 <- x[uu2] dd <- (3/(4*g))*(1-((x1-1)/g)^2) zz[uu1] <- 0 zz[uu2] <- dd zz[uu3] <- 0 return(zz) } disesca <- function(x, mu, v, alpha, delta) { ## calculate square roots of Mahalanobis distances and scale dimx <- dim(x) n <- dimx[1] p <- dimx[2] p2 <- (1/p) p3 <- -p2 maha <- mahalanobisfl(x,mu,v) dis <- maha$dist fg <- maha$flag detv <- maha$det sig <- NULL v1 <- NULL dis1 <- NULL if(!fg) { dis1 <- dis*(detv^p2) v1 <- v*(detv^p3) sig <- escala(p, dis1, alpha, delta)$sig } out <- list(dis=dis1, sig=sig, flag=fg, v=v1) return(out) } fespro <- function(sig, fp, fdis, falpha, fdelta) { z <- fdis/sig sfun <- mean(rho.rk2(z, fp, falpha)) - fdelta return(sfun) } escala <- function(p, dis, alpha, delta) { ## find initial interval for scale sig <- median(dis) a <- sig/100 ff <- fespro(a, p, dis, alpha, delta) while(ff < 0) { a <- a/10 ff <- fespro(a, p, dis, alpha, delta) } b <- sig*10 ff <- fespro(b, p, dis, alpha, delta) while(ff>0) { b <- b*10 ff <- fespro(b, p, dis, alpha, delta) } ## find scale (root of fespro) sig.res <- uniroot(fespro, lower=a, upper=b, fp=p, fdis=dis, falpha=alpha, fdelta=delta) sig <- sig.res$root mens <- sig.res$message ans <- list(sig=sig, message=mens) return(ans) } gradien <- function(x, mu1, v1, mu0, v0, sig0, dis0, sig1, dis1, alpha) { dimx <- dim(x) n <- dimx[1] p <- dimx[2] delta <- 0.5*(1-p/n) decre <- 0. mumin <- mu0 vmin <- v0 dismin <- dis0 sigmin <- sig0 for(i in 1:10) { gamma <- i/10 mu <- (1-gamma)*mu0+gamma*mu1 v <- (1-gamma)*v0+gamma*v1 dis.res <- disesca(x,mu,v,alpha,delta) if(!dis.res$flag) { sigma <- dis.res$sig decre <- (sig0-sigma)/sig0 if(sigma < sigmin) { mumin <- mu vmin <- dis.res$v sigmin <- dis.res$sig dismin <- dis.res$dis } } } ans <- list(mu=mumin, v=vmin, sig=sigmin, dis=dismin) return(ans) } descen1 <- function(x, mu, v, alpha, sig0, dis0) { ## one step of reweighted dimx <- dim(x) n <- dimx[1] p <- dimx[2] p2 <- -(1/p) delta <- 0.5*(1-p/n) daux <- dis0/sig0 w <- w.rk2(daux, p, alpha) w.v <- w %*% matrix(1,1,p) mui <- colSums(w.v * x)/sum(w) xc <- x- (matrix(1,n,1) %*% mui) va <- t(xc) %*% (xc*w.v) disi.res <- disesca(x,mui,va,alpha,delta) if(disi.res$flag) { disi.res$sig <- sig0+1 disi.res$v <- va } disi <- disi.res$dis sigi <- disi.res$sig flagi <- disi.res$flag deti<-disi.res$det vi <- disi.res$v ans <- list(mui=mui, vi=vi, sig=sigi, dis=disi, flag=flagi) return(ans) } invfg <- function(x, tol=1.e-12) { dm <- dim(x) p <- dm[1] y <- svd(x) u <- y$u v <- y$v d <- y$d cond <- min(d)/max(d) fl <- FALSE if(cond < tol) fl <- TRUE det <- prod(d) invx <- NULL if(!fl) invx <- v%*%diag(1/d)%*%t(u) out <- list(inv=invx, flag=fl, det=det) return(out) } mahalanobisfl <- function(x, center, cov, tol=1.e-12) { invcov <- invfg(cov,tol) covinv <- invcov$inv fg <- invcov$flag det1 <- invcov$det dist <- NULL if(!fg) dist <- mahalanobis(x, center, covinv, inverted=TRUE) out <- list(dist=dist, flag=fg, det=det1) return(out) } ################################################################################## ## main routine for .iter.rocke() if(trace) { cat("\nWhich initial t0 and S0 are we using: \n") print(mu) print(v) } dimx <- dim(x) n <- dimx[1] p <- dimx[2] delta <- 0.5*(1-p/n) dis.res <- disesca (x, mu, v, alpha, delta) vmin <- v mumin <- mu sigmin <- dis.res$sig dismin <- dis.res$dis it <- 1 decre <- tol+1 while(decre > tol && it <= maxit) { ## do reweighting des1 <- descen1(x, mumin, vmin, alpha, sigmin, dismin) mu1 <- des1$mui v1 <- des1$vi dis1 <- des1$dis sig1 <- des1$sig decre1 <- (sigmin-sig1)/sigmin if(trace) { cat("\nit, decre1:",it,decre1, "\n") print(des1) } if(decre1 <= tol) { grad <- gradien(x, mu1, v1, mumin, vmin, sigmin, dismin, sig1, dis1, alpha) mu2 <- grad$mu v2 <- grad$v sig2 <- grad$sig dis2<-grad$dis decre2 <- (sigmin-sig2)/sigmin decre <- max(decre1,decre2) if(decre1 >= decre2) { mumin <- mu1 vmin <- v1 dismin <- dis1 sigmin <- sig1 } if(decre1 < decre2) { mumin <- mu2 vmin <- v2 dismin <- dis2 sigmin <- sig2 } } if(decre1 > tol) { decre <- decre1 mumin <- mu1 vmin <- v1 dismin <- dis1 sigmin <- sig1 } it <- it+1 } ans <- list(center=mumin, cov=vmin, scale=sigmin, mah=dismin, iter=it) return(ans) } rrcov/R/da-utils.R0000644000176200001440000000540012763517421013462 0ustar liggesusers.AER <- function(tab) { 1 - sum(tab[row(tab) == col(tab)])/sum(tab) } mtxconfusion <- function(actual, predicted, prior = NULL, printit=FALSE) { .confusion(actual, predicted, prior, printit) } .confusion <- function(actual, predicted, prior = NULL, printit=FALSE) { names <- levels(actual) tab <- table(actual, predicted) acctab <- t(apply(tab, 1, function(x) x/sum(x))) dimnames(acctab) <- list(Actual = names, "Predicted" = names) dimnames(tab) <- list(Actual = names, "Predicted" = names) if(is.null(prior)) { cnt <- table(actual) prior <- cnt/sum(cnt) } else names(prior) <- names AER <- 1 - sum(tab[row(tab) == col(tab)])/sum(tab) if(printit) { prt <- as.matrix(round(c("Apparent error rate" = AER, "Prior frequency" = prior),4)) colnames(prt) <- "" print(prt) cat("\nClassification table", "\n") print(tab) cat("\nConfusion matrix", "\n") print(round(acctab, 3)) } invisible(tab) } ## Internal function to perform leaving-one-out cross validation by brute force - ## recalculates the estimator n times, excluding each observation in turn. ## ## - The discriminantion method (QDA or LDA) is selected according to the type of ## the object. ## - The method for computing the covariance matrices (or the common ## cov matrix in LDA) is selected according the slot methodID. ## .CV <- function(obj){ if(!is(obj, "Lda") && !is(obj, "Qda")) stop("The object must be an Lda or Qda object") classic <- is(obj, "LdaClassic") || is(obj, "QdaClassic") ret <- predict(obj) X <- obj@X grp <- obj@grp ng <- length(levels(grp)) method <- obj@method ptm <- proc.time() n <- nrow(X) p <- ncol(X) if(!classic && n*p > 500) warning("This could take some time!") for(i in 1:n) { cat("i=",i,"\n") ll <- if(is(obj, "LdaClassic")) { LdaClassic(X[-i,], grouping=grp[-i]) } else if(is(obj, "Linda")){ Linda(X[-i,], grouping=grp[-i], method=method, l1med=obj@l1med) } else if(is(obj, "QdaClassic")){ QdaClassic(X[-i,], grouping=grp[-i]) } else if(is(obj, "QdaCov")){ QdaCov(X[-i,], grouping=grp[-i], method=obj@control) } else { stop("ERROR: unknown class") } pp <- predict(ll, newdata=t(X[i,])) ret@classification[i] <- pp@classification[1] ret@posterior[i,] <- pp@posterior[1,] } ret@ct <- mtxconfusion(grp, ret@classification) ## cat("\nElapsed time (loo): ",(proc.time() - ptm)[1],"\n") ret } rrcov/R/Lda.R0000644000176200001440000001015613602370750012437 0ustar liggesuserssetMethod("show", "Lda", function(object){ if(!is.null(cl <- object@call)) { names(cl)[2] <- "" cat("Call:\n") dput(cl) } digits = max(3, getOption("digits") - 3) cat("\nPrior Probabilities of Groups:\n") print(object@prior) if(length(object@center) > 0) { cat("\nGroup means:\n") print(object@center) cat("\nWithin-groups Covariance Matrix:\n") print(object@cov) } cat("\nLinear Coeficients:\n") print(object@ldf) cat("\nConstants:\n") print(object@ldfconst) # svd <- x$svd # names(svd) <- dimnames(x$scaling)[[2]] # if(length(svd) > 1) { # cat("\nProportion of trace:\n") # print(round(svd^2/sum(svd^2), 4), ...) # } invisible(object) }) setMethod("predict", "Lda", function(object, newdata){ ct <- FALSE if(missing(newdata)) { newdata <- object@X # use the training sample ct <- TRUE # perform cross-validation } x <- as.matrix(newdata) if(length(object@center)>0 & ncol(x) != ncol(object@center) | ncol(x) != ncol(object@ldf)) stop("wrong number of variables") ldf <- object@ldf ldfconst <- object@ldfconst ret <- .mypredictLda(object@prior, levels(object@grp), ldf, ldfconst, x) if(ct) ret@ct <- mtxconfusion(object@grp, ret@classification) ret }) .mypredictLda <- function(prior, lev, ldf, ldfconst, x){ ng <- length(prior) nm <- names(prior) if(is.null(nm)) nm <- lev xx <- x %*% t(ldf) xx <- t(t(xx) + ldfconst) posterior <- xx for(i in 1:nrow(xx)){ tmp <- sum(exp(xx[i,])) for(j in 1:ncol(xx)) posterior[i,j] <- exp(xx[i,j])/tmp } cl <- factor(nm[max.col(xx, "first")], levels = lev) new("PredictLda", classification=cl, posterior=posterior, x = xx) } setMethod("show", "PredictLda", function(object){ if(!is.null(object@ct)) { tab <- object@ct acctab <- t(apply(tab, 1, function(x) x/sum(x))) dimnames(acctab) <- dimnames(tab) AER <- 1 - sum(diag(tab))/sum(tab) prt <- as.matrix(round(c("Apparent error rate" = AER),4)) colnames(prt) <- "" print(prt) cat("\nClassification table", "\n") print(tab) cat("\nConfusion matrix", "\n") print(round(acctab, 3)) } else print(object@classification) ## print(object@posterior) ## print(object@x) invisible(object) }) setMethod("summary", "Lda", function(object, ...){ new("SummaryLda", ldaobj=object) }) setMethod("show", "SummaryLda", function(object){ show(object@ldaobj) invisible(object) }) .wcov.wt <- function (x, gr, wt = rep(1, nrow(x))) { xcall <- match.call() if (is.data.frame(x)) x <- as.matrix(x) else if (!is.matrix(x)) stop("'x' must be a matrix or a data frame") if (!all(is.finite(x))) stop("'x' must contain finite values only") n <- nrow(x) p <- ncol(x) lev <- levels(as.factor(gr)) ng <- length(lev) dimn <- dimnames(x) if(with.wt <- !missing(wt)) { if(length(wt) != n) stop("length of 'wt' must equal the number of rows in 'x'") if(any(wt < 0) || (s <- sum(wt)) == 0) stop("weights must be non-negative and not all zero") } sqrtwt <- sqrt(wt) means <- tapply(sqrtwt*x, list(rep(gr, p), col(x)), sum) /rep(tapply(sqrtwt, gr, sum), p) wcov <- crossprod(sqrtwt*(x-means[gr,]))/(sum(sqrtwt)-ng) dimnames(wcov) <- list(dimn[[2]], dimn[[2]]) dimnames(means) <- list(lev, dimn[[2]]) ans <- list(call=xcall, means=means, wcov=wcov, method="Reweighted") class(ans) <- "wcov" ans } print.wcov <- function(x, ...) { if(!is.null(cl <- x$call)) { names(cl)[2] <- "" cat("Call:\n") dput(cl) } cat("\nGroup means:\n") print(x$means, ...) cat("\nWithin-groups Covariance Matrix:\n") print(x$wcov, ...) invisible(x) } rrcov/R/PcaCov.R0000644000176200001440000001627314131112100013075 0ustar liggesuserssetMethod("getQuan", "PcaCov", function(obj) obj@n.obs) ## The S3 version PcaCov <- function (x, ...) UseMethod("PcaCov") PcaCov.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a 'standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaCov.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaCov") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaCov.default <- function(x, k=ncol(x), kmax=ncol(x), cov.control = CovControlMcd(), scale=FALSE, signflip=TRUE, crit.pca.distances=0.975, trace=FALSE, ...) { cl <- match.call() if(missing(x)){ stop("You have to provide at least some data") } data <- as.matrix(x) n <- nrow(data) p <- ncol(data) if(n < p) stop("'PcaCov' can only be used with more units than variables") ## verify and set the input parameters: k and kmax myrank <- rankMM(x) kmax <- max(min(floor(kmax), myrank),1) if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } ###################################################################### ## ## VT::05.08.2016 ## If scale is TRUE/FALSE, this will be handled by .xpc() ## otherwise call the undocumented function doScale() from robustbase - ## it will behave properly and scale can be a vector or a function if(is.null(scale)) scale <- vector('numeric', p) + 1 else if(!is.logical(scale)) { data <- doScale(data, center=NULL, scale=scale) scale <- data$scale data=data$x } ## VT::30.09.2009 - add the option for classic covariance estimates - if cov.control = NULL covx <- if(!is.null(cov.control)) restimate(cov.control, data) else Cov(data) covmat <- list(cov=getCov(covx), center=getCenter(covx), n.obs=covx@n.obs) ## VT::05.06.2016 - the call to princomp() replaced by an internal function ## it will handle the case scale=TRUE and will return also the proper scores out <- .xpc(x, covmat=covmat, scale=scale, signflip=signflip) ## VT::11.28.2015: Choose the number of components k (if not specified) ## (see mail of Klaus Nordhausen from 19.11.2015: the help says that the algorithm defines k) ## before it was just k <- min(kmax, p), i.e. k=rank(X) if(k != 0) k <- min(k, p) else { # k <- min(kmax, p) ## ## Find the number of PC 'k' ## Use the test l_k/l_1 >= 10.E-3, i.e. the ratio of ## the k-th eigenvalue to the first eigenvalue (sorted decreasingly) is larger than ## 10.E/3 and the fraction of the cumulative dispersion is larger or equal 80% ## rk <- min(n, p) ev <- out$sdev^2 test <- which(ev/ev[1] <= 1.E-3) k <- if(length(test) != 0) min(min(rk, test[1]), kmax) else min(rk, kmax) cumulative <- cumsum(ev[1:k])/sum(ev) if(cumulative[k] > 0.8) { k <- which(cumulative >= 0.8)[1] } if(trace) cat("\n k, kmax, rank, p: ", k, kmax, rk, p, "\n") if(trace) cat("The number of principal components is defined by the algorithm. It is set to ", k,".\n", sep="") } center <- getCenter(covx) scale <- out$scale sdev <- out$sdev loadings <- out$loadings[, 1:k, drop=FALSE] eigenvalues <- (sdev^2)[1:k] scores <- out$scores[, 1:k, drop=FALSE] eig0 <- sdev^2 totvar0 <- sum(eig0) ###################################################################### names(eigenvalues) <- NULL if(is.list(dimnames(x))) { rownames(scores) <- rownames(x) # dimnames(scores)[[1]] <- dimnames(data)[[1]] }else dimnames(scores)[[1]] <- 1:n dimnames(scores)[[2]] <- paste("PC", seq_len(ncol(scores)), sep = "") dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) ## fix up call to refer to the generic, but leave arg name as 'formula' cl[[1]] <- as.name("PcaCov") res <- new("PcaCov", call=cl, rank=myrank, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=scale, scores=scores, k=k, n.obs=n, eig0=eig0, totvar0=totvar0) ## Compute distances and flags res <- pca.distances(res, x, p, crit.pca.distances) return(res) } ## A simplified version of princomp() .xpc <- function (x, covmat, scale=FALSE, signflip=FALSE) { ## x is always available and covmat is always a list ## scores is always TRUE (therefore we need x) ## if (any(is.na(match(c("cov", "n.obs"), names(covmat))))) stop("'covmat' is not a valid covariance list") cv <- covmat$cov n.obs <- covmat$n.obs cen <- covmat$center if(!is.numeric(cv)) stop("PCA applies only to numerical variables") cor <- FALSE if(is.logical(scale)) { if(scale) { cor <- TRUE sds <- sqrt(diag(cv)) if(any(sds == 0)) stop("cannot use 'cor = TRUE' with a constant variable") cv <- cv/(sds %o% sds) } } edc <- eigen(cv, symmetric = TRUE) ev <- edc$values if(any(neg <- ev < 0)) { if(any(ev[neg] < -9 * .Machine$double.eps * ev[1L])) stop("covariance matrix is not non-negative definite") else ev[neg] <- 0 } if(signflip) edc$vectors <- .signflip(edc$vectors) cn <- paste0("PC", 1L:ncol(cv)) names(ev) <- cn dimnames(edc$vectors) <- list(dimnames(x)[[2L]], cn) sdev <- sqrt(ev) sc <- setNames(if(cor) sds else if(!is.logical(scale)) scale else rep.int(1, ncol(cv)), colnames(cv)) scr <- as.matrix(doScale(x, center=cen, scale=sc)$x) %*% edc$vectors dimnames(scr) <- list(dimnames(x)[[1L]], cn) edc <- list(sdev=sdev, loadings=structure(edc$vectors, class="loadings"), center=cen, scale=sc, n.obs=n.obs, scores=scr) class(edc) <- "princomp" edc } rrcov/R/Cov.R0000644000176200001440000001331313703071104012455 0ustar liggesuserssetMethod("names", "Cov", function(x) slotNames(x)) setMethod("$", "Cov", function(x, name) slot(x, name)) ## setMethod("$<-", "Cov", function(x, name, value) {slot(x, name) <- value; slot(x, name)} ) setMethod("isClassic", "Cov", function(obj) TRUE) setMethod("isSingular", "Cov", function(obj) .isSingular(getCov(obj))) ## Here we want to add some getters/setters (i.e. accessor methods). ## The first problem is a name clash: in R the accessors are usually ## named as the member variables(slots); ## we need a generic with this name; if there is a function with ## this name, it will not work (other signature for example) - ## like in the example below with cov ## slot: cov ## generic: cov(object), method: cov(object) ## x <- cov(object) ## cov(object) <- x ## An alternative would be the way it is done in Java: ## getCov(object), setCov(object, matrix) ## ## setMethod("getCenter", "Cov", function(obj) obj@center) setMethod("getCov", "Cov", function(obj) obj@cov) setMethod("getCorr", "Cov", function(obj) cov2cor(obj@cov)) setMethod("getData", "Cov", function(obj) obj@X) setMethod("getEvals", "Cov", function(obj) eigen(getCov(obj), symmetric=TRUE, only.values=TRUE)$values) setMethod("getDistance", "Cov", function(obj){ if(!is(obj@mah,"NULL")) return(obj@mah) if(is(getData(obj), "NULL")) stop("Cannot compute distances: no data provided") dd <- mahalanobis(obj@X, obj@center, obj@cov) ## check if the method is called on an object - i.e. cc=CovMcd(xxx); getDistance(cc) ## or on the constructor call - i.e. getDistance(CovMcd(xxx)) ## Do nothing in the second case ## Our expression is 'obj@mah <- dd' and the parse tree is ## (as a string array) will be c("<-", "obj@mah", "dd") ## We are interested if there are () in the second element ## expr <- substitute(obj@mah <- dd) ss <- as.character(expr) if(length(grep(pattern="(", x=ss[2], fixed=TRUE)) == 0) eval.parent(expr) return(dd) }) setMethod("getDet", "Cov", function(obj){ if(obj@det > 0) return(obj@det) dd <- if(isSingular(obj)) 0 else det(obj@cov) ## check if the method is called on an object - i.e. cc=CovMcd(xxx); getDet(cc) ## or on the constructor call - i.e. getDet(CovMcd(xxx)) ## Do nothing in the second case ## Our expression is 'obj@det <- dd' and the parse tree is ## (as a string array) will be c("<-", "obj@det", "dd") ## We are interested if there are () in the second element ## expr <- substitute(obj@det <- dd) ss <- as.character(expr) if(length(grep(pattern="(", x=ss[2], fixed=TRUE)) == 0) eval.parent(expr) return(dd) }) setMethod("getShape", "Cov", function(obj){ p <- ncol(getCov(obj)) return(if((dd <- getDet(obj)) > 0) dd^(-1/p)*getCov(obj) else getCov(obj)) }) setMethod("getFlag", "Cov", function(obj, prob=0.975){ if(!is(obj@flag,"NULL") && missing(prob)) return(obj@flag) p <- ncol(getCov(obj)) ## dd <- getDistance(obj) if(!is(obj@mah,"NULL")) dd <- obj@mah else if(is(getData(obj), "NULL")) stop("Cannot compute distances: no data provided") else dd <- mahalanobis(obj@X, obj@center, obj@cov) chi <- qchisq(prob, p) fl <- sqrt(dd) < sqrt(chi) ## check if the method is called on an object - i.e. cc=CovMcd(xxx); getFlag(cc) ## or on the constructor call - i.e. getFlag(CovMcd(xxx)) ## Do nothing in the second case ## Our expression is 'obj@flag <- fl' and the parse tree is ## (as a string array) will be c("<-", "obj@flag", "fl") ## We are interested if there are () in the second element ## expr <- substitute(obj@flag <- fl) ss <- as.character(expr) if(length(grep(pattern="(", x=ss[2], fixed=TRUE)) == 0) eval.parent(expr) return(fl) }) ## ## Follow the standard methods: show, summary, plot ## setMethod("show", "Cov", function(object){ cat("\nCall:\n") print(object@call) cat("-> Method: ", object@method, "\n") if(is.list(object@singularity)) cat(strwrap(.MCDsingularityMsg(object@singularity, object@n.obs)), sep ="\n") digits = max(3, getOption("digits") - 3) cat("\nEstimate of Location: \n") print.default(format(object@center, digits = digits), print.gap = 2, quote = FALSE) cat("\nEstimate of Covariance: \n") print.default(format(object@cov, digits = digits), print.gap = 2, quote = FALSE) invisible(object) }) setMethod("summary", "Cov", function(object, ...){ new("SummaryCov", covobj=object, evals=eigen(object@cov)$values) }) setMethod("isClassic", "SummaryCov", function(obj) TRUE) setMethod("getCenter", "SummaryCov", function(obj) getCenter(obj@covobj)) setMethod("getCov", "SummaryCov", function(obj) getCov(obj@covobj)) setMethod("getDistance", "SummaryCov", function(obj) getDistance(obj@covobj)) setMethod("getEvals", "SummaryCov", function(obj) obj@evals) setMethod("show", "SummaryCov", function(object){ cat("\nCall:\n") print(object@covobj@call) digits = max(3, getOption("digits") - 3) cat("\nEstimate of Location: \n") print.default(format(getCenter(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nEstimate of Covariance: \n") print.default(format(getCov(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nEigenvalues of covariance matrix: \n") print.default(format(getEvals(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nMahalanobis Distances: \n") print.default(format(as.vector(getDistance(object)), digits = digits), print.gap = 2, quote = FALSE) }) rrcov/R/CovSde.R0000644000176200001440000001266112763517421013132 0ustar liggesusersCovSde <- function(x, nsamp, maxres, tune=0.95, eps=0.5, prob=0.99, seed=NULL, trace=FALSE, control) { ## Analize 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. if(!missing(control)){ defcontrol <- CovControlSde() # default control ## no default if(nsamp == defcontrol@nsamp) nsamp <- control@nsamp ## no default if(maxres == defcontrol@maxres) maxres <- control@maxres if(tune == defcontrol@tune) tune <- control@tune if(eps == defcontrol@eps) eps <- control@eps if(prob == defcontrol@prob) prob <- control@prob if(is.null(seed) || seed == defcontrol@seed) seed <- control@seed if(trace == defcontrol@trace) trace <- control@trace } if(length(seed) > 0) { if(exists(".Random.seed", envir=.GlobalEnv, inherits=FALSE)) { seed.keep <- get(".Random.seed", envir=.GlobalEnv, inherits=FALSE) on.exit(assign(".Random.seed", seed.keep, envir=.GlobalEnv)) } assign(".Random.seed", seed, envir=.GlobalEnv) } if(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)))) xcall <- match.call() ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] if(missing(nsamp)) nsamp <- ceiling(log(1 - prob)/log(1 - (1 - eps)^(p+1))) else if(!is.numeric(nsamp)) stop("If present, nsamp must be a nonnegative integer or") if(nsamp != 0) nsamp <- max(1000, nsamp) nsamp <- min(nsamp, .Machine$integer.max) if(missing(maxres)) maxres <- 2 * nsamp else if(!is.numeric(maxres)) stop(sQuote("maxres"), " is not a positive integer") maxres <- min(maxres, .Machine$integer.max) tune <- sqrt(qchisq(tune, p)) if(n <= p + 1) stop(if (n <= p) "n <= p -- you can't be serious!" else "n == p+1 is too small sample size") if(n < 2 * p) { ## p+1 < n < 2p warning("n < 2 * p, i.e., possibly too small sample size") } ## Prepare for calling the Fortran function icent <- 1 locat <- double(p) covmat <- matrix(0.0, p, p) storage.mode(covmat) <- "double" wk <- double(4*n+p) iwork <- integer(4*n+p) nresper <- 0 w <- double(n) z <- double(n) ## We are ignoring the 'center' parameter in the original function in 'robust'- ## center = TRUE - estimate center simultaneously with cov ## center = FALSE - assume the data are centered, i.e. center = rep(0,p) ## center = vector of length p - sweep center from the data ## ## if(length(center) == 1 && !center) ## center <- rep(0, p) ## ## if(length(center) > 1) ## { ## if(length(center) != p) ## stop("the dimension of ", sQuote("center"), " does not match the ", "dimension of ", sQuote("x")) ## x <- sweep(x, 2, center) ## icent <- 0 ## } ## sdlist <- .Fortran("rlds", n = as.integer(n), p = as.integer(p), nsamp = as.integer(nsamp), x = as.double(x), tune = as.double(tune), wk = as.double(wk), center = as.double(locat), cov = covmat, maxres = as.integer(maxres), nresper = as.integer(nresper), weights = as.double(w), outlyingness = as.double(z), icent = as.integer(icent), iwork = as.integer(iwork), PACKAGE = "rrcov") ## again skipping the predefined center ## ## dist <- mahalanobis(x, ## center = if(length(center) > 1) rep(0, p) else sdlist$center, ## cov = sdlist$cov) center <- sdlist$center cov <- sdlist$cov mah <- mahalanobis(x, center=center, cov=cov) consistency.correction <- median(mah) / qchisq(.5, p) ## cat("\nconsistency correction factor: ", consistency.correction, "\n") cov <- cov * consistency.correction mah <- mah / consistency.correction ## if(length(center) > 1) ## sdlist$center <- center ## sdlist[c("cov", "center", "dist")] nms <- dimn[[2]] if(is.null(nms)) nms <- paste("V", 1:p, sep = "") names(center) <- nms dimnames(cov) <- list(nms,nms) ans <- new("CovSde", call = xcall, iter=sdlist$nresper, # actual subsamples performed crit=0, cov=cov, center=center, mah=mah, n.obs=n, wt=sdlist$weights, X = as.matrix(x), method="Stahel-Donoho estimator") ans } rrcov/R/CovControl.R0000644000176200001440000001070013563557656014044 0ustar liggesusersCovControlMcd <- function (alpha=0.5, nsamp=500, scalefn=NULL, maxcsteps=200, seed=NULL, trace=FALSE, use.correction=TRUE) { new("CovControlMcd", alpha = alpha, nsamp = nsamp, scalefn=scalefn, maxcsteps=maxcsteps, seed = seed, trace = trace, use.correction = use.correction) } setMethod("restimate", "CovControlMcd", function(obj, x, ...) CovMcd(x, control = obj, ...) ) CovControlMrcd <- function (alpha=0.5, h=NULL, maxcsteps=200, rho=NULL, target=c("identity", "equicorrelation"), maxcond=50, trace=FALSE) { new("CovControlMrcd", alpha = alpha, h=h, maxcsteps=maxcsteps, rho=rho, target=match.arg(target), maxcond=maxcond, trace = trace) } setMethod("restimate", "CovControlMrcd", function(obj, x, ...) CovMrcd(x, control = obj, ...) ) CovControlMest <- function (r = 0.45, arp = 0.05, eps=1e-3, maxiter=120 ) { new("CovControlMest", r = r, arp = arp, eps=eps, maxiter=maxiter) } setMethod("restimate", "CovControlMest", function(obj, x, ...) CovMest(x, control = obj, ...) ) CovControlOgk <- function (niter=2, beta=0.90, mrob=NULL, vrob=.vrobGK, smrob="scaleTau2", svrob="gk" ) { new("CovControlOgk", niter=niter, beta=beta, mrob=mrob, vrob=vrob, smrob=smrob, svrob=svrob) } setMethod("restimate", "CovControlOgk", function(obj, x, ...) CovOgk(x, control = obj, ...) ) CovControlMve <- function (alpha=0.5, nsamp=500, seed=NULL, trace=FALSE) { new("CovControlMve", alpha = alpha, nsamp = nsamp, seed = seed, trace = trace) } setMethod("restimate", "CovControlMve", function(obj, x, ...) CovMve(x, control = obj, ...) ) ## Moved to AllClassess - should precede the definition of class CovMMest, ## since used in the prototype ## ##CovControlSest <- function (bdp=0.5, ## arp=0.1, ## eps=1e-5, ## maxiter=120, ## nsamp=500, ## seed=NULL, ## trace=FALSE, ## tolSolve=1e-14, ## method="sfast") ##{ ## new("CovControlSest", bdp=bdp, arp=arp, eps=eps, maxiter=maxiter, ## nsamp=nsamp, seed=seed, trace=trace, tolSolve=tolSolve, method=method) ##} ## setMethod("restimate", "CovControlSest", function(obj, x, ...) CovSest(x, control = obj, ...) ) CovControlSde <- function (nsamp=0, maxres=0, tune=0.95, eps=0.5, prob=0.99, seed=NULL, trace=FALSE, tolSolve=1e-14) { new("CovControlSde", nsamp=nsamp, maxres=maxres, tune=tune, eps=eps, prob=prob, seed=seed, trace=trace, tolSolve=tolSolve) } setMethod("restimate", "CovControlSde", function(obj, x, ...) CovSde(x, control = obj, ...) ) CovControlMMest <- function (bdp=0.5, eff=0.95, maxiter=50, sest=CovControlSest(), trace=FALSE, tolSolve=1e-7) { new("CovControlMMest", bdp=bdp, eff=eff, maxiter=maxiter, sest=sest, trace=trace, tolSolve=tolSolve) } setMethod("restimate", "CovControlMMest", function(obj, x, ...) CovMMest(x, control = obj, ...) ) rrcov/R/datadoc.R0000644000176200001440000001506314177776141013354 0ustar liggesusers###### ## VT::03.08.2019 ## ## ## roxygen2::roxygenise("c:/Users/valen/OneDrive/MyRepo/R/rrcov", load_code=roxygen2:::load_installed, clean=TRUE) ## roxygen2::roxygenise("c:/projects/statproj/R/rrcov", load_code=roxygen2:::load_installed, clean=TRUE) ## #' #' #' #' Computer Hardware #' #' A data set containing relative CPU performance data of 209 machines on 8 variables. #; The \code{rownames} are the vendor and model descriptions. Six of the variables #' are predictive, one (\code{PRP}) is the goal field and one (\code{ERP}) is the #' linear regression's guess. The estimated relative performance values were #' estimated by the authors using a linear regression method. See their article #' (Ein-Dor and Feldmesser, CACM 4/87, pp 308-317) for more details on how the #' relative performance values were set. #' #' @name machines #' @docType data #' @usage data(machines) #' @format A data frame with 209 rows and 8 variables #' The variables are as follows: #' #' \itemize{ #' \item MMIN: minimum main memory in kilobytes (integer) #' \item MMAX: maximum main memory in kilobytes (integer) #' \item CACH: cache memory in kilobytes (integer) #' \item CHMIN: minimum channels in units (integer) #' \item CHMAX: maximum channels in units (integer) #' \item PRP: published relative performance (integer) #' \item ERP: estimated relative performance from the original article (integer) #' } #' #' @source \href{http://archive.ics.uci.edu/ml/datasets/Computer+Hardware?ref=datanews.io}{UCI Archive} #' #' @references #' Phillip Ein-Dor and Jacob Feldmesser (1987), Attributes of the performance #' of central processing units: A relative performance prediction model, #' \emph{Communications of the ACM}, \bold{30}, 4, pp 308-317. #' #' M. Hubert, P. J. Rousseeuw and T. Verdonck (2009), Robust PCA for skewed data and #' its outlier map, \emph{Computational Statistics & Data Analysis}, \bold{53}, 2264--2274. #' #' #' @examples #' #' data(machines) #' #' ## Compute the medcouple of each variable of the Computer hardware data #' data.frame(MC=round(apply(machines, 2, mc),2)) #' #' ## Plot a pairwise scaterplot matrix #' pairs(machines[,1:6]) #' #' mcd <- CovMcd(machines[,1:6]) #' plot(mcd, which="pairs") #' #' ## Remove the rownames (too long) #' rownames(machines) <- NULL #' #' ## Start with robust PCA based on MCD (P << n) #' (pca1 <- PcaHubert(machines, k=3)) #' plot(pca1, main="ROBPCA-MCD", off=0.03) #' #' ## PCA with the projection algoritm of Hubert #' (pca2 <- PcaHubert(machines, k=3, mcd=FALSE)) #' plot(pca2, main="ROBPCA-SD", off=0.03) #' #' ## PCA with the adjusted for skewness algorithm of Hubert et al (2009) #' (pca3 <- PcaHubert(machines, k=3, mcd=FALSE, skew=TRUE)) #' plot(pca3, main="ROBPCA-AO", off=0.03) #' #' @keywords datasets NULL #' #' Skull dimensions of the wolf \emph{Canis lupus} L. #' #' A data set containing skull morphometric measurements on Rocky Mountain #' and Arctic wolves (\emph{Canis Lupus L.}). The tdata are published in Morrison (1990), #' originally from Jolicoeur (1959). #' #' @name wolves #' @docType data #' @usage data(wolves) #' @format A data frame with 25 rows and 12 variables. #' The variables are as follows (all measurements are in milimeters): #' #' \itemize{ #' \item \code{class}: a factor presenting the combinations of \code{location} #' and \code{sex}. The levels are \code{arf} \code{arm} \code{rmf} and \code{rmm} #' \item \code{location}: a factor with levels \code{ar}=Arctic, \code{rm}=Rocky Mountain #' \item \code{sex}: a factor with levels \code{f}=female, \code{m}=male #' \item \code{x1}: palatal length #' \item \code{x2}: postpalatal length #' \item \code{x3}: zygomatic width #' \item \code{x4}: palatal width outside first upper molars #' \item \code{x5}: palatal width inside second upper molars #' \item \code{x6}: postglenoid foramina width #' \item \code{x7}: interorbital width #' \item \code{x8}: braincase width #' \item \code{x9}: crown length #' } #' #' @source #' Jolicoeur, P. Multivariate geographical variation in the wolf \emph{Canis lupis L.}, #' \emph{Evolution}, XIII, 283--299. #' #' Morrison, D. F. \emph{Multivariate Statistical Methods}, (3rd ed.), 1990. #' New York: McGraw-Hill, p. 288--289. #' #' @examples #' #' data(wolves) #' #' ## Remove the factors location and sex which we will not use for now #' x <- wolves[,-c(2:3)] #' #' ## Plot a pairwise scaterplot matrix #' pairs(x[,2:10]) #' #' mcd <- CovMcd(x[, 2:10]) #' plot(mcd, which="pairs") #' #' lda <- LdaClassic(class~., data=x) #' lda@center #' lda@cov #' #' predict(lda) #' #' @keywords datasets NULL #' #' Fruit data set #' #' A data set that contains the spectra of six different cultivars of #' the same fruit (cantaloupe - \emph{Cucumis melo} L. Cantaloupensis #' group) obtained from Colin Greensill (Faculty of Engineering and Physical Systems, Central Queensland #' University, Rockhampton, Australia). The total data set contained 2818 spectra measured in 256 wavelengths. #' For illustrative purposes are considered only three cultivars out of it, named D, M and #' HA with sizes 490, 106 and 500, respectively. Thus the data set thus contains 1096 observations. #' For more details about this data set see the references below. #' @name fruit #' @docType data #' @usage data(fruit) #' @format A data frame with 1096 rows and 257 variables (one grouping variable -- \code{cultivar} -- and 256 measurement variables). #' @source #' Colin Greensill (Faculty of Engineering and Physical Systems, Central Queensland #' University, Rockhampton, Australia). #' #' @references #' Hubert, M. and Van Driessen, K., (2004). Fast and robust discriminant analysis. #' \emph{Computational Statistics and Data Analysis}, \bold{45}(2):301--320. #' \doi{10.1016/S0167-9473(02)00299-2}. #' #' Vanden Branden, K and Hubert, M, (2005). Robust classification in high dimensions based on the SIMCA Method. #' \emph{Chemometrics and Intelligent Laboratory Systems}, \bold{79}(1-2), pp. 10--21. #' \doi{10.1016/j.chemolab.2005.03.002}. #' #' Hubert, M, Rousseeuw, PJ and Verdonck, T, (2012). A Deterministic Algorithm for Robust Location and Scatter. #' \emph{Journal of Computational and Graphical Statistics}, \bold{21}(3), pp 618--637. #' \doi{10.1080/10618600.2012.672100}. #' #' @examples #' #' data(fruit) #' table(fruit$cultivar) #' #' @keywords datasets NULL rrcov/R/PcaGrid.R0000644000176200001440000000710514131112006013232 0ustar liggesuserssetMethod("getQuan", "PcaGrid", function(obj) obj@n.obs) ## The S3 version PcaGrid <- function (x, ...) UseMethod("PcaGrid") PcaGrid.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a 'standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaGrid.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaGrid") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaGrid.default <- function(x, k=0, kmax=ncol(x), scale=FALSE, na.action = na.fail, crit.pca.distances=0.975, trace=FALSE, ...) { cl <- match.call() if(missing(x)){ stop("You have to provide at least some data") } data <- as.matrix(x) n <- nrow(data) p <- ncol(data) ## ## verify and set the input parameters: k and kmax ## myrank <- rankMM(data) kmax <- max(min(floor(kmax), myrank),1) if(trace) cat("k=", k, ", kmax=", kmax, ".\n", sep="") if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } if(k != 0) k <- min(k, ncol(data)) else { k <- min(kmax, ncol(data)) if(trace) cat("The number of principal components is defined by the algorithm. It is set to ", k,".\n", sep="") } ###################################################################### if(is.logical(scale)) { scale <- if(scale) sd else NULL } out <- PCAgrid(data, k, scale=scale, trace=-1, ...) scores <- predict(out) center <- out$center scale <- out$scale sdev <- out$sdev scores <- as.matrix(scores[, 1:k]) loadings <- as.matrix(out$loadings[, 1:k]) eigenvalues <- (sdev^2)[1:k] ###################################################################### names(eigenvalues) <- NULL if(is.list(dimnames(data))) rownames(scores) <- rownames(data) # dimnames(scores)[[1]] <- dimnames(data)[[1]] dimnames(scores)[[2]] <- paste("PC", seq_len(ncol(scores)), sep = "") dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaGrid") res <- new("PcaGrid", call=cl, rank=myrank, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=scale, scores=scores, k=k, n.obs=n) ## Compute distances and flags res <- pca.distances(res, data, p, crit.pca.distances) return(res) } rrcov/R/LdaClassic.R0000644000176200001440000001143713567457573013767 0ustar liggesusers## The S3 version LdaClassic <- function (x, ...) UseMethod("LdaClassic") LdaClassic.formula <- function(formula, data, ..., subset, na.action) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- LdaClassic.default(x, grouping, ...) ## res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as `formula' cl <- match.call() cl[[1]] <- as.name("LdaClassic") res@call <- cl ## res$contrasts <- attr(x, "contrasts") ## res$xlevels <- .getXlevels(Terms, m) ## res$na.action <- attr(m, "na.action") res } LdaClassic.default <- function(x, grouping, prior = proportions, tol = 1.0e-4, ...) { if(is.null(dim(x))) stop("x is not a matrix") xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(length(grouping) == 1) { # this is the number of groups and the groups are of equal size ng = grouping ni = n/ng if(ng*ni < n) stop("nrow(x) is not divisible by the number of groups") grouping <- rep(0,0) for(i in 1:ng) grouping <- c(grouping, rep(i,ni)) }else if(length(grouping) > 1 && length(grouping) < n) { # grouping contains a vector with the group sizes ng <- length(grouping) if(sum(grouping) != n) stop("nrow(x) is not equal to n1+n2+...+nn") gx <- rep(0,0) for(i in 1:ng) gx <- c(gx, rep(i,grouping[i])) grouping <- gx } if(n != length(grouping)) stop("nrow(x) and length(grouping) are different") g <- as.factor(grouping) lev <- lev1 <- levels(g) counts <- as.vector(table(g)) if(!missing(prior)) { if(any(prior < 0) || round(sum(prior), 5) != 1) stop("invalid prior") if(length(prior) != nlevels(g)) stop("prior is of incorrect length") prior <- prior[counts > 0] } if(any(counts == 0)) { warning(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) lev1 <- lev[counts > 0] g <- factor(g, levels=lev1) counts <- as.vector(table(g)) } proportions <- counts/n ng <- length(proportions) names(g) <- NULL names(prior) <- levels(g) xcov <- .wcovClass(x, grouping) ## VT::27.11.2019 ## inv <- solve(xcov$wcov) inv <- if(!.isSingular(xcov$wcov)) solve(xcov$wcov) else .pinv(xcov$wcov) ldf <- xcov$means %*% inv ldfconst <- diag(log(prior) - ldf %*% t(xcov$means)/2) return (new("LdaClassic", call=xcall, prior=prior, counts=counts, center=xcov$means, cov=xcov$wcov, ldf = ldf, ldfconst = ldfconst, method="Linear Discriminant Analysis (LDA)", X=x, grp=g)) } .wcovClass <- function(x, grouping, method = c("A", "B")){ xcall <- match.call() method <- match.arg(method) x <- as.matrix(x) n <- nrow(x) p <- ncol(x) dimn <- dimnames(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts/n) # compute group means and covariance matrices for each group mX <- matrix(0,ng,p) covX <- array(0,c(p,p,ng)) for(i in 1:ng){ tmpc <- cov.wt(as.matrix(x[which(g == lev[i]),])) mX[i,] <- tmpc$center covX[,,i] <- tmpc$cov } if(method == "A"){ #Method A: pool the covariance matrices wcov <- matrix(0,p,p) for(i in 1:ng){ wcov <- wcov + (counts[i]-1)*covX[,,i] } wcov <- wcov/(n-ng) }else if(method == "B"){ #Method B: center the data and compute the covariance matrix #of the centered data tmpc <- cov.wt(x - mX[g,]) tmpc$cov <- tmpc$cov*(n-1)/(n-ng) # Add tmpc$center to mX ->mB wcov <- tmpc$cov }else if(method == "C"){ stop("Method C not defined for classical estimates") }else{ stop("Unknown method specified: ", method) } dimnames(wcov) <- list(dimn[[2]], dimn[[2]]) dimnames(mX) <- list(levels(g), dimn[[2]]) ans <- list(call=xcall, means=mX, wcov=wcov, method="MLE") class(ans) <- "wcov" return(ans) } rrcov/R/plot-utils.R0000644000176200001440000005510414200555373014056 0ustar liggesusers###### ## VT::14.01.2020 ## ## ## roxygen2::roxygenise("C:/projects/statproj/R/rrcov") ## #' Calculates the points for drawing a confidence ellipsoid #' #' @description A simple function to calculate the points of #' a confidence ellipsoid, by default \code{dist=qchisq(0.975, 2)} #' @param loc location vector #' @param cov a \code{pXp} covariance matrix #' @param crit the confidence level, default is \code{crit=0.975} #' @return A matrix with two columns containing the calculated points. #' #' @examples #' #' data(hbk) #' cc <- cov.wt(hbk) #' e1 <- getEllipse(loc=cc$center[1:2], cov=cc$cov[1:2,1:2]) #' e2 <- getEllipse(loc=cc$center[1:2], cov=cc$cov[1:2,1:2], crit=0.99) #' plot(X2~X1, data=hbk, #' xlim=c(min(X1, e1[,1], e2[,1]), max(X1,e1[,1], e2[,1])), #' ylim=c(min(X2, e1[,2], e2[,2]), max(X2,e1[,2], e2[,2]))) #' lines(e1, type="l", lty=1, col="red") #' lines(e2, type="l", lty=2, col="blue") #' legend("topleft", legend=c(0.975, 0.99), lty=1:2, col=c("red", "blue")) #' #' @export #' @author Valentin Todorov, \email{valentin.todorov@@chello.at} #' getEllipse <- function(loc=c(0, 0), cov=matrix(c(1,0,0,1), ncol=2), crit=0.975) { ## A simple function to calculate the points of a confidence ellipsoid, ## by default \code{dist=qchisq(0.975, 2)} ## input: data set location and covariance estimate, cutoff if (length(d <- dim(cov)) != 2 || (p <- d[1]) != d[2]) stop("'cov' must be p x p cov-matrix defining an ellipsoid") dist <- sqrt(qchisq(crit, p)) 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) z <- t(t(cbind(z1, z2) %*% r) + loc) # xmin <- min(x, z[, 1]) z } ## Internal class defining a default legend parameters to be used ## in plots with both robust and classical lines in the same panel ## (e.g. scree plot, tolerance ellipses) setClass(".Legend", representation( leg = "logical", # whether to draw a legend pos = "character", # position of the legend txt = "vector", # texts col = "vector", # colors lty = "vector", # line styles pch = "vector"), # characters prototype = list(leg = TRUE, pos = "topright", txt = c("robust", "classical"), col = c("red", "blue"), lty = c("solid", "solid"), pch = c(1,24))) myscreeplot <- function(rcov, ccov) { .myscreeplot(rcov, ccov) } .myscreeplot <- function(rcov, ccov) { er <- NULL ec <- NULL ee <- NULL if(!missing(ccov)) ee <- ec <- getEvals(ccov) if(!missing(rcov)) ee <- er <- getEvals(rcov) if(is.null(ee)) stop("Both parameters are NULL") leg <- new(".Legend") eall <- if(!is.null(ec) && !is.null(er)) c(er, ec) else if(!is.null(ec)) ec else er ylim <- c(min(eall), max(eall)) plot(ee, ylim=ylim, ylab="Eigenvalues", xlab="Index", type="n") if(!is.null(ec) && !is.null(er)) legend(leg@pos, leg@txt, pch = leg@pch, lty = leg@lty, col = leg@col) if(!is.null(er)) lines(er, type="o", pch = leg@pch[1], lty = leg@lty[1], col=leg@col[1]) if(!is.null(ec)) lines(ec, type="o", pch = leg@pch[2], lty = leg@lty[2], col=leg@col[2]) title(main="Scree plot") } .myddplot <- function(md, rd, cutoff, id.n, main="Distance-Distance Plot", xlab="Mahalanobis distance", ylab="Robust distance", labs=1:length(md), ...) { ## 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)) id.n <- length(which(rd>cutoff)) plot(md, rd, xlab=xlab, ylab=ylab, type="p", ...) .label(md,rd,id.n, labs=labs) abline(0, 1, lty=2) abline(v=cutoff) abline(h=cutoff) title(main=main) } .mydistplot <- function(x, cutoff, classic = FALSE, id.n, ylim=NULL, main="Distance Plot", xlab="Index", ylab=paste(if(classic) "Mahalanobis" else "Robust", "distance"), labs=1:length(x), ...) { ## VT::10.11.2007 - change "Squared Robust distance" to "Robust distance" ## VT::10.11.2007 - Add parameter ylim to make possible robust and ## classical plot to use the same y-scale ## 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)) id.n <- length(which(x>cutoff)) plot(x, ylab=ylab, xlab=xlab, type="p", ylim=ylim, ...) .label(1:n, x, id.n, labs=labs) abline(h=cutoff) title(main=main) } .qqplot <- function(x, p, cutoff, classic=FALSE, id.n, main=eval(substitute(expression(paste(chi^2, " QQ-Plot")))), xlab=eval(substitute(expression(paste("Sqrt of the quantiles of the ", chi[p]^2, " distribution")), list(p=p))), ylab=paste(if(classic) "Mahalanobis" else "Robust", "distance"), labs=1:length(x), ...) { ## 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(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) if(missing(id.n)) 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 ## xlab <- "Square root of the quantiles of the chi-squared distribution" plot(qq, x, xlab=xlab, ylab=ylab, type="p", ...) if(id.n > 0) { ind <- (n-id.n+1):n xrange <- par("usr") xrange <- xrange[2] - xrange[1] text(qq[ind] + xrange/50, x[ind], labs[ix[ind]]) } abline(0, 1, lty=2) title(main=main) } .label <- function(x, y, id.n=3, labs=1:length(x)) { if(id.n > 0) { xrange <- par("usr") xrange <- xrange[2] - xrange[1] n <- length(y) ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] text(x[ind] + xrange/50, y[ind], labs[ind]) } } .tolellipse <- function(rcov, ccov, cutoff = NULL, id.n = NULL, tol = 1e-07, main = "Tolerance ellipse (97.5%)", xlab = "", ylab = "", labs, legend.position="bottomright", ...) { leg <- new(".Legend") if(missing(rcov) || is.null(rcov)){ if(missing(ccov) || is.null(ccov)) stop("Location and scatter matrix must be provided!") ## there is no robust location/scatter object rcov <- ccov leg@leg <- FALSE } if(is.null(data <- getData(rcov))) stop("No data provided!") n <- dim(data)[1] p <- dim(data)[2] if(p != 2) stop("Dimension must be 2!") r.cov <- getCov(rcov) r.loc <- getCenter(rcov) if(length(r.loc) == 0 || length(r.cov) == 0) stop("Invalid 'rcov' object: attributes center and cov missing!") z1 <- getEllipse(loc = r.loc, cov = r.cov) rd <- sqrt(getDistance(rcov)) x1 <- c(min(data[, 1], z1[, 1]), max(data[,1],z1[,1])) y1 <- c(min(data[, 2], z1[, 2]), max(data[,2],z1[,2])) classic <- FALSE if(!missing(ccov) && !is.null(ccov)){ c.cov <- getCov(ccov) c.loc <- getCenter(ccov) if(length(c.loc) == 0 || length(c.cov) == 0) stop("Invalid 'ccov' object: attributes center and cov missing!") classic <- TRUE z2 <- getEllipse(loc=c.loc, cov=c.cov) md <- sqrt(getDistance(ccov)) x1 <- c(min(data[, 1], z1[, 1], z2[, 1]), max(data[,1],z1[,1], z2[,1])) y1 <- c(min(data[, 2], z1[, 2], z2[, 2]), max(data[,2],z1[,2], z2[,2])) } ## 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) if(missing(labs) || is.null(labs)) labs <- 1:length(rd) ind <- sort(rd, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] ## 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(data, xlim = x1, ylim = y1, xlab = xlab, ylab = ylab, ...) box() ## VT:::03.08.2008 if(id.n > 0){ xrange <- par("usr") xrange <- xrange[2] - xrange[1] text(data[ind, 1] + xrange/50, data[ind, 2], labs[ind]) } if(leg@leg) points(z1, type = "l", lty=leg@lty[1], col=leg@col[1]) title(main) ## 2. Classical tolerance ellipse and legend if(classic){ points(z2, type = "l", lty=leg@lty[2], col=leg@col[2]) if(leg@leg) legend(legend.position, leg@txt, pch=leg@pch, lty=leg@lty, col=leg@col) } invisible() } ## Plot a scatter plot of the data 'x' and superimpose a ## (cutoff-)tollernce ellipse. ## The differences to tolEllipsePlot() in robustbase are: ## - customizable (titles, limits, labels, etc) ## - can take either a Cov object or a list (aka cov.wt or covMcd) ## - .myellipse <- function (x, xcov, cutoff = NULL, id.n = NULL, classic = FALSE, tol = 1e-07, xlab = "", ylab = "", main="Tolerance ellipse (97.5%)", sub="", txt.leg=c("robust", "classical"), col.leg = c("red", "blue"), lty.leg=c("solid", "dashed"), xlim, ylim, off.x, off.y, ...) { 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(missing(xcov)) xcov <- CovMcd(x) if(is(xcov, "Cov")) { x.loc <- getCenter(xcov) x.cov <- getCov(xcov) } else { if (!is.numeric(xcov$center) || !is.numeric(xcov$cov)) stop("argument 'xcov' must have numeric components 'center' and 'cov'") x.loc <- xcov$center ## x.cov <- n/(n - 1) * xcov$cov x.cov <- xcov$cov } xM <- colMeans(x) z1 <- getEllipse(loc=xM, cov=n/(n - 1) * cov.wt(x)$cov) z2 <- getEllipse(loc=x.loc, cov=x.cov) ## VT::09.06.200 ## if no need of the classic ellipse - set it to the robust one ## otherwise the xlim and ylim will be set to fit both ellipses ## if(classic == FALSE) ## z1 <- z2 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, x.loc, x.cov, tol = tol)) 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) if(n <= 10) # if less than 10 observations, show all id.n <- n } ind <- sort(rd, index.return = TRUE)$ix ind <- ind[(n - id.n + 1):n] if(missing(xlim)) xlim <- x1 if(missing(ylim)) ylim <- y1 plot(x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, main = main, sub=sub, ...) box() if(id.n > 0) { if(missing(off.x)) { xrange <- par("usr") xrange <- xrange[2] - xrange[1] off.x <- xrange/50 } if(missing(off.y)) { xrange <- par("usr") xrange <- xrange[4] - xrange[3] off.y <- xrange/50 } labels <- if(!is.null(rownames(x))) rownames(x)[ind] else ind text(x[ind, 1] + off.x, x[ind, 2] + off.y, labels, ...) } points(z2, type = "l", lty = lty.leg[1], col = col.leg[1], ...) if (classic) { points(z1, type = "l", lty = lty.leg[2], col = col.leg[2], ...) legend("bottomright", txt.leg, lty = lty.leg, col = col.leg, ...) } invisible() } ## Draw pairwise scatter plots for the data set 'x' ## - upper triangle - scatter plot with classical and robust 0.975-ellipses ## - histograms on the diagonal ## - lower triangle - robust (MCD) and classical correlations ## ## - x - data ## - main - caption of the plot ## .rrpairs <- function(obj, main="", sub="", xlab="", ylab="", ...){ hcol <- "cyan" # colour for histogram dcol <- "red" # color of the density line ecol.class <- "blue" # colour for classical ellipse ecol.rob <- "red" # colour for robust ellipse ## quick and dirty simulation of panel.number() which seems not to work ## in the panel functions of pairs() ## Retursns list of the corresponding i and j ## ## Example call: which.ij(hbk[,1], hbk[,3], getData(CovMcd(hbk))) ## which.ij <-function(x, y, data) { i <- j <- 0 for(k in 1:ncol(data)) { ifi <- all.equal(x, data[,k], check.attributes=FALSE) ifj <- all.equal(y, data[,k], check.attributes=FALSE) if(i == 0 && !is.character(ifi) && ifi) i <- k if(j == 0 && !is.character(ifj) && ifj) j <- k if(i != 0 & j != 0) break } list(i=i, j=j) } panel.hist <- function(x, ...) { usr <- par("usr"); on.exit(par(usr)) par(usr = c(usr[1:2], 0, 1.5) ) h <- hist(x, plot = FALSE) breaks <- h$breaks; nB <- length(breaks) y <- h$counts; y <- y/max(y) rect(breaks[-nB], 0, breaks[-1], y, col=hcol, ...) } panel.hist.density <- function(x,...) { usr <- par("usr"); on.exit(par(usr)) par(usr = c(usr[1:2], 0, 1.5) ) h <- hist(x, plot = FALSE) breaks <- h$breaks; nB <- length(breaks) y <- h$counts; y <- y/max(y) rect(breaks[-nB], 0, breaks[-1], y, col=hcol) tryd <- try( d <- density(x, na.rm=TRUE, bw="nrd", adjust=1.2), silent=TRUE) if(class(tryd) != "try-error") { d$y <- d$y/max(d$y) lines(d, col=dcol) } } panel.cor <- function(x, y, digits=2, ...) { ix <- which.ij(x, y, getData(obj)) usr <- par("usr"); on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) r <- cor(x, y) rr <- getCorr(obj)[ix$i,ix$j] prefix <- "" rprefix <- "" ff <- 0.35 txt <- format(c(r, 0.123456789), digits=digits)[1] txt <- paste(prefix, txt, sep="") rtxt <- format(c(rr, 0.123456789), digits=digits)[1] rtxt <- paste(rprefix, rtxt, sep="") txt <- if(isClassic(obj)) txt else paste0("(", txt, ")") # parentheses around the classical correlation # only if the object is a robust one cex <- ff/strwidth(txt) text(0.5, 0.3, txt, cex = cex, col=ecol.class) if(!isClassic(obj)) text(0.5, 0.5, rtxt, cex = cex, col=ecol.rob) } panel.ellipse <- function(x, y, ...) { usr <- par("usr"); on.exit(par(usr)) X <- cbind(x,y) C.ls <- cov(X) m.ls <- colMeans(X) ix <- which.ij(x, y, getData(obj)) ## cat("\npanel.ellipse: ", ix$i, ix$j,"\n") C.rr <- getCov(obj)[c(ix$i,ix$j), c(ix$i,ix$j)] m.rr <- getCenter(obj)[c(ix$i,ix$j)] e.class <- getEllipse(loc=m.ls, cov=C.ls, crit=0.975) e.rob <- getEllipse(loc=m.rr, cov=C.rr, crit=0.975) xmin <- min(c(min(x), min(e.class[,1]), min(e.rob[,1]))) xmax <- max(c(max(x), max(e.class[,1]), max(e.rob[,1]))) ymin <- min(c(min(y), min(e.class[,2]), min(e.rob[,2]))) ymax <- max(c(max(y), max(e.class[,2]), max(e.rob[,2]))) ff <- 0.1 xmin <- xmin - ff*(xmax-xmin); #print(ff*(xmax-xmin)) xmax <- xmax + ff*(xmax-xmin); #print(ff*(xmax-xmin)) ymin <- ymin - ff*(ymax-ymin); #print(ff*(ymax-ymin)) ymax <- ymax + ff*(ymax-ymin); #print(ff*(ymax-ymin)) par(usr = c(xmin, xmax, ymin, ymax)) points(x,y, ...) lines(e.class, col=ecol.class, lty="dashed") if(!isClassic(obj)) lines(e.rob, col=ecol.rob) } ## get the data x <- getData(obj) ## VT::27.04.2011 - fix the names of the variables on the ## diagonal - labels= in the call to pairs(). ## Plot also density line ## pairs(x, main = main, sub=sub, lower.panel=panel.cor, diag.panel=panel.hist.density, upper.panel=panel.ellipse, labels=names(getCenter(obj)), ...) } ## Distance plot: ## Plot the robust and classical distances against the the index ## obj - A CovRobust object, ## getData(obj) - data frame or matrix ## .xydistplot <- function(obj, cutoff, main="Distance Plot", xlab="Index", ylab="Mahalanobis distance", col="darkred", labs, ...) { myPanel <- function(x, y, subscripts, cutoff, id.n, ...) { panel.xyplot(x, y, ...) panel.abline(h=cutoff,lty="dashed") n <- length(y) if(missing(id.n)) id.n <- length(which(y > cutoff)) if(id.n > 0){ ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] xrange<-range(y) adj <- (xrange[2]-xrange[1])/20 ltext(x[ind] + adj, y[ind] + adj, ind, cex=0.85) } } X <- getData(obj) n <- nrow(X) p <- ncol(X) if(missing(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) if(missing(labs) || is.null(labs)) labs <- 1:length(getDistance(obj)) ## VT::12.11.2018 - In case of MRCD we can use also classic regularized estimate dd1 <- sqrt(getDistance(obj)) # robust distances if(inherits(obj, "CovMrcd")) { vv <- CovMrcd(X, alpha=1) # classical REGULARIZED center and covariance dd2 <- sqrt(getDistance(vv)) # classical distances } else { vv <- cov.wt(X) dd2 <- sqrt(mahalanobis(X,vv$center,vv$cov)) # classical distances } dd <- c(dd1, dd2) # a vector with both robust and classical distances ind <- c(1:n, 1:n) # 1, 2, ..., n, 1, 2, ...n - gr <- as.factor(c(rep(1,n), rep(2,n))) # 1, 1, ..., 1, 2, 2, ...2 - n x 1, n x 2 levels(gr)[1] <- "Robust" levels(gr)[2] <- "Classical" xyplot(dd~ind|gr, cutoff=cutoff, panel = myPanel, xlab=xlab, ylab=ylab, main=main, col=col, ...) } ## QQ-Chi plot: ## Plot QQ plot of the robust and classical distances against the ## quantiles of the Chi2 distr ## X - data frame or matrix ## .xyqqchi2 <- function(obj, cutoff, main=eval(substitute(expression(paste(chi^2, " QQ-Plot")))), xlab=eval(substitute(expression(paste("Sqrt of the quantiles of the ", chi[p]^2, " distribution")), list(p=p))), ylab="Mahalanobis distance", col="darkred", labs, ...) { myPanel <- function(x, y, subscripts, cutoff, id.n, ...) { y <- sort(y, index.return=TRUE) iy <- y$ix y <- y$x panel.xyplot(x, y, ...) panel.abline(0,1,lty="dashed") n <- length(y) if(missing(id.n)) id.n <- length(which(y > cutoff)) if(id.n > 0){ ind <- (n-id.n+1):n xrange<-range(y) adj <- (xrange[2]-xrange[1])/50 ltext(x[ind] + adj, y[ind] + adj, iy[ind], cex=0.85) } } X <- getData(obj) n <- nrow(X) p <- ncol(X) if(missing(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) if(missing(labs) || is.null(labs)) labs <- 1:length(getDistance(obj)) ## VT::12.11.2018 - In case of MRCD we can use also classic regularized estimate dd1 <- sqrt(getDistance(obj)) # robust distances if(inherits(obj, "CovMrcd")) { vv <- CovMrcd(X, alpha=1) # classical REGULARIZED center and covariance dd2 <- sqrt(getDistance(obj)) # classical Mahalanobis distances } else { vv <- cov.wt(X) # classical center and covariance dd2 <- sqrt(mahalanobis(X,vv$center,vv$cov)) # classical Mahalanobis distances } dd <- c(dd1, dd2) # a vector with both robust and classical distances qq <- sqrt(qchisq(((1:n)-1/3)/(n+1/3), p)) ind<-c(qq, qq) gr<-as.factor(c(rep(1,n), rep(2,n))) # 1, 1, ...., 1, 2, 2, ..., 2 - n x 1, n x 2 levels(gr)[1]<-"Robust" levels(gr)[2]<-"Classical" xyplot(dd~ind|gr, cutoff=cutoff, panel = myPanel, xlab=xlab, ylab=ylab, main=main, col=col, ...) } rrcov/R/CovMcd.R0000644000176200001440000000351112763517421013114 0ustar liggesusersCovMcd <- function(x, raw.only = FALSE, alpha=control@alpha, nsamp = control@nsamp, scalefn=control@scalefn, maxcsteps=control@maxcsteps, initHsets=NULL, save.hsets=FALSE, seed=control@seed, trace=control@trace, use.correction=control@use.correction, control=CovControlMcd(), ...) { ## MM 2014-11-04: add '...' so we are compatible to covMcd() extensions in robustbase ## Analize 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. ## prepare the call to covMcd() which will return an S3 object ## handle the case of nsamp="best" or "exact" iter <- if(is.numeric(nsamp)) nsamp else 0 xcall <- match.call() mcd <- covMcd(x=x, raw.only=raw.only, alpha=alpha, nsamp=nsamp, scalefn=control@scalefn, maxcsteps=control@maxcsteps, initHsets = NULL, save.hsets = FALSE, seed=seed, trace=trace, use.correction=use.correction, ...) new("CovMcd", call= xcall, iter=iter, crit=mcd$crit, cov=mcd$cov, center=mcd$center, n.obs=mcd$n.obs, mah = mcd$mah, wt = mcd$mcd.wt, X = mcd$X, method=mcd$method, best=mcd$best, alpha=mcd$alpha, quan=mcd$quan, raw.cov = mcd$raw.cov, raw.center = mcd$raw.center, raw.mah = mcd$raw.mah, raw.wt = mcd$raw.weights, raw.cnp2 = mcd$raw.cnp2, cnp2 = mcd$cnp2, singularity = mcd$singularity) } rrcov/R/psibwt.R0000644000176200001440000000767212763517421013265 0ustar liggesuserssetMethod("psi", "PsiBwt", function(obj, x) { if(obj@c1 == 0){ x1 <- x - obj@M ivec1 <- (x1 <= 0) ivec2 <- (x1 > 0) } else { x1 <- (x-obj@M)/obj@c1 ivec1 <- (x1 < 0) ivec2 <- (x1 > 1) } return(ivec1*x+(1-ivec1-ivec2)*x*(1-x1^2)^2) }) setMethod("wt", "PsiBwt", function(obj, x) { if(obj@c1 == 0){ x1 <- x - obj@M ivec1 <- (x1 <= 0) ivec2 <- (x1 > 0) } else { x1 <- (x-obj@M)/obj@c1 ivec1 <- (x1 < 0) ivec2 <- (x1 > 1) } return(ivec1+(1-ivec1-ivec2)*(1-x1^2)^2) }) setMethod("vt", "PsiBwt", function(obj, x) { return(x*psi(obj,x)) }) setMethod("erho", "PsiBwt", function(obj) { # expectation of rho(d) under chi-squared p c1<-obj@c1 M<-obj@M p<-obj@p if (c1 == 0) return(.chiInt(p,2,M)/2 + M^2/2*.chiInt2(p,0,M)) return(.chiInt(p,2,M)/2 +(M^2/2+c1*(5*c1+16*M)/30)*.chiInt2(p,0,M+c1) +(M^2/2-M^2*(M^4-5*M^2*c1^2+15*c1^4)/(30*c1^4))*(.chiInt(p,0,M+c1)-.chiInt(p,0,M)) +(1/2+M^4/(2*c1^4)-M^2/c1^2)*(.chiInt(p,2,M+c1)-.chiInt(p,2,M)) +(4*M/(3*c1^2)-4*M^3/(3*c1^4))*(.chiInt(p,3,M+c1)-.chiInt(p,3,M)) +(3*M^2/(2*c1^4)-1/(2*c1^2))*(.chiInt(p,4,M+c1)-.chiInt(p,4,M)) -(4*M/(5*c1^4))*(.chiInt(p,5,M+c1)-.chiInt(p,5,M)) +(1/(6*c1^4))*(.chiInt(p,6,M+c1)-.chiInt(p,6,M))) }) setMethod("erhoLim", "PsiBwt", function(obj) { p<-obj@p c1<-obj@c1 return(.chiInt(p,2,c1) + c1^2*.chiInt2(p,0,c1)) }) setMethod("erhoLimD", "PsiBwt", function(obj) { p<-obj@p c1<-obj@c1 return(.chiIntD(p,2,c1) + 2*c1*.chiInt2(p,0,c1) + c1^2*.chiInt2D(p,0,c1)) }) setMethod("arpLim", "PsiBwt", function(obj) { p<-obj@p r<-obj@r obj@c1 <- c1 <- 2*p iter <- 1 crit <- 100 eps <- 1e-5 while(crit>eps & iter<100) { c1.old <- c1 fc <- erhoLim(obj) - c1^2*r fcp <- erhoLimD(obj) - 2*c1*r obj@c1 <- c1 <- c1 - fc/fcp if(c1 < 0) obj@c1 <- c1 <- c1.old/2 crit <- abs(fc) ## print(c(iter,c1.old,crit)) iter <- iter+1 } # print(c(iter,c1,crit)) return(c(c1, pchisq(c1^2,p), log10(1-pchisq(c1^2,p)))) }) setMethod("csolve", "PsiBwt", function(obj) { ## find constants c1 and M that give a specified breakdown r ## and rejection point alpha n<-obj@n p<-obj@p r<-obj@r alpha<-obj@alpha if(r > (n-p)/(2*n)) obj@r <- r <- (n-p)/(2*n) # maximum achievable breakdown ## print(c(n,p,r,alpha)) ## ## if rejection is not achievable, use c1=0 and best rejection ## limvec <- arpLim(obj) if(1-limvec[2] <= alpha) { obj@c1 <- c1 <- 0 obj@M <- M <- sqrt(qchisq(1-alpha, p)) ## print("adjusting alpha") ## print(c(alpha, M, c1)) } else { c1.plus.M <- sqrt(qchisq(1-alpha,p)) obj@M <- M <- sqrt(p) obj@c1 <- c1 <- c1.plus.M - M iter <- 1 crit <- 100 eps <- 1e-5 while(crit > eps & iter<100){ deps <- 1e-4 M.old <- M c1.old <- c1 er <- erho(obj) fc <- er - r*(M^2/2+c1*(5*c1+16*M)/30) obj1 <- obj; obj1@c1 <- c1+deps obj2 <- obj; obj2@M <- M+deps fcc1 <- (erho(obj1) - er)/deps fcM <- (erho(obj2) - er)/deps ## fcp <- fcM - fcc1 - r*(M-(5*c1+16*M)/30+c1*9/30) fcp <- fcM - fcc1 - r*(M-(5*c1+16*M)/30+c1*11/30) # changed according to CB obj@M <- M <- M - fc/fcp if(M >= c1.plus.M ){ obj@M <- M <- (M.old + c1.plus.M)/2 } obj@c1 <- c1 <- c1.plus.M - M crit <- abs(fc) ## print(c(iter, M.old, c1.old, crit)) iter <- iter+1 } } return(obj) }) rrcov/R/transform.R0000644000176200001440000000067613022513664013757 0ustar liggesuserstransform.ilr <- function(x) { x.ilr <- x[, -ncol(x), drop=FALSE] colnames(x.ilr) <- paste("X", 1:ncol(x.ilr), sep="") rownames(x.ilr) <- NULL D <- ncol(x) for (i in 1:ncol(x.ilr)){ x.ilr[,i]=sqrt((D-i)/(D-i+1))*log(((apply(as.matrix(x[,(i+1):D,drop=FALSE]),1,prod))^(1/(D-i)))/(x[,i])) ##x.ilr[,i]=sqrt((D-i)/(D-i+1))*log(apply(as.matrix(x[,(i+1):D]), 1, gm)/(x[,i])) } return(-x.ilr) } rrcov/R/QdaCov.R0000644000176200001440000001052312763517421013117 0ustar liggesusers## The S3 version QdaCov <- function (x, ...) UseMethod("QdaCov") QdaCov.formula <- function(formula, data, ..., subset, na.action) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- QdaCov.default(x, grouping, ...) ## res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as 'formula' cl <- match.call() cl[[1]] <- as.name("QdaCov") res@call <- cl ## res$contrasts <- attr(x, "contrasts") ## res$xlevels <- .getXlevels(Terms, m) ## res$na.action <- attr(m, "na.action") res } QdaCov.default <- function(x, grouping, prior = proportions, tol = 1.0e-4, method=CovControlMcd(), ...) { if(is.null(dim(x))) stop("x is not a matrix") ## method <- match.arg(method) xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(length(grouping) == 1) { ## this is the number of groups and the groups are of equal size ng = grouping ni = n/ng if(ng*ni < n) stop("nrow(x) is not divisible by the number of groups") grouping <- rep(0,0) for(i in 1:ng) grouping <- c(grouping, rep(i,ni)) }else if(length(grouping) > 1 && length(grouping) < n) { ## grouping contains a vector with the group sizes ng <- length(grouping) if(sum(grouping) != n) stop("nrow(x) is not equal to n1+n2+...+nn") gx <- rep(0,0) for(i in 1:ng) gx <- c(gx, rep(i,grouping[i])) grouping <- gx } if(n != length(grouping)) stop("nrow(x) and length(grouping) are different") g <- as.factor(grouping) lev <- lev1 <- levels(g) counts <- as.vector(table(g)) if(!missing(prior)) { if(any(prior < 0) || round(sum(prior), 5) != 1) stop("invalid prior") if(length(prior) != nlevels(g)) stop("prior is of incorrect length") prior <- prior[counts > 0] } if(any(counts == 0)) { warning(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) lev1 <- lev[counts > 0] g <- factor(g, levels=lev1) counts <- as.vector(table(g)) } proportions <- counts/n ng <- length(proportions) names(g) <- NULL names(prior) <- levels(g) if(missing(method)) method <- "mcd" xcov <- .allcovMcd(x, grouping, method, ...) return (new("QdaCov", call=xcall, prior=prior, counts=counts, center=xcov$means, cov=xcov$cov, covinv=xcov$covinv, covdet=xcov$covdet, method=xcov$method, control=xcov$control, X=x, grp=g)) } .allcovMcd <- function(x, grouping, method=CovControlMcd(), ...){ xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) dimn <- dimnames(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts/n) # compute group means and covariance matrices for each group mX <- matrix(0,ng,p) covX <- array(0,c(p,p,ng)) covInv <- array(0,c(p,p,ng)) covdet <- vector(mode="numeric", length=ng) for(i in 1:ng){ mcdControl <- .covRobustControl(method) mcd <- CovRobust(x[which(g == lev[i]),], control=mcdControl) mX[i,] <- getCenter(mcd) covX[,,i] <- getCov(mcd) covInv[,,i] <- solve(getCov(mcd)) covdet[i] <- det(getCov(mcd)) } dimnames(mX) <- list(levels(g), dimn[[2]]) dimnames(covX) <- list(dimn[[2]], dimn[[2]], levels(g)) dimnames(covInv) <- list(dimn[[2]], dimn[[2]], levels(g)) names(covdet) <- levels(g) ans <- list(call=xcall, means=mX, cov=covX, covinv=covInv, covdet=covdet, method=getMeth(mcd), control=mcdControl) class(ans) <- "allcov" return(ans) } rrcov/R/PcaHubert.R0000644000176200001440000006775314131111615013622 0ustar liggesusers##setGeneric("PcaHubert", function(x, ...) standardGeneric("PcaHubert")) ##setMethod("PcaHubert", "formula", PcaHubert.formula) ##setMethod("PcaHubert", "ANY", PcaHubert.default) setMethod("getQuan", "PcaHubert", function(obj) obj@quan) ## The S3 version PcaHubert <- function (x, ...) UseMethod("PcaHubert") PcaHubert.formula <- function (formula, data = NULL, subset, na.action, ...) { cl <- match.call() mt <- terms(formula, data = data) if (attr(mt, "response") > 0) stop("response not allowed in formula") mf <- match.call(expand.dots = FALSE) mf$... <- NULL mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) ## this is not a `standard' model-fitting function, ## so no need to consider contrasts or levels if (.check_vars_numeric(mf)) stop("PCA applies only to numerical variables") na.act <- attr(mf, "na.action") mt <- attr(mf, "terms") attr(mt, "intercept") <- 0 x <- model.matrix(mt, mf) res <- PcaHubert.default(x, ...) ## fix up call to refer to the generic, but leave arg name as `formula' cl[[1]] <- as.name("PcaHubert") res@call <- cl # if (!is.null(na.act)) { # res$na.action <- na.act # if (!is.null(sc <- res$x)) # res$x <- napredict(na.act, sc) # } res } PcaHubert.default <- function(x, k=0, kmax=10, alpha=0.75, mcd=TRUE, skew=FALSE, maxdir=250, scale=FALSE, signflip=TRUE, crit.pca.distances=0.975, trace=FALSE, ...) { ## k - Number of principal components to compute. If \code{k} is missing, ## or \code{k = 0}, the algorithm itself will determine the number of ## components by finding such \code{k} that \code{l_k/l_1 >= 10.E-3} and ## \code{sum_1:k l_j/sum_1:r l_j >= 0.8}. It is preferable to ## investigate the scree plot in order to choose the number ## of components and the run again. Default is \code{k=0}. ## ## kmax - Maximal number of principal components to compute Default is \code{kmax=10}. ## If \code{k} is provided, \code{kmax} does not need to be specified, ## unless \code{k} is larger than 10. ## alpha This parameter measures the fraction of outliers the algorithm should ## resist. In MCD alpha controls the size of the subsets over which the determinant ## is minimized, i.e. alpha*n observations are used for computing the determinant. ## Allowed values are between 0.5 and 1 and the default is 0.5. ## mcd - Logical - when the number of variables is sufficiently small, ## the loadings are computed as the eigenvectors of the MCD covariance matrix, ## hence the function \code{\link{CovMcd}()} is automatically called. The number of ## principal components is then taken as k = rank(x). Default is \code{mcd=TRUE}. ## If \code{mcd=FALSE}, the ROBPCA algorithm is always applied. ## trace whether to print intermediate results. Default is \code{trace = FALSE}} ## Example: ## data(hbk) ## pca <- PcaHubert(hbk) ## ## The value returned by 'PcaHubert' is an S4 object containing the following slots: ## ## loadings - Robust loadings (eigenvectors) ## eigenvalues - Robust eigenvalues ## center - Robust center of the data ## scores - Robust scores ## k - Number of (chosen) principal components ## ## quan - The quantile h used throughout the algorithm ## sd - Robust score distances within the robust PCA subspace ## od - Orthogonal distances to the robust PCA subspace ## cutoff - Cutoff values for the robust score and orthogonal distances ## flag - The observations whose score distance is larger than result.cutoff.sd ## or whose orthogonal distance is larger than result$cutoff$od ## can be considered as outliers and receive a flag equal to zero. ## The regular observations receive a flag 1. ## This implementation followes closely the Matlab implementation, available as part of 'LIBRA, ## a Matlab Library for Robust Analysis': ## www.wis.kuleuven.ac.be/stat/robust.html cl <- match.call() if(missing(x)) stop("You have to provide at least some data") data <- as.matrix(x) n <- nrow(data) p <- ncol(data) ## ___Step 1___: Reduce the data space to the affine subspace spanned by the n observations ## Apply svd() to the mean-centered data matrix. If n > p we use the kernel approach - ## the decomposition is based on computing the eignevalues and eigenvectors of(X-m)(X-m)' Xsvd <- .classPC(data, scale=scale, signflip=signflip, scores=TRUE) if(Xsvd$rank == 0) stop("All data points collapse!") myrank <- Xsvd$rank ## VT::27.08.2010: introduce 'scale' parameter; return the scale in the value object ## myscale = if(is.logical(scale) && !scale) vector('numeric', p) + 1 else Xsvd$scale ## ## verify and set the input parameters: alpha, k and kmax ## determine h based on alpha and kmax, using the function h.alpha.n() ## ## VT::06.11.2012 - kmax <= floor(n/2) is too restrictive ## kmax <- max(min(floor(kmax), floor(n/2), Xsvd$rank),1) kmax <- max(min(floor(kmax), Xsvd$rank),1) if((k <- floor(k)) < 0) k <- 0 else if(k > kmax) { warning(paste("The number of principal components k = ", k, " is larger then kmax = ", kmax, "; k is set to ", kmax,".", sep="")) k <- kmax } if(missing(alpha)) { default.alpha <- alpha h <- min(h.alpha.n(alpha, n, kmax), n) alpha <- h/n if(k == 0) { if(h < floor((n+kmax+1)/2)) { h <- floor((n+kmax+1)/2) alpha <- h/n warning(paste("h should be larger than (n+kmax+1)/2. It is set to its minimum value ", h, ".", sep="")) } } else { if(h < floor((n+k+1)/2)) { h <- floor((n+k+1)/2) alpha <- h/n warning(paste("h should be larger than (n+k+1)/2. It is set to its minimum value ", h, ".", sep="")) } } if(h > n) { alpha <- default.alpha if(k == 0) h <- h.alpha.n(alpha, n, kmax) else h <- h.alpha.n(alpha, n, k) warning(paste("h should be smaller than n = ", n, ". It is set to its default value ", h, ".", sep="")) } }else { if(alpha < 0.5 | alpha > 1) stop("Alpha is out of range: should be between 1/2 and 1") if(k == 0) h <- h.alpha.n(alpha, n, kmax) else h <- h.alpha.n(alpha, n, k) } X <- Xsvd$scores center <- Xsvd$center rot <- Xsvd$loadings ## ## ___Step 2___: Either calculate the standard PCA on the MCD covariance matrix (p< apply MCD { if(trace) cat("\nApplying MCD.\n") X.mcd <- CovMcd(as.data.frame(X), alpha=alpha) X.mcd.svd <- svd(getCov(X.mcd)) rank <- ncol(X) ## The covariance matrix is not singular ev <- X.mcd.svd$d if(trace) cat("\nEigenvalues of S0: ", ev, "\nTotal variance: ", sum(ev), "\nExplained variance: ", cumsum(ev)/sum(ev), "\n") ## VT::08.10.2021 - fix the explained variance in case when k < p. ## these will be shown in summary() eig0 <- ev totvar0 <- sum(ev) Hsubsets0 <- c() ## VT::11.28.2015: Choose the number of components k (if not specified) ## ## Use the test l_k/l_1 >= 10.E-3, i.e. the ratio of ## the k-th eigenvalue to the first eigenvalue (sorted decreasingly) is larger than ## 10.E/3 and the fraction of the cumulative dispersion is larger or equal 80% ## if(k != 0) k <- min(k, ncol(X)) else { test <- which(ev/ev[1] <= 1.E-3) k <- if(length(test) != 0) min(min(rank, test[1]), kmax) else min(rank, kmax) cumulative <- cumsum(ev[1:k])/sum(ev) if(cumulative[k] > 0.8) { k <- which(cumulative >= 0.8)[1] } if(trace) cat("\n k, kmax, rank, p: ", k, kmax, rank, p, "\n") if(trace) cat("The number of principal components is defined by the algorithm. It is set to ", k,".\n", sep="") } scores <- (X - matrix(rep(getCenter(X.mcd), times=nrow(X)), nrow=nrow(X), byrow=TRUE)) %*% X.mcd.svd$u ## VT::19.08.2016: we need also to rescale back the MCD center, ## before adding it to the original center ## center <- as.vector(center + getCenter(X.mcd) %*% t(rot)) center <- as.vector(center + sweep(getCenter(X.mcd) %*% t(rot), 2, myscale, "*")) eigenvalues <- X.mcd.svd$d[1:k] loadings <- Xsvd$loadings %*% X.mcd.svd$u[,1:k] scores <- as.matrix(scores[,1:k]) if(is.list(dimnames(data)) && !is.null(dimnames(data)[[1]])) { dimnames(scores)[[1]] <- dimnames(data)[[1]] } else { dimnames(scores)[[1]] <- 1:n } dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) dimnames(scores)[[2]] <- as.list(paste("PC", seq_len(ncol(scores)), sep = "")) res <- new("PcaHubert",call=cl, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=myscale, rank=myrank, scores=scores, k=k, quan=X.mcd@quan, alpha=alpha, skew=FALSE, ao=NULL, eig0=eig0, totvar0=totvar0, n.obs=n) } else # p > n or mcd=FALSE => apply the ROBPCA algorithm { if(trace) cat("\nApplying the projection method of Hubert: skew=", skew, "\n") ## VT::28.07.2020 - add adjusted for skewed data mode ## 1) in 'skew' mode instead of the SD outlyingness, calculated ## the adjusted outlyingness, using robustbase ## function adjOutlyingness() outl <- if(skew) adjOutlyingness(X, ndir=maxdir, alpha.cutoff=alpha, mcfun=mcVT)$adjout else outl(X, maxdir=maxdir, h=h) ## We could use adjOutlyingness() with clower=0 and cupper=0 to compute ## the SD outlyingness, will be a bit faster. But the result is slightly ## different, I have not invetigate further - adjOutlyingness() generates ## maxdir p-samples while outl() gets all directions through two points. ## ## else adjOutlyingness(X, ndir=maxdir, alpha.cutoff=alpha, clower=0, cupper=0)$adjout H0 <- order(outl) # index of the observations ordered by (increasing) outlyingness Xh <- X[H0[1:h],,drop=FALSE] # the h data points with smallest outlyingness. # VT::24.04.2020 Keep Xh as a matrix (drop=FALSE), otherwise .classPC will not work. Xh.svd <- .classPC(Xh) kmax <- min(Xh.svd$rank, kmax) if(trace){ cat("\nEigenvalues of S0: ", Xh.svd$eigenvalues, "\nTotal variance: ", sum(Xh.svd$eigenvalues), "\nExplained variance: ", cumsum(Xh.svd$eigenvalues)/sum(Xh.svd$eigenvalues), "\n") } ## VT::08.10.2021 - fix the explained variance in case when k < p. ## these will be shown in summary() eig0 <- Xh.svd$eigenvalues totvar0 <- sum(Xh.svd$eigenvalues) Hsubsets0 <- H0[1:h] ## ## Find the number of PC 'k' ## Use the test l_k/l_1 >= 10.E-3, i.e. the ratio of ## the k-th eigenvalue to the first eigenvalue (sorted decreasingly) is larger than ## 10.E/3 and the fraction of the cumulative dispersion is larger or equal 80% ## if(k == 0) { test <- which(Xh.svd$eigenvalues/Xh.svd$eigenvalues[1] <= 1.E-3) k <- if(length(test) != 0) min(min(Xh.svd$rank, test[1]), kmax) else min(Xh.svd$rank, kmax) cumulative <- cumsum(Xh.svd$eigenvalues[1:k])/sum(Xh.svd$eigenvalues) if(cumulative[k] > 0.8) { k <- which(cumulative >= 0.8)[1] } if(trace) cat(paste("The number of principal components is set by the algorithm. It is set to ", k, ".\n", sep="")) } if(trace) cat("\nXsvd$rank, Xh.svd$rank, k and kmax: ", Xsvd$rank, Xh.svd$rank, k, kmax,"\n") ## perform extra reweighting step if(k != Xsvd$rank) { if(trace) cat("\nPerform extra reweighting step (k != rank)", k) ## VT::27.08.2010 - bug report from Stephen Milborrow: if n is small relative to p ## k can be < Xsvd$rank but larger than Xh.svd$rank - the number of observations in ## Xh.svd is roughly half of these in Xsvd k <- min(Xh.svd$rank, k) XRc <- X - matrix(rep(Xh.svd$center, times=n), nrow=n, byrow=TRUE) Xtilde <- XRc %*% Xh.svd$loadings[,1:k] %*% t(Xh.svd$loadings[,1:k]) Rdiff <- XRc - Xtilde odh <- apply(Rdiff, 1, vecnorm) ## ## VT::28.07.2020 - replace the calculation of the cutoff for od ## by a call to .crit.od(). ## 2) In adjusted for skewed data mode replace the cutoff for ## the orthogonal distances. ## ## umcd <- unimcd(odh^(2/3), h) ## cutoffodh <- sqrt(qnorm(0.975, umcd$tmcd, umcd$smcd)^3) ## cutoffodh <- .crit.od(odh, crit=0.975, method=ifelse(skew, "skewed", "umcd"), quan=h) indexset <- (odh <= cutoffodh) if(trace) { cat("\nCutoff for the orthogonal distances:\n.........: ", cutoffodh) cat("\numcd.....: ", .crit.od(odh, method="umcd", quan=h), "\n") cat("\nmedmad...: ", .crit.od(odh), "\n") cat("\nskewed...: ", .crit.od(odh, method="skewed"), "\n") cat("\nclassic..: ", .crit.od(odh, method="classic"), "\n") } Xh.svd <- .classPC(X[indexset,]) k <- min(Xh.svd$rank, k) if(trace) cat("\nPerform extra reweighting step (k != rank)", k, "...Ready.") } ## Project the data points on the subspace spanned by the first k0 eigenvectors ## VT::19.08.2016: we need also to rescale back the MCD center, ## before adding it to the original center ## center <- center + Xh.svd$center %*% t(rot) center <- center + sweep(Xh.svd$center %*% t(rot), 2, myscale, "*") rot <- rot %*% Xh.svd$loadings X2 <- (X - matrix(rep(Xh.svd$center, times=n), nrow=n, byrow=TRUE)) %*% Xh.svd$loadings X2 <- as.matrix(X2[ ,1:k]) rot <- as.matrix(rot[ ,1:k]) ## VT::28.07.2020 - - add adjusted for skewed data mode ## 3) Adjusted mode for skewed data: Instead of applying the reweighted ## MCD estimator, we calculate the adjusted outlyingness in the ## k-dimensional subspace V_1 and compute the mean and covariance ## matrix of the h points with the lowest adjusted outlyingness. outproj <- if(skew) projectAO(X2, k=k, alpha=alpha, h=h, rot=rot, center=center, scale=myscale, maxdir=maxdir, trace=trace) else projectMCD(X2, ev=Xh.svd$eigenvalues, k=k, alpha=alpha, h=h, niter=100, rot=rot, center=center, scale=myscale, trace=trace) center <- outproj$center eigenvalues <- outproj$eigenvalues loadings <- outproj$loadings scores <- outproj$scores if(is.list(dimnames(data)) && !is.null(dimnames(data)[[1]])) { dimnames(scores)[[1]] <- dimnames(data)[[1]] } else { dimnames(scores)[[1]] <- 1:n } dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), sep = "")) dimnames(scores)[[2]] <- as.list(paste("PC", seq_len(ncol(scores)), sep = "")) res <- new("PcaHubert",call=cl, loadings=loadings, eigenvalues=eigenvalues, center=center, scale=myscale, rank=myrank, scores=scores, k=k, quan=h, alpha=alpha, skew=skew, ao=outproj$ao, eig0=eig0, totvar0=totvar0, n.obs=n) } cl[[1]] <- as.name("PcaHubert") res@call <- cl ## Compute distances and flags res <- pca.distances(res, data, Xsvd$rank, crit.pca.distances) return(res) } ## ## Returns 'ndirect' (random) directions through the data - ## each through a pair of (randomly choosen) data points. ## If all=TRUE all possible directions (all possible pairs of points) ## are returned. ## extradir <- function(data, ndirect, all=TRUE){ if(all) # generate all possible directions (all pairs of n points) { cc <- combn(nrow(data), 2) B2 <- data[cc[1,],] - data[cc[2,],] } else { # generate 'ndirect' random directions if(TRUE){ uniran <- function(seed = 0){ seed<-floor(seed*5761)+999 quot<-floor(seed/65536) seed<-floor(seed)-floor(quot*65536) random<-seed/65536 list(seed=seed, random=random) } ## ## Draws a random subsubsample of k objects out of n. ## This function is called if not all (p+1)-subsets ## out of n will be considered. ## randomset <- function(n, k, seed){ ranset <- vector(mode="numeric", length=k) for(j in 1:k){ r <- uniran(seed) seed <- r$seed num <- floor(r$random * n) + 1 if(j > 1){ while(any(ranset == num)){ r <- uniran(seed) seed <- r$seed num <- floor(r$random * n) + 1 } } ranset[j] <- num } ans<-list() ans$seed <- seed ans$ranset <- ranset ans } n <- nrow(data) p <- ncol(data) r <- 1 B2 <- matrix(0,ndirect, p) seed <- 0 while(r <= ndirect) { sseed <- randomset(n, 2, seed) seed <- sseed$seed B2[r,] <- data[sseed$ranset[1], ] - data[sseed$ranset[2],] r <- r + 1 } } else { B2 <- matrix(0,ndirect, ncol(data)) for(r in 1:ndirect) { smpl <- sample(1:nrow(data), 2) # choose a random pair of points B2[r,] <- data[smpl[1], ] - data[smpl[2], ] # calculate the random direction based on these points } } } return(B2) } outl <- function(X, maxdir=250, h) { if(!is.matrix(X)) X <- as.matrix(X) n <- nrow(X) p <- ncol(X) ## For each direction 'v' through 2 data points we project the n data points xi on v ## and compute their robustly standardized absolute residual ## |xi'v - tmcd(xj'v|/smcd(xj'v) ## alldir <- choose(n, 2) # all possible directions through two data points - n*(n-1)/2 ndir <- min(maxdir, alldir) # not more than maxdir (250) all <- (ndir == alldir) # all directions if n small enough (say n < 25) B <- extradir(X, ndir, all=all) # the rows of B[ndir, ncol(X)] are the (random) directions Bnorm <- vector(mode="numeric", length=nrow(B)) # ndir x 1 Bnorm <- apply(B, 1, vecnorm) # Bnormr <- Bnorm[Bnorm > 1.E-12] # choose only the nonzero length vectors m <- length(Bnormr) # the number of directions that will be used B <- B[Bnorm > 1.E-12,] # B[m x ncol(X)] A <- diag(1/Bnormr) %*% B # A[m x ncol(X)] Y <- X %*% t(A) # n x m - projections of the n points on each of the m directions Z <- matrix(0,n, m) # n x m - to collect the outlyingness of each point on each direction for(i in 1:m) { umcd <- unimcd(Y[,i], quan=h) # one-dimensional MCD: tmcd and smcd if(umcd$smcd < 1.E-12) { ## exact fit situation: will not be handled if((r2 <- rankMM(X[umcd$weights==1,])) == 1) stop("At least ", sum(umcd$weights), " observations are identical.") } else Z[,i] <- abs(Y[,i] - umcd$tmcd) / umcd$smcd } outl <- apply(Z, 1, max) # n x 1 - the outlyingnesses of all n points outl } unimcd <- function(y, quan){ out <- list() ncas <- length(y) len <- ncas-quan+1 if(len == 1){ out$tmcd <- mean(y) out$smcd <- sqrt(var(y)) } else { ay <- c() I <- order(y) y <- y[I] ay[1] <- sum(y[1:quan]) for(samp in 2:len){ ay[samp]<-ay[samp-1]-y[samp-1]+y[samp+quan-1] } ay2<-ay^2/quan sq<-c() sq[1]<-sum(y[1:quan]^2)-ay2[1] for(samp in 2:len){ sq[samp]<-sq[samp-1]-y[samp-1]^2+y[samp+quan-1]^2-ay2[samp]+ay2[samp-1] } sqmin<-min(sq) Isq<-order(sq) ndup<-sum(sq == sqmin) ii<-Isq[1:ndup] slutn<-c() slutn[1:ndup]<-ay[ii] initmean<-slutn[floor((ndup+1)/2)]/quan initcov<-sqmin/(quan-1) res<-(y-initmean)^2/initcov sortres<-sort(res) factor<-sortres[quan]/qchisq(quan/ncas,1) initcov<-factor*initcov res<-(y-initmean)^2/initcov quantile<-qchisq(0.975,1) out$weights<-(res 1 & lmu != p)) stop("'mu' must be a numeric vector of length ", p) if(lmu == 1) mu <- rep(mu, p) if(!missing(conf.level) && (length(conf.level) != 1 || !is.finite(conf.level) || conf.level < 0 || conf.level > 1)) stop("'conf.level' must be a single number between 0 and 1") alpha <- 1 - conf.level ## One sample test - y == NULL if(is.null(y)) { alternative <- paste("true mean vector is not equal to", paste("(", paste(round(mu, digits=3), collapse = ", "), ")'", sep = ""), "\n") null.value <- mu METHOD = "One-sample Hotelling test" if(method == "c"){ xbar <- colMeans(x) xdiff <- xbar - mu V <- var(x) d <- p * (n-1)/(n-p) q <- n-p T2 <- STATISTIC <- n * crossprod(xdiff, solve(V, xdiff))[1, ] F <- STATISTIC <- STATISTIC/d PVALUE <- 1 - pf(STATISTIC, p, n - p) PARAMETER <- c(p, n - p) ESTIMATE = t(as.matrix(xbar)) rownames(ESTIMATE) <- "mean x-vector" }else if(method == "mcd"){ mcd <- CovMcd(x, trace=FALSE, alpha=0.75) xbar <- getCenter(mcd) xdiff <- xbar - mu V <- getCov(mcd) xdq <- .getApprox(p, n) d <- xdq$d q <- xdq$q T2 <- STATISTIC <- n * crossprod(xdiff, solve(V, xdiff))[1, ] F <- STATISTIC <- STATISTIC/d PVALUE <- 1 - pf(STATISTIC, p, q) PARAMETER <- c(p, q) ESTIMATE = t(as.matrix(xbar)) rownames(ESTIMATE) <- "MCD x-vector" METHOD <- paste(METHOD, " (Reweighted MCD Location)") } else stop(paste("Invalid method=",method)) cutoff.alpha <- qf(1-alpha, p, q) ## simultaneous confidence intervals for the components of mu conf.int <- matrix(1:(2*p), nrow=p) for(i in 1:p) { conf.int[i,1] <- xbar[i] - sqrt(1/n*d*qf(1-alpha, p, q) * V[i,i]) conf.int[i,2] <- xbar[i] + sqrt(1/n*d*qf(1-alpha, p, q) * V[i,i]) } dimnames(conf.int) <- list(dimnames(x)[[2]], c("Lower bound","Upper bound")) attr(conf.int,"conf.level") <- conf.level ## switch off the confidence intervals, since 'htest' ## does not know how to print them conf.int <- NULL } else { if(method != "c") stop("Robust two-sample test not yet implemeted!") xbar <- colMeans(x) ybar <- colMeans(y) xdiff <- xbar - ybar # the difference between the two means Vx <- var(x) Vy <- var(y) V <- ((n1 - 1) * Vx + (n2 - 1) * Vy) / (n1+ n2 - 2) # the pooled covariance matrix df1 <- p df2 <- n1 + n2 - p - 1 T2 <- STATISTIC <- crossprod(xdiff, solve(V, xdiff))[1,] * n1 * n2 / (n1+n2) F <- STATISTIC <- STATISTIC * (n1 + n2 - p - 1) / (n1 + n2 - 2) / p PVALUE <- 1 - pf(STATISTIC, df1, df2) PARAMETER = c(df1, df2) null.value <- NULL METHOD = "Two-sample Hotelling test" ESTIMATE = rbind(xbar, ybar) rownames(ESTIMATE) <- c("mean x-vector", "mean y-vector") alternative <- paste("true difference in mean vectors is not equal to (", paste(rep(0,p), collapse=","),")", sep="") conf.int <- NULL } names(PARAMETER) <- c("df1", "df2") ## names(STATISTIC) <- "T^2" STATISTIC <- c(T2, F) names(STATISTIC) <- c("T2", "F") rval <- list(statistic = STATISTIC, parameter = PARAMETER, p.value = PVALUE, conf.int=conf.int, estimate=ESTIMATE, null.value = NULL, alternative = alternative, method=METHOD, data.name=dname) class(rval) <- "htest" return(rval) } T2.test.formula <- function(formula, data, subset, na.action, ...) { if(missing(formula) || (length(formula) != 3) || (length(attr(terms(formula[-2]), "term.labels")) != 1)) 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[[1]] <- as.name("model.frame") m$... <- NULL mf <- eval(m, parent.frame()) DNAME <- paste(names(mf), collapse = " by ") names(mf) <- NULL response <- attr(attr(mf, "terms"), "response") g <- factor(mf[[-response]]) if(nlevels(g) != 2) stop("grouping factor must have exactly 2 levels") xind <- which(g==levels(g)[1]) yind <- which(g==levels(g)[2]) y <- T2.test(x=mf[[response]][xind,], y=mf[[response]][yind,], ...) y$data.name <- DNAME y } ## ## Validate that 'x' is a numeric data frame or matrix. ## Convert 'x' to a matrix ## Optionally drop all rows with missing values ## .tomatrix <- function(x, drop.missing=TRUE){ x.name <- deparse(substitute(x)) msg <- paste(x.name, " is not a numeric dataframe or matrix.") if(is.vector(x) || (is.matrix(x) && !is.data.frame(x))) { if(!is.numeric(x)) stop(msg) } if(!is.vector(x) && !is.matrix(x) || is.data.frame(x)) { if((!is.data.frame(x) && !is.numeric(x)) || (!all(sapply(x, data.class) == "numeric"))) stop(msg) } x <- as.matrix(x) if(drop.missing){ ## drop all rows with missing values na.x <- !is.finite(x %*% rep(1, ncol(x))) xok <- !na.x x <- x[xok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") } x } .kappa.s <- function(alfa, p) { ## Computes the asymptotic variance for the reweighted ## MCD location estimator ## - p is the dimension ## - alfa, between 1/2 and 1 is the percentage of the observations ## that are used to determine the raw MCD. alfa <- 1 - alfa qalfa <- qchisq(1 - alfa, p) calfainvers <- pgamma(qalfa/2, p/2 + 1) c2 <- -1/2 * pgamma(qalfa/2, p/2 + 1) effrr <- (4 * c2^2)/calfainvers delta <- 0.025 qdelta <- qchisq(1 - delta, p) c1invers <- pgamma(qdelta/2, p/2 + 1) c2delta <- -1/2 * pgamma(qdelta/2, p/2 + 1) c1tilde <- pgamma(qdelta/2, p/2) asvar <- (1 + (2 * c2delta)/c1tilde)^2/effrr asvar <- asvar - (calfainvers * (c1tilde + 2 * c2delta))/(c1tilde^2 * c2) asvar <- asvar + c1invers/c1tilde^2 return(asvar) } ## ## F approximation for the robust Hotelling test - Willems et al ## Calculate the factor d and the degrees of freedom q for a given n and p ## .getApprox <- function(p, n) { ## determining the estimates for E[X] and Var[X] coeffpqp2varx <- matrix(c(7,4.829586,2.868279,10,4.261745,3.023672),ncol=2) coeffpqp2ex <- matrix(c(7,1.050505,1.360808,10,0.7280273,1.4685161),ncol=2) limvarx <- .kappa.s(0.75, p)^2*2*p limex <- .kappa.s(0.75, p)*p vb1 <- exp(coeffpqp2varx[2,1])/p^(coeffpqp2varx[3,1]) vb2 <- exp(coeffpqp2varx[2,2])/p^(coeffpqp2varx[3,2]) vb <- c(log(vb1),log(vb2)) va12 <- log(7*p^2) va22 <- log(10*p^2) vA <- matrix(c(1,va12,1,va22), ncol=2, byrow=TRUE) vy <- if(p == 2) c(8.518773,-1.851881) else if(p == 1) c(6.202284,-1.731468) else solve(vA,vb) varx <- limvarx+exp(vy[1])/(n^(-vy[2])) eb1 <- exp(coeffpqp2ex[2,1])/p^(coeffpqp2ex[3,1]) eb2 <- exp(coeffpqp2ex[2,2])/p^(coeffpqp2ex[3,2]) eb <- c(log(eb1),log(eb2)) ea12 <- log(7*p^2) ea22 <- log(10*p^2) eA <- matrix(c(1,ea12,1,ea22), ncol=2, byrow=TRUE) ey <- if(p == 2) c(3.383723,-1.081893) else if(p == 1) c(2.741737,-1.403526) else solve(eA, eb) ex <- limex + exp(ey[1])/(n^(-ey[2])) ## matching the moments q <- (varx/ex^2*p/2-1)^(-1)*(p+2) + 4 ## When n gets large, the expression for q goes to infinity, ## but is very sensitive; no harm is done by setting q equal ## to n when the expression yields negative or extremely large values if(q > n || q < 0) q <- n d <- ex*(q-2)/q list(d=d, q=q) } rrcov/R/Wilks.test.R0000644000176200001440000003034612763517421014016 0ustar liggesusersWilks.test <- function(x, ...) UseMethod("Wilks.test") Wilks.test.formula <- function(formula, data, ..., subset, na.action) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) if (.check_vars_numeric(m)) stop("Wilks test applies only to numerical variables") Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- Wilks.test.default(x, grouping, ...) res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as `formula' cl <- match.call() cl[[1]] <- as.name("Wilks.test") res$call <- cl res$contrasts <- attr(x, "contrasts") res$xlevels <- .getXlevels(Terms, m) res$na.action <- attr(m, "na.action") res } Wilks.test.data.frame <- function(x, ...) { res <- Wilks.test(structure(data.matrix(x), class="matrix"), ...) cl <- match.call() cl[[1]] <- as.name("Wilks.test") res$call <- cl res } Wilks.test.matrix <- function(x, grouping, ..., subset, na.action) { if(!missing(subset)) { x <- x[subset, , drop = FALSE] grouping <- grouping[subset] } if(!missing(na.action)) { dfr <- na.action(structure(list(g = grouping, x = x), class = "data.frame")) grouping <- dfr$g x <- dfr$x } res <- Wilks.test.default(x, grouping, ...) cl <- match.call() cl[[1]] <- as.name("Wilks.test") res$call <- cl res } ## ## Default S3 method for Wilks.test ## ## x - matrix or data frame ## grp - grouping variable - factor specifying the class for each observation ## approximation - ## method - "c" for standard estimators of the mean and variance, "mcd" for robust estimates based on MCD. ## xq - used only when method="mcd". Multiplication factor for the approximate Chi2 distribution. If NULL ## simulation will be performed to determine xq and xd (default is NULL) ## xd - used only when method="mcd". Degrees of freedom for the approximate Chi2 distribution. If NULL ## simulation will be performed to determine xq and xd (default is NULL) ## nrep - number of trials for the simulation for estimating xq and xd (default is 3000) ## trace - whether to provide trace output (default is FALSE) ## Wilks.test.default <- function(x, grouping, method=c("c", "mcd", "rank"), approximation=c("Bartlett", "Rao", "empirical"), xd=NULL, xq=NULL, xfn = NULL, xwl=NULL, nrep=3000, trace=FALSE, ...){ alpha <- 0.5 ## approximation <- "Bartlett" ## approximation <- "empirical" cl <- match.call() method <- match.arg(method) approximation <- match.arg(approximation) dname <- deparse(substitute(x)) if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") grouping <- grouping[ok] n <- nrow(x) p <- ncol(x) if(method == "rank") x <- apply(x, 2, rank) ww <- .wilks(x, grouping, method, alpha=alpha) nk <- ww$nk ng <- length(nk) wilks <- ww$wilks METHOD = NULL PARAMETER = NULL if(approximation == "Bartlett") { ## Bartlett's ChiSq approximation Y <- log(wilks) if(method == "mcd"){ if(missing(xd) || is.null(xd) || missing(xq) || is.null(xq)){ xqd <- simulateChi2(nrep=nrep, nk, p, trace=trace, alpha=alpha) xd <- xqd$xd xq <- xqd$xq xfn <- xqd$xfn xwl <- xqd$xwl } STATISTIC <- wilks chi2.value <- Y/xd df <- xq names(STATISTIC) <- "Wilks' Lambda" # "Chi2-approximation (simulated)" METHOD <- "Robust One-way MANOVA (Bartlett Chi2)" }else{ STATISTIC <- wilks chi2.value <- -(n - 1 - (p+ng)/2)*Y df <- p*(ng-1) names(STATISTIC) <- "Wilks' Lambda" # "Chi2-approximation" METHOD <- "One-way MANOVA (Bartlett Chi2)" } PVAL <- 1-pchisq(chi2.value, df) PARAMETER <- c(chi2.value, df) names(PARAMETER) <- c("Chi2-Value", "DF") }else if(approximation == "Rao"){ ## Rao's F approximation t1 <- p*p*(ng-1)*(ng-1) - 4 t2 <- p*p + (ng-1)*(ng-1) - 5 t <- if(t1==0 | t2 == 0) 1 else sqrt(t1/t2) ## t <- sqrt((p*p*(ng-1)*(ng-1) - 4)/(p*p + (ng-1)*(ng-1) - 5)) df1 <- p*(ng-1) df2 <- t*((n-1) - (p + ng)/2) - (p*(ng-1) - 2)/2 # instead of n - the total number of observations - use # the sum of weights ? Y <- wilks^(1/t) STATISTIC <- df2*(1-Y)/(df1*Y) PVAL <- 1-pf(STATISTIC, df1, df2) PARAMETER <- c(df1,df2) names(STATISTIC) <- "F-approximation" names(PARAMETER) <- c("DF1", "DF2") }else if(approximation == "empirical") { Y <- log(wilks) if(method == "mcd"){ if(missing(xd) || is.null(xd) || missing(xq) || is.null(xq)){ xqd <- simulateChi2(nrep=nrep, nk, p, trace=trace, alpha=alpha) xd <- xqd$xd xq <- xqd$xq xfn <- xqd$xfn xwl <- xqd$xwl } STATISTIC <- wilks METHOD <- "Robust One-way MANOVA (empirical distribution)" PVAL <- xfn(wilks) }else{ STATISTIC <- wilks chi2.value <- -(n - 1 - (p+ng)/2)*Y df <- p*(ng-1) names(STATISTIC) <- "Wilks' Lambda" # "Chi2-approximation" METHOD <- "One-way MANOVA (Bartlett Chi2)" PVAL <- 1-pchisq(chi2.value, df) PARAMETER <- c(chi2.value, df) names(PARAMETER) <- c("Chi2-Value", "DF") } } ans <- list(statistic=STATISTIC, parameter=PARAMETER, p.value=PVAL, estimate=ww$group.means, method=METHOD, data.name=dname, W=ww$W, T=ww$T, wilks=wilks, xd=xd, xq=xq, xfn=xfn, xwl=xwl) cl[[1]] <- as.name("Wilks.test") ans$call <- cl class(ans) <- "htest" ans } covMWcd <-function(x, grouping, alpha=0.75){ ## compute group means, pool the observations and compute the common ## covariance matrix covMWcd.B <- function(){ group.means <- matrix(0, ng, p) for(i in 1:ng){ mcd <- CovMcd(x[which(grouping == lev[i]),], alpha=alpha) group.means[i,] <- getCenter(mcd) } mcd <- CovMcd(x - group.means[g,], alpha=alpha) ans <- list(center=group.means, wcov=getCov(mcd), mah=getDistance(mcd), wt=mcd@wt) class(ans) <- "mwcd" attr(ans, "call") <- sys.call() return(ans) } x <-as.matrix(x) p <- ncol(x) n <- nrow(x) g <- as.factor(grouping) lev <- levels(g) ng <- length(lev) covMWcd.B() } ## ## Find by simulation the parameters 'd' and 'q' of the approximate Chi2 distribution ## for the robust Wilks Lambda test based on MCD ## for a given p, g and n=\sum ni ## ## nrep - number of trials (3000) ## nk - array of integers giving the group sizes, e.g. nk=c(20, 20) ## p - dimension ## simulateChi2 <- function(nrep=3000, nk, p, trace=FALSE, alpha=0.75){ if(missing(nk)) stop("The number and size of groups must be provided!") if(missing (p)) stop("The dimensipon 'p' must be provided") if(trace) cat("\nFind approximate distribution...\n") ptm <- proc.time() n <- sum(nk) ng <- length(nk) grp <- as.factor(rep(1:ng, nk)) wl <- rwl <- vector(mode = "numeric", length = nrep) for(i in 1:nrep){ # x <- as.matrix(mvrnorm(n=n, mu=rep(0,p), Sigma=diag(rep(1,p)))) x <- matrix(rnorm(n*p), ncol=p) tt <- .wilks(x, grp, method="c", alpha=alpha) rtt <- .wilks(x, grp, method="mcd", alpha=alpha) wl[i] <- tt$wilks rwl[i] <- rtt$wilks } Y <- log(wl) RY <- log(rwl) xmean <- mean(Y) xvar <- var(Y) xq <- 2*xmean*xmean/xvar xd <- xmean/xq rxmean <- mean(RY) rxvar <- var(RY) rxq <- 2*rxmean*rxmean/rxvar rxd <- rxmean/rxq rxfn <- ecdf(rwl) if(trace){ cat(sprintf('\n nrep=%5.0f p=%4.0f ng=%2.0f n=%5.0f', nrep,p,ng,n)) cat(sprintf('\n alpha=%5.2f', alpha)) cat(sprintf('\n mean var d q')) cat(sprintf('\n %5.3f %5.3f', -1/(n-1-(p*ng)/2), p*(ng-1))) cat(sprintf('\n WILKS: %5.3f %5.3f %5.3f %5.3f', xmean, xvar, xd, xq)) cat(sprintf('\nR WILKS: %5.3f %5.3f %5.3f %5.3f', rxmean, rxvar, rxd, rxq)) cat("\n") cat(" Elapsed time: ", (proc.time() - ptm)[1],"\n") } invisible(list(xd=rxd, xq=rxq, xfn=rxfn, xwl=rwl)) } .wilks <- function(x, grouping, method, alpha=0.75){ n <- nrow(x) p <- ncol(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) ## get rid of empty groups grouping <- g <- as.factor(as.character(g)) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts) if(method == "c" | method == "rank"){ wts <- rep(1, n) }else if(method == "mcd"){ mcd <- covMWcd(x, grouping=grouping, alpha=alpha) wts <- mcd$wt }else stop("Undefined method: ", method) group.means <- matrix(0,ng,p) for(i in 1:ng){ group.means[i,] <- cov.wt(x[which(grouping == lev[i]),], wt=wts[which(grouping == lev[i])])$center } wcross <- cov.wt((x - group.means[g, ]), wt=wts) wcross <- (sum(wts)-1) * wcross$cov tcross <- cov.wt(x, wt=wts) tcross <- (sum(wts)-1) * tcross$cov wilks <- det(wcross)/det(tcross) names(wilks) <- "Wilks' Lambda" names(group.means) <- names(x) dimnames(group.means) <- list(lev, dimnames(x)[[2]]) list(nk=counts, wilks=wilks, W=wcross, T=tcross, group.means=group.means) } .wilksx <- function(x, grouping, method, alpha=0.75){ n <- nrow(x) p <- ncol(x) if(!is.factor(g <- grouping)) g <- as.factor(grouping) ## get rid of empty groups g <- as.factor(as.character(g)) lev <- levels(g) counts <- as.vector(table(g)) if(any(counts == 0)) { stop(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) } ng <- length(counts) if(method == "c" | method == "rank"){ wts <- rep(1, n) }else if(method == "mcd"){ mcd <- covMWcd(x, grouping=grouping, alpha=alpha) wts <- mcd$wt }else stop("Undefined method: ", method) group.means <- matrix(0,ng,p) for(i in 1:ng){ group.means[i,] <- cov.wt(x[which(grouping == lev[i]),], wt=wts[which(grouping == lev[i])])$center } wcross <-cov.wt((x - group.means[g, ]), wt=wts) wcross <- (sum(wts)-1) * wcross$cov tcross <- cov.wt(x, wt=wts) tcross <- (sum(wts)-1) * tcross$cov wilks <- det(wcross)/det(tcross) names(wilks) <- "Wilks' Lambda" names(group.means) <- names(x) dimnames(group.means) <- list(lev, dimnames(x)[[2]]) list(nk=counts, wilks=wilks, W=wcross, T=tcross, group.means=group.means) } rrcov/R/Qda.R0000644000176200001440000000564212763517421012455 0ustar liggesuserssetMethod("show", "Qda", function(object){ if(!is.null(cl <- object@call)) { names(cl)[2] <- "" cat("Call:\n") dput(cl) } digits = max(3, getOption("digits") - 3) cat("\nPrior Probabilities of Groups:\n") print(object@prior) cat("\nGroup means:\n") print(object@center) ng <- length(object@prior) for(i in 1:ng){ cat("\nGroup: ",levels(object@grp)[i], "\n") print(object@cov[,,i]) } # cat("\nLinear Coeficients:\n") # print(object@ldf) # cat("\nConstants:\n") # print(object@ldfconst) # svd <- x$svd # names(svd) <- dimnames(x$scaling)[[2]] # if(length(svd) > 1) { # cat("\nProportion of trace:\n") # print(round(svd^2/sum(svd^2), 4), ...) # } invisible(object) }) setMethod("predict", "Qda", function(object, newdata){ ct <- FALSE if(missing(newdata)) { newdata <- object@X # use the training sample ct <- TRUE # perform cross-validation } x <- as.matrix(newdata) if(ncol(x) != ncol(object@center)) stop("wrong number of variables") ret <- .mypredictQda(object@prior, levels(object@grp), object@center, object@covinv, object@covdet, x) if(ct) ret@ct <- mtxconfusion(object@grp, ret@classification) ret }) .mypredictQda <- function(prior, lev, center, covinv, covdet, x){ ng <- length(prior) nm <- names(prior) if(is.null(nm)) nm <- lev xx <- matrix(0, nrow=nrow(x), ncol=ng) posterior <- xx for(j in 1:nrow(x)){ for(i in 1:ng){ xx[j,i] <- (x[j,]-center[i,]) %*% covinv[,,i] %*% (x[j,]-center[i,]) + log(covdet[i]) - 2*log(prior[i]) xx[j,i] <- -0.5*xx[j,i] } } for(i in 1:nrow(xx)){ tmp <- sum(exp(xx[i,])) for(j in 1:ncol(xx)) posterior[i,j] <- exp(xx[i,j])/tmp } cl <- factor(nm[max.col(xx)], levels = lev) new("PredictQda", classification=cl, posterior=posterior, x = xx) } setMethod("show", "PredictQda", function(object){ if(!is.null(object@ct)) { tab <- object@ct acctab <- t(apply(tab, 1, function(x) x/sum(x))) dimnames(acctab) <- dimnames(tab) AER <- 1 - sum(diag(tab))/sum(tab) prt <- as.matrix(round(c("Apparent error rate" = AER),4)) colnames(prt) <- "" print(prt) cat("\nClassification table", "\n") print(tab) cat("\nConfusion matrix", "\n") print(round(acctab, 3)) } else print(object@classification) ## print(object@posterior) ## print(object@x) invisible(object) }) setMethod("summary", "Qda", function(object, ...){ new("SummaryQda", qdaobj=object) }) setMethod("show", "SummaryQda", function(object){ show(object@qdaobj) invisible(object) }) rrcov/R/dets.R0000644000176200001440000002616512763517421012712 0ustar liggesusers## ## Input: ## x - a data matrix of size (n,p) ## hsets.init ## scalefn ## k - number of refining iterations in each subsample (default=2) ## best.r - number of "best betas" to remember from the subsamples. ## These will be later iterated until convergence (default=5) ## kp, cc - tunning constants for the S-estimator with Tukey's biweight ## function given the breakdown point (bdp) and the dimension p ## ## Output: a list with components ## center - robust estimate of location (vector: length) ## cov - robust estimate of scatter (matrix: p,p) ## crit - value of the objective function (number) ## ..detSloc <- function(x, hsets.init=NULL, save.hsets=missing(hsets.init), full.h=save.hsets, scalefn, maxisteps = 200, warn.nonconv.csteps = FALSE, ## k=0, # no need of preliminary refinement ## best.r=6, # iterate till convergence on all 6 sets kp, cc, trace=as.integer(trace)) { ## NOTES: ## - in the functions rho, psi, and scaledpsi=psi/u (i.e. the weight function) ## is used |x| <= c1 ## ## - function resdis() to compute the distances is used instead of ## mahalanobis() - slightly faster ## The bisquare rho function: ## ## | x^2/2 - x^4/2*c1^2 + x^6/6*c1^4 |x| <= c1 ## rho(x) = | ## | c1^2/6 |x| > c1 ## rho <- function(u, cc) { w <- abs(u) <= cc v <- (u^2/2 * (1 - u^2/cc^2 + u^4/(3*cc^4))) * w + (1-w) * (cc^2/6) v } ## The corresponding psi function: psi = rho' ## ## | x - 2x^3/c1^2 + x^5/c1^4 |x| <= c1 ## psi(x) = | ## | 0 |x| > c1 ## ## using ifelse is 3 times slower psi <- function(u, c1) { ##ifelse(abs(u) < c1, u - 2 * u^3/c1^2 + u^5/c1^4, 0) pp <- u - 2 * u^3/c1^2 + u^5/c1^4 pp*(abs(u) <= c1) } ## weight function = psi(u)/u scaledpsi <- function(u, cc) { ##ifelse(abs(xx) < c1, xx - 2 * xx^3/c1^2 + xx^5/c1^4, 0) pp <- (1 - (u/cc)^2)^2 pp <- pp * cc^2/6 pp*(abs(u) <= cc) } ## the objective function, we solve loss.S(u, s, cc) = b for "s" loss.S <- function(u, s, cc) mean(rho(u/s, cc)) norm <- function(x) sqrt(sum(x^2)) ## Returns square root of the mahalanobis distances of x with respect to mu and sigma ## Seems to be somewhat more efficient than sqrt(mahalanobis()) - by factor 1.4! resdis <- function(x, mu, sigma) { central <- t(x) - mu sqdis <- colSums(solve(sigma, central) * central) dis <- sqdis^(0.5) dis } ## Computes Tukey's biweight objective function (scale) ## (respective to the mahalanobis distances u) using the ## rho() function and the konstants kp and c1 scaleS <- function(u, kp, c1, initial.sc=median(abs(u))/.6745) { ## find the scale, full iterations maxit <- 200 eps <- 1e-20 sc <- initial.sc for(i in 1:maxit) { sc2 <- sqrt(sc^2 * mean(rho(u/sc, c1)) / kp) if(abs(sc2/sc - 1) <= eps) break sc <- sc2 } return(sc) } ## ## Do "k" iterative reweighting refining steps from "initial.mu, initial.sigma" ## ## If "initial.scale" is present, it's used, o/w the MAD is used ## ## k = number of refining steps ## conv = 0 means "do k steps and don't check for convergence" ## conv = 1 means "stop when convergence is detected, or the ## maximum number of iterations is achieved" ## kp and cc = tuning constants of the equation ## re.s <- function(x, initial.mu, initial.sigma, initial.scale, k, conv, maxisteps=200, kp, cc) { n <- nrow(x) p <- ncol(x) rdis <- resdis(x, initial.mu, initial.sigma) if(missing(initial.scale)) { initial.scale <- scale <- median(abs(rdis))/.6745 } else { scale <- initial.scale } ## if conv == 1 then set the max no. of iterations to 50 magic number alert!!! if(conv == 1) k <- maxisteps mu <- initial.mu sigma <- initial.sigma for(i in 1:k) { ## do one step of the iterations to solve for the scale scale.super.old <- scale scale <- sqrt(scale^2 * mean(rho(rdis/scale, cc)) / kp) ## now do one step of reweighting with the "improved scale" weights <- scaledpsi(rdis/scale, cc) W <- weights %*% matrix(rep(1,p), ncol=p) xw <- x * W/mean(weights) mu.1 <- apply(xw,2,mean) res <- x - matrix(rep(1,n),ncol=1) %*% mu.1 sigma.1 <- t(res) %*% ((weights %*% matrix(rep(1,p), ncol=p)) * res) sigma.1 <- (det(sigma.1))^(-1/p) * sigma.1 if(.isSingular(sigma.1)) { mu.1 <- initial.mu sigma.1 <- initial.sigma scale <- initial.scale break } if(conv == 1) { ## check for convergence if(norm(mu - mu.1) / norm(mu) < 1e-20) break ## magic number alert!!! } rdis <- resdis(x,mu.1,sigma.1) mu <- mu.1 sigma <- sigma.1 if(i >= k & warn.nonconv.csteps) warning("Convergence not reached up to max.number of iterations: ", k) } iter <- i rdis <- resdis(x,mu,sigma) ## get the residuals from the last beta ## return the number of iterations return(list(mu.rw = mu.1, sigma.rw=sigma.1, scale.rw = scale, iter=iter)) } ################################################################################################ n <- nrow(x) p <- ncol(x) h <- h.alpha.n(0.5, n, p) ## Center and scale the data z <- doScale(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(!is.matrix(hsets.init) || dh[1] < h || dh[2] < 1) stop("'hsets.init' must be a h' x L matrix (h' >= h) of observation indices") if(full.h && dh[1] != n) stop("When 'full.h' is true, user specified 'hsets.init' must have n rows") } ## Construction of h-subset: take the first h observations hsets <- hsets.init[1:h, , drop=FALSE] ## select the first h ranked observations nsets <- NCOL(hsets) hset.csteps <- integer(nsets) best.r <- nsets k <- 0 best.mus <- matrix(0, best.r, p) best.sigmas <- matrix(0,best.r*p,p) best.scales <- rep(1e20, best.r) s.worst <- 1e20 n.ref <- 1 ## Iterate now through the initial h-subsets for(i in 1:nsets) { if(trace) { if(trace >= 2) cat(sprintf("H-subset %d = observations c(%s):\n-----------\n", i, paste(hsets.init[1:h,i], collapse=", "))) else cat(sprintf("H-subset %d: ", i)) } indices <- hsets[, i] # start with the i-th initial set xs <- x[indices,] mu <- colMeans(xs) sigma <- cov(xs) singular <- .isSingular(sigma) sigma <- det(sigma)^(-1/p) * sigma ## Perform k steps of iterative reweighting on the elemental set if(k > 0) { ## do the refining tmp <- re.s(x=x, initial.mu=mu, initial.sigma=sigma, k=k, conv=0, kp=kp, cc=cc) mu.rw <- tmp$mu.rw sigma.rw <- tmp$sigma.rw scale.rw <- tmp$scale.rw rdis.rw <- resdis(x, mu.rw, sigma.rw) } else { ## k = 0 means "no refining" mu.rw <- mu sigma.rw <- sigma rdis.rw <- resdis(x, mu.rw, sigma.rw) scale.rw <- median(abs(rdis.rw))/.6745 } if(i > 1) { ## if this isn't the first iteration.... ## check whether new mu/sigma belong to the top best results; if so keep ## mu and sigma with corresponding scale. scale.test <- loss.S(rdis.rw, s.worst, cc) if(scale.test < kp) { s.best <- scaleS(rdis.rw, kp, cc, scale.rw) ind <- order(best.scales)[best.r] best.scales[ind] <- s.best best.mus[ind,] <- mu.rw bm1 <- (ind-1)*p; best.sigmas[(bm1+1):(bm1+p),] <- sigma.rw s.worst <- max(best.scales) } } else { ## if this is the first iteration, then this is the best solution anyway... best.scales[best.r] <- scaleS(rdis.rw, kp, cc, scale.rw) best.mus[best.r,] <- mu.rw bm1 <- (best.r-1)*p; best.sigmas[(bm1+1):(bm1+p),] <- sigma.rw } } ## do the complete refining step until convergence (conv=1) starting ## from the best subsampling candidate (possibly refined) super.best.scale <- 1e20 for(i in best.r:1) { index <- (i-1)*p tmp <- re.s(x=x, initial.mu=best.mus[i,], initial.sigma=best.sigmas[(index+1):(index+p),], initial.scale=best.scales[i], k=0, conv=1, maxisteps=maxisteps, kp=kp, cc=cc) if(tmp$scale.rw < super.best.scale) { super.best.scale <- tmp$scale.rw super.best.mu <- tmp$mu.rw super.best.sigma <- tmp$sigma.rw ind.best <- i # to determine which subset gives best results. } hset.csteps[i] <- tmp$iter # how many I-steps necessary to converge. if(trace) cat(sprintf("%3d csteps, scale=%g", tmp$iter, tmp$scale.rw)) } super.best.sigma <- super.best.scale^2*super.best.sigma return(list( center=as.vector(super.best.mu), cov=super.best.sigma, crit=super.best.scale, iter=hset.csteps[ind.best], iBest = ind.best, hset.csteps = hset.csteps, initHsets=if(save.hsets) hsets.init, kp=kp, cc=cc, method="S-estimates: DET-S")) } rrcov/R/CovMve.R0000644000176200001440000001636013711101477013140 0ustar liggesusersCovMve <- function(x, alpha=1/2, nsamp=500, seed=NULL, trace=FALSE, control) { use.correction <- FALSE ## Analize 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. defcontrol <- CovControlMcd() # default control if(!missing(control)){ if(alpha == defcontrol@alpha) alpha <- control@alpha if(nsamp == defcontrol@nsamp) nsamp <- control@nsamp if(is.null(seed) || seed == defcontrol@seed) seed <- control@seed if(trace == defcontrol@trace) trace <- control@trace } tolSolve <- defcontrol@tolSolve xcall <- match.call() if(length(seed) > 0) { if(exists(".Random.seed", envir=.GlobalEnv, inherits=FALSE)) { seed.keep <- get(".Random.seed", envir=.GlobalEnv, inherits=FALSE) on.exit(assign(".Random.seed", seed.keep, envir=.GlobalEnv)) } assign(".Random.seed", seed, envir=.GlobalEnv) } ## Options "best" and "exact" for nsamp ## nsamp will be further analized in the wrapper .fastmcd() ## VT::31.07.2020 - fix an old bug - MVA cannot handle nsamp="best" or "exact" if(!missing(nsamp) && !is.numeric(nsamp)) stop("Number of trials nsamp must be a positive number!") if(!missing(nsamp) && is.numeric(nsamp) && nsamp <= 0) stop("Invalid number of trials nsamp = ",nsamp, "!") if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] h <- h.alpha.n(alpha, n, p) # h(alpha) , the size of the subsamples ######## h <- floor(n/2) 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") } if(h > n) stop("Sample size n < h(alpha; n,p) := size of \"good\" subsample") else if(alpha > 1) stop("alpha must be <= 1") ## VT::29.07.2008 - 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=FALSE), the finite sample correction factor will not ## be used (neither for the raw estimates nor for the reweighted) ## ## The finite sample correction factors for MVE are not known, except ## for the very old cnp2=(1 + 15/(n - p))^2 (Rousseeuw&van Zomeren, 1988) ## therefore will remain always 1. ## ## The consistancy factor for the raw covariance is ## cf <- median(dist)/qchisq(0.5, p) ## ## FIXME: should be ## cf <- quantile(dist, alpha)/qchisq(alpha, p) ## raw.cnp2 <- cnp2 <- c(1,1) ## Case: alpha==1 ## ... ## ... ## Case p == 1 method <- "Minimum volume ellipsoid estimator" mve <- .fastmve(x, h, nsamp) ## Compute the consistency correction factor for the raw MCD ## (see calfa in Croux and Haesbroeck) ## calpha <- .MCDcons(p, h/n) ## VT::19.3.2007 mvecov <- cov.wt(x[mve$best,]) rcenter <- mvecov$center rcov <- mvecov$cov mah <- mahalanobis(x, rcenter, rcov, tol = tolSolve) calpha <- quantile(mah, h/n)/qchisq(h/n, p) # as in MASS names(calpha) <- NULL correct <- if(use.correction) (1 + 15/(n - p))^2 else 1. raw.cnp2 <- c(calpha, correct) rcov <- calpha * correct * rcov ## Again consider p == 1 ## else, i.e. p >= 2 ## handle exact fit, i.e. not general position situtations ## ## OK, in general position and mve$cov is not singular ## do reweighting ## FIXME: here we assume that mve$cov is not singular ## ----- but it could be! quantiel <- qchisq(0.975, p) mah <- mahalanobis(x, rcenter, rcov, tol = tolSolve) weights <- as.numeric(mah < quantiel) sum.w <- sum(weights) ## Compute and apply the consistency correction factor for ## the reweighted cov if(sum.w == n) { cdelta.rew <- 1 correct.rew <- 1 }else { cdelta.rew <- .MCDcons(p, sum.w/n) ## VT::: 19.07.2008 correct.rew <- if(use.correction) 1 else 1. cnp2 <- c(cdelta.rew, correct.rew) } xcov <- cov.wt(x, wt = weights) xcov$cov <- cdelta.rew * correct.rew * xcov$cov raw.mah <- mah raw.weights <- weights ## Check if the reweighted scatter matrix is singular and ## compute distances and weights based on it if( - (determinant(xcov$cov, logarithm = TRUE)$modulus[1] - 0)/p > 50) { ## ans$singularity <- list(kind = "reweighted.MCD") if(trace) cat("The reweighted MCD scatter matrix is singular.\n") mah <- raw.mah } else { mah <- mahalanobis(x, xcov$center, xcov$cov, tol = tolSolve) weights <- as.numeric(mah < quantiel) } ## ans <- new("CovMve", call=xcall, iter=nsamp, crit=mve$scale, cov=xcov$cov, center=xcov$center, mah=mah, wt=weights, n.obs=n, X=x, method=method, best=mve$best, alpha=alpha, quan=h, raw.center=rcenter, raw.cov=rcov, raw.mah=raw.mah, raw.wt=raw.weights, raw.cnp2=raw.cnp2, cnp2=cnp2 ) ans } .fastmve <- function(x, h, nsamp) { dx <- dim(x) n <- dx[1] p <- dx[2] nind <- p+1 tmp <- .C('r_fast_mve', x = if(is.double(x)) x else as.double(x), as.integer(n), as.integer(p), as.integer(nsamp), nsing = as.integer(0), ctr = as.double(rep(0,p)), cov = as.double(rep(0,p*p)), scale = as.double(0), best=as.integer(rep(0,n)), as.integer(nind), as.integer(h), as.double(qchisq(0.5, p)), PACKAGE="rrcov") mve.cov <- matrix(tmp$cov, p, p) return(list(center= tmp$ctr, cov=mve.cov, scale=tmp$scale, best=tmp$best[1:h], nsamp=nsamp, nsing = tmp$nsing)) } rrcov/R/CovRobust.R0000644000176200001440000002271313566527265013705 0ustar liggesusers## control can be a character specifying the name of the estimate, one of: ## auto, mcd, ogk, m, mve, sfast, surreal, bisquare, rocke ## If no control object is given or 'auto' is selected, the choice of the ## estimator will depend on the size of the data: ## - Stahel-Donoho: n < 1000 and p < 10 or n < 5000 and p < 5 ## - MCD: n < 50000 and p < 20 ## - OGK: otherwise ## CovRobust <- function(x, control, na.action = na.fail) { x <- na.action(x) 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)))) n <- nrow(x) p <- ncol(x) control <- .covRobustControl(control, n, p) restimate(control, x) } .covRobustControl <- function(method, n, p) { mm <- NULL if(missing(method)) mm <- "auto" else if(is.character(method)) mm <- casefold(method) ## either no control specified or the estimator is given by a character name - ## create the necessary control object. if(!is.null(mm)){ control <- switch(mm, auto = { if(missing(n) || missing(p)) CovControlMcd() else if(n < 1000 && p < 10 || n < 5000 && p < 5) CovControlSde() else if(n < 50000 && p < 10) CovControlSest(method="bisquare") else if(n < 50000 && p < 20) CovControlSest(method="rocke") else CovControlOgk(smrob="s_mad", svrob="qc") }, sde = CovControlSde(), mcd = CovControlMcd(), ogk = CovControlOgk(), m = CovControlMest(), mve = CovControlMve(), sfast = CovControlSest(method="sfast"), surreal = CovControlSest(method="surreal"), bisquare = CovControlSest(method="bisquare"), rocke = CovControlSest(method="rocke")) ## this is the 'default' option of the switch if(is.null(control)) stop(paste("Undefined estimator: ", method)) } else control <- method control } setMethod("isClassic", "CovRobust", function(obj) FALSE) setMethod("isClassic", "SummaryCovRobust", function(obj) FALSE) setMethod("getMeth", "CovRobust", function(obj) obj@method) setMethod("getRaw", "CovRobust", function(obj){ if(is(obj, "CovMcd") | is(obj, "CovMve") | is(obj, "CovOgk")) { obj@center <- obj@raw.center obj@cov <- obj@raw.cov obj@mah <- obj@raw.mah obj@wt <- obj@raw.wt } if(is(obj, "CovMcd") | is(obj, "CovMve")) { obj@cnp2 <- obj@raw.cnp2 } invisible(obj) }) ## ## Follow the standard methods: show, summary, plot ## setMethod("show", "CovRobust", function(object){ cat("\nCall:\n") print(object@call) cat("-> Method: ", object@method, "\n") if(is.list(object@singularity)) cat(strwrap(.MCDsingularityMsg(object@singularity, object@n.obs)), sep ="\n") digits = max(3, getOption("digits") - 3) cat("\nRobust Estimate of Location: \n") print.default(format(getCenter(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nRobust Estimate of Covariance: \n") print.default(format(getCov(object), digits = digits), print.gap = 2, quote = FALSE) invisible(object) }) setMethod("summary", "CovRobust", function(object, ...){ new("SummaryCovRobust", covobj=object, evals=eigen(object@cov)$values) }) setMethod("show", "SummaryCovRobust", function(object){ cat("\nCall:\n") print(object@covobj@call) digits = max(3, getOption("digits") - 3) cat("\nRobust Estimate of Location: \n") print.default(format(getCenter(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nRobust Estimate of Covariance: \n") print.default(format(getCov(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nEigenvalues of covariance matrix: \n") print.default(format(getEvals(object), digits = digits), print.gap = 2, quote = FALSE) cat("\nRobust Distances: \n") print.default(format(as.vector(getDistance(object)), digits = digits), print.gap = 2, quote = FALSE) }) ## VT::17.06.2008 ##setMethod("plot", "CovRobust", function(x, y="missing", setMethod("plot", signature(x="CovRobust", y="missing"), function(x, y="missing", which=c("dd", "all", "distance", "qqchi2", "tolEllipsePlot", "pairs", "screeplot", "xydistance", "xyqqchi2"), classic= FALSE, ask = (which=="all" && dev.interactive(TRUE)), cutoff, id.n, labels.id = rownames(x$X), tol = 1e-7, ...) { data <- getData(x) ## parameters and preconditions if(is.vector(data) || is.matrix(data)) { if(!is.numeric(data)) stop( "x is not a numeric dataframe or matrix.") } else if(is.data.frame(data)) { if(!all(sapply(data,data.class) == "numeric")) stop( "x is not a numeric dataframe or matrix.") } n <- dim(data)[1] p <- dim(data)[2] if(length(getCenter(x)) == 0 || length(getCov(x)) == 0) stop( "Invalid object: attributes center and cov missing!") if(length(getCenter(x)) != p) stop( "Data set and provided center have different dimensions!") ## Check for singularity of the cov matrix if(isSingular(x)) stop("The covariance matrix is singular!") if(missing(cutoff)) cutoff <- sqrt(qchisq(0.975, p)) 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,"}") } ## VT::12.11.2018 - In case of MRCD we can use also classic regularized estimate if(inherits(x, "CovMrcd")) { ccov <- CovMrcd(data, alpha=1) md <- sqrt(getDistance(ccov)) rd <- sqrt(getDistance(x)) } else { ccov <- CovClassic(data) md <- rd <- NULL if(!isSingular(ccov)) md <- sqrt(getDistance(ccov)) if(!isSingular(x)) rd <- sqrt(getDistance(x)) } which <- match.arg(which) op <- if (ask) par(ask = TRUE) else list() on.exit(par(op)) ## distance-distance plot: here we need both robust and mahalanobis distances if((which == "all" || which == "dd") && !is.null(md) && !is.null(rd)) { .myddplot(md, rd, cutoff=cutoff, id.n=id.n, ...) # distance-distance plot } ## index plot of mahalanobis distances if((which == "all" || which == "distance") && !is.null(rd)) { ylim <- NULL if(classic && !is.null(md)) { opr <- if(prod(par("mfrow")) == 1) par(mfrow=c(1,2), pty="m") else list() ##VT::10.11.2007 - set same scale on both plots ylim <- c(min(rd,md), max(md,rd)) } .mydistplot(rd, cutoff=cutoff, id.n=id.n, ...) # index plot of robust distances if(classic && !is.null(md)) { .mydistplot(md, cutoff=cutoff, classic=TRUE, id.n=id.n, ylim=ylim, ...) # index plot of mahalanobis distances par(opr) } } ## lattice: index plot of mahalanobis distances if(which == "xydistance" && !is.null(rd)) { print(.xydistplot(x, cutoff=cutoff, ...)) # lattice: index plot of robust distances } ## qq-plot of the mahalanobis distances versus the ## quantiles of the chi-squared distribution if((which == "all" || which == "qqchi2") && !is.null(rd)) { if(classic && !is.null(md)) { opr <- if(prod(par("mfrow")) == 1) par(mfrow=c(1,2), pty="m") else list() } .qqplot(rd, p, cutoff=cutoff, id.n=id.n, ...) # qq-plot of the robust distances versus the # quantiles of the chi-squared distribution if(classic && !is.null(md)) { .qqplot(md, p, cutoff=cutoff, classic=TRUE, id.n=id.n, ...) # qq-plot of the mahalanobis distances par(opr) } } ## lattice: qq-plot of the mahalanobis distances versus the ## quantiles of the chi-squared distribution if(which == "xyqqchi2" && !is.null(rd)) { print(.xyqqchi2(x, cutoff=cutoff, ...)) # lattice: qq-plot of the distances versus } if(which == "tolEllipsePlot" || which == "pairs") { if(which == "tolEllipsePlot" & length(dim(data)) >= 2 && dim(data)[2] == 2){ if(!is.null(rd)){ if(classic && !is.null(md)) .tolellipse(rcov=x, ccov = ccov, cutoff=cutoff, id.n=id.n, tol=tol, ...) else .tolellipse(rcov=x, cutoff=cutoff, id.n=id.n, tol=tol, ...) } }else if(length(dim(data)) >= 2 && dim(data)[2] <= 10) { .rrpairs(x, ...) }else if(which != "all") warning("Warning: For tolerance ellipses the dimension must be less than 10!") } if(which == "all" || which == "screeplot") { myscreeplot(ccov=ccov, rcov=x) } }) ## end { plot("CovRobust") } rrcov/R/LdaPP.R0000644000176200001440000002422512763517421012706 0ustar liggesusers## The S3 version LdaPP <- function (x, ...) UseMethod("LdaPP") LdaPP.formula <- function(formula, data, subset, na.action, ...) { m <- match.call(expand.dots = FALSE) m$... <- NULL m[[1]] <- as.name("model.frame") m <- eval.parent(m) Terms <- attr(m, "terms") grouping <- model.response(m) x <- model.matrix(Terms, m) xint <- match("(Intercept)", colnames(x), nomatch=0) if(xint > 0) x <- x[, -xint, drop=FALSE] res <- LdaPP.default(x, grouping, ...) ## res$terms <- Terms ## fix up call to refer to the generic, but leave arg name as 'formula' cl <- match.call() cl[[1]] <- as.name("LdaPP") res@call <- cl ## res$contrasts <- attr(x, "contrasts") ## res$xlevels <- .getXlevels(Terms, m) ## res$na.action <- attr(m, "na.action") res } LdaPP.default <- function(x, grouping, prior = proportions, tol = 1.0e-4, method = c("huber", "mad", "sest", "class"), optim = FALSE, trace=FALSE, ...) { if(is.null(dim(x))) stop("x is not a matrix") method <- match.arg(method) xcall <- match.call() x <- as.matrix(x) n <- nrow(x) p <- ncol(x) if(length(grouping) == 1) { ## this is the number of groups and the groups are of equal size ng = grouping ni = n/ng if(ng*ni < n) stop("nrow(x) is not divisible by the number of groups") grouping <- rep(0,0) for(i in 1:ng) grouping <- c(grouping, rep(i,ni)) }else if(length(grouping) > 1 && length(grouping) < n) { ## grouping contains a vector with the group sizes ng <- length(grouping) if(sum(grouping) != n) stop("nrow(x) is not equal to n1+n2+...+nn") gx <- rep(0,0) for(i in 1:ng) gx <- c(gx, rep(i,grouping[i])) grouping <- gx } if(n != length(grouping)) stop("nrow(x) and length(grouping) are different") g <- as.factor(grouping) lev <- lev1 <- levels(g) counts <- as.vector(table(g)) if(!missing(prior)) { if(any(prior < 0) || round(sum(prior), 5) != 1) stop("invalid prior") if(length(prior) != nlevels(g)) stop("prior is of incorrect length") prior <- prior[counts > 0] } if(any(counts == 0)) { warning(paste("group(s)", paste(lev[counts == 0], collapse=" "),"are empty")) lev1 <- lev[counts > 0] g <- factor(g, levels=lev1) counts <- as.vector(table(g)) } proportions <- counts/n ng <- length(proportions) names(g) <- NULL names(prior) <- levels(g) ############################################################# mrob <- if(method == "huber") .mrob.huber else if(method == "mad") .mrob.mad else if(method == "sest") .mrob.s else if(method == "class") .mrob.sd ## We have only two groups! n1 <- counts[1] n2 <- counts[2] ## a1 <- (n1-1)/(n-2) a1 <- n1/n a2 <- 1 - a1 raw.ldf <- ldf <- matrix(0, nrow=2, ncol=p) raw.ldfconst <- ldfconst <- rep(0,2) alpha <- .projpp(x, grp=g, a1, a2, mrob) dx <- .det.a0(alpha, x, grp=g, a1=a1, a2=a2, mrob=mrob, prior=prior) raw.ldf[1,] <- dx$alpha raw.ldfconst[1] <- dx$alpha0 ldf <- raw.ldf ldfconst <- raw.ldfconst if(optim) { sol.1 <- optim(dx$alpha, .auxPP, x=x, grp=g, a1=a1, a2=a2, mrob=mrob) if(sol.1$convergence != 0) sol.1 <- optim(sol.1$par, .auxPP, x=x, grp=g, a1=a1, a2=a2, mrob=mrob) dx <- .det.a0(sol.1$par, x, grp=g, a1=a1, a2=a2, mrob=mrob, prior=prior) ldf[1,] <- dx$alpha ldfconst[1] <- dx$alpha0 } return (new("LdaPP", call=xcall, prior=prior, counts=counts, raw.ldf=raw.ldf, raw.ldfconst=raw.ldfconst, ldf=ldf, ldfconst=ldfconst, method=method, X=x, grp=g)) } .projpp <- function(x, grp, a1, a2, mrob) { lev <- levels(grp) counts <- as.vector(table(grp)) p <- ncol(x) n1 <- counts[1] n2 <- counts[2] X1 <- x[grp == lev[1],] X2 <- x[grp == lev[2],] inull <- 0 dmax <- 0 alpha <- NULL imax <- 0 jmax <- 0 for(i in 1:n1) { for(j in 1:n2) { aux <- sqrt(sum((X1[i,] - X2[j,])**2)) dx <- (X1[i,] - X2[j,])/aux px1 <- as.vector(t(X1%*%dx)) px2 <- as.vector(t(X2%*%dx)) m1 <- mrob(px1) m2 <- mrob(px2) if(is.null(m1$mu) | is.null(m1$s) | is.null(m2$mu) | is.null(m2$s)) { inull <- inull + 1 if(inull > 10) stop("Too many unsuccessful S-estimations!") }else { xdist <- (m1$mu - m2$mu)**2/(m1$s**2*a1 + m2$s**2*a2) if(xdist > dmax) { dmax <- xdist alpha <- dx imax <- i jmax <- j } } } } alpha } .det.a0 <- function(alpha, x, grp, a1, a2, mrob, prior) { lev <- levels(grp) counts <- as.vector(table(grp)) p <- ncol(x) n1 <- counts[1] n2 <- counts[2] n <- n1 + n2 alpha <- alpha/sqrt(sum(alpha**2)) px <- as.vector(t(x%*%alpha)) m1 <- mrob(px[grp == lev[1]]) m2 <- mrob(px[grp == lev[2]]) if(m1$mu < m2$mu) { alpha <- -1*alpha m1$mu <- -1*m1$mu m2$mu <- -1*m2$mu } alpha0 <- -((m1$mu + m2$mu)/2 + log(prior[2]/prior[1])/(m1$mu - m2$mu)*(a1*m1$s**2 + a2*m2$s**2)) names(alpha0) <- NULL list(alpha=alpha, alpha0=alpha0) } ## ## A function to be maximized by Nelder and Mead algorithm in optim(), ## with first argument the vector of parameters over which ## maximization is to take place. It returns a scalar result. ## ## The initial values are from the projection algorithm ## .auxPP <- function(alpha, x, grp, a1, a2, mrob) { lev <- levels(grp) counts <- as.vector(table(grp)) p <- ncol(x) n1 <- counts[1] n2 <- counts[2] n <- n1 + n2 px <- as.vector(t(x%*%alpha)) m1 <- mrob(px[grp == lev[1]]) m2 <- mrob(px[grp == lev[2]]) ret <- -(m1$mu - m2$mu)**2/(m1$s**2*a1 + m2$s**2*a2) if(is.null(ret)) ret <- NA if(length(ret) == 0) { cat("\nERROR: length of distance for 'optim' equal to 0: ", ret, "\n") ret <- NA } ret } .mrob.sd <- function(y) { list(mu=mean(y, na.rm=TRUE), s=sd(y, na.rm=TRUE)) } .mrob.mad <- function(y) { list(mu=median(y, na.rm=TRUE), s=mad(y, na.rm=TRUE)) } .mrob.s <- function(y) { aux <- lmrob(y ~ 1) mu <- aux$init.S$coef names(mu) <- NULL s <- aux$init.S$scale ## mm=CovSest(as.matrix(y)) ## list(mu=mm@center, s=mm@cov[1,1]) list(mu=mu, s=s) } .mrob.huber <- function(y, k1=1.5, k2=2, tol=1e-06, iter=8) { if(any(i <- is.na(y))) y <- y[!i] n <- length(y) ## replicate the huberM() function from robustbase and add an ## iter parameter to be able to reproduce Ana's results # mx1 <- huberM(y, k=k1, tol=tol) mx1 <- .huberM(y, k=k1, tol=tol, iter=iter) k <- k2 mu <- median(y) s0 <- mx1$s th <- 2 * pnorm(k) - 1 beta <- th + k^2 * (1 - th) - 2 * k * dnorm(k) it <- 0:0 repeat { it <- it + 1:1 yy <- pmin(pmax(mu - k * s0, y), mu + k * s0) ss <- sum((yy - mu)^2)/n s1 <- sqrt(ss/beta) ## if(abs(s0-s1) < tol || (iter > 0 & it > iter)) if(it > iter) break s0 <- s1 } list(mu=mx1$mu, s=s0, it1=mx1$it, it2=it) } ## ## This is from robustbase - I added 'iter' parameter, ## only to be able to reproduce exactly na Pires' LdaPP ## FIXME: remove later ## .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), warn0scale = getOption("verbose"), iter=8) { 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 <- 0:0 if (sum.w == 0) return(list(mu = NA, s = NA, it = it)) 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 + 1:1 y <- pmin(pmax(mu - k * s, x), mu + k * s) mu1 <- wsum(y)/sum.w ## if (abs(mu - mu1) < tol * s) if (it > iter) break mu <- mu1 } } list(mu = mu, s = s, it = it) } ## ## Predict method for LdaPP - additional parameter raw=FALSE. ## If set to TRUE, the prediction will be done using the raw estimates ## (obtained by the first approximation algorithm). ## setMethod("predict", "LdaPP", function(object, newdata, raw=FALSE){ ct <- FALSE if(missing(newdata)) { newdata <- object@X # use the training sample ct <- TRUE # perform cross-validation } x <- as.matrix(newdata) if(length(object@center)>0 & ncol(x) != ncol(object@center) | ncol(x) != ncol(object@ldf)) stop("wrong number of variables") ldf <- if(raw) object@raw.ldf else object@ldf ldfconst <- if(raw) object@raw.ldfconst else object@ldfconst ret <- .mypredictLda(object@prior, levels(object@grp), ldf, ldfconst, x) if(ct) ret@ct <- mtxconfusion(object@grp, ret@classification) ret }) rrcov/R/covMest3.R0000644000176200001440000000510712763517421013447 0ustar liggesuserscovMest <- function(x, cor=FALSE, r = 0.45, arp = 0.05, eps=1e-3, maxiter=120, control, t0, S0) { .Deprecated(new="CovMest") ## Analize 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. if(!missing(control)){ defcontrol <- rrcov.control() # default control # if(r == defcontrol$r) r <- control$r # if(arp == defcontrol$arp) arp <- control$arp # if(eps == defcontrol$eps) eps <- control$eps # if(maxiter == defcontrol$maxiter) maxiter <- control$maxiter } if(is.data.frame(x)) x <- data.matrix(x) else if (!is.matrix(x)) x <- matrix(x, length(x), 1, dimnames = list(names(x), deparse(substitute(x)))) ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] if(n < 2 * p) stop("Need at least 2*(number of variables) observations ") ans <- list(method = "M-Estimates", call = match.call()) ## If not provided initial estimates, compute them as MVE ## Take the raw estimates and standardise the covariance ## matrix to determinant=1 if(missing(t0) || missing(S0)){ mcd <- CovMve(x) t0 <- mcd@raw.center S0 <- mcd@raw.cov detS0 <-det(S0) detS02 <- detS0^(1.0/p) S0 <- S0/detS02 } ## calculate the constants M and c ## for the translated biweight function psix <- new("PsiBwt", n=n, p=p, r=r, alpha=arp) psix <- csolve(psix) mest <- iterM(psix, x, t0, S0, eps=1e-3, maxiter=maxiter) ## this was the version without OO ##const <- csolve.bt(n, p, r, arp) ##mest <- .iterM(x, t0, S0, const$c1, const$M, eps, maxiter) ans$n.obs <- n ##ans$c1 <- const$c1 ##ans$M <- const$M ans$c1 <- psix@c1 ans$M <- psix@M ans$iter <- mest$iter ans$cov <- mest$s ans$center <- mest$t1 ans$mah <- mahalanobis(x, mest$t1, mest$s) ans$crit <- determinant(mest$s, logarithm = TRUE)$modulus[1] if(cor && !is.null(ans$cov)) cor <- cov2cor(ans$cov) class(ans) <- c("mest", "mcd") attr(ans, "call") <- sys.call() ans$method <- paste("M-Estimator.") ans$X <- x return(ans) } rrcov/R/CovMMest.R0000644000176200001440000002022212763517421013434 0ustar liggesusersCovMMest <- function(x, bdp=0.5, eff=0.95, eff.shape=TRUE, maxiter=50, trace=FALSE, tolSolve=1e-7, control ) { ## NOTES: ## - in the functions rho, psi, and scaledpsi=psi/u (i.e. the weight function) ## is used |x| <= c1 ## ## The bisquare rho function: ## ## | x^2/2 - x^4/2*c1^2 + x^6/6*c1^4 |x| <= c1 ## rho(x) = | ## | c1^2/6 |x| > c1 ## rho <- function(u, cc) { w <- abs(u) <= cc v <- (u^2/2 * (1 - u^2/cc^2 + u^4/(3*cc^4))) * w + (1-w) * (cc^2/6) v } ## The corresponding psi function: psi = rho' ## ## | x - 2x^3/c1^2 + x^5/c1^4 |x| <= c1 ## psi(x) = | ## | 0 |x| > c1 ## ## using ifelse is 3 times slower psi <- function(u, c1) { ##ifelse(abs(u) < c1, u - 2 * u^3/c1^2 + u^5/c1^4, 0) pp <- u - 2 * u^3/c1^2 + u^5/c1^4 pp*(abs(u) <= c1) } ## weight function = psi(u)/u scaledpsi <- function(u, cc) { ##ifelse(abs(xx) < c1, xx - 2 * xx^3/c1^2 + xx^5/c1^4, 0) pp <- (1 - (u/cc)^2)^2 pp <- pp * cc^2/6 pp*(abs(u) <= cc) } ## the objective function, we solve loss.S(u, s, cc) = b for "s" loss <- function(u, s, cc) mean(rho(u/s, cc)) ## Returns square root of the mahalanobis distances of x with respect to mu and sigma ## Seems to be somewhat more efficient than sqrt(mahalanobis()) - by factor 1.4! resdis <- function(x, mu, sigma) { central <- t(x) - mu sqdis <- colSums(solve(sigma, central) * central) dis <- sqdis^(0.5) dis } ## ## Compute weighted mean and covariance matrix ## The covariance is scaled to have det=1 ## covw <- function(x, wt=rep(1, nrow(x))) { if (is.data.frame(x)) x <- as.matrix(x) else if (!is.matrix(x)) stop("'x' must be a matrix or a data frame") if (!all(is.finite(x))) stop("'x' must contain finite values only") n <- nrow(x) p <- ncol(x) if(with.wt <- !missing(wt)) { if(length(wt) != n) stop("length of 'wt' must equal the number of rows in 'x'") if(any(wt < 0) || (s <- sum(wt)) == 0) stop("weights must be non-negative and not all zero") } center <- colSums(wt * x)/s x <- sqrt(wt) * sweep(x, 2, center, check.margin = FALSE) cov <- crossprod(x) cov <- det(cov)^(-1/p) * cov ret <- list(cov = cov, center = center, n.obs = n) ret } ## Analize 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. scontrol <- CovControlSest() if(!missing(control)){ defcontrol <- CovControlMMest() # default control if(bdp == defcontrol@bdp) bdp <- control@bdp # if(eff == defcontrol@eff) eff <- control@eff # if(maxiter == defcontrol@maxiter) maxiter <- control@maxiter # for bisquare and rocke if(trace == defcontrol@trace) trace <- control@trace if(tolSolve == defcontrol@tolSolve) tolSolve <- control@tolSolve scontrol <- control@sest scontrol@bdp = bdp } 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)))) xcall <- match.call() ## drop all rows with missing values (!!) : na.x <- !is.finite(x %*% rep(1, ncol(x))) ok <- !na.x x <- x[ok, , drop = FALSE] dx <- dim(x) if(!length(dx)) stop("All observations have missing values!") dimn <- dimnames(x) n <- dx[1] p <- dx[2] ## compute the constant c1 for the rho function of the MM-estimates c1 <- .csolve.bw.MM(p, eff, eff.shape=eff.shape) if(trace) cat("\nMM-EST...: bdp, eff, eff.shape, p, c1=", bdp, eff, eff.shape, p, c1, "\n") ## Compute the initial S-estimate ss <- CovSest(x, control=scontrol, trace=trace) if(trace) { cat("\nInitial S-estimates. Scale=", ss@crit, "\n") print(ss) } scale <- ss@crit cova <- getShape(ss) center <- getCenter(ss) rdis <- resdis(x, center, cova) keep <- ocrit <- crit <- loss(rdis, scale, c1) if(trace) { cat("\nInitial robust distances:\n") print(rdis) } ## Compute M-estimate with auxiliary scale. ## Start from an S-estimate and perform reweighted ## location/covariance steps for(iter in 1:maxiter) { if(trace) cat("\nITER=", iter,"\n") w <- scaledpsi(rdis/scale, c1) center <- as.vector(crossprod(w, x) / sum(w)) ccc <- covw(x, w) center <- ccc$center cova <- ccc$cov rdis <- resdis(x, center, cova) crit <- loss(rdis, scale, c1) ## cat("\noldobj, newobj, iter:",oldobj, newobj, oldobj-newobj, oldobj - newobj > tolSolve, iter,"\n") if(ocrit - crit <= tolSolve) break ocrit <- crit } cova <- cova*scale^2 ## Check if the loss function was at all reduced by ## the M-iterations. If not (which should never happen) ## simply return the S-estimate if(crit > keep) { center <- ss@center cova <- ss@cov } ans <- new("CovMMest", call = xcall, iter=iter, crit=ss@crit, cov=cova, center=center, c1=c1, n.obs=n, X = as.matrix(x), sest=ss, method="MM-estimates") ans } ## ## Compute the constant for the second Tukey Biweight rho-function for MM ## with for fixed shape-efficiency ## ## Adapted from Gert Willems: ## http://users.ugent.be/~svaelst/software/MMPCAboot.html ## .csolve.bw.MM <- function(p, eff, eff.shape=TRUE) { ## (taken from Claudia Becker's Sstart0 program) chi.int <- function(p, a, c1) { ## partial expectation d in (0,c1) of d^a under chi-squared p return(exp(lgamma((p + a) /2) - lgamma(p/2)) * 2^{a/2} * pchisq(c1^2, p + a)) } loceff.bw <- function(p, c1) { # called by csolve.bw.MM(); computes location efficiency corresponding to c1 alpha1 <- 1/p * (chi.int(p,2,c1) - 4*chi.int(p,4,c1)/(c1^2) + 6*chi.int(p,6,c1)/(c1^4) - 4*chi.int(p,8,c1)/(c1^6) + chi.int(p,10,c1)/(c1^8)) beta1.1 <- chi.int(p,0,c1) - 2*chi.int(p,2,c1)/(c1^2) + chi.int(p,4,c1)/(c1^4) beta1.2 <- chi.int(p,0,c1) - 6*chi.int(p,2,c1)/(c1^2) + 5*chi.int(p,4,c1)/(c1^4) beta1 <- (1-1/p)*beta1.1 + 1/p*beta1.2 return( beta1^2 / alpha1 ) } sigma1.bw <- function(p, c1) { gamma1.1 <- chi.int(p,2,c1) - 6*chi.int(p,4,c1)/(c1^2) + 5*chi.int(p,6,c1)/(c1^4) gamma1.2 <- chi.int(p,2,c1) - 2*chi.int(p,4,c1)/(c1^2) + chi.int(p,6,c1)/(c1^4) gamma1 <- (gamma1.1 + (p+1)*gamma1.2) / (p+2) sigma1.0 <- chi.int(p,4,c1) - 4*chi.int(p,6,c1)/(c1^2) + 6*chi.int(p,8,c1)/(c1^4) - 4*chi.int(p,10,c1)/(c1^6) + chi.int(p,12,c1)/(c1^8) return(sigma1.0 / (gamma1^2) * p/(p+2)) } maxit <- 1000 eps <- 1e-8 ## ctest <- csolve.bw.asymp(p,.5) cold <- ctest <- -.4024 + 2.2539 * sqrt(p) # very precise approximation for c corresponding to 50% bdp for(iter in 1:maxit) { ctest <- if(eff.shape) ctest * eff * sigma1.bw(p, ctest) else ctest * eff / loceff.bw(p, ctest) if(abs(cold-ctest) <= eps) break cold <- ctest } return(ctest) } rrcov/MD50000644000176200001440000002676514201201363011725 0ustar liggesusersd39d59ba3a7fb8fb2ab3062cf7ab7a3b *ChangeLog 4300ed3feb4a6a91505f865c9624992f *DESCRIPTION 84dca738d8b4ed74142a7351ff9a1626 *NAMESPACE a5da21cf03d6ad22f67d4fb0261f41c7 *R/AllClasses.R 2621b703a070a9cd1b9ca2b755e763d4 *R/AllGenerics.R 89ef1ac3a66741a805398b182367e500 *R/Cov.R 60b5c1fc509c2a1b3dc42703a58f22e9 *R/CovClassic.R a251d2fd0a1a2832a49eb128ae24783f *R/CovControl.R d5213b624b9c2424aa706d1600a87c34 *R/CovMMest.R f67189295e5bc982dc78ccfa6655e443 *R/CovMcd.R 7e71f38495389ced9e788151c196fe4a *R/CovMest.R 0bfe6fd9084c3f46acd7d80fd1f6aaad *R/CovMrcd.R e77a9543db99d9d22930bafdee807235 *R/CovMve.R e37a6bf70cfc6570731adafd7a6e8105 *R/CovOgk.R 0c633130bb04693e28191981e929f732 *R/CovRobust.R 574a90e594f83533862c70c3fb1e1ff9 *R/CovSde.R 906091b55297c88c4ecf65f1fe3ad3bc *R/CovSest.R 68c34b29dbfcf037efb45906f24b0f2c *R/Lda.R 6e9c08123c0cfb08471de32222065527 *R/LdaClassic.R 79e8c4f4ace04e529a247dc34aaa8178 *R/LdaPP.R 4a0e6f8505ec511da801a64a7de59a92 *R/Linda.R 1df73f965917983bc6d3825d329c2335 *R/Pca.R 61ab1768a8c05b26331fa0275028cd8b *R/PcaClassic.R 5e6c080f92f1dc6776e3825b45b0f846 *R/PcaCov.R 6d7929072127af0b91bca0ecf37481dd *R/PcaGrid.R b11bd75e18dd1f83a1053adf633bb043 *R/PcaHubert.R 51a5a540d995230f6b40c95be7c252ca *R/PcaLocantore.R f98340cf3d6c182d9ccd27def303fca3 *R/PcaProj.R 16c1b7d22de82739325c854e1237a0b4 *R/Qda.R 182e11977a3de4ea9a69183eee31a082 *R/QdaClassic.R a1959e4b3c1dfe604f6af39d6aed6da5 *R/QdaCov.R 87c98f445f110cee96b8a72ea2a86d78 *R/T2.test.R 8d653e5da779ecacdd895945c377abf1 *R/Wilks.test.R e5f1209f07d34ae6d8177ba5b6dad274 *R/adjoutlyingness.R 2dc89d15454adf96bdf3091bc436bf17 *R/covMest3.R 64fe6f0d948e281b7047b4921786b59c *R/da-utils.R effb21158f4a2d4190b092c9ec7926ff *R/datadoc.R 263546b6a3665cdf2429448df23c4851 *R/detmrcd.R 0c36abbd8796244b63400966be36ccd2 *R/dets.R 649f519e49932382f68de71ef9cbe6ba *R/donostah.R 2e9c5a036c54e986060d79884106ba0c *R/plot-utils.R 6731799ffde9689f52b53bd45a8273c2 *R/psibwt.R dcebffecd8cbf489cede75c6813eabed *R/psifun.R 3762b8071c38856c5fba22f1f17797f3 *R/transform.R bd6c4b899751d5a2e3c456fec562af91 *R/utils.R 5752f99eceda48e21d5743fe05c7c9b6 *R/zzz.R cbf61c94551141805858423d428557ce *README.md 8830e51dcdcf00f478b2df83fb668ffd *build/partial.rdb 6920d4d41007f69e5c3472b6c9e8990a *build/vignette.rds 899f2b545620189963315bbb32adc4c4 *data/Appalachia.rda 1aa276f2458c8fc9055997a088e0c304 *data/Cascades.rda 11677421feebcad8956ac34186cdd5fe *data/OsloTransect.rda bb8987d6fbab1b384cabbe2d1e42d046 *data/bus.rda d587319c0e3893ccfa9e5a1bbb486c02 *data/bushmiss.rda 2b238e8d4998876e5979ef8194286791 *data/diabetes.rda d2e3e564e6b9d71198d174162c5af913 *data/fish.rda d83f2afbb96f087514d7da8a278e646e *data/fruit.rda 1c8187f3b2a5021b5be018a460d800cb *data/hemophilia.rda f3f6d6dba95715de244501168ab3d4cc *data/lmom32.rda 120a1377fe7e4b966f06ab1dccdc0331 *data/lmom33.rda 203b4df7900df25b6c8e64759f4f93a5 *data/machines.rda 72399a3896c0f5406cd0520360a21708 *data/maryo.rda 657ff85e49face9121b79d7c3b8304b9 *data/octane.rda 873d3d527caf8f8f8c8ec93049003fe6 *data/olitos.rda 6a14e8030e68810955bafc0a3505627d *data/pottery.rda 6aaeb9f9e4f92b880959c2f00170b86f *data/rice.rda b7622a51ed292390f55580787e33b0a2 *data/salmon.rda 6b58f7379c98631f63be650d2733c63c *data/soil.rda dd5d85dd42a46db18602189d01e63633 *data/un86.rda 1db418f627559439f4a05bf83fed66d1 *data/wages.rda 2619b882e1e7319ece5b959538ee9536 *data/wolves.rda 370aa51f7863a0879c13767b12fced43 *inst/Citation 1b3e5be83fd8de9798cae51b9d4e0974 *inst/NEWS.Rd 0cd7cf2b0f3e787248341b7eb7415973 *inst/doc/rrcov.R 58ccdfd29ee1d1c42b759226e480a68c *inst/doc/rrcov.Rnw 897dd59d9cde72d4562bb32be3ee12a2 *inst/doc/rrcov.pdf 0f5844b638361c83e2a90f4605d3c0a9 *inst/examples/bm/bm_lts.m ce8cc65f5ce8e9aedf1ac45c3f408022 *inst/examples/bm/bm_mcd.m 1cb5f88839eb05cd065e67c2c3415252 *inst/examples/bm/bmlts.S 3f9ec6b75cdbdee68324fe6907a0214d *inst/examples/bm/bmmcd.S 4ee881c81dccd445a43467f85790c906 *inst/examples/ex-pca-explained-variance.R d04da52fb42f9911ff7d5c7f71ce9f01 *inst/examples/ex-pca-skew.R bca57369758f8b9957e41b4114c5797b *inst/examples/test-ellipse.R a0901c5ebf120b3a340374f70481839d *man/Appalachia.Rd 5c54f00c5b70324f7f27d5aee624b7db *man/Cascades.Rd 26b00a9b7a386bc688562ab2dc63517a *man/Cov-class.Rd 2c6ec3817bf5cf49ba984f482e2f5b05 *man/CovClassic-class.Rd 2fbba55dc7a7682451710d3f69681523 *man/CovClassic.Rd 429c1fdc1769f9ee28692af1f8ad48a2 *man/CovControl-class.Rd 43064a6f0260995adec31e2c65d75d14 *man/CovControlMMest-class.Rd 7238d4aa6dcec991ec881dccf364076f *man/CovControlMMest.Rd d5952a72857cf767dbeb20c83668cfbe *man/CovControlMcd-class.Rd 962823a9f48c0b679f0559108f915a59 *man/CovControlMcd.Rd 57e624447287efb5387c5a735234532d *man/CovControlMest-class.Rd 6aa4679f43cfb04ca51c9acb27b1bc38 *man/CovControlMest.Rd 733f884242529aef0ccfd7018721d42f *man/CovControlMrcd-class.Rd 6899febf6f31e87585ca389e82dfeddb *man/CovControlMrcd.Rd 748196583b06f335bc5584c7f020cb51 *man/CovControlMve-class.Rd 1115fe6eefd3e3aca66015605884a763 *man/CovControlMve.Rd 041c1f542eb533c83fbe46c4be82c096 *man/CovControlOgk-class.Rd ccab5b63f96d3b24e6b51ca249e6921f *man/CovControlOgk.Rd 07f8cc0161d6dd11278a569ed34304a0 *man/CovControlSde-class.Rd 10b884b9a6513ba39fb4a016883e41ca *man/CovControlSde.Rd c548e437eac0d0051fa5fa61d201d817 *man/CovControlSest-class.Rd 1aa13a5f84f59fa3d9561c825ac9daa4 *man/CovControlSest.Rd b48acaa1ed622f4357037d5bd0a4fc3b *man/CovMMest-class.Rd dbc90d791abd2e2a16a082298c67ae1e *man/CovMMest.Rd 5c80439cfef1d73a76e7b24034aabd38 *man/CovMcd-class.Rd 0077c6e6b1839d97d8c2c166a0ff85a1 *man/CovMcd.Rd 2e28e365c4458ee542464332218c9888 *man/CovMest-class.Rd 12a1bf2929d5c6bfbb0be9165ead3239 *man/CovMest.Rd 9272f3a1749cceb86e9564bdf9198bb1 *man/CovMrcd-class.Rd b52f70d03bc961e6d8089416fae87dfe *man/CovMrcd.Rd f8c07601d416cb832593ff23fdbb4f0e *man/CovMve-class.Rd 3d08cc01b0b33f2a2cf2e2d60a9fe330 *man/CovMve.Rd 74fa12162b533780e3154c77c81c52d6 *man/CovOgk-class.Rd 8f5a453fe912bdececab170e27ac3ae1 *man/CovOgk.Rd b7da10d9e64be0cc29cbcd1482b2f806 *man/CovRobust-class.Rd 97eda3cdd83e164e5bc3d8656a79a922 *man/CovRobust.Rd 8a384ccbb3920cb0bdcd19979fca9ec6 *man/CovSde-class.Rd a47ead98ae36d58e7d8ca00f84a96eeb *man/CovSde.Rd 2ccd127b573af20f90e38ef4e2004b59 *man/CovSest-class.Rd 68ea41cd2281615e721301ff18cc8874 *man/CovSest.Rd 682dafabcec98f9a0d83949ce4e332c6 *man/Lda-class.Rd 4444f314c0d926abe5294035b7bf2de7 *man/LdaClassic-class.Rd 2e4f11920d2b078bdbe09fc89f3df3e5 *man/LdaClassic.Rd e7e7949e84ce2b718c1a388c43e71a84 *man/LdaPP-class.Rd a580ee89d6a94fe35e8e245f4517a1f0 *man/LdaPP.Rd a1268d13054a2eb7534b5ba01b3ddfeb *man/LdaRobust-class.Rd d3ed47c0d5dec427747aba885242ccb1 *man/Linda-class.Rd 8baf836e402eb9b9028e77066d4e08a6 *man/Linda.Rd cc67d7827bb2fba6f87b8efa284a8712 *man/OsloTransect.Rd 419fee71254ba407377eaca1f8d295cd *man/Pca-class.Rd 2bc816a47c54ab6db7e78b3e2b5c6fd0 *man/PcaClassic-class.Rd 52de3a6af8374d6287099ef2a020027f *man/PcaClassic.Rd 0beef1d6c57adf87713c187ce16e97da *man/PcaCov-class.Rd c39efdd75a3a88862c732ea05804d44a *man/PcaCov.Rd e4eb620d45a17cd84f9cc68b4ddd3b8d *man/PcaGrid-class.Rd 411b1bf34738638be025872a9d0307c3 *man/PcaGrid.Rd ccafc00dc22f7b56f2d976a9d87dd788 *man/PcaHubert-class.Rd d041721e8d71a0dbced504ec02fa8c11 *man/PcaHubert.Rd 4419fe72923a2533ef9855706e89dd2c *man/PcaLocantore-class.Rd bef33fe1ed5ffab3e392d26c45fe7fc7 *man/PcaLocantore.Rd 2559c419e5edc2e8afc3eb458fc3e0b5 *man/PcaProj-class.Rd 0cea932b8e67a76ff27d0bac4ea1e4c3 *man/PcaProj.Rd 69c2ab10267dc5c9ba0fb66a07bebbda *man/PcaRobust-class.Rd 88ad4a913a98b02d05df2a6d7a4432d8 *man/PredictLda-class.Rd b37f0453a63c415f6bdb346d38b03773 *man/PredictQda-class.Rd 9f0861dda60db7308ac41e507070f15e *man/Qda-class.Rd 771e1fb4759ef485fa3282ebb39d9158 *man/QdaClassic-class.Rd 86849e391240672ee22c81d495d50f80 *man/QdaClassic.Rd 4d0114ce3ffb691d4cd5b44b215cc4c8 *man/QdaCov-class.Rd 5f02d6bc6345a1a18b952d4a4f8c3089 *man/QdaCov.Rd caad07b8b56b194b74692f73150dcaa6 *man/QdaRobust-class.Rd f1fa16b7e25b22fea689a00258057bde *man/SummaryCov-class.Rd f721cf742f5af844c528a0cb9c2f10e5 *man/SummaryCovRobust-class.Rd e0dda2f5d225820e17678da9beca765b *man/SummaryLda-class.Rd cf3b12405c88509bc308ca5b5943d6f6 *man/SummaryPca-class.Rd ea1311f4926327d815c960bffc08483d *man/SummaryQda-class.Rd bae130fddaf77578da28c08bfdcbd7f3 *man/T2.test.Rd abdc9ad43607a75f9920dff95f553aea *man/Wilks.test.Rd b28604a0236f656c5c245515fe9f63f5 *man/biplot.Rd a758ab85fb1d78002f8d73e1c9cf7b55 *man/bus.Rd d58dc6ce4cedaf8b7d01e975f31c2c17 *man/bushmiss.Rd e173a1c4b9a309cd285ddab43d056067 *man/covMest-deprecated.Rd 97b94ed5353326339b7344b2935aee2c *man/diabetes.Rd 7d2eb1cde344729acf65313b4c7825f8 *man/estimate-methods.Rd 7322ab3422db504f857740fc27581836 *man/fish.Rd a52e3a789c7c735055f7a0ac86806842 *man/fruit.Rd 88285f8bf5c759de3cb014ee5ca89a45 *man/getCenter-methods.Rd 0a1637528257278a749e71178cbe4a9f *man/getEllipse.Rd cd32b6c3686ec967354fc017a406626b *man/getLoadings-methods.Rd 19c9220469d7db644eb7f885179cdb41 *man/hemophilia.Rd 37cb7c180bf6563504366391de15c8cc *man/isSingular.Rd db0e5e9ff9798192bf162c122f29ef33 *man/lmom32.Rd e95c14bf85f44bfb576e46b9f9a27a44 *man/lmom33.Rd c3f9bd2e6f1f1736a1571f997a93ed55 *man/machines.Rd deb2edecbfed78502752bbf1dcd6bb5a *man/maryo.Rd 93b3d8c62a7190909c7decb1b1b1aa9c *man/octane.Rd 06670e7a6424ba39012a590e33eb558d *man/olitos.Rd 74108a3ecbc7c30ee05cdb9daa0b83e2 *man/pca.distances.Rd b75f05115c5aac9d9c4cd6c10ee5dc4b *man/pca.scoreplot.Rd aac6d52c9f15aa0bce14fe38eaa2a95b *man/plot-methods.Rd 151be8e11289e21dcfd0a4f1b74800b6 *man/pottery.Rd 3f586ec9a2ad87757bd9ef8d0399303d *man/rice.Rd 1e98c02d000874c986e78b9c00412cb4 *man/rrcov-utils.Rd fe6e17df1f5d0e88e34643a97ed36809 *man/salmon.Rd a0797202c93734adab394939c77f02a0 *man/scorePlot.Rd 7444d705777158155f3388c7d0e99bf1 *man/soil.Rd 8bd94e84fd2ff99d7d4f158feab1b324 *man/un86.Rd 4aba21bade7daced3ed3e4825cd6dc6d *man/wages.Rd eb63b71a6c9c04e97c9cc44251aa48e6 *man/wolves.Rd 3996e7c16bfb96fad295ee425815cb4d *src/Makevars eac4382f7dd2ec1ccf389af98314f557 *src/R-rng4ftn.c 018dffcfdf331831f9b2514e1ec0745d *src/covOPW.c 1b8952950f86d526b7e849e28e644f36 *src/ds11.f c1e732bb49768c40a41f3d196ed921d2 *src/fast-mve.c ccf4857d53fdada76dfd725ef84d9683 *src/fsada.f c6d3916e13986bd0e2bc0ea73bf278a3 *src/rrcov_init.c ff85fbb3251f152021ad1adab2c37007 *src/sest.c 2b6ccf6cdeb6c31ab10e8da35b06c5bd *tests/thubert.R 84accbe761e3b7e649fc961f7e388e40 *tests/thubert.Rout.save d15b8520f3b8e1e2d220e1d87815d138 *tests/tlda.R e5a65a90adad1eeade3f5334eac3082f *tests/tlda.Rout.save b438bcce32bc72667d5f353a77e32655 *tests/tldapp.R 439f62ef842f1025f2b8f1f98bb1be9d *tests/tldapp.Rout.save 81f8599fa2320b93acc1e48740f26f8b *tests/tmcd4.R a71176296cedc1a24d5cc4c92867d56a *tests/tmcd4.Rout.save fd5a16efc040e56acd8fd8f6773d1c0f *tests/tmest4.R d5ff4f4b4772061f3ca09d7b8d38161b *tests/tmest4.Rout.save 543589de1df4a8c5b354ea5d5ee2e24e *tests/tmve4.R dc6c9dd3fd406040a54a837b446079b0 *tests/tmve4.Rout.save 40ae348baf8b55ebcf802ece9a489b59 *tests/togk4.R 3234b08fe1a41dee866b18f991bef344 *tests/togk4.Rout.save 7ed52ca35c24fabd3aca1bac54afcc21 *tests/tqda.R 2e476434e296c3aeda6be662671aeabb *tests/tqda.Rout.save 0c3037618a637218348efe2ee6c03a3c *tests/tsde.R 9aca13b7c175ce86211515f3e335e521 *tests/tsde.Rout.save daa61a69be367325ffaa0571f087e489 *tests/tsest.R acbd791215a22638c46e97fb453af143 *tests/tsest.Rout.save 61b47716bbd35dcb43bf00439b6fdd4a *vignettes/AModel.pdf 6c269eb8f8375446b5f07ff3bafa6a4f *vignettes/CovControl.pdf d61b698be02405589908a619da0d94fa *vignettes/CovModel.pdf e1819cded497f38e9876caa0459050e6 *vignettes/DAModel.pdf dec446e0ee4dd1b225ed4acdde0db212 *vignettes/PcaModel.pdf d946e97b6973ed43e19342116c303508 *vignettes/Structure.pdf 9f51caeed9fa7242aa7295d356c8c3da *vignettes/mybiblio.bib 58ccdfd29ee1d1c42b759226e480a68c *vignettes/rrcov.Rnw rrcov/inst/0000755000176200001440000000000014200551163012357 5ustar liggesusersrrcov/inst/examples/0000755000176200001440000000000014200565132014176 5ustar liggesusersrrcov/inst/examples/bm/0000755000176200001440000000000013710756343014607 5ustar liggesusersrrcov/inst/examples/bm/bmmcd.S0000644000176200001440000000606512763517421016023 0ustar liggesusers##### bm_lts ##### # Benchmark for rrcov::covMcd() and MASS::cov.mcd() on several n and p. # # V.Todorov: 16.08.2004 # # For each n and p (specified by the arrays and ) a data set # is generated (see the function gendata() for description of the model) # and MCD is computed by calling covMcd(). All defaults are accepted # # Each test (for given n and p) is performed several times (specified # by the parameter ) and the result is averaged. # # Input argument: # nrep: Number of times the tests are executed (defaults to 3) # eps: contamination proportion - see function gendata() (defaults to 0.4) # method: "rrcov" or "MASS" # bmmcd <- function(nrep=1, eps=0.40, method=c("rrcov", "MASS", "S", "Smcd")){ method <- match.arg(method) if(method == "rrcov"){ library(rrcov) } if(method == "S" || method == "Smcd"){ library(Robust) } library(MASS) ap <- c(2, 5, 10, 20, 30) an <- c(100, 500, 1000, 10000, 50000) set.seed(0) btime <- proc.time() cat("\n*** Benchmark for R/S MCD estimators ***") cat("\nImplementation=",method) cat("\nThe results are averaged on nrep = ",nrep," runs.\n") tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- as.integer(an[i]) p <- as.integer(ap[j]) if(5*p <= n){ xx <- gendataMCD(n, p, eps) X <- as.data.frame(xx$X) ptm <- proc.time() for(k in 1:nrep){ if(method == "MASS") cov.mcd(X) else if(method == "rrcov") covMcd(X) else if(method == "S") covRob(X) else if(method == "Smcd") covRob(X,estim="mcd") else stop("No method specified") } xtime <- proc.time() - ptm xtime <- xtime[1]/nrep # cat(sprintf("%6d %3d %10.2f\n", n, p, xtime)) cat(format(n), format(p), format(xtime, nsmall=2),"\n") } } } tottime <- proc.time() - btime cat("=====================\n") cat("Total time: ", tottime[1], "\n") } #### gendata() #### # Generates a location contaminated multivariate # normal sample of n observations in p dimensions # (1-eps)*Np(0,Ip) + eps*Np(m,Ip) # where # m = (b,b,...,b) # Defaults: eps=0 and b=10 # gendataMCD <- function(n,p,eps=0,b=10){ if(missing(n) || missing(p)) stop("Please specify (n,p)") if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") X <- mvrnorm(n,rep(0,p),diag(1,nrow=p,ncol=p)) nbad <- as.integer(eps * n) if(nbad > 0){ Xbad <- mvrnorm(nbad,rep(b,p),diag(1,nrow=p,ncol=p)) xind <- sample(n,nbad) X[xind,] <- Xbad } list(X=X, xind=xind) } rrcov/inst/examples/bm/bmlts.S0000644000176200001440000000612312763517421016055 0ustar liggesusers##### bm_lts ##### # Benchmark for rrcov::ltsReg() and MASS::ltsreg() on several n and p. # # V.Todorov: 16.08.2004 # # For each n and p (specified by the arrays and ) a data set # is generated (see the function gendata() for description of the model) # and LTS is computed by calling ltsReg(). All defaults are accepted. # # Each test (for given n and p) is performed several times (specified # by the parameter ) and the result is averaged. # # Input argument: # nrep: Number of times the tests are executed (defaults to 3) # eps: contamination proportion - see function gendata() (defaults to 0.4) # method: "rrcov" or "MASS" # bmlts <- function(nrep=1, eps=0.4, method=c("rrcov","MASS", "S")){ method <- match.arg(method) if(method == "rrcov") library(rrcov) library(MASS) ap <- c(2, 3, 5, 10) an <- c(100, 500, 1000, 10000, 50000) set.seed(0) btime <- proc.time() cat("*** Benchmark for R/S: LTS ***") cat("\nThe results are averaged on nrep = ", nrep, "\n") tmp <- sys.call() cat("\nCall: ", deparse(substitute(tmp)),"\n") cat(" n p Time\n") cat("=====================\n") for(i in 1:length(an)) { for(j in 1:length(ap)) { n <- as.integer(an[i]) p <- as.integer(ap[j]) if(5*p <= n){ a <- gendataLTS(n, p, eps) X <- a$x Y <- a$y # set mcd=FALSE - we want to time only the LTS algorithm ptm <- proc.time() for(k in 1:nrep){ if(method == "MASS") ltsreg(X,Y) else if(method == "rrcov") ltsReg(X, Y, mcd = FALSE) else ltsreg(X, Y, mcd = FALSE) } xtime <- proc.time() - ptm xtime <- xtime[1]/nrep # cat(sprintf("%6d %3d %10.2f\n", n, p, xtime)) cat(n, p, format(xtime, nsmall=2), "\n") } } } tottime <- proc.time() - btime cat("=====================\n") cat("Total time: ", tottime[1], "\n") } #### gendata() #### # Generates a data set with bad leverage points (outliers in x-space) # n observations in p dimensions acording to the model: # yi = Xi1+Xi2+...+ei # where ei - N(0,1) is the error term, Xi,j for j=1...p-1 - N(0,100) are # the non-trivial explanatory variables and xip is the intercept term. # The outliers in the x-space are introduced by replacing eps. percent of # xi1 by values distributed as N(100,100). # # Defaults: eps=0 # gendataLTS <- function(n, p, eps=0){ if(eps < 0 || eps >= 0.5) stop(message="eps must be in [0,0.5)") p <- p-1 x <- matrix(data=rnorm(n*p,0,100), nrow=n, ncol=p) y <-rowSums(x) + 1 + rnorm(n, 0, 1) nbad <- as.integer(eps * n) xind <- sort(sample(n,nbad)) xbad <- rnorm(nbad,100,100) for(i in 1:nbad){ x[xind[i],1] <- xbad[i] } list(x=x, y=y, xind=xind) } rrcov/inst/examples/bm/bm_mcd.m0000644000176200001440000000435612763517421016215 0ustar liggesusers%%%%% bm_mcd %%%%% % Benchmark for LIBRA::mcdcov() on several n and p. % % V.Todorov: 16.08.2004 % % For each n and p (specified by the arrays and ) a data set % is generated (see the function gendata() for description of the model) % and MCD is computed by calling mcdcov(). All defaults are accepted. % % Each test (for given n and p) is performed several times (specified % by the parameter ) and the result is averaged. % % Required input argument: % nrep : Number of times the tests are executed % function bm_mcd(nrep) if(nrep <= 0) nrep = 1; end disp('*** Benchmark for LIBRA: mcdcov() ***') disp(sprintf('\nThe results are averaged on nrep = %d runs.\n', nrep)) disp(' N P TIME (sec.)') eps = 0.4; b = 10; an = [ 100 500 1000 10000 50000]; ap = [2 5 10 20 30]; ttime = 0; for(i = 1:length(an)) n = an(i); for(j = 1:length(ap)) p = ap(j); if(5*p <= n) x = gendata(n, p, eps, b); tic; for(k = 1:nrep) mcdcov(x, 'plots', 0); end tt = toc; ttime = ttime + tt; tt=tt/nrep; disp(sprintf('%8d %4d %10.2f', n, p, tt)) end end end disp(sprintf('\nTotal elapsed time (nrep=%d): %8.0f sec.\n', nrep, ttime)) %-------------------------------------------------- % gendata() % Generates a location contaminated multivariate % normal sample of n observations in p dimensions % (1-eps)*Np(0,Ip) + eps*Np(m,Ip) % where % m = (b,b,...,b) % Defaults: eps=0 and b=10 % function result = gendata(n, p, eps, b) if(eps < 0 | eps >= 0.5) error('eps must be in [0,0.5)') end mu = zeros(p,1); sigma = diag(ones(p,1)); x = mvnrnd(mu, sigma, n); % generate now the outliers if(eps > 0) mubad = b + mu; nbad = floor(eps * n); xind = randperm(n); xind = sort(xind(1:nbad)); xbad = mvnrnd(mubad, sigma, nbad); for(i = 1:nbad) x(xind(i),:) = xbad(i,:); end end result = x; rrcov/inst/examples/bm/bm_lts.m0000644000176200001440000000507312763517421016251 0ustar liggesusers%%%%% bm_lts %%%%% % Benchmark for LIBRA::ltsreg() on several n and p. % % V.Todorov: 16.08.2004 % % For each n and p (specified by the arrays and ) a data set % is generated (see the function gendata() for description of the model) % and LTS is computed by calling ltsregress(). All defaults are accepted, % except the trimming proportion alpha - it is set to 0,5 % % Each test (for given n and p) is performed several times (specified % by the parameter ) and the result is averaged. % % Required input argument: % nrep : Number of times the tests are executed % function bm_lts(nrep) if(nrep <= 0) nrep = 1; end disp('*** Benchmark for LIBRA: ltsreg() ***') disp(sprintf('\nThe results are averaged on nrep = %d runs.\n', nrep)) disp(' N P TIME (sec.)') eps = 0.4; an = [ 100 500 1000 10000 50000]; ap = [2 3 5 10]; ttime = 0; for(i = 1:length(an)) n = an(i); for(j = 1:length(ap)) p = ap(j); [x, y] = gendata(n, p, eps); tic; for(k = 1:nrep) ltsregres(x, y, 'alpha', 0.50, 'plots', 0); end tt=toc; ttime = ttime + tt; tt=tt/nrep; disp(sprintf('%8d %4d %10.2f', n, p, tt)) end end disp(sprintf('\nTotal elapsed time (nrep=%d): %8.0f sec.\n', nrep, ttime)) %-------------------------------------------------- % gendata() % Generates a data set with bad leverage points (outliers in x-space), % n observations in p dimensions acording to the model: % % yi = Xi1 + Xi2 + ... + ei % % where ei - N(0,1) is the error term, Xi,j for j=1...p-1 - N(0,100) are % the non-trivial explanatory variables and Xip is the intercept term. % The outliers in the x-space are introduced by replacing eps percent of % Xi1 by values distributed as N(100,100). % % Defaults: eps=0 % function [x, y] = gendata(n, p, eps); if(eps < 0 | eps >= 0.5) error('eps must be in [0,0.5)') end p = p-1; x = randn(n,p); y = zeros(n,1); for(i = 1:n) y(i) = sum(x(i,:)) + 1 + rand(1); end if(eps > 0) nbad = floor(eps * n); xind = randperm(n); xind = sort(xind(1:nbad)); % generate nbad observations distributed as % N(m, s^2) = N(100,100) => = m + s*rand(nbad) xbad = 100 + 10*randn(nbad,1); for(i = 1:nbad) x(xind(i),1) = xbad(i,1); end end result = [x, y]; rrcov/inst/examples/ex-pca-skew.R0000644000176200001440000000356114177770447016476 0ustar liggesusers## PCA for skewed data ## ## The present robust PCA methods like ROBPCA work best if the ## non-outlying data have an approximately symmetric distribution. ## When the original variables are skewed, too many points tend ## to be flagged as outlying. Hubert et al. (2009) developed a ## robust method which is also suitable for skewed data. Also, the ## outlier map is modified to present adequately the PCA outliers. ## ## In PcaHubert() the version for skewed data is invoked using the ## argument skew=TRUE. Example with the computer hardware data ## follows library(rrcov) data(machines) ## The data set contains 209 observations, and 8 variables. ## First we robustly center and scale the variables by subtracting ## the median and dividing by the median absolute deviation (MAD). ## Of course, this could be done also later, when calling the PCA ## function, by setting the arguments 'center' and 'sacle' to TRUE. data <- robustbase::doScale(machines, center=median, scale=mad) X <- data$x ## Each of the variables is significantly skewed as measured by ## its medcouple. The corresponding p-values can be computed using ## the formulas in using the formulas in Brys et al. (2004). These ## show the variables are all significantly asymmetric. data.frame(MC=round(apply(X, 2, mc),2)) ## Plot a pairwise scaterplot matrix mcd <- CovMcd(X[,1:6]) plot(mcd, which="pairs") ## Remove the rownames (too long) rownames(X) <- NULL ## Start with robust PCA based on MCD (P << n) (pca1 <- PcaHubert(X, k=3)) plot(pca1, main="ROBPCA-MCD", off=0.03) ## PCA with the projection algoritm of Hubert (pca2 <- PcaHubert(X, k=3, mcd=FALSE)) plot(pca2, main="ROBPCA-SD", off=0.03) ## PCA with the adjusted for skewness algorithm of Hubert et al (2009) (pca3 <- PcaHubert(X, k=3, mcd=FALSE, skew=TRUE)) plot(pca3, main="ROBPCA-AO", off=0.03) rrcov/inst/examples/ex-pca-explained-variance.R0000644000176200001440000000430214200221752021227 0ustar liggesusers## Showing correctly the percentage explained variance in PCA ## ## If not all PCA were extracted, which is a great advantage in ## the case in high dimensional data, the PCA methods in rrcov ## could not show correctly the percentage of variance explained, ## Because the total variance explained, i.e. the sum of _all_ ## eigenvalues was not known. Now this is fixed, differently in ## the different methods. ## In PcaClassic, PcaCov and PcaLocantore, this is nt a problem ## because always all eigenvalues are computed. ## ## In PcaHubert there is a preliminary step in which the classical ## PCA are computed on the data set without outliers identified by ## the Stahel-Donoho Outlyingness. All eigenvalues are calculated ## and used for selecting the number of components and for ## presenting the percentage of explaned variance. ## ## In the pure projection purcuit methods PcaGrid() and PcaProj() ## this cannot be done and a note is written that the proportion ## of variance and cumulative proportion are not shown because the ## chosen number of components is smaller than the rank of the data ## matrix. library(rrcov) data(hbk) ## PCA with all variables (pca1 <- PcaHubert(hbk, k=ncol(hbk), trace=TRUE, mcd=TRUE, skew=FALSE)) summary(pca1) ## PCA with number of components selected by the algorithm (pca2 <- PcaHubert(hbk, trace=TRUE, mcd=TRUE, skew=FALSE)) summary(pca2) ## PCA with number of components selected by the user (pca3 <- PcaHubert(hbk, k=2, trace=TRUE, mcd=TRUE, skew=FALSE)) summary(pca3) ## PCA by the projection algorithm with number of components selected by the user. ## Here we cannot show the proportion of variance and the cumulative proportion (pca4 <- PcaGrid(hbk, k=2, trace=TRUE)) summary(pca4) ## The other PCA methods available in rrcov summary(PcaClassic(hbk, k=2)) summary(PcaCov(hbk, k=2)) summary(PcaLocantore(hbk, k=2)) summary(PcaProj(hbk, k=2)) ## Example with the newly added to 'rrcov' data set fruit ======== data(fruit) # Remove the first variable, the grouping one (pca <- PcaHubert(fruit[,-1], trace=TRUE)) summary(pca) screeplot(pca) (pca <- PcaHubert(fruit[,-1], k=4) summapry(pca) plot(pca) rrcov/inst/examples/test-ellipse.R0000644000176200001440000000311214145201442016727 0ustar liggesuserslibrary(rrcov) data(pottery) x <- pottery[,c("MG", "CA")] grp <- pottery$origin ## ## Compute robust location and covariance matrix and ## plot the tolerance ellipses library(rrcov) (mcd <- CovMcd(x)) col <- c(3,4) gcol <- ifelse(grp == "Attic", col[1], col[2]) gpch <- ifelse(grp == "Attic", 16, 1) plot(mcd, which="tolEllipsePlot", class=TRUE, col=gcol, pch=gpch) ## ## Perform classical LDA and plot the data, 0.975 tolerance ellipses ## and LDA separation line ## x <- pottery[,c("MG", "CA")] grp <- pottery$origin lda <- LdaClassic(x, grp) lda ## Calculate the ellipses using the package 'ellipse' require(ellipse) e1 <- ellipse(x=lda@cov, centre=lda@center[1,], level=0.975) e2 <- ellipse(x=lda@cov, centre=lda@center[2,], level=0.975) ## Calculate the ellipses using the package 'rrcov' e3 <- getEllipse(loc=lda@center[1,], cov=lda@cov) e4 <- getEllipse(loc=lda@center[2,], cov=lda@cov) ## Calculate the ellipses using the package 'cluster' require(cluster) e5 <- ellipsoidPoints(lda@cov, qchisq(0.975, 2), lda@center[1,]) e6 <- ellipsoidPoints(lda@cov, qchisq(0.975, 2), lda@center[2,]) plot(CA~MG, data=pottery, col=gcol, pch=gpch, xlim=c(min(MG,e1[,1], e2[,1]), max(MG,e1[,1], e2[,1])), ylim=c(min(CA,e1[,2], e2[,2]), max(CA,e1[,2], e2[,2]))) ab <- lda@ldf[1,] - lda@ldf[2,] cc <- lda@ldfconst[1] - lda@ldfconst[2] abline(a=-cc/ab[2], b=-ab[1]/ab[2], col=2, lwd=2) lines(e1, type="l", col=1) lines(e2, type="l", col=1) lines(e3, type="l", col=2) lines(e4, type="l", col=2) lines(e5, type="l", col=3) lines(e6, type="l", col=3) rrcov/inst/doc/0000755000176200001440000000000013711120360013121 5ustar liggesusersrrcov/inst/doc/rrcov.R0000644000176200001440000003052314200705511014403 0ustar liggesusers### R code from vignette source 'rrcov.Rnw' ################################################### ### code chunk number 1: rrcov.Rnw:471-473 ################################################### ## set the prompt to "R> " and the continuation to "+ " options(prompt="R> ", continue="+ ") ################################################### ### code chunk number 2: intro ################################################### ## ## Load the 'rrcov' package and the first two data sets to be ## used throughout the examples ## library("rrcov") data("delivery") delivery.x <- delivery[,1:2] # take only the X part data("hbk") hbk.x <- hbk[,1:3] # take only the X part ################################################### ### code chunk number 3: intro-mcd ################################################### ## ## Compute MCD estimates for the delivery data set ## - show() and summary() examples ## mcd <- CovMcd(delivery.x) mcd summary(mcd) ################################################### ### code chunk number 4: intro-plot ################################################### ## ## Example plot of the robust against classical ## distances for the delivery data set ## plot(mcd, which="dd") ################################################### ### code chunk number 5: intro-S ################################################### ## ## Compute the S-estimates for the delivery data set ## and provide the standard and extended output ## est <- CovSest(delivery.x, method="bisquare") est summary(est) ################################################### ### code chunk number 6: intro-CovRobust ################################################### ## ## Automatically select the appropriate estimator according ## to the problem size - in this example the Stahel-Donoho estimates ## will be selected. ## est <- CovRobust(delivery.x) est ################################################### ### code chunk number 7: rrcov.Rnw:1019-1020 ################################################### set.seed(1234) ################################################### ### code chunk number 8: CovControl ################################################### ## ## Controlling the estimation options with a control object ## control <- CovControlSest(method="biweight") PcaCov(hbk.x, cov.control=control) ################################################### ### code chunk number 9: CovControl-loop ################################################### ## ## Controlling the estimation options: example ## of looping through several estimators ## cc <- list(CovControlMcd(), CovControlMest(), CovControlOgk(), CovControlSest(), CovControlSest(method="rocke")) clist <- sapply(cc, restimate, x=delivery.x) sapply(clist, data.class) sapply(clist, getMeth) ################################################### ### code chunk number 10: CovRobust ################################################### ## ## Automatically select the appropriate estimator according ## to the problem size. ## getMeth(CovRobust(matrix(rnorm(40), ncol=2))) # 20x2 - SDE getMeth(CovRobust(matrix(rnorm(16000), ncol=8))) # 2000x8 - bisquare S getMeth(CovRobust(matrix(rnorm(20000), ncol=10))) # 2000x10 - Rocke S getMeth(CovRobust(matrix(rnorm(200000), ncol=2))) # 100000x2 - OGK ################################################### ### code chunk number 11: CovControl-S ################################################### ## ## Rocke-type S-estimates ## getMeth(CovRobust(matrix(rnorm(40), ncol=2), control="rocke")) ################################################### ### code chunk number 12: CovControl-CovRobust ################################################### ## ## Specify some estimation parameters through a control object. ## The last command line illustrates the accessor method ## for getting the correlation matrix of the estimate ## as well as a nice formatting method for covariance ## matrices. ## data("toxicity") ctrl <- CovControlOgk(smrob = "s_mad", svrob = "qc") est <- CovRobust(toxicity, ctrl) round(getCenter(est),2) as.dist(round(getCorr(est), 2)) ################################################### ### code chunk number 13: ex-cov-plot-lattice ################################################### ## ## Distance plot and Chi-square Q-Q plot of the robust and classical distances ## Lattice plots (currently not available in rrcov) ## library("lattice") library("grid") library("rrcov") data("delivery") X <- delivery[,1:2] myPanel.dd <- function(x, y, subscripts, cutoff, ...) { panel.xyplot(x, y, ...) panel.abline(h=cutoff,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] xrange<-range(y) adj <- (xrange[2]-xrange[1])/20 ltext(x[ind] + adj, y[ind] + adj, ind, cex=1.0) } } myPanel.qchi <- function(x, y, subscripts, cutoff, ...) { y <- sort(y, index.return=TRUE) iy <- y$ix y <- y$x panel.xyplot(x, y, ...) panel.abline(0,1,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- (n-id.n+1):n xrange<-range(y) adj <- (xrange[2]-xrange[1])/50 ltext(x[ind] + adj, y[ind] + adj, iy[ind], cex=1.0) } } n<-nrow(X) p <- ncol(X) cutoff <- sqrt(qchisq(0.975, p)) mm <- covMcd(X) dd1 <- sqrt(mm$mah) # robust distances vv<-cov.wt(X) dd2 <- sqrt(mahalanobis(X,vv$center,vv$cov)) # classical distances dd<-c(dd1,dd2) # both robust and classical distances gr <- as.factor(c(rep(1,n), rep(2,n))) levels(gr)[1] <- "Robust" levels(gr)[2] <- "Classical" qq <- sqrt(qchisq(((1:n)-1/3)/(n+1/3), p)) ind.dd <- c(1:n, 1:n) ind.qchi <- c(qq, qq) dplot <- xyplot(dd~ind.dd|gr, cutoff=cutoff, panel = myPanel.dd, xlab="Index", ylab="Mahalanobis distance", main="Distance Plot", col = "darkred", scales=list(cex=1.0)) qplot <- xyplot(dd~ind.qchi|gr, cutoff=cutoff, panel = myPanel.qchi, xlab="Quantiles of the chi-squared distribution", ylab="Mahalanobis distance", main="Chi-Square QQ-Plot", col = "darkred", scales=list(cex=1.0)) plot(dplot, split = c(1, 1, 2, 1), more = TRUE) plot(qplot, split = c(2, 1, 2, 1), more = FALSE) ################################################### ### code chunk number 14: ex-cov-plot-ellipse ################################################### ## ## a) scatter plot of the data with robust and classical confidence ellipses. ## b) screeplot presenting the robust and classical eigenvalues ## data("milk") usr<-par(mfrow=c(1,2)) plot(CovMcd(delivery[,1:2]), which="tolEllipsePlot", classic=TRUE) plot(CovMcd(milk), which="screeplot", classic=TRUE) par(usr) ################################################### ### code chunk number 15: pca-ex-hbk ################################################### ## ## Principal Component Analysis example: ## Plot of the first two principal components of the ## Hawkins, Bradu and Kass data set: classical and robust ## par(mfrow=c(1,2)) pca <- PcaClassic(hbk.x, k=2) cpca <- list(center=c(0,0), cov=diag(pca@eigenvalues), n.obs=pca@n.obs) rrcov:::.myellipse(pca@scores, xcov=cpca, main="Classical", xlab="PC1", ylab="PC2", ylim=c(-30,30), id.n=0) abline(v=0) abline(h=0) text(-29,6,labels="1-10", cex=0.8) text(-37,-13,labels="14", cex=0.8) text(-31,-5,labels="11-13", cex=0.8) hub <- PcaHubert(hbk.x, k=2, mcd=TRUE) chub <- list(center=c(0,0), cov=diag(hub@eigenvalues), n.obs=hub@n.obs) rrcov:::.myellipse(hub@scores, xcov=chub, main="Robust (MCD)", xlab="PC1", ylab="PC2", xlim=c(-10,45), ylim=c(-25,15), id.n=0) abline(v=0) abline(h=0) text(30,-9,labels="1-10", cex=0.8) text(36,-11,labels="11", cex=0.8) text(42,-4,labels="12", cex=0.8) text(41,-11,labels="13", cex=0.8) text(44,-15,labels="14", cex=0.8) ################################################### ### code chunk number 16: pca-classic ################################################### ## ## Classical PCA ## pca <- PcaClassic(~., data=hbk.x) pca summary(pca) plot(pca) getLoadings(pca) ################################################### ### code chunk number 17: pca-robust ################################################### ## ## Robust PCA ## rpca <- PcaGrid(~., data=hbk.x) rpca summary(rpca) ################################################### ### code chunk number 18: ex-pca-plot-screeplot ################################################### ## ## Screeplot for classical and robust PCA of the milk data set. ## usr <- par(mfrow=c(1,2)) screeplot(PcaClassic(milk), type="lines", main="Screeplot: classical PCA", sub="milk data") screeplot(PcaHubert(milk), type="lines", main="Screeplot: robust PCA", sub="milk data") par(usr) ################################################### ### code chunk number 19: ex-pca-plot-biplot ################################################### ## ## Robust biplot for the UN86 data ## data("un86") set.seed(9) usr<-par(mfrow=c(1,2)) biplot(PcaCov(un86, corr=TRUE, cov.control=NULL), main="Classical biplot", col=c("gray55", "red")) biplot(PcaCov(un86, corr=TRUE), main="Robust biplot", col=c("gray55", "red")) par(usr) ################################################### ### code chunk number 20: ex-pca-plot-diagplot ################################################### ## ## An example of the classical and robust diagnostic ## plot for the hbk data set ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=2), sub="data set: hbk, k=2") plot(PcaHubert(hbk.x, k=2), sub="data set: hbk, k=2") par(usr) ################################################### ### code chunk number 21: ex-pca-plot-distplot ################################################### ## ## If k=p the orthogonal distances are not meaningful and ## simple distance plot of the score distances will be shown ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=3), sub="data set: hbk.x, k=3") plot(PcaHubert(hbk.x, k=3), sub="data set: hbk.x, k=3") par(usr) ################################################### ### code chunk number 22: lda-prelim ################################################### data("diabetes") ################################################### ### code chunk number 23: lda-cloud ################################################### library("lattice") # load the graphical library ## set different plot symbols - important for black-and-white print sup.sym <- trellis.par.get("superpose.symbol") sup.sym$pch <- c(1,2,3,4,5) trellis.par.set("superpose.symbol", sup.sym) cloud.plt <- cloud(insulin ~ glucose + sspg, groups = group, data = diabetes, auto.key=TRUE) ################################################### ### code chunk number 24: lda-cloud-fig ################################################### print(cloud.plt) ################################################### ### code chunk number 25: lda-classic ################################################### lda <- LdaClassic(group~glucose+insulin+sspg, data=diabetes) lda ################################################### ### code chunk number 26: lda-classic-predict ################################################### predict(lda) ################################################### ### code chunk number 27: lda-robust ################################################### rlda <- Linda(group~glucose+insulin+sspg, data=diabetes) rlda rlda.predict <- predict(rlda) cat("\nApparent error rate: ", round(rrcov:::.AER(rlda.predict@ct),4)) ################################################### ### code chunk number 28: qda-robust ################################################### rqda <- QdaCov(group~glucose+insulin+sspg, data=diabetes) rqda rqda.predict <- predict(rqda) cat("\nApparent error rate: ", round(rrcov:::.AER(rqda.predict@ct),4)) rrcov/inst/doc/rrcov.Rnw0000644000176200001440000033555713564765137015015 0ustar liggesusers% -*- TeX -*- -*- Soft -*- \documentclass[article,shortnames,nojss]{jss} %\VignetteIndexEntry{An Object-Oriented Framework for Robust Multivariate Analysis} %\VignetteKeywords{robustness, multivariate analysis, MCD, R, statistical design patterns} %\VignettePackage{rrcov} \usepackage{amsmath} %% need for subequations \usepackage{amssymb} \usepackage{amsfonts} \usepackage[english]{babel} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\vv}[1]{\mbox{\boldmath$#1$}} \newcommand{\xv}{\mbox{\boldmath$x$}} \newcommand{\yv}{\mbox{\boldmath$y$}} \newcommand{\zv}{\mbox{\boldmath$z$}} \newcommand{\mv}{\mbox{\boldmath$m$}} \newcommand{\tv}{\mbox{\boldmath$t$}} \newcommand{\xbarv}{\mbox{\boldmath$\bar x$}} \newcommand{\uv}{\mbox{\boldmath$u$}} \newcommand{\muv}{\mbox{\boldmath$\mu$}} \newcommand{\nuv}{\mbox{\boldmath$\nu$}} \newcommand{\deltav}{\mbox{\boldmath$\delta$}} \newcommand{\chiv}{\mbox{\boldmath$\chi$}} \newcommand{\ov}{\mbox{\boldmath$0$}} \newcommand\MCD{\mathit{MCD}} \newcommand\MVE{\mathit{MVE}} \newcommand\OGK{\mathit{OGK}} \newcommand\diag{\mathrm{diag}} %\newcommand\det{\mathrm{det}} \newcommand{\class}[1]{``\code{#1}''} \newcommand{\fct}[1]{\code{#1()}} %% almost as usual \author{Valentin Todorov\\UNIDO \And Peter Filzmoser\\Vienna University of Technology} \title{An Object Oriented Framework for Robust Multivariate Analysis} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Valentin Todorov, Peter Filzmoser} %% comma-separated \Plaintitle{Object Oriented Framework for Robust Multivariate Analysis} %% without formatting \Shorttitle{OOF for Robust Multivariate Analysis} %% a short title (if necessary) %% an abstract and keywords \Abstract{ \noindent This introduction to the \proglang{R} package \pkg{rrcov} is a (slightly) modified version of \cite{todorov-oof}, published in the \emph{Journal of Statistical Software}. \noindent Taking advantage of the \proglang{S}4 class system of the programming environment \proglang{R}, which facilitates the creation and maintenance of reusable and modular components, an object oriented framework for robust multivariate analysis was developed. The framework resides in the packages \pkg{robustbase} and \pkg{rrcov} and includes an almost complete set of algorithms for computing robust multivariate location and scatter, various robust methods for principal component analysis as well as robust linear and quadratic discriminant analysis. The design of these methods follows common patterns which we call statistical design patterns in analogy to the design patterns widely used in software engineering. The application of the framework to data analysis as well as possible extensions by the development of new methods is demonstrated on examples which themselves are part of the package \pkg{rrcov}. } \Keywords{robustness, multivariate analysis, MCD, \proglang{R}, statistical design patterns} \Plainkeywords{robustness, multivariate analysis, MCD, R, statistical design patterns} %% without formatting %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Valentin Todorov\\ Research and Statistics Branch\\ United Nations Industrial Development Organization (UNIDO)\\ Vienna International Centre\\ P.O.Box 300, 1400, Vienna, Austria\\ E-mail: \email{valentin.todorov@chello.at}\\ % URL: \url{http://statmath.wu-wien.ac.at/~zeileis/} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bi}{\begin{itemize}} \newcommand{\ei}{\end{itemize}} \newcommand{\be}{\begin{enumerate}} \newcommand{\ee}{\end{enumerate}} \renewcommand{\v}[1]{\mathbf{#1}} %% Sweave options for the complete document %%\SweaveOpts{keep.source=TRUE} %%\SweaveOpts{prefix.string=images/oofgen/oof} \SweaveOpts{prefix.string=ooframework} \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. %\section[About Java]{About \proglang{Java}} \section[Introduction]{Introduction} %% Note: If there is markup in \(sub)section, then it has to be escape as above. Outliers are present in virtually every data set in any application domain, and the identification of outliers has a hundred years long history. Many researchers in science, industry and economics work with huge amounts of data and this even increases the possibility of anomalous data and makes their (visual) detection more difficult. Taking into account the multivariate aspect of the data, the outlyingness of the observations can be measured by the Mahalanobis distance which is based on location and scatter estimates of the data set. In order to avoid the masking effect, robust estimates of these parameters are called for, even more, they must possess a positive breakdown point. The estimates of the multivariate location vector $\muv$ and the scatter matrix $\v{\Sigma}$ are also a cornerstone in the analysis of multidimensional data, since they form the input to many classical multivariate methods. The most common estimators of multivariate location and scatter are the sample mean $\xbarv$ and the sample covariance matrix $\v{S}$, i.e., the corresponding MLE estimates. These estimates are optimal if the data come from a multivariate normal distribution but are extremely sensitive to the presence of even a few outliers (atypical values, anomalous observations, gross errors) in the data. If outliers are present in the input data they will influence the estimates $\xbarv$ and $\v{S}$ and subsequently worsen the performance of the classical multivariate procedure based on these estimates. Therefore it is important to consider robust alternatives to these estimators and actually in the last two decades much effort was devoted to the development of affine equivariant estimators possessing a high breakdown point. The most widely used estimators of this type are the minimum covariance determinant (MCD) estimator of \citet{rousseeuw:85} for which also a fast computing algorithm was constructed---\citet{rousseeuw-vandriessen}, the S~estimators \citep{davies:87} and the Stahel-Donoho estimator introduced by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} and studied by \citet{maronna:95}. If we give up the requirement for affine equivariance, estimators like the one of \citet{maronna:2002} are available and the reward is an extreme gain in speed. Substituting the classical location and scatter estimates by their robust analogues is the most straightforward method for robustifying many multivariate procedures like principal components, discriminant and cluster analysis, canonical correlation, etc. The reliable identification of multivariate outliers which is an important task in itself, is another approach to robustifying many classical multivariate methods. Some of these estimates and procedures became available in the popular statistical packages like \proglang{S-PLUS}, \proglang{SAS}, \proglang{MATLAB} as well as in \proglang{R} but nevertheless it is recognized that the robust methods have not yet replaced the ordinary least square techniques as it could be expected \citep{morgenthaler:2007, stromberg:2004}. One reason is the lack of easily accessible and easy to use software, that is software which presents the robust procedures as extensions to the classical ones---similar input and output, reasonable defaults for most of the estimation options and visualization tools. As far as the easiness of access is concerned, the robust statistical methods should be implemented in the freely available statistical software package \proglang{R}, \citep{RLanguage}, which provides a powerful platform for the development of statistical software. These requirements have been defined in the project ``Robust Statistics and \proglang{R}'', see \url{http://www.statistik.tuwien.ac.at/rsr/}, and a first step in this direction was the initial development of the collaborative package \pkg{robustbase}, \citep{robustbase}, with the intention that it becomes the \textit{essential robust statistics} \proglang{R} package covering the methods described in the recent book \citet{maronna:2006}. During the last decades the object oriented programming paradigm has revolutionized the style of software system design and development. A further step in the software reuse are the object oriented frameworks \citep[see][]{gamma} which provide technology for reusing both the architecture and the functionality of software components. Taking advantage of the new \proglang{S}4 class system \citep{chambers:98} of \proglang{R} which facilitate the creation of reusable and modular components an object oriented framework for robust multivariate analysis was implemented. The goal of the framework is manyfold: \be \item{to provide the end-user with a flexible and easy access to newly developed robust methods for multivariate data analysis;} \item{to allow the programming statisticians an extension by developing, implementing and testing new methods with minimum effort, and } \item{to guarantee the original developers and maintainer of the packages a high level of maintainability.} \ee The framework includes an almost complete set of algorithms for computing robust multivariate location and scatter, such as minimum covariance determinant, different S~estimators (SURREAL, FAST-S, Bisquare, Rocke-type), orthogonalized Gnanadesikan--Kettenring (OGK) estimator of \citet{maronna:2002}. The next large group of classes are the methods for robust principal component analysis (PCA) including ROBPCA of \citet{hubert-ROBPCA:2005}, spherical principal components (SPC) of \citet{locantore:1999}, the projection pursuit algorithms of \citet{croux-Ruiz-Gazen:2005} and \citet{croux-filzmoser-oliveira-pppca}. Further applications implemented in the framework are linear and quadratic discriminant analysis \citep[see][for a review]{todorov-roblda}, multivariate tests \citep{rousseeuw-willems:2002, todorov-manova} and outlier detection tools. The application of the framework to data analysis as well as the development of new methods is illustrated on examples, which themselves are part of the package. Some issues of the object oriented paradigm as applied to the \proglang{R} object model (naming conventions, access methods, coexistence of \proglang{S}3 and \proglang{S}4 classes, usage of UML, etc.) are discussed. The framework is implemented in the \proglang{R} packages \pkg{robustbase} and \pkg{rrcov}, \citep{todorov-rrcov}, which are available from Comprehensive \proglang{R} Archive Network (CRAN) at \url{http://CRAN.R-project.org} under the GNU General Public License. The rest of the paper is organized as follows. In the next Section~\ref{oof-sec:objmodel} the design principles and the structure of the framework is presented as well as some related object oriented concepts are discussed. As a main tool for modeling of the robust estimation methods a statistical design pattern is proposed. Section~\ref{oof-sec:ex-intro} facilitates the quick start by an example session giving a brief overview of the framework. Section~\ref{oof-sec:multi} describes the robust multivariate methods, their computation and implementation. The Sections~\ref{oof-sec:cov}, \ref{oof-sec:pca} and \ref{oof-sec:lda} are dedicated to the estimation of multivariate location and scatter, principal component analysis and discriminant analysis, respectively. For each domain the object model, the available visualization tools, an example, and other relevant information are presented. We conclude in Section~\ref{oof-sec:conclusions} with discussion and outline of the future work. \section{Design approach and structure of the framework} \label{oof-sec:objmodel} In classical multivariate statistics we rely on parametric models based on assumptions about the structural and the stochastic parts of the model for which optimal procedures are derived, like the least squares estimators and the maximum likelihood estimators. The corresponding robust methods can be seen as extensions to the classical ones which can cope with deviations from the stochastic assumptions thus mitigating the dangers for classical estimators. The developed statistical procedures will remain reliable and reasonably efficient even when such deviations are present. For example in the case of location and covariance estimation the classical theory yields the sample mean $\xbarv$ and the sample covariance matrix $\v{S}$, i.e., the corresponding MLE estimates as an optimal solution. One (out of many) robust alternatives is the minimum covariance determinant estimator. When we consider this situation from an object oriented design point of view we can think of an abstract base class representing the estimation problem, a concrete realization of this object---the classical estimates, and a second concrete derivative of the base class representing the MCD estimates. Since there exist many other robust estimators of multivariate location and covariance which share common characteristics we would prefer to add one more level of abstraction by defining an abstract ``robust'' object from which all other robust estimators are derived. We encounter a similar pattern in most of the other multivariate statistical methods like principal component analysis, linear and quadratic discriminant analysis, etc. and we will call it a \textit{statistical design pattern}. A schematic representation as an \textit{UML diagram} is shown in Figure~\ref{oof-fig:objmodel}. \begin{figure}[h!] \begin{center} \includegraphics[width=1.0\textwidth]{AModel} \label{oof-fig:objmodel} \caption{Class diagram of the statistical design pattern for robust estimation methods.} \end{center} \end{figure} The following simple example demonstrates the functionality. We start with a generic object model of a robust and the corresponding classical multivariate method with all the necessary interfaces and functionalities and then concretize it to represent the desired class hierarchy. The basic idea is to define an abstract \proglang{S}4 class which has as slots the common data elements of the result of the classical method and its robust counterparts (e.g., \code{Pca}). For this abstract class we can implement the standard in \proglang{R} generic functions like \code{print()}, \code{summary()}, \code{plot()} and maybe also \code{predict()}. Now we can derive and implement a concrete class which will represent the classical method, say \code{PcaClassic}. Further we derive another abstract class which represents a potential robust method we are going to implement, e.g., \code{PcaRobust}---it is abstract because we want to have a ``placeholder'' for the robust methods we are going to develop next. The generic functions that we implemented for the class \code{Pca} are still valid for \code{PcaRobust} but whenever necessary we can override them with new functionality. Now we have the necessary platform and of course we have had diligently documented everything we have implemented so far---this is our investment in the future development of robust methods from this family. The framework at its current expansion stage provides such platform for several important families of multivariate methods. It is time to dedicate our effort to the development and implementation of our new robust method/class, say \code{PcaHubert} and only to this---here comes the first obvious benefit from the framework---we do not need to care for the implementation of \code{print()}, \code{summary()}, \code{plot()} and \code{predict()} neither for their documentation or testing. In contrast to the \proglang{S}3 class system the \proglang{S}4 system requires the creation of objects to be done by the \code{new()} function which will perform the necessary validity checks. We go one step further and require that the \code{new()} function is not used directly but only through special functions known in \proglang{R} as \textit{generating functions} or as \textit{constructors} in the conventional object oriented programming languages. A constructor function has the same name as the corresponding class, takes the estimation options as parameters, organizes the necessary computations and returns an object of the class containing the results of the computation. It can take as a parameter also a \textit{control object} which itself is an \proglang{S}4 object and contains the estimation options. More details on the generating functions and their application for structuring the user interface can be found in \citet{todorov-constructors}. The main part of the framework is implemented in the package \pkg{rrcov} but it relies on code in the packages \pkg{robustbase} and \pkg{pcaPP} \citep{filzmoser-pcaPP}. The structure of the framework and its relation to other \proglang{R} packages is shown in Figure~\ref{oof-fig:structure}. \begin{figure}[h!] \begin{center} \includegraphics[width=0.8\textwidth]{Structure} \label{oof-fig:structure} \caption{Class diagram: structure of the framework and relation to other \proglang{R} packages.} \end{center} \end{figure} The framework can be used by other packages, like for example by \pkg{robust} \citep[see][]{konis-robust} or can be further extended. In Figure~\ref{oof-fig:structure} a hypothetical package \pkg{rrcovNA} is shown, which could extend the available robust multivariate methods with options for dealing with missing values. In the rest of this section some object-oriented programming (OOP) concepts will be discussed which are essential for understanding the framework. \newpage \subsection{UML diagrams} \label{oof-sec:UML} Throughout this paper we exploit UML class diagrams to give a clear picture of the framework and its components. UML stands for \textit{Unified Modeling Language}---an object-oriented system of notation which has evolved from previous works of Grady Booch, James Rumbaugh and Ivar Jacobson to become a tool accepted by the Object Management Group (OMG) as the standard for modeling object oriented programs \citep[see][]{umlInfra, umlSuper}. A class diagram models the structure and contents of a system by depicting classes, packages, objects and the relations among them with the aim to increase the ease of understanding the considered application. A class is denoted by a box with three compartments which contain the name, the attributes (slots) and operations (methods) of the class, respectively. The class name in italics indicates that the class is abstract. The bottom two compartments could be omitted or they can contain only the key attributes and operations which are useful for understanding the particular diagram. Each attribute is followed by its type and each operation---by the type of its return value. We use the \proglang{R} types like \code{numeric}, \code{logical}, \code{vector}, \code{matrix}, etc. but the type can be also a name of an \proglang{S}4 class. Relationships between classes are denoted by lines or arrows with different form. The inheritance relationship is depicted by a large empty triangular arrowhead pointing to the base class. Composition means that one class contains another one as a slot (not to be mistaken with the keyword ``contains'' signalling inheritance in \proglang{R}). This relation is represented by an arrow with a solid diamond on the side of the composed class. If a class ``uses'' another one or depends on it, the classes are connected by a dashed arrow (dependence relation). Packages can also be present in a class diagram---in our case they correspond more or less to \proglang{R} packages---and are shown as tabbed boxes with the name of the package written in the tab (see Figure~\ref{oof-fig:structure}). All UML diagrams of the framework were created with the open source UML tool \pkg{ArgoUML} \citep{argo:phd, argo:2000} which is available for download from \url{http://argouml.tigris.org/}. \subsection{Design patterns} \label{oof-sec:patterns} Design patterns are usually defined as general solutions to recurring design problems and refer to both the description of a solution and an instance of that solution solving a particular problem. The current use of the term design patterns originates in the writings of the architect Christopher Alexander devoted to urban planning and building architecture \citep{alexander} but it was brought to the software development community by the seminal book of \citet{gamma}. A design pattern can be seen as a template for how to solve a problem which can be used in many different situations. Object-Oriented design patterns are about classes and the relationships between classes or objects at abstract level, without defining the final classes or objects of the particular application. In order to be usable, design patterns must be defined formally and the documentation, including a preferably evocative name, describes the context in which the pattern is used, the pattern structure, the participants and collaboration, thus presenting the suggested solution. Design patterns are not limited to architecture or software development but can be applied in any domain where solutions are searched for. During the development of the here presented framework several design patterns were identified, which we prefer to call \textit{statistical design patterns}. The first one was already described earlier in this section and captures the relations among a classical and one or more alternative robust multivariate estimators. Another candidate is the control object encapsulating the estimation parameters and a third one is the factory-like construct which suggests selection of a robust estimation method and creation of the corresponding objects based on the data set characteristics (see Section~\ref{oof-sec:cov}). The formal description of these design patterns is beyond the scope of this work and we will limit the discussion to several examples. \subsection{Accessor methods} \label{oof-sec:accessors} One of the major characteristics and advantages of object oriented programming is the encapsulation. Unfortunately real encapsulation (information hiding) is missing in \proglang{R}, but as far as the access to the member variables is concerned this could be mitigated by defining accessor methods (i.e., methods used to examine or modify the slots (member variables) of a class) and ``advising'' the users to use them instead of directly accessing the slots. The usual way of defining accessor functions in \proglang{R} is to use the same name as the name of the corresponding slot. For example for the slot \code{a} these are: \begin{Scode} R> cc <- a(obj) R> a(obj) <- cc \end{Scode} In many cases this is not possible, because of conflicts with other existing functions. For example it is not possible to define an accessor function \code{cov()} for the slot \code{cov} of class \code{Cov}, since the function \code{cov()} already exists in the \code{base} \proglang{R}. Also it is not immediately seen if a slot is ``read only'' or can be modified by the user (unfortunately, as already mentioned, every slot in \proglang{R} can be modified by simply using \code{obj@a <- cc}). In \pkg{rrcov} a notation was adopted, which is usual in \proglang{Java}: the accessors are defined as \code{getXxx()} and \code{setXxx()} (if a \code{setXxx()} method is missing, we are ``not allowed'' to change the slot). The use of accessor methods allows to perform computations on demand (\code{getMah(mcd)} computes the Mahalanobis distances, stores them into the object and returns them) or even have ``virtual'' slots which are not at all stored in the object (e.g., \code{getCorr(mcd)} computes each time and returns the correlation matrix without storing it). \subsection{Naming conventions} \label{oof-sec:naming} %% %From Sun: "Class names should be nouns, in mixed case with the first letter of each %internal word capitalized. Methods should be verbs, in mixed case with the first %letter lowercase, with the first letter of each internal word capitalized." %% %No coding rules in R: the R Internals manual that is shipped with R %also has a section on coding standards: %http://cran.r-project.org/doc/manuals/R-ints.html#R-coding-standards %though this is quite short and does not go much beyond the basic indentation %% There is no agreed naming convention (coding rules) in \proglang{R} but to facilitate the framework usage several simple rules are in order, following the recommended Sun's \proglang{Java} coding style (see \url{http://java.sun.com/docs/codeconv/}): \bi \item{Class, function, method and variable names are alphanumeric, do not contain ``-'' or ``.'' but rather use interchanging lower and upper case.} \item{Class names start with an uppercase letter.} \item{Methods, functions, and variables start with a lowercase letter.} \item{Exceptions are functions returning an object of a given class (i.e., generating functions or constructors)---they have the same name as the class.} \item{Variables and methods which are not intended to be seen by the user---i.e., private members---start with ``.''.} \item{Violate these rules whenever necessary to maintain compatibility.} \ei \section{Example session} \label{oof-sec:ex-intro} In this section we will introduce the base functionalities of the framework by an example session. First of all we have to load the package \pkg{rrcov} which will cause all necessary packages to be loaded too. The framework includes many example data sets but here we will load only those which will be used throughout the following examples. For the rest of the paper it will be assumed that the package has been loaded already. <>= ## set the prompt to "R> " and the continuation to "+ " options(prompt="R> ", continue="+ ") @ <>= ## ## Load the 'rrcov' package and the first two data sets to be ## used throughout the examples ## library("rrcov") data("delivery") delivery.x <- delivery[,1:2] # take only the X part data("hbk") hbk.x <- hbk[,1:3] # take only the X part @ Most of the multivariate statistical methods are based on estimates of multivariate location and covariance, therefore these estimates play a central role in the framework. We will start with computing the robust \textit{minimum covariance determinant} estimate for the data set \code{delivery} from the package \pkg{robustbase}. The data set \citep[see][Table~23, p.~155]{rousseeuw-leroy} contains delivery time data in 25 observations with 3 variables. The aim is to explain the time required to service a vending machine \code{(Y)} by means of the number of products stocked \code{(X1)} and the distance walked by the route driver \code{(X2)}. For this example we will consider only the $\v{X}$ part of the data set. After computing its robust location and covariance matrix using the MCD method implemented in the function \code{CovMcd()} we can print the results by calling the default \code{show()} method on the returned object \code{mcd} as well as summary information by the \code{summary()} method. The standard output contains the robust estimates of location and covariance. The summary output contains additionally the eigenvalues of the covariance matrix and the robust distances of the data items (Mahalanobis type distances computed with the robust location and covariance instead of the sample ones). <>= ## ## Compute MCD estimates for the delivery data set ## - show() and summary() examples ## mcd <- CovMcd(delivery.x) mcd summary(mcd) @ <>= ## ## Example plot of the robust against classical ## distances for the delivery data set ## plot(mcd, which="dd") @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=0.8\textwidth} \includegraphics{ooframework-intro-plot} \caption{Example plot of the robust against classical distances for the \code{delivery} data set.} \label{oof-fig:intro} \end{figure} \end{center} Now we will show one of the available plots by calling the \code{plot()} method---in Figure~\ref{oof-fig:intro} the Distance-Distance plot introduced by \citet{Rousseeuw-van-Zomeren} is presented, which plots the robust distances versus the classical Mahalanobis distances and allows to classify the observations and identify the potential outliers. The description of this plot as well as examples of more graphical displays based on the covariance structure will be shown in Section~\ref{oof-sec:cov}. Apart from the demonstrated MCD method the framework provides many other robust estimators of multivariate location and covariance, actually almost all of the well established estimates in the contemporary robustness literature. The most fascinating feature of the framework is that one will get the output and the graphs in the same format, whatever estimation method was used. For example the following code lines will compute the S~estimates for the same data set and provide the standard and extended output (not shown here). <>= ## ## Compute the S-estimates for the delivery data set ## and provide the standard and extended output ## est <- CovSest(delivery.x, method="bisquare") est summary(est) @ Nevertheless, this variety of methods could pose a serious hurdle for the novice and could be quite tedious even for the experienced user. Therefore a shortcut is provided too---the function \code{CovRobust()} can be called with a parameter set specifying any of the available estimation methods, but if this parameter set is omitted the function will decide on the basis of the data size which method to use. As we see in the example below, in this case it selects the Stahel-Donoho estimates. For details and further examples see Section~\ref{oof-sec:cov}. <>= ## ## Automatically select the appropriate estimator according ## to the problem size - in this example the Stahel-Donoho estimates ## will be selected. ## est <- CovRobust(delivery.x) est @ \section{Robust multivariate methods} \label{oof-sec:multi} \subsection{Multivariate location and scatter} \label{oof-sec:cov} The framework provides an almost complete set of estimators for multivariate location and scatter with high breakdown point. The first such estimator was proposed by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} and it is recommended for small data sets, but the most widely used high breakdown estimator is the minimum covariance determinant estimate \citep{rousseeuw:85}. Several algorithms for computing the S~estimators \citep{davies:87} are provided \citep{ruppert:1992, rocke:94, rocke:96a, salibian:2005}. The minimum volume ellipsoid (MVE) estimator \citep{rousseeuw:85} is also included since it has some desirable properties when used as initial estimator for computing the S~estimates \citep[see][p. 198]{maronna:2006}. In the rest of this section the definitions of the different estimators of location and scatter will be briefly reviewed and the algorithms for their computation will be discussed. Further details can be found in the relevant references. The object model is presented and examples of its usage, as well as further examples of the graphical displays are given. \subsubsection{The Minimum covariance determinant estimator and its computation} \label{oof-sec:cov-mcd} The MCD estimator for a data set $\{\xv_1, \ldots, \xv_n\}$ in $\Re^p$ is defined by that subset $\{\xv_{i_1}, \ldots, \xv_{i_h}\}$ of $h$ observations whose covariance matrix has the smallest determinant among all possible subsets of size $h$. The MCD location and scatter estimate $\v{T}_{\MCD}$ and $\v{C}_{\MCD}$ are then given as the arithmetic mean and a multiple of the sample covariance matrix of that subset \begin{eqnarray} \label{oof-eq:mcd} \v{T}_{\MCD} &=& \frac{1}{h}\sum^{h}_{j=1} \xv_{i_j} \nonumber\\ \v{C}_{MCD} &=& c_{ccf}c_{sscf}\frac{1}{h-1}\sum^{h}_{j=1} (\xv_{i_j}-\v{T}_{\MCD})(\xv_{i_j}-\v{T}_{\MCD})^{\top}. \end{eqnarray} The multiplication factors $c_{ccf}$ (consistency correction factor) and $c_{sscf}$ (small sample correction factor) are selected so that $\v{C}$ is consistent at the multivariate normal model and unbiased at small samples \citep[see][]{butler:1993, croux-haesbroeck:99, pison:2002, todorov-cf}. A recommendable choice for $h$ is $\lfloor(n+p+1)/2\rfloor$ because then the BP of the MCD is maximized, but any integer $h$ within the interval $[(n + p + 1)/2,n]$ can be chosen, see \citet{rousseeuw-leroy}. Here $\lfloor z\rfloor$ denotes the integer part of $z$ which is not less than $z$. If $h = n$ then the MCD location and scatter estimate $\v{T}_{\MCD}$ and $\v{C}_{\MCD}$ reduce to the sample mean and covariance matrix of the full data set. The computation of the MCD estimator is far from being trivial. The naive algorithm would proceed by exhaustively investigating all subsets of size $h$ out of $n$ to find the subset with the smallest determinant of its covariance matrix, but this will be feasible only for very small data sets. Initially MCD was neglected in favor of MVE because the simple resampling algorithm was more efficient for MVE. Meanwhile several heuristic search algorithms \citep[see][]{todorov:92, rocke:94, hawkins:94} and exact algorithms \citep[][]{agullo:96} were proposed but now a very fast algorithm due to \citet{rousseeuw-vandriessen} exists and this algorithm is usually used in practice. The algorithm is based on the C-step which moves from one approximation $(\v{T}_1, \v{C}_1)$ of the MCD estimate of a data set $\v{X}=\{\xv_1, \ldots, \xv_n\}$ to the next one $(\v{T}_2, \v{C}_2)$ with possibly lower determinant $\det(\v{C}_2) \le \det(\v{C}_1)$ by computing the distances $d_1, \ldots, d_n$ relative to $(\v{T}_1, \v{C}_1)$, i.e., \begin{equation} \label{oof-eq:mah} d_i=\sqrt{(\xv_i-\v{T}_1)^{\top}\v{C}_1^{-1}(\xv_i-\v{T}_1)} \end{equation} and then computing $(\v{T}_2, \v{C}_2)$ for those $h$ observations which have smallest distances. ``C'' in C-step stands for ``concentration'' since we are looking for a more ``concentrated'' covariance matrix with lower determinant. \citet{rousseeuw-vandriessen} have proven a theorem stating that the iteration process given by the C-step converges in a finite number of steps to a (local) minimum. Since there is no guarantee that the global minimum of the MCD objective function will be reached, the iteration must be started many times from different initial subsets, to obtain an approximate solution. The procedure is very fast for small data sets but to make it really ``fast'' also for large data sets several computational improvements are used. \bi \item{\textit{initial subsets}: It is possible to restart the iterations from randomly generated subsets of size $h$, but in order to increase the probability of drawing subsets without outliers, $p+1$ points are selected randomly. These $p+1$ points are used to compute ($\v{T}_0,\v{C}_0)$. Then the distances $d_1,\ldots, d_n$ are computed and sorted in increasing order. Finally the first $h$ are selected to form the initial $h-$subset $H_0$.} \item{\textit{reduced number of C-steps}: The C-step involving the computation of the covariance matrix, its determinant and the relative distances, is the most computationally intensive part of the algorithm. Therefore instead of iterating to convergence for each initial subset only two C-steps are performed and the 10 subsets with lowest determinant are kept. Only these subsets are iterated to convergence. } \item{\textit{partitioning}: For large $n$ the computation time of the algorithm increases mainly because all $n$ distances given by Equation~(\ref{oof-eq:mah}) have to be computed at each iteration. An improvement is to partition the data set into a maximum of say five subsets of approximately equal size (but not larger than say 300) and iterate in each subset separately. The ten best solutions for each data set are kept and finally only those are iterated on the complete data set. } \item{\textit{nesting}: Further decrease of the computational time can be achieved for data sets with $n$ larger than say 1500 by drawing 1500 observations without replacement and performing the computations (including the partitioning) on this subset. Only the final iterations are carried out on the complete data set. The number of these iterations depends on the actual size of the data set at hand.} \ei The MCD estimator is not very efficient at normal models, especially if $h$ is selected so that maximal BP is achieved. To overcome the low efficiency of the MCD estimator, a reweighed version can be used. For this purpose a weight $w_i$ is assigned to each observation $\xv_i$, defined as $w_i=1$ if $(\xv_i-\v{T}_{\MCD})^{\top}\v{C}_{\MCD}^{-1}(\xv_i-\v{T}_{\MCD}) \le \chi^2_{p,0.975}$ and $w_i=0$ otherwise, relative to the raw MCD estimates $(\v{T}_{\MCD}, \v{C}_{\MCD})$. Then the reweighted estimates are computed as \begin{eqnarray} \label{oof-eq:mcd-rew} \v{T}_R &=& \frac{1}{\nu}\sum^{n}_{i=1}{w_i\xv_i},\nonumber\\ \v{C}_R &=& c_{r.ccf}c_{r.sscf}\frac{1}{\nu-1}\sum^n_{i=1}{w_i(\xv_i-\v{T}_R)(\xv_i-\v{T}_R)^{\top}}, \end{eqnarray} where $\nu$ is the sum of the weights, $\nu =\sum^n_{i=1}{w_i}$. Again, the multiplication factors $c_{r.ccf}$ and $c_{r.sscf}$ are selected so that $\v{C}_R$ is consistent at the multivariate normal model and unbiased at small samples \citep[see][and the references therein]{pison:2002, todorov-cf}. These reweighted estimates $(\v{T}_R,\v{C}_R)$ which have the same breakdown point as the initial (raw) estimates but better statistical efficiency are computed and used by default. \subsubsection{The Minimum volume ellipsoid estimates} \label{oof-sec:cov-mve} The minimum volume ellipsoid estimator searches for the ellipsoid of minimal volume containing at least half of the points in the data set $\v{X}$. Then the location estimate is defined as the center of this ellipsoid and the covariance estimate is provided by its shape. Formally the estimate is defined as these $\v{T}_{\MVE},\v{C}_{\MVE}$ that minimize $\det(\v{C})$ subject to \begin{equation} \label{oof-eq:mve} \#\{i:(\xv_i - \v{T})^{\top}\v{C}^{-1}(\xv_i - \v{T}) \le c^2\} \ge \left \lfloor \frac{n+p+1}{2} \right \rfloor, \end{equation} where \# denotes the cardinality. The constant $c$ is chosen as $\chi^2_{p,0.5}$. The search for the approximate solution is made over ellipsoids determined by the covariance matrix of $p+1$ of the data points and by applying a simple but effective improvement of the sub-sampling procedure as described in \citet{maronna:2006}, p. 198. Although there exists no formal proof of this improvement (as for MCD and LTS), simulations show that it can be recommended as an approximation of the MVE. The MVE was the first popular high breakdown point estimator of location and scatter but later it was replaced by the MCD, mainly because of the availability of an efficient algorithm for its computation \citep{rousseeuw-vandriessen}. Recently the MVE gained importance as initial estimator for S~estimation because of its small maximum bias \citep[see][Table~6.2, p.~196]{maronna:2006}. \subsubsection{The Stahel-Donoho estimator} \label{oof-sec:cov-sde} The first multivariate equivariant estimator of location and scatter with high breakdown point was proposed by \citet{stahel:81, stahel-phd:81} and \citet{donoho:82} but became better known after the analysis of \citet{maronna:95}. For a data set $\v{X}=\{\xv_1,\ldots,\xv_n\}$ in $\Re^p$ it is defined as a weighted mean and covariance matrix of the form given by Equation~(\ref{oof-eq:mcd-rew}) where the weight $w_i$ of each observation is inverse proportional to the ``outlyingness'' of the observation. Let the univariate outlyingness of a point $\xv_i$ with respect to the data set $\v{X}$ along a vector $\v{a} \in \Re^p, ||\v{a}|| \ne \v{0}$ be given by \begin{equation} \label{oof-eq:sde1} r(\xv_i,\v{a}) = \frac{|\xv^{\top}\v{a}-m(\v{a}^{\top}\v{X})|}{s(\v{a}^{\top}\v{X})}~~~i=1,\ldots,n \end{equation} where $(\v{a}^{\top}\v{X})$ is the projection of the data set $\v{X}$ on $\v{a}$ and the functions $m()$ and $s()$ are robust univariate location and scale statistics, for example the median and MAD, respectively. Then the multivariate outlyingness of $\xv_i$ is defined by \begin{equation} \label{oof-eq:sde2} r_i=r(\xv_i) = \max_{\v{a}} r(\xv_i,\v{a}). \end{equation} The weights are computed by $w_i=w(r_i)$ where $w(r)$ is a nonincreasing function of $r$ and $w(r)$ and $w(r)r^2$ are bounded. \citet{maronna:95} use the weights \begin{equation} \label{oof-eq:sde-weight} w(r)=\min \left ( 1,\left (\frac{c}{t} \right )^2 \right ) \end{equation} with $c=\sqrt{\chi^2_{p,\beta}}$ and $\beta=0.95$, that are known in the literature as ``Huber weights''. Exact computation of the estimator is not possible and an approximate solution is found by subsampling a large number of directions $\v{a}$ and computing the outlyingness measures $r_i, i=1,\ldots,n$ for them. For each subsample of $p$ points the vector $\v{a}$ is taken as the norm 1 vector orthogonal to the hyperplane spanned by these points. It has been shown by simulations \citep{maronna:2006} that one step reweighting does not improve the estimator. \subsubsection{Orthogonalized Gnanadesikan/Kettenring} \label{oof-sec:cov-ogk} The MCD estimator and all other known affine equivariant high-breakdown point estimates are solutions to a highly non-convex optimization problem and as such pose a serious computational challenge. Much faster estimates with high breakdown point can be computed if one gives up the requirements of affine equivariance of the covariance matrix. Such an algorithm was proposed by \citet{maronna:2002} which is based on the very simple robust bivariate covariance estimator $s_{jk}$ proposed by \citet{Gnanadesikan-Kettenring:1972} and studied by \citet{devlin:81}. For a pair of random variables $Y_j$ and $Y_k$ and a standard deviation function $\sigma()$, $s_{jk}$ is defined as \begin{equation} \label{oof-eq:GK} s_{jk}=\frac{1}{4}\left(\sigma \left(\frac{Y_j}{\sigma(Y_j)}+\frac{Y_k}{\sigma(Y_k)}\right)^2 - \sigma \left(\frac{Y_j}{\sigma(Y_j)}-\frac{Y_k}{\sigma(Y_k)}\right)^2\right). \end{equation} If a robust function is chosen for $\sigma()$ then $s_{jk}$ is also robust and an estimate of the covariance matrix can be obtained by computing each of its elements $s_{jk}$ for each $j=1,\ldots,p$ and $k=1,\ldots,p$ using Equation~(\ref{oof-eq:GK}). This estimator does not necessarily produce a positive definite matrix (although symmetric) and it is not affine equivariant. \citet{maronna:2002} overcome the lack of positive definiteness by the following steps: \bi \item{Define $\yv_i=\vv{D}^{-1}\xv_i, i=1,\ldots,n$ with $\v{D}=\diag(\sigma(X_1),\ldots,\sigma(X_p))$ where $X_l, l=1,\ldots,p$ are the columns of the data matrix $\vv{X}=\{\xv_1, \ldots, \xv_n\}$. Thus a normalized data matrix $\vv{Y}=\{\yv_1, \ldots, \yv_n\}$ is computed.} \item{Compute the matrix $\vv{U}=(u_{jk})$ as $u_{jk}= s_{jk}=s(Y_j, Y_k)$ if $j \ne k$ or $u_{jk}= 1$ otherwise. Here $Y_l, l=1,\ldots,p$ are the columns of the transformed data matrix $\vv{Y}$ and $s(.,.)$ is a robust estimate of the covariance of two random variables like the one in Equation~(\ref{oof-eq:GK}).} \item{Obtain the ``principal component decomposition'' of $\vv{Y}$ by decomposing $\vv{U}=\vv{E}\vv{\Lambda}\vv{E}^{\top}$ where $\vv{\Lambda}$ is a diagonal matrix $\vv{\Lambda}=\diag(\lambda_1,\ldots,\lambda_p)$ with the eigenvalues $\lambda_j$ of $\vv{U}$ and $\vv{E}$ is a matrix with columns the eigenvalues $\vv{e}_j$ of $\vv{U}$.} \item{Define $\zv_i=\vv{E}^{\top}\yv_i=\vv{E}^{\top}\vv{D}^{-1}\xv_i$ and $\vv{A}=\vv{D}\vv{E}$. Then the estimator of $\vv{\Sigma}$ is $\vv{C}_{\OGK}=\vv{A}\vv{\Gamma}\vv{A}^{\top}$ where $\vv{\Gamma}=\diag(\sigma(Z_j)^2), j=1,\ldots,p$} and the location estimator is $\vv{T}_{\OGK}=\vv{A}\mv$ where $\mv=m(\zv_i) = (m(Z_1),\ldots,m(Z_p))$ is a robust mean function. \ei This can be iterated by computing $\vv{C}_{\OGK}$ and $\vv{T}_{\OGK}$ for $\vv{Z}=\{\zv_1, \ldots, \zv_n\}$ obtained in the last step of the procedure and then transforming back to the original coordinate system. Simulations \citep{maronna:2002} show that iterations beyond the second did not lead to improvement. Similarly as for the MCD estimator a one-step reweighting can be performed using Equations~(\ref{oof-eq:mcd-rew}) but the weights $w_i$ are based on the 0.9 quantile of the $\chi^2_p$ distribution (instead of 0.975) and the correction factors $c_r.ccf$ and $c_r.sscf$ are not used. In order to complete the algorithm we need a robust and efficient location function $m()$ and scale function $\sigma()$, and one proposal is given in \citet{maronna:2002}. Further, the robust estimate of covariance between two random vectors $s()$ given by Equation~(\ref{oof-eq:GK}) can be replaced by another one. In the framework two such functions are predefined but the user can provide as a parameter an own function. \subsubsection{S estimates} \label{oof-sec:cov-s} S~estimators of $\muv$ and $\v{\Sigma}$ were introduced by \citet{davies:87} and further studied by \citet{lopuhaa:1989} \citep[see also][p. 263]{rousseeuw-leroy}. For a data set of $p$-variate observations $\{\xv_1, \ldots, \xv_n\}$ an S~estimate $(\v{T},\v{C})$ is defined as the solution of $\sigma(d_1,\ldots,d_n)= \min$ where $d_i=(\xv-\v{T})^{\top}\v{C}^{-1}(\xv-\v{T})$ and $\det(\v{C})=1$. Here $\sigma=\sigma(\zv)$ is the M-scale estimate of a data set $\zv=\{z_1,\ldots,z_n\}$ defined as the solution of $\frac{1}{n}\Sigma\rho(z/\sigma)=\delta$ where $\rho$ is nondecreasing, $\rho(0)=0$ and $\rho(\infty)=1$ and $\delta \in(0,1)$. An equivalent definition is to find the vector $\v{T}$ and a positive definite symmetric matrix $\v{C}$ that minimize $\det(\v{C})$ subject to \begin{equation} \label{oof-eq:s-def} \frac{1}{n}\sum_{i=1}^{n}\rho(d_i)=b_0 \end{equation} with the above $d_i$ and $\rho$. As shown by \citet{lopuhaa:1989} S~estimators have a close connection to the M~estimators and the solution $(\v{T},\v{C})$ is also a solution to an equation defining an M~estimator as well as a weighted sample mean and covariance matrix: \begin{eqnarray} \label{oof-eq:s-iter} d_i^{j}&=&[(\xv_i-\v{T}^{(j-1)})^{\top}\v{(C}^{(j-1)})^{-1}(\xv-\v{T}^{(j-1)})]^{1/2} \nonumber\\ \v{T}^{(j)} &=& \frac{\Sigma w(d_i^{(j)})\xv_i}{\Sigma w(d_i^{(j)})} \nonumber\\ \v{C}^{(j)} &=& \frac{\Sigma w(d_i^{(j)})(\xv_i-\v{T}^{(j)})(\xv_i-\v{T}^{(j)})^{\top}}{\Sigma w(d_i^{(j)})} \end{eqnarray} The framework implements the S~estimates in the class \code{CovSest} and provides four different algorithms for their computation. \be \item{\emph{SURREAL}: This algorithm was proposed by \citet{ruppert:1992} as an analog to the algorithm proposed by the same author for computing S~estimators of regression.} \item{\emph{Bisquare S~estimation with HBDP start}: S~estimates with the biweight $\rho$ function can be obtained using the Equations~(\ref{oof-eq:s-iter}) by a reweighted sample covariance and reweighted sample mean algorithm as described in \citet{maronna:2006}. The preferred approach is to start the iteration from a bias-robust but possibly inefficient estimate which is computed by some form of sub-sampling. Since \citet{maronna:2006} have shown that the MVE has smallest maximum bias (Table~6.2, p.~196) it is recommended to use it as initial estimate.} \item{\emph{Rocke type S~estimates}: In \citet{rocke:96a} it is shown that S~estimators in high dimensions can be sensitive to outliers even if the breakdown point is set to 50\%. Therefore they propose a modified $\rho$ function called translated biweight (or t-biweight) and replace the standardization step given in Equation~(\ref{oof-eq:s-def}) with a standardization step consisting of equating the median of $\rho(d_i)$ with the median under normality. The estimator is shown to be more outlier resistant in high dimensions than the typical S~estimators. The specifics of the iteration are given in \citet{rocke:96}, see also \citet{maronna:2006}. As starting values for the iteration any of the available methods in the framework can be used. The recommended (and consequently the default) one is the MVE estimator computed by \code{CovMve()}.} \item{\emph{Fast~S~estimates}: \citet{salibian:2005} proposed a fast algorithm for regression S~estimates similar to the FAST-LTS algorithm of \citet{rousseeuw-vandriessen:LTS} and borrowing ideas from the SURREAL algorithm of \citet{ruppert:1992}. Similarly, the FAST-S algorithm for multivariate location and scatter is based on modifying each candidate to improve the S-optimality criterion thus reducing the number of the necessary sub-samples required to achieve desired high breakdown point with high probability.} \ee \subsubsection{Object model for robust location and scatter estimation} \label{oof-sec:cov-objmodel} The object model for the \proglang{S}4 classes and methods implementing the different multivariate location and scatter estimators follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-cov}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{CovModel} \caption{Object model for robust location and scatter estimation.} \label{fig:uml-cov} \end{center} \end{figure} The abstract class \code{Cov} serves as a base class for deriving all classes representing classical and robust location and scatter estimation methods. It defines the common slots and the corresponding accessor methods, provides implementation for the general methods like \code{show()}, \code{plot()} and \code{summary()}. The slots of \code{Cov} hold some input or default parameters as well as the results of the computations: the location, the covariance matrix and the distances. The \code{show()} method presents brief results of the computations and the \code{summary()} method returns an object of class \code{SummaryCov} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new data (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. The classical location and scatter estimates are represented by the class \code{CovClassic} which inherits directly from \code{Cov} (and uses all slots and methods defined there). The function \code{CovClassic()} serves as a constructor (generating function) of the class. It can be called by providing a data frame or matrix. As already demonstrated in Section~\ref{oof-sec:ex-intro} the methods \code{show()} and \code{summary()} present the results of the computations. The \code{plot()} method draws different diagnostic plots which are shown in one of the next sections. The accessor functions like \code{getCenter()}, \code{getCov()}, etc. are used to access the corresponding slots. Another abstract class, \code{CovRobust} is derived from \code{Cov}, which serves as a base class for all robust location and scatter estimators. The classes representing robust estimators like \code{CovMcd}, \code{CovMve}, etc. are derived from \code{CovRobust} and provide implementation for the corresponding methods. Each of the constructor functions \code{CovMcd()}, \code{CovMve()},\code{CovOgk()}, \code{CovMest()} and \code{CovSest()} performs the necessary computations and returns an object of the class containing the results. Similarly as the \code{CovClassic()} function, these functions can be called either with a data frame or a numeric matrix. \subsubsection{Controlling the estimation options} \label{oof-sec:cov-control} Although the different robust estimators of multivariate location and scatter have some controlling options in common, like the tracing flag \code{trace} or the numeric tolerance \code{tolSolve} to be used for inversion (\code{solve}) of the covariance matrix in \code{mahalanobis()}, each of them has more specific options. For example, the MCD and MVE estimators (\code{CovMcd()} and \code{CovMve()}) can specify \code{alpha} which controls the size of the subsets over which the determinant (the volume of the ellipsoid) is minimized. The allowed values are between 0.5 and 1 and the default is 0.5. Similarly, these estimators have parameters \code{nsamp} for the number of subsets used for initial estimates and \code{seed} for the initial seed for \proglang{R}'s random number generator while the M and S~estimators (\code{CovMest} and \code{CovSest}) have to specify the required breakdown point (allowed values between $(n - p)/(2*n)$ and 1 with default 0.5) as well as the asymptotic rejection point, i.e., the fraction of points receiving zero weight \citep{rocke:96}. These parameters can be passed directly to the corresponding constructor function but additionally there exists the possibility to use a control object serving as a container for the parameters. The object model for the control objects shown in Figure~\ref{oof-fig:cov-control} follows the proposed class hierarchy---there is a base class \code{CovControl} which holds the common parameters and from this class all control classes holding the specific parameters of their estimators are derived. These classes have only a constructor function for creating new objects and a method \code{restimate()} which takes a data frame or a matrix, calls the corresponding estimator to perform the calculations and returns the created class with the results. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{CovControl} \caption{Object model of the control classes for robust location and scatter estimation.} \label{oof-fig:cov-control} \end{center} \end{figure} Apart from providing a structured container for the estimation parameters this class hierarchy has the following additional benefits: \bi \item{the parameters can be passed easily to another multivariate method, for example the principal components analysis based on a covariance matrix \code{PcaCov()} (see Section~\ref{oof-sec:pca}) can take a control object which will be used to estimate the desired covariance (or correlation) matrix. In the following example a control object holding the parameters for S~estimation will be created and then \code{PcaCov()} will be called with this object.} <>= set.seed(1234) @ <>= ## ## Controlling the estimation options with a control object ## control <- CovControlSest(method="biweight") PcaCov(hbk.x, cov.control=control) @ \item{the class hierarchy of the control objects allows to handle different estimator objects using a uniform interface thus leveraging one of the most important features of the object oriented programming, the polymorphism. In the following example we create a list containing different control objects and then via \code{sapply} we call the generic function \code{restimate()} on each of the objects in the list. The outcome will be a list containing the objects resulting from these calls (all are derived from \code{CovRobust}). This looping over the different estimation methods is very useful for implementing simulation studies.} <>= ## ## Controlling the estimation options: example ## of looping through several estimators ## cc <- list(CovControlMcd(), CovControlMest(), CovControlOgk(), CovControlSest(), CovControlSest(method="rocke")) clist <- sapply(cc, restimate, x=delivery.x) sapply(clist, data.class) sapply(clist, getMeth) @ \ei \subsubsection[A generalized function for robust location and covariance estimation: CovRobust()]{A generalized function for robust location and covariance estimation: \code{CovRobust()}} \label{oof-sec:cov-covrobust} The provided variety of estimation methods, each of them with different parameters as well as the object models described in the previous sections can be overwhelming for the user, especially for the novice who does not care much about the technical implementation of the framework. Therefore a function is provided which gives a quick access to the robust estimates of location and covariance matrix. This function is loosely modeled around the \textit{abstract factory design pattern} \citep[see][page 87]{gamma} in the sense that it creates concrete objects of derived classes and returns the result over a base class interface. The class \code{CovRobust} is abstract (defined as \textit{VIRTUAL}) and no objects of it can be created but any of the classes derived from \code{CovRobust}, such as \code{CovMcd} or \code{CovOgk}, can act as an object of class \code{CovRobust}. The function \code{CovRobust()} which is technically not a constructor function can return an object of any of the classes derived from \code{CovRobust} according to the user request. This request can be specified in one of three forms: \bi \item{If only a data frame or matrix is provided and the control parameter is omitted, the function decides which estimate to apply according to the size of the problem at hand. If there are less than 1000 observations and less than 10 variables or less than 5000 observations and less than 5 variables, Stahel-Donoho estimator will be used. Otherwise, if there are less than 50000 observations, either bisquare S~estimates (in case of less than 10 variables) or Rocke type S~estimates (for 10 to 20 variables) will be used. In both cases the S iteration starts at the initial MVE estimate. And finally, if there are more than 50000 observations and/or more than 20 variables the Orthogonalized Quadrant Correlation estimator (\code{CovOgk} with the corresponding parameters) is used. This is illustrated by the following example.} <>= ## ## Automatically select the appropriate estimator according ## to the problem size. ## getMeth(CovRobust(matrix(rnorm(40), ncol=2))) # 20x2 - SDE getMeth(CovRobust(matrix(rnorm(16000), ncol=8))) # 2000x8 - bisquare S getMeth(CovRobust(matrix(rnorm(20000), ncol=10))) # 2000x10 - Rocke S getMeth(CovRobust(matrix(rnorm(200000), ncol=2))) # 100000x2 - OGK @ \item{The simplest way to choose an estimator is to provide a character string with the name of the estimator---one of \code{"mcd"}, \code{"ogk"}, \code{"m"}, \code{"s-fast"}, \code{"s-rocke"}, etc.} <>= ## ## Rocke-type S-estimates ## getMeth(CovRobust(matrix(rnorm(40), ncol=2), control="rocke")) @ \item{If it is necessary to specify also some estimation parameters, the user can create a control object (derived from \code{CovControl}) and pass it to the function together with the data. For example to compute the OGK estimator using the median absolute deviation (MAD) as a scale estimate and the quadrant correlation (QC) as a pairwise correlation estimate we create a control object \code{ctrl} passing the parameters \code{s_mad} and \code{s_qc} to the constructor function and then call \code{CovRobust} with this object. The last command line illustrates the accessor method for getting the correlation matrix of the estimate as well as a nice formatting method for covariance matrices.} <>= ## ## Specify some estimation parameters through a control object. ## The last command line illustrates the accessor method ## for getting the correlation matrix of the estimate ## as well as a nice formatting method for covariance ## matrices. ## data("toxicity") ctrl <- CovControlOgk(smrob = "s_mad", svrob = "qc") est <- CovRobust(toxicity, ctrl) round(getCenter(est),2) as.dist(round(getCorr(est), 2)) @ \ei \subsubsection{Visualization of the results} \label{oof-sec:cov-vis} The default plot accessed through the method \code{plot()} of class \code{CovRobust} is the Distance-Distance plot introduced by \citet{Rousseeuw-van-Zomeren}. An example of this graph, which plots the robust distances versus the classical Mahalanobis distances is shown in Figure~\ref{oof-fig:intro}. The dashed line represents the points for which the robust and classical distances are equal. The horizontal and vertical lines are drawn at values $x=y=\sqrt{\chi_{p,0.975}^2}$. Points beyond these lines can be considered as outliers and are identified by their labels. The other available plots are accessible either interactively or through the \code{which} parameter of the \code{plot()} method. The left panel of Figure~\ref{oof-fig:cov-lattice} shows an example of the distance plot in which robust and classical Mahalanobis distances are shown in parallel panels. The outliers have large robust distances and are identified by their labels. The right panel of Figure~\ref{oof-fig:cov-lattice} shows a Quantile-Quantile comparison plot of the robust and the classical Mahalanobis distances versus the square root of the quantiles of the chi-squared distribution. <>= ## ## Distance plot and Chi-square Q-Q plot of the robust and classical distances ## Lattice plots (currently not available in rrcov) ## library("lattice") library("grid") library("rrcov") data("delivery") X <- delivery[,1:2] myPanel.dd <- function(x, y, subscripts, cutoff, ...) { panel.xyplot(x, y, ...) panel.abline(h=cutoff,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- sort(y, index.return=TRUE)$ix ind <- ind[(n-id.n+1):n] xrange<-range(y) adj <- (xrange[2]-xrange[1])/20 ltext(x[ind] + adj, y[ind] + adj, ind, cex=1.0) } } myPanel.qchi <- function(x, y, subscripts, cutoff, ...) { y <- sort(y, index.return=TRUE) iy <- y$ix y <- y$x panel.xyplot(x, y, ...) panel.abline(0,1,lty="dashed") n <- length(y) id.n <- length(which(y>cutoff)) if(id.n > 0){ ind <- (n-id.n+1):n xrange<-range(y) adj <- (xrange[2]-xrange[1])/50 ltext(x[ind] + adj, y[ind] + adj, iy[ind], cex=1.0) } } n<-nrow(X) p <- ncol(X) cutoff <- sqrt(qchisq(0.975, p)) mm <- covMcd(X) dd1 <- sqrt(mm$mah) # robust distances vv<-cov.wt(X) dd2 <- sqrt(mahalanobis(X,vv$center,vv$cov)) # classical distances dd<-c(dd1,dd2) # both robust and classical distances gr <- as.factor(c(rep(1,n), rep(2,n))) levels(gr)[1] <- "Robust" levels(gr)[2] <- "Classical" qq <- sqrt(qchisq(((1:n)-1/3)/(n+1/3), p)) ind.dd <- c(1:n, 1:n) ind.qchi <- c(qq, qq) dplot <- xyplot(dd~ind.dd|gr, cutoff=cutoff, panel = myPanel.dd, xlab="Index", ylab="Mahalanobis distance", main="Distance Plot", col = "darkred", scales=list(cex=1.0)) qplot <- xyplot(dd~ind.qchi|gr, cutoff=cutoff, panel = myPanel.qchi, xlab="Quantiles of the chi-squared distribution", ylab="Mahalanobis distance", main="Chi-Square QQ-Plot", col = "darkred", scales=list(cex=1.0)) plot(dplot, split = c(1, 1, 2, 1), more = TRUE) plot(qplot, split = c(2, 1, 2, 1), more = FALSE) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-cov-plot-lattice} \caption{Distance plot and Chi-square Q-Q plot of the robust and classical distances.} \label{oof-fig:cov-lattice} \end{figure} \end{center} The next plot shown in Figure~\ref{oof-fig:cov-ellipse} presents a scatter plot of the data on which the 97.5\% robust and classical confidence ellipses are superimposed. Currently this plot is available only for bivariate data. The observations with distances larger than $\sqrt{\chi_{p,0.975}^2}$ are identified by their subscript. In the right panel of Figure~\ref{oof-fig:cov-ellipse} a \code{screeplot} of the \code{milk} data set is shown, presenting the robust and classical eigenvalues. <>= ## ## a) scatter plot of the data with robust and classical confidence ellipses. ## b) screeplot presenting the robust and classical eigenvalues ## data("milk") usr<-par(mfrow=c(1,2)) plot(CovMcd(delivery[,1:2]), which="tolEllipsePlot", classic=TRUE) plot(CovMcd(milk), which="screeplot", classic=TRUE) par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-cov-plot-ellipse} \caption{Robust and classical tolerance ellipse for the \code{delivery} data and robust and classical screeplot for the \code{milk} data.} \label{oof-fig:cov-ellipse} \end{figure} \end{center} \subsection{Principal component analysis} \label{oof-sec:pca} Principal component analysis is a widely used technique for dimension reduction achieved by finding a smaller number $q$ of linear combinations of the originally observed $p$ variables and retaining most of the variability of the data. Thus PCA is usually aiming at a graphical representation of the data in a lower dimensional space. The classical approach to PCA measures the variability through the empirical variance and is essentially based on computation of eigenvalues and eigenvectors of the sample covariance or correlation matrix. Therefore the results may be extremely sensitive to the presence of even a few atypical observations in the data. These discrepancies will carry over to any subsequent analysis and to any graphical display related to the principal components such as the biplot. %%% Example - hbk data The following example in Figure~\ref{oof-fig:pca-hbk} illustrates the effect of outliers on the classical PCA. The data set \code{hbk} from the package \pkg{robustbase} consists of 75 observations in 4 dimensions (one response and three explanatory variables) and was constructed by Hawkins, Bradu and Kass in 1984 for illustrating some of the merits of a robust technique \citep[see][]{rousseeuw-leroy}. The first 10 observations are bad leverage points, and the next four points are good leverage points (i.e., their $\xv$ are outlying, but the corresponding $y$ fit the model quite well). We will consider only the X-part of the data. The left panel shows the plot of the scores on the first two classical principal components (the first two components account for more than 98\% of the total variation). The outliers are identified as separate groups, but the regular points are far from the origin (where the mean of the scores should be located). Furthermore, the ten bad leverage points 1--10 lie within the 97.5\% tolerance ellipse and influence the classical estimates of location and scatter. The right panel shows the same plot based on robust estimates. We see that the estimate of the center is not shifted by the outliers and these outliers are clearly separated by the 97.5\% tolerance ellipse. \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} <>= ## ## Principal Component Analysis example: ## Plot of the first two principal components of the ## Hawkins, Bradu and Kass data set: classical and robust ## par(mfrow=c(1,2)) pca <- PcaClassic(hbk.x, k=2) cpca <- list(center=c(0,0), cov=diag(pca@eigenvalues), n.obs=pca@n.obs) rrcov:::.myellipse(pca@scores, xcov=cpca, main="Classical", xlab="PC1", ylab="PC2", ylim=c(-30,30), id.n=0) abline(v=0) abline(h=0) text(-29,6,labels="1-10", cex=0.8) text(-37,-13,labels="14", cex=0.8) text(-31,-5,labels="11-13", cex=0.8) hub <- PcaHubert(hbk.x, k=2, mcd=TRUE) chub <- list(center=c(0,0), cov=diag(hub@eigenvalues), n.obs=hub@n.obs) rrcov:::.myellipse(hub@scores, xcov=chub, main="Robust (MCD)", xlab="PC1", ylab="PC2", xlim=c(-10,45), ylim=c(-25,15), id.n=0) abline(v=0) abline(h=0) text(30,-9,labels="1-10", cex=0.8) text(36,-11,labels="11", cex=0.8) text(42,-4,labels="12", cex=0.8) text(41,-11,labels="13", cex=0.8) text(44,-15,labels="14", cex=0.8) @ \caption{Plot of the first two principal components of the Hawkins, Bradu and Kass data set: classical and robust.} \label{oof-fig:pca-hbk} \end{figure} \end{center} PCA was probably the first multivariate technique subjected to robustification, either by simply computing the eigenvalues and eigenvectors of a robust estimate of the covariance matrix or directly by estimating each principal component in a robust manner. Different approaches to robust PCA are briefly presented in the next subsections with the emphasis on those methods which are available in the framework. Details about the methods and algorithms can be found in the corresponding references. The object model is described and examples are given. \subsubsection{PCA based on robust covariance matrix (MCD, OGK, MVE, etc.)} The most straightforward and intuitive method to obtain robust PCA is to replace the classical estimates of location and covariance by their robust analogues. In the earlier works M~estimators of location and scatter were used for this purpose \citep[see][]{devlin:81, campbell:80} but these estimators have the disadvantage of low breakdown point in high dimensions. To cope with this problem \citet{naga:1990} used the MVE estimator and \citet{todorov-compstat:94} used the MCD estimator. \citet{croux-Haesbroeck:2000} investigated the properties of the MCD estimator and computed its influence function and efficiency. The package \pkg{stats} in base \proglang{R} contains the function \code{princomp()} which performs a principal components analysis on a given numeric data matrix and returns the results as an object of \proglang{S}3 class \code{princomp}. This function has a parameter \code{covmat} which can take a covariance matrix, or a covariance list as returned by \code{cov.wt}, and if supplied, it is used rather than the covariance matrix of the input data. This allows to obtain robust principal components by supplying the covariance matrix computed by \code{cov.mve} or \code{cov.mcd} from the package \pkg{MASS}. One could ask why is it then necessary to include such type of function in the framework (since it already exists in the base package). The essential value added of the framework, apart from implementing many new robust multivariate methods is the unification of the interfaces by leveraging the object orientation provided by the \proglang{S}4 classes and methods. The function \code{PcaCov()} computes robust PCA by replacing the classical covariance matrix with one of the robust covariance estimators available in the framework---MCD, OGK, MVE, M, S or Stahel-Donoho, i.e., the parameter \code{cov.control} can be any object of a class derived from the base class \code{CovControl}. This control class will be used to compute a robust estimate of the covariance matrix. If this parameter is omitted, MCD will be used by default. Of course any newly developed estimator following the concepts of the framework can be used as input to the function \code{PcaCov()}. \subsubsection{Projection pursuit methods} The second approach to robust PCA uses \textit{projection pursuit} (PP) and calculates directly the robust estimates of the eigenvalues and eigenvectors. Directions are seeked for, which maximize the variance (classical PCA) of the data projected onto them. Replacing the variance with a robust measure of spread yields robust PCA. Such a method was first introduced by \citet{li:1985} using an M~estimator of scale $S_n$ as a \textit{projection index (PI)}. They showed that the PCA estimates inherit the robustness properties of the scale estimator $S_n$. Unfortunately, in spite of the good statistical properties of the method, the algorithm they proposed was too complicated to be used in practice. A more tractable algorithm in these lines was first proposed by \citet{croux-Ruiz-Gazen:1996} and later improved by \citet{croux-Ruiz-Gazen:2005}. To improve the performance of the algorithm for high dimensional data a new improved version was proposed by \citet{croux-filzmoser-oliveira-pppca}. The latter two algorithms are available in the package \pkg{pcaPP} \citep[see][]{filzmoser-pcaPP} as functions \code{PCAproj()} and \code{PCAgrid()}. In the framework these methods are represented by the classes \code{PcaProj} and \code{PcaGrid}. Their generating functions provide simple wrappers around the original functions from \pkg{pcaPP} and return objects of the corresponding class, derived from \code{PcaRobust}. A major advantage of the PP-approach is that it searches for the eigenvectors consecutively and in case of high dimensional data when we are interested in only the first one or two principal components this results in reduced computational time. Even more, the PP-estimates cope with the main drawback of the covariance-based estimates---they can be computed for data matrices with more variables than observations. \subsubsection{Hubert method (ROBPCA)} The PCA method proposed by \citet{hubert-ROBPCA:2005} tries to combine the advantages of both approaches---the PCA based on a robust covariance matrix and PCA based on projection pursuit. A brief description of the algorithm follows, for details see the relevant references \citep{hubert:2008}. Let $n$ denote the number of observations, and $p$ the number of original variables in the input data matrix $\v{X}$. The ROBPCA algorithm finds a robust center $\mv$ of the data and a loading matrix $\v{P}$ of dimension $p \times k$. Its columns are orthogonal and define a new coordinate system. The scores $\v{T}$, an $n \times k$ matrix, are the coordinates of the centered observations with respect to the loadings: \begin{equation} \label{oof-eq:pca-scores} \v{T}=(\v{X}-\v{1}\mv^{\top})\v{P} \end{equation} where $\v{1}$ is a column vector with all $n$ components equal to 1. The ROBPCA algorithm yields also a robust covariance matrix (often singular) which can be computed as \begin{equation} \label{oof-eq:pca-S} \v{S}=\v{PLP}^{\top} \end{equation} where $\v{L}$ is the diagonal matrix with the eigenvalues $l_1, \dots, l_k$. This is done in the following three main steps: \paragraph{Step 1:} The data are preprocessed by reducing their data space to the subspace spanned by the $n$ observations. This is done by singular value decomposition of the input data matrix. As a result the data are represented in a space whose dimension is $rank(\v{X})$, being at most $n-1$ without loss of information. \paragraph{Step 2:} In this step a measure of outlyingness is computed for each data point. For this purpose the data points are projected on the $n(n-1)/2$ univariate directions through each two points. If $n$ is too large, \code{maxdir} directions are chosen at random (\code{maxdir} defaults to 250 but can be changed by the user). On every direction the univariate MCD estimator of location and scale is computed and the standardized distance to the center is measured. The largest of these distances (over all considered directions) is the outlyingness measure of the data point. The $h$ data points with smallest outlyingness measure are used to compute the covariance matrix $\v{\Sigma}_h$ and to select the number $k$ of principal components to retain. This is done by finding $k$ such that $l_k/l_1 \ge 10^{-3}$ and $\Sigma_{j=1}^k l_j/\Sigma_{j=1}^r l_j \ge 0.8$. Alternatively the number of principal components $k$ can be specified by the user after inspecting the scree plot. \paragraph{Step 3:} The data points are projected on the $k$-dimensional subspace spanned by the $k$ eigenvectors corresponding to the largest $k$ eigenvalues of the matrix $\v{\Sigma}_h$. The location and scatter of the projected data are computed using the reweighted MCD estimator, and the eigenvectors of this scatter matrix yield the robust principal components. \subsubsection{Spherical principal components (SPC)} The spherical principal components procedure was first proposed by \cite{locantore:1999} as a method for functional data analysis. The idea is to perform classical PCA on the data, projected onto a unit sphere. The estimates of the eigenvectors are consistent if the data are elliptically distributed \cite[see][]{boente-fraiman:1999} and the procedure is extremely fast. Although not much is known about the efficiency of this method, the simulations of \cite{maronna:2005} show that it has very good performance. If each coordinate of the data is normalized using some kind of robust scale, like for example the MAD, and then SPC is applied, we obtain ``elliptical PCA'', but unfortunately this procedure is not consistent. \subsubsection{Object model for robust PCA and examples} \label{oof-sec:pca-objmodel} The object model for the \proglang{S}4 classes and methods implementing the principal component analysis methods follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-pca}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{PcaModel} \caption{Object model for robust Principal Component Analysis.} \label{fig:uml-pca} \end{center} \end{figure} The abstract class \code{Pca} serves as a base class for deriving all classes representing classical and robust principal components analysis methods. It defines the common slots and the corresponding accessor methods, provides implementation for the general methods like \code{show()}, \code{plot()}, \code{summary()} and \code{predict()}. The slots of \code{Pca} hold some input or default parameters like the requested number of components as well as the results of the computations: the eigenvalues, the loadings and the scores. The \code{show()} method presents brief results of the computations, and the \code{predict()} method projects the original or new data to the space spanned by the principal components. It can be used either with new observations or with the scores (if no new data are provided). The \code{summary()} method returns an object of class \code{SummaryPca} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new information (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. Classical principal component analysis is represented by the class \code{PcaClassic} which inherits directly from \code{Pca} (and uses all slots and methods defined there). The function \code{PcaClassic()} serves as a constructor (generating function) of the class. It can be called either by providing a data frame or matrix or a formula with no response variable, referring only to numeric variables. Let us consider the following simple example with the data set \code{hbk} from the package \pkg{robustbase}. The code line \begin{Scode} R> PcaClassic(hbk.x) \end{Scode} can be rewritten as (and is equivalent to) the following code line using the formula interface \begin{Scode} R> PcaClassic(~ ., data = hbk.x) \end{Scode} The function \code{PcaClassic()} performs the standard principal components analysis and returns an object of the class \code{PcaClassic}. <>= ## ## Classical PCA ## pca <- PcaClassic(~., data=hbk.x) pca summary(pca) plot(pca) getLoadings(pca) @ The \code{show()} method displays the standard deviations of the resulting principal components, the loadings and the original call. The \code{summary()} method presents the importance of the calculated components. The \code{plot()} draws a PCA diagnostic plot which is shown and described later. The accessor functions like \code{getLoadings()}, \code{getEigenvalues()}, etc. are used to access the corresponding slots, and \code{predict()} is used to rotate the original or new data to the space of the principle components. Another abstract class, \code{PcaRobust} is derived from \code{Pca}, which serves as a base class for all robust principal components methods. The classes representing robust PCA methods like \code{PcaHubert}, \code{PcaLocantore}, etc. are derived from \code{PcaRobust} and provide implementation for the corresponding methods. Each of the constructor functions \code{PcaCov()}, \code{PcaHubert()}, \code{PcaLocantore()}, \code{PcaGrid()} and \code{PcaProj()} performs the necessary computations and returns an object of the class containing the results. In the following example the same data are analyzed using the projection pursuit method \code{PcaGrid()}. <>= ## ## Robust PCA ## rpca <- PcaGrid(~., data=hbk.x) rpca summary(rpca) @ Similar to the function \code{PcaClassic()}, these functions can be called either with a data frame or matrix or by a formula interface. \subsubsection{Visualization of PCA results} \label{oof-sec:pca-vis} One of the most important applications of PCA, besides dimensionality reduction is data visualization. In the framework several plots for visualizing the results of the analysis are available. The \code{plot()} methods are implemented in the base class \code{Pca} and thus they are available for all objects derived from the class \code{Pca} no matter if classical and robust. The most straightforward plot is the \textit{screeplot} which plots the variances against the number of principal components (similar to the screeplot for the standard \code{prcomp()} and \code{princomp()} functions). It is a useful tool for determining the number of relevant principal components. An example of the classical and robust screeplot for the \code{milk} data from \pkg{robustbase} is shown in Figure~\ref{oof-fig:pca-screeplot}. <>= ## ## Screeplot for classical and robust PCA of the milk data set. ## usr <- par(mfrow=c(1,2)) screeplot(PcaClassic(milk), type="lines", main="Screeplot: classical PCA", sub="milk data") screeplot(PcaHubert(milk), type="lines", main="Screeplot: robust PCA", sub="milk data") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-screeplot} \caption{Screeplot for classical and robust PCA of the \code{milk} data set.} \label{oof-fig:pca-screeplot} \end{figure} \end{center} Another plot borrowed from standard \proglang{R} is the \textit{biplot}. The biplot \citep{gabriel} represents both the observations and variables in the plane of (the first) two principal components allowing the visualization of the magnitude and sign of each variable's contribution to these principal components. Each observation (row of scores) is represented as a point in the biplot and each variable is represented as an arrow. The arrows graphically indicate the proportion of the original variance explained by the (first) two principal components and their direction indicates the relative loadings on these components. Figure~\ref{oof-fig:pca-biplot} shows an example of the robust biplot of the \code{un86} data set which contains seven socioeconomic variables observed for 73 countries. The data set is from World Statistics in Brief, Number 10, a 1986 UN publication. It was used in \citet{Daigle:1992} to illustrate a robust biplot method. <>= ## ## Robust biplot for the UN86 data ## data("un86") set.seed(9) usr<-par(mfrow=c(1,2)) biplot(PcaCov(un86, corr=TRUE, cov.control=NULL), main="Classical biplot", col=c("gray55", "red")) biplot(PcaCov(un86, corr=TRUE), main="Robust biplot", col=c("gray55", "red")) par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-biplot} \caption{Classical (left panel) and robust (right panel) biplot for the \code{UN86} data.} \label{oof-fig:pca-biplot} \end{figure} \end{center} %% diagnostic plot (outlier map) In the context of PCA \citet{hubert-ROBPCA:2005} defined a \textit{diagnostic plot} or \textit{outlier map} which helps to distinguish between the regular observations and the different types of outliers. This plot is based on the \textit{score distances} and \textit{orthogonal distances} computed for each observation. The score distances are given by \begin{equation} \label{oof-eq:pca-SD} SD_i=\sqrt{\sum_{j=1}^k{\frac{t_{ij}^2}{l_j}}},~~~~ i=1,\ldots,n \end{equation} where $t_{ij}$ are the elements of the scores from (\ref{oof-eq:pca-scores}) and $l_j$ are the eignevalues (the diagonal elements of the matrix $\v{L}$ in (\ref{oof-eq:pca-S})). The orthogonal distances $OD_i$ of each observation to the subspace spanned by the first $k$ ($1\le k \le r$, $r$ is the rank of the data) principal components are defined by \begin{equation} \label{oof-eq:pca-OD} OD_i=||\xv_i - \hat{\muv} - \v{P}^{(k)}\tv_i^{(k)}||,~~~~ i=1,\ldots,n \end{equation} where $\xv_i$ denotes the $i$th observation, $\hat{\muv}$ is the estimated center of the data, $\tv_i^{(k)}$ is the $i$th score vector in the space of the first $k$ principal components and the matrix $\v{P}^{(k)}$ contains the first $k$ estimated eigenvectors in its columns. The diagnostic plot is constructed by plotting the score distances on the horizontal axis, the orthogonal distances on the vertical axis and drawing two cutoff lines which will help to classify the observations. The cutoff value on the horizontal axis (for the score distances) is taken as the 97.5\% quantile of $\chi_k^2$ distribution, i.e., $c_h=\sqrt{\chi^2_{k,0.975}}$. For the cutoff value on the vertical axis (for the orthogonal distances) the Wilson-Hilferty transformation for a $\chi^2$ distribution is used (which assumes that the $OD_i$ to the power of 2/3 are approximately normally distributed). The parameters $\mu$ and $\sigma$ of the normal distribution can be estimated by the median and MAD of the values $OD_i^{2/3}$, and the critical value can be taken as $c_v=(\hat{\mu} + \hat{\sigma}z_{0.975})^{3/2}$ where $z_{0.975}$ is the the 97.5\% quantile of the standard normal distribution. An example of the classical and robust diagnostic plot for the \code{hbk} data set from \pkg{robustbase} is shown in Figure~\ref{oof-fig:pca-diagplot}. <>= ## ## An example of the classical and robust diagnostic ## plot for the hbk data set ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=2), sub="data set: hbk, k=2") plot(PcaHubert(hbk.x, k=2), sub="data set: hbk, k=2") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-diagplot} \caption{Classical and robust diagnostic plot for the \code{hbk} data with $k=2$.} \label{oof-fig:pca-diagplot} \end{figure} \end{center} If $k=p$ the orthogonal distances are not meaningful and the diagnostic plot shows a simple distance plot of the score distances (distances vs index). An example is shown in Figure~\ref{oof-fig:pca-distplot}. <>= ## ## If k=p the orthogonal distances are not meaningful and ## simple distance plot of the score distances will be shown ## usr<-par(mfrow=c(1,2)) plot(PcaClassic(hbk.x, k=3), sub="data set: hbk.x, k=3") plot(PcaHubert(hbk.x, k=3), sub="data set: hbk.x, k=3") par(usr) @ \begin{center} \begin{figure}[h!] \setkeys{Gin}{width=1.0\textwidth} \includegraphics{ooframework-ex-pca-plot-distplot} \caption{Classical and robust diagnostic plot for the x-part of the \code{hbk} data set with $k=3=p$.} \label{oof-fig:pca-distplot} \end{figure} \end{center} \subsection{Linear and quadratic discriminant analysis} \label{oof-sec:lda} The problem of discriminant analysis arises when one wants to assign an individual to one of $g$ populations at the basis of a $p$-dimensional feature vector $\xv$. Let the $p$-dimensional random variable $\xv_k$ come from a population $\pi_k$ with underlying density $\v{f}_k$. Further let the prior probability of group $k$, i.e., the probability that an individual comes from population $\pi_k$ be $\alpha_k$, $\Sigma_{k=1}^g \alpha_k = 1$. The prior probabilities $\alpha_k$ are usually estimated by the empirical frequencies $n_k$ in the $k$-th group of the training set, i.e., $\hat{\alpha}_k=n_k/\Sigma_{j=1}^gn_j$. Then the Bayesian discriminant rule assigns an observation $\xv$ to that population $\pi_k$ for which the expression $\ln(\alpha_k \v{f}_k(\xv))$ is maximal over all groups $k=1,\ldots,g$. Usually it is assumed that the $k$ populations $\pi_k$ are $p$-dimensional normally distributed, \begin{equation} \label{oof-eq:discrim-distr} \pi_k \sim N({\muv}_k,\v{\Sigma}_k)~~~~~k=1,\ldots,g. \end{equation} With this assumption the discriminant rule is equivalent to maximizing the discriminant scores $D_k(\xv)$ given by \begin{equation} \label{oof-eq:QDA} D_k(\xv) = -\frac{1}{2}\ln|\v{\Sigma}_k| - \frac{1}{2}(\xv-\muv_k)^{\top}\v{\Sigma}_k^{-1}(\xv-\muv_k) + \ln(\alpha_k)~~~~~(k=1,\ldots,g), \end{equation} and individual $\xv$ is assigned to $\pi_k$ if \begin{equation} \label{oof-eq:QDA-rule} D_k(\xv)=\arg\max_j D_j(\xv). \end{equation} The application of the discrimination rule given by Equations~(\ref{oof-eq:QDA}) and (\ref{oof-eq:QDA-rule}) is referred to as quadratic discriminant analysis (QDA), since the groups are separated by quadratic boundaries. If it is further assumed that all group covariance matrices are equal $(\v{\Sigma}_{1}= \ldots= \v{\Sigma}_g=\v{\Sigma})$, then the overall probability of misclassification is minimized by assigning a new observation $\xv$ to population $\pi_k$ which maximizes \begin{equation} \label{oof-eq:LDA} %%%%%%%%d_k(\xv)=\frac{1}{2}(\xv-\muv_k)^{\top}\v{\Sigma}^{-1}(\xv-\muv_k) + \ln(\alpha_k)~~~~~(k=1,\ldots,g). d_k(\xv)=\xv^{\top}\v{\Sigma}^{-1}\muv_k - \frac{1}{2}\muv_k^{\top}\v{\Sigma}^{-1}\muv_k + \ln(\alpha_k)~~~~~(k=1,\ldots,g). \end{equation} The application of the discriminant rule given by Equation~(\ref{oof-eq:LDA}) is referred to as linear discriminant analysis (LDA), since the scores $d_k(\xv)$ are linear in $\xv$. If the means $\muv_k, k=1,\ldots,g$, and the common covariance matrix $\v{\Sigma}$ are unknown, which is usually the case, a training set consisting of samples drawn from each of the populations is required. In classical QDA and LDA the sample group means and sample covariance matrices are used to estimate $\muv_k$, $\v{\Sigma}_k$ and $\v{\Sigma}$. The prior probabilities can be estimated by the relative frequencies of observations in each particular group. Both QDA and LDA using the classical estimates in (\ref{oof-eq:QDA}) and (\ref{oof-eq:LDA}) are vulnerable to the presence of outliers. The problem of the non-robustness of the classical estimates in the setting of the quadratic and linear discriminant analysis has been addressed by many authors: \citet*{todorov:90, todorov:94} replaced the classical estimates by MCD estimates; \citet*{chork} used MVE instead; \citet*{hawkins:97} defined the minimum within-group covariance determinant estimator (MWCD) especially for the case of linear discriminant analysis; \citet*{he:2000} and \citet*{croux-dehon:01} used S~estimates; \citet*{hubert:04} applied the MCD estimates computed by the FAST-MCD algorithm. For a recent review and comparison of these methods see \citet{todorov-roblda}. A robust version of quadratic discriminant analysis can be obtained by substituting the parameters $\muv_k$, $\v{\Sigma}_k$ by their robust estimates. For this purpose the reweighted MCD estimates, S~estimates or OGK can be used. In the case of linear discriminant analysis a robust version of the common covariance matrix $\v{\Sigma}$ is necessary. There are several methods for estimating the common covariance matrix based on a high breakdown point estimator which are considered in one of the next subsections. \subsubsection{Object model for robust LDA and QDA} The object model for the \proglang{S}4 classes and methods implementing the linear and quadratic discriminant analysis methods follows the proposed class hierarchy given in Section~\ref{oof-sec:objmodel} and is presented in Figure~\ref{fig:uml-lda-qda}. \begin{figure}[h!] \begin{center} \includegraphics[width=\textwidth]{DAModel} \caption{Object models for robust linear discriminant analysis and quadratic discriminant analysis.} \label{fig:uml-lda-qda} \end{center} \end{figure} The abstract classes \code{Lda} and \code{Qda} serve as base classes for deriving all classes representing classical and robust methods for linear and quadratic discriminant analysis methods. They define the common slots and the corresponding accessor methods, provide implementation for the general methods like \code{show()}, \code{plot()}, \code{summary()} and \code{predict()}. This base classes also host several utility functions which are not directly exported but are documented and can be used by quoting the namespace. The slots of \code{Lda} hold some input or default parameters like the prior probabilities, the original data matrix and the grouping variable as well as the results of the computations: the group means and the common covariance matrix, the linear discriminant functions and the corresponding constants. The \code{show()} method presents brief results of the computations, and \code{predict()} can be used either for classifying new observations or for the evaluation of the discriminant rules on the basis of the training sample. The method \code{predict()} returns an object of class \code{PredictLda} which has its own \code{show()} method to print the results of the classification or evaluation. The \code{summary()} method returns an object of class \code{SummaryLda} which has its own \code{show()} method. As in the other sections of the framework these slots and methods are defined and documented only once in this base class and can be used by all derived classes. Whenever new data (slots) or functionality (methods) are necessary, they can be defined or redefined in the particular class. Classical linear discriminant analysis is represented by the class \code{LdaClassic} which inherits directly from \code{Lda} (and uses all slots and methods defined there). The function \code{LdaClassic()} serves as a constructor (generating function) of the class. It can be called either by providing a data frame or matrix and a grouping variable (factor) or a formula specifying the model to be used. Let us consider the following simple example with the data set \code{diabetes}: the grouping variable is \code{diabetes$group} and the three explanatory variables are \code{glucose}, \code{insulin} and \code{sspg}. The code \begin{Scode} R> x <- diabetes[, c("glucose", "insulin", "sspg")] R> grpvar <- diabetes$group R> LdaClassic(x, grpvar) \end{Scode} can be rewritten as (and is equivalent to) the following code using the formula interface: \begin{Scode} R> LdaClassic(group ~ ., data = diabetes) \end{Scode} The function \code{LdaClassic()} performs standard linear discriminant analysis and returns an object of class \code{LdaClassic}. Another abstract class, \code{LdaRobust} is derived from \code{Lda}, which serves as a base class for all robust linear discriminant analysis methods. The only slot added in this class is a character variable specifying the robust method to be used. The class \code{Linda} is derived from \code{LdaRobust} and provides implementation for all methods for robust LDA currently available in the framework. If we wanted to be precisely object oriented, we should define a separate class for each robust method---for example \code{LdaRobustMcd}, \code{LdaRobustFsa}, etc. but this would lead to explosion of the necessary code and documentation. The constructor function \code{Linda()} takes a character parameter \code{method} specifying which robust location and scatter estimator to use and how to compute the common covariance matrix and returns an object of class \code{Linda}. Similarly as the function \code{LdaClassic()}, \code{Linda()} can be called either with a data matrix and grouping variable or by a formula interface. \subsubsection{Computing the common covariance matrix} \label{oof-sec:common-cov} The easiest way to estimate the common covariance matrix $\v{\Sigma}$ is to obtain the estimates of the group means $\muv_k$ and group covariance matrices $\v{\Sigma}_k$ from the individual groups as $(\mv_k,\v{C}_k), k=1,\ldots,g$, and then pool the estimates $\v{C}_k, k=1,\ldots,g$ to yield the common covariance matrix \begin{equation} \v{C} = {\sum_{k=1}^g{n_k\v{C}_k} \over \sum_{k=1}^g{n_k-g}}. \end{equation} This method, using MVE and MCD estimates, was proposed by \citet{todorov:90, todorov:94} and was also used, based on the MVE estimator by \citet*{chork}. \newline \citet*{croux-dehon:01} applied this procedure for robustifying linear discriminant analysis based on S~estimates. A drawback of this method is that the same trimming proportions are applied to all groups which could lead to a loss of efficiency if some groups are outlier free. We will denote this method as ``$A$'' and the corresponding estimator as XXX-A. For example, in the case of the MCD estimator this will be MCD-A. Another method was proposed by \citet*{he:2000} for the S~estimates and was later adapted by \citet*{hubert:04} for the MCD estimates. Instead of pooling the group covariance matrices, the observations are centered and pooled to obtain a single sample for which the covariance matrix is estimated. It starts by obtaining the individual group location estimates $\tv_k, k=1,\ldots,g$, as the reweighted MCD location estimates of each group. These group means are swept from the original observations $\xv_{ik}~(i=1,\ldots,n_k;~k=1,\ldots,g)$ to obtain the centered observations \begin{eqnarray} \v{Z} = \{\zv_{ik}\}, ~~~~~\zv_{ik} = \xv_{ik} - \tv_k. \end{eqnarray} The common covariance matrix $\v{C}$ is estimated as the reweighted MCD covariance matrix of the centered observations $\v{Z}$. The location estimate $\deltav$ of $\v{Z}$ is used to adjust the group means $\mv_k$ and thus the final group means are \begin{equation} \mv_k = {\tv_k + \deltav}. \end{equation} This process could be iterated until convergence, but since the improvements from such iterations are negligible \citep[see][]{ he:2000, hubert:04} we are not going to use it. This method will be denoted by ``$B$'' and as already mentioned, the corresponding estimator as XXX-B, for example MCD-B. The third approach is to modify the algorithm for high breakdown point estimation itself in order to accommodate the pooled sample. \citet*{he:2000} modified Ruperts's SURREAL algorithm for S~estimation in case of two groups. \citet*{hawkins:97} defined the minimum within-group covariance determinant estimator which does not apply the same trimming proportion to each group but minimizes directly the determinant of the common within groups covariance matrix by pairwise swaps of observations. Unfortunately their estimator is based on the Feasible Solution Algorithm \citep[see][and the references therein]{hawkins:97}, which is extremely time consuming as compared to the FAST-MCD algorithm. \citet*{hubert:04} proposed a modification of this algorithm taking advantage of the FAST-MCD, but it is still necessary to compute the MCD for each individual group. This method will be denoted by MCD-C. Using the estimates $\mv^0_k$ and $\v{C}_0$ obtained by one of the methods, we can calculate the initial robust distances \citep{Rousseeuw-van-Zomeren} \begin{equation} RD^0_{ik}= \sqrt{(\xv_{ik}-\mv^0_k)^{\top}\v{C}_0^{-1}(\xv_{ik}-\mv^0_k)}. \end{equation} With these initial robust distances we can define a weight for each observation $\xv_{ik}, ~ i=1, \ldots , n_k$ and $k=1, \ldots, g$, by setting the weight to $1$ if the corresponding robust distance is less or equal to a suitable cut-off, usually $\sqrt{\chi^2_{p,0.975}}$, and to 0 otherwise, i.e., \begin{equation} \label{oof-eq:mdiv} w_{ik} = \begin{cases} 1&RD^0_{ik} \leq \sqrt{\chi^2_{p,0.975}} \\ 0&\text{otherwise}.\\ \end{cases} \end{equation} With these weights we can calculate the final reweighted estimates of the group means, $\mv_k$, and the common within-groups covariance matrix, $\v{C}$, which are necessary for constructing the robust classification rules, \begin{eqnarray} \mv_k &=& (\sum^{n_k}_{i=1}{w_{ik}\xv_{ik}})/\nu_k, \nonumber\\ \v{C} &=& \frac{1}{\nu-g}\sum^g_{k=1}\sum^{n_k}_{i=1}{w_{ik}(\xv_{ik}-\mv_k)(\xv_{ik}-\mv_k)^{\top}}, \end{eqnarray} where $\nu_k$ are the sums of the weights within group $k$, for $k=1,\ldots,g$, and $\nu$ is the total sum of weights, \begin{equation} \nu_k =\sum^{n_k}_{i=1}{w_{ik}}, ~~~~\nu = \sum^{g}_{k=1}{\nu_k}. \nonumber \end{equation} \subsubsection{Evaluation of the discriminant rules} In order to evaluate and compare different discriminant rules, their discriminating power has to be determined in the classification of future observations, i.e., we need an estimate of the overall probability of misclassification. A number of methods to estimate this probability exists in the literature---see for example \citet{lachenbruch:1975}. The \textit{apparent error rate} (known also as resubstitution error rate or reclassification error rate) is the most straightforward estimator of the actual error rate in discriminant analysis and is calculated by applying the classification criterion to the same data set from which it was derived. The number of misclassified observations for each group is divided by the group sample size. An estimate of the apparent error rate is calculated by the method \code{predict()} of the class \code{Lda}. Examples are given in the next section. It is well known that this method is too optimistic (the true error is likely to be higher). If there are plenty of observations in each class, the error rate can be estimated by splitting the data into training and validation set. The first one is used to estimate the discriminant rules and the second to estimate the misclassification error. This method is fast and easy to apply but it is wasteful of data. Another method is the \textit{leave-one-out} \textit{cross-validation} \citep{lachenbruch-michey:68} which proceeds by removing one observation from the data set, estimating the discriminant rule, using the remaining $n-1$ observations and then classifying this observation with the estimated discriminant rule. For the classical discriminant analysis there exist updating formulas which avoid the re-computation of the discriminant rule at each step, but no such formulas are available for the robust methods. Thus the estimation of the error rate by this method can be very time consuming depending on the size of the data set. Nevertheless, \pkg{rrcov} provides an (internal, not exported) function \code{rrcov:::.CV()} which calculates the leave-one-out cross-validation error rate by ``brute force'', but the user should be aware that its usage is appropriate only for moderate data sets. An improvement will be the implementation of a cross-validation technique similar to the one proposed by \citet{hubert:2007-CV}. \subsubsection{Example: Diabetes data} \label{oof:sec-diabetes} As an example for demonstrating the usage of the robust discriminant analysis classes and methods we use the \code{diabetes} data set, which was analyzed by \citet*{reaven-miller} in an attempt to examine the relationship between chemical diabetes and overt diabetes in 145 nonobese adult subjects. Their analysis was focused on three primary variables and the 145 individuals were classified initially on the basis of their plasma glucose levels into three groups: normal subjects, chemical diabetes and overt diabetes. This data set was also analyzed by \citet*{hawkins:97} in the context of robust linear discriminant analysis. The data set is available in several \proglang{R} packages: \code{diabetes} in package \pkg{mclust} \citep{mclust}, \code{chemdiab} in package \pkg{locfit} \citep{locfit} and \code{diabetes.dat} in \pkg{Rfwdmv} \citep{Rfwdmv}. We are going to use the one from \pkg{mclust} in which the value of the second variable, $insulin$, on the 104th observation, is 45 while for the other data sets this value is 455 (note that 45 is more likely to be an outlier in this variable than 455). We start with bringing the data set \code{diabetes} from package \pkg{mclust} into the workspace by typing <>= data("diabetes") @ Using the package \pkg{lattice} \citep{Sarkar:2008} we produce a three dimensional cloud plot of the data (Figure~\ref{lda-cloud}). << lda-cloud, fig=FALSE>>= library("lattice") # load the graphical library ## set different plot symbols - important for black-and-white print sup.sym <- trellis.par.get("superpose.symbol") sup.sym$pch <- c(1,2,3,4,5) trellis.par.set("superpose.symbol", sup.sym) cloud.plt <- cloud(insulin ~ glucose + sspg, groups = group, data = diabetes, auto.key=TRUE) @ \begin{center} \begin{figure}[h!] << lda-cloud-fig, fig=TRUE>>= print(cloud.plt) @ \caption{Three dimensional scatter plot of the \code{diabetes} data.} \label{lda-cloud} \end{figure} \end{center} We will first apply the classical linear discriminant analysis as implemented in \code{LdaClassic()} by the formula interface of the function---the grouping variable is \code{class} and all the remaining variables in \code{diabetes} are used as predictor variables. The \code{show()} method will present the results of the computations: the group means, the (common) within group covariance matrix, the linear discriminant functions together with the corresponding constants. The prior probabilities (either provided by the user or estimated as a proportion of the groups) are also presented. << lda-classic>>= lda <- LdaClassic(group~glucose+insulin+sspg, data=diabetes) lda @ Now the \code{predict()} method can be used on the \code{Lda} object (\code{Lda} is the base class for both \code{LdaClassic} and \code{LdaRobust}) in order to classify new observations. The method returns an object of class \code{PredictLda} which has its own \code{show()} method. If no new data are supplied, the training sample will be reclassified and a classification table will be produced to estimate the apparent error rate of the classification rules. << lda-classic-predict>>= predict(lda) @ Robust linear discriminant analysis can be performed in a similar way but using the function \code{Linda} (which will create an object of class \code{Linda}). As before the \code{predict()} method called without new data returns a classification table of the training subsample. Using the internal convenience function \code{rrcov:::.AER()} we can calculate and print the apparent error rate (which now is equal to 0.1103 and is lower than the obtained with the classical LDA 0.1310). << lda-robust>>= rlda <- Linda(group~glucose+insulin+sspg, data=diabetes) rlda rlda.predict <- predict(rlda) cat("\nApparent error rate: ", round(rrcov:::.AER(rlda.predict@ct),4)) @ In the above example we did not specify which method for computing the common covariance matrix should be used (thus using the default method ``MCD-B'' described above). We could choose the method by providing the \code{method} parameter to the function \code{Linda()}. For example the following call \begin{Scode} R> rlda <- Linda(group~glucose+insulin+sspg, data = diabetes, method = "fsa") \end{Scode} will use the \citet*{hawkins:97} \textit{feasible solution algorithm} method. The variance-covariance structures of the three classes in the \code{diabetes} data set differ substantially and we can expect improved results if quadratic discriminant analysis is used. Robust quadratic discriminant analysis is performed by the function \code{QdaCov()} which will return an object of class \code{QdaCov}. << qda-robust>>= rqda <- QdaCov(group~glucose+insulin+sspg, data=diabetes) rqda rqda.predict <- predict(rqda) cat("\nApparent error rate: ", round(rrcov:::.AER(rqda.predict@ct),4)) @ The accuracy of the prediction improves compared to the linear discriminant analysis. \section{Conclusions} \label{oof-sec:conclusions} In this paper we presented an object oriented framework for robust multivariate analysis developed in the \proglang{S}4 class system of the programming environment \proglang{R}. The main goal of the framework is to support the usage, experimentation, development and testing of robust multivariate methods as well as simplifying comparisons with related methods. It minimizes the effort for performing any of the following tasks: \bi \item{application of the already existing robust multivariate methods for practical data analysis;} \item{implementation of new robust multivariate methods or variants of the existing ones;} \item{evaluation of existing and new methods by carrying out comparison studies.} \ei A major design goal was the openness to extensions by the development of new robust methods in the package \pkg{rrcov} or in other packages depending on \pkg{rrcov}. Further classes implementing robust multivariate methods like principal component regression and partial least squares will follow but the user is encouraged to develop own methods using the proposed reusable statistical design patterns. \section*{Acknowledgements} We wish to express our thanks to the organizers of and participants in the ``Robust Statistics and \proglang{R}'' workshops for the valuable comments and suggestions which were a major input for the development of this framework. We are also grateful to many people, notably Matias Salibian-Barrera, Victor Yohai, Kjell Konis, and Christophe Croux for the provided code. The careful review and constructive comments of the editor and the anonymous reviewers helped us to substantially improve the manuscript. The views expressed herein are those of the authors and do not necessarily reflect the views of the United Nations Industrial Development Organization (UNIDO). \bibliography{mybiblio} \end{document} rrcov/inst/doc/rrcov.pdf0000644000176200001440000152224114200705520014757 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4527 /Filter /FlateDecode /N 88 /First 737 >> stream x\[s۶~?o;wݙ\48vzIdmE緟ovDN朑e @ ˙aFyfYa JX9Lzkp)1UX\TLKia:wI u8D!Q.(јL2'rP4%*U T(rTĔc,.=Y!@PHVC,^¥ ְ@]ṿ y^A}3osό`0#/rNq"sM818d`D8Q݂WRYb}5KW(FzdQƢf%g QjVޢ(0hNj4h˜}R[qFڡ0`Ef$X+P5 GG&/q_!0$*!8= N,jXBl4 N<(ҁ4Xh z$[0P :ݗ-Ԝ=H&N4(,Psn1Psp@͐ 1 j.1~XvѠ00Ec_Mq5)[Hz( Q0毫'x~\o U.z &5 줽I١"~(,P÷.,NuT d/v pn],'m77`28gfu2ΗԚyo9Ɏ$-x1A[~o9zσr0qy>ƿ Q59'* D?=:T5:y_#A)b9u4nn|`B?`÷zv=<4cG_ʸGGrۯJu6"Y9D=_˻\څ=@+Mxmxx{)f7b ?jz U$ؔu äĔ@GRNJw,J;$5Q/"D')?!_#_[*x.[dOq=&yy9?뒟?1>)ځ5iWׯqyų&t1!I z:oR(ӆ-/؟Mm'oԃwMYS>?_ow_"? 8Z.lc.)uPhp%]U5|49DsUD+']y3В[}kFprx`Qa&&m50˫JUʸZmZ%(S點@, [QT7Qʪ"y/*b,.( kDD!>g/*yқ^-7 HY;*w¶BIJY%׿ՓA.zM-eP/x@srEXˌ3ѧ\vOH@(.?AoLIjDfU@ Lnm'քɛoy ʱEX63*Jj[h0ly#|-rLE8bl^'4x"Gn-sJ!*|!2 5I z %fzʊ`0PsO{x}1 sg^u2LqY*%>ve~r"-~^,%NOj 8 P[ w:`邑?-vF Fx { ~] 4m~@J`IQ=ͳDL〮lN٬qٶt[g림 6a5%jnʭmw,8,b13 ŀud/|`rg)ѰKHi)M䑘4ՓGXGp`}3؛ǰ.0"2|4QL;J}&(L=Mo["}{dEF+E~"+MFV(R`&3HRڅہj 4oKk0͉ދoBz6r*,GuCr¼e" rDQ/_"@X䜁U7בe~e{?IY#IH2"iKF#lrEf{=OӤXIP)X6`_7gaAUHAv!inH#pG ˂fAQ:SsM4<DH &Ӓ$hAs$xːìHR>I8g>Xu ^!$I0H5)F{i]\d ,J+M*xҤk?ךq>̶߬__eh~"˝ $~; Gz|Ȳ|82:_W G% /vO=2gf)qmm;Emm}GZ ^ SYA?M1G6&d{+`UF?B NeViR3w ?|SΚ2p~8cC>}^Ճ2JЪz'Ib3ٍ2 X6Ov?2)>@(fH eA.\#nyZM9n1-ly5ܴ/mE[;6,l&:#af?6Jnߓk+_I +endstream endobj 90 0 obj << /Subtype /XML /Type /Metadata /Length 1556 >> stream GPL Ghostscript 9.53.2 robustness, multivariate analysis, MCD, R, statistical design patterns 2022-02-09T10:37:14+01:00 2022-02-09T10:37:14+01:00 LaTeX with hyperref package Object Oriented Framework for Robust Multivariate AnalysisValentin Todorov, Peter Filzmoser endstream endobj 91 0 obj << /Type /ObjStm /Length 3823 /Filter /FlateDecode /N 88 /First 818 >> stream x[ks۶~> ~uz;I&mܤr; ˴VIN{%9|˃b FiY4*ŢeZB=IAqdJ)D2LKq*0LM,^ NQat'hpdnK5ʢTR1c-K͌x) N,3IǬ4Tأfdd%edGh fNz*cӆX T9g'9DтyKյdZ bA94GkL@mXp@")Yj_z* kA"TO Hz"P44PƐzUMJRCJԤSCz5TtEZFB0YAJ"Z҉ O)tCeqB观3O '6)Bj"QFRkK8"Sk}:FLwUpFlIWQ=Oz3⣉t ڧڬѝI֐O-0DwEԡԣ޲|{I=?$67ǐ9QG&m>fy2˓YT<,Oey*SYTcoTOsyʓjR)m1Qp y3j:*g4iޠ/谜CxsH{sY% Ho1GL{F#&=arO6˳Ylc,f9.qYr\e])[)ƹ8րU;?Lˣo~`P_ 'R=xXOa2OYI~5 Ezr6VzJl*lWj [{_U'sRW!5}NAw2_HL wd09'k$0̎> Ap4YLb8)!"BZpKt߀eL 0.55'%崪O;>3>iY55f]?@?HO1ڄm|K6:/Ër#9·j79 TM3;e:+[ko<>EˋJj . n0dw7rP|qҷK=ؼLp q61v4\)i c:M2~#(1bs@|Gn8M>>g&Wo[ S?bhEKٲ-;1eg'UC^=}h1&D`.G=m 1WL~v5 AAJNaZv 7fË!lxq|2]au[=V^LQ< z-CmH-5a7f%y.ds d玿~sĬ.EBb;i[Lcb)43| *z< PFT@e+,<8vHPHy*뽀R>K J ]Xw'֘acau Ea ;wϠƆ%( Pr̈́%bE왩@lxZ)Ej{DAB &H r IN"-& 0>i84:azWLAn1S_.4GH-- 1 s$o F>)Q,>LkAQKC<]ͫz|>G_i'^ӳSqsdwIa)pΏpl<)NtW ٨DD/&>NG@鱣mtjmuT~kᓁ_xJLo]~"/՗_o;=joW \.{ XWD5ĐDtwc> sbezO/>iigF7WhtNi]jUiQe1uЍ3 Z$9^-[5W]GH[w_0s"wmtq m D.@Y Gǹ(ljbvNi^I6s帯-r|N,|"37?(It ώ#]HTwS\jQ+ǔll.sRnZTVP8=okޜ$_/eGt<\9h_=/:v$4. |Nݚ0+ 7av9,ȰaF3id4{dk!:dl=+Փߗfyk2U ͇YMHuT]5bA>XruhoBW,ҝm ͝՟qɕdnׯFGmXSͻB6ո&|z2p)Sup(Z?cjAYAa.@A%&b4VbqO[Pح PkLX+|$iWr$u'w(CykBP}H]賅d]&" pLao*JX e%}'$-),{MR4ݥApIQN;OneCA[,@P]w߆c6(|+}ʋTȸPE8s[hǬj˕ro"oWZM;kf{w1ȊʔiԍT+/,֗pLz \BdS]@Z,l<=e* :/%S L_o<(N{¤-[B Hk\iXuZt2N6W/ftE W2 ʰlh^ZPZ.6n{򺜣$Yҧ>꧋1p%uh%+L^?}s?M6skf)R-ǔJKjj;- m,e<}`|p+@n| ~9促ӿO.dۦhFj(r}`bm's11ܽjRzZb8b$hK[=pЇ^oUloS~.9S'EDJ#:hb;'Xa,Y(eIV0J 4TeQi#a)$Aw$><݄*Nendstream endobj 180 0 obj << /Type /ObjStm /Length 3734 /Filter /FlateDecode /N 88 /First 815 >> stream x[Ys}o*ET0K @lK!Yr_#5c#r Ok3TTL25^hG˂q9)k48ݒ1I'uX 0t0m%OCttg:Ez40ch `>0-%j04У--(-Ac,㤢gN{'0gȜtsb.V谄RKIͼrހyɴ[GA*G]m9r,2.zLh _763Hs#-;j \PM]B!W( \ϕ\ϗ|ϗReTOe{6kS&}סf { y^}`qt1J;qm2&'YEfŃ gt-k٠ B-?.24oFNjSboKd8 K0UWakɒ ^ZVfbNŃjtr|~y+x$^x'ދjJX/o7Lih{ɜ4,%gZC}h\r qYu5_ONG98'ӗi8GhQJv-i8s:;fEdV#/xX !',cҍVZ`"Z-yQrWg ww60]L1uiuލMw{=b*ʺ)N`g8yUVY). !LE[!Pe F@L3C/_H1䷧fLkwj=7Q,~8Z UvW̟}u싗Jݭh~z}`eҿГh}b;"N"^)NV{ߵRJ.+L>хۺ0mP|~b*P 4>]pMNWW\z ޽y^xK2E:-^"y\0]qs!9E/ #>f[EMZ[^ZV] ґ_ݟ7'WOz<]D|f~| <Ib8O'{v6,ImO>?&b$ưptRsqNj\}Zԣ-#Ϋhz,f`XMR,'0tV/.z5 +b6"7n.~M?>xӖmet?u;苟.ild9vU\J Z,8kGu`|Tvkf;Q2R3|(RbYsbY:|9wse e e e ̕,) R+-oqjoHçL8:)ݔxcGrtKt]%mgƻ:oe8=%Ӓbm+No8#s@gt+s+F@z(~b}'Iu}HF%+HVQL$MnCȉW#$7qY:a1'֘=`D99(|a'Ynt:{ܩQ&R@qeSr (k{u."xJU"l.]+ vv]fNɩZf *wu)YJb<~ zu`MP Ov ء&\ -d$i4.v*evlU\[4jiN!ʰڐ1)9UWT@1}(x ($w,XA ~x}tup1NS=],'`v2]bt2tv"oYjr7XxJ;R_ Hԏ`:$ЧJf A,oq:MwlVQIȇP O "S2BnT2>&V@Ef'P7)\زY0MQדMrW)}y Nt8q5N>$J*#5=Q2,iboIJg')Jk푮S8L?b^io -QXˡҠl-lZ,TѾȥ޲Q=[{*-!#1 Կ渌{ 9da\ +LVM;ڐ]-?j/=J|}nRgr.&b2@lS.Uɪ,$6`$훮U:_?%UZ H_V髮 ( Y5(+)HG'b>Os௞1ק0]_Vz 6UWx|۾1*c\:VBwĂӳyj`K=;$P\ڧ],'kkY ]e4EVGfϴM{Eyߣ|e$?E6e\h6\}W_QbvJT.~Oi:-,>V3Ĥ5cdlTϾYUދ/j6Jxdht]JV1[FW$ Y?M?|HG<;Sb7 p zbr˺Nq4,DdkL^0uz=G ԤS 9]'vĽz n~lV2rX3;vS+C:w`N@5MR9^`o.'Kh(Otgbt5AS˓2 rn)pLn*a 4$NB_&Pԃ׀Ғ*6P m9tTrf dcPNsPo*xn;kP;4eje+5aqEѧO|eVcSFɇ%mcilִds4r0^W7/exvEVbbV !| )5% =seǟendstream endobj 269 0 obj << /Type /ObjStm /Length 3912 /Filter /FlateDecode /N 88 /First 829 >> stream x\ioFb>b}Ej7n4E>6ck+K^&árZ q~ d2D3iq4L*MˤǔP ϔ4"NVTL;bڣ 41` #Np84xfUȬ؜8VQ1g4 Qg񨊆93ZBB!y *捤"E`PQP,P b8aADZXc;,DA# ׵,jkP,Z4A,EaP*P-IT@@%WJ U`"sI)9QK+вB҂ZK }Ȩ@%<]EJyX5P(9OF0H\"2#,@GhOmԖH gs/%5uU 1c~_F旑*u>|ۓ=ۓ=S=S=ebWRART~9_Nt~9_NәX:KtnOtnLnLnLn!M D| ᨠ-T:ztMK}=coSbQbQWBoa#Iŗ/ XOU8'Ώc?Gɏ+O)?b2{s3_n1?1[~KB7*?VuiJr:\)h0g?'G ? f5.G^C}pT"f2S?n{$>F%{KǏ3Q {iUޜ[Z%!29 /~gxP]~9fR<:)Fj7Q5O!\[!` 1y3ݒ¦^~iŊF 1?nAD*ҧ >9]} ItYYDk:WEu7 7dv S~ eT'n(8Lb*pq8V_S7݌܍ Wj8 2 !/!0+!k>0m.OAOG޼8m1(~"nLh y 3W' jNjN~*x8.^ 9+?VӲ'r:Y|7 wOl[ֲcSΓٌ󯟝enl!׃hCĤCw1?wY~C@|!Q\Tٸ, ck;FSԠsL ~ {e~o))#28/A (C&oOٰGU$¡O}[ME܆ۋӷǯq#Ϊ%tFF!ks!_^]sg'o Y$RiCz |f<):zWWqM  \bVێΙH%͒ !_bܔ/gGxJJvҎwC_rMܖqd*:~{ b Ӷ/r=4 ѴظבuS!W%x5IXHbSkN:{4{];jt=*}&Ph\uwvmI@ i-y/jQ^.*"A9^]-%):HVWru.jXW\<7\/#<qG.-.*UcPNt9ݎ_'pZѽh.J<3ruP *~hedar7dEK]ڒ7b>}.1Y+y4EYMn/i eN>5NFm?}-L/iƖDIȺhwG_3n4;O SXh Qy6]t\>^4p@@_xm*D,; JPXPN =$,a@4ڀ2QҶH3* U{W,2) >(.砌pԉ4˙LLoj.ͤ7fs#7;JMͤ2aJ8a J]`-btہړVLsǯ^~+>.7Lc7u1ct@S+ uu Cx߄gDtx2)15 Һ۽06 Ŭ l%y)ke o>59o Z`8vR7DAy)Fhi :ifa 8pV@BghޑD 5{{Y%a/jn!j,h1n>f 17bv8>)4G3-(&NSA)vY3tDI&݁nʨ0b+ .:'~BuPPZz(_\Bf^ף| ]3)M̓&:- wnJi0KsPN]j'XYI$#N` ˬf`#"a&}T,E2٘.dZsPH(k ZM0q3N+HWZv5 sP4B˶j!jl"}VF r>-ᅾz2'q*d߉e9jz<2K!C0!~ȄQxP&dPV"Bm@4 r$.[Ks#D ѽr5@RH$( CBxpH]Tr:(:x#wt[gyF4])֤ۻ0R:`F֡gȍL +Mܑ=D'e~8[4 0aߎ{AN˴A=$BRHvqmq'iv* D-@h.]i?DBj£*i]!D4(?~XBItO;wh8vVoIҮg_zX^Z+Qm^YZ_z[^VV"cKm[/eNu FqyY T24%^ ZŴ;XQVҲ  J5;ʦIp|#[ IpL^ݑQ,XldHl]f)Z7[ڭYo=G;];oendstream endobj 358 0 obj << /Type /ObjStm /Length 3177 /Filter /FlateDecode /N 88 /First 818 >> stream x[[s[}?B P-$&`P=kڶ;L&o,['}> %lP¨6e\jE|vB+^h#nNDIBYPZTBQ Ǎd+s-:a|腉c&%fGNeQEJ >[ \"XMx[$NV8Ŭ.~+) 6[T]6G(>T ƠlE LN1k&"OQ8}=58D4()-"_;eD 7nH"8\$R2|Dʆf ,٣Nki#rB8mE6T@4L44lhn}VT40|g`Gh?ŝ-PvPXW+HA D fyu6]Kl0@^:@ݤZu ̋:@4mց9JAB)`aQ31BѨ}LYXODd2.@J ٗW]\ͳd1 W@y9NߣKLrZ48ΐAeh>}7|~bZQAfy:M/G ݜ}\4ߍ/P觟K0z;k״v&R@ 2ke/r-^w01ƘScjcLۘesT/QԫWW<[˳<[˳ѨhV+Uth΂͏?ac.Jt5FLjBs Yz<(LxEb &@y'H&HEkjq09گ!a6}LUQnbfSvC?OX0`Gz15&OLv =@[.$P-z+sDi0 0B*LHOQnz2TDSUoi/aAi}Apq϶[ aWa) 7m'磢5xѓxx_C ?\L/Ǔ+ѼOL|p&B\Otl|LŰ&Ҡº%[ X\So={$^ u<|9_mj7Ϛi JꏡBë9&4@iV;W9Bo gœ&(_XvK7ѼX/e=Mmr59lmSa(:/vn"Q䩔#X-*E67iRuK];ְQْͥ5z0 7/WY3hΛ7Ͱh.Isٌ_m3n~kߛ ({qXXns3ͬ7ŨY4ͻ}-^K9>`vu~o>Hn_쿃7F!Zܛ'5.n;drLX4L\o $ȼ%ȸ[l#CE‚?˟&K"Ng# !q4 `o\O7& ٚ>m\ 2 Pv9#nW}vi6$Bʎ\e$ *fJR8겁$F`B5&r >rXynf_3.S 8zH\ zt25FdԎ=K C>åޗbEw'7<6g˹9<͛,}`1Ti;.v.x8ݐ &ǭQgͷ&((s9:E4S1e 2 szuH-] \ݧ Eս簽7hT b%搭>K1ڏ#+L T# ]MʪN,FU\:r*%c*,.*7]E%r a7K3c92!G 43wOb6n)a&1q0nau^”CZL^c1 XYLLII%Z 9n]c:A!9S]g1Z]Z˺,F&:L;_cB#&0:)mMv-XݦQwCus)aviƃӡ 3GG,e֠С. @MՇA*G=",zO=15>1 Lv81 g}e1{6"J(ǭaU-Uc&r1%j0Sw@ ol /H;#?xoboM-+*Lm)B5uІqnUGd=O|z#n? ( 'endstream endobj 447 0 obj << /Type /ObjStm /Length 3232 /Filter /FlateDecode /N 88 /First 812 >> stream x[r7}߯nm[RJXVؖ[٭<#sC Ig d"rɘAt. %KX#ZJ-(&FPZEV?$/6\)F\Dcּ% -L jy+S;a `'a}W^V6vZs q1íNd_ AJq-/HZ?59n9*A!F#(y~eך8 " ^x$$xHG|B.)E_& ega@!p_vT@m("'IDx!-_hEp&@f`(D?"  R #WKҘ WVqsJV@ Q,aPD+0PA ^qCG 0#> DƉIVCLdЇ5<1}`޸zߡ, ( Ndч3>hEX"`0Bjdd*q[TJ_PXT h:Y 'h-`Yjx9<~E%CtZ=f0CQX/\0_/0/?7p7?~=.rWCܮ3q2zۇF t2S2ACKY Zg|I`0Ϧt2|sn7^Ke62 X- T2d!YqF/Ͼ|\d' ,} Y T ȈZPV_Kh@.ob V{a:5P&Ղ;p ..4w-x)E~:%{NZjk 77\i;k#|V>h0~l:|q< F|r1MDa4y:ǣ|qi0%PPLltβ=4V,W݈atZ-*Sfƒ/m5 ՛TjZͫEu,x<ۣɳF~w<PVG4oOW҆6[6:޷)hڎeU/?꽦&͒rL6&ZKY5[Xq:zuS"\1nkp8$Ynp8%2o3]p$]AaJNrԤWA{E .0ʮY $/J62}؃$GJl&@LV*M 1x12%F~khS.!tsS0%bM 6u)%ca6CѶ1uHέI'-s(0Jq$ 1Ә=높:Eヵa(&->~Y.GJ;ˤJ6vDVb囇l6S8~ㆭ^ƲMnHBy~s06odWnpijԀBcb괇XimM/7nrdY75^]ϷDPu;|2Q%&KL-n ղae!^?~b)(RZ7" }± F8;6 >H&"(cR3;`cp$Ŏm@=`<[6f* %:{AC5(>j@I19GU[(rT)u)MShߖ!{>u c¾g)!pswhހ *KB*]@ d,/U 'b҂q/^1uc >_gʄeM :҃Vݰ0ym!vf2@Z:SgOZm;:4fZp]l֩ rZzc~.ˇuY!,sN*TTT>T|*3n3,i#:euoFDZ tx MLj`/f#F62jLvCn˰NvuѠb;JOloLSQ,+ْV.gB) b#h/mVpa귩E4ؚwj=q7˸µ2"Pnĸ4f7Tb\: ;5{ lL` γv'fj4h O³.,1-'{r|m?^T7 m9-1Y%luŹCq2]uI6 6{Fv*ACqĨq mZjbNAAA1B sgceZB-5!AQes'IadDf>@y*auĻ3 TOl)c9Rm{aw&n`'󟏷 C7g_&/l;UəP7j0C숓m#ww1a7 9ƩΩ;{v~˫q0G/7}iSk8%'Z9}:%#l%?lU2200Ny[U jVo%/9ahz0uWZ^IK|U{N {}EZX]bKm ` v;i=i`[D >Ͽ⠼OnQZH:QU1S]f.'d/Ɯ)Cz"?ex*j SϮpuXE>-d9.Frg4"Im -!+k %&p6YOĬ8qRR%c{|n-|6q41Ž6G7@%/g s<_vX_?+?J*GeTRʨ ʯ({G*y.T2ydP9=C4re?k܍5dendstream endobj 536 0 obj << /Type /ObjStm /Length 2910 /Filter /FlateDecode /N 87 /First 791 >> stream x[[s~GgƁ}3ؒĊ])ʹQĆ"TT~X4惽9߹- ((TBGƨQ 1"D '8AJ\xAӭZQQX+y_[4qXB F(M< e :  rH=HCj+ NA@C V _~A(WzuP;պ&,CSAr0!˻Ju 9X_^\|kY11\B2v).&QWT{HX\|׎T߽˫*o'x㛩2݊|z-fj1/BoYt kIño8ٗEhCq"`"=/u}>tNٖȤ2cOѨJz>{t'tn㭘F&+΂6V {9 ĥz%ڤ&8Pۘujߎ}뢼Z`d>~ȫq>/o1UYk:F1Z'F:I9NjJl5=LG. sД3L_k),e+3dߌ݊, QL&Y9N+F * @۳rZޖ+|Y>jUw T)dZ׈\ӓ dZՇP8( !劕;vs^L Po]u1ƪqMA@PR\bS~=-'f9;ċ~c.e:?P DӢji1)kWC%?<wJ%eti? :-f U_ym8)ts4:S2C<,>/޽,?CKZ(a+(fB$뒫|yKU. ɻ=k#v ^Hm7D&AǓ/wOc]C u7x~Lnۭ8B>< i)tªheu1 ^PsӉ+/F2SkM;{>T},&ҁ,T癗ym]ok  u"W| h.6"t|R]DT栊|\ͣ`BDiҽ+O/(Єd'52.!xP: @9$~3 #yiϏe\}9; (|_Bl*K\*RƧ&HA[4>1Z2<]2BX OKy }LCT NHDמ2~ȲZPH=eڡ5E3#њAϠ2xmeX36:PQD8+d{Q2MiO4?RQj}] \F1Z ݸ:RQ-A>?&e;8PC͍]y9XO#-G2.'KPZf:ǁP(cB[i;%.HD{`(TfJ |JZjVTq@l}r[=Ly`oQzzr+L(=-w3_Tpd) *D<ͼ;tL RKvƨPFįk<лqk< fQ@ƣpoO?\u(c=ucP҆p$CKR# 2N/AYiQ= ҁ_?p/TX~#OfS_lf4hѵoЎڮ=GW]-?KcNcT)į‚WVWZҔy~`y_(,|svsk4P:ߜ N=QA;&~ȈW+D0N\\G^Ĵ1udLgB1OΡ tD,u! mxSv}a4/3 /@~Oz0?&2o5w< )0QwbrVP'**ځSyobJgʺJ>Y]>{DֽPpKRZhNZ&s5M*WPEFOն/Uaךݵ 1joJG-ĸGZ0$R_BғGb_iԐ8!΀]bݿ$6>\.n}endstream endobj 624 0 obj << /Filter /FlateDecode /Length 5074 >> stream x[Mܸq0? ;~Σao 7'xfݱ/RIZקn֏a@P[Uۆ_/j]xutW6ku}* ל t6TV)˞7Ҫ{˾ϼi[ /_컱|:+ֳ7-/aֳ;=>a![Sy#i]þ?h 6}='l>ퟮh6vṃ>6q-t#gwcZBkcOFFQh9[-5UF\8ZZojvFA5cW]vZ0y>L$K+8tqi)\6Z9+7pq}O t8?p?izpaO4 oi?wKhr05LXPP1x@i< jLa/4|vlxnj[vx-L\8{/WpPẀ!6V^ǫ;7(ov`덳w}q>t+6G*!8E-@T>|eJP'Յ`3J&sn`XXt,`F&W9,!j}4r):eXSb4>e nKW#5I`4AL]qϊ;!Ӎk,x8} AH3+gv&ѡISkaǭ5j%Li@NJUA]7n ‚KĨo^ݺ3g1i#h>-z,dVAmrk< @"ԗr>VX5/Ǧ= B?i"K~"@:h.cpiZq1@D%ק1s|]H߄tђTmjP + vH.`(K6a-+==J2֛8Wɽ* # Fޜ">8I`\='B9YCsD;s P2|Aaɨ-ye9. XB(y1`c4?bJKkvIJ{J#1d}'D;%!>KMPȂk#"KfkhϢD㑲x6ӰHK#}^Pg->N+Uiq4NU(ס+x#~>(݀!B61wU`STx&;Uk>h)J$y:r|S{[o6eeϼZFeY0%2J8b|tI@ õA\mESl]3ߜ4d_`'q` D+Yŗs0 PI@´ 9y ECII0M&ה/i.'Gp G쎬{/ys'IRݐMEJ-pN!m?ܧRkm3=OǢYy*.)]k2r./ͻSYT"1n\}T%lt"ZJ遲֥w-%w?ryJyI1\XEX0K*zi%BiQI2'9=RNShvc85 ݽ2kn*,&x>z#yزowZ#rмֲW;ȋk l˩#Fxq|'[9Ю|n)cL^7ƦYb B5)ap2T9V 'jzB,4;{tOQhɍIo,(X1.|1E(NYYKMOts]5= 4!B- *Ο {A~,slHۼ _xWrBCY QUE3| .L$ԥ4z8u=U8$OWHABTCDߗK4z)mM:6 E[ Eli#RXxL}[)rg54E.7Q t=Y0J5E=>Yk^ sYjӚN@ϧ}! Xuץƪ.x#4XW"M1ϝT.b-S"65Q_Uku a|YK4 hXU/Sfé/ ~a*ޘ/l ^a) WVv$-aM4Ew-,?WmMJAGaBCr0 &y\~4&[Ƴdq 1fKJ+3q(L146:>.?Y_!F뽭/c\P  tE8g:-%$MdRM1d@ gwq^ 1Ns M6$.௡Ӥ_f$\JpP:.L$ u R7v\F&Q5}tUp2M. <,MZTX40RtF\<L,4䭙T[!hJn-˛J6d3|?\̃^S/ +pbn֖z'+H+a~.2t !t8 21gT G`ǵ"4R8bʔ[V"E0RX8cdߐ&f< ,Sh^P cݣC^GE. x=mЋUWDJqfB(^h h^qTV2!aPueegcLҦ^8x_-*OL:e,|\_1 g*ers^K/FkMbIA62.~t~WS0I*<3r.*ҞWFadU*nke9<^zvCB%C Ɓ%Zn"NB%ub#۲Wtx+pb#u;emcMs@ 4q& fPF$e)R 5?aMlraoi ["?PPH#㈺ZLM%ލpD<[ѬڔY3/[ R9ZU%NaJ+Cx:qtRRT)5!+EƵ0k*! JCgTIͱ [Y7~֗whㆱOb՗ ;됍X~jm.LюZ>$#*dSn;^mǝSkǥLcC5m//wm+30#&v?32Evk/~7ctϹPTu}T \oA(XV(.W čA%Ж =;k)9ϿH6Y i(6M#eYMiSN)½\z݆-B\Ԓ 4b:JߥY:6"--j.&~u`r (;+fg]WfP(7'hٖ9 ?s| ? N0Ҙe{^^* b?8)mMhN#yt_ fEAvs^Ks(!Jˣ[MyUh Z ˥导U$+$ oΕΖM|7endstream endobj 625 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8818 >> stream xzw\T2 j`]cFwĊH"0kf 콗1571}pg@cnL?Nk=yA@tي6~>N'quv N .XFgs܏|7nBfrrfSoz~=-'M0yXwsq˜\‚[:n\6n8U~av~ήNn~nk]7X.\lcmv?-Ynq -^4tYp.+wl[j}v[ϵ^v|֏lk0棱q'L;i򔩽?6g~2t^#g)jeM͠Sj 5Qpj-5FRQzj4G6R&j5L-S bj"D-&S˨)rj*ZIMVQө.CCu|ՓĘdJL$T_*2uGP)Nu,]]d/ɩ굠ӬN!Ba&&LL.LƥRuuov_aZѽ޻72s2-'MKrؾߙ6?/XXZ/̀ώbpY6^!Z,-_ <6h֠ 7d;C0lpv8pّG6hh඄ Z"hkJbVSibnrz$DR]ھFlpib韵V荁 :KDD'XuFI>zkeJp[=h- יNWUsq5W@@Pb- ]UY恽JWZ|z26p) %-TL-ZA~l;Gw1VAPj#lk' M 5`w}jv״- 4*]`3h-*]Clrrl) dmbX@p1y V]Lb?x:N 2 ȓP^IްE S!7)5I$PZ@LG: A;C3$>\|UK񌯱0yx=ܗm].idl77@$FOZ!ýMӰCJTI?Ģ^"ug aqo}rz UմE%R&UѮB yJPqw{XhuG$fgHB8l`~'Wwtj'Zl9M8oTg${:/a_jN ) 'a'섦Ɲse!{]Ʉ|G7~FP-%ףOP3*~dߠLZm <-d 6|(RĄbC\-=^u2./.?Ntk?峊+57rCiEZ+-]NG(DuگH_Cɣw|tvN,3jGd}xeyiIn!-nj?{ dx=&1W]f'R܀!z@RvD;V"qmY*ڎȔYld͍pcՄIJBA1%R!$q}U0o `$P!&F )PD#(E!(riQ\ Wfd!stKYV[*DPY2YL~"IJs5vg,Q:dp%[O6{zFuxYF~6 (']n5#6ݱŠDrIWtVYbGGUbbUɉ1ðJHB*<Ш64puZEB|3"CJ ఐhfΜ)gnNťc^ YQ&&XPNT$Ÿn>4M|"ʽNT@4PVUQR91{>/FWeEix[TU( ~٢UBk;/>ܙ8DbgBJ𲫳u8T)4RWT٠HFRuuBk~a0CA!,"kqKVE \l#Co>HP'PD"\=NɐhN)O)|$_1ro{% -.x/7[XaǿzH,G k" Y7nqqO"hO@ 4A|RÞړP; ;Ȫ"޳UDRJܙW`/kC\A\JNԻZ%|URp/p/Sժ743FJ&ҋeb%O)gtqW:2,^Of=LX.|gPHvI1㇐~EBHX,[,$8VF>UM!LJꊞI#M2S3Qw-Cdɓ"ѴqoQAþ ^3O옾)2tdrc!jm)ip]uYLo# 3boޯ͇|6&)"rS.^#+d\[ 8[_ECi Qw_ʆRY'fQY?j0p?e쁲2e1efha_i9l ۪pvbX^ ?nѢO\޹0^@]~9v.؆*v]XEH^)!ѯIY wWll,O-"m.HJ(fGnLAVqz`J*1~.Le|L|YQVc,CںJl9lѱ4ײD LU}֛~IL.2Rg.[b%Y-SǪX#Cˌ xXh4 uilߑP>\,%0;8;lvt W'J @;,>cAs4`*ΐ!d{WR>`~uimIӚlٻEü7f48 ZG3*pF^ :ޞ@[IdG!.#"6AH#.o][Ep^N}?\W-^їOl ;Y$jU5ĭq!P`F+ûEk%d=G6,84L'!Q!-Lˠt-0jIDH`i@<,Ӿ#&4~*P~L\vfa t`/kJW*xy[rEgWq" /׵hgizx2 AҼ/x-#F* {KB\U PF9K.ZF|PaDj1Tr3P 9R,kS9JKdRsܐ}[Tͅ<Ф\lKk?h~OG܃3^![ G&@gi%pKE֨bQ$%)\!q<0y7Ҹ{a"I"%)-H|=: !,e#๡- VrPG@@}~^ZV6jBRAs6V!; {AvW$Js&en8g͕`O^}s+V-**..)2 "cg7+(d}Vʳh M\2$r_ '$A徾AAA|uTi\YJ2QIJ!l<3.;/%+KˢJ9HnѵJu(㾐sD7$p'W[~Q0/yע M4gaG$|S63=GBbcl|`G ?\+'Qׯ3P W"GdXȎ4.JMk'*dY4` SLdx? FD D32n>? Oo8;4XD;◒f%ׯĞ? /-hZd{u9MɠRel8 }3gğ'g]bOA Gx@# )C]~qτ4GV\z5۽ɧGc=S^m(Uȕz`NLI^Uy2P JNxU by:Enu[xCVh޿7+j"ϬjO\?/ϐs iqJ>߶O=ʫㄦQ5u+EHu65Ɗ:8>ڨCWӆ} $i1E0"A]gfHwL6?yin25A&LʰMaK-DtxmMIgD,G:5ڴ6]8-nmL mn[H9CXRժw=<ĥҩWG![V\B/#o$/+nFM$+VbO5A]X6#ܠO͚ '~Om$g%H<,\as[N{ӫXyb;u2o=<,N&>Ie wXo!J|WG;Pܪy 4En6uI$ȣ5$WhJpܤb&P䉝d^IO 42j , 2N=G6LA)c^|(Rc\K#qHժMWgk2҉K*!w&bvmu@:/ѣ O.h v%`!ԯ=^OZpg˙_8ӂLPqgnG8fHKQmv518~^deeiR3XN۪Hh!~7z0̓!Ö梙rKOrm;Ov^ pH0T3kRW=DzqcR?%ԇUJQEkVD<7F_j@u Ŕ{+^<}b]oD^'H@ 72Bk4oz޹I*b'.) ¦qG˲IKѦ󣣛I= J_ozm̃X}.9rXˢxct XÉͤ`6Q##"" 9Yр̞_`qs+KJa˶hcBRu%f[֞zݶ&% zL[Go%n9|8Z H u`e2 4ގL?;R{ $~V] xϫmSowiFm6Ωd#0cqgb?`mqA!9E {&su~l7fD.W]L֮ڭ3tSk2Jhu7i4iZ65-[wic)@endstream endobj 626 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2663 >> stream xe Pg{nF{@<@<$ @ *(^BPkp7r*78#'j*k4k5Ig۠IVWuU^K(#J"L?zoHWg=0H7~R{j}V 305SS'|dUwSư1)"v+.rv˔;R.JIqʐPg.J$1tR ٳKK>lrC͆]WߟOE)V싋ٱ3,uE?Xe)j S(j%S%%(5l([ʎBMP&Td$h30a&tE6S-ʸ㮏qX <:$o'shRZyh8Bto~Qir܀ITp\a\S[PUʼnRl}IT \I ۤfo2Q$Gi|d+Z$3hpܓϞȇ諥ƽyh,DKB?Zۗ39XM&}Upq;Y:c0;dBNW]so.K^(_yՐ4KE3k'(.lhsoLʑttu08JQ4{ v'7tWPH0ݲe-ORI㡭%T*tF/fui`OAY|HecKvYSTM7dZ}>$8` 8PsDB'Cvmin`c5lq)u71 wx[_hD{GEM,~!89i"HLc­/f%a/kNa(ʬ*l)2X?TAU7lbvpQ>M{]W }AҐl 3y\4O>smbȇmH+sg۴S߇.>[Ⱦ3 Xp{b[9*)Oro^#uFΡ3Oٿw`}lhԎm 3XD[A3 =G*b&u[vE5Z,@ kSaSTCV6?#ݚ 8OIO̶aJֱ⽂Є! .9Lhb iGhXs&CT5?GEsˡM=,X%Zx v/U 7$GVХ;qpk]8p&+{a, udfβ{FMlQap\=6+nl+ؒy+N֐r2%qDo4&N; ۘ^ȼzjk8y;0eWQ+g&49kId2m -5QkIl'IE5,T@nLwM !1c8< 68tf8=uA51b5=IpXy5J}@?.Njݾ)hǑ GX1HPˠE~9U(EX ha, Q`Y)~xv7fbsls]׳hַT"lSрg KrW> stream x]RmLSg~oomZV X c3-("Jb66S2c#3G:+#N6NP67gso^weIΓ99@J"bʊ W89=7S* q:!P$'&''Ufk )hf(aț CIy[wm|Xf9.rvpɱZݶ9sXn+\*7p՜# ny*-#& #&-K.]+Rmv2(š4G ieHґaB"| EI!;$j*g8.>#0=x*F'ubW!BM'teIuQU/= t~bo 8nM՝]xgp]=#X7C#+'"*e9fYhU G^LRBF,6C+̢uW.6i3dKԋ).ژ$z ^_l/H|/XN~PkXJCҸ/!O%ۻhFLSC\%IG\rG0>B= &.kzJgښ~~`c2Sg:v&? E w䖗 ->XPyg%^>Z#xZ+=o*x/0@J zǴ FK- :iOn *胛;0ql9D Wi0£ik?b(H%3<:B-RKgѿRGi}zDVbL脙4(~Z hZaYzp&q$]xll8QPQ4{m)A9Us>CD iphMmIіct ߏ9mi?eoL4/&Yp|ٝ{Kk/:yT[VKN\͕͒ c@ToH087*N Id.?aVQIIlˈ\xy&aH>{Pˆ9*lXh]hEΊ9.~&`4@XR~& NSi=͢2?i{B&!JMA3B~Uh rJElendstream endobj 628 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7648 >> stream xz |Se Fs" "8"VIJviҤIMlM%ݛ.Peˎ(*.wtd~颌q?4<xQǛʖ qA,Z1%(6*3#lj+5F=FmR;ǩC҇n O}iZ&ϛ={ 匁GQ1c^y{ݚaf>;g/{|ܹ22Q_:鼳 "}5:-:DbP+U2|{cՑZN @kF#1Nh4m* zV0lB[u4ey9)ca#t0mpP Y q> [97Ly> -,PR l5HL 4]IqmA<ՉFC?N|2xTS D@z8.#D*9LEzĔ_8ebMZ̮§*]hD2kveaFϚ*CTte5=7%(M. &n`8!'5sk9J'zw?[/a/ 2*ZG+Ty?ڠE,4E 0Spm-"4Np`}, +|bl< bh1 fj@wJb'y0h5TxϙSַb!ι O}>$91>;:4yO5xCVsG]2RN'=uµRכ!] e^YֶR?`Sq^9AS)Aaxe@? u=!^&ŀunԗ3C»!,>}FD39A , +bP(Viʳ7Ъ!i&t/d ̖R kɪ >IC<4œaNro[zE۬n1Ax|fvK Npf'|W)If?W,d9چv(.xz=t@ gk q|tOc'rb|ϭk#WLz3 D6A#L39Im|<?.^WC @zc56#-@dW>";ޯ8Dcˏ{: պqAHgmD M 6n]V9ts_/70X4 D)@e?(rlOhmݸJ-%_OH@.ɫsRi˛%o9 7Ixr=T1#;Z?T&K\F%zc~ "4@$R'Ƈh>BgД7ܣ!|<ؖ`B]SuvyQ+ANY5eu]6OxYҠb=rE$tB̜0A7)C(-%!hb/lG1F$qr ˣ  jSnlb@7B%UPe"]ƪ URkeq ;s€~j$AK>BzHEIL4wzYG,`0Os";h+,r"t"re*}!(4>ۂ2pWѼb0BVe4xRAHC|(Xj1HD~-!'׉ak,MG'M2ҷ`/a#\j*ەeXB6VI_Z\/8T}U`BN#bC9^̾j=P`#ossĤ>_rӥɎWN!NQdW)Zf mTnw/k*S1T}xjH; YM?v&:8I_h鉅'k]V=Z| 2B-JBF@'ޛ!gR&.<-e9/5/HY,~H e;\9]ֶ~q- Q?}y U}]o {\v.#o}t*83Ogs/f%/!EPUj=ܺ:0+qDӁVkv4#43Bh'2z ι};ۥd$ٕ`NED5QMmr@. o8ܽ~dL3~]c_]D#@ߤm_vzgo{Uu궃UihO<|rT" IWUML~;r4 =ƻa;G!3OOz`6; oK[ jV~drT7< ~4/ ⪄VgKcءVrw܀+^hϵ*Mv.3ϵ۪A}-%6ZKɋC1?]!ȃ)iYr9c?Ez=9QcQf<f :\8|T˓Dٱ |.-v@#pz ׮؏>ޅx-,ch̓X7бlӎV;m^>5drp|T-K {H˚+gN;hQDkf]kyCG_xg?]'%M'^Nz)g'<& ֜ 7{Q;@k˱H<#=9kR-﻾ϖ\*z%5/{xQy<8@ʘz]O~O?wmT0%,|$L ؑw $@Ex,xLt<)*3>bwooo}Q{4yC7pm G;M葆>umO dG %UMz*Ga25*6&64YT8Pr?4ٔަsNyu2W2$s}߾DȨ[U NKʊ(9tL/!:!:˚%T2SOYC{oUA8XzL՝Q? ގDGD\dNj4k,Zv;S{H}O5OSH%> stream x[KsFk,SThjjʖ8Nd{dR7, RRɿw~,`7R--s3.v~w{q(&+q]{.RSvr+4&i,, :޽{5J)jigKִʒ5B솞ueM{o'ZA`U[W.{z5}MZRgYY+i/iRڲL0`\d9=x:4 8pK(W7M_Mvܰjdk?_4mpo- q1˭"ZwT}u\]F:A}=\e2Ad47OT2؃K˴*k|3xlФJr,o #AXZv9,/3󱮇:!LZBD!LfLK߄k&0{Re8}eUh橐ys7<3->mNbteQ&G锺~^añ`MOd@ZsAUHvXZW,;H8lOꦚ$۠`gJ삲j],`(~_9(4tʋa pZӉp=ul.a L, h@;.9m.ܘB;!֡^^kyY>p*Vdl8CR]ڂ434%Zdrs2\_H: D}nǑԐ&R@Sj&ڸD,aUMI0hJSa!]D;;fNKt%9^%<ͮ]MӢ1H>p\p0%Il_&@_ &pFeB{UNZ$}.ڛ-iuq&&M7)jxM#D cQuXg~dﮣ~(zo s@|(ڴܳTcC^$ ]5Hj裉ڣ<q@AN~zs @cYwc?֟S}9Fl(θ{}+t dys!BR.X;<-e%2 5"X|L[Z"o"iɷtPa'1#"̛{?dI &dCMJ)9%zfn"ϣiowF;M&Z^=nA \yl6Њ|>;C0֗)]>gw72d@0Z`?Uy,: Ҍ O;=<Sd4K2O}%~bl/ \ *A9dQI&&Hܹ'*I{Zu$4Gt]n]==b}ՉauLD\c] 6Aږ}^RHsN6HֵFNo2=ATrGY0ALOp4ZTcj$5{-⻻ #kڋgR‚s0(nꜘTa.Ş U.R_{+pT2%Ep<:@ d ce,C9@_ny@#{Dk`y)YՀ8pκe<WnlQS`;D I >K@ˏ}Jc(Pq͎+B"5".fL칇°-'J:h]m&lˎ *Dy!^{ _:ȁ!s =p𮃍yLB1 UHS, T'wgrQn'.bW-|bu.,2CQo oI8O7rRPo!960ΈsRmQN*S^0c1Q۩R\!>brӍNW_y;ǿ$Aq 6_,BܧIv*Mqnznke|`姶Y{y5hG 4(Δq±).s]DL*"0(:V6+EmI34# IXH{bNu_0ȇCxZpY@=dRV FvI*t@:6ӆ'y'>~)s<ݶ^m8fށW Fp]RXV[4`N9H;<g \%F%*EIW}~afQ\"6 fKw8qr9vmbAKc!ؿv-h'@>CEYr`8dd{yqJ:~Bw p<)4n&03!Ѝ>޿4PqBӅ90ݼ76|XP& Q#eE@.◗2׉,%fm?'c]֞,)a$HKʝDK tTE|ْA֥mIY[%AbfkeqJr45 :/[a 9efGI6ՌŚLmxZTrc>F*<߯o)R2Woz)\wjn]W4zu‘үRz^oaֈ&±k8m:MD/c,r{$z)*r2ȾkjQ7(|tuZ+HaqC) DGK-#0Ť)Rh 0t<:pK2-EL".!c!Ёy\'] P Ft ǃ'A0K_yն Ao]1~=gzHLp@і2Ep^nvO 4t*IqvKp!W"j݅cf?֣|j7 Y=DϬ$z&]d& =+@57Ţ$ȉlـTo*{I "|BtdiL=a.W2Ϭ(zWd0$yXc $74VAj+d,Isj&` 2:VĮQ$I~knB(fxXvS."\v!f7Uڤv[0/:Ta63?BUD&$U\ i&E-)_`MP>]tӘqҸq=vvUcW[IJ U>~v_`z/}8=諛seT$JKҽ39UȬ0)4BA V'gT6j3 T牱_ t?|*'n}ECLZ51]f=Op;j\/~0 ́T+%>AB"}]K?Vu|ޯ V#ſupcӊj`3:R4pF=cr+㿂eɸлR6z&gendstream endobj 630 0 obj << /Filter /FlateDecode /Length 6028 >> stream x\KFrd:hB=P@(iWaR)@RB=MuQTR=tY2~JuQݓ/O]|y›W^]\yŸV]4uSzS_\zs3mhkLY;h~ɋ4F7jӨ7KAF==޶mq{|MSt~)&]tcտVuziu' mc)~1n*[5Lyvr4I7̾upߡjwK;U8j4>`{ImhD{pv7Sot uqw`a(76_yxwk p9HH(Z}Y_HڌmTi닫o\bRе 5ln"7X)l&˶!6aawB;|XمօUq.S@ӗs3Ŝb&?g޴0!cW_ /TLF_ /:,~S_4U[ { Rc'wd*=ʦR$(\`MڭN:k؂i1 wId_.I ږ֛7q ,Ba"Ս=Mx_U-|o>;sjlUqݻdt?\pJqq+Sàq^F>8ޯ 8u"!ٜѦ;(liCYB'$snZc P_Px@-\*DET&!DVV?uv_?CTE9SPo!6u?ƼfVE%XF9ѯNȶGҜ SuN@X[ΉD!DDkfk{}rôj4,|[76\jˁ9G׺ҥSJ*]0 ZJYg9ysvqk0T5e<ʔ7_P՝##=|iJI\K{KrCZA|Oiڀw=:heKO2Z=!sxhP6yܕylat!cﺃЛ3jmQi16F*ܮ?˛3>:7XmK]gq " h́c}Ϡ-)R mjUۡ[)jgo#mʈ~'Z%4` vUb]9ikIW4Ci&Z |__:N f8૨" ߍ$1)X@$ bl~ѷl!{WpR9L B :.v]`#@ɠ* {RNHF,!*Lk fj*(u_4 q&_5;"۬i QˑYbO pVCs  #ĸ/JGp*>RIgzQ9Sv Kz-{vH=K|aٷ]k;yQʇX)J'@ol&-Qߥ)m‚%XBGVy)SLYvd^#]nCO(yIU(-O|0DE ;_'`.A7*CB5Du򌂧*UK8/}x{dʾ9`1}|m?*wc2gzGCA0 !ˈF{,YGrMw ̳lՎ_O3%`^SB HPR:ptnn1#:1vI#@Q9m X{aM늛Z ,*4\UǠu_Ƿ /K|$=`>+6ҿW4`/VcwFg_.9))Yt2SBNS"mgl^Hy\]Uqkjkr&#aҨlF $W5WAsq8pa]=c6sdyns #.jA=B_•$b,O`>06-P E ۑ4flQ,~)ɳtzN2A8t"1qz~HZըµ?\/ִkhkE` ATcK-U=mU6jEߍp)?\Oe=N{V|QrBD)VL*Ls;RJ'T P}oI~^CDSTWd#T :n+ c-̟JyPFs]E&A⥉R? .҉}D lTܷ54"mM!yM?NM( vBS,P b i:l?dn2!JϹ'Q~:'NXS5>0.K@Uj@ȸ7 K;dc>3zs<2Nlcب)0T1jS&/F "XUX" ;R4祽:T2ɭ([3}>SGᬌp9l35# )nDcĝà'6G׊g4]ئZTt2,\'g2th.տ"dZnYvIZFZqDF ZΝ4DNuSRE~Zp$)|GM~,~⟒kcBe4j)|: V_,,̉KFLA˰Ѐg.8*܌Uduǁ)Dw{,RMGܩHTҧQ+< mp^~o+L!?YXG6 !'@%^i\cP9ZD'ftXbsxctKͼh$c(#?B3L&28sզ&v褫90SXp(gU vV;[x:YwP<3HB*ռNf8m?pf 8e<ů,rǜ |zE|B:[3my6Q>Dy*D}XXsf|+?`F7l2%19=qĴ%OǭV$+ CK-5 Z~od.-YVqpGQ)A ZRgRp1YK>XGO!|c7< ?:hf7u+:J~.j֦luMgr~+ &}MqL64ZVq"|=L>~㿴nȕaD~ 5As21B*)+oL"HɛL'EO:#,6;:9ZǨ]PM?d'Й0\gWd nT-ݖvJbxX9B`z56s ?j7k{v'0}]﮸u)]OyU$fzX?TX c.6΄D\$tT{)ENEr?xbJt\p%~Kw͹OGG"t`<^^hWMT-[grSh xcSe~Na=8bON7j&ے#馋-\~L3Ko3Cg,@]c1uȐʛH\+(t; gORg]BSj^[7 1aqx|3%7unxa 6?}44ş7JiW_O :f_ Gզ=GS<F+_,g/xqq~2)gɺk/ sT.\4Z3MzCz;"d""*.?D|ԬuJHPqߖ-I;kW.s=(J\9=NVZ{-PX󠵤vk kŤD;pbVԏ|1BSc{W\D~cV)CVg.!8/"_.endstream endobj 631 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3224 >> stream xWiXTWEQ+ 6OiLG5FMDD;.qA^,ZRh!Kp)Vq_b!&t&&Jtt&m9r9%I41Sq{#(HƘXErN1 "j!Wo$3+< BxɡaTN"krTY##͟Od)* ɩ{sۛ%KImXqlS~%#Kg&+e鲭ص1u1Y*EQ?Y[PYX&ߜ%&kb[h'肧11n⽐!ikhWxcȗ+QћZׅ}`>AՔcw$ęt w'y~VS|՚x>U%!xV$&A 5gc5 {OnD\K\eL.wXdd`P{HH=64mC x* ,*SX:2M (meHq9 9;! RS=sp$WRZ93"haht8 +R{g$he pl4$lmBA oIhv*-7 XL\m)qC wt:EahΨqt(փdpv6[-"dSH Sڴz+#zlsC1y`ipD&nx3ER@.=g.>4rػG!4zb5x?G|J.z'T4MZ{XE}^&&ι׎Àb^T:vuzWfs0PR׫+u=GR$fR?}ԭ`ɩ+Y y1 &`6rYHf\}gMm`1kF(~TECxys$tzHkIʭGCgˡgiRE,MH,%7(hYy/- f]n*Nяze-hk/ $aQ%[ RyatMd(y//(DGS#GMJ ? cpv[a-4f _b)LՅҠשsۀ: `x8il )U[ad+5oGmBCCfߏb/jw'F$;kIiޅvsէ9}{w7enz]vsqV{0w\rvEV"MnXkX/ڮIdX/ G 3TCk6x.IYY SVqzǍOP]XDB_bVTBk'a!"e^6K3I{ *ڈtsCŁv8 M&Nv 3 gOcb}o05x&6qm3FK@j21QԨ_Ftݖ&{GqS!}el7-o v"~]dnQ\?+B/\w>G6"s^#`5 :TCcW9vu}(!xF^v!͑ g›Ш)/ jkQ?G>n(NJQ;zj Sxt,:4ZU~$nM<[F_8ˈ2V5W%'AI]]_\k16~}[-wkB|rp(nSp,3CPG7hS=W6x~"iyTr<%Im,n+V= ~~Oq(N!ð g=H&%x&wF['`c_)@ija焯êlȂ\}.ϕ s'6m$b5{P4q>C;,D`%hI[KeFaM$],CLSINY?GZ?YL6ڻ6(b-̐O)K.4e(C5O}-!F yY28@b}"K$i]El1ŔOdHBۦ|}!ok Z4V@8}hGO}c;`3# V{u#Pϵuiª]%[RۼOnt3{cn ?5 ?]<*^Yz%'S! ^ o:.ߴ}Fk2ިPBA$[Xӌr7 8=8pĐ 2l-sz-$fQcZ[H(ECTendstream endobj 632 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6883 >> stream xYXΎJ`%@EAP 6-P+V,K4qWcLb&7Mrݥlsw93|+~gu(}]JGGg:;;tn!>Uu1‡z)8\8CjŇ~Cz@ [ 2ttݥ+ၞfsgϞ7s&y]l'jRYn}ffEO)R?=n}I9m1srXe`~F¾1EQ,XI_*:huPa{օ﵋طm<=|6:O>}Ι\?=g ~hb ,Yl E6PFʜ@m&R$ʁL9RS('j*F9S[(+jZAͤQ+YvjeMͦVSs5\ʆGRj>SXj e@ Qè5IR,JIQeLPz)5Qc)AF3J u]toY]7OEt0/v3ƉDFs3°9%k6DbCi<*@T5?ʏO-WI`4jn[ `\. bA=ΦBɂP0 6w>z1K%D)= HrM5'/.'Xá\x=*{ZI`]~ρc=6Ӹ #iw5v^|5Lmf!8E~*t(^'Fz)x$f[0$,,-~y杻7lgs}^ց0Lᡄ9u` XysXWmRW3D:jk"6P ХjE򁰖pMT8V!PU5d, B/Kj1`ߺ_i^gEdF6# UWPoxr\b2ҢvVmA mb[;i Ղ8P)&O*DXR9knw wJ=M5voE =lW-x~'f ]VD dpI4l=}5=, Ap>[D$cmW};j·MDWO`O?qf7@j{oӊ'(ŋ-moxu[e6]@\8`GxGY ^0K_!_wP\a%9WϘ֖) 2"2#ZzA.ybZH? ^ѯ|GhٿkG\rEJabT⧉#Q`s~YF{~1doj)B!QҬB\ T#fPC<,/zBgvQsJO~'9-y2zy@$\]n?wFPäf6eYFlߢs':ĭ41<{ :A?ȧ+;Vα;3Q{tYƯZoK@iǑG)~,+t`ت' 4.ăDcQ 1~]YI%E@ o}8)o`#L4p 5WV|^N4D9yj#s)2&v Fa|ǫ"qwvpVQdreW(gd0ts;PQP;*ˮ})JwGaxN Ä29“r8qO5YVG֕6gp@FFUfIF1G?.T<|+ΰ֟ޕrc-|jΦDJ ΰ.(aݞßu a`+ `+^aknޟcN'WW'V΂D߳P*B&~Ȱ~iQ /Y@=ގ0f-8Sq=%u AG䇒"d\RtK,\q&Rᣫ?C|G1uG.b37+LaxsWNCތZ!dS(UUUpySkq{_)3(-7.$ުasThv~< C\v̎>\얓PXQɁ%YAnE&'VM"C]:J8F@zLru@21܄ꪌ,Tnr8q5핐 㛸#T"LP¾$ OH KB8K8tu%jzx2}2γxO@g^s+aW%]H?S:HW%p< aP|;XW9| C+cbBy(:\y ]F]Vk-EO_XXK IbgzpIrɲ͓TOk P$aZ< K̥k-k8ƺ4`Bs8 o Nދ6ﲞ΍'7A):X^|_nxj^ kWS#(!W0Ԇ8nKɱHʝgXܫ4gu_SQCPg Zk|kwkimi]312P)aq%5egdd @̫{wyvj?T]T]_Xڢ<^$N\؛9WNpPK\-vMlqdE~kkW_!Dh b"ŭ(SAb Q2ɧKQe>8pbɊs//i:CLq|iz 1<%gf%犼9Hw)<.Nl嚪W5EoASoc9Gb_ ;7ɐjneQE %'7KH!E/~r1 핊cO?9^oFR&6Eȷһܷ)0b>ik្m.fs+.v:q{?4oרּY{ɸ>ՍiwZerV#vxP#i JCBҚuM[%JFtxLyK++w3w`pL\.+02ִy ܞ6"zK9mMb[ڔlK۲rSWWxv|X䖴sG}7a>U8 Wx Z .! F̤Qr w!dFeDyLSpyhpH/ CxN0ȗW䟞iP^ɅVM?B@;t:x*l i="UcUuȷirZ}aHs~QL@%Ē zj7f f&oiV[x޿ sY{o?G_Յ=4udIx,* +`뾂u*ݞgDը_Eo[K%0Rۧ &쮶^ٍiuD)/p+CI#D`,TZgb' QBZ߹sL3s}DrQ^ʃB4 M\[2 lG3jK"l9,׃?=70,0Q9gjѮiDt)qOҍ-=76œTH[H#W&^r̴Mӄ nO}SFWPw 5H l@yEC9mw*n>UpM`6߳ BL`,!01'EX/ 9y?Qq (Iȕ]` 3 h&/:';_v*"K(."qni@8l:OTEv!w=7Dx a^|{ !s];v_Od`$Ij6 - dC{%{Z+ɍ;́MRCm"/

>!)MT' h [2o6 0X'qͦӦ+sK,[{˫T $fq--wTDιFyii)Q1,Nlk6wX7{3|NNi(?l"$E!k·~%tJN0q|4J#5╟ADޚQV-HC ,E :ϕN%?-pM Á=$j hWQpkEvNXUSVtRyyB|-vw/@O#@ `1a;+ID$z^7uv•7Oè,6'$gUʛ;/M#abV8-.k } WYJ5 BW\oQb8:/2gw:h gZ凭4/ @._ й:1[.Awxb#ćR˶BA ֍uE\-AF],QP.`.{jf@LSP,=e碫ˀzfT_ðOmGF}OytѮIkc}ma7/|[r.-,*!)U"X!UFGKa^TiRV/7>): dA"> stream x[Ms8=4:m"TI#`KZw[[wֽAKUE IHU%=dd˗a/~=]^, Ë~(d. ]dVË;fV̖Rj,%/M63Qfl.% 3]JԬqW{eMЛ9ӑZ~V3}rx ^?Z7d^{5*ޫEfl:`]~0WΥJcw\6noL}O[V%mei`={E7®ԊpF&g_՛ђ_VyWWmYW~@Szscru0|#?$qs&3Ɣ~ֻfiedm12 Apf64їO,S5jb g5G9vr)8 n uon" h~W>6,.A @,o ЄBq?8+|[Œ55 `]¤+ e@7@Q;[P e3/T HtgOuYHF18dIm"2V:X7xIPxVk.$ {xdww޽cM=ʵ /\OGV/Us;"XOIvryX/ @i]!wY);⑎az^wS"btALY^V}}D=EQg\:M$j;tȼ>W[Y^69X\q@,j'BKqn;bꈋ`Ytn Ҽ4x[RYo}mOb4Q>>,afUwR_BdzxP?ߟ}Tm 65OĤ3Fo1];4N"г՜KgUPQGCBA^4:*r* >`t :&"|HA> chW%SINU (<(RTo!U8շr–šV0]6UUs?C+DmO,_ġ;u6yy%F{IAvuOS*PٸgyKZ LZ{}퐀 h0&z !}Ģ؆IK̅R"5A'{|?'` g0p-C 8T0,mS {Zǥ isE'- 1fxCqiR< vt}YRO׍^/=[聙Ri5!Yj}FuI"_ ِɑkuՇ#~8-1:wR.jOH!*¦躺3 2ѥ;󐔟zy$gl!"]\/FyBlUa 3Xw큃/}0YP7.EK((dA߀uDo>$/<_`c>׉igWȥ4q ;P>@~4MRXhn7`# =h(t2U_W@rW|~jn۠J P^zYtEom1}D0\,|t]D% Fr˿"E+P@R[T6J]~rsKgQl/"pN1OC0 R }>up׻\\`h,ӔT OXy&0X%•Yt|bq%tn9U|]t? oZrK*o2ϩr)T˰?` I2 8pĀr02#kEh?"Xq-3*&va— R. <+Zd{्ְL;!6r>8~Co]/VS ,3cxO*P]M> y]D0 97ibV炬>n)dV}W1KL b[Zrk !'/mzF"в(LЄm'{W4ic29'X@ 9RU|B|> stream x[MoFҾ= ^ JVUdP;8oUuL7 @!zG%^-ʣۃpz{\-_\8o߅ ^GVۢry yDQ9)YˢԎ;j&\QnY߬fs)rdQRv6\Yv=~b%qXUd4}k%Wf{iv|{5*ݫ,Ea* >`J.=+ŏR| {ni Xo2wŞgٳ:LXIuo]bYZ8U)>"+^3zVZܱG߯hd])؟Yp7aZfN -*#73rNva&+K6PM)`0X.27H͒N2;ecO9W9V0mYn&\Hvx&%l0?MCX`un~c̻Y}.f\:؟=XڃPx{=o׫zg#/fB|NgFb8F&KTni@f}5QWt0cPh!K&FD O+(x},EB9aЈw  9bx~tP ʲ$(VGr#KfGynV.B,^MHDkCp:M'&|,K9_Y"Ġ14g UAٜ JMHiFO@Ëƿ/AK$W/0yMgn zAl)>m_SCg'CUHfJyh+hs! NHXvn ܏i@ۏHB k4 ;ovкmn2_ #_y5|6V lNDfkOI1p zI#8)x8|["$s*[hC}z9}Bb'rN$V2ISr:t&5@/vT4 D/apY⊀Gի91fbo=ʸl q *,Z^2y$:X4TDBz:<V`+TV$ lgLo{?!*If)>em>4أ4>0PeYy% ~RDYAb@T ؉ )pL~Zz]/& kq;(jYw "(֝gw融ՌBs9.G'p :SxA<ŠB@-0gv F'3JxQ!6%cهrB!P`["Ɇ䥟fɏ]_ĕ8׋\Sɀ5a4={dvHk6N? H7 Ԁuþb=.ٱZF2"#'8M7ednBNd-wILY |Vz~̂`5֓=)KST*|y^UbB>l3(˭-v]5^c&'6Vig=PhtCw8b}RPgE`OܾD=Ŀ񨁵\!HAn'*8rIý:⿌ט lgY CJ!3kCkzjQ xd}0WcqGhTUa-R("_\ԃcϪ"6HO!fsҥK`/^r5Up#cCdی[7 /.)7M.Ơ*N2KeoS ![o)i@Gyac'0(.͍'Fn 䮾*jW*˂2?}Mmc++ ư5!]oӀ)7اB(Yef&AkdtU&c$xzG& T#7I ?IOe?ѮWKϛ{o^iqp"bpQV*ϲ 5Ɖ=慔ӛehA <[Ip gyZmaN d~f</.j3ZhGj+^;; N:A| z4ǁq.65z{ 44H$!-%2?򝁔6cfmm x,ܛ`L?^Ŵ'MXB t᭄כ,GUl1#Lϯ*-EUK9T'C\OؿF}2txyj|VR'EJ ytVgԌ3h9{C1PbVo= ,&T9[\BS›E oifyR+;&k $l7l++XЃÏo!E2~[Iy|SH'e;8Jb' 2Njf7]H# UGmC9,k2/_d 7i ^t#gtE ^l udF^jAuQgX{\S1m/;'x41%ٯ=d&8x J W;iu.E` at꾎 3 + ᆘ{Սb.JCkbK|:~ȅ`NN7g\<!gn3)T̻jvMzl;f<S7ewn(3xxKc.3oq5a jݯۯQǯe Dy4_A!Pr;|㽏r{$7;Th8Q[7G9a$9Z3 )CɑvOU7}!^, yfָ1K~v0[)g!y!4ɖCҕR=x}!a} r%n/@.+2SC)m9T=sQmbE[B᭥ nA(u u ng[@ăNBؤ_P*s#%Rn W*IEknP4%; NשQCD$]驦w44#& ]B'a;ڴEֹ޽g~>?V79rbnQAØea|N#PaY.Q ۻۋ>>w_/lW;mukRGqMendstream endobj 635 0 obj << /Filter /FlateDecode /Length 3765 >> stream x[Ks6=薃N)L"RYv8om=Ld, n3ÕTm 7nY'[[?'׻ώgF•o*|JWzz)39 [( ǧ[w゚LOʢԲcMe5*-=kenU6}NUm=|s"ib~eY/'9~6iTG6 𽓥 h5^$uEV*0هЪeY}0/'I-اfm\N?N,TVd].<g V`4rpJRrT %$'4r+VT}ZjJXY;DjsNA48I `EXxֆ )XPcPG|8wMpGvΰ {>i8d0hf= m'dPxEնoiXVQj?9INBE%t큠нyqOce$#Ц,ј#`.bEǓ¦4FH9\4g]c[T?lD6Pը )7!vhBBt_O%'&/>zy"gi|){Kn~V=x>|R>عmʷT=$(i='ζܣHGIڈ*PmF-J{}i1i@s3QU/7*rr/k ըlUm0>Xtur7F@Ro@y-[J(m(Wˠ A\G]ETўaF "P2_t7]>]ߕXoE< cŸIDY9ooM9<, HځVSH+T@K9CFw%V~4φ!85":ޞ9-g Zsàd/` [/g۩jƥ}T!+1}?Le)[Bl*d&)D `OAE>ǶeGsD@Z WK?ȅzYR  ~[~QZEճmnĦ9;Qy6e|r +O@缽jB+6<UEnn[ @g|.)3&+gq}{IU֐LBuby6drGp@Iq?@(͎ZViS(<0f~Af" ãI^,Gt(ǡ\Ej0X--( זcq%afbŊ/ZX)vDU!>xS>JXlP{)v (/N>?[, }7~l6+/Lp&V"c@  G`3R5za?_oUxfkD*UYL`.b6De7mIW4ϫq<9y8Wt`2c:.D%QРՀP2Λڸ00-عi>j~WJ`{5&@|CD5}8$-FJ>il*5M *kf*t/Sߐ$zJ%ͻE5aPCgy޶OKS5hSBdF9}}Lwhiax|CĻiӐ?}hE284zʒ*w}D&穕F`KtNHL^{b*#8W(dPxArU dc6F@֪P2x<Fd! D;@C,?NR@F*ؽ\ڏԈ,avOLAz,k#Ë,ݣLE~ #4l>qHbJ?-ݻ2f 7vw%s"rwj'?ԲhXၜ9 2Xr,:`V 튎B9oVHxxNpJyUY^l9!%rs4Ok.*]]Bi9toXJf{AD#W4wץTdvmȮwȨ?!kX#̧^i }ڰ;LHإ,F4RHFoMK~·ljbz8Fgоu+@> stream x[Ksܺk,Lvܒx7xB}Nq"$oե6g# p8oy!G _eK^ѿ8=.~0 UYOG ?vj[TR_Rؙ+py}O/S)EQ9>-ʢb]eQUHbw+o_heuۥԖm!qh\[iT%~hƲJ g׶BXb {6`wIml"&yZriv28@|$ mwƱM*Хj ?+MiuK):-u渧$6 mFsF{R9[M\55Fs?RSCI)\Ҥ\EuQbݦ+G1Q8e a~a}l:meU%/_]?Zm3lTuLwpf tzZv EkqU!EԲրYy>[H+ ޶j>F!u-G-B?hRGA/WT\#!'D6]<oNhB<|Le|?K89!eA)W>qb\-,cYNr[N]~Cl'D{9>GmzTn` ʸ Obh8lcT' {f|°#Ú}1~u "g80 N {\'2PdmSXI6MJEHČ>Cc}ɏ X> 9eR0*Op\3Q3tm qUQ͞uRS/ w}@9 '=t6MچJni -x[VY>1a BcS&5STr uߐ\O{#@FЗ3AcPI(t<M.Am=5>-y郜ʱ'O'J縗<ڣa501 +&0o_>aq ߅R܄ 40=(\ZjRo^ >)9"5l, ["}hSIj7paqŠԄ+y̪Xc~C86іHuY!y( E'yFy͐D{C|k H%wo2_.,j=}]RsˆlQWe!M}B@EhŸO+|6Sƍ'`qCԑu84W'q"LQORM8c*B6y! f,ČXmV}8? ϠYťR{:( ,_!壓ZfS2gHH`o\SŀօlT;i@f]XN7#hwJVwj3f`֗6hڟgwMn0ID/ȸoT"󐫀3|`49P _>unt= YC:Nt}2jG~7bމ,Ѱ${5?6$E7[b%.Y Cu gy Kq[% G =⛮m^E^*N(=~`4:$Z0#^|J:Ebg [pq OCu~ %3%蔈[ {u?zȰ]c-%{^oYS.T<KݬF|!.+ 5|mȧ.+OW/k~Rip4Oi}PݻױiO^ ʺ~<<'x8՗M0T.|.AwT 9Nd @ssaܹǟ|voA}) OTDsIf*eAAT-^YGr&I$t6lWTe9*k\ 1]W~P d<@M e9_CCQ+#s ӂA-փ7| {k1*!0 ]Uw'FR3ifnFݕNt^ezf]sXZlX{AUy1 hKKNJO#m7<">"<\(#t2XT9xdQIKi^Tcfl5,:=W~}o_ 7OvhJ=ox$p\qH+>՛ DőHereSy̜4&S޳*Ai$߭iֺۻ,jZ0w*bס/@ፒjÀ6zȓ#!κ]Pr܍#pɞw3X M)mhٷ+ qY+ j c DyߩwfXD1 ;q9ޯ9p^n{P-KBl5x2d$tWvG|*gwB(cbq.N'2DMl &gVD3_Ғ|T4S> stream xV{PSw5>Q.Dqv]VvN[E@ B($ 7&!@y<$ѫvZ[QVgnvlv-ιϙ׺;?rgr;;Wx1 bMiKmH؝7Y~DYޅdȧ#,w2MaN:V(v rvѾxҠ z6@jvM|b.OLҮYH^Goi2 ɩSm!6k6m¢__7e͋OHLJNؔ;#a"ff lem*&Ÿ́0LYʬa™La|T|\/c8a2V 2n82TyDym"YQHPj *о'dg"ﴡVIxc*L+LJسR 崥ugv7 Sp4SH2Fw(k"H 1}rˑGKO>@@,g:N$h9P[q[yJwl(gA?,:1Cc Nv\$!wF ks/%ĀW= <~DpJ!K>*[:azSY5|=d%u`Jl#W(1ySdq~#{&}愣yxZ2nU6c`} ~[9k(PՓHtƺ\s7̭*V4CXZ?S k {KMlg2â}g GOO %eE \| *sŞP[+4jhjB$4udayCpr&)*6+,ܛ X*z8 9~Y7ngn^y?Kܫ+ \w]z2&fO1*~eadO'kA5)y˟xP_8!h:}8w]iJX {iʕ 4[s*3r@qVc*K\J\iRB|c {x=Uv4bv6A+[EňcDOAYH_wC jLEėnvHcɀ kF(/Ԭ /a){R>̖/r? .mEw9p2ԧ~~R# uGJQp\))/ TBsYu5FV7~"]@ԕEKLqG z['yn[Mu'\w!̵ r?\Kn֯Ayk:) պнC3:\ ~AבKDI7:0h-hH(J:jf4Űr?T[ߛ9D]`2 { S mMV}lW!gexCoO*lJts@P`44o) ǫC)AEPv%~CJ N}nV RcqaZVRY ٬3ԐB!+B._-y~O,8Z'3D$&tD < 0XԔhߙ%i7콎{')Ernvɪ_׃9 |(}`)7_Ԭ[pZ͐Vц8(9KGwe W~(W ռۊ'"Q%l"fy~D-dOL%Yd֙` uY͋HɄuq} ?*p_y3(w;Rsqvb6ɠr".y~-x| +|-NQĝD'jZ(7qM/~$LR> stream xcd`ab`dd N+64O,,M f!CgO/VY~'ټhvQnnC}O=J1<=9(3=DXWHZ*$U*8)x%&ggg*$(x)34R3sBR#B]܃C5Н3000103012_*ÂO|qwaW[ߙV޽4w~+wsne׋!۹Y}} 5.v*T];G҅?|_8{! 'r\,!!<<܇zl^}?20 }endstream endobj 639 0 obj << /Filter /FlateDecode /Length 6330 >> stream x\KFrɾ#PO쓖Z(jR7j4_G CgcN/].;\tw_(zz\WO' /\E]j53g\f\|h^_v^~(M*kWXBپzWlw[)Ӽ{+C=5iD7{k 76۩(m>W=Eczqm6 &5[ LNLjquˠ_8Naf}yWާRy=~[5 j Km7o lycNv25㴚(C3u yWi0^WOT;tDBuȊ<4[^kj7.z]$w-4uk r=g>Քk!k}yیquYU6uP}Zq1(CpsYßۢzYϛ샰LoRy^8f+ hs0Zutts ؓ0|щJk?tǏYqTqQ|kkblyrz#iP]>%AvUN7P`[-fmQ`lΐea ( %{q[<ͯEku/kھur->a!Mo3BM,HkxݭLMRJ/ΗR}pa^>љ,N A%$sħ薟ÁLD+ זּ?VV!eG_&Dam{QOzVѠr맺4Mg`gdJMLo#U͑~N[bxPN^ЂD'bXa 2 \Phɾ%{~o3]?PSC\q? ,x O,o fbMg/S8E%Kdʣ踎vhebGl k}:؉Sd@Z;@q-$hK%qO o uj2oHƻV=kzvu^McB# Qk/ؓ6iu AXP"$oV\wZ̺XL嶉!Hؖj|jFG4U shâThai^8`/zYNDc5p$AC h?[3sQ8Ev'%֡p3ZWpj=ہ*! u}MRG[vV1wT׵ڟѮ%c'm~߿ ;l^ql춿ٷYb>hNc"2!l!b|{HCmYq'NҰ dUŒR@ua? "z3d|"% @sT~Bj::5t)Nl-~f1n=GOV';9TrWȸUA4!w6yj߉Hp`#_}FVl+7S1LZׂ݃'$(T'KViQՄ?9.IKIT$8bLXfr>mZ6ɩMG+"}%&jlj r>}Kk[T}5#A_$Ǒ:Sm ~$^۪sD@&k8y׆=xy2 Hڤ^^"-p&^7d4:l=oŽp^'8XA:4O;M H2, Uޙ&P^&NS:퉊^Y;j1EN Kɶ?FCk<_a&Apq3_d޼mAQ"F _qw|}fb:ڽٿŢ4g y}x;\or_ OxRz6-zc*rh-mIl`ӽF.26S|́`] ckL.ەQkgXTlJXk)?*0f, 9f6q+ܨ%baD@6aUS-Ozl?9Ư2&B6qNe_Xs.ZH>()Q|v*S/IR]Hxm ^\.ƴBVu(6fqI@֫߮uL 1… Ljs`#3w8AphE; ΊnJ-֩Ӻ5H4Ê a|m7E?V7UM >fniؑ5 ?+~'PvWl{$*ff8`wK]t)7b> ~*iΜ+s%&:[M)yyOiŜk\-j}akjThx|Hq[+zRxtڕRZdW sW˗P2K@d9a y9pic~[P~oVݸbSP*d⽨+hIupDJU,.̭yTIJI̥ND}#X-+i4eW%2lu.RۗSW " "b1b nUo $_ 2+돓:4"\!gRS8tbt(E]f$RgUSb%S}YϲNs>x4W惣b1Q׷P s4 ۇ+0cs|_#ҝnMJVltD; 6 ~XL"֘t4gV[Ӯ=5R"\R6b}\D?77S'YXc1r&AS'8#-$FՇO(P}UDyIVCIJ2`?{焿 7dmrOGn[dfKˤa5ofnF1vCԤ1եxn3 wk_+ I-B}@i/ıۍBN1aم;IP )e--,-u%yψ^;QO2d$9<U3ۂEBo24hZ T~M: )9g,!N9!,7!P*nPEP[t>/@Eз'8)wOu|=S>as:3?*g!7/%d*ڔI~L&@;ap-B#yW'V'&X"h35A-!OdMDHvr a>wĸXA[EȦ)a\sd4۵|$@C)|(P6ֳ^%nQTI|Bn軂Ԓt: yöͽ%bn1e^Y ~cJoVt3j|W+_ ]vW.ՉoA h>3]7D>'E0ngt&W:"cE] 2[:bc,1°YݼyMWfiL63B1o_OChO:]z֏^],޺XiVElt3hJ6Խ7nRVU^{ F(BQc_KN|iΐ>K,dbGzѕn)Ls7с-xÎͩ&A]`/ˀ WoE<[ZQʵȤoL̑<~R+Z)^mo!U*K\9p9.OXK *Fٴ? sb)tv~hXj0z'}4H* 7I ZnsTAU{N *dOasl0[-6hfԀkB,JfJq1-{߽nFm[}4G.Up|P ;4t7?46;Rc,'/M_qʫw |Nd<˩}>Hj>!nendstream endobj 640 0 obj << /Filter /FlateDecode /Length 3744 >> stream xZK)<&$@ Eٕh$w٩&:hُz~UտnRl*:^TW^݄^^GalFl.o.W6l.E֖U4_/~*N)Y6)nUYDU4ŏAh'~Fu1gwomߵ߮26٢=< ݰ@\JNȪmvʔHr@d?5%%׵Q;m,&a4ő-_'N۝JH Ӧ*]{wW[ +^) ' :7M0}Dn$]b Ԣ5[O&iV%V-KD"D'&nieEJk+Ϻ O`YP&zT& hPm@F7rs~vFal10Żnu&n+T _  4Ntq\yiƏEuB=7buM%py/:F,I]+mPtPb?4~cؽLT;t#]ԳU$eFRi/-i J Tݙ v7\ ߢP:yEXww'k"FJZPU +4L[dn`zX3y~r;f-٣Q p \Kƣ YvFL)^" ћ^~%;Y.N7 j闐 2%ol8%2D}-tVCfZ rJv=[(x? lQD!8 Hz{蓼LS#m jv8D휍*[4|Ӿ Š *5 {nZ3 X TՏZZC9,t̓U[Rq+,Ūj g^V8jp*$DZnoxM/*z{?icuqR4/bɎo_Dւ o-P9D6|ze,`\qH9 ήcޤy=ʿ`xF&z*i5!u0E8OIEe+B<ه&t)]*tFVKAUDp^Rv>ޫCC@S|K9@2dLB&.c򎖸.lΣA!7/B0(D -vR>R#$Vj%}B,|1$kyfaյ''kIp&^F݉0>t/{/ω. +Cw?:++Lv?=_ɟ.DU_̂7-?׼t/DSʩa$PN ƌىܪE![b鮮p8G!.+KX 3Un;3~hF: "}>g~yc2DRF(E؄= d0@68[,–gO È/ `07Pd,f$K{i* I,>=QpFJ!d@@f1| iCp Q 65'yaP6|* b{T:p:DaSǞSqgNqqwWwkn /J^6NI%/]+*y2!Zy]*W;\8N=C N@gIab;vs=SpN4@|a=^]S t]m$H20Cø"r< ЩЙ%VJׄw 7keESRȲB@얲|۳ƺe=e t*Y2q(o7>IsfK#Sc%f+T 05<3vI+U=R+DZ% iw| o9\W:>j>ȓAz0?x( `1mw c%'>#۽ʔ iF"|,X)}_ӮFǓ}:,CmhM:ݯu4FT\ lXt| fJVT>XŞmάuD~W Q`/gV7Z3^0E8hdAC倯oޘ{XzkyER(uX{)nc+]o{8,-l^ ЋKTIxm*Ù=>;'L 9?ZY龠~ e9K7fNsK'[ˮ\@@O`sUpq8^W#aU:5uéBbˢVH6w؃R fn~UZYQ3t#Κ)S%.UPK2b_W7:p ]acS tϚPٌDo+VlAz |3>]ݔ03! 6FUyY]?L܇Me)7%>bLP\\H$+` dt]Z,y+# j{F ӇI5Gs B z3ǛeJ>{%#2ZkM5t:> ղέSĴn(|jq:a 8ųu6v9+$-{+|× JbKɞ/Hz<>]AraO=uq;k֡9.X ߩFf.62$kq/^/RBus !L-$6q껁0X8ש~"r%ORXi-gM3taTP~ %~ٟg,NkU+endstream endobj 641 0 obj << /Filter /FlateDecode /Length 3634 >> stream xZ[o~KR`⇱۷BV(KIPP R$ `*JDZh P $,YƓ9 n0OSB/)ְ~ߍy(uA׹&hNO7 ,f 6. `M#Ok 5D;h$$FT[ڎ`AoyLSv]RF~2XQ56-\ 4_kԯ; !Pj4-i!8K!~ȕK"v&°V)Sq0g~xUCu7̃8o1΃|\,H#Cf,0@=6!q<{dɄY!hC+QU)‡=<{Ch,q\SXPۓ|8jٴǍ`HE.P1T U-hr, l_a5ž yzʖ5||xR5iL/bO_ڔFTkׁ?ӻFx /M#W KpkG/l⽞Ĩd]0*K * 3nCˍov~ى`@Ӗ1ohKfþbA45u"Gɓ +IزO85yN۹31!,9 Q10IZ)]H[3$G:JgadO~jB݇%ufsʈ8}Cݗsjɮq+nυ1Л ATBJ9EMXn | @8Џ ]cӤiP-[_ y;oeCj ?tIoф]Ѵ:KMAoه۶^:3Q\/iN_a+I @Bj0Ce$|Fjg7HO(A%(Y8LKA߸sc1 w0iP1/UXng:kFo\Pr)]쯏` e.B` ~J8 B4T9N$D_vIʲwJ=FV(#cޞBZT^xIUXS2M70NV(  5UCX#oC W]?c^bAG$ddMˣJ-0&c30F+0GpY6 d$;.blWJ]']Gﰗ$G.ټ3a(ibм 9DghRqY -ps᱐A6Ii.3Zлs/]a℻vFgcP=p$I,vnф n36lSy6Kb6d"Y*=jBZL'U6~x};x܉occ8 U'IJ@|7 LG`Q` 9ǝ7@G,Rد,SGU*ɰQ'9.B-,TM:[Swl!=Czngǁh%DWqNpėNi4KN=,BՋꄦKBEw T:V=5bi_^EeOʏy1TTw]> stream xMe9r2^ʘ1DP22QdiYDguW'Qf~}YMjp|9 |8a/oyg߽? y ? =<G*߽{TNy~o_}R|~x8JF;]*VRw(xO~|wO}ǗRv|B7#w=8[~nb!>a+ˈƖ7j؎|ht~m⌡Z>6<ߐz4uV]#;>)IYjsc4Yz߾Wo_.?nt׶AkV"m/v?́Gs6?ݑ{[$X޾ٓ:;8'.x )߾՜t_9,nsh䟼-N{wзڟ悞dL&!faqe!}}MQym&lJ'm߹.&r ?]7x,coDLK{OHZ9`=anb*^[OÆfO~{~''>>њOXEğ]!1>=Q|'+XN"IxLcY[(b{iĵ.# |p|zFx4Gŷ vو ư!R_ۄ-^6ӗymܾ-}cr'<>7c>L5 =N4 35 (y4~reuϥ}YR(}xjs@ld9k?ƺG~hGI'%9~BG* Qp5*?_N z>LLdrdo_> -5V*O֌kqVoӶ$^+sWb{ġ){M{~A۵>+@_oC#$<۲MqrsVçhdP8>S/j]*}^dB:fӕ{;sl/qHI/}P>`rn~f6Ye;9k:Axj?r^ gbuڔʟ.?x7h=D._^ÄO{Iu/=1)O}6*=ؘemP6VoګX|_C)S&c5,y/Rz^ndg¦Aie3ycp$+r׮~W~.,ko1_ѧwnoMOgg摍N*ϊ`-#|UDE g*~e^we"OoV)Jd~M/{wa) :O>*xef|^pb.bS jIUJuF눚60qO 9K7Ɣ#2 jFv\,n+⃄#%agH#WlVDrG*$ C5e.~e#(se#zf#, '|m!)V5CRB/Xi ՠC~?>K06Oĝ˅19$sh緰xaqE8a{/;H{?Y>ǘc(J*4cH;2Ezi+w~gEr9eQ"~y>}>Ov2ϩo: VWQ?̳⛬} nٝL;za˸S Ȭ3?f(hhkh O_hq^b16yÓ:IZc4\x|O~5<{_+CAȪdfZ ,Wei ` oNfGkwhQO]t}@퇏t&u?d۽3$fNYvv` ,_%o_Mjaz/{u$?퟿&$ĵ63AWi-EvǹDeY{i%+ 꽪'ݠ0 5+l' Ke9:=]٘ ٙ QNB#ھrwƍ)]=knCk؎rF9C<^ѹc?./B>NZҾ3 c鎝n&1koH'Ƿ6~|jS;7o~}|]۽bsy~ ,cS`ۚ^is"J#6Ŀ%?bY?`6kA~<;hG@_-'ѵ;n:i}3Uo_>~ jRe\HC9N9ñ= E\5^/2e/[W7/;Sd+ァT^k(?w6ɯEy up6>-߫å;S0l(bXX)6n3eivs'~ˎ\ǟ{.-X/т߫VJWGY+ӽ|"f_ޟ"~Ӆr4SowF?]jL_޽wik. 8+),+wg(-K͵7Sg\VG`m)?^OO?m%;r|^^kﶦ*qGU|͈R}e- `,ozj`ہO_-856-j^JE,MH~ ??xׂBj,DOvsik:pSR&Ai6zgB"z}(UQML$cUQ:ccfp|X6pgWWu9|3p/7ΘQf9ak>w>a2k-S 7/<}be_:pfRR9$;'{\7˪o10B1d@=<||Mz챇ӛ0gM \^vH,%ѱg jQk?_`GuAؘuT/Dª9k޿M܈JW M!Z= /nꏱo5r~,aea_8$1k`!*S`\.6bS›AFWe҇Nx+g*b õ웉FFisM4 g-X*c̝2%z?1rЬ-Ȥc. u*lEf࿋Buj;!_S 'Mb28hm&p@Aı( ca2Xċ c:@ Iϯ`ǎϬ1 2|*d9q ͡-2V,c1O=lB!"Y;=V|"cp6}!"V \b/h8W$KjС |nÆaц8A;' j HŪ!*k?R,+M sѮטۆ@E HF|[,\ ^It NCۦ/;9xX5df'lM[ jBo^c) ^pry<sh Z!U'~s+Zٺ;,y!UTaE5 ⾰)Dն}]dTy uq9+R)r7b}B&o3ݢRjas`69m5̬O 64*P=`2i'[U?ԍ ["ȴ.7Qcϰ0xMd+`:bjHGp M!^A f:F!G.WY:Q+[ 7 ^fB)dQF `QTx 1\I)5~D%!߶1uGx_AiED57 ^fgAhLh]fYvP52- ~hFpTx1ˌuРgjSxrrV&l_a26kˤ7՟&DrBcѴ(TtX1 STVLѷIҀ8a *KР^5jGp2mn5$dPB - q*nX * IMFmL [ ,k@p_/'qPݛm< -#f;pH:'kϯP'ee( ˣCB^'ʾBVcJ9Ut?ʼnBU9`YTx .(t1i$%I`>K6 ][za2 2X܄_exR5B|~1,;/dP1VYU'#2@L8,o k/&6ź,bOT3Lq4^f RU$AIR (xпA'!lV_vȠ7КxfTYD*wO$Y"alAe9kcją IOJ鐹^"hGǾ)F oEuD<{=(q:>MWN^s4i(ɮYfjXt0xMHhHDI `7~S-N\E֯z.o5z,{VcQ},tj_Y6a0oe'GjHGpeCʚVAkp2Q\w¶MONl5t S_ QȻP bğl9H,kĶ՘)ar8dC=J9`YF[ 1\N(? $wcBk/G^ϳ "W\] ͼlҚeV2 ee\78BXiMܐvalG吐KSt!I4CWH,Ge6/UΰZ`q,.,*ʾVIt O`Ɖ6`E0_P0x4-AËcql49^c- ~QQڰ 6OBb9KyD\m=W2 P ?[XS @!d*'w1eHvJfqJj,ɽ58/ mAL3o eo^ét ~os҄wH\m[eVYk+ʍ **`Dd&Xb^Ét ^dv[0/;Tqd%]ධ՘ka8  mJ,+%SX Ys %Pf2e+k7 ^fRWIrqbRX|Qét ~H,}gt6Da`vTӯ*cHֽj glB|׌lap砷qEWp2uY&@on2u#e hxʚ0xM%К&ߜ&T &^Ét ^_Z׻t1Nbauo&Xi6al@#!A/SX~$A5N~"ڜt<* Je M*UA^dBօԱZ`Q<*S}X.*=wYV^~3`te75Ѭ]lU>d3oRg_Eun"sgWNHD6jZ@ֽւbxžӵ [;ZwZ?4NNm2ž4DEHec<ۻ8 %;J7ب7˷YJL 0 Ndq~UhЎT%KW%.:,_ء~ p4@;+ WJa4;V%\*gmi)zPm (y$0I >l"5h̓Φ!s 893!!!sBQAq=]8!DAC9܌Jd0tp t Y):XՈNtLj! !`LbxՔQ:BiCg XH$ҩ 97 \g A`A0E EIgDOA"!jHD0< 82Hf6 -[ C\/[,HZD ˡ4C ZԮw)-gek $1 7m ȇOTC? BNK1󇉜#SFזCQv%B"߈AH@F+ "1Sۂk!dMT6$1<7>%@h..l+!8'$`J6   \E382e3zD3sbbI"414dUz85fxD㩝;4%Y;lٮhya0su4)~a$چeOjێro@f@,07W[2OtM̔|& iOr}ڂ( U/A*:tdz_|Y^pJF*4J9rwuĶK $[3sV!kێ{V(^W:/"hA|CG#J4tNOhˉms(YNT,\Mb]&E9wCݙ,wXfT8Mbdc0oKc1CbDMMƋcYB{s\yG ɪY*0KGbuWf& U]:QB8 c0No"uL7A B A,S < Uar'!c \ bUVfs   S%ҍA# }uzF  Aђ7ASD3Fa&r1! r^AK&zUjX`8O{fk'7+@e9cV 0A,!.옕 CtdH\GbD.~IEV[ɵ'2ܳdB!n.hl|AӇA OPMeg[ɓ"9!0 ZX%n*̢kn@Hyv#6RM⁖E]a?CI4pqZ򻙠U} w$2=lz$fGԢ# qYSMw_Upr,9"/E 7MYyfK0]@ʾ\8̺UeQYK2:T@Xsҽҝ%$–En J<6d I?2yK ʌV|evGBFw>&gl1uEϗ&JW~i# jJ\7˹o bC聩 i@#dFȭ:L=tIܨ\%E$2Jb|SR fFRaeS@44A~uY8Vu|ɦ˾:ƭ]f6[ظ8eҮ2V :eeɦ2G=KU D_rvڈ%뮋} UR%!'8! y|TI: "IȨ ;ecHEA(<Pr<ݐ¡3!D]M =;RnJ,LH$] +́13HV1t;)SaxqÖ`֬@.{3Gto[8ySU1P.kbզJ (S.8 "M(.$Aɏ Dtd)0 s?\M`|1 1Ȑ ?*\KOm#@l o D,Lw( D.̌$ƹ73s"ɉV| EXdY sFR10B#uR #,I w!RsA'E/&AjGt*$Sd$:x.\]쁒1.9<;qE`RT;: GDUgXxDd9Y'/1-6 ExҙyA1 Of1wA+I։قƜKg2 6֮ r#'BP-];iN#=n: e A_ +ÆٮMm5,ZlV`O S5Jpg-e&FtC[n4Eoe6I&='ߜ$xE0\;6y-G@8XYXV j/ GB88$h=g,k=Xd虹xlp~AW=AEّumj!|`Ոqy mՔ&T~f5Dp Ι%d̙CrWI31`~2FYa2B։eke©NcCGQwB"Ю iF/Ubjscďa`퉠ౡ@kD'^ t.[!Os@Ux!U%`1ZdV2=qlrOy%-& H\``k=c ҵpeFA}+@Gp39p"`Z D}XxC5xB(-%3b+8H2UD۪PMN-/'૳y'^ét ~p"HpȖ9ss LHXLc26A~.?2@uAۢż9Ժ~w+83ˣإƁYe0{2d^b;FDʁNHM\V[(Փ.hw1vʮiQ k*Vo K[VۋWV)9/ |!HpPRXhN~;6"= *!+mJ0@Gʪ܉` t, 6åm F"¢Qz!QLcJ@iOfHKVM 4n؛ t--6Ԃ$apõX_n:/dŨzHBճ;_C2]\ ~>h)ȅa`h};X2-F 7OEjK-HQ8RL2FH! .x8DDCM PDx 'RЩ̠3d< 0B M'1pqFj( ]|FqM,%6S3X>! z& SQ5T[vl .*&XCDx 1\{ը=f7x8$A\&;$-!]TC/@B柇CvT޿9,7uµ?R@X4 >gO!OZ6 o]2ā?װ N W7I8-3' ^c-yuLkQRSnpX4 C yل"@,n!=vk$xii&nD;jزa2𓷈2Phx$NP: M )5rۇHA+ASt7bc& BeH [͉ # le\DGphGzΗ k n`-SHUU}Tf@o!(QZ`%Ӹ& '~ӗ I:qRn* ̀ :TzVé~˦E6\z[Ͱ&|зYal_;Ž!C8`Y5NcC6vv*l >F@(:l,(#jd(^Td ,@\y4ky,QVIt Nhp8k\ί<3A,3DX *r$na ^lE+2w'?vbAs&dž e+A<t5UİlCg!Bl6mM3w'?vBgD!In:7pXy cr\f)0s8/EXd2^a7y%8ld9gYRLΪvbXe)#hErU? e̪c!*k?dsP1A AbNbex2uaG2tUQ5JpǒXp1Wtj&eqȡ2,ų{@hM_.u>v S.]X1Tb2 W VJH U/2jޑk:ŭ6Tg]1Uc- wXZ| -[X׸nMO9rhc0xt: S<8}Np*õ:4dٶ$8yY}ՈZB"[A->?Hy6n{Vhbb"El p1cRLc|jXJ@/1>>6?E!4ʽoat`*fwX".|W2"S*u * ~B`lCYD"raBfF"<=sRZU gBoUƪ TC ^s:!f˗5QI~wk']Fݿ/S0˼TkLlE98W"9#IF\U Q.=71m%+~3 CzHC,KMaayð|ᐹaE+-ITraC'w:$wArcPg+"B-^O* ,A,YÉl[,7D Y"K(K"Xѓ.AAa9UfcmA Cݩ %k״p*õDp2@n"J/Ha`qOad*-HzR ﺰw "գjc3樏FZVf:ZU`\6Tro!"wUR"THZ'|delL3 [('䬕`h9![-Q{~AZw=oz}%h~^Gw ^`ˢW_fwXn$2Vd7&}4_ײKfR0Vx9 {-⬵>bǻifQCi-25#Rq̓/ل/>呎dWa@_/?d~/wo[zuYz~EKgQa5\/8HG\\'CidZ֪ 5 ME t0myH_jZT k)JAm !Bs$7[+!`O`#}zP Y)"'@;'9U1w r,9A' 䯀1 +RRq6 &J@ 5ZtɢYk& 0G|M13!RAq^Q r®Ll}jTct_GQTw~r0J3!̬fѵ_- *LO8!̋?Df61_%xet=ɒr!τ >8~ueN*Vfm~+:λR%Kkb/x$R[@{b~ 9(N< ᛠQ6-TN/{BUiT-pwn]PΔhv4^+Zc̼kv1`4嫚$-,Rڱ˕˨7@{ٌlUMH{ԝ0D k4w!qn"v /d6K&6/)D4-R;C`ۖ{[]M(3ї" H;3)vPiTT*`pW 0dRuS(>U^4|UEjT&`[Ser3ٙ>qBtG֮;3l)D^s${j(r4Ҫ#TXU`8PHbU<J't W]<!H ZH-!clT 7{( XpVVmCu\x#;H)^k)\!~(ׂ؅vz̘.4ceԽ_v]]nLv14Qq6^_t<ݥ]&95` [ڰx agZ?>k^$=4V.d0_"(`/st>:L &7mTCaGa @>q"KU-fX,~*23eȺCbm[[I}|n0ԉ`ɰSu]-{&<-VaO^E,lZK`o@*u\ǡ.<zҧ?=1ɜ}69Ҳ[N4 1 (/2zjKFP",^]j@TpYJNʮ,Z"4TXh+j m5ؗxˑ='=V,8,Q dԃ+6ԉ̍ _m& )Xrzs͠ftMKuRa^&+/A3wۍA^R!{HvG$WISAHNogB`*ylDC+SdsЋYg Y--+Bءׅ (f0`Rw|',2ME4pv[@i؁Oڶuy,eaczlRp40)|#|nE"mO)148TWF>&$TgT#UbZrŒM!dw;BR3u ֛A}~%BfXlzs]մZ7YI]LsBL/e.ߩA&)Q2bEǼ4Ἶl%5ʫG_1-v? f]YJ8ukTbDba[#4[j0PeTc$LS@eK<)±Pr&7}"#5W麍A*o i$"ӽS-*x"R`(9.[Hj۷œKmx;SiU "@nK { gSuNKrNeg}Ahx[6(wD?d- NL+5)DWjuU&?\*L+1;?!Lwc셵-%3`1`;YLp;ڕ// ɹ`c}'M= H7:(sZZULe ?sv|/q Ώ؉ʉS7CIrk{[FDޔPCJL7-ʁ 7V^Z U[3pEƅ+`2+$:+YxƣNH]K(%FjKf>?B.CbP]٭kU ثL^u]CsH=yO$ cWiۋbVšqݳ1GQʲBH `^ƝʐUqۗ܈')AU#/e7Ae8c=avƴsWFS|ءxں΋!_ \4;mZ<`Q=y4KAٴJvI '5QY_uRDn:̀[3_ /3 B]"=O5.P1j~${غrl3 _DzA=϶N!9T `Ki\-97[^uy2%|ԬT\;x}F/KcGa\pNj%+y+-Dȟ%SywiWZP$u L a!Z8pz^L^ ^"Ғ%cOɅW,C+AK  СC6k"3'CCoBEv ¬(4qM'2(3SG[ 4s 8#'Rn#X#9/E 㴎Cd?,rU)x!lGwFgL֖t$J!"7vF7'ᱧƈ4NұY}*Uщն[uA[Zih YCq<@2A`42dyS>rdR)!0b2,,#yP;uGTĎ"@S4X@s$-SUm([#Gl0+.E<5L *c2"z-&ŒqI@`XUX!a{U  RWHBK{ӎgmew6. hݽE⡟ 7@8۪xOAF|+,uxgyuEdfʛ1xy-R&I;;F\t|~v1D/~A|;w[<ޙ (++Og֟cnXtAf _|o-6}wtQo؄n*σձoS}Vk';~6Oo{rOBnÏ[wVa*{g}_޾`FvdޫBH/Ec ;e??e.~S.`g~ژ OĎXov۱<}yB̾ /|ҳ/s"3>2S1>?} soN|Y:>ja_=> stream xXXT׶>0sPB<3ػX5(QAi:3k+M2( Ds${hL1W_&FM޽{$&w |Seb$ɠ+ׄj¦N4?gC }Scf'VnoȒe}Q xb~꘺tᙑ \Z~A-܀*gfa;fј݁X!H\eFc'4C#5:\t+~"%Kך#Mv(E ā;nX~{X-X07PУ@쇹MI>vSUz,;.zK 2VӴLZIҀXR<2̜1p*mb(=`;ʛ'4( ?N-eQ1k|.Uڕq4Þ$d2(Oe0b@s9@8uҭGM=YhL·"X0 2/+4o'|t=um:Rf,1ѳ8VߪmuuyaB#!tzA}[V&i&Xr'iY1~< d?wQw),"ZO9*-U@7^{Ff)6T(Yi ypW@V+r yMM /.b?G7+kMip]g0]%z柡@NeQ:wH lVʾ䬴(HHt|x-vQ t ,NZ N4y`RmT Y9e8 9foٝ/),wԊLvu4;ܜ+ɰWXa0?CIlgjk*Sv j(jʭ,Fo!RWbLkA%yP$뱟bG>7ܰ7/bT#N'3;Ej7: dN9cX k5 ԟJPq75u{hљbsPR,Ө+$ꡃz*rA&\N -Ua%;l 40--/-/9uN{j.Z@YDxoJ wzo%g-ku@2~*8JLuM8YN2-p pv%WvJO2 9FC}4sАMm{&@v%p(fRh#h[OLRv,BUp t@ ttzeff4wT4?u9"j(XwSp Nm@.z_4"v>1@6!9vq$d*s4RWGdbT˫g=2: X~OT NS뻬 k0C- MbRqnyKq$vʱ^rʓ N #גVywm([9iftT|8(})P(ZسOeW@H|-un4GO'*2Wܩr1zԚ]ِLMlV6S-ob`xJL;%@S7b%ހ+Ul-=Quf]A\lp1*PoĊ)  T 9UJ6 á2ACYcIVSqB:|dg}ob4ZHۭLH"-AGJ|W\56RjZ={XȫQp‰') rcXESyJ3<|Zo[5ǰ.CiW>P`p4$QdC?  ]_ .0V;m9Юh/Yw[}|(|z1ǰ1$A{I_- ]t;Q7ɳg(7?/ z]')yp[U6:2=;z](KLR 3K2[/<&z=:: ,˟~)$STq ^mFvV#j ?lpg$1b8RQߨQS-3־(5P+.> ʯb7?Fܹ% |,t-nP&6S13?q-|o5%(JK/Kb:tB +6 cf'_f% QjKXr+{[վ|lƅwP:~]ɤUL)ƌGMyԢ_Ҕ8}j^H;$&Cꕔi7 cB&ux{4.Y)tO|%le2KzKQʈ@.o{ ǷtJ(NV 6a9̚n̺+iG%pl7'{MK.<үdA/%aop6!-cBoAXbϴ^hsG B’%YKu4cY7W%d}YKk 0g.-(gohu|J EW(bi+y,I /q$p!r 5bNf&o>gy3mf\jFo h)Xfedi1~,*(̿f?X]:3%#-z jZ\c 3_Q [RT WG~nn dK6):;/[жh6kG']W s^(CX2b! 2qUbu-e, 7ʻ#ġf^QTF(եdio EP-|W(:(KEM @ Vm^G !bY۩ t̷,??6__b1_eώ9 nך{,ρlT/ vX޴8xa_s'NY_ #׳)8^BHRBDp<:,Ww? !딚6f@2@9wк{59%_{bhW妐G[?/m D|rHnAIzmm?_e2 ylm[O3fm0̿[ Ǖendstream endobj 644 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3152 >> stream xVyTTgeQ=EyE^4v (!θ(Eh aAub_\ >ǤU8Nw̘h2.6N#{^f~{QN(L>tnwtɁ7'FgOEL& {0 /p.rpqm4d[SW35.^/}FY MR5iq^1Y@ONM4i"ƒ7knz;",k( ]zfVvN>:f}lh܆M})jFm©TJmVR(j5@S5Z*DPQoPj7+D9Qmv0mrOyN&Kt01gdb{u~9gߌ\]?UMy o0$}BȜ3HB1ͨȆB`Z٨`hRW5\:Z *R-m| 6[`5D|%@? 7Xj9z)SPĹA\*ypr]ijA ZZ\ axx.p~axq8 i)`d7-PdsLHyE77Sl,%8EFIKO28 .VhVhƊV#YeÂ`0s4kh0B5"[G㱅˽/}Zw #Vy<ionZ fU҆uMyaџe>э|׆yZZ>F_db8W)0iLH=fik7*ʋԯ܅hQ\hn$N '7d4VPXs};C`̛KoB sϒgBiv(*/YBA%)q76ﮜ=tL#ȢX8!ˌst)*r$n>x!{K]';h/F}**r1K mEb*hE⾋xWF n(c=;֪xy҇).jsa $i!9i1٣8 }z*iōɞT.4S nَdG):z69~9#td.lt}I4+%o//Lޕ EJ[ɑ`YMM bY7q\^/*$Cث% "2@@$Ă?$YXZHgmA3ΒA8]y`%u+ R;GGL {p惖 !~=f=D|^_L4dR8~tjݾ!JDŽ\=ϋM8˛K?HkL> >&s%]ErhS Ɯ\(Q4], ΀.)r+K̙0C+33=yW쭮׮j&,'oo#*0ÐJmR3#5cC:I˜ȡKdߛdyFHc[NՉ1$f'"U ֽwp .IoMCmݣx{@*ؿ-=ͱ N"7\qƴC{E&a' -n24B.&qO~^#.TfU/w[ trjU+A\f?Gwb4D-yPVPQڰ17VB p%5ZZ8]Qe`4./u9mWsmK:g sOl:3ӭH]C8OPH:jы1Q{<a NR*dOdhsw8֍Y;8o5+{s'hqeK -C_Me#uSCݟjťĕ³ht %@vZ8ӊK'ZG=z#r#ron%KRY8ShL9'Ñwt*w[cթɸ*Iaٛl?c'c7po9_lͿB7oK*jT75V2+ʠqS[Yq[{oZR`lI{5='dMq<ʂxȈ#TjԀTv8c!kb!KM効O޿s3ۡuL;> stream xUT PSW{A"z"ӥn` F@eyRB4ɟ7R_ CbmUw:vN;'; sfΙs9òu듋 1lQʳ 0{yqfn :MÊ3X65pOye|Qq;GG/Vҭ5f ukG6\݂BݶM9iwSV'7ݭ3l6(0& ŧ'mOJ٤e2˙yLgf)u0Ә`X'cfQ6MW$(N()˔\;g_(r2%yN<3T{Hg{} y£jg!$A :N#5Z4P*z[*JKQC8\-U`:EK҂q<+0*|[U '.j2pD$K2{M'O)T$Be Cm>Eg3S[G=1p<[c174R~^"Swx]t Pp䗊`?J~ 'e/q0Dc& 6j(IZI$R$3q8\+}v|HM[d~~j@EyCRua'Y]bnw u]Z|{CMG얎ڑs5~HYz%E\fJFXDGa7XhZmM.WCxZ@_63@u_b%Њ5R*+px*ù |OtE/߿h^L8_WsR=2'WG6l $fÑ^ yO/I ik[5y%)# ܀pF&Cc-}_p:pB>wԏh!VbuNXŠ'"ުIn쀔oG9lm aԞyt;b}Pҍ2pBNjs21#E=L~33 L;%ߖXO䋺C5JɛK 0Aj υVN\|_iT\Yf-礏ZX@(=*nnVY|?aYHc(+I>QVգũ|ENjŒNz+&Anu64 oq7ֺZS?ltŢendstream endobj 646 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7320 >> stream xy \ f2LԽnZkKTEE ٔ%a ,}U֥nڧqmmUivwDB_fϝ;s={{n}(a˼"#Vn ~uڔU;cBF w^>H[syTHS.` Fs]zѪծKVXLA< _{EF-^!o}'v۲^;޹2hU]>!kB^vq)S:}Fk3g5g11FQ+975ZIVQՔ5ZCL&R:ʝLަPTʏZDB-QKWtʃAyRQP3e,ʋZN ^Ss`ʉrRK=OSbjBI(G/%DEj$՟$#C:qs1񳾻EI/˜r|6dКAמ[4x`JC~o=_,=lȰ .7u钃/ xSX]g ?9#Q8܋#^Ԏ7ukK_jhi_<滱`¿$whB+C+qV.Wic r.}"3!p NѠIO֤'ijRcQ;OEG9hC%ڰj(@-hs4.l6 Vcua bcc$YE%?7$Ka]pL,ZRw:" Dh]h[u hғ`HY܎lMzY+,Mk#冼_ {OlC\DQ)EtQתDa*Ixƕ?cC0]:famZ-3UQ V$@O+D`h-׊XU4q}jq+7 |&Pf?q93KʼnSނ`͢E_U'= /SZVՑ7bSs(AEQG<+jL%Ԡ5MsGfg$4@++ Uh$/6ԄAS4j]Go-_X X_Þa:Ǒ]@sigU[&B9_܎PC5BafPӟ)fVM5 n?݊l=j r$a;5)a"9c*^:vO|BVEՄNkD,o> Y%=牂Dnm rC3ɲ|Dh$,cnX?"ƪ#QYG, dJƗ kb֮abdrk"e8VSŰOvцn,WC1kX)0jղ9s`^)}nBJN7 xb57uˈ 4N~#B.z.ZP/+~db'1؅nA"NGTkui1- iCؘ ̓]^5f_~$ fGu+R˅Ca,XfjXk_{䶍rS=#`GMsR]T*X,U%Zh4T\Zj j9,cOz|F|#ter* 4 z[?;hv&8Cq4Vj&pˮi%bK@&r0Cqfi{;Os3 zaEqm$<ߌbcCڸJDՠ5hokEg`*#ސ\>Z) k, x`g, x,A i&JY ͯN'^&A z[}.,֗*`hexwJ4rDhvƳi)Ӊ<QV "ٲmX0 +“̂6[MpOva)yC|qڽYC"DYD ;yJJ+dHq4~H=KG2 Lr-GSTv7_hit3$ܝ8X~j|05>@UOS`s¤7{I IRuX0"q#]1es)z~{: {T?;Z_<ozo^o,~` . Ė4#7 i"o#KEJ%q»lz cx|\AC`GyAB^U//Lukhrk* fK +L:ͷJ5ǗB>81k w߆gv _!`@3[AeTP./c!]VPMלݖYUY@8/an}$U.VQehdXВ ɒxc.:M5L߱R^bz|~kx.GגzՅ:Dft,2϶v щ.)͸uK:ѩ wF<Ӻ9̰5ZrG~6fЕHDX͕tfjQ0H~MD\=vzF D@3PVi8jm{6qM2xg^[7e "'2viLS&e@WaA"-VAA5 ?YOL:y$-/7t z+a[-r3HG+OrCEdȡfy{Ͳ6[PA=,G|>Ewɺh=oP12Tl*.9T2mEiCHM BIDTQ (Лms5vr=O n^֍8PRb֭VEx|%ͦ2D}H3^ 1 _Ѹ2WL=YQt({Çw#/@ˠd)^ kda*>/k>w!rsw&4L>n`CC ۭ[}Êuau)qy9`&k^Bu4kqTOXGKO "4(vǃivlΑ[vdwB9l[fA:Ӌ&pw? #xۛF7e"4F k}OPuDAbZ'ǝGo9}y>sكZ߷ٕVYIUk@ 2|Ҏ.ԦpcQ*0THuV"VJP_ [TPheXW]zVK1}5ӽ i{ +չP50v$/# !grBz Z6Xe<%e/-jj-/6u(շMHٍG9RG/Y@(3/ϙ3`,Ӥا$)n]t*Rafq8("wE)'&$bA ,mt.~3NSOKV-LGM:՚qL/O?Ι`]!ںjv(bcp"e!r TGY9ڪԽyZ~u 977m%E(Ũ.Rzj C[eX~MB#hG~fB:gr‡kC Au [P?UUUu35V5lEΞ>Rv @[3k⧞nϻhɔxu@HdW@(Hr"aL}fVfpaȤlF4DƧ'=4ѠDRVtO'Ro_2뉴Ko0dwc3IIle=暣{=L-ε&k; _r.I7>Z4 vCMh$wxjӌ6{] 4qQZrOvNKX5.}UQ+"6iNIQCHIHwVwI[suZX}3]}MC+C9v#<ˑY.1S}Hˉa%)h%tQ!ݠC4{/!p;@uWs h (:v䠴 ╞;ɸ7@Qta7.xtN\~m=ۣyFjzYmԡq!TzƏ_GSTZ fk HS7Oo&O!ە)j4d{)uYXİ3soHC{[B.axi^K+|ߜ1eP]4WfF9_paG}Qx!в2i`lo _ۍ4h$CH~63iC )- =8+$ k[+MALEL5/ FL) { hZ!j"ȭd-" al'"r/UX'IM7ߖp\mI I¸x]IJӧ+,-їP:5\KȻ"´!ꀚf0AvfN iJ]V'OȌ/!9*E}y *FouQ.TMpDx0ڬO)+F@˃lBȅlU^r^R꠱+,#HhhԮ', !_@kjD$r|S&e]9FDFYaJ+Kiȋf=KEkF1Q QF I#{ جӄVqH݋*q&(ќ~YJOż+^'+'h֗ʋe$BJC1"!S*C]skkrA2|}G/!=hBAj4d"y-ؐslOq#;_LnV1Uo'KhMY~ҤՂ6Y[Ղ "@hjU|QwL᝷o '`|\ժ702w$fs_ B)5Ú~ʗ \= G_}8,v n#|Q{$$' b!T/\z"rJ %D-=ss.6N֦[H3:YPl9~.קF;KN C&O*ʌ-6M&}H{HwCL ^4 mFO*wV͆R»ۯ{P/aM^(R!C_A㮠Yr mxJ!4Ntf/-&7$ %1s {*DoZ|މ2 h}h0n| C,r΂e~y"V܇¹ISSX_IƹȃCWG~vQLbO 2T\&1UdR8 TYfB*+|!L@(⇴mkp4 ؃'IlE?$Ȼ$mPM? H"}|*䩲q%u*Bjh]l^jb_j>IZtIr18"3O\fpFU1$>_D!I[ȂF.1ded$ ,lき֭?j`j\ Voy<2:}}"A2riРSAQfendstream endobj 647 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 294 >> stream xcd`ab`dd M34 JM/I,f!Cܬ NyѬ|<<, }O=J1<9(3=DXWHZ*$U*8)x%&ggg*$(x)34R3sBR#B]܃C50``````(a`bdd?3qG߷0~բxy؜u̙[r| 87mBU\XBBy8yL;ódKމ}}}&20 Biendstream endobj 648 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 339 >> stream xcd`ab`ddI+14 JM/I,f!CO&VY~'ټhnnߏ }^L1<9(3=DXWHZ*$U*8)x%&ggg*$(x)34R3sBR#B]܃C5E4$83/='UؐQ ,Ə ktstW4ty5{w7m^=y]߂ީL?4@侩=9pvZ4\XBy8y7ΞO9;g'.؃endstream endobj 649 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4281 >> stream xWiXW֮ (mvP&*( (1qI^ԉhD5Q%HYl@mQf3mH2=Cߪ]F$'f&filOěIڿfs$x>H_h0`hF,ntԩv^7䤧$%gX8;MsXc/މR,"31uEbZFPbMqio+a<y'w_慙YqW&% I MK _."5Ra4.3fZ̚:ǝa,`Ɗ a0Pƍ̄1L8a")L$c,e2OƎbhƛq`3>#81~4Ɵqf2әƅ,ff2,&333Rf,#0&)#b1fxƜ1^4".5!\:QN:OĆbq|ݓXb.Y&AD6vs\:W6|8={۩m+5nG/WMQk 410oohԣF?3F ՎcNB+Y/y˒jȐBm] [XЇ!E8%ͣuJkƅpn~p%~ [peR'w8Jد-JtTw&dW.@wP_|E^;_:{ _ T*r_-@gv>ţ<Ƭ총KC!SVuqS3ڰ]b/(ěY!`b' &dtCXHAzM%MS *B8XB,I @Hy WPAJHHv₦ CDtR_6{8޼#uyisNL ZI^,!5ĻFq6Ј]lz%F+e5fQk=W$9)zĠ1&ݾ)qNRg_L[Wf>]J(V*hEaA w\!=%&SU7z~83̾@6D!g3'H1IL$NY"v.6zp5&&~XO|o%f]E|ҶCr 0صQ tbFzTjiԌF pڌh҆Ÿ wo5fL\8pJpq~anƆsU&nCM'G-WI~HLHbqĞ%6wbk %p- DǞFڔ?ġOO]xy"χ1 cqO?n[i&a;d]8`GyƾƎi%~b6ѕ^8%V w>E|ڇGONWC IM)v/?iG䛹=I9[-915v 5ݬ}q:&}OO@wg0jo],8"?|lOχ/Ei$ÒZ 5P3"HD0?VIs-$CĎ/rs LId.%8<(su [17)C:RmZ9(xwDlCHp`M aa"iJXq49dOwfGSnvޚdd>ڛ~9xǏ Yhٮg?.LR3v-.e# 10|7kU7h0b!EF@m80H4ЧV#CF$Um$!> ,k@p=% }|B9 Hٳ &'mӜLDč<&"R.#8Ni,~G ʠOda5*V3$ZKXl铼e7Kږn7퉘, ,-`e$H;m ؍aJӶ2>JL#DbIH6Ɂ=$;W(>"r'ke+Eے7&Q o藣|"0ؼEGyKpО&.{`(3/STzBI?C 22bB%=1'.3$Zz;N>(f_#@ 5%5dt9.X,j^Pj}Q"| M VV!߭Y1Daw5Ã>bX"Vb,hHkOEWt@ %$a! V]1%ةSb^rX^5|DpO i:jBT"B&r*1Mu@ ؃w-}u{[~tw򸲥iȟM6v_g,{q-;Z$w 63W f8u6c,06Fx,|ɖ/pqZ6OTΆJ<ԧ)yJZg}0ir̳riOCw5-aVbN]>6b/O\8y U1rRr囶,h?<8v ^w8%#nt$teeBo;8c:J谑#rc.rrHTLjC 7^%m-؂ 2!*~b%pmhhs(rAo^3a;I X=*kD y\]Tr/j90| ٴgDdcd<n|_T =Sq lz:p^pK1i.Xw/$y3a)@Ȝ ݸt `Al*.FXLK$E-29CƓqD8;mQ Bu_Tw7`ѻpendstream endobj 650 0 obj << /Filter /FlateDecode /Length 1009 >> stream x}VKs6rLeD&S8:ĉCVv,P_Ń(d}|~)a9uwh}ɘjOWFԲ+,AE^Xzo! 3P*mQ fZ@]A( tLVpW{bB?&e' +`f\g/^/m-=#?7XirmwH[e,/"Fk}m("ء _tW]+VrZgE1峷Vy[Cw$X4SgrMN+ wv!~iƶS,kx܍P 3 m)bpp^Qd(iy Fpl;DBa:c:1i>VW$Bg*aWo7GM}pK ׻6=|'ȭgŇStSHcaG &,cV|ٹTν7atT,Lz\+͗4 ]u1iݘabhܠ"H8Y*ނQ+- cTm7|h#M&ZM^8*턄Ƙgj2FI+}{w'TD3":yD:=Rn:IW0Kqk:ъFVa?[ t q^0}2Ndz:+xw`hb69h?tS8 ,,>1wWC&~{X].o857J{:R;GÈZqH}570Kr{-?'U KJ|'r FHHEҳ[L=QJ(7M۽GCF*|٘lǫRJVRe{-,;ϫ}x?%Vendstream endobj 651 0 obj << /Filter /FlateDecode /Length 5907 >> stream x"BP.ꝺ_Y}q_=9\ճo^z Ov]ݩWouѪ5θWg|+mkyՋ2FUo/]L'|nv]W_ eUlVyd~>]: ꧡo\ۻD?yܕPj9ӫq{FXO?^^/ߘ6Fc 롿W] +i^իwm5z ݦHmK \!#oygj]ROߪַo)8;kUI'cDu!)iy\@πjE"<9sJ)/Ʒaё<(& MItdvRhuS#Er80G"v"뜭ƻ7;$Ym<j 0snu@]xp\9|dŸH7NiOL(n)$mZ N>-R4n?7[H蔯`[_3_~1ɼ^gb4_ xyGYL\3@,+S7.mp ZLqyvu\܉.̇s9LD8FJW~{m<%i<0:ȴaYg:9 m<{zI!ԧ"x޴]gT EcU'hu(=Mx&\X@h()U3Exy[:>xֿcqLjI~Bt#AݓNI]MV8S7fKB1Gy}x'C""lN`.Y ,lIQ*{_SU)a=Q01@yw~DɿT/~ˀ'G>YSe -:u򻟀fE@ic_]L_vނ :?#7rp42Y鋗h u}"@nH_K{ڝ5/(o#q66Ŷڢ|%bj1=DGDỒs[1 7.::?z&S,Ү  2|Cp= X(4'=I3jۀF;7>Z.*->Ӟ wÅ:.€ҩF7_g(,-|pс$;xG0 r >8%D)O^MԔF $YԷ+"(ӄx8齔kĴX$ӁCD,pǺڸ8d*ډø45I@ ĎI8Xo 35[>})q2sʼneI1™kC6][D7Iۛ0 $AӼ@I1f8Q%OI/뇻0ʕA e0z 9~u^Rіu >~財QC;B5~`L#Lh$2~ ?p_x258bGQ-e#^M*iVk W9;Jy0^^ܛ_]א( !?l`i3ӒӿNad4#) ::4!1#m2E~)zBE:&UP7-0Ezq H}-LT(MJFx1͔^YU: D$kx"*fqVMzs$GԖ ρg41"l铜I\*{8y#|jge1wVsa4-Ⱥ !5%0_-U !]+V"r) H;뽳$ 6g7=Ѕ`:n%Sap!=C!e=l";& x*`(,M6VRRDZ&6!G[q 4h2 >]:tE a1"ߝ!}ߗ-(:W89FO!ܦ15(皫\z(t`Ðcx,ω|h`eB-h}0xw*4]-}Em4F WӀxr0L ."+-{3dI@boYn#Mj%OX[a=w!gQ9`MJׁr1<ۘ*LBm5nv̋#"=h]mQCb-fxE22X^tK|Ot)@6\ OH2l܈vȖ8 4#mOhq˺UNqj^C*,1Qu2QZ`dg6Il[Yx8+Cs\/h  ŗA2ɰf˜j_T۝s1*a0T![f33No1rrAyNI&Uvf d5ܕYu`A$9 ˂?)]pty0AQzCP:L+-F'y==*n!}\٩'tC$~ ˔"ULBw-B*Ip y()dA @#858q8v[ՌDș|_GsWTg1`>ɣGl׆ mQάH܄@@Ӛ$?X $PnΚ-E0֩Ql)D}9OZQOD뭒W)DM)U}9[-"u+rIX0N` l<#9i ZPu8c☫EPfl#_ 1oXXsQtr #2/%ҧl!%dx-MaWI-˪\iǍ9Y m@;g"`8MTI Ē0߇ۼv9|OoRy)kAG' :_ ]㍀ ^yLmE=6Qڢ P'ze68k-9ќy8 Nٳm eނP\Ͷ8fܜ@- Sa\ʈMؗ\`vpt;p[8/u\Aպ_v:t~ CWC5V]FOߝ(5._fb: \چ 말Jw~紑{>/pNŸ& l a/  6LOqicRm?pk !!6pZ&#Ulg0.<wRVizZoz8~g"0m#1 w"2(Ǽu/ pǔ<'QPX }sn}b_AJ J9*4(Yn*gVDŹ<Te?ДRcȶ8/tyEb "YS^ %50x|ڭݻv-`+taL eNF5/q4SZ ։9=ًC<Ɓ~IA\ͥ@qsp8xAr7٦Ԍ I]c 1n'B5l^W3]sVq8`_ѩ~a$#+3a}AJTo!z+vBc^8.}"zV`(P;= 6~$!9|B Q(F'u z< 8g62,d9{\ܟ,X- -pwk(9Y^"eC,ՋIYZ-#].v]ϣC{34wv| 4ù6Vu-IW̷AOv-IP%r.DN.V4fc{ Fw/Bnc _(+mFOOPz~R,[dGf n ;0>tD1Cdnѱ+3hĴ2_ޜջǴ). [t }.}84#JoҡU컖7 CJaG!9Z]TO|qr92S͔<iղ\-^4)yuY:Tvw}EEIxvRo).st%Aim< i:]DE'~'27Ell)6"y+5y5^X>]}CsKy&| kg*o% qO 4sޤ[Md '$o2@p7`㇆̚X&VO19Ѡ$eei", Ӯ;w)pΟs]2[P?P/Fpٸ",/[%/cAbS.pԀQZoz (rBߵ L6>c@%3ZġKyD)屍Ĺ6x[[XaV#lIgX 5sːZBp[$gL ༝v%gkקeQ!̝cd[x!S.g6]^nJooY(0廉GrhǗ."TG$K42endstream endobj 652 0 obj << /Filter /FlateDecode /Length 4807 >> stream x[KuJd5zVxF&`#Nq'0 eAuZdV/y\\G6P5ys˪T_.ۋ\(zz]럃'eS5OQZ5e1jwUe)j] *Pܭt(+ݭ0oU0eUWWkl]lV8Ԫj}28i1(q5}w;]MKp߫EQ>ZC֪˵qeG)>hWMwX^:^MQW!u$r.yEeA7ӄZ_ranxs M7ׂp;"q\ mr6 mqLЍ7Ѕ8ͱ[!Ga;5 dzO&4E)rw{]1Ua0!h Vt,N0YbG?7;\pēv;rxi ?o\dhSnԣZ +^uյ+6pR JBA)9QptحbWqo=+Lݮ=@?̙8H74$mBtT 58\\˛L.;T]2QcedM#Bq[4bP,G4[J0Yh!)BvzVj&|) |>EU۷sv{$mr֑>U]? rM!o`&}FIA@OY-Xv&*[(T;3$ TETE1CzJr64"J[a3I,ila@ƫUcʍԢQ@lLuZ[:G )Ose{~p g }Rct~k (z䭆Uh8ʱ;3 *c'1ΨP rw ! mp:/<\?\p.Q φ(Z4 A[Ra$~/OW|S]QDDZ s$Q{Zp=+$6sA y7RեiuY۪P)׎DnxTERۻRcTM8=+mt5gnόm z>-t?A@=ϣS:& u#Ù""]`p]_vuaj &ByϩG:0+[9#t6J@O!'Ͱv2[bB"2DP4QcԥKCA^E+C9@jrBD12`y%TVq&]lAFgc|kYVOGc`>p|Fc/id>y==2:1?Qp =c{K!> Z_U ys=1NӾ;bFlco!hu oi(cÚ lx!1FRI?F2JJlPpk*T9:t͏,C !F02ɧx^u*v40jR lvAgȤP*bgNH-21&[^ tuũHY5%O} R&só$&s_g1O]l+̜]VdeOwL;hMm4 :A%q3Y'I9ěhE͔aݶ3C+{$*0`N6ʹyIZar3~5)#lMa)6Ai7ۥ8{ `̕ ѵ HV}1„.$_Sn=*ȹ5?-2+='ZM$:S 2JJ2X"!T AYp@m m}M16 D8J-0ZCYkg) G!.,#@!SvNjc'ĞD=Xvi)yJq};azY0LgP-&v.@:^Javzg(JQOTϋ]{{EB\0@.0H8K@$  alx}[WN ~Ɍ(Aݵ%~zݾ1qTt8oTXr ~99:L~%5f0 5aoY_ J C Ϲw5u.bhsu0 ;%O//t T|l4y}V"hangnA kIJD/UDHTSebl3{[|Xs㌪vliq?'Xfh9(;V.),K&'Q w"gwa6lIZU!f7Djؒ`XQ((CN~#" noT`RIz1V`o @nOjL[a`Vј J71H Y;k7Q/ҙ#nc%Թ6C§;ٝ"Lp;s3Ȃ]ȳ{|O^«J OoJy6b"YNT}9NhFUZ;*+2NeTt?Cܾ ɰEDz|6s].>FbM_;NFT=Efhx/3=oHr[3U.O-9kہ?t)n||ܲ`)3V&/&ŃШ5)vZ ^:,?ڞy؈*]ڕ;?#P<|+כ~s74cW>{jQs8)l -`4K)9*Zbd>)ƨOj쨜 I2.Aq ?i0 A\7rٞZ%q"йo䭇vYĩN ?jŋxeOJgQ}5IR&ܬUVI4@ن.Ac!y"1Msq2VzO7Y,VOYv6"SYrQ'2 >a WKw %'Bi$1$EYa q e(c<zy2<4# Dg)?kLMB߯fW%*s7|SZ]: GNq.}aM14/c6rLAgꅶx4̽|6~YWܿ3ul&s}럖:ͳSle'<$"eyah&=_?񏵐"?\?Ouendstream endobj 653 0 obj << /Filter /FlateDecode /Length 6687 >> stream x][u>IUys*5ݸR*r"̲-o9"0\RH;;_?s4zfR|ؙ4.~>?-^,^φ˳=]?WWgjx҇!gb2Y'[X~^|~B)oχ~0ʉ!t->W}wgN }6A{)޾ޯޞ o;-En0byaڝ?`&`Ĺ^^({k/_a_{ʙnuZYo966oqs`Au6~{bb^,ou/vz'([rlAFېM `@7P URn({ӽSrP a-LwGCz?~')u/9Xآl2{{9DزW»4mһ O^F7f˻/[0NR>Y#gWn:6^ەY9H7ˎNdG3Un.,Mm --1Aʅ *Ƶneq5 6 =,~A#mS $Di'9׃ "-UkaVIz鉪nT,Any{4j؃< ^drێ}tv>}TW" (w4;mzy}DL*%>}"ZLG}h֛rA/(k׹r!ɬZVi^H>i$q#whP` v_nlV('zg1( KY f0Ms`{Ϲ \lE(zW>n3 DW1Zrܧ00IT, )m@1HJiu 2AYZZ>Uٱj67"OQk26⮓[T ܌ >D-%4mӮ^{U2^Ťwtה8j Ӛs*ut&Iim'oyp(Ec&fT(|YI^nn~D11=qiY>>[&s ra97:pϝ 0w陲QI ~ %NzU_ٟpw'ueXB0kx볿̆}1Mqt+DpPW-AW\@{chyԅL%=[Yï€LŻ8Њ 8%ZeAr@mBy_[B -H6??|n -02FG&%#Z=opdf_8#Euvp+R=E{Yr$I< m Gvk1wn{vqLb` x\LtaA6Fy|r07)8;%s=0dďhBDLVœw0\TEl"O<]K1"DLB'ʡuNrXm[i=/)zԤfQ|z& ȣ?=ՓVStQerC4/tob5H"E#oAEv"|f0( ENrM K~\֢|Ym71Y#5<ڮe9@YpJgm ?k]$כ햽^ɔb%oQAqFMK}f論JU!z܄iFT^Ǩ@906᜶*`Ng1"O]py};N n{ÌjlLoygU1#֘(vŀ -a dYS_Nz~$*ac!nI|:Qˣ}wBUI2lϦz]T1e6S0cU iUU~_*~lJ*`p$,+=kXW쯫4Ib>ɜf01}ҽU6W߮ǀUrBP7J \PE餤0N7E5}[o(GU%2ަtU 9Wy ɤ).9T,rLj0+Aw'V"#` NKd'`׸nW:ܠ,Slm RwoS}A_|2O{МP˔/ bvF{^7u:Lbv%oVͼ{JQc׶bsG BHuÖ1=k&J9p~< uЯY(xu è \%%yMjAl7ƪ^yOvuVc'l,x4,mڍ`NdS"_r@FLj=IDkTFu0[=R<>C䏗2L \eBC,vSYث|45hOw9MnxD j"A7t?9@-;H\6+ \3'sBs\|H05/t(N X1d6a9*<@)aw<4es6ahxtåBICXa}b0D[ݦv7A9߽ʄZ*F&@?ǘ%T%g1cXf{JZNw ~VO̎YzY*T2sڐ)l$ʢ$#K}!Y" =q4r4j^p8b]@f5sel#;VQAltOk5%Rƫ2cIəAsbMG\s6rDT|Fuy(8TlfjKǭQ-HA# ?XE&,L/^ǔʀY&;3jAN,LfѽvϠF6@{,Y<̢ 8=^? o2)% %eaTA~.+{TtRT_s"\=ىdeU&Dm94.QNIARtwy$G%(ӃC~hiU m,({dmyߧ>`.LfnxdM?#ݬ<1u8as"z7LB ʗ(O:AXar}1dh:Ȋ'+q;Ve~Z;]K#a+JȀWJ'(Kp z Ʌ 04UT5fm悀U2,:g=6T6ϟo+p'2iNm6g6PVnM#f1]袂i1s2a$BHi!'rYSx@5{IdYfiiy{Lrs*1k,O2(FN(:HGs/ڣ1ulgRakID-3 nvlRCNMK@vž~)o9`.Vҁ9zG6RCA֙Lkh&jJ}h Q[YYV[mx ~bNaB4o̩ 6l.[_/?{ex4F |88S=/*lOTy bw_F-CH%Q r}+)v8#Ttj^Rđv OHpK2L}#ȳnÁ0딩^fv)0^h*P>bYE/jexZ9e]1xCݤ)bh@-" u/#aF(sSgҊƽ'H׼2B7. «PLj U찖t3UUD<=*ouX]tUdc!QU8S$))r$~jP]^cH6ir+3:GӸn~;k#HRZAkhp\;KE;1/4f})TJo&|$<9*=2:ʘ-5)_`W  -VfN%:!x~jr&uU'Vbz[)FG.xS' ~0BTB]#KR}LGK3^RjVU‘"Smy=`Z4.`z8ñ)C &l? x}sC|nj^1A-lq:FwM1ZRƫ C ۤ?!\/Ɉƣ>Qkq\sNtOd#`k:}DַpxR#n1+{RAJ8 x)˳b}REV-Kp8{lbK/=r7)A&]oY_#Lyx}p_Zb=l|>ա]`ʾt~RqxJ#\i=f \8?& 9ND[PW;.ǝ I$^i*vLhj6$*~xT>8v`=!;+Aڇz:`8zz9jwE~]NIVGl0y~cnV~SevBw:bĐ;o%Oj&[͉-؝pA5X1Άe7P:'¹|Qēax 1:q6fnkuszP]3v^*4ӟI6Lendstream endobj 654 0 obj << /Filter /FlateDecode /Length 22375 >> stream x[.q%~~/_PUo֮U%cۖa3|w3\۪Sz/N-Mm[%^ˍ*[z KKo=l ˁ2(V8N|_W|SH* 5TOpҺuL;Dz{KyF5>:{{C0J R}/NY/F/c$֓Ow`(MK}p@8$8:feH.!ߪISAH&ZNȱUsM[Wᔥ,oתݼ^ w$3c %%${5ns0QVGm~oc MGoz/zJَ/)}Kp,,a:L C% 0#] kX\A|LK+īfV8Ug%e Jz\z2PA'f6n:a_@h\J]&MDdz0qp,ȌzʏL˜Z.0Xjz̄~nio燿zǴF97FX;^(1¬739DtBW^eV!mև}Bw?d ezgK3X:P"(u#u ]!>Ϭp$ /k悲Ƙ%l J B şNб^-\=}cA;aS'zZ4 Kp)!tDP rx0Jv-5UX__k,08(=/ Fֻ1nw˧1u5vxކTN7G|OCB`@ ~E[>vF 9Hpɺn2j65c k`6ח&α>n4o! Q5.[:n p+]=3,%pZԭ 1gK?k5Z;0;#Qܱe W1Q0 ֏hq8DtBmU(-:LY V7؁VN $c 0uҵ:G[0nKxzaih(~Rn m__F|ud1-܃K+8 umDvuvyp񵷔9Γ˳qws\ K 8!sUZCr0Enʟ_m2I@&ਗ=FY BXCZ<$|C--XZ%~?(X'4e W6hbfs`!_џ%q+BfF[jEӺѴyc4<,sU ]6^j͹9CiK,(̑dHX_ SB0[a$|F rO=8¤S1+saxKQ`V' -OzװBl/<&91*sMZ jSK;j\B"dF 9JCΏFꡃ21R)󫫘s37.s1,ޮj't: -ì O?++ora3YYfeHx!֬V Jz_prDyp⎥%Rl˦9~O&Z`\}PVcC=aP6R`Gr>$8ޤ{ &ZQIX8k 9ͶcrKxa+7VC؞\8곽YrLE!44դU{XO|fs.配+ 46B ^J#UIƾ7Y|@ʷy"|AʡALpXD6s, V!W׬e}X7l]X6`/!$8 Rv Cغ0Zn x8Aev'Tz2ݶ㎀v}йm;0Jnpܗq(`&n =@^vra嫡]ꁡX-SRA;} "쯺 n xz7qLm+í4 e*`{sT-T9ׄ#ב:vm`9EBɗ280na p+]ֺVw) PjI’ S'8&æ.IG: </S7)[A]7+Ơ-\{8nsh %85jK( 8:G8VM9,zmZR 7YYſtAnNm9_p$M]B`(vl)`}:L¶cK#cM_XR;ۻ m$h2Rma 5IK8[RPze4QHhSݯRYaaI" oAm0-_qr`P8{[e4 mٸ `M U-HgSn.ԤZW!;; P"]@lKAAYU5I[ _FVoLڽ$kAEV kzbtVzp` %5\Du[nKxak d^SRZkoWk Ü8Bc` $qyu۞p%<eq׽ _#ĈXR*F&p% \Ln xzak|kڸNuvZɵ)DyR&`{f iM wZV-]RVyյY]}GSq\y޹_ J<ٍwK6iw$<=@hJ>0`aj/}zߟ'P-XC&Ӧ(y h*hF8^rP2S~,,4@ TDzr^ځ[-]\F[Oa3&i9Y}+ J6GMF$ŜQ<(1viSn [p&NNԛrs!u#s\v71> S! Oҫm h>mtO/Zf?W3~Mm˺Ŏ7^` ;t%PxY&[+Φ6/ޚ~s2EYlkac~-8X:8+6ʲ⢥Ih:p:I +ít O?bFxl2:VlFVr`!e 梷MnEy,NJJJ)̇á^Jb ;qq9p0X:X(yjrV:m5V8[i>J օXxxcCrsl GH}Hp,, &[ۡC˧ms&GlqN6)| "ڵd0mÝll䦔:]ܱ:)jV7ۡCMo9~vK\mTk(7?Z ũ֢YޘfZps %¶ۊϑ-_ [&oxx`Gӑ`e5AN F0|3dMmA.`( ni nzLX=p vf a0[88uAX*,tz5q&E}]g3KpYAH69aujh_m3nKp,Eo (6u[3C+ít O?l/ZŇv(]hvu5s-t^(TCVCE MS3]/iXX__LΘK'S:O.8foQ}? \,]\XNrɅ`m.\wx.\9Ay~x蔓G=\l˽oAn"FELM\*,_85lmٙ9vF@(oOaރ`1:p2 =٘`2;7aQ_%?Q [, >UpԱ2XL%si3~K?~ݷhDRoѪl~Y?~?|o_?OH*z[$}_^߿/2JiW?8k_[&~w_~et. BDWa_~uQG` wve [teSژb嫄ǒX#JlޯVrT_Rg7ZZzצ(AN2_*~\=@nkڗqO52 B,*޲m2nʚ-`#PbdVf]Ɗ cϖ8,%$snvV2e !j)9X*FCy$ζ%GaF-`t <+:ꭀ5pyPnL*B5v%aZ͏vHg)9G:Q­p%"H.)JoFlV/^ݓM#ϟs9vS[:P;|j5Q6 !VeC-0zh?|*UcƐu)aJjYXK_V p7[Ai  .Clms.[HNuV`ݦ1CJ⻴04^Cj! X:P)䚱l %ap+ít O?  +v+[8)̦4no u5v(VLzJi,Z7۔g ³/ zhЭ3*|ؿצ/x:7 Z Y fs.鄽~I[Kzѧ ^?4g8瞪ގZKn ^?Q[!lo p$(P` L%X?nVɛ Z3}goI(MKp,|\NΖPj2+#6 O?f] > 0U-˔΁9- /3(CB!ns.ᄵs{4)~hl,W W Wg`&M |K\${MyfMV' k:,L r iwFɚۢ +[BMA m&an!ݬp%< 3eP{f\9Sb! 5LrG-윛MB1[ms.D6jJʜ"oLasn xzaMe:%:䪀>mpG5eqnµIh: ~ ì܋?b/,>14vHS=|Xmyj%8 2f .ߚ~ƭp34nhUNJ9Wp*fˊ&!©#aY\8ZI\o3cǸ5p KP.;\B%ӑbŭp$<|vSv4ZHJ6Bq K7_{sh8nF[16çLQh6\6)|pM 8)sLC/[an~p.G,zX|?(}cھK8%~yY0wpnS݃)׎j۳ARF[{5IwI_M>GQlR(r%:jtns`$a:Ii?}Q}X#u-79ǿe-yjDJӄ9F%8FS%d_G0¶-V"eVA};#:¶~jhL fA4X?u؊?="nvqJ0˶zѦJz6(Xc%.thJ u |p$TB.lXLc8VΗ-c*};n xz&SNg} n1m=-:hnՇa):%lܦCV}ɺk|&I7ע4Q:py̴1/dؖD C n~nF}͆Q"}^Rm2X*l[a1Mð-m;"F5w/(FɶmM`}+!qn>pJsrHMdfdq~'u)0QlUy;Ord=)93BPN.$Jg\k78rɅ$@q'N^uAZ)sI^,\-q״y"=~-GޑӶ8\H#Ȩ%Jvr9tꉝ(.:Cs 'dt6NJԎxڱXʲQ?S_Br%fyjIZ!ZH׿?'D?Ȝ-0I["ʜ-cʜ- xOJ'R\3gKvu 9\3oz^+羐kv, ?lK{SR2EB5Pbv-z7nir7)րZ3 nBehOϿ?'7)}4[Up] KσV~Pod : Lx%c 2=AYҎ%FR+|Vn x`wv%]Zy?)DEᾴr꤮qX%k\DAVU %IǬ ڰ9F K-X}?(͒:ŋyu;;qp,)0T~"[C2lp<[Z[ݲ2tjڨdaxZ-qə|mX68Um\AKn?nl]Kbf`fNX#Ԡ5D]РB`F8Nv'w?ڬnJuU~MpSp)x2AjYxj}*G,2jr왐U&[+m+RFQP4 Ţ& v/3Rd1iS&mZ& OL-8½r`w<@tf4_Lp7%S`(Es`C>8 0ʥ+^]¸5qY4"FBUk.5( q^_뉯sl ] zz_~}bXtQBFCXm^ȳ3y:@dSnK:>kD񩯎P9hs 3a٥J< 8ɣ]2n/[ş'gj71a"X#d_/ 9kXP;WߔY! xS sbrLSQMRxv -X gsr }.tSxbKH:6hs&|+֔aצL~R|h5o 8t04ln/k6,70T0P@ []zp.TpM:5 Epj`f5` ,<`* vqǒF*t]pe&8rfCĺ&(JstBGѧ^X:X)%T:eV8Gm~ȷ>;6 6ud؍t 6Ymf52x+0`* []p] y6KM^v`:jw{_]q܉K!!pƃ3jc#얄~7H4VoJv {p7v/c*os KJ8ϗ-/W(P˥<|ћA}k66a[Nh(Nм2xqi* "gw*w0$<͗KR9x~ ]6p9g8A j.ySnOx0ZF׈`d@ \5@s4s %,+ƅO)TZ]MO'_CMI[O#zшT;jk,9ZoKJ.k: [Urp&|C }hcSiG㞂Fi:m 8zv %Ҹ¾%`{ he&zr`N4c>84cS 4f-X+2˟%\z9rg Y|g*M~OFUG/DM 6*Y fq& Rَ"?WP2/#cV4˹eJ9%8pʥϐpCaV8[~ȷW X!r'W# CoX%ҁNiL%T:V8[~ȷfZFʝŷ/Com-+o w2(}j;:6hs&|bn]6C?0C\~;+Kx,:GM_͊pr;!qV a$R]Cwm %leCGtj +M?n]ͦtEΨ;Ӯ䦋1ColicKp,`L+smn &8Od`1(7҂fjl}a(Y͸s`'KKehi1$ l:{V8[~7R\slU-680LfЊypܼ$8;l ̚0Mt lnK;AZAn69zQƵmZDmMţm9pJe,P:Yfs& Rў>Y/သ/tc -TAH 11 ì aIxx!DzVd.sYŴd a*cU\mF$%`)e0+CVmIтMߓ8${ǘi_QFas:a26~p!|޶]_sPm[NVf&&Lg}t17[cz]a7%<͗KwUSz)ahjj! pRMT\ږ Vm|Tce <2[81+{:K껼ci@ ΄@)0h!3Q†?[,]lđM-P]"X ʺ)sIJ7W`xװ f/A~UrlJ8C rP:nKcc)` d퟇BLW Z0şȫ!"Fo`2zKeyRǂv96 la ìng!{J S15ٔQ\A\^rpFVh UM$̵5iwŞ3ת?W1^gg@`U!B7NJL6?X1ƒ ;EJ,`LF8UŒ ,3!aLf:*M .H$25Ody͛Zu?g>%}B-ϼx0$tퟐIh1$rGv_o>Nj~'NyN?M'i9 ƖUr8 {܇vۭ;&ȑJns.F8VƠ&)H"˻.3/]רɯ5 2VVp}o1"\2$<<ME)Swu%nyqWa|Q!!8E'׷n7FwJVmp_z}+Ybljؐjp@0[Mg=BB`X%n1r I3fmVfO2uNYOyc.|=Jp KuFqs%80 mKyzڸ+M?uoZJA`2CoeSߵK0\`0Va*P6O/Yj;'Ie hU_Vleò=wq+w %2 ʭu[] M֭}*x?(5o`/;ǭ .Cc@ ddp*2hs&;()Q^ TB`8ȩV5A\pE:BN6Ȧ9pd&!pG!"W%<zYQ,qP?AZ0A>C#jR]]ܱS և6A*bn6$|pAj7}aA0-ƭxH|@L˱1)uqHp\|^-!J!l1ít O?[t&t@ ZYXUbηa(յC|H0\uKS[8hQ]aF8[RGK y?( h b64r Kԝcj<$806Uhp#M y6-xXk5#^ZqoJ%l|1| #+CהFt wdnJѽe6r¾K`y9J֗_~SuK7ì YfeHx! aNM)z"֙/Oo uZo8͜ %v+B!lh+tB!NlJbdAAfD#2x8qwf>A /Y)0z Frl(iuYPrW3 #02qp |;$80ų[RaVYnKx!nmL.q^2>P8}oK-^@D b}nȺ-Td:-0$|A7|hA(L#A3, cߖT.aՃ»mVxPӭa(w C?R=d َl -OWޠ)yU "[V+r Sk~‰Gd~sU^TAUz$tGvTaĖf|uK B@%[0klp6_Oؔp;ׅRAaЖ[ܔmu>_f-2m9?8{\6%kX)[zz0#] UMmh-|+v9}V^spO%8 BqXVA;Gm~7cY6iG9&V⎥Ŵ- 3mkP3jaIx:!h13Pu̢6o[yyc]S,[@vx+fU &rV:AACW.V@f]"8|phAxAx-1cSJr܋0U=8y0wlKJ8'p KO!ʨyE%ݜ02}8~{mJ\FPju[U p+M? RO;Տ2yE|}0d&s||n xz!tE9"n 4CcBkmosܲ5V:yR#'.\oɎzl tOVV'A@ޜ$1G$Zj`ŖKMc!3^ ۜ>Ĭ?Lp7<|[ 7Ş1 kgव&zhuIOHqS\¬ 9JCݼ mX'dH}0a9/ϪǾ% pJ%$`z dM =LVtj&F;ۭT3MHM9VEf`u('$8pB.Nڇ0*!a)j#~nYvZK#Z }Yn]W)&UX̶~7 9՚wYަ(Ž&#*]t k΍cxMc;( UX޶~ 96Flk̄4bCX$>P4W2ۖ8AxhKal舁nXnKx!n]HcawVK+-w*<yL/USzxV09@t>!!k(7aK jxhEșXNQ\wBDrur gf[Hx/B1<()yڕAa Se+B5jEKX:P)!6CjBV8[~ȷ/mU^b fZe4^hRv^HEhn3.<ޔ]t+ U% k)O XZp"Cwq9on lQ: iAq\%1W:2+(GF\N9rhtî?-JA^4R^wVITvFˏr&8U}dC,*[̢LFyp!'/('Wn q.7."xm^=!KA& KOR,'9X`'H+R̠* [,\Y>`Y*q,,OӰ|yX~ ?2KUKTWGr0yk7g:2?XWM篸,%+jo{QȚnAр}K?5q}od:?Bkُ:_qw;=\zNQ_rƊ7Ľƻ /||X ӯO4{?Z3"SdOשt9y>xh b $ZY3c seiY f-~g93fXևLR-LasgҼ>ɷ&H_7|uS֫g۪#!_>u[zV/k@K-\5IKYr|?cendstream endobj 655 0 obj << /Filter /FlateDecode /Length 2515 >> stream xYKs/K);6Mm*Da"S6)%[0jbD3=_~Yъ(w rU;jxR9j"la+\%Xe*'j{&Z[^9+VTYf%kn+!~iAk+*J"z+4vaԑkNyz7:G 'Hq̩z%9'ulo j*(3`H~B=98)+-^o$LJS'zèXƕWJIWۿ]lwMv1*  v GsָY&Rh逭}#XxjrܤGQ*ʕfwTnV10Ds 暫 rC `ЍV\1 y%[Z)^7 oj^Q;+$.`x Yv,!9Qƹ[*2\צyH SWEZp_!!H嶮m;E!ߌ+f[] KPwӠ.IW%@8ݮ}xuShGgNެ>.P;UIjЃ&L\l?^(~ Rum *N]dN@7#=fW(@zۏ hϋ8K Gh*nܴKEc!#uOC/Zr﷖+6ƳWh, [ )^96]` rdi.!GN5Eb 6K}@J<.6/2ֽ92R9%$)KZɩF+eP5ݞH@no,#9z+05dK1DB7( ?eɾ2$+x޶gn ,mK +vl55Vۑz6 Yc h^՗ c@fƄ*d[P~?2Yhw;QnrF0*?'+.?Z:R 6]Nptn ˟C>L=~Myg 7Z-тT^xwW0!mLdPwj/J/i K?1D@endstream endobj 656 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3010 >> stream x}V pTM.AJK"VVJjPW TD"!nd7ᄈ}gM&$*Q( Tk[bv:ՙ>c_x2cRNg:ٹ{9}GDP"'oU7=mm~ 6+Z[J 3|]*jMڞ.r1_y ݂RhQRѮS6767lo:N'߼^F,m;"ߺ~zv 4c@.Р0>oCgF,F#f*P[HCtQ Fwk}Ρy/ӻc.͹!˾%uβb9&Pti:%ˡL&vY(V.WJ?7Oω^AxK~&j3-*c؅knaT x5+{KogxE%aDkfWHcqψy|*si g@tH> )Qp|x~?IXr3 Y3he '#2 A ?ja}s|.^t^pa p Q솫F~:]l4A_GftN/^}/"%LrVޔzc F.Pc mSD[C>9BE_Ԃ{؝X -NHߠ8lN#PJ'}Fʒph]6l:fNuF9:iSK M-B,p;lv^u~X? H+0x?:&GG6\4XEY esi觟 Нz6=-G5tDЩ҃OM{#8xlcnSXMЃ$s?{$+kmZ0˶+Ki"$@o q77Zlۆcuin:20hlAt&Tc/guݬԞTQ˷eGM1@ˍY`N&u-ZF2h< 2;&6J,3>7vqt2fk/h/ -MiGM &.hxɇ _ Z* _h7<[.MQ B(Nĉe1s3;Ix-} U,zWhUOD/!e_Hdoi5$X1s1rߧ/OE/8siɇ6| /zg+2230<5x-|M566]ڧ+ӑM}AhdIyb]W}|c?0VO2ƹ? qwl9$=WG|K|Lvf=1/=;1|0^=۝63/Yr8xKA8?Dąg>Iy0 Q*O59w`7 so>H`8A aτbXޥ{ j5;]:K~qnc? |)w4IOvT@4 ָ3AN ȹ˳l,飉`$\ DLɅ_S *|\pvWRZCTjN$ 6;&4Yڐi4ԙ*|ܡuFYKv`t|?Mr3h?>}c=NF2YK' FYZ^3W_>x4MhK3=B(r#SK>].)/SnAxh@(/^r pM[Sy endstream endobj 657 0 obj << /Filter /FlateDecode /Length 5039 >> stream x\Ksȑi2nv0]mv³ {mKaƱ5$< C̪t]YY?qSfw7F3﵄*+]nYeJ0d0fC?U,J% +p\Uo?L^y?L> ͧژzػJeoOo߯g_\Yv-YjޚLJk2+SHuo . 4, _ %`7a=$Uŀ%n~W7Sp3VFf͇q(D ?ߝ۝=< -Eϕ.԰yU0&Hi?ܷ7[E d,m@kn bL@ۧOmCD쌁;]q?!?`Xw~_PVEt,B_E>La3EH@Vf%7OeTOf*[MaedȩE=iZTW d e`PKwS #xۉ揳<M#_YK Q՜`_u JK$~b<\KC0b'y<* Ոq)!pM[bQ GsHʐ]eM/hE!i8` ?4n"l[B~Ov}n>}vj S׻͆}vqЧ;rgDs}s|8xλ۟0bnOiO=S✽>dQ­F켙,bQƏ$V)0 pL(c pad *4YL~T~X}\;YDZ[Y] 51Wf.4t$'}֜@No{o{:<I QH=`0 IUkʯWi?Ʋ%-/˛VX l/1dn=bL mpD%` ==Ah ]B-o eĪl8aʀ0#oMXm`J]u،\?$|r8x:K28C>@c -q91Ϯ>:V!-[ -{λ 7B.$ߝɖ 6B'p\kceYxt:{.䤟h!~MGǔ]&@!7ˮvO6fDtE@Lo-' N N&FA Et`|Ukp'B g|'/Bn86 ZCs|vHxuo6|K"p4ͪ"U#J0?KLBW|rvLK&թRCo HOQ&ErX ?Cל\eU;ȦW?XY e° 1v|[ Q=$9r+l.(Hbo׈$ChSܥHh'O%JdB^!>**(9;џY3eX\p)h_ʄԄ 8į.Il[J k!Yߙku.EKIx=26Ԗ-O*9 9 8<4ɥ}Û%jN?kVK KcȤg޲t]>s`)!N60ZQNO6 +1j^@`BY hݵGQ.df{!I W|RW;kٿiF.UL9 XS5~]F0H0=SjiV\$Ќw.4';: .tY4Zc6Mq> w"IT %YS񯞸@XDҐRPKDed[_Յ4#JbݱC9%WX"^fĞL٠%%1bA!HS=%_P*% r'IۏE*%wزԃ?`yP Ɵ,EfY&EYr9 ׎j7cYʂK͍j>V){qԫ,>P;>>\Z]Je,(\HZAD (x$Be/Hk2Ȳ)ahtg:n)ౙ?y-ˊJK8K/ݓ/ ;ET)tBu8JY;5Xª0u7_Pk_S3&$- ܺB,g= _q :τ42Ixg+Oj3N(I,f^:3UNJPǩ,~tVL\Db G[9uiqذaQ)L JC}s2iuM◨fF3/J(AT>"35ѯQ.z}R{RGFrTu@ ˆe1xqkX%{®=NBH:`Ɋ؀ZYd QhQ tu#yk??giu)+Blnɔm.Uԁdýk?snGc9!2c9W*~!:S[B{?':i4!pYXk9 n8~!!,5f@شѴdY[)en]o 7B$,i9ҫF緭bp42B%Bfs`Ũa&&[ JRoJmAbHYo@o@Jzt@ʂY?~wɁ,R\a#.*4V s2d&yj(Mg.#%d$@u\r]=&}pcaShDŵv&ÉO gC\}&שNY5o'WGN5̴p:1,tRAV7\̓ՑׅoAu^'=- B빎odV_{RVm:邡mM⌳WvT,׀ib^tND}mygSh0;Wj3d ѯcNծN/e},6.kmjHFCDOܧwA\@ۨD0*3d B]"" V,%䗮=+Q 4x ҢM?m~*p44kO+tK CHHVYas>bT:kx!zV*v0ZlГjlb~ؼ`q%6.qKk3FƜHF K+$1őXۘ}.*z7Xu)=SUڻ+vUh|c9{,|0}sdôfJuy\Xa#?ډ$\DZh/U1KJ!=kp ËD]߅g)q|zKMhGUu_KՋuw-endstream endobj 658 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1481 >> stream xSkTeeiU\mU -CEE4I; 23\T?MDN'Ҥ2h99v;4}o}}g4h#M]saX ;]wcﵬÅҘ[\Ye%ЮHU .MR뎫X /~hzr#cn u 9e. }M/Q/ܷjx~/ywvlʏ+[e 5ʑM7LF Yaҕ;7) l^^i%)ބUh^OqvI1ϻ}ݒ#0xYDL4BDWtKDĿ  }Da&kT:SG+ Zbj X }os4+u0ijFxZ9)KSA.ȏWk$x42XJn8lcҢuQ8L{t)U(*IT_B{`8`'IX 9|1?Ҳv1 /ݨ Az(:,xlA\ {L>XV}h3>On[d.gZ$ց̪KUw>zLR+{Wj&Z.Cn_o+ݱ?[3 J3޿\o쩁QN׍j_}N.ir7lmWCMf|"):WYP1JwqbAz ܳp8t>>s=eendstream endobj 659 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2663 >> stream xUVkT!dftD.>DhDA@I+ւV+jZA-jGւ@\&h"6Zn^m=aݞv8sr欽}{MYZP4M3 MGZo!Lba@< @ɏ<\%cEڲjku c S"^!(# +-%5%&jnxΝ;i}8'g(E^rzF"Y8M>7):Q$wJNMO&EQ. A!Y9y[lLJ޸4%5*-zy͙ ^N\(jZJMQShj9CR+T GQT05 Q'FSTC͢"(j4eCR%hʑ\X%5JݠEt"bw&.ZZYı!ƓMdwr,7*njUzFY@`Uࡢ%d8C 1fpB bbT]wK*yc4ںu4nK4h\#|c9}[]fN <5 `$pi }^=6<.s_/1lQ Cj^d. ^ >1KƒRue?d>C=8p3Ӷ)K"D,LZqZVUI Gb v-&׵Ӕ݉8p| 4B,2U0ڜV97y2ɐ` 7d&հW jzP/!/LT'B6 +#wjʮ@tuľm$z5]>vr=CVPVs~*?NWP  _Лx4n3_>}nc,C&ϓnbWã;u@'eB?SG W/uޭW./@]N0~rL'~otbb*UG5?2Dk>M@D/䍕*kStOx;Rcta}ڣ-PSMSh"hscaP)~.F?$%ȍb.#Gcam&L39;nS]<ɣnBF$|F|ZY}5/&J3WߝG\ocF,Ey‹m7o_rnK~hj%[݂ <(ޚxE$56z\.>T9'p`objD‡p$V1k!^`a_W-.{aqT:bY4he$Բ0Wލ>J 8RcVqF(4،_֑ /wR$ $9[@7`̏!lp`Ĺ/I,C*C t"!u,$ 6Π6G ! {a-aj/cV!ڗH3z`6< :vi|o릾I8'aXk:$rN Ch퉌K[N<]z+ ݺ38Y%DFC|}BQ3gUG؋JI};lEWHhqFXeG|Q =<塀]>r ǮLׇ'Kq˰Bpbͫ|}cWy^ c%BSH ߮ #<1gU\Oh{uN]2Y\.O`%JFirW{9ҷlQ?{ W+:rB#Ylme䏩l?nsCkHhJzb, uµ9oK4k}jZ,.;MOYiZqBULꉝ%C`_? 3ב]Yer}@+߄Y I. :搄D9J #yhPXΞ4{OwZ/a]5x>e.u%,)q#r@Iys[X棘cwve{j7\ HҢUW׵;h0å4S/cHm êiDoGƮsQϘ9ƪs@nD {4%gMf%l0)6mo' Ә!yKm'BQZZ9'x%yg#&@ǩs<x!bsvn""OL־䝿)`Ѣ[Vplˏd`mv@E"hvA;"&94%F ؎7 fDa eLg[Ʀcz6<~+'7E dZhyq\!ݚx.܊amNZ#$1{=\Uuf&jAU 2{]X1pM0H% B`=Dh=#c{xwS%T R%bG=|#kGhendstream endobj 660 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1766 >> stream xTmTawgԩ4F5sha Ġ),;q; ,0G(W5BD &1 1i~Ҕ;{.]o9wyyeuò dd:mo*(1*,>M M85WÕ0pzA`Qc?+J|5N-Ye,55=REhsC֣d,MDk)ؔ6-Y[rD6P&Pd1YndA&,ɒѣ 2"K4QqH4` D]xIT6:dьd'&CF.4BK8=\2Y9(q= #f&oPw1(9Q *78uzT  Bv?$YA=G^ 5d5Gk t";ӄ+  `DyK %/jx&O/Ct{F~_ij7oM~$dX4"MHR~ o;ڲ<)%H%a!I_B.̿7H]35MzwUf Ǽ>x0D*> n o\>_HV I;񎽵p'i[\9W涑U, KHJ9.w*}~Hwr q ), + endstream endobj 661 0 obj << /Filter /FlateDecode /Length 3173 >> stream xZKW8tyǃ7JRJ%,mŇ}iR}0C3]i]:hI6~]75[7/[5կ+].w뿞{c5]f5gXej'|vV^oΚQYm uLiQoFj9# &Muq°U~G6LT^oU!ԓmHBAW-S]Ek =ZUjsLJ>Zӷݽ߯ eLVPS ];iR\ǦHWk&Y\ Sn2>C1<(FsU bK On?,*Πbiߓ. gl k:SaCѢfMd:|H/_7a @gMwUl2ekYQȋ~4ך|8:ݩW `VϘ&R.uNBjf?|JFٖzsf$(^}Oщ%s#& ~NʟIPlB4\k4vZWC?)pTV,NeJN2#nOW\Lk ۶@%Buh6Փ:j =*=5}On cݧ7w:5OFo9knԨ@#gىfc/O:qV=Q% O80j*44$HSo$ `Qc=eW83ϐVɸ-d{@sdc$ lfC-%q%  巇iyUds}ꬣm!.c 0 炽(u Hs(+f:l5uK0B\d0MO^~*^Jػ͔ߟQqȁ]w_  C>hbme TBMQ';uZLH=Q0`ÐLr ^:jƦc%GG(R%֚ׯ;YHNņΟ4!~n-[MM(x;sqSFvRS`BZ؝IYt}iƸr\y=G 3ľR~9ь^&Pdh(l#[ bQ°jΥq57]mfKEr†Ia=Qk>lޖ'4FL *;+E/JŢK绠W7wPo2D839zid2}0T{jO -ȯ{зًZ"PP%P H]ZbƬ誵0 kj@Q!fejf~G~{q Xc`܍9BW#C O} 2WS]UjJ-8|O3Zf# :9lp1=qr1/ ; B)/RpY[;=%KE2p7S!h~kSe'xWe[QK5B_иܯnf (۔. xNl?%u 2(W&\i3۳ʂ~peK{ J G ̛2{yyj,E`W++Dq(pI^d2gKO!}p~R ~-]~|9>$9P K"i/= BfF Y v,PvMnPh.įFRK]{\E3 zp.?oڶ۶K4J a,z` òGw!Iyq`XQ@1i04{Jm(Ʈ`Xf NH_7&2X 1rs<ʻt80">w _xgy<+Wq7E)$x,?NK&6 x'fNEэCF7E~ }%*bY(L1/ #-ޅ6h ">,Xw'|CTpGM^ξ{W?endstream endobj 662 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1513 >> stream xS{PTUw"A\5݃%"!d # (jٽܽw޻Ț5VHfl&lzMeef6уrw3]̜{|{I01,ˎSDw`fƞ)qH3c" -iLJ~ne M'$'qR۹㆓R?Smfum̲3+{(JC̝;UF?T _BR-PPT*HO hAqɓ QfaQ*$AqPI2 z#H0dF#K^QeIAy*r#5$xhuH#%(*#QE~-ii2%O SO4RdR*UM(bHC5Qrk1^Un$hWcinQR&h1JyE5pG(/ )b\BX%Ml~ j7֕Ux/jʰJ4m ?#Cc&9O)vWzʔ012y)gL3q10)tM&c~bVi!i32+] '%!v鐭FLt p5dG-0j^ ~hɗr?ß$YO EcUӖ04drq1#vFxkFgC+w68nS)A2~T~l;?⏬nGM-ƮuP|+UGk侞>,omzA~ge io;o7ڻE^ܼxc2=u?sz8_:ix~R/_9|v,ď E,AI/>cUܨ#ֿpI~K73,!;`6LM28P<_}ۻ[ۚ{xmN=Yp 5$Y#9Br,_r5@5_߈_ Ćg&,1+$$t _ms;U-f]mBq'n_M_zf߿~RsTv* b&_2!cy _ńq@c|*7W#Yk5:+Z9HL-) ҷ'76"endstream endobj 663 0 obj << /Filter /FlateDecode /Length 1643 >> stream xXKs6I;&7gCЉ;GChIRCү/RҸ鴓E`vqN6fq\̾?7VK-/g6&y 5_lg!HV&Tf!j&E YDF$ E(F &SHJw2A֒_ܪ4W%y[۲~Xj*(OMjFla|XJ6J(uAXqn gfSQia۶~s d'4QdaUK5d<(}5j$?.mGm4}A鑺}YǮy[^OylcjdnX="|uS=+TmKj*cZeM6~>="F@|9yZF8)h{u?ws2-Jc[$ WAP/h#ځQVbQ@*Q_(t {֝-* 0w?=wT HGv)[2<(UϵVX|ZZxytǡ&X_/#+(i -` L VO_%]/+~KW9MXHPKJ*kgPuۭg\H.==/ !iiᆙ~L ,UdE rȠDxFʽs_Cw|=G[ui{:4(tP:(™|;UzխkxjZf؊B)i N:]LgKS.%QlPjbJ`D]T['pr?󐣑9Ж4ޒabfLQ/tendstream endobj 664 0 obj << /Filter /FlateDecode /Length 4064 >> stream xZmǑb|~Cr@.q^r-1G.ezIbzzz?j҃ʿ;5N3w(<~UpLI%=xQ&I93'l\O wa[;|B`7ira7'c\zkL0S~ĊMHDЭ Z!0O.:(4(^T R4q<}woiC ' :yO\oM*yhE z!Z uUX$-D@<} 1OvG)|fqRO66oΓti i > N3xbcдxQ%UCǦ<`)4a1F+l  Rz!aS[Y;=fu!v/ ɓe5ء$\|+{s &0|@n?&g3 H4RZa;4)1XFW 6a-62M+ċ).ΫDв_F#tt e 8s9P 4+/TVOᰳʺřTŃ* :sk"# WS`-mfE+WML7Q$ TUC ΤN+:(рc0i!^x)8"j6q~0kCǐ+8ҡcD ~Ƅ"zܢ@l0L娤4Dx( ((p(@/ f &lB2ҏXBN )$ڇhXln8Ee[ldl"!^>NX(09ƿIïHPh ZHdIRUÇЮ:A 61Qq6- M+U@}V[JǪυ t܏ Ќ`@h:`p/\3{`P)iZ!^x)886zl~f>{"y-MP4HJ oqy>nu-(py1I/_]G82熲o84`R6pZi#͘*M#4DTӋ ¡ jmdV"!^>h8Gˈ/Yqn)؏Qu4q<ȉTBg ߅E,ͭLs+/>( (l1%S-)],f5R\o|A Cš^h*!yXbgF0GK"wns'Ubָa4*m @U>,&& D'(r)Wx JGELZ4@DqEA Z!BpԯBӊDEAEF|4ً˩aol ecQpE,nvjͥ>iR3SYWivT[%p۳]҅C qma -^epGY/3&#cl_n}Ξs%e=_[Bg2plNM4܋L.wE@|}C#QDV9K@ KThF3Vj4T:`)"  ZiH`tҤmp(6XF 1ʼF`٢-i:0V Ň*!^>pYJ$TLeØ1H^)+'DO熔4 aPf2܂"$NH5^Ľ} O Gc\NwtϨǰpf{%'XIEp3P7oֻilO}SaH p鼬&\59.=;NKFwQb}܍F'4O =n4|\?I#y=Gۆpa-!WgN%@1KEP6.:,aE Nie'CK;f1? qwga¥m]9{cp^DO1g7۷cRF{A-E3e\4)\߷_dKc?僢]#|#_ř0n弱 ݩyjR :_ET_ 6BЫq~|:~_mնu}^ xjMZ`$GbjMYx\Ü9NnT>Q;9;7$o'vKґ茯WA/;~.Sc&t!)Ṭ)Ǒ9P H3~\D2^)=X,g4B}Fk![8P% |}${1==%K^za_6-@/bٷ]!NܟdYDue _Z8:rF?n7M^~ܣhiſ5KUMg gIv>SLD/B\o%)]q^sId+86,WM;?ֻ<6~TA';!lE:xB.WU<=blzdcćZXɂ͍'=o`e@VfռFmrDccu[r\f /z9#>"K.G+T[S mɷ\,n̵wwZ~#cKqvZ('>R#Y<~̇;]w6ˎo{Ty/8p>ЂdCXX @|a]Gasrsw2ض;uUӻ.h2>^& c ڀLyh)yil{D{oVB!&q])d:@Z~.cH dw#p*vwۗdu. ,%p#:\$XKIeI߸%L楫8ԛ[b>[r\Kn;nJ-^>M{IHXt{`9o: pM.СěU5~(ߎ8-0V/y (.$߿Es*=SSISP耔x"щ[s2iTHsK4HfQx@JeφDuϛUl? unM ~W/&׿~{7w:d閇=7$P\^.XW:N-\Dy+jh^p:Tːm7xF<(io_]V wM`MOI@`ǫT_Hn;]bPp_j{;˩;϶ǔ ۫W7 s־8m_ Bendstream endobj 665 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2552 >> stream xViTW i!ЖVAP\ȢQTYZA0DQ80(& 2@33j1(z^gμ53Oz޻fMVb2bt ёS}ILS΢-7ߗ b0d1RN!ɥ-@5Z=JJӳV2evKVjB\N5s 7UToLZB\JM^2b[cRtT!)i*53 R nMMӥGFE/Y">8!deɮT="*ZNS+(* VRՔ\) 5I->(7j*FPVhlqR$#%R97IM7K6Ll JWII0#~6reEͭ"c挹yS4"=(Z\7`G\Y|Ԑ`/Tt6X8}H/EަTTcZXC2E;O Td2cgeJO2B CWy-:=՘~Xӏ)ϗ@: AM 5~v H:`}% ~O뎺K!?̸i(< ;XMx Xr]ڕ,``/3IwœaI8@f٪m`o` ]]qM"Fܢ;)a_?)7e}}jDxOk6A=jYo˚ZnwT"`0Ik[4g$ߝFQN:byϥK='WOCQ Z)&b7 ^@6$bD3~?tb,;T!gʽVt.qӶXgYOf`_. 5o~7l7:J i*-5~F?Y? ;h\;XkO+K+S>hQ-\a y=S-֐Odk#5AɕmJxUF }cuJEhp ̐8A>xVI*Yfj[*t'ngefg UeY9綀l" ]q0U⹐{E O9[wD@ِ_١cc1mZZ%Ő /eUv>Bl&@#p!nk0mQW4.'.u'NK$p1O_(qv?FyTPtF[|9KHogp%$0ƀ3 ِ3dxۊ ֑LYA i d Qn}Ҵ6׭e9Lx1^ #{;+dGlJ Ehmw|wtFyhHAKTq (!q=)qKZAMޤ `x+$?Mo[;tx^&!%X{D@cտ'qu/Oީ{u=di8I۹h,{\~AړώxZPΪ»M,@ &b1\ZQ^,:8h؊ '7 ZeSz-RBx&<< <ԙxy϶$$d,4G2Ns0D{au=Z?Нm-EnRv :8tv~*J@ڬg@%T Sm#g;zAkH&oD+ȉ 5^"G~,T{≘m/2khe!GI|<}~$d̖$AclysaP!b? `m|Hl5iBn0lB?WM`ɾ`A*o<-ădcZ= `%K΃ |`<W`<&cΑQ0rB13pCDI5%8\ AGcZh.1 ذ'+ Y*n3!ޯAIx20@чDŽLJHxBצgMQ_1]>5p0-$9#["[XԂ'O=Ai-4݌=H˯Ν7;acGXuD(?_ZF.9k/SS\w\^3{nĚ覞l$E)-SMewMI|@att|a^'iCMl5h?L7+ JxOOGuG=ﶆm>abW5@ VQ8VR&l>{#@\B|$Eqendstream endobj 666 0 obj << /Filter /FlateDecode /Length 453 >> stream x]n0D )KMc/%E(*!8}gFu=gYÙ%y~y.}:ڌmYOrKza;_ۯ[m:mxޛ~jmP>otM)NwbP7,q/9$HR3CۉRJ"!P5[[:ЁP)] q V׾ )V%$ 3}H@fB>цV"֤tΰɲʴ]H@̰ɲʴ(G(G!)1lt6Ά̆'C!)1!)1!))hq {K9XPM5na08FTJtq5r6rq5r6rq5r6rq5r6r ȣhjlhjlhjlhj'xw&^e.vU~endstream endobj 667 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6487 >> stream xXwxS?X9a&%sA Bh2$eO1)oٲ,ɲ^-oY ̶\MqɆ&><yP#GPUW'3ɳgؐ^Tّ9#"SbAujESrwncb`S <΍G1Ζh%yaz8Y̘AGxf܊䬼,a\RnJ܊gƭ+& IHNKۘ5nSnXi]?\w?MI&Jٓ[/,+$%eg$I'%g)˹[oP8IG,OY6-=c0>3+;g_>{L0cy$K=EͣS*HmSbjNB^~J͢R˨j3j%ZMᘩCT ʱqqQYd"H*I3ft͑LlwF=?QwFWyṋŌ;<> ~KO\G<Go>v/Q(蟴c[/|/F eb`j ϧj22kcM5` Z q}~DcY u~h7 @ȧhY wAWM#;* ɠsKUP 8dL=\0֓C 7!=˸hMغR#3@Řϫ =S43~;rS hݳdb9?e'iJV",]ZZ,a'Sfͱk|el :1_q1>!v>דz;~d7AI'g=f#f"psC< 42&o.0WBLUlc20r (feШ,R؋ܻg;6 E0YʭzvȘ݇Dod1=,iDjf49+ĢrQ Qtۋ/^#r,AbhJ߸f3擮p^~k=oD]euZ= b"}vSLNΕ3ER* ~(2ixW8]K5yCYPFvg۠øxlaFg4(Wvձ&ĩ:ȶӦ&IǜTTFZ$~)} LD#ٵl-B7}prԺ-hK1- fR~jsh*W7ѱO5!*9tUWn3g<'vXE0&]; rћRO=Y([PAbDCiuX z美=6bL}_&.6}]"{5Ģ~p*Kj^ ŏ=Eu7̆R#S/]4mDe8j]dzYaSfC آ<$ܛչ4ܬjutEY_35tof:N'-)Pil"URYodUu0V^5[p¾wZ$8=C{j;ݗtq_Mfv8W#X.PQTddd >=?87XwR{vǡEmx^&\qOIJOwhEk-vD%iNgҙQ7wPRT>Fo|ޫTm2hMLfB")%m$Jڏu,O_\Cn9.(\Y\\ WmfXٶ//׷jWϖ/KqlꌤDЁ$zGx/""@Dל6Ɵ֑2"^}TP۞-J;9:#h;f07ѩhh/֘DƬ49 Sq̪UiB-f( s}o4MGO3Clg:A0fB0X=>KhY!s>[Ff<0$t IUS^m ݯ.V#Un(ϨO{IUUil @?!FlK"ajN(]6yw% zd[*qfmƨw"=Dm{œ7c"s\:ɤ1 a*j;϶=}4AWY0Da.Vz't~bv~?kc(0op"K FmixJi&qXSv !x> #ëMj=CRRP^k2^sDoy?.|G/H~ z:]!Zw|!ޑ{drĨ*_!2w]V|Glke~((u{^fZ/Ԣƿu?_p}f߾7 UU;dHhPeW5Ly?-[ȓa΍1.DLdp 9*_n ΐ/ K`vn׏yY9 j'@ LKGVJe((K T0MGy;pN$.( $lm=$Ďjxm8~ Зz/CtJ}C tkw^{Ch4ӗ.Z#{gzǵO{0t0_?eXr!\"AO)s װ`; # (L__liz&9aɯRRDYI?Gr/ K+2&i,MZb/Ԇ[[Yk %E_зf_ď1k2H "9ob Yt'c/X4Qu|BWHy VȩUi {! &WcdM_}-5-_^NX 1Oo‹$hӗ<-)y5elV%z f563U̎=#q#IRs"sy>GuFe(=j_r2賯^"IA>$ln J Gǯ- xhYc<l+t8%tO _y^=]hfk~Awo]gWgK7QnbN_D5f*B[wG.% @s+5ɶPp=7r`yeu3H:fiݰhw[M$fou {.A#NN҈ t@;.bQ+g?Of)ӊ&5 &5(ACOC<ؘGo\#+WK5HoGЍ;[s5 &~Nyx,1x.=W?2hf>̢õ1$nMYID6כ:$Qܻx.,|Fɶ-Άwxg?ET4{DeCYda:h/)]+g,Ӆ~6t%vxڜދ!5Sv~i*~YVQ;!"<_v汉##5h EחUgqKyUiu?^zW-&Y85:d<.kz\mZ$ s]::_ E ) RbK~ZIoE!6h,ypz:UѪj}[(tHm"=L@-s OͥW B0/,vg?A&1JQW4DH@y&Ȩ J"}Hj>X Fgku aw2 E'^4J+鰲ݭv'4Cª#Qr^St9\v;d?.^ ot;,%֗1hc.707WD 07> stream x TWǫiDVOOFfpDEY}f_ffK7,nh]`bP N3ĘI#Q'j&nD '3՘7|ϩsU s3B l曔botL,<մ9fB!`th!a01P ,`i>[tr*Fs s`WlJdEj\Ll+\/n G/gǷ#iqQo;osvܞ$#ce{:Gv '`_\LB8ALbjz8Y’ׂWWZۢ5kCܝ‡#/bDxoۈaIG4M/|œp EHN J`sf2aeѤxxE|\C(,bnݳ7[2,Z^#aJ 2Dѓt'KT 76k ^zDғeHF~R]%x32t\%bIo%$å> ep%}#Gp$]0\H[nàʞ$=յ}RLNJ - J7u1|J#Z+G,*a2Ոm':+9Oz&DM b"/2տ*UqKp\RJe4{w7y}:.]`8ҐŢ[0t}"'/p%Sȝ}*D0:1(MA[Z;oi+.jLJ^rjjkG\.h{O|8x"wП?=!˖ y/w)Vzo+hqewBމ#O##mlP2%S Hw(I;CvmvԀ*`KE׳$&TT2qXb ;ԙGjײeʎ+o~]> 'YC*^UBwjMҠdO#ʆmzP-͵XX5"~ Fŀľ,LwB z-|Hb P+(h`BHFCĴ k;ف166 ԠI1 OyS`BȹْBmIP.v|GG.AM"_ǜ@fuH_QuO ŠUcdpeŸrHYƉmhbMhP8o BC,~wA.oCR߉saK 4bP7"5C33~Z4? ôApt UO 0tYWK~|׭1|+%9~S;ru_sY>co&+_7$,M(aTU8`zA#tÄ٩VOE?{sgB/񤋪_ʝ%@l{Mkl61<&^&݄AwzU|[.I~dmv[:yz9RJR vs2vA)F` TCEi;-F0+)8 eڴ'\&A e 40I/}6=}t @^|ƒ-g?;Z1xh.WyotMuCB5hTLű@7)}y씦iGft\BZ܊,Q=#: \ze᳟\s=+|3d[ Að#}@ }ᒧޙ*MSj 5i"(i RVAZ%x0sT_rKbZ|no }{fFE42xO]rM¾Uf OD2ԼQ+=LxHwwa8C*ꗣMr+*1RqD3{Ef_B{ vjLNn3 7 ׶o=n1à]$M['+UERz=7b3"R~) xT@*mN1ZѸWśR,EM {*E{xht:MCw-˸/7(XJVO.E.L[ãQ5Ǣk$LPwVYOg6d8O5fL\N{?Bo~d6%^ >RM×._ص?H<=v^ǩ]g{ ~;_~l;8`޲⋺&ALi{0&"$=<(lb2 "# P;7㖺2eC0>V(q\xt>DW *N7&08F?uk&J*4\A}mAeRŬExǯ?JL)Gbg^'yUbw> stream x\I#uֹζu1l>8c_f0ȆaqAPۤD{Hv״~{-鱍>4["_ݰۛo8}ܭ~uw:ߌy{s+(\YmG/nws?։;)획L;nv8Mk)aݭ#cR5n9i9'ÇзˡXTuƫO_wg5*?db4y^ \fԣ36]|-V 0H9ipxO!eK,,qw=-V&hu\|4R{NGJ\F_ܮ1@W7|5|4cmyy"یy)G^6V<ݻϥQ|(b8XeϘaJ:U,9#qȑ;۵R@ A7V H5Wr\娕=r8k`}BD}I dzHy[UUTy ڳO<),.>,nKLiGF8#P/cF47qztprt8siGPZ4ٿ#:B=ۂ*ԉ6Qa'f6ڌ52'09' G16{(ʹ`=/3IHdȇ?C| 'fj}<~wm$ݣ52Fi̴R("̖n K9@x*`X^m6iSQ.lx5pVk`6ƄEzN%<ڈHF6`a<t?4*ZUy·]ii@ᇹY `xfLe\@H9 8ٜ-'>SnAVښӜ Q4Tt|Mml''t6V@e5NQDA[{?LVqj>?9&¡ #hamu1s*S{-觖CdɠR8*yo_ ʦwU찐ћIx95D OVc8/(>5B78&,RIѻ~\J =p?3uqBэoZ >ŕ8l̗͡?M5|DXP#_'0BFSgd/KSNK尮UD"oEpA=&0UAPj(.NvsB=="0ڠKï)<"<`'7pb6^ 3a7^@/E%i-_wR56S#9^?NBGU8VD!\-:9>Lu Vc~ '6}%ڜQ@ ®t>F|s'ӳzx1QMa9OT6$Sr nw3NaCm20jSH$3"JY?# $hZ@>FJ16f132Z0tOod׳̮+"-y-0T#(,'FϮS%c$RI&4?0cՑô#: >WgQJ 6PDB8y GĉD- ¼ɕ>~nSUdؒF $2$ϕ}_Qg7ޟdR6q2XAǴ$cӔE-4ZT~u^εZh(F%4%``,/h>lʰ xEoPqFuVBJGu$ [92ñ$Eq-LU(4Nln)0VGZEjMxN0 s} ZHOY-;(Ύ\>8L|A_K)T>MMpu/$RQ"ÇV|_䁍x ydSd^Yzb1+Byhmg`2 VI "U] u@ibn-*ˤsZL>BSg#{gZuB92:!~.dZ[1:I}3'rf!_+ Qniv"CK4\3Eڢ1(0 ->Q^-F`jAɓ4LƘy_âUn^,**Aɤy)PY\F]HUH6m3ꙶ'38SS1V]tӆZJ>TÏC@ \UA'H阓iM%) ƗAd[l8vWp( z1FM)Hqn˧˦龯`:N`"d Kp ;$$nU<'DJH;a M)N7_s㌝cAkY=Cjf1)-B?*x m0M!8mel2JWKs?%jP@Ô>PzB<Սrƞgb l^vUoӒ?&hl~qA霕$M,hX8d*&.u&欂p 2!ʕtATI ʹ.ϱ,aGz nBp/KCeeMMܰhRDRcJ3'SKZ/fGǰ hpz_,14-lm *Աv%4̀斒!80J/,H=\ li S&5\'w+!Gvr@sѬ/ȧB;6*[VXCœwxǴDŽhdNDuLnNQK}ӛ1"~4^C̐TUB /2ϩʞ3=r=yfM$8]Z6s`GMRq*2Y#=;F_()!~"Zp:}30؄ x4f q-.0_RT`5ⵑ L>r\T<jȰ_u罢gBfDtv" ۿd`kb9A~>GRsBJ$-==~[ZVZk15{Y;ĸl݀q*: BŮ;JLSJi`O&jQ08XRQ#B;AȦd_8(ڊe+bʠbJlcx|MxZH[7\Cpz?1綏6!5fRreV$LP_@cJ =KUeB Zc`f4H0 ծѷ`cC]vqW/q$QZoQ_WV7l/o_eCL&}&ڰϷ L*(yytYW+L8 zM >q9K~>= Dv}Gle '(rDW66s-[5, 8~[M2J$U>>9ݨ5b}*1oH>­ P'N){SW) f估f +dt4+ɕԉ%tn(*SW47jf,?볒>ր_,:E<|U_ !Vli!|[a.g.z+5mF/no9!p^2S괋.bPdV.Fl;b B .g)k G,yN+w!H(8/k{uH÷\Fբk|ǻUGg@rUrق WY܌" T*NaSkS7],⚲\l@)'ƤS'$Ec%[XRh.g<+%j|~h4]9UJ> wn-6G"^S7 Ɨrƨ̉oiLME3U,>.J2NZ j;$"_VbI+O^!RBTORTH|)? "u Vw ;*wx [9nME.d4,|H{F;xD_y} ˍ|cۛ$zo~,Y+/&oY>,/nۺ+ҩJ͏FKK|U("ՋQԙQx gnPx#z( 'Db,74l@@xUT]FB[ZZ~euYQO6ńv[; Oq1>w6.%gXLc7#P08/E ̔mۦjNT[hhpkW Ku j}*+{mKy0^<\{R%y"}7%obLi-+Q=7}bE.3 ^ޚvC8|oq<AŻ~zlB48^QfX@!^ 1(=w7hvi m b!Q ]҂KzO\G:%|j/53߱[bog-6Cv-k,ݔ_dr͆np07'^ǣc,'odľj"o*q]̡͹7nezI+ub]x1a^E}|xОۯ…IDpMFbn- 8O /'ݩ﹢>וC|Y@|9?1VYhZHcNw"k1CE^AaPߑ$>EJhiAWK;G ⠰zF|46@S˸K}ؚ҅Im^m4*}ؑSzDž{"8ZR^l¤1?oM|}oB`T8!5_i{k f,5M oo;hGE*,DX#yc@SpvZ6 uùW&`Gb!Z] ۧ>7]ѣå$K { -ÙuEW]<.Jf >x5 ͏Vu6Gb,x{.QO37TM)cNtN/V,H-ݡrӼ*%`sso"]<,gE9u6Y/_C`0ɪg`W]U)% Hz^ @*c?_.uF~]ւߴbPA蠿ʁendstream endobj 670 0 obj << /Filter /FlateDecode /Length 6084 >> stream x\[u1)gRypOi7dJ$"Җ+)*͋#3C9@7n=˥+Π|׫g^_ ]^wi nplu,[ez'cr} :,\?0 \>x}WwVu?~P°u~/zO& w;懿y<;m^+ OӍxz>Iw/&u#To+~`VEw?' Y8Ymtswݩx߄랦Cm:۞N+߯-<=0더 >EBO<ƛ5 Nv )8׽6Lj8m/D=ea&ǝu`o`㱽 znɵ]i@#`\SY@óF  {74SiQSaCrIX An 0X5䦁yNOe3@ O4$ÀT(N*A^%߿Jﰧmh#;ww{B0qĢ$UZ ǰ]mQOK39i5G@9ɻ' _:)oN(b@I*,;9 \L|0+|/q> Ip-_εC.J m<2XXSrxk<`*178+ h^M8ãuWgA_:N?g|G)W Ipv՞܄v<0=8Y,3rO.BO A7 GW)˽dIO9Jw%Uq*5&yf 3=,ye P[|h-, 19|ܳ0tH///tZs16gV z}32 e`rRɅsgE){g; uUHtj@I<~If49YX?ct׫*冎9,$ǻwާ|"4F` >Jyg (F=hr0p %a"͋"mqZe}+-zK@B}߾*ezm1}2׿ 0̿'*(〓ކ3ZO:-:.ΒZ}HaH= +Aax ucNi:/DZ ݎu.[ ZI? n\?>]. 8q m߃CcB.{@'-J87 ]̦4LDDMxh4JG  r#Rw(זHc˶捧D@T2O+\ ~؛m#L3kPiixtbZ h8P*Sg]͙I$)AߊFKDcGv7z&%<=E`9~/NqV+vW65I kD0E,zIN9qpz Xuex̨7 $k:AЎ^ >Z?{kù`l A!G<`ι3pzmoRy0AŢP9)..պ qq"8[B^*3c %3N}Kj2R-K3ٖEf yR :Fo4<"Zv> !)Z:G+B9HF9 1\y)T-VUb_znfbF8I rC dڱytTCl"0S3M| ղfrQAM˔UH12AYKc(:-P?+̛"*Da]/h+B_-$g8c9Ix%$4Ov}ڏۇXE>%fKt^,i9} r?ɍهX2P:u:f΢ZTQC}٘}?$d\$(?ZɡҵN"=Cݠ40U#hRKDaP׽̣ZISV^ (4"h%%2 #,S$Ty y +Y/.~YJWXc:YxwGAJx^ђ 4%;crjm%Đ>7Ə-ioU7)>cZXYUȈMcLU,j wuPNHyRɃX%#w7huGE([H@,t"oTQaD:w0e2&7 qo/'ڀWWX\&$>zyn1b3i"l-Qdy\RtM'0܈F YШ³983F4}]'Xa,` 6{0)-)"fK  D,tj0!Wܸ p}%qX?2k`MU,*ir:'u ۶$U`JK\.F_Jbpso5RC1֒ n^8\3١XQ _1\pf_fSYp΄rA$L'ԫ1~ j}4kAby )`LȁE'&40,M8^+OwhC<$&)< R=_$EkAu.D \(5*e1w2HeǑ\~q-Q6c GCjHM 4@i 8%NYM:͚abiR Ctq2f*U/!Va;lUpbmIOӄ1۰z \ah%E\]_!yE|YRt)@Xr%A H**A#&huNGދօ@^YfaJ֌Eed(j|*-O54XX ĝWLb@${OqPsGGg%ض qfRm~ԳO{ UQ_S,Jح&%"rreŤ;g "ZEɭz4xT{bG1T&W>tC~QKA.${1!;`(ꧢ̨aub̳=cЎj.jQ:mmvGLWeKV(_*dۭ1~>Q\ sئq:Ƹ+)kv݊Ͽx&念!>{ ƂyՖi+c)S4ZY,c[t߷ׂB1'$|,Ӧ{uΪ=vdBjmb`R9 dӑ3zjSHn/Rկ/wYHܙ m]]>ӽ0FaɈ @L'# lHiZ! lu@Hz!X8Iv&wq N2F%ib-B-PH 5X[Dǡhӑ 1;[˾<xɁ#YvUr~Ȃ#uf#“vrBށ.F8A'[]ijEرG oI$w: (}tU} TB}|O(Lr C|T=L|ނ،޾$$46~m.t1BZ]JX4#dT@cW@1|W%]zJэQr"?NQ,CT,UNND]wKUz=8!K,RhSh ZPʠ}EA>+h>Uf]oC/a{j X}m`q16fb ms.EZoQq.a>؇m2LJؐF53+дF{w )AplxoD$R7R eS*? '#W2b%YIMlܦf&Qh=]*3"0 Ǒ F۪g2=' ݴ^qi^վeϚ"$ ܭx-~n*o#nzfi|@픐FP}> r;Km2; ؏Vw^ :@ы02In.qa~|jB3M˭ddܜH.ͺQ|>aHZG{btYe]vY9`qs &[~iRIE7k]Ϙ\(7ж\o։E^ܒuiyXX8/'\*ӪCosg@EP+fC"tG# JjHv_eb6Tɚ ¡4xTȃ_1%u԰['6v^2'#+q e I%, `P7ae5J6.=/|oq1>Ϳy`@*UCx j#\N~۩=᠍zKvD2FOq%#("o}V3`2rJVcr~F N=۝PHsTZN^w6 D[P?5Kہwۿ<_KBuǛf|}9 6莑ҥmE#6'PfC5X;rq+ML%&HhӂhV1ڌL_{i]h֠?J,'#ӘA2/@ >N1>sBF;{z k1endstream endobj 671 0 obj << /Filter /FlateDecode /Length 6867 >> stream x][7vvU0OɃ[i{Oqr*o٬6+em&)k_sn NRzDz.߹_ =[ /հxqo`r{+[pz1QwB-nwymyrfeն43~u}#4Ӣ `tϮ9avCOLt?twV8e쳿^@{}ZtMtoV-ӵXondz5~[}} _¼64yi9L9~/k`00x6{;wewY߿JZ*ǀ۶߅Q`s6qv_'S+,ҔS׮[nW҇a~D\#kL5YO;qXr]1FCt˸K@`WWHfʎfC{-q: ! g8اjt۫]yUmcs*8V W3oMr)Ls6-˻6C$8E6IlvRWl-H:~pl\r{Rʓw ]g$Ie8͵f<i36~c.`Vw)eRu[ev4!Sv{eR̉Z}ʪB#Y~8$@ 8| {77Cvl /gGr.6 8!3Pk3ƭ=荱LQ8W}[ Urp9. ue\QIXYʿ3/dl}^׹g J{xqԐ|/"6 *9sPF|HM?݌z (r}P*W$.AWL^)Жl֫=JB*9Eɒsc*E0_,;:8 ftOHتk+QJA8;09"Ir4&.>'h1@-J[#=`q"VCnj~{cEq)|2T6 Ճ;:g7d7Hll/.v5Tie'}cv|-y9rO`$XL?n]m 놞+tv,ڬ `IIiͳDxe?0ijBUک5XqE1[gL8e?nꍲ G͜bB>`EhD&(`vDgWI0Ae .2 _hr.Qy.HtHV|PH@1 `m=gl9b@l 5n1h.y`E4^U#?Ih$2I7\l(hޜ#д6>S6U8TX-x0 gzDL@ }w4Jnla=./쨦 _p6 217T/Z]hwNj04xls͔NdlNtc]ޞE8E 8&RLȳH}rB9VpXʴc}il: Ϸ9 ˪X:i Hϓsi.'Z$H5m PNmUV|R_M5aD;=≂yK }+:M=nYኖ}teԠΌ[ quI@nnp&e;Ӄ.m/ 5 #m 1{8ݷhbty+)ZO8O\Ԓ"$OѯZkel_0:&O҉b8=}szP!܃u=jGsGC-nVuv ~AK>d y"Ac,O-g Ks]æ8hz׵7 _7J`T!~%x~T|T|??5#}Ԁ=P b:L a@p*C1܍9;fvtsІUh3l@|MG̽Qr; 2-G6IƍޫB3~h!\9פ0 mףw|î_c0w-0cBwe4s\}%LÁvKQfS児1N%ahA`K9SΪ>M=;K :)>v^}'%IX6ehdꨜ{I$Ĝqlw#pBJ[b@'c -ñ-?u6=ʚY-R]5Vi:J HfI.v&h%#HLG6_cfm -MKy~ M@41mAyX9=z>ZfHE7dت8hfWIhsh%FBZEf_MzsܗY%[`p_ lio`1C>#آP">6IU>t[w-'>V-ÍuKoޭ;b5dھq&D:7vvRk" K3|]`/9!?+x'"=2":5[>'{z =+yyyA!ZYu'lx* ǴDwʁkl8ߤMĪ7'C Eѕ2D~{!r.GL-[Z4 {4!YM)lq)B><7 S+l%G vH0;;!LK>XYƢOÖO:d,J S1_F.Ɠͩ v.F`<:ݒx<,/GR;(oF Faр6o?uuR䦊MzR9)}|UF(VvUd&-σWg'%s.|9Kq\9LgOi)+*".6Y@7\ ՟(IΞO@083#?LebW^<2okچ$o4DW8sćq~ L&p"W<Lp݀BZjALFM:?$d &zO9%x8DO"%fUvb[i$mw6e2Xԝ-xb۴FbQ⥗Z:̋erM*8WWV18|,qDbB\OX7]|Oe)Ү*Oq(4T.AfFzDž aq6rKz&V0\yOg(tˌ-(Q҆bJz&`ٓǓNW(llGԡBJ0msռr0kDy#grkO5072{^+cBCث4,*\O hQ.ȯ,N XcMl-@~mW/V}{.Sf*Y%>ٖݛ΋F/RI~w$r Sn/ K2~'eּpb[(1K|ʨs.C(fHQx[cIPV7MmXÔaɰX䘄%(|fr:=_]E[eMNóu8~:]a⦴U<%8/f5w:7&b*KRU&*JޡAUa^nK.~nXo+>^7}%ԇG7R1?36%1}0j4sؓ- hU\os:鸚ܜ}CdFlQxԢ9) r%-)Ȧ`xiA5 8AI7,c~,x0BؾNNu;ީOZPE igUd9Dte?K5W~ɺQC#WʽK0h#O|>[v|c69Uw[#s6Y .^[71vղCVQؼ'9(drr684ZYdq4J\?ӵJm[+BJenn+PT81d点Nl(9xOOQ:LUNZ`N]׌Mi)KͰ5E~ z2TB5@ K" l d>:{0zuŒ@B =EJ{l\Y,YqB4e}̓]} }ze6/2Ze%Y;B[AU`ΪNSpppbv._ * AMoTimf>+nt:.=2i'@/7Y̖x:]Vߏ^)-üNn(]#iaW8K!qNc1ۗ ,|zڻX̒8;;],@<$CiQHe1{f^;>|߆(2cVؔ'VoMP|` Fƭ8E[<.D›Ѳ(qpӮ)h2E6G;yjm7 /aX. 7Fݼt '>nOŰI]Qjq&1BfXMɒMf/ҘN}BFlcML>+?ر3O40/}i8ުϮg,ts#q8&qS֢Z䶈0obm=Y`߈ ^h'q|tP]k(G׈6Β Mcr/hdrp˩-7vg^ұ..6k~p͗BHb"+@/_4Bji |2IE Qs\@p0]&өR/2 )>ls7+/I>uI^\MI}5 TZ1>]ٝo&e\ +aC\vRԹ3n@C~Z=XZ]MO($v7=>HH.{C*pJTn9d0lendstream endobj 672 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5407 >> stream xXw|TUÐ!(8Q7.UE(5K)23wL2!ɤB$ %J]xZvo;D}?){o=iCrT}RӶ9sAO'Tb1Nl$63Lb XBN,%fˈ9NU5bO +U3jb!$% D1xxGC%uUc^so;nw!y! :AN"-wn'SL5><0)>$"hAV=zj[*q1\2)јh2]pҷnV~7ƥZoRn679@[|Mi~/DR]d5ѪTNL%m^vǮxQVl]Q#Iu)B4ڽ R(!_0fhG ,p1vgO-8n08q`a,f'=68[8 5[6pJci[AB˗`ьŷ0;vpH%|N!ls rۋoē: ivЈbwYm?kXLB : ѨG㢸@raw=rKP,ӈjZCإB+c(x7b%}I_c3ӊqz֪@KAgTTV j U^<;uZDߴP!?ԩA~QЩ1RJ8^ U!:] Kgeҙ;W$ '/~r{< }V~&Z,@5e 3ȈVCW-XƟ?dT(yZU mVC>T1S5P@FЃ3f\"?[=$Hp2K:)F7ƞ(axazzTKN4B{I+2u gnwQ zO)i6v6VCFphs%+{sP ߵ0u>1͚A>wpMZJd1yښ_Br0c~W]%bu6R¨IcQ;G;}2=9];pOiUA3r+ln]N2KN]P rvx{Z)OB/Wu 229oV 7l>;AxLZ&Uu#LK"Y\)7n[񡞷ڿxO19^\?kuN>gzFQ6:LIdH) qa``ͅh>_['f[-ƫG[lׁ߱8LQzQQd+[F]r0AHyU;v㎀@GIڴGmu@BuqD;=ɓ=-.RulHć1WhUƫ8n"%{s trQdM KHsr4ĜcH [9U`e⸲y4l/,.n`T& d$֩R>4SYh, AГ#Do36-nw+ǁ~J81ZFa2e{@.;HLa:@Y5cO'@|E=}zW0HP{F/tZ @ڲe6 eMv8;MyCf\N@l3>DS9r~ڏDu`)HBˡٷu&&tϥ+vӍ"e3M-fp2@Zz ao `7JAY'GXq5$ q=Uy‹ʽy(BԚ QR1@=,R {znrPM:Հ_T2wKB_7ȥqs1n+inTnVTTrOpO/_ I5fRUQ߈3ʠ.*\W'd_r:g:Zfk c7[%%&=Sfܫ"j2-Yy=cc [Q$H\z:z@?Ӹe~2Az/r# Pj {|ܧT_7u<4t(gh"Q\4SqԛXD(!9BAn 7PutW{х#8;VK.J?zRyFv'~=$/d͝tM,UkEX$C6SR6sXrse:s^qa ur%A+zusD)m&(reWFݩ8^{vG+ߎ{(?&G4[DB S޶Qoؽsn3Ph%ѽo]P=5(} &oae%#e(}8#iG7sSi{_|HHa Sfqk sq14zG1+[ހ5"]? >kU[ )lZ#V%'>lE-b2MM9PoA(cG|}g͏R!7>BB\qט0w7CwWZnm:Wdi 42y.]ӣJ[,'G4I&i4=CY[Rol)z@ogQ>CJ!\^9Uɛn}BV ʈg-3\1Q3r:Ru^vqAEAR\@nP|TI(ˁck|*>JzK؜*eU7o>GI~([|XRJFrC:ʩmbb:&7RoVav:;U./654Rr~wF;BR1fN[5GC{}Eo@ZmKE4\DÇlCEn,nA~Hj٥ncOI:Ba tkO mcN $NUendstream endobj 673 0 obj << /Filter /FlateDecode /Length 242 >> stream x]=n0 FwB7De$KE x,(ۗ~P\KTC9:yFC9+n?dqimQ᪨P:^ @Y[ ϒ(*hD+.?It@ŹQuD5TX\N֗ ikAZd2}endstream endobj 674 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1916 >> stream x}Tkl8lB U@`P``b yamoYbb}? Y(CΣD*m!J:6TM#9}|#<$I՚ ad0ϛ;RWb6?!)yT`~l3n*1q/UA NGIK$hq܉WyPfmk7X4%sΟ=[iѬew5ZNͪ9s4kMV)25NcӼ۬ڰrfE/mxuYߨ٬kj:Qoi]޼QZ\߬JcyAר3ZzEo2 ZsCe]v`2I'Y>1PMWzYdai8JH D JrDɓ!d'xJy3*ʾʯʿ?,ѯCn;=rFno xFn: *${g!` q!:0z-޸m]5@\15sK<ASW:O+zמ}h3 NP>ܡÝ=n @Jy9dsY;W+`65ݻװr 1g3)փrϼǁJ!%T~BHI& |ܨ^B v% ;vwCW~!G$  I|'6޷: (\a ܚ] H6fΝYi.\7Dadm6y9,)WO9G#c7=z@b$#Bsg~ MQدoO;c.ɢLmpʥo}v؝mmieдro~F4u?и[aܬ<0BW<G32_yA^ BLr.a_Gb \ a{Uqq .@l8 > stream x]TkPSW!ps IEUjbXX)TFycB!GxBZD bQDNkjX'cÌhΜoffCXZGq`lo=i1dar[9|Zڂ '"O;'rғ嬗*77󿆍aѱ)2EFJ-nvtg`L&ecSYY< }-x /Z5kBHX@ G! s%Cq[ss -X*cɗvn ,(|Y_2Mz ]W5a҉ax*lO$؜5S8 Sp Zow—pe_.|Uq0̽)oqMDJ/1uWӘذ WypūLb29 '+ ^'i>5:ݦϐ8T)J"ٟ\F-FcEG/)d ,dmXUiSkN>Jе˝z0z:$Xe!T;$i\C\tiB"[9viZ'7vp;MѮ=GwvOiT3tlFJ+gWTB_ۗH~2l7Js}4پX@DE&0)<^>z H<ѧ0&{&tLSO1?bgnRByG 2(bɞ(eYH}H s$xZMu Oy莪>P{ 2T+{oljl-1)T8K9)E=oz fY$|I^Ie}LMI4nvא鐪N S5SdN% Wj?>t-&kq,'ᄎr@Scv>c09uOL?eJFw7Vb,~䆬~pagkzcc@F0|$rF %3+&>] Mahؑ p{p_I 6iZ#kAa'мA=ȹ0ΝA&q{1Xy ^2+$-.9LH)XfM;NSeyP].hHZ h٠ÃMj5h)myMQnĎ;bV ˧prZA@'j5#Y}m+i0|6jUATi_߱endstream endobj 676 0 obj << /Filter /FlateDecode /Length 284 >> stream x]=n0 FwB7'%%]2(^@Cdq޾CG٢,.חk6[s͎SV~56eSVvkZ=.{a<\|OޔKL|c9G8> stream xytSeoH(Te WTPY#HA*JZ-i4M&i6MtI7-T( ":q|ގ38x3qy~<,m ʒ(QHʊ0LR5f1s+m s;_:qXƊ'nL6 m33 3PXL])PWS~G.~+JKe5bDWvQ"zY X|L*+')+ ś lz*{xU-nZ'ua^BaP*2?h_vqIieK0lv' ۄmƶaObUjl {[ea3y X6sKN6L=?0maoR0Op^OL3NnfI/LԬL1c$C&ys |Aw&Yo7(BdoS ^ֿrɶR<۳J)4l^/p{WoTU*S \RgTM±h(%_9Lg40FN#J=t ;7KXj+ 죲/!q$Lߓ)|`1E{{-n&[/@ֱ:eWyt 2|xpeۭ!a GtB {h)⣛ȷˀ_MzRWv\R漃[SvgPg,ݐW.%WSہΩh!ۼ &H6mbnV*y)/(#ZBȰ/GwˆPX-.rKNNWi.y;1t4&<<x|nr?ExeB𮿱 T4:Ackht$;wX`7-Ө C>"Tv#9_%Z׏i~ ;pvHS^>ڃHΎf д˫YXP_ sV1aY_]+DͅU \7#Z>As9mz:{1B!cnkj9Ֆ&.&#WН &y|A!| ^k:()PChwk۲عsdDBD`346TT *WQ{BxWWo~ՂOЊ14IŠf\@vM.~Ƞߵ=u]n=Ez>'rwݛ_upqDF¨0T;؛m%P?לDK΢ыYڮt'y#OkX(b%_Ħ-{RGsUr# < jpi)u>m;K8 5gD5νXс` @W31sw3mm t9[눜=?WY.)J8yjjB,r{w;@ۘS'S㨏(ޠ<8.t4&^rwюh'EQZRI۝7q\73p x"I+=GLi (}9?>Sx45xR¨{+Ɵ+Y+'2Uwj+(P*t$\M#REdXvmalD^Fg2?]G>,G]M`4$ }tHMVRF"mh뛬x|R*z2\Ce՜^QB)j0Eˇ7paE,v~[GuHͺzYDRTUܒ;PVuXYUV}v ?tD9BF2 ϗN !^(sh oĖIJ;ާF桯ai|.-vFm~+Mj"mBbn`?qVfڈ6 }ǽ}薞ޟ38ѱ$:1??9,\SJr7rf^GMRwKH1]zhk ޣ^hKRWtupjof'gX`Tl~''h~UN?3ɜwüCyuF*Irs5 :$"#Hm*L? MÉޖ KE_.|ܶ܉І$:Gr*dq@k4 kYY9&z26Y+0V )/ Ʀ7q@tC ~8 "J} $QCfF[f1ϣBw30T@]ߨ }nnyz:t(4R49`3vn1{;pbBG\QvnBS@ ]@T4ZCamAl6YMj_a'q lOޫg?TUsVa+PPgu{%48L\A|>Z*JduGOk{'1K̬ Y~a1=m,}hirw{tzz;p3pİendstream endobj 678 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 334 >> stream xcd`ab`dd M3 JM/I, f!CGO]VY~'ټh0nn߷ }O=J1<=9(3=DXWHZ*$U*8)x%&ggg*$(x)34R3sBR#B]܃C5Н3000201012~_)Y{ӏN3~_Gئvkb_ޝ+ڝ͑¾lzٳTR> 7s-<{ 6qb ^;wq {'OFyendstream endobj 679 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 762 >> stream x}oHqm3.kb.HHBҒis[[msv˜81˰"p2M٫n,U4% Z"Y#N#Shb-}Lo 1a, Lm;endstream endobj 680 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1423 >> stream xkLWgY+tVB6ŨTjTPnY˲e {aeق/zK`gֳid{GdMyڽU+7Ve3ebJ8K #тY5oϪ LIrHM!/Ѯh{2!vTVigf.IOoj5Z]mEj&'#7CYTmD-ٖ./_>o˶i jmnNs׈yD* 2DO˔q_hHDN(!A m۠Buqk&PxF %Ah }{3p9`+X,wU8% 2G.Dw\7~.PN-[cc'nZv!!YTw[h^#& N# NĆ-e3[.v3v"VB^ N۴R R -RuD0Bg0'q7J.Й!4 F.e l&p6[0SIR&uk^C3Neewwwӣ\ri eoѺյ@eRMP# T9 $eoy`cƉDF? Clc:6|"D*]ISRD5 !ÐLN )=6_tC)e5MJ/N0KJ/ ԜHsJ q<[/vo?}PQD/N=ʠQ0Fgڎ]?3UacYhrѻr(*bhvrym``wrmD|Lu] {:./=n{GsSӥg4]!5V>s>~;f!5$~yxV xt)Rh>cmMB`JN\PFjb&1S$FK2KMH%LA笵s+tHT'nxI ŵ~T'^FO/&%BҴ~y͵II_p<8^x^ ?1Dendstream endobj 681 0 obj << /Filter /FlateDecode /Length 202 >> stream x]= {N hc d(BL o-,3>mq> stream xuypSߓ짇1Np@Rc& !J&n%d‹,d`KzI,I 4$@1mB ')aW:ϸ6No==pk3f1[fXEvf3g9l`u䙋ٹkVjyѪW׬X=mL؜<䁹JܢaDWC$is9V ?Q\vw?w7ܹNW#yM7Z] ^PVzʇL"7$GFCs%g>;o Np7M\|]Kk =䝤A\$Q9dipZt›D-:KVɸmHTtȘug"q$AdRb|E(R:_s=hǥheGC}[~D etz^~%ip%)D)Q]}-Ʋ;VK/K:ys^D%[p>Uu{"+ VC-wDn՛@X >a'4.'H ur{A65@2֕bF` ưbm tt 0$&oI<@ྜྷV6?9$o۶Ae~ׇɘo$ēy*sX+uJM3Om)]y^"V1oʹjh/m*m# ɘ-TBxK=N-d>:<Ɛ? +r'ah3%Ūh.}{}*-^&Ehpngչˤbw@)#I8M)IEk8oQi 1ا;'[۫K38):GWF+?뺠<F)&:u'sh^mH<xˆ'B&#]xzzHE뺺~̈zUO>S> .}Z4꧌vf3=]:ʳ~SS?1y6b6-6[AhJai֦EN q[uDK?Sy.yǐw% .e_PClv_neV6JqF6t/f8*ss*_.é9ܢ/[A(BnEj5 DR> stream x]10 E"7Hk@R \ u*C(MnOR%[ϢΝ[ču:{c5pm1}RqT/2kU#p*z 45U%c$#VzAfG@K|3KiC8H.yoVendstream endobj 684 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 359 >> stream xcd`ab`ddM,M) JM/I,If!C^ NyѬ9|<<,^+{ #cxnus~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+kaw&hNbIIfrjI~2.fFFk3[1|/{Z?jKKJvϔqmEu ~d!ucwV]hQ™r?~|8uB7-dɵ[9\Ğ{y_={&LY3gɽ=< ǔendstream endobj 685 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 402 >> stream xcd`ab`dd M̳uIf!CѬ NyѬB|=<<<,%={3#cxJs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k꡸a```Ld`pb`bdd} mUhwąc~<\*ַ{"O/6ܭx+6.-7wńM;CuwO͟!';-y,*F7Ow{x̪_l.'W;Gsd[%${S_Oo=3N9<ł3&Oe`踙endstream endobj 686 0 obj << /Filter /FlateDecode /Length 6038 >> stream x\K7rޓs`m8pC]!6J^;X8^Aᣥi6$E^g&*avTPD>|~Z/?^ū.8]o__^F3//#|j{ۋ0ؙb= x-WR;ݽ\ii9ne}{G+q|ѻR+xn߬/tLl?+{@$,нҚ0DvXFClϝgf⽑nHTo`r|}\qc`E/5\p _D k"(LȒ7i9\r|FVҥ_Yk==i͖vlئ=`T<ƘB o&]oQ$wio4e@ylb<@/|w rdθ7 }ˀ 8x=BkEbMou=Jqujq[F^yki* "MW-ZYaR86"8mIG~ӚCjɸ鵳5$.^;>5UB {53BBYy\W.weJRF6A-%++Q}ܡ% 7uTIOWiAwwSa/3hg0/ܹ tPf6ݣyf*w Q nML6=rRN6k r;ش` 7w6Ԋf!M0Lęr_W>X$Fr;Gq&DվSrJ&G6 Lhnh%'׌xJVBML @;LhON6ˋ?^wCta5xw{!tlV@ `ҜS1Ijʿjh]g!9X]llhLdqmkcWGn3 %Aߦ#!!r78K Yhv>og% S~pha$/;9hd ^->Ẻ@ e.ca] gPCcësI%0F/Gt [T<$b u Ό==NdG8HiM8HPٟr;f4v8Sw7hk x۷NjH9 0 {Od2.OqoU!TmfREI_ ԄzAux-,؀o6/?]J)q} 6EP89~s4 N 3@jf[>'("n# M,Q=!&o+[>t5Y_mti/?0J4iZq 0($X~#=t4J)U)0g6NBt9 tG) „;YX;fdwlVhpEkQ桛gYۜ_WTYAWQh@T䴺Cν&L(@%0ψg "$dB I/wqez?i{ Ip6##7n9yC$_yYAֲ:\(yDShw 9f4 ̏ w;./A v"Kw4h,"dys3N43*'pfđ-G6B}&ݧr q9{L̉ȝK[0CU+WƜl ]"+S!oea}p~_R?+0i;8ʁx_p?U"o4)@XWEr uc.ŗMnuxI + 4yM}W""]M lGr` ܁4TPUx ZXG_fz,AI Z `zE%ˇ`=gXO5)Wd"1s)CkUDzU>fFK.YaH%00\bÜ>ŔU l T@UhZҩ"22 Ⱥ k]AosbMsS9k5|X(=4{} !dݖWLsUZqx+ǀv">t m]-nwE|(o-CZsCD`H!4Lf-Ĺb3lGg%hEIO:,j ,7Md>;4+!}@KG?5㥁̣ λ.+$s=F0)J8*<ǩ(N ҩ<ꅣN֩;X}henS/i;M4gt+`U'A{)*HXL鶨nGi䙨ջw@Qń!/06lXݼisQ!$nYAV~{?6S,1{Srqٴ!>eܖSl8ƕgyoKJ^q+*y~oP^Slǐ{ ?szH͆= dJT :9gCG3-*(X}-A}SQm>AfCr EAw[P~5f0NVPlP@0I1#sG `a /2 ֽ-CQ[TWsJ@8^J@Ң/ދ3*@|'gר4=mV%Y_^Q4E8jj@[Nݐ>Ny'9Tv!fa~InU ? ;d|,2FҊs@G'OH%0TU2XdV*DT6wRs1H+&K䃰bmE 9,̀ Uv+cf!__FêcӺqe 77pn|5|P4X3Yn9?j~SEC:T,=gZ8Cdks1NRCXKpTTNie@_ {Nx\oਮo@59Y4L*N\+Xz!hYQfNsT}9 c/B,e-&l>atU&4˪xt(ҤRx5۞F*3A |:S:xlxd2EyRV9^h-q8[QKmciz|PpmIMAw]}8LYDK.)(!h=Zr*O^ag, lӂO3zOH-GO|B e"Ht T x9'C}%AT4Xhו'l8ayꛠk}JI_djm'smhh(WԤmA/2\V[O*kD6 *SW&cZZ+l^tHC]"A U&였u$ވ.~2`0f/.ɭb쵮/6)Ŗ=XyEF1uxH gQM0)G0cV{ %- ȭ,L"=ZD 8)mb3-"Vբb*E(+Un?N/ө)4NBQVðjPZ uxKO.锦+5#[]__WK1ۮlCW,Cm$k_ <.>o@^F&H`ބgRc^ klU]:4~ES@y\!(|b2ߛ3ƈ SV8n@{hwcVڀ U7&4:3XUY=ݣR @e4S3lmSLЎIM cR&Jb>%ж&nP yx (2NrqΉ<$D&- פNtt4 L>=sԴ}[t.U)K=5uowa +7Ptp WcKSnXaS.S`㿊K>"q^OR)4d`+' L V4%Rr\Mfi,2;|+6U%&+)WX gD@8= I0>1= q*fNJ^ä\WzZ*)ciq?YB)[nz>P~EA"Ffҋ)j\ptzQ8܄&ϟ`OlC9e~dT̝.n:EOdt` atG1{Θ8?p.x~rs86NȐVm=IPdpi[#ZߛC+ԏC6* !VqzރP cpm-jxpwK#> stream x\Ks#Ǒ/lw|*!ވCBrehHY~TWnX7ߛb?-vMo׋߿ua 8sEgPfۅ僳B82mx0jfRi__X1P04~Dй/*_;6}Z{}虹aq) 7ݥP?G^ui/IepI9hQ;BBrrTPꗏ^rh)+R!t&=AqUJ}’i݄׍rɿ[rf\?G4`kݪdx %%MKdL-wOߗ$CkI_M6,(8X^MϜoDXؠ%o-qG蚔A Y]z] KƺK8׽B`F&T;㵪14+z`W!XK$PHzP闻萶_o=`WTrXm#A?g6}8yDSO{[&!Hrf}&` Ϋ ֟cl;{ymY]yq@ 5PT$ ۸OUġ9甼(y0S6l,2f^Wsć+j}02e\-.y~*ިbY|=9$fj\d!.`uQ{ǁpwFJ%B,$~9c2퇧!>`G[}ÞƇ]zSKL>ZKsd/ITMj[*?3jB' OZ:O.iQf%%6e#8+Z֩ ({D2d"8ښH!ul)c.Y{'BkMa8JJm<]g Nk- *RԱ싩( g9LS1 zGE uX'&+e潇lw5zTp7|)po i:۸u巨6΃;n ?dyb~5h3쎞`[3 2fCvA3)gaCl6B՛lS*,.}eCA 6 pNvu4;^o%3pV:d e)̣VT y߿cu{ljλ Qbvw߻GI% s94P^"$ƦB'$9p8H0}ѺBhtCg aq5ANT2E$ 5 hf*F3HIs쌬JTI;J:g 3T9G*7 Q*x?KG+{ޢ/nh_NC7X٠Ы8) .]96Qơ Ns0`JCsw|2|}3is[vyXwKp@6ˇiC}wxt-o)vۡ8$bB6p5ɏQjKqN#r֐&,,Ħ3V^-E#\"A3vU EDIrws*cpKn1:HD'wc*x'J4B\$c1z ya-Ea&3(RZZL'Yhw˜h_?=, {!k|=wC` 8Z!? d|y ?@\F;tk鄱"xKC,Tu!dN\ "6XkX`-Dg '_f}$-܃dBz&遱LOXYͽ#|672O ȘYgӕTY>JX/nE]oR tYNs,Q0Up#[j=(K*p$ɦuXEIlj# 5D$9D2.C3vUt/Q'pLQn1&8LJ4s+tdo+k 1ܟ1ے"LE@n9BhЎ<χاxۧl͓؀Pᗕ5(plYg̘-5b%KX=7XHF"8{iVE{Nhg2hMk glb"DjRf95z*p.4l&Cd:P ]P;ˤSOe٤6Q='aωž窠Ʈ__*tQ$Q+:dk > HH$Ѡ9KQn4 F4$zҮDo .Il쭠!ƃ qA71yA2‡ޠF r+TT*X@D 5y^X08FĒHe,@P.2d=iWEHt9&b^zy]P!vKDzTcIVHL4v0Q.*d sE]7/¤ZoQr7X95̜xrCe +e,H@1BUAUNd(7nQ$"k9QS?aAj3ϩK7_BAN7{:{RCcx]>GCBY$%m'j?7"e3tξ߉l(4 pz+|ܑ= "wYyl K0ԔR8Wm .}dK ]!AyV w LM݌-LK*LCoy-(M=Y[[//vB،JL'YwqNVOGO 9)VBkq #ƺr! C_X[1j>^.Wa׺8XM0B+B}PZw:ޝt a- $:8G^z0CH`ZX2Lbvfk^ΓFAǯ P1B _ Ufw}f#҃ClF$eN )%B=rK2j?'S*V,E7 $|(;EpĒ5SX#X]&Hth>:CQK!o#'BXG酲 oL3>>m ?zAC^# p6WH lJ%T+F lt X-L;Hm2N/'Λ (na6{t{H py2;@{t!W\AgH&a*vKR&_%WVҕ\3m22k3PBMu7f8c nIXݭkPM3_DיbMrVVPJϤT uy!oi$$\j+4h, ڠj8h{c ME}"pr+kI8T;b>8k+oz]%uuF,͠Zg5Ygg . SHo:0 5Wk4X`-q4jG+&+m7 Hc=- ̎w~ty7͔)08Y> }!nON'[V^L'{xiS=f%OM@qvZ=ƒ8>O{bf8yH<[xƎo=n-0fL~q6sQx_um].w?;endstream endobj 688 0 obj << /Filter /FlateDecode /Length 5945 >> stream x\K9r6~^v mtI2|gg+ Vjx#JR;GU]4_ A]|ŃE׊u7~{&E?KI:'.?]ąZ닫Fկָwm'tz\lMvDsz! ]NYۜs޻yf{k?\]2v46s_T.2׭5W|ί7N޶Z)(+a撢kso_тn.a/ژZخQ V| ?;ޯd1\Xno+Mn'C]s:i% Vb.i1;=sط3)ps kl`p¦dm=~'Z6\|H vq z); 8K8''=η 7 Qi;54kxz-ao o $*jT7o]=?&ϛKem{"_nv%i<%򱾇.FP2.S"$pmf=:ݰNٔoG3OʔF#~'9AgrWg͚tK$C$_wDs&ޤ=L (xځ J R8|͘` ^ CHgNӛWF~ V Ba0zr@tGIR)Z+ER`ۗD8n~Ja>nP=JII*n{F^V<lanp-.AH[ ^FRITV U\78C\VP#{ɫ=)A/&6k4ڱ{$O6-'0'q^0O#Lt*k/xƀ\ N,B@<0Nacܑ&5Gpl8n~z4h5J0 |-\vP] hsu^8t0/B5E;W_(#8J1e솬sL齂TG泋ՊZAMPZ@kzF nޅxJ+> јz-/z#1 ?-`a-* ߗK uMj7k;w~ '0k$y{2ݍgE,zfde,\2FN Hg#v8 .timK.` aeŠD49%9>M)*9g>a8WVI͋=RAnBcFC2u<(K8yxE/+!St%)+4O-r8>,f$%)܂gsS;gHAu3`C.LD =]hXl6{?VI5sXD%Uu  rH|8tHShpbO|9 ?@?X ꔙhf5axQJ+Z:qB Sڨ&ʀ =ײR{/Au}Y(.y ērn›+XVTDmY)W8!)I[ )'?^A+/ А]VH똌b`= yo><}4\[F_\}#LNImߪ*Y7WM3l?JtGZv8Ѭv@}06Ӣ#RD'?BPZ[/EXd?Eʍ1=Mfj$Rw;'H 224@m*)#zSH62}T('L9!P?,5IOkM +je<߲x2(~J!=OT2 LjU0Ule Jv (ά^œ=#:|l2j"H.-MFBЕŽ g{ ђoEJ8ܝ@HvAQ@a7QߑWyuR3 G+~:|ђYs6N| oH SetTcR ^܊(Jg8F>@q!Ջ@S%0"i֊):.}3:z:g@YNWMqF yċ<$`>ZVҿ)2e)XnR?!,E^VYIa/2"pD~/ȃEwj7U&"p>K7rQ 缍@P; VWM]DI0î΁KPPSKlsz]nhb:Y;R_`R(5D7|u$QJ邘j'7@Ǔ&Hu RK{ L'p|ɼL~Fp$E7A=[hsA#/*eh>vތjSTg9D2xvo%ytIZ\fвUp@1)J ΨOAv=Zq~2αF9E 4⇿đK]/Gazb1c/s?Ym D/Kux雀1 W`(=40W)Z%ְ_uvv_IXTSFKKy'ќ{n' E`Mʜ +:ਂ*Sv~q+q mަH?,M.x_ڥe=E-Cʼ<Kg ׺\gr%&(T0<k%*_ES> ţ|S0u%7e@H8~ĪbW5Cԑw'zurB}[%hoBq@E#LEhle, +g…# fax :fKB)u ȔCN>@t}]M-pNO\BYӲc!hj <\*^{Y(Wj|%eXUQ:Vr2ZUDW"eMY͜6@zH"37EH=23yDŏ`$. WB80@}u"n}\j* Pv~%fxBqumڎq'xs0qX#Ћj:Bþ IOa)̖7ӵ,`shK)U*ܤ:#bvg3S:-˞mMn M442}i:E(?WN}A7Ib5~+χxwiζui.&I<2c&Cl32h„1Kg\VC^(NDaJsAd P,yB3tnH&0o}onccHcFmX&eLWSXD& |`aᖄڦST $(-eU oD'a x*3NE ,JHm|0F;^>WQ|M ^ӋG,D wB;?d\9˩,Q ҥ/=PaHW C!G+SeA3_ /I^N>V>oԹ (DEP+hN1875D:?YS SAa7Qeu"}aXdP^ICN-: o#YƐ %Ca r@kWPdPll XNOk#D-ײ>T]Y1矗.q .iCS qpgoXN~8z`m!Pd97ަM䣀%Pd),cu3Jpܷ|}V&AQj7{%CjBsHA_sA]^F>aeڗȢszQUHtgyU㏪ 9Hw5y5:+o)@aXV3^P9>1tȮ_KD``du]VG}ftIf/'ܱ~;Kd=VybKsD-I* 0EՊxPu!5w7 :EmBnZt$_}EnZ@}е<^q3Xq&BHN1qI? T_/ѰizܤG+R~σs/?nb.W;fT:dKWT]X2XK3.ZnߔU\Ԭ'UhӋFХc?95?lN8+xbYaLه~MHwψOpy?KD?,2󠀩p .WkTS%޸ߦЀ1Rmhsg~|۳s!nlendstream endobj 689 0 obj << /Filter /FlateDecode /Length 4045 >> stream x[r66sXΖ!~I&Ty;ݸ\X903cP&)cow %@up4$;8pos8wo7iN v<-:=;$<[  e1 ζ'ׯ_B,T~9ʤiH2yAyoUʢH~ƛ+%av'U[WΐT<=z$mWw=kKsNBֆc`fQ\%!YpRdH6CںHL'm0GM*^9TNKOfK`;;=w~aEr 5Rs05^Kc܈"yw{7J&t&/2YbmޏMs=/r|>j?|5 Jl\{ ]!*f{áQU0/kxɣ\Wq)]Ush*jdנ]b[ctRE[bpwѩG7`Ѡq|꜌y;cD7}e@ ̹Q9zI;`aJ>MGl'AkT>QxG% EMh-!09mHHCl@OCr7k̄+@O?Ǻ k}eyd2Iee5ժPv݌l WPdXG㩙:[BAeX%iZ5T NDԝ#% yB 6˜~ɅV(K_7j{UA, uj,7żd & yq(( <M(%m>Gvs@'J巖Hi-q 534pmQY_H ڇ %% aS5'|̸Bޑqg֩2 4b0i6WTt=fh#{xj1pj 6NEH{6Re!ʡ7IN~vF]hS$8@P BqsCڃ<3ENNl g]XrPIC׌Е@^f.&4r ޒR{7H2X,6嚓Eo" Ch!BI<͆GT洭ob̝h1Ӕ Nc5D@LkޏP yr>!Ӆ#/G͊~:$Dƙf|O;> ^B:)@eZE.wqJr43 ^c$ؠh/@մ©e) m|$4;\!QXFyVJ7Ϝ!h}d%@gY`3#<@fK4AP9d_`S%bZA?J5*4(S ) tfdJ%45FՐo-&n͙LyS$z W,Q fgwc@ vm96iָYWE4SxD+#dCO8 Єd: i|?** |pcks> ?) ˎ~@eFs]Fo(F.Ayo~Cj=CmzCƠra۵:f9q+ڲls[/_h kx_jT$Dmxn t& fky 1*%~M^~zk ީ@{‹ W`QDaR{;(5;]L5T߈*7:l10p:ixXEJ#!'B-WmhItfx@q]u_a>M^`XTi-ػp8_ gP6cˊ"BNaH67*MPGoP1FAKeL8"0;!c\scg{'CNj߮W6vь8?Z̹A՗<ÄϚ6uw I,}' ]_X/7KT=7uG#d.s'W6D H͒gw7 oF w+(b&GNË$U}hw ^˓~oo19 [$taendstream endobj 690 0 obj << /Filter /FlateDecode /Length 3625 >> stream xZsܶ~Й$)c@tMNxjj2ۓN&O H$GA$X,o]ƿ^]=u_rz KkWOBr|eԫӫ&ؙUt88yɾFJQyu]ZZ^{𻬼g/얞Wα0v~~wk jmٟ3CUuye_m1A}{>7\[vow |Ӭ7 gwZ{ gM ^@س-*o,ximŝXm" +QBx7M2@)^H5 :qH~Q'nS6L*X Qq0şFhgr{rugl ן7L֋`T 1.%wjXMXZ2"-hѥըS-҂ZM&g\pl)l :ɚߞeP&y xY^N2^NUpW?׶X%Wxw5- ^kU wǹzߓ<MQW^kAZXXxZK kf58 MKkxVh;ouh` H$p@68}C@+lqU*vE /;fw qfbay%cmK K 3deooR3Y6F͔fWdV5G (P hBf703JtPKGr_u?r-􅡴jQ4TGX6g\g-,6Q39UR3 γz-`:\ 7gU-${d} ퟝp(^uKD`'J;0.09g4"H+{IHEVX> Vfp ut8ӏZSdg i& 3-J UٺV@<<ϖ*p!b)n"_u57(,oY%"61ˁ=G_| 1H/~{ NE~ȱ' 93gZŜ4|ў§z;h>6~I)G$M.JGd&s3ȶP\TR>as2 wluEnya44AeخrЮo "jLen.@ |o88N=Y] tv81=U̓Z6aylYǶMe6*.'k'011C..l@tstD$!)vV>,:԰k\RC[-{^a x:d|27jp !>7d|e&ct`8)#{(pE Z6_6z*4(UM8B* E9^DM v@=ۉ~FT D/|x۝(Mu(W Hگzȶn%+m-I?!GDf7XvAI%G>mul^bx ,dE* [FC~Pә ƨPJax߾!7rz%#qcCq?oT3 ̗dI}v! 8p{ص5XB\I:6ݚh쳠/2/ŖC !:( B_Ce!\.shJ AtX-ⓢQXҟfxLka|(\~X y>@ɩN8ewGKY`iHGBӱ fYiw}b IE%phDע^uBue!I[0?xLfʩB$d?Ժ7GH))x+)k 0:?ܖD+ 5D.6T5R3}Xhdj?1f'4l<$,s(5z˨ G9Y*(PYP!5aΠۼC JK'+|lPB*\y"Ҡ`P~RcMC(Ga 9 )%o%2;EDb)#&,Z %R :#dV$3؝CfwXZ 9j|,ꖬ9 AJ,{5&b({ ؊M t/{BZQ'~U{ yVz, T):dka{bxqKzwM(! V0RQ,v(upLқq`  NP74D|KCd̖BRe.! KGb1>XNQ[*ՠ.>M}H89Iܷх{9'$҈;"ѐ2qH4ie[8TXeզuXҁI/?ՠP#@UQ5mu{kڦN_m+O5mp^]H?CƂˬ$cє-e,]<`Wg(}+t,hVu.@1`>0'TX8RpNRd[4e0x`st`s)SkhWI )Trnxx /[ 2M^tJI jw[ 33^皓Zh50$5<~`Yz>W?7u:I+r.xW:lG)" YV7vnt N[˒}z3i1<7g?GfKÅUДKjbczx@c`H4i^'xo1Ϋr:iOmg5,Q{^+*h3 nOi۾n㟍W ~8?endstream endobj 691 0 obj << /Filter /FlateDecode /Length 6178 >> stream x\K6vdLN/Y9jxOVx㍔jѪY} :Z .. _5wx$ ?/7ut#~D\HժQuڋݣo')UeS7θ~#]apT U]mF~s#SV4]d#T몟[թ*Y5xu_ U56^@6pDWb'#a!W1n*b!ipv鴆q!ݿ+iW'ɦ߱X#&!b`Vb`+p&n1CaGs'^^yn|R ꖂ6D(r'18߂$)mZ37}sP~cLJ/S1 v$`~kF 4x{Ob@sm5@r6Ќ*31Sao~eUCxgmf ^13'gƣhҦ,gbI)pvnl׭?$O2P} C Ycؚ4"+RGUw ϼed#ڥVrS+ ?;Q#?r Qnj7CFٌ4XPܿ|n!8p89oO^TXʄ1MXߘ5 a-}x_lurR la1H8p/l-8~yY^ # ;ЩgaHs~ `)7U OŞAZl<`e#y!mkB"}MQ.m*m,Ga0mc~C y+!4t',O4U1~j9oMpq{K0?94!?Z8Aн1ʼa߽[5 1rndqȸM!DhEjG%<3ȦfKg,:A }Xhq<ZH9A$@]J-3lX;Fixh4yHգ<\a{1S+rZvE Ю5sO6lLpVN(N!m66c]N `Sxsx~[_VvJ.9X6e=铬PȡJ%jxyfחR ZY6]E%Ugde)UCjcj+僀i<@T+jDLNgU2NY[wh$[!9|TJJ;](+ ߾*]6A'hͯ]*`)OhդsmJJ.VhN0,쵰6+e$r-_4Υӓ x)!BT% p>qÎ,b_$%ދK"S[#^ގ5 4(mAgagR V㳅o WQݝ2 ;A6S^.:,1މ6cI!+S&@2LY$ פf<~:P3 '5-%YehiJZ1Gk4{?&C z2my-ט)ʹ+"its> *BiPN|SJ}k%-mע⮀D5m8lJʥ?fUZFC"\XOqɛR>,T_gq! i2$_Ѱ6lz䰴y0:nD/*sL[ˊ'$ufLH|s'/U ma}@=Qpe(M#pDˀöڂJ!Yh3o$v6je| Y K:k s}D_FA|VFM:F|CK+jx?Bؖ+zl(jX |j|ņI 2 -,5j{hJV85S7gDFrK$2WTH (t.2$E7 GL.ɼ0_x뛳=Oz`6e=%%~ [5pgVWV?A Ep $Mfq8߄ox˽FiD>ҕ H@/6;[x<Zl-{A"4-63ݬUb rҖ{-gwx\Gn+!#ʺS?4~Oau WN)%|^0[0u|'$1km;x} @Jmr/ X \hIE0mt}RY9K}.W@YRdK *etnEvkO@3Yq.<nRM3p긊yF3ӄy+K?QH[5ݾXlrcl"]WKhcAQܞF[H*ϧ#a/[ODY$Zl&0AE~-ќ{7{۬>8YvMM}L)Dnq|IU`$@BdXsaM鰷t:@PƘ͏(4TEbHX5/+F8X(@Fhp[ Tj|}]Q/AO?508g_#395b_˧IOg`J0#:5d('R1Y#V(hMRB gGvO)55|#mǴ,& _P?JMU9 &Ru-bt)6_Q0CPMW; ,jm-r-e )y&0/ERh:!:=\\vhts r%s-w#Vn>"kxם+.jEV+5_S#>eݲ]~"0=383 <XO)6^O:3}&ML.Op(ƥgD8QD0e"ɔGlOlR~jOv7~eFd3!O6]XXz_^ w1+A"'΅{Mɽ[gGr>9I gj-^"q[Ji&ȪQyBed!>}8X];=%OqYk^`{qI:_a|y d:*F~usT$z$Ux82Az D-sΫxe#Zz*\R *VdqKL!zJH(9Z(Oh6/$aX~FhŞmNE-$X$e2[Hmq鯉lt:KzZ4ł2a]2ԫ5J=)!C̈ xb<㬿]mf_ޔ{n<{I~Daвy%"~+\I`Ava`ZbA6{ C^C\[:M$kOiC6ϻ2)W&3UVΜɋjC9~Dq\ʾ>FhHkkbx! 7aVش&uՓU߄Aa$F}{7yZhT),S^N7U8i,G}QG%uisAV:+qHxmq](RÁZ(7|!Eσxmps1&6YXyMbCtzB]6 Q`8[j#܀MҞ`K:fJ$_ ocWyS4ZHY_gjNߵ_M7-Bgi901,i `CZ݆ Lh漦8 >QS), }>!]Aڠk,[pǜW~T[`2 G[Ll&K֯whD&pF֞"0"5˞K_Ŀmvk R)?I_ȩ:_A ^TeuWw4w_ ɚR> g\̅A7R}!O(H v4Uqan护Ã^F?}i>[GP|]t2`.v("A42մ7%3}Evlx7"+rd9:/myk偻QkFfhtoYd_W1*=(pUǂr'B?c;9]?]縎kPd^@ sv\H^3λZ7WMȅ3K%iҍD8~_~ܝnԩ_뭸/__bDu\^8lLhAHMGpendstream endobj 692 0 obj << /Filter /FlateDecode /Length 5874 >> stream x\KsGrvimCzWiC+W#DC 0PofVUweu>l$EhkL]j~;veBǀaOB6c%S8 ,) ;q;FdVQnpTN R8%d|C`xEҀ"B , o4Qzhobr ^>u7wn[ ]P)(Lh-*ͻ_ly%Ӗl uO2.'cE CPpKe[v<1:%a8t0.! m ߎGy,t % ԏ`,SX8Uػ4ɚ hqIZpY׏l1j"Ϛm1F$R)p%uH6/Q -H`&f~C( v/6#b_M;43GUHT)܂2D7>IyLYGJ77J/ R/%<'y7S;t .ˀg96ARerSs ~'dK9< ;P%ğNx`k|Dyۚ໺a=yr/oY{Q4kLyٗ<*-Ym3~5" /#7fh2ݥ#(\HiA>QGFEl%_c8ғK N\j B8%#\' -E(_1%1D$˙t%+`YXrH F[LiF3nZ7kMN \4hXoU>"CMpzR`!ZnQ7* u۪8it{aES 32hB{V4u"2TՖ) J$eр$mq=<~@]0[Nx&E;:)eփ)Gd^ПjdblT&t2:w&J "+.(Gy|y7W8K_d)~ظ|+"݀f^Jx1l8c濴DZԢBU&TͦR,Î!# 7kHLht["3˒R"4XN&0\ʹAqP/RndLN\RVc18ߘzsWoҜڛm&*W1LO#Χȑz(Bh3W)=v-$(Pq?)>:Zn b]ԇW=-(\Y7Ѿ6;fDQ+Z^19UE*S1c+GY#ыq'l_4{26ӝN ׮xmc H`zhlMt fQ`ftZΕgѱspl!T7^tiW ,lVGyZ#EG~YEcӪj<~9V}/-Z~QϝnASyK}`& o(A|V/["'ۑ;W^^%~\q&fiT˪Ų WE~65ABLj;D!܌O y >Ǡ {XB]KgQ֯-X ]^Gn|Iy?oeUF>4-?@x9x Skj;ѿT趠|Tj_H_3pe/'M>%bŎ*x3U~y0dş<\& b2C1ZPhsIxbp*EDec,l2/\'( VJLdo l2RD3LǍ1+WߴIt &T#گ (=9 5dBd13~LNhY`e[\qoΟ6E- ɒ4P׷qX-lZ*T$szbUoe5!=lBo( )-}-PYWågq 6Ap=R2IAeWEg4Ph8`p@ fLo{OԽ{}# ;l]JL"r`>w+$sJ?g5ǧR-P+Êyl0m4azLyk5P@ |ƺ &&ڝ7b V9 SQW2@iEK2TV]?y\q1/\R=Xn b'eqR?"3:[z6R1R۟+':gendstream endobj 693 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 694 >> stream xQ]HQqXjY4"Ci"e$.!$j&"4ߓDPQQH?d>V >`EO#)ݻhhv~o b~%`*m*>Fn/X4$܆a①`=V{76IriǙFȘ89@3"8AS "U7RHЎ "hlw76AiSk4! cU,#2H&uMzND@C22\ d0!N @Ҕ4:`MVӊ+F0uO9C % bN̾yޚ^ 7.\@OZ#҈~`S|g/DG3o+ t Tendstream endobj 694 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2706 >> stream xUV TS{5||"G> (" B'XVFZm)*A~mUT>jZ&h"'5q7ZYΝ9g27hfg%fFi-3~aᠡP8_4:Eya,Ҽ?@ȴ񔀦n*NKI͕9Dp9wooo?&礥(edHV.MSˑE'*sdrYTrJ^Fb?&)rT z/{INn^Ă“#6FFEg(\fy;STMERӨeTM9Q˩*ZAUTGR j 5 ܩ*(/JNSK) ʚQ45C9(saNлfo՛iR Ϝ55/1 WId14yrg1k|2ڂp+TMO ؊+Ģ/Ċzi\e6w?^"ZZܐɼXH|G9!2h!2^7`5!!'-hP͟c'{uNC`z3?z۬~͍ʰ1W?WW 6 Z‰–Ӻۗ3%/'!\aV""<qxp:`aꭶzimvYƧ1 +U0i5tMk+zފAa.4t!&?| paT*E'sX"?v>.?[*zX:?NhF$_6lY&E/!Iܱc Zs7#~r`e>nK~&Ǥ*nTۦV|]MyG@Ѯ'Ǡ}9QϬHj(RCz 0PƢ =]ſHV 3`B:Pp2%m_\z2_죲ݍ'Su-)I >ǔ'Qݕ ]w(XACn/?~a6O (cb(:Tn+~q)m~̚8ǩl:4PYg+E|<|Ey&#yFg֫#WHߏk9y4|m;}%C+~Kka4U8q2W'fw& iv?ݤRR/;A|F Y}U,^(KJd}طdl2WIX5t'Z'}5(sPlMN+:J#Q-ٹiߏC\XrCK['Rg'JNry L(lQBWQUŸx#5QTtk.{~iT2B9$`eVdXpbbAs1nto=2V۶(}p;9jQݑjNk"դ?y@H=׶.Y^O9 %&7J2Es%"myց=%rotaO<3(ũqZI:`ߑCyIm>Dxi1 SZqI! xܟzt+! i(l]z.u9ǷINS ,5]TrI AhmUꋯsćߺ389о}$Q =P(6^%2,&9x-ړ,!/c,^ZG))9:qAT\.f J߂8ER F;VI GS=⡖OY9{Hjx"ɚѣ!=V3 鯦Z[cJRh6ȍvYm⵹I5pW MwiqZIBLjծ}ϋ̂翼4,d&9@{\_ %psf0_t#׀nAg0G\Aԅex4!L\ .'y\%[ 4mDQv()CFrsHŔ6e})Mp5x0HW]>|ACѝεIUP;wuĺؕI7 erFo >*18g G2m+0”ɽ\|L?[хiSTnw}w:9D_&L$^)O1]#$U(ſVΉ.cI6"Pǩ`{#Crvh& þ؞3)%})b&EZ{HԊc#7h^{:?z nr&]q" 8sʡ*+/|SӂF-޴Z"u[ ىg 9sX~I9z|H>v0^`[8X g3d[W \%d,q5yendstream endobj 695 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2229 >> stream xUwTSY24 >Ag*dD5&DL%xz!G8A X`3;;ݵa^<wνWMyzP4M{OUQf}hS1XKQSYeMiS?QC! <ޮ!D6ϡ椄 6|b3uĉv&>Ũ5 |V :-7h鳓K&c&Uej~^5ٴa|/ldxohUk-npޢ69ziU̼ޤ6di{$ȍDB\%mMm[DLQЩw\ysԘYn4dJo6WpY5zŠĕŪJ!˦7e>j3UVAkf=>*`5wilZCFD޸8',]^ޗ+EQ&tMV-4ٙsK FM%Qdj.5OPQt*"(%CfPj@%R(O*J=>z1#ƣE.Y&*ϋPn&T3Yq?Cow#[5U\gm7ΝplIL^Âw-FZfąRx R(/:{O 4V瘂H4LodE!rmc(NYq ?W"Colnm*:g՘F2Cp^xI6|_be "GYc co.(Jskd~b??(WCdګwظ\Յk:U(c <b0`7`F6x\ d4g+s ./I)y%y(KD33TTbܹf皣DقеRgETZub@MIvOvq-P? #~7yтŒ;zxOo6ޘd;kpm}/K}*bZ;X$gaX`\8ǻQ;h be0ݩ 쬒vQ]#l{8FGdP˂ԫ8NI ]ݿ3+VV#SpK{r|Ԁp 7Z! F.Rtyfzhۦ~7Aדdz+筷 'ɺyYQw2@iV</r-CR1 ouwsԈ/AWLDN`~$3 “`Ox"rn_u0R)Y]? ak5$l'/}˽ A/!.3Le,K\7RlEvbdd00#*؍*u;"Wt=VwjRhgPW=8,ڳn=+Ht+W|vq2?}v7=ޕIz9F C CAP%Kq W~L>0`knendstream endobj 696 0 obj << /Filter /FlateDecode /Length 3675 >> stream x[r+eu3(TRNٖXA$$l,Ac!J@X:3 ٶaSl6onÏ/?2mO/7~ rfsQm ==ld[#DV5I0Mv&/4+ٝ6-ӝyQ`.vNY۵neDv]Xhm +>V7:/Zƺږb1;u`dmQ,/VB-v706F0zֹQ[ƭ΋rKۑKk K(aqE@l4+fsy=Q$cen G2-sUJCLboN}{}{wm+v+&7Z 9c#j\\F[]PEW[_vavPA}4c2phvb ϡ89mtyww9Ims|{&9Vo6qn޷yu jګj3@H,( >̥1JtVm)L.-٪BH,i`*dS+sF(DaDiV(U>5F**Wv8YRFpd]a,5q4YzEQ9+z# 0i={wjds o2\4B*Q1$K ]uy}ۼn}N()6gz"*r;YϸFR< |MZA8}[~5BF+^0Q@]4vs }v/xP M F}D͠Tݬ on ՇMwc:L?tOUrcX,HoB3yT)l3˅LWRf2[r!5ܛDz\@3?b^m%rF \L.QdL{NN)Y /+8C1sc!hGաkfa mi nP#s@Qv OjHyί+t%Lv[} ^/5%ǎ SlD "7 ]UR!20)IF Li͙=P|ϣ*|<"$Sy{~G0TQ u,lѽD @AK: C4&A|k ;WG]((ϠlӥLƋLSXLNUƒ@ZY%|χh8IaW%ȀAՕZS>Bɨ>P" 4p LB= Uь*.)3a/iR>eaRS4Lt`sq): BBR" ^0 sXKyW`^L.gq͒0[`iT(ZR1z6h !P?Mck;H4̕a.+tDnpA(Ϡ}< u{J W M"|2t2Jy63l\B]zr ~T(fk,pJW\S( e* Ar (cLjم됯T~pS64N~m6~xԎ>ր0c ]SZ.'$ IoW$ )uK/5I_|`d@\jwTKz;ُgbN~G&.tZ+Mvߞ,Li>>(0^L~&1lWfI*Ȓ[H|Jfb{z{Tc=~)a7YO\*sYZZ#ٌFW}PU§UBvQ+r$is&B;r*z<X}a4I:\#t@^@ !W@gCMqώr%hGo xqFu6Ysk_," mW6 q!PdbZ9YO}%x`kH '~_% d7i?6[Wr eCXwqN-WSCOf yX e'uS%4ˉtYN ^3 mH{N>)yWat/~\X ,ykyt&v|CNj֭xܭ˨81%J4B5*ngĬ,5iUTqK]NgjwX5ͪZ֕q2ز9xrf?Fr¥q9'-*3RK_/3{{抈z?p@(Hz-}>Hoj<I `ٯ*"qɳDXm9zY~__]_!66Bw@(]|~8C{ L0))<=[t䐗 IStMNzW7Uw1t/L29hi57P1i'd07I[N ۃgg֑^fE#}#]GڏpuUp4VaK4ݺMDlģ':ゟe4Sh8Ztq8-uxf5m^r?$^T 1N2L ,qp=qRw%'pHR:`|9c:mZ]^9̟˩dU0NtrÜJaW܁}6VWs`@S&j8T =",fۖ='>C]u=>",yp@"yKYmBxk.|r`__\{~H񢹻y..@¡56}뙢0Jk֠`$S#^ Kkm̋۬Xڻ먟74endstream endobj 697 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1688 >> stream x{PTwp(v*`m(&h0Ҥ.wkݝ:):Q0&&QdS!RG[Di-iZm5YͿΜs~,R0,N Vג\fXj –wfol3XzՇh ͚)?.iF$~6fŋz~ଐsYYY܏kAy(8(y[ɻ THCphF(%x3ݼBr`Cw|*rx| m$3PH6JZ ґU HHguKI$m*{<}wx<^I-4#J'x%D+Z̑ + Ԍ<iت4mUpHkpri]ZItVŋSySy‡S)I]bJD%VV‹˓Kcf۳'Jն";Ya62f!Slb63L3Y,g "f& b=v17 UQCejM5p@΀i>@c@c 7am_\rj[ mVF!6󦖦@ @vP+Ƒd1' dCR&cQs͉ɥehl1!~ ijnO_]uđEA,YD-GH52,/eP]X+n.W|dl9Tht.#c);j {O\b.=((s4`e nh $Z6a(G\ږ]w9MJ^>7~#oޚI_ _jll\C>>q]~yJeϦ) 9wa Do3f6o ZjNn(8k܁w<ּSJ':ɔ]sIxPnɑiG?}?c46 fǺHjv2ѓiSKp) E&ARNZQ[Lf_}z1W~뫦*wHLŕV /pCsnY[ݸNg%nXP)?:;f]Yd>Q_)ペokl/.q,Mz=6+VkH WȼDss=_|1[ÔZVQ 0i+.5djW(mjLmp-TE41{r0kei * AT^ݑendstream endobj 698 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2278 >> stream xUV PWf"(#RFAQ|D>ɀ "" @ hwC²AP@b5|kXHeTQ3Q4maTM=={nӔ E4<+5>xHN 3Lª##b׆R|FALL+g|j@MD4|mFfAVjrJ>*büyG.YDy@RvjJ>\%gd*T9-xU\!HJMS(^៙%!,1i䔈ȴtR{ZIfQHj EQ~T4OP @jLQTJRn © ESө(9a2%.^ g1hN<= x0j dg˹r̅f"zSԖ=>pDk%GJΏV B#+igcB.mw/V&Vϒ9c?]fR<-8oB܆,PHR<O _K\W? HϛScڲm%6xHj\{ԙwJ'%ӣЖ ޜ%q`N$ _IbD5wvW$똘m~NZ~seI]`6Fw y*Өƕ5eP+hEpd<𬀠FzeZ}X-lON%-m?uQo M*o}DjY+q-uޫH# H*<6IQG1 b?\0a_^9>qNk`2Xh^\WJR>pB/RBQЏ(),p00 ?B:ۤ: &\Ť4G$f`{@a7;+x/}'4iSc0{_c]O G}zcץԧqLLf.`*Z*swIO mD@{{**."OEPn #Rm󁬰U] F0O06Spa%df dY@H=֓4sA}#?ZXq>qK`PFQǎOL+dE3ٽ~}m0lsǽ2J4)VԉQsdQyQJ-9_oEi34^QމBY&}޼ [)Q\׌mSKhveU;JVno(FXbH m0C"R8hšh_ʔ dR-*zo.Xzuc;~Ni`)\6:rm(sK'>E|ֲsЃLnK2'#JŶ chRg؋fOs* ?e7nE(1/!=W=pBQR3B5%eq 7AtKu=촯5MsJAm܃ױֱD6fvC0F"73A nm Y8K<˸kPdwJ#ÙƟ(`"߭,`u!0>oU,-*؏7)8ɕ,O# 8E!B. VFodbm9؇iݰ"vv Š{|oPa:x5EPHV B]qklŵ2`^6kr* 5f“cffO>7'3endstream endobj 699 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1244 >> stream xeR{LSW>-W@tn79 ZQ2D 9"Xa<ѡho, U+˫B vC61t--fk]s;|AQZV.X8/ȼ-l2.4Mfaq(%lLJ_Od/ȱ5 ok 1A`-qq &$%lD0)jYÖ :&3y *Xdgd3Ҳ3/!j&%?cN BhB=4(IhI;3"T4WJ$x oȅ8|# >۔8*>xG;޹tJ2Vh=wUj) sı ># 2el;>jvmPLX{߆4߭ovyN !mnj]+T,a9/t˿p%* l8|OGs{A(+A||sUdevRqtIyR짱WD+9ko>uxhEb:s临 SPG![hoxDc#\#}%ø&zI,ZtwA7R%-N sAr(=k7[ py8GWR/ GL䮲 -ݏkOMA1{M~kwLa%t |7uIXTɴuh-:Rb<9%͘nhŷہ2UTۚ6xk> 71U5vT.s!{~\:1C k+]<=3a FxfܮF8HƲҙX5^|L}"}(Қ@y:[kHӊ;H.<8dI wv8~I&MGCKS B^~endstream endobj 700 0 obj << /Filter /FlateDecode /Length 2300 >> stream xYr6\[T%3TMfF+ESIc G屓It}GdՏgxΈ~:鹿'QS2__όSF y“(e|>.Fd ebH!Q2‚$+1X&Z/%0f˕ZAmJ%nj- CV0MѿS2l5j=1<:hoW2L#&z;C,a _ WGRf4V@^i)5[uۻ>f]gãz#}[c}d$nn)p+(*ڮEucץ(ٖN3eqVv< :GϮ":Ϲͧ/Eߠ6mʇ j9nP7 Q>|M7Kg++g A?PxAŇ7o KBμKCM]>ׅU9J?';W0J*%rb N^]&xe+ Gu*'%9Lx§&XGO^9wGʺǛsu@0D v껦׻P~*m)V?]WT‡ޞ&{wR9_P?! z<$±@9xo Z9}6"ْ =j5:"P"J)OэP" LWed,m vK^KCk<%`KI ֩rLc!xNP!h XBU;^}.C6OEs gG ꪯ-)%MB+LVW큟1$^cwG8!3+Oltb976k 0N fd0 T@W D5B X?%W(<>5ꀱ5B!@;q;[gbUVYO@:x;׻WLĽ6CgЎC"j+h1DA:PYaHɍ&D)aзVܻ8Y(_R$=]"k75{9bwX/{7C9NN9}ӌk278Nwz XxpvQ֕ LuEXYEPxRƊR] M%qTIkk/H=Z>ׁ_ʼn#ytj ^ u7fm6:vXT6'7/ ݊* 7&} f;uAvL/ MQ1Mz'Hp& dLl:IRsz,CPM(ք_9S\io%9rWC@pYXNt7zTjlrʚ7{/O3A 3av.3矏Q`I6ݘޑio$\(4evt+oOA]Xn?O7g7oxndßvvȻѵ/א6V`ʾCKv5_4z~nYK GX}QfH(⛖0cxC ڵ6>u烍d|>i|i]PeW8ej; v6=6\F~=d;wk-nsg9>m!b#ܕsbHyUSEWm7* _TFmY^P+v=~!endstream endobj 701 0 obj << /Filter /FlateDecode /Length 21349 >> stream x[f^ GL)G1σ{vęy]>EHٞ_?Xke%R&5B6.9>k*<~^EBū& W||T%>Rsȏ^~9?}ꈣo^ZO߽'ZO_9\}^^1\O~5CO+x]O|[3J'~y/Ӈo?}_Vξ搞gSʯWC5 ՘sjRf9):k|]$<#9 c?AA )XȦG-՚|scr 9IJq`9IJq`9IJq`9IJq`9} yNI"=-4̍0kS}&:OqcXOR"PW`k _ۦ~`m?"=܆{zt<%es쳜5v֘x`%)xYmCf[q<6ŵ Qùp )5V- *Zer)`ygVme4;qDհo ^VDbQ8P5 X|{?طrR) 6V\G͋6ƫb<)s3X RXe4 =(įMX5L:[/Աy*9+:e ʳ9gG_E:*@Bu@ ̦<) Qyp { /9dMDϕ\@ŮTVFV aaLp6PcAMa` QùpŷQ}{$aCЦ<6?F"yqyqdOխl C"':T1/UR=W%$ QXDS)EJ~#yΝ׾>Kn};dni۽bt25e s(g*Yptz|."䭉2˺Ny@l Ƹ)񕓂]ձрQXXcp@]PT>ڼa8 S ׶ /-B ҭxV )哂k8Maz2j86 ~oSU^M~]+G:Š{ڴmZ)Bw6s}>!V/'(7iܐk̕N l.5; ?Ȓ-, d CIJ=rbil$86CN,!7;6~qUԧsas!ml#υ 0.,7.m/~07U`A摓)_=0 *5`6'/ X+ƢfWцQøXopq.> h<+oxtKhwʖuc 8餰l5 )m 2nCep.ùt ~o֣KWd@!¼IAo_kEˆB]fCW0 mzaea\, rQ}h1o},{ϭ.aO7 fgu/woȔ2;f~wՔZPGpV 煖p欝iƨUyR$1rZv ^fMrلʨL8(z[lj$S?U99o"**8$v(c71oΙWLe.yS NaPNi ]92P)XՓ* 0HuSz݆ʨ\8s` (̑-kcHWQoVV9VLeITEm ݆ʨ\8sPE:y12ڭ]iǘ[r>)xYmƂ+نʨ\8(H|G؂ise/<(Z^A=+8$p,$ūUPlQ6,d~9: إR,7iSUʁ.ihkdw`Us`ʻ̈́c8F ,w,ܐ.5z/TFshfEaj8҇fSkm΅c8NmP uC}vfVyD.+ٹJ>w&PcA ~"GXLW ! `uu#5VV^ω]{I)h`ϴ]".zqjWΘxQpBWMwD-AZ***/1B?)rpC`dy,[jʨ`L, g{5[PVp:ތjM r( D3\2GM0Ø#N V6PcAO':2* c-^gsM^~9F+{pU놚ڼ:flK7…1EzR 8wصцQ#0Fmү;uW[!&Ku1VFڛ6Ij5p@{J?2* c-^gkqB)-A`G9!t1Vp1`U9)X@I^NN۰2j cm`)4p?,F18re&԰gr^yTXi _t5^Z;yS>i!#ER !ymOe;FtYV9ȣbCb/ s&]g*sΥSC}kڧ (/HM'̟6?Ogڴ&Nۤ7/_~/AqSψ柾rr_7pG/˻Ooo'O$c>~! ^&v{7x;x^n܀2Y0m6*kA,4mȁ5 <dc0ōr!ԩZۖII7rBږ#ٖ#G:-G kYa9ZXn9ZH?;v.ǎpsnA!'}!'}! ??..ϋz` l"$>,_S:ݍ{b`αXH`6DN9'3ʌ 2#.'=_Qbս>"MNs ΟWvΓ ̠A7Z08WpNJ\O ^ș Ph&Л݄l&Ùt ^cSqlBP22  %XhGKqoaLa?V"L6@!(BTvIJ0ŤQ+TP QW.``EI(To ^0 Qצ@݆m.ùt ~oͯ;p(-fD_46w,S%]ŋVY E"V+v`10Ip:ֆl!r^d2^8T, cci$FVmq0F &d:#Ѷ~ۙy9UvwY0tz|"n0> /dh^+dQ¹f,yœ*[(wSP nã7\:{?7;ey`9uȒ<6+z(eWWnX6 a:[ԩjzJff~LS x#wc{76<:x1k#pzyPaHv\?ԝ=([(${SPnÃ7qۥ@z! |`U*WlbF}W:po *mxܑ`?oUW0_/3|QsLp"(]V7D曂wp )ZVQ&{dl -6phm* gY ,ů8Wbg 0{CUң3b8bXc sw ^0Q"`aګȽXƤB=x,2pd9 J}԰91}gXՕc7 <6 a{)6A&]Ͱ |N;V6ic^?bVz@)(,ݾ8Wj <: `7YZhyĥ8jN !Z(k( p.½[3sGlR2"GhRʼ6~vj@ʁ0&𲇜lR6fcM5z΃#8N RҖt!c.رѤB3qg#fs Vm/xDa݀G/ a+>5xyy-)6epω*X amV,uݙ7՝fb y !0!lqql Ce!`7(8L:[/ر+oGanb(gcL9!4mBM!y@xc(ͅc,½.X< 7;@q/;`خAJ)e 'n GMxf1IYײdC@ e+Hp:2xN=;aMAEVdk#pOvLǤ'!04͕6g#tw\lu ( .rX \K Zmm ϴΫ_S*oΐ 9XfڐaH8pVn-ȁuU8EԱ[߃~ROKI3æc#v`9ҐH8ql$X6bC|+rq!qQpNBZvGG:̎ ͎sWm𗙦JEyܟuCZ.oւ,va%l$/ep ^vM@ hL8b[qZLC n"o&4 cdU6 Ҧ ݆8m.ùt ~o6@=%mJ +40bSQXe lMxf0FދڍbJNrCnAr""O!t][X,Z{ԯ]{;o\Kxn)QfDIhJP(x]7\w쿙p g{a.!]*WSZ,)dg]/{p҆(|ii3i7'uZ=,Lŝ AZz\)^ܹNu`*좹m69&ܽn3aGY/س6,p\谨8喒v.D]9~ vYW"j7D1brΟW@y! ߜe)=,d"RjƦ=8sC)(s p.½Ro B]lf'0@z!4Ɓ=GXen/ -x1G'pz֫,1; RCАU&݄ǀn&cqmnPǰ0dN>0F a)hi^ #󬶗=zC%3zݼ~_Ygjs'EeȀzQpq`Mu ^XhMAт '\8(e9o])S"BS$`r@Xjb8 a1>_,;ZZ/fߢu"5d\=׃+e[Xj`,صB~wZ¤ 2GzY&P8(첥LXK(X҅J˰XƥSn6D<e%`OA6ȰÃ)dx`v=X g` ZL,Ŷ{j - ʆ7@҃''HIQЬ%_HpR'(9 \W6VX|{?7Za8+La), ]+|@M ē|7VλsY8l] FAi )2[,.av.0ͷ(|' TV`sLjz}/y|0k{!X Q#AWY?*m;aYCBƘGuRXeKޱ!J)(nl.ùt ~5j+]5xH m:hZ6_ж*tIO%$yJ3?sZ=wwz.7p koD{u=3uWu|o䩅54=nAUYZj- %@u|[񣾁",_sx~7?wO_{ywo*u߽+Cۯۗ}yyOP\[ůk2aYk 6Oo?{[C_~>aFffBMpC6ǟIp |>aC.4 p +L/30sN,y|Xh,폫>D|423< ,Z{>ȴȦ@9 #S^PL>1CɞaZQ(LQ +[{pΤwܚ~ &Ѧ~9qVYM/^hC_{'=)m6jje7D ȄMh 3G0^ffyF?mč;$) Q(ݾae0.(ad#8 XG,JS)ā2Ӷ_J׃*i7drh,G,2`;^ uh/\VfL_Oxek5BAmX9PX|g'0󣌎 2]o%);߬L2de>AƸ)xYm 4n hCea\8sPNHy<$ dL̫6ĝ D Pk{Y Oi-zǫֺ̈̄y;^[_8Z7˝iR80A ^цi`2* c-^܎j!󨆡<}T7(>F| Ej8IdM| c-^jrԈKd8SA0^65z\aQ0FLYƒ=4l![+?. |.cT&$k8$ePk2j6^V<܌A2}ů2\^^+mchm c]f/ 樽T<NΩzʍ.-ԩ|ʍRSr7srcxhm5)7΢Ww.$Ciۧ\֧x!.\xm/'?6$XlCb1Fޅn\h֭ܺ3[la)r <(~DxΡվ@g3L}Y'3 lh)ۀדL4/34v6Ơ",3[2ua;O=\蛲OE{T8Nj<M7&Xp| 7GoCA {BH"fW*ȔǟjEv|xiArM쟠\wwZdR谹 p"8%7nH5m-Fn_75A+Р kg՞ŷ9(e!=EccgɜR;wJD[a BFbx@y4,4p<\8j/Tݖȃ=8XkfQK.Y$c-#gFKP3SE]~aqi(,r*)@nzOnCdPof\:p |qٿ/&2ȠԄ | fO"$q!Chp6GS/zCD }5i7id !hKX={.a6d2!}SpB6(5,̯fs`)A#~ˤj.2|VM:u7s>t~54fL`\}m0{NLI#΁nBQg^OmsIzTՅA)BC7xod.uUZ#z-LAVBOڠdVG1m# '$* >λO쎄 [x/l 8rЉ3! AS2p9 nZ/$58Ab&rs3#N^eP)O=+Vgh^2q8MoOqSSKlM4B#5> t= 1!a3ewp$++T\W'faO !3=~F6f'Di !'e۷F'26#c$mӤ]>)rrdŞ2l$dE띩i Rlk/Ч4,ŒPO8 6x5b!S!&EH!ȥZ9 TSFBxt1:nIOEF" RjҊ\!XCm98U3gB  &PX2;B kD'd?=} C9Ifa\)VȧPX iPqnTzҩJLj6IT MW:U:^a,6W|)o{vt-ECrth%9]e6*K|4 92!vCL0S绒FkNj8"EF$x6%aG8t>+A"&0k) psvkCLicO=i wvZ tREwq= }^KgU\7/:jz.G(Wj}"W/EM`1r5s(ek-zUqSY'G APl|!@JF%ͬ#t֩B~;‰|īܯaGMA *p̀Nd(RT $CjR\QsFkw-h!M\, LNH򡀆gShxBl T0AC\L\ ,K]@z(vf8U:hN7酯Rê}ZSxQ{Rrij̮F[-rfQz& !Ktz8jڐ"AvTlxo`DGkibՊ//e\SsN>UxAxNلtq V9f Fe6hn r.KS*O/E9],\9Q;) B0U4/-B?՞74{bD}uHE&2HV=!frn3Ux(䒑dzn4] ;'&$۝J]^miHa,E?s~z9=v>ͯ`MiM'oucU.&f:MOސy>q&|\8R_ mGzp#uc+AV#zO삇 Kvojs_Xfg* /1U +KGIN!(U WaC9Bx1ḅ6Ql#,ǭ{JG3>TBDnul gɓRd &HUdx$/VP|WC*QqXZC8WΔAlqB.LZaCB*BДeBtt.0 ڬQDo賖/[;R]ӱo~?Oiݟ`'P(.;8 z ?lp;BSȘ/dCM6p峗]y$@O CxK uּl.*fh,sdi\ ;Y`ar˧YIac+vޏ66b_tAl<)b3KYJ6t |8zS%4Z "NB٪Wf°V A$,44 j$ĶK}W6]4oq "qTMDv<>Nlf&^E)"8K\C44)2U,~H[KP3%z13P}Xq[B@3ǹ&;D"+~G gl+g7fA[;d=,id%|'󧠫*T݃a)B+s%C?/JU'J2!y(ma wr 0*Q{_Ʈ փF5[ѠvE)`AWCOيo`*Ef? v!k$ DP$.Պ5Sܺ+qgD^a|ClI0ǣ9t3\B2lvRِP*E9Y,.#=̎KnO0@R3Ia8r: pJxGh\{&{p1B5 Em(;BKaTnpS5!r T6PWm טy$[5uu"k"] k{cj 0t5fsV8s&cqqϘl$%|5_ 䢥Gpb%ûYhÿ2 W<{EFF m1vd*_л9D=ptK,T'h>ۡ+fH`8<2dmSUé'wBnGh䃂Ʀӕ joNnīq%Ik% -0>f%Pw.RCkzY>(!=y (; Ef1>.02$V&ఓ{OA$A.xAxz[sH&ٙޤxԺ֖Z)p퇤nV/>SNt, O9Wr1O&+Ä^\w|ʭ9>Z rpUV<< b8 wZFɂ*(KvūQ]!uda$Adaa<08xXQ\2 axlE">Z{uyb3 ͺ""iG3Gl|/(emUJb,I%pPyjLM-\DyC7rPk Z`1@ ȗ)35>qy`I3"?vဓ6&4!( pY̘ J$6\QC%c.w}+3%`ɒ6,¡OOwDk% gę5]>=. qy_Q-%2 [I |c,$+Wktih> 2atb/>,&sd{ݼچ\ۻB#w[u>[/tez$gb& 0[G&1ᤢh\mHl˪(_*Z\!#bGeD{}*Jq=Celgr ɈA(^h˶&b^Gޔ4 ~e# \= ?$:ygc Β9`٧EKO. ;D=BSh^)BG82mLo4NKDmJ9()(1sLc(f(XWM?"?n(Y>"CEO̧^]En7R4ŝqgI68! 'JH0o#FAQCW-lD'mhQ-VрЙ(8 qW/]caDE}t-v^8ȵ_"WhVv.=(mC(H0?h;ټxɅzk|d9մpgA =Z0*=B9 091ձqWA6N%ΙiX@8yRUq};CptF P DYY98dc.ܻy!ac8d${)/ڻr'k<ێ4Vb>J9/lϗyI "'A\ G7hTA)FD,sЌ "lI F ]r&f_ [laC  !0D}Uj< $?rhHL]Bt߂Fb7~r1Hm hLھ4-l.jHjIr-JAE-r6)R?e7 8] <^a4G% o\rR+6KonB^nQ6ve xs?-?YrY.s-";=>-YZj+DbD9@Gu|RZS {77y_scj#M+AǦNAVx^"{[:ȶj, ~ͼW[.30dͭ:%4zN0bohhчj~ hZ~P֛7.\ {7MBkQ.ߪ)eA9Rc+bT׸37J~˝%L^4i9tgRt5J[atLdRJ=TYr{021Ic$ь ]D\Uo$0L 7L >WߗNrH~FceX^ &^slpȺ'cA' /w]9*~:hO,?kVHqSXeՆfBcW p.½oC'4$ &_4슉`i+t_SFw;长8zyfS,93|=;DQ2ȁT`@rȉDǸ3CNjF2ȉtAχe/Ksm` 4k~J?T6ڟ=5Co2Â)~CXy>O,ܰ`'c# 'sN! [Exi # $ 2feWp/ Ǵ|4\6?7_{ eThkĭ2{;"*߿[ڟO gO{׹n)U`C@h *AnFb7E4-gf*|1yeӅ <ʝ* pH׳Bc.݆o_m.ù4 }Lp9$!P( G%N>9Y'JS>,vΚuVX`,>amon^:x96s?k7G R񐽨Sej |}.Y鹭U1C>qe~xœg4C o=OhJ)H-އ>bŮSyH$yW RFm6{,Mao> _WlEB20vs-]y^Z&/^(m/wyq9B~w?|z`W?Jwnms$;//nC߽Ӛ~=}| ꡍx )?zJu=5U@9=} OWY=}˻װʔG@z'g Gƀכ'Ox#w_? _=PܦX⡳޽㻏{h9/?x GrCۏ־1 aC޽t*a@VI/-G㘕oBDX>1+~h4޿f]GF endstream endobj 702 0 obj << /Filter /FlateDecode /Length 5497 >> stream x\Ks9AoSh@<{DK*UF" 3oEײEG[\rxsb=7]Oִ(QątqH/I<"Vz6tnsQ|&|ų k57^+_vz="6_=fNdaܼ>3qΥ3fqDAtIVF6נ;~ &e!|90aaiNzB?HaĹJW,o1l"$M_Jp8.gƻN1ebG~icz%9xjb[P q52`J%Q_&l:BstNb[c0o8U0EiJ߲?3飧4":deNcBV ڰo%|IN5NШuđb码~]~J~"֜>kR,mNIw׀6HM.$|7 {,DyV7^mS'tMs֑㳕,n,&wQoyP~<ɃTfsC1t'#;$5_6f58njoNWZ\Bd" 0>UEVdbfQ6yRr #ɓV0Ҧpo.He@ B{gg@u #5&B.*g :S$l8'@>uxկ _ه"PAvoOʴk= Aj Ȼ!1,x?GFjWD}?.~؟;x˘\h2E!CcLdVD `"x1NnĶQ>`3Gۜ{3/*2)Ŵ N-3*fZ2%MR+2ST6 ϛJ>Ѽi8 t g瓥7F4XV\VN3")^KniRXmf6pWæ(Rǎ^d!~?6n賜N'Wls_7$a uU< WAGyr7d>;R_uQ7jV:,\<>D*1O8|dR&*$7;Y_\]!2! T@̒$>|9:lo}3uQ% KS$`ow&4Tus(̣S Lޢ O.:[P=CWuK+It_An/(D4¶(K䱀uƔ$x59_I0:,z,t)AP|Ib>C0?xA%鳾s1S9RQhEgw$.}Z"ˠuJf"?ÏΫJgMPAzd %{#^f3D;9Os ڒR:: 5vϛOqpZQƃ~u,~'4ui\˅[(7iߝjc-rE0\r#E֑?+HD(܏1:Wfc.r&5:IMZ1I(NUIq0`ߘN$_f\C+(cvFjawb3]SdxIJ:6D­~)C{ U^dPsz[ѝRÎ|*Dh8S;e PxaCKIR;~+ӡ`1n$a$j,U߅ٺNLh"8zF#l$7PެrJ 7v6xsL}:zzikpP4ZcC.L;F4(.6Ü**1S?ϥ?wR'V򈞦>Oe͛h 9MD` pWfooޭ.ޥuv$gAWWo}E:~{ a|xU U _N5? HCdԷVq065X@+~pdu7#Ђl\b[DXѵڤc'NH5Uj\ɴ )9;&|%{8EE?qTtx1~~mڗljfPU ^/4b}sW*\(UD& JнThPZDXY8W٠TN_כO4mdTs&Ƽ^QB7LHiS3l,ϟdkʊIא*,=W*b8+m;"F7r5A1:Ra&\ q|ɒ%:٬\LRY:d:O^uX 䫡#:Y)zGŝ7uPbP?P^@ #u,,n?t-aA&{20J?{K*h9`VЋ<?e2n{&d'[6BH=?9{9Be-#+X~!,}]J5 G$;WνaF=?3JQ B-Cb\8Z9@z Yb%Q/Npy\|\ݠ:$${] :|nW/2|#1~}L#-ߟ(:3Cf]0N"z Tt Ty +j`B*5Bڞ)z:P =f՞F℮U~ntU9)ڶ'8{<%ATrzPr;*ă /UMO؉*vs/*S-LbaQ)hȔՏfQk~.8,4B봥vA3zTLS'~ӊOS1>b(ov ؚQ./|! CLV jmIy82"#l%@bF-LB< &܅D]5 z$|TL:z@ zjg"@PoM~ַ0w—"p#n"3(с⛀jȔOD+jOcAsT:  XV'~+,l>j*ԣ&$a'_3!je]20zGd$pZ)ȣTZeNu/b]qCR7QRNHګ APo7&%5y+4wQ \75ƎLd0‚} hA'𠁡SY9K>NJ0^KYu$[V0)aLͪ FXA70;2]@}<%4H@Jn^Qe]+NqD+T(٦]1Mm1bjy ,NĪ`#VH#A$*L[N`# Y'4"-D2hT0w_@a# ߍu$9|g `Kz;ƞ?FЕԘ@Ejw‰A*"UgYƦRz1|Fd;խLsz1͆['hr~[9c5a$EЎ{4}}c2XGqDJVJ)IGJm\ H@!hJW)!!eP mx~$bgVH*,ZZ ըH]| Dk:lͧ2ȇ… Ħ l2&ȣG(Qmfgg; @3q/vg[ 1& sAkw.C/ ,mGH4*ok{f63EEt=I.Eř^k=Ûkܙ^E3&?ԾM(}j J{^(ޓ~W"lI˻1Ɨ<^ZY$0szk}$T:HL<.-3_i!@Fn02=yҲֿ֕9a9lRqKnJ]L_+Έ y͛w[s;ϊboI0SUՓIMɎtH f9Kp]=q78 =y/Xendstream endobj 703 0 obj << /Filter /FlateDecode /Length 4561 >> stream x[Kqo:asZ] " vh;!4: 3W_fYr0yT"+3+_ٝ0ObW ҟ뛫_|c5 Sn_-bbpMAjT; {!0Bcͻ?oWJ)x3_ls)[Bh'ğMޏSOihvn\]$77yhHw?_nJ:1d^+3ykZ)7zm>m o@Uquo;~՛r<"OSf+S Ж`W7 DYtqq+8rK(+0I?b?%ci~XIOj Ҹ~ltte~mWKY x{|do3c=#Y?wiGc-/#9ho[C})#"n^SQ.2NIDL٢w;8/CPz5ٺkv15i k[m첻k N6-qcۄ,T1PGv]ۧ$3LȩwN{%RΓI*p HNqji]l]]=ۙ+9a›(SDP$dbsف᠏5 ۡ|:#S.'l@R w"/>ϭ dWZeC7\(A [ eƻ]kIL s3Jk> ̲W_k%fil 9YBq?;Xw!K)Mqog83ԡbxƌ#HH-mŰmKdz6ľṤKI.-J{$C"N>zmNξL.U-?Ʊ"Ь.*C;{GXHퟹ^"%T]}xϵjrr<%iewpB2f@ /Q@M:]\dD7W0LpY|X9oޱ[|\䙿0b$C#YYsgI<½KSgTa{ҕmֻ,AtkmI~ljs7UomBg%"FJ=ݏ>dnxO}a'0g74S/]'O f-乇7"ai_zҿ],#ge9{{V+|^$&̴HQ$!.eƧc4VjtSqTIu#XdݾSLJ>"Kϓ k ~ddֈon*>3s x0v0ANV)~&&Xi5)VΦ߆75 aaegWȾ.=X`nwwq VC =_p|c%tLe]6C#NW 7© Z_<㗛Q+܉Hn*]~xnpw|zudߒ(|UtEa/*{:k헯Z~^%_j?;@Hg%vLN8Rrߋ륯9t67)3H Cs:L bh)Õ BPw؋,p%(UA:\phwWDOK& !M:iA1u M@eFH^)֎2L "!4M. APG"6 K 噒:2IiIE$GarҌep-ÔHYLzBr&F{XH D^'-=C pv7QN5$h(5q(z֞x&\EEZӆ$DHBf)6t2_锘U2hDK'SyԆpiQ!N LQxz,;ihC@\;; Va%E洿?KΞRbO3I ^dYo@bL%'>%Okg 2F9XZK8 P" F!7/li0U7: AvBִ#IQ0ܙB>zSԌ1Jl,%0H]d\"|5R]$MC!#ޑ!vqQy5HR"wП"V QX{:X5zI&cR(ȃw$ۡRpT5x%*tW&N3>ѨQG2 5B}OJ K5Oi7cR 3RnoB| +@QQ9)1ǽ@v@qge!,MDĽіK>RZqGfJSyjA2NI*YtaL+@oh_Ǽ Ppkb*N@vHDaQ"DHBf)Q&p[Rx`pMW3mX4e VpίnȀ7d TPo95"$*t8#*j~]Zq,O-lub (l*IClBf/IotpΎ5v#&>7e,3: B:S $$C>r:>Њ*[s1B^Bi(ROQX1ؑ|2zTLELPπM5ѭOՠ`HĂvdTa#iG d3|2Ōʏ* PkgC;3!vq qv,Ơ\P"& ܆ Zִ#IQ0@w>W1j S\ffK@ZeZ<ԏ/cf?HM;Vdt#t3#?qXhwZ32S/qx3'>gMnNI2 =\&c #*2eS!qY*i*Y(L7Vhz{~;89 9 ݺ\l Vfnx߮HD=1jcg2X&ArS#g};O5g9&Y(%q~gX[sdC|EZA~X"ً m&U~XZҪx"'/X2Ա(X<G˨QnTq}YNiy2/"}>׹L7>DO鶧t.#~!s·qZ+Ac׌by1rax}:mD*8Mw)<.endstream endobj 704 0 obj << /Filter /FlateDecode /Length 5808 >> stream x\Ks9rōaM m=X{1lGh}!)gٜ4x&)F'^/įgg3[W_.Ͼjnplu,ta+\/2N] ѭǛeV~t Ӣ<Q0is' \|ρ7s}p9VD/@/l- \eW1^;^^uB_|v!%[][]'LCL~򋗖cJu–Lw.R)ǿ~X ._7WD%x9\U[lu<c`Z_CZyO8<mȏdȉ0qVNb0Bw_҂Xw(SͱQ @r^t|uށꄎyE1H ѐ6 ?|#7|՘p@YKV%7Tj{eeqZՑ `1کӳ^+]s:\'!J>TK%']'^9P &N- W2@$H/H,j&a45*}8H;:zV ad[o7𝣳p6sNiJ ش V#pp *R;gl(%WMQVVka} ƫS386>(A1&"A1 &j{Ӻ(g>⬃C=1 vBk<`0-z K#BUI\"(բ% MCJ cV`Yr:vT,iMtk\Ay Pwv0ҏɦ饣Nwu]:}6UKs.\A6*0d'Z8f&fH\id6`sUq+dž JqB0OI~ݕJґԐ>AcC`8kg}sNowi ݽ$ .F-az-^6L$M1|?HmC6s\6"g0Ibp_6 qSh1 ?? eIg>?pamPxB},%VmgW[1邆)a٘f{?;_=>nwbv7כS3,%23̀g@5ءܸov{9בf\>z0vpo|^{Cmב"oR:SQ|(])pcFXKnj4cRq &&JE[3Rq1b^O3>d}4:h.?BDgJY73ses N%%Rh5fL6+kYFI$dv# J%% }%-2x^a(eU N.VDH34 44eJC +5AR>Uo * sN-BK+m62M3~,/bE"O.$kc쭔GTjmﭘEfy;dʡbˋ,<#;HA\9~]C>@ߛąi8 %ßbE)aE!fVl%9oWlKP͸De#+jm elr˸Z5e _~  -{C)ݢCC 7.bjy6׊rfZkfy ( HIJ-Qh*i$rbś3y9a-)6Db,hb0 1~pg{S4Т/ N4?FSdFNڞ ̙yCۧ^4W zq6|Gك\Y&˫)X1 {eK~6fIe[(NUc18Pm8rK!7/%x)j0ވ:88 QfRJkLp>c2U-PqլC)J4RAb &SG^u31-՘Ovր!L-/T _fitlƸϽp`Vӯ…Ze*J\֪DXUdw5F*iX6cqzr*&M"t%!TMڞICYC'l5dPZի$$ P)AodbNLmWɠLA$t эydЛAoA6c2(2N'A JIqs׶\<'TWED.x_FΌZ+SIxLU)cK7Ðs˸NVjF3ƄOFb|Wɚi1u2X2 } 6˲})0Y\͞fF໣U\p0,ڊ*Q]JR\NT^Vǖqe%gu垎!Kx*0qXKʴd#}:?HV(9soy9>QV} ᇝcd%`y c˸LE1l/pk \r(k%yq'J8 ˜TRC9z"_>q`ī U2BR^K\|r9)ɘo!/S CBd#.9N_M{OWH 㼡VS',<jb6y{rgټzmv-?m#x cɻ؜16•i" HA kil,:j]S&SReI:AxnI`ODU JG:QRhFq}jZ^ͺ"EA|32`ݧ%O2xWRºBSR0Fc,8Se,x́eQVj\f%_?["9PWh>#@ \,[LTpזLUoK=STqլ+fҌ#I֊>EDY8ֱׁ]x M7 .$AqdUQTB Dqle?/RA yԢgu$alm5W(3M n` :0G(ҕ>+! T\{=vKbr[U喷 |Ǵ4+롹n1 E& eVde[GV'v~PHǩtwL+Mm=cDS [,AT}uk7٬85 [,8ޔ,f~6>7ľ]C,לͩ6>^^`]Y*YOzBCy5Iv]sp_عhcB-`}dY8֌EtaOC+] _cn;=-RgC<"PXxg.u)Xc~E/N7oz)t򦢯12BùDi*6lf##9) :<#Xu cPJ&pV'‹.m`qKuq* v1jwLJlr3&nRu!C>}M8N$v.oezoc&D#]CYnW:l hBda9ji0u!Rz˅՞tz;|TLcoE ˋPl1mzrJ_xK^ 0<)F}!^TS Zn=d GW ]M^N5k؉bKĠ%o<!75/\/ۆ| p8󸗮&j\SAO=3%4{Eo!2Fmzm([L (=ǝ's<'))̢w?h|gH}V][ ճ.='S\%McHDT i.qσ+Hz^ 9&v /8Ϝ6N>כsLD?UZo d qGUV@ l%KasjzJo_o/'?zb1t|!mr}JgϕХ;gFXwӆ m8zNg>Ʉ}6a/g-j"X﹠NYtJ?Ւd {y(3g sl1Xdƪ6_Z_~`RyZ^*'>  p`I!?oe[ڟ|gWr't ?Cendstream endobj 705 0 obj << /Filter /FlateDecode /Length 5507 >> stream x\KGrɇ9ٗ=ƀ0jS|Wj-2֠^i@ġ%vO{4ſȬ2x`Ou>"#"#xTtٵ7 AO/o6q}X OZyqyOtƵ^EGlm'4LxO_Mêk;|sz|I%*zL[7>l6˛OŠJ!%4oV#n1omÖ]ߌ=h4wy;E}|ݼ^(U}넜(p^o)YՕD:in@>/fR#pXoQk٦;^e=|5n7C,C((H]a!? ޽'eK׻KЂh/OaqK$in- ep^zo@]2{'{Dd G^O{lLvHHo@6(e$'$arIw1rg14?~C-GTaĠk6laUÞ,"΃@UA "y_^(Fo;Mj2>3M$Y!+uͲw`tLϓ=Zx~-wVe.jϫh9ʛNlsc pǏTx~+k0P=lPh/:i um 4~޺^hT,l~q|mṕJ*zrd`ޤRڃGZjZ*4ϥ? mzV4( E{m}{'\+܂]Ԛpf.! { 5`6Ec&\Ƣ%!lkxpoƜpyeOC{9:U$çǼAڕ^͘xB=Fg@Q>/| s#OF haIq^Y[5p:NПii8]%; ?0m0OZ>$w=G;ƓvMVvxکJx34"{2ULh{84u+L>bҢ>jaSzj[$:8H)E3:R#59`n3%^gNl.]Zn{Ұa ~ĸ*Mu%avިhi5p jh^S18bWF\TN)=j 鏇03DH K=*-eV-XQhMA3 j᚟zeపԠ6=F-2f8{bbЩs|ݟ: QcaJ opI^C~ \`\B 69MI9;sl%157gg{8lbex+ud?\mW%'-Շ(TKݼ\X6&w9I4V|n鹕 "d1خ2 n' Vu~68xyA+"a=%:ԱLѦg2q&$$HMr]d)!}MPv:# Z)#KT'&L('cl>|؏ؐaϳ6)^DaWĒ?V{s~x ! #k@Rr <> zHf`*1EkK (j5E#Aʔ%f8)I$]R3|OyBAc[R-CPa#yהƩD*Đ, of̱[#ԑ* KNpȑ3G0.4dX$gꕙn˓6{Fm=<`AG5^p@w:DrG80xxٌ)FutOK*?d+ʄӝ"?,\7|VgNq>c), Cੰ 22 ?:sY\Q,6$LN7ח4YƼ Q ,w_qK4Kw(U1j0+pGϫpѼLjl(gܫ(\nj;*yJfB́oޟ΃ ׊~BQssQW̚sZ9u0pG |E̸7f.*b^D73#P,WEMl0"AA b6x4[e,~^baQmL"R3C0ٕ`*@:ȕl@.f,". OU?I$@ZYJu&ŗEo].RC 5A&Im .P 6\'{pbTшsIJ~H9r(a41a\M<,%82g#;P_)xr 9|Y>VΑ|%xѼ(FU6Th: !vP\QSʸ>"p,4C'jXĆ(]Ajenc+B{}{"J uI>7i,av9 'fDلy q7^ղ xJzֱO0bِ_,7x)%`aN_D8E`"\w>?^ C-60A,)|twyLIJ:wb!M cp*w#G;.վޏ,KHW@L \S84wլa&yЧ+&;Kss9MlExYN6Bp乐 hɪMԕ|ޔ F<7Wvpgr=Tb@'ϣ)Po5 }\hpjbĨRS2SJc;SHC̗@GR.c)j51.k%VSJ>:4_Wicu@H$]pMS+عx7wo(m)/~&fmTB~SU>] bF#zuEfv؏y&)~ r酢PUb 7qC;(s]ܢg7pں^NK+h [[=]S>ЦxfȽT`V~ND<;6K Ϻ4D@.[+4}ѵKiDrsSh"#H%FւsWuGE99YopLI2,ɄwSPH3<ǔ؝O<>l!rF]41/u͵ gԲiYiB,5 7S"e^ͷu?5QȊö sm y_qW0La)/ ;hV9GC)qmݹ%H &VI›+\4+Iyy:2 lނ5j:-4#[]_-_sZ_)廬mISUAZ| [xvg0/͡zVE3wWTLCbXMP󇰛u_@Yڎ5!mLC:7xK)xWNބ1$!u `^B(3h")(VGhx\MC)~S 7]lVK)-7C?T@GYpcHb?qTb6a=~~CiӕrZ(b447EfIຩ`EQY|*u2RW NAly:\7S]Le3}пb Jd&RCp+?9GC͘B`=#Nѵ2d=u5yZmXV~h[;N5Uxxt} Oy&f>-LN7'Tݻ)P ,۴hc ѝiud޼^ާvNbw6|8Р6{*e_ˀq(&M퓷? wp qPdTyǙ;u6?cz̳9AtOz ~삣ĚTs?jmT`*]q1oa+J a10c\Ƕ$cYOfdyfհ ;;ng޾R^*?qïc6&WGpTPZpK=e`œC+Oc7-䬌I'_T_UW)dzͻR{[{~ R w?@ ]>6L%w]hLjE~zI+%uϮyf[J/4Y n[q6Ts5k=XRX^DՊAMhw"endstream endobj 706 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1486 >> stream xSkPWٮFj V5$XdCvDyl4KiS2vNmiget#ؿw; <BhaIeL+ )nb;FG;lU#LzztǞ'}D4jW4)͉K 7o~8gYtTzgL-EH`N#(<&6i}t$"imѲ(*CQ6t2pĎ} g3Ù`GZěi9:#3m12]P0<'~DJVC=Е%/jM)l"boߏ5^bsz_PAL9ҏq%xel]=p;$3ejFvu]Ngkr+QRY{m't =1+ׯok6;Z;> T egHaX1Ebz9"Yir-E~7:sp7r+jث;4סG#96F1ܩ"n\KlX#i\ҧsذoġ;}M7s#/쒼0s ̘%;Թj\o@Tc*|!hRK!xI'M` oq'YyBMn 7MMcc hcI!,/]T#%x^\h/> F-49%SG[OgוK.**o;b(1jTK 1*U'Z~, 8Y;Fd%~yu_0kD~[%=WJïCr*l }:ű/3bh x>N:5Tj j$acjj[}sM~܆ szkt!v^|oP>R{rC|)5VÔ4@ٜKjLjڭ̮,Sd2lW,AVm4j$g^C?.͡`1y)b_PaTu}lJt66:(/] 7/wu2Zu51e\W|<&|'\k4IrB:a֫endstream endobj 707 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2606 >> stream xUV TGff[ELZd 3"(`D|񃂀2#SFhlXbDA$ " Ќʮ&}=lj0sz޽[4%6hfħFo i-3VՆ 9[w-(eiVp}Uы1,%goރGoٿigXz;(sj[S[SiuGe8*s^bʴ9T0u:_i "bJb#$8O  K7yܰmG2y8s[}| T*ħ`1$ /bkER—$,&Panx@>1wm?\w`noizw"!y< 1 Ay'ĩK & z#Ho]O2Mob{Läo/^/\!H8<.cq#Hvpɣ{\~.g#17u&i!^hLs];0%$$h溭goGCf> stream xUiTWvpA@D=.Q'," P h]ݴic}N&͐mݓ -Q21_3J%o,VQK7Ozpq%'Sp$?)Ht q(Zį5xRq,{) ہ(H }\sT\pHz]moozUy7}}s5/ԧ0Hpo< 02en$qQ?0ow;{?[t[v6DC7 R+XO5F> &^Ϲn:ŚQ͜?ZCа+Ϟ5]eUbB`H쫮}M`Br;֯ݥV5(Jf|9ЍB$n}4ۆ&a_Nˮ\vW^Ye~z|\lX:d+*vk\sl~?ςGtz)Ԍf)DZM njˇ\*.z% >a2&Ĵ0mlcn<mre%7c#Cx%0_}r_ /]2٫0E2N~ܴRXٺ X3y" AQ#p8U"n;|G!k#^\{qVvT %#֒'[Su(xP|r_k6QjZ } IP,&fw;;+i+Y>S,XLي/ېe.tJ6Ԃ~;= %|꓆FԊ=ل J>UBU3Y fn7E[7nYh7Oq+Z5 $oc}4klN8LyOiNˈqAxC$e$DfloТVzN /q$ :+*kחthώUT\W-"KM5o@"#L`ow1)c]|޴-=XUZΡ}廄xE83-+0;H:[~| ]F 5J'vz񱱙mO6^h^%-CfC1ڂPS+2=ws\2HE̲E*"[e;4UF$+FRE}@ #n֠ˏ2Z&Lj2 sijg_4֎R'GOdoǣ_N$"G)f{Y-娹575룶h 022c%?Zjæ-)YAʟz/,I"' QY+% U״W|H]k"-wAB%Tɬ`o{@b endstream endobj 709 0 obj << /Filter /FlateDecode /Length 3210 >> stream xZKo7 p~wqg66FKVK~{d79 pQ]Ӧf v'黓O'?Wӿ'-INoOvj٩QvBN*n7``Ip~}Kߜ kgUuiF W{|.j窟>+'<QfS}nr2ww _u6z&Tmonv,+Y#+XZj[ ƫ%KZh!WAsbV8oqņݮܲf]sI2uw*bzڧޜI8JDu>MW# 4p+ҺVLbjKR+>^{!/H$V7T]{lնf;6*V[476utr3T-::EK j(hwaM'`|Q{\cm SAI>Z0C'+}zHͿ P׸Vw\HDG).a fR0j^*Jj;K(E(Më6褁4*݆Le@>=L0'ea-::J|=tɇogS ,ߜ̶VݻĜj$j_" nHB@2-+i/!U#4:ØiT %(nF KOdރeṚ[u!҃yVTO\k[v0NIarT07XU.'Npau~I*8]jrb^S|*+N_lA FbG#k\a wQ0pz)lZ}F3 CK^Qr`swag|$@W.R/؛mYp'mo~,> m!VmN]fԾ-!]ȩ-RMS0"p]p.#E$7q2zeqb\hÏS!4^ܲYoAABx0"E<21L&0Fb-%Zt <}  푾5udծ/{ynnI~W<~ßO=ᖜH8 8~l<4N (=g$")D 5&TZ&+&!ɔS,,6xkd܌܈YMև\-Yy*#L;^/2 NlzW %@Oڷ\/P:oOnéK'U * ^pF KLeI!C#B 2h6L.`Bc dCl+.K|JQ:wuś,8$ux?[Mאi=t/J;&4vkK]ki]XIhqֿA * G|XѨe3d[G XAP~fsf]A')s|I.бj(\kf̠0(RZ0_q1i% Tn 囉:(Y29fZ㕎_e~{Ϛ{l_C o 9_ԡ,^)Q|kQK746BM0qmvXh\H k/0AsK{dK͓VTJay )Ufz@޸rZVjteX^O%|aMzF&C@0_QY̳Pg@ܰj?dfOxe¸< | *&S1}'GzH^YWchlf4ƑDh\\=9^CK mGt3X6<¬}~x󹣖r6Ӥ_دҙMå|s+Vƨƈnj ʳYA¦JkW~wAgW7pQ+aԞ`zwx!Ѣ= ʼnG5CxA0Ln߷G˕/,tI,;jXWT62 ЉR~@ϑ2c 2t|iy|;?'/>endstream endobj 710 0 obj << /Filter /FlateDecode /Length 2685 >> stream xZKܸϯh`an"`c8/0q=hgvf%!=U$%zػ}pK"Ū"ˆlCow_.O?_]pԱE6BP1N-akyzwӽCukHnPV%/_NrJ_+%0Wal\\8k_9aNvǨ0)Dí`+58#{aM|oHەC*lD!cUvUʈ:I}%(@IkAG C4͵Tu%)>''| ğqtFH׾S|^`#5udt^ih|GXoR/& ֟a,XB30[R׬ǮWLH*4dYvY9(&Cۋ~ @>I) ;)k|%/!eOQޔ>DQI9mۜj.lpMU(A@na EUqF|SN>yL2ʭ.`F`F:Xr2ń \BJ@"e)/m[7a2m"!qj,TXp\!mO8Y5A# LJ^!L (uAXnV:V˰jn8۾w"3gb4)yD qH:JaL O˝i𲌞K"@ ^Yi-`H 3409ZH 1&b1`A`on~ eiSEK:D`Y;^yLtIly>Fa%WWm&tuŚ[D`r:I6J뒞+V"8a,L_Zz.y./ǿOX/$ksXe_'Sڮ)sԇmfcRoNȡ:r_nrWNƮ'z ˚u>{ԧE5 ^Q%) I)3tf*kP\2AۻW^#i`!:dqğ94,n!p#$:CF]2؏v﷖n&_ZD'H> x4l߸`$O'icaCp2k@S4a-c~sfZ2)X~Muo7rq2O%OmEB$}yj@m A+4$0Yx0O!uq(f6 %A=.8W3= cuH=d5n4MD qɼ,F|<Xf,|v3"OA#4"6J  oP5BUisA~Sj<\΁FJAH峧=b+7eV^Jʧ ešD-6 &1?`vm45#ˬ.F7t&\6u|JM4 9!}kp<ͭ֘Ӛ8ms%Q` n+gxiKfI@dyr߇gvq[,lASa?F#')̈jEWsྤɯ=iY.uvFC2H}iU7Cħr18pW-O(1CH~9Di@Zɚ-ӅA'(2RM2_&-_B7n?Zsko`;26/>}.nYn O_?]ߢzLYiQ7o}%oub仨62(AR r__]y>ۦ DMVjh oO+٬0g7 m&HfP..<07LjO>c3G~Cڪ77wV[_( w|wٴ{oH*^٣U\3B̀;"6CTvaMZ(53 |@tcbtx> stream x\[7v~{}eRMOg]/j*}Yb5)2Wm)Ӭ35SO9хfYP͛/ҍ!4yTT_W7vD?`V{UlmpYg3dL뭥 _n\bQKگ$@٬op"5F7ryI۶ә/yX.q1ykZ/ f=dfj w 9Ԣy1`Љm\5Wibmf*pj}1Mw6uTd72N2HzbWy$![Ѭq'Ccf1l6/4KZ/Xd>H\Xjrr׳??ota`O Lof,JyRGaBgE8_20Yw!(rVWDYQE|Cُovx6#1Z0ǶfaWeyR~|-\$QnpchTUx$Y3[pΕ,@IIDyZP+hfqUHƯ$9>GKǦk0G^2 VZ]UC6vGo2蠣5Ȃ+R,Uv&OYnJkKހ2'`x9xgb-kL]U ,^Tgj{@c-ҎWkCu` W&c: GW(Eq"gupparqS9!dy#[rk,nO{>يlNg)uYB~!X/Z-%e)8 ChϛmO)RBn`_}!J,쯫\Kv.|I%yjFaĴd.E)-ցOHbN48+蠋1:˧ v-~,\ D2R=iidquڥ {ގB Hi X{^Xg9vF+akt wM `pڄJ.'X&iהWb.Q cFAdLZa.!3yU:6%m8)'3t̛E@:2hN#@6O> zUExh~R6L(H;NF V={t,9EFG*i(ӚwR9"۾ҕie%T@uNGuDKvVf dfzL1h'/yBFUO kA9װ{B-=fܭSMrYǓM̮\8jX K{@EX<}HV3 t"-̇d(Df (1G͕c 1k1+ܝl\8:>d3W!#AHlπHû\.avI@5>Ҿ޻5xT j aཹ_!YEzCBKpX157Wn@&3軂1TuF%n3 n:E L1VA& rF4&M @2Vrq|կ3AnTrTf\o#4A}BL0_^-nu8JADƾL+ d,v[ H9H;vy'EȜ N:EJmzYY-yC;.K2@>YZ։/^ U ˜b<k4*D6uN;rj,{ވt*_%_LGс7Ӣ\:Vi$|R"^oNTѣ8:UC!#XA1))%M.*Wu>eF/sWFfxuG#Ï[-v_X]]SFK1KGEdd>I`Ңo'} %mPVBet _8o2lω|z 4[xQ9y]f1x!_̱'IRϋK?Ϗ܆-A.No)k=U^􄱙*Tpq窤 ܴvF JB i1v7bFеA!B,+U>):( T4(TTcp5e`N}haj<;:DYG/CrocY 1Xy}CiuILO jz~c0gDT6>zkD8d!g, ƱU󯆢К`1J(B!8SQ([7p. ݯ`RzX8a@sy1*'TcDrvDE/QiFaNcBsujH ]\\kb8[f4;&qlSA!(1"*yP0SsLGF  !Qx 8$.Sa.|p1$ Hm(TY [*#NV"AzsjKjF'g()C|eW"A@ YDC@S _rfNiWHMZYj4]:^ˀ׻'ZN5+ j`nY6U:}@຿9 BB9druņYl3#]%jeùņ.FV]]6-}w:jsR;\y2<9Xhoo#XS4 MO ^ZdRc16z3o&b QkuW?tnw]l׹cs :hq翭x_wmEdۋ)Y. M(E>ߞ2 4p+{sMhٮ7k,\WPdM4H|xrYwZwҗ^QtnHd([endstream endobj 712 0 obj << /Filter /FlateDecode /Length 4548 >> stream x[Y$Gy/D "fa0e0# RϹ3뉈̬ʬʚ vU9_/X oNNoOO~QI/zqzsH<} )K2`ɋ/?]wZii9ve}>peoʹf&qoZlk[.rLl}_s+[gLVNiٟ/WKOT˔i.2ʺa}=.Ãټ5p2\f462Ll)Mm<2-Nf[+t8?+ Әuib{Yfd9Nj cMiXahEނXBjh78P:\/[el. ӓ34'rׂ-sE9֩>bCwa ."S;JIeYԤElk$yuV[qx㘑a) 8U]KE@3`yy:1hqma\z0Y͵[ TrbFl%5)XW 'νA&/W\3z%R*0-wR$|L>M j3{~~< 'PVvOR.$W<}?r\{V.3'T=!N19hU lԈ&'O7m5=NGl^[/om{?v7D SEmo&A"c1U/vK%w($}dq^{рp0yLU]Qf]jCU\k7ʐI ~m9#,V8ɠ\ȯ}E__o-J8 :lJn0MCz+RNj+!b{|=Amoև]. [B.7g"j>Hn0,! >q*o.S/-H 9 R .ĻE10"jp(0? ip1=PK9e,iMt@|€L3ͫSϲ (֬ݶW #DJ $$`4s]ga=Rs=v $P3d1CZds? njxutojrBi\Bh`V5Z;9LQבXY`;cͮ(/&򃜕L1>1P߷Gޖ?l7o"uk} #BZQP*.bx 0#./"G>*-%I_G@aUMNgz0U !aP#T=!oO@ؕKJ? ?lCgZJ jKgȗR,17Aщ & -4G#uY[fe1ŵyYP#H9K#_H7#X@R!quH G*!0#6cXS<0wC0`p8?kOx*T=I!$A.kp+V#wj Z5=ɂ ^cy/epLRӈCw>'C= !jbݰ=w䣩 "ŏ{b\nyBl rpN_z/BCeB]^?=,l3zP- ( JR}%rBBlW0)ޑ3KI!J L.5Sx֑1?X+skǠee%u ZG4-LX*({"cbz`=} }" l#EW@.D ~~iw/>:iNr::V] ώ-XГP%MG)|p#Mr"vN 2#e9nHYRP߯}i{0cRmC +%7_VZ] i Lu(+k[Zs۴ꘃ­XR+1@E(iuZKy '0|dևBAi` -$^vqs٪jU{\5!5i דfE| A)ho8~2UV[QPG5D+HƠy!@hT$a wFx֟.:>@/2/@z(M-<$兽49s#b&#V| ŧU2 se Ad6W6W;`B7K8qM pz!Mz.?+ SuŹԗjP]cDuQ.M/jt>$VsٲMC4zb"l3S^6N'P}벚2ٹձaRH7ߍ7*]ɁY>h`M ;}Ghl<"ZP><gP%*En\_ ]@vT#gyު/4:d"Yg<M<'p2 I}"B}ғ o2UJv%S]h }* !Kn}S/Í+b9 1T7,)ڜvLD׏CŶ҇%4}Rk'rq"m^UD wGV>ēȴn_yc>[il/k?BBj}Q H'ocdڥ9?sN<2\'xe q̊6KW]5?rRF}uߗhh%&ë`phdvv1|}C3uП(:iKHȎR 'mP?\InlS{}vv{\_6KHo?vDRwyf?Kۻ;{D^lx?[ʲ/wgØǀwq:n }볬4 o*O,cq31jfBt}h%&d -Ik𡼨y>J2MfL)V[t%•(( jYbqXf ӘϦuP&w&0r$t?NQeG@g&Ci;&翘Y=q |{L.- uJyu2 ]J$O!сVu \c9[p&+i ix@L?˂og&4cCKzt~.rۇcsnfm]1L(؟owC\%uβG!|HS&Qp|pendstream endobj 713 0 obj << /Filter /FlateDecode /Length 6153 >> stream x]KGrޓܰv׻J m$Ju4=v$._̬Feu5@1@=eViu]^r%On{6tA\߼]ĵθ6(s}j eUh;˫_ll7ͫYvF9хfUBGAh'C>o}gw凙۹fY.vu5_͆X}.ѾZʴڸ[{ KQl;wh߬K~6ݼ/?7m6LzOfݏv&nV@N[ltP̷CP!hw+tǙtl10nb]޾M+U8ƱR0'e{ym7<+t o^51oT^n6~ cn h#b:$ma+9,$V\+T-X)Iߍiw>$a* mqBfY.M?+5PO;Iu">J{G Z!)oV*iw':[i-QNI:fd<o"J͕zN,} SQ qSK5ZkJЮkiAC9/|SfHmP& DXWdrH_ԅF6OMV 6q Ֆ-o|QTn>-i,ϭFEr{͐NS/Q ˮxUۿj@7) Mq+|_M.ظRx#'0ˤOXIR?EfyrΕ'ca}1JNT_ "G0'nMEBަ+XaѨѸDZN1hf֫S" Ky")BC5|6_Q32 M%0Ilm0G7|E!guiZH@iA;ZYoϒgtk%?‚λka=lŖ@|ϛ/0vd tyacҖ;w]v\Q@ԃgAD)} {;G]\n?v<)%GT#&[>YzyψX p]yl ̪ ]Kƀ< d# 'u#l8W9aFG@puA"K(-^P].Ku$RB >`;qN.>Si1E)5li6gC4ꢕ^_g9##mbnJ mZT%Q`Ϳ>oxG BL͓L_+a.QdOs& %¡<.Ēm&"jj0dq@0)!N@k@=qKnp< e}a(q)E\}wǫ?ٍD0\`xPA* ]0YRzMdՁȄXtZP ] 8fWP]aW8,W@簄$@zZnEFr Dk9$1!XS qRO =jď';ޝ"fywY(f5j\e|߰+l.ea]QfQo3wm(:CT >bsվIГKMƴp,!iB7k!;me;#7)\Si 6^`t1bW(J^$>@!#@E f~z*XL9c|SCXQ,< uDoy!@plXlF쵆0b#IJ?c--&-C'qڶe+EM*OE^}wKV(~*]4X4+Ui5EKoo71TjŚhso-p`V 2aGP l(Yq)QeHwv 턤xtó (!  /9ܾYy,̬ҝSm  kmLQ߾h{B ͗/f敹LZY3/7 ˻Bpm@|B~{cYjFA..ĵY9pd<pӣ(P-UͶmx?6sXbJ>wQ8•X1걪,0a$$%bS:2 D+#h.24Xlx\ʒqhZ j:.q u `+lR~X$*0" .=&yTUl1JNLyp*M*^zJMNm*6u¬@hyNࣔ ťV-7A(7ڂi h!]Y› ZZ#$2Yn <%7n23§uXTUPI ,KM+2elh;A4:Z2oPfLKђ(KzM=ZY{:ZCbHg,jE`4_PR!a(.ui=9hA&&V_v`7O3[hTy:z\ 93h5M˜3ي̯BgsIGr%d' ,Ă]4 p25fӘԭڗ[_3Eݏ .H14h`978νޣر¡}xҞ8 /aWe <Ӥf0vk5zfso\>`3b</>@'ɋm?p/?lR'(Ӵrft' PJGDh(PFf] N~t6]HᄄC dҽ{ZW=˕P9qG!ex[AgQw!u%kG%.aR%&kGu>Z:M0VKZOdMXזOk٬,֨1oYY u, U70WT}< ng#' T/-L/$4u߰Qrtm>_(] ~Ef4LP"r̶,7[& N[-bUz ]ty]v7.ނ>H6 VUxWhp#ߦf2ۅx<[ *_R%X'Ie ksbea yU>j0QU'H38HהL} 1{e^( 8/ӚCJ7dz+ SrX)[/[\$Ԕ;!L,` ij.lSQHv9aJJt:Kpױ7ڌ/V|CұZ]7|TCY*'^[HXj_\zߤfdG_'6qGӃ0唷ux+㷉Iw+4;tuzedK׶]gTyW5UhgZ&jK.i5*vKtu~|1, x4WS:5Es3b*l҂1]|d= LzOej8O+Ҧo=Re;2ڐ:YW2zl,ʈC= !hkecb?\dznB5 l'R'͢|֮ uUpi*#o->q&;vwKrtv eC-a5Q7wqQ U/A'%MInD4{*4}ҽ|Io¥Q;CZ?#85sbb bG#ڏ^Ar)]VBL>jx)k2`c!`!-U*A)/4)#ScoL7/ZipAfC\f>BdOm %gOoJ \`ǥtb]4h*@чxP,Cs Q+B04ì_W*i++Ջs1[1UQynQ<T 4uSoe ]\GhYY@W.q?yG5KT z9MKW"q43@0uE}rsefe.AK~Ȏ^'< JP bLߤ#rO~Oy .c|vO||,q"LsUDPϘ=]TAZ"Ќ*//*J[\t*TZ%uZX48h^ȥH9r5`u26HOfy$GՆR`уS+[y֯P}ZC*/Ӄ|*ED(?}8P!R$=La?wvm}w~,z՗NTaimu)Gh›G v%==;Ŷ&t+ϗu#RqeםJNAR:"%g#ZH""k:2$&J3a.^0!\0тؠgZ#a֜u1CXFH2 !Ηkc xK.)%\qtHR=ov t2r Sz > stream xSkPW%d*$F Jr[k8ؗA Bj(PE!FHCTQ) QЇH;чSu}P̷ڙn{% $I2ps]-5c =L$M%iAR g =UGaK#"cJpHp4fx|$ILe)QTFzVs\n/(d2\/z9 a3ù)Ơ |YA ikWQ9%'[8Qzd8&]=!^]"d査 A=%J!\|Ji jʷI(¼aG5rki7c}6d-]MjzUO{y](o'ʚem0^:"DiL$hiD޹ 30`W\`X^`P)H7\V77J<_^Ry~]712Y۱Z!=䵗o/3j #pbw1 /R;߯Mz%3zZ;a#ά枎S(v; ZVaQau_;jXDmU-%Meub*EN|-C6(P@7׵ endstream endobj 715 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2305 >> stream xUU XL?i9k3H7͌}Xvo*!E3/eh7uCCK",R,aýqϽԳw}y{h܌in>mi~o'@X3g@hGYQ#/4lYyO^ZAXHJ@cV/,JKI͑;GG,q:Oٳ ؑ$eh䓉N,JS͖G&j*yDRJnzb_E5K3dfemHW^v.LQTHSTMPK?KM*ZH))7*rʓ Q(KlOʜB.t}lYYG^MAd,‰xag1|v;伸(AoFZ>;Uk{?uƊ~hdiz޸Z%>eO?A*i )v(PK( a/!2P4 72޵>fN%{p=TYU/-}#z@ V7th(9K_2HO{"47=zqG!lQ~?5o nKۤQ/MAB`0ꬲqk@OY]3tEo-~s k$PŜn@>!`&aL>E[FsX93d7,o>)@HkIL[;;M6E˛Vw{Šwodm4Z.އwfE/a^"I7hhj50F-\l/O:t,O웲z΃ًGwa|;݊s'dÚcҹ5Q"tOx9cQĜViv[wn)q)Je\wqZ>ZlƉ^2+ N<*Y/3/Ѓ:9Spf$i v6`9CDP+ FW#FWGU8q2ʉ`|ż K3zF=7IځJY2SIfgnSZ3yV\m .ģ6XeQV2\hovK/*:ɠY9i髾C\HR]gd[s3 p\V!te`.šX+|̀ $5N1b#%?^l$;;w3x+?>uKS$!A k W p AQb[`,E?T]}]<>hz&,̍рsIVYwu?RϲgHfH,tt ')><<w[ _f7&&ouzfC04E6f~թ dpZQ?Hi/njkCyds5iu5{;pm1%a/M/WଏjcęZ|nOؠ?;IaZ>&شWW]-Ǖ(%_hŒٲS%oB!pWAXsQvh"0qs88 2D1Ä~툞0Ȝ 솰{+y8\> stream xTkTTa᥈aj}TVAqՙә 2Z@ 8A%5hDjv-cU 폳9g2~ ˲hO-f1Iʯ LD^22/ɨa[.uA R #jzyu!_?s_ϋ4)nhw9B MMLLD+]N覘v+oP#GG\i@ц\dmhAE+- e&cP@26 ͙ȈvD!}8dV{$8Qhx3D$L"/=m;DjR -:%!%D3fk /Sf$SOh*yn͉$DY#[.;E8 wz nފ^ 'd ֕ENc2?yѢi Nؘ2EB0YL63a3L3KT&3S_01әL&ayN/O@1CY*)'T"v hs 42e٣ u؍+gN]:*]GЛ!p5NYj2f}!$PP-ԡ:?iIbaI?" $>`!ң9v8K7wIo__{u.ě/0AkXVɜL=IX!+p2F&b@c]ɑ(UyB Ec/vj)4kBpt4pHGylUe>y۶XfsMؔ'c~6`1([A5Li#fꉢ`@1w0;oTKiU).Ҭ2yVQҭwj BkZ[LjIke*ۃj5uw.ݮ ;xrf90 2ACUkՒ؟f%?hDu6G@9BITS6޼t.Xuݖm8Ú+z }T25k2`F|$ {`:{ r\I]qq޶fXSM+kR5y56RK}cFZiTo5FƐ)?!~ϓ&TkWK ]sl{ӡ[N~F9i^׼W3_❌ݰBAP:^P,DCԬ$#_dXH}S8/9p6 wӹ? ro纚)ߗޓq-8<'0N/YGK-;Io)K;7FUWp4CܢhE͔' T^?=(: (yA0^!Kޥ>*h]ڙ8R8?*%ʋ!Z~\#̜)^?&*ɔ3!k u19:,u#s-7~0% Ms?'cD;gV a-]/}W?h:h_#7?;ԏ?#a3Ǩ]{n#UWؔT|["7q/WA@DB@ePD endstream endobj 717 0 obj << /Filter /FlateDecode /Length 5678 >> stream x\KGry߬=6Vc^6K Q>@"9%@P(J̪jTVfp@LYC/KW_ zH}Y||s“> A,n_WBЫA-q}Pfqz>xrㅷ{u-}?Xz eGrbv7C:́ qsfY.Ϫ7O:o~Z,Z|mX{ ^ۯ ntEPe^I!>>M/׽Tж[4{],۾7vNG (t^*t?щxs׫ f;.>.7Dg\Uü 8g'p7rw-%E4VMw*i-WPSjAs ~s(\ C,Cf"_̷?}zk{>hd;AlYitIxe)TotQ:VQtV%J{P% yV> AQ|odђヘrc@n؎v%3J_*WݧSz_)i{pz&BBq\e,tV3'*9x0|1|@{qm r&Vs{.|ZvIZq=r7 0Qb (.B`hECK~WfBkc>nDɁ6`GhIg') ےxu6W:۸!02=kMѸ|6. {m݈Fh+=FKdO^@cn#6oUV_╀Lgvs&XCM5'L}!5 @. ̀:A:?>}'su Ρ1ݟ(aO@\rp8.Q ƫ %4rV9n}a,ZZ:]5~tSotx N& 6 % =:dAZK'n o `hF3ڷl@k$dJ BA4-z7D (]\ӱwwk4I 䯭@-X*^nwCxz BpNءP_٤JUBjTahkD\afGM-&d1 8m7 1g@x4BkmAG}ܰDp4I6lɦ`esYIgLt/5@؜·2<)S2 |e\fQfQPmW%л0ȶT"~MTh|G*xO*ܶ(S]i\-Ͻ,,񓅌 A|>LZ/ 5ɏRs[H#8-D<܄JԂu``="m0X>Lc L?z LN:YlSj }sdN^*t '7GP:>՗yi{PLUVJ|jz2VEnIOqR8Ym1N\Q4q"19 (M%鏜n"2ގuއwjŔs?=%a3L+_VB)A{em8Cc w\,R#e563p\HLzW&)3T倯`:Kb-L#AY`:5!¯jq.j8&V: Tw#PO¬|1 KGdQZE!qw\ߐ#-\Ō CG: fA9Jx11Os b}ݍMZqm1Y}`w_,o_.cb)BEDI\ނ3&_WޤGqy*#8*f"y7Sɉp;wo}~e5h /T`2CE\__a67ş:e"xܵ/n$N}k4L>V< 4a(z0 G@ >*c(ٷG3h9Z3iM'V~vtvtPQ%Ŏ&rHTCKBXe4=Q> 7 rSp#֡'(7U=sUu{XqΤpGj纂rU ς75OL:` r$<9TZkX 9n27<Xg uoGGG$4JwGkF[s/N`QO9'0jMVSu4l jyvJlSpbdrٳ^48{ 3Qca9f,&HEO={z2:/|$vv&|6zjHlk'X8=K(v- ֩lǴbޗkvmiI!}/Z}LFmJpv8nGUĊpu{ޱ/5v>Kr)1(5Qo4Ʈvױu|8)}J> S UWPWuN66*atKDd[F@m kGIt9濮N<F-(X488Y lCi-'08<,Y'TF)4QRIߦ9y e}C9hqO4v=`K"}H=ṇC|U} (E.Rt_v9ʜU]u{C$'1 ,\| b=:xBxG` 8X@N΢XFz"X7z FLS"t&:uD;,|7qeѢN?x(.ڛќ\=rM=V%-Ǽm=?w )ri/ y6qh\ƿoABi2yc#i ),X5);r 9e9S[r B0QtB@(10-PAʊQR_8iq:Wɝİl=Qqq{K3#GSG\GZl(~h = [ 1bQ3*FTh z,F zW+endstream endobj 718 0 obj << /Filter /FlateDecode /Length 5483 >> stream x\I$uֹO>؇:ftƚC%S ҂aCg&ŮaU GoȊ= / Luf,/m[?^_fw5^^|*s[_qju⊧UPэ}4nuLX_/„۫?1u/C?83!v>7}酲 ;Γ{S̾?Moq춇i{7v_?KlcqMuc\gOh HW !Q/JbJ_7d{mu).CiK\ ةb} Xfтe-ڄL" ZфaX_@X (}\y?Ia|~r_^d`s$ۗ{t-Q3 yټ|@ s8rcz iF &_#NP^q&}\.'Tg7J[eU}W~ԇk6jԇk*2]PHE!e~Zd97m^v&y K>omppO7oC,Aצ^6dc%  B>N[{cA<ʉ`IU8TktdE4P᳅nz!?5v ȱE" (t HϽo#0S<1<тkr8kz^/ڽB )þmϿbMmx} ss} Xٙ1m!ywzC+ Mcz<<{?G?M ZWuۇ⼷O+xhpZ ).ND`h[Lb`gc %zgcT$M@YIJE D |31֋|^þj=3ګπzïwg@/jjc|P0ҙ$4BűD 3O@@1zC^V`~' "pBVe AAwtr <h$뛷79FV43>B]wپxsvDO! k'@WC'\ xҭcCq.` Ǽ];u@zam83?'[ܦUمu9[WnG,a:!ܚ} &R`u&BR%'<`HMT \S5 ST=Gۣͪюa* >doC5 za ? =n/$EHD (֣Pv»*8mR!Zm$eTwE̛%y΁e?ysJFO` is`q]<8ߝCQSHi!eTx[91u In@RgⲶeqN$=Mg6 TTR"e, pf0X; s΂ Xh .$QFmb^*ўpغe#rhϾonHĭ& ci5 P_Akʽ|)q+V%=PkLmȒ\_T)"^hO5"`jk["|H<_skaJr]=xW40-e%?=o9z@@ȘR~ ;1a=pJ鶈2jUT%ݩ`|7$ oP]ELd!xSӂKs4(EX(c$xf ]ټ.[$`*88۶G5l-+% Sq%2 v9pw;ݜϕ X a ,,>F.p͹š֜qs\[Bx|Q) ItWɎE_%Ru\0`bԹ;;_RMZqS0'hSi(D#`SVBg~*MU™`=Ujh=V}ՇG1!i4?,]஘ `YԙxVD\t&:f}~iv5bJQTs"CTygR(/?ZZ(wd$[lz81̃R*-H~~fi-(. 52_G,iXm&UFA셤ͦ kKw?Tpٻ MD]?0sJP)yT @Tp4}x t #taDbq5TSЎlB3x@K﫼#LJI'H`cLxV;c\(іc2O9j9g]V=⨽qQ>/Zee|'LѱsXSi؁nDB׋|#NYPX3“ztZ3<9:FU*t|(sݰ.X}J}S#w.o2|X3Qs=N4ȑb/\::d݇swWʼn &Y8@M5s^Ljo6dEnAY:47qv[ΝnY@[8eMN X=U|/^UO&|hmW'|):&F5C$]J0!eHg$\ v0Q8gƜEV~b"" 5*X|1Lձ0nY!`GP~.༝JyQl D1Od*|+CL 5PLJTY:_O6e)dErEsl'ЈpPJ4XNo$1 V,;(21Uz+vc]?FPu)Cn ևZa<:Z|Wu%$(N4#8͆Nۡ*Vb*Yy0CeuE.`U%LY_7 !EB"aF⑞ ٕR8U5B!:kp< 5iPFeG*`dQ=FٓJE 2EDܲ,@ x Rp1+{acaKq~Mhe;٣$H*ԏ"\t~?=С.VRE2 8GOb+=Mܫ,F<!T'i010Pd5v-s.3 4^vZ,ޱw .ݔQ 0R%:;M)_]X$uf#Io*R 0˞M+|J9w[4Uyr[¢"59cTK-Tі9! ?=4chT7'R<摨]L/[ 2yfMB[%ѱ3=w˂ԧ!6 5潙|tP#~+}h)-PUѷVLo~lFđ4F&I9绪I~H/ {je(d䗢eP2τS,tDsgGroU>{_97S!XWhW$,a’7lc+.'5 T%i[1o:R,vpcJn! ٤-BWr\)UyIi^SɈAT]窐|@]%27:K0|ziAɰ&T§ߦ̅l((\MJ'}|b b;~͛B`s&Ne)jdp"j5iw8Y,+!pt1OU̴I"/GaE Sz* 1}P:s=d[J곝sV6Ћ\UՓH6[l Vo ,=wKqk#_jm %ZFtJ b`){I)6߰PTA'Ԅ)ȸ+F j ,p9шlKR}3$?0׌wЈD26ADEa> stream xZIoCXͰVVqİAʁnI6I,^-dɖ`C^}?rOgԾ]/V+x͙BW|U"3\.g?k29'e_o,j,W }up'kͳ<4 5 i)'Fcȷ-7$_-^CM  Jޖ7}RZoyEZ_ˀRE 2Y5?mWn@X?pɩ1j/3R#$~T@$#%yӔS'?helW 祘dvedׂgخIqI<> \urE ̐?fBm`ZKZIc1Y覴(֊1}sVG [vLѐ/k4j`S-9_6x" NJUIpP۱ؖ5:Լ"{U8aF`.,N~R +T1KMV&icҴ% (jƖm[ad,%APD䲎SSKJ0JU7guBܫ)m&mPuYJ9|ùJP։*ĠQB4PAas! dF; "<TW^#T@1$ G ij9k״aY4zQKsad)Z FCVS"4U ?u7U9teߧTEiYC(jY! ݘ~M agtf\ZdIkFNI t8)#X1IUM8uư:;T CyC9Vp[smlqyz=IaLfx8߫:x悙V' aS@|0-W§83u[O\17@;g"Bh(,ım3/@C۶Vcِܾ۔]GbֺR1{8fpx_6}ˎe{$,߷Ǧg͐n3ḽg@"sq.#b's-stpOvJk Qˎud1 u:>[{^|6>v|搜pOO;ξ|\H|4l7ٻoDyVh6fvKm Zu;exiѝPWmSe3l|08UK ^8!e[L.(/w^n|*XPͮi KB[ !c"슅ؘ7魨u5.auSI%7if]JgYjXh_7J-V^π6xU8i-cmf\2 VNq˄6^?pҦY.RS/oq Pֵ^rk y}xİ|0FY"NS-7;at*$ gl?.[7Y||ԙ>kO8יPjҜB+_9t 'LPAmM9!q7Z#$rԞkQG7- !.E Z2dξ`"-З$~a;4)y8$yC-Py}a97{BMI3 uPn}\V?[t1_|Ze-WkIP R֓. 1:l#TӅ1fGe9s/ v۴?MYv;n[/"LzB@U.5qd_=$ՠ>&mפ-|{ɐ+XhnL^M—zü| ea[Ub U$K|Fա mj`}vࣱ-d*E9lkrُ|ꮵp20% BQXux܊{];ꧫ0Q + I_V^ _BӯgL {v͐x8)6q1<6 Ep29]PF'EF5{u$v ”G! dŒu1pBVlpozE'kQȞUcMM X@8/xB3PJ|^ G8F 8 !Lk{|Aؒ:z4򬐅FMCLSpBG`wg/endstream endobj 720 0 obj << /Filter /FlateDecode /Length 8267 >> stream x\[q~_1oФyk~Æ? jw#%եG ,GUS,dX߮=]grK"j뿼7k}.3]|&:ҵ~]<_nuyB<q%Ui˷W^sJO˼}|y_C=wu/{|h_*{;e~oϯ7"j^Q.k风Uo떅(>=}zO\Ku˴{<"~zwkwuYzOroKmJz_&S0-˿_RϝT#|q^,_R}k`y1"U4aӞѴyo%0젭.ki1%L,\@U(Ubi9ݛ%_i4!MiuY j.6+LDY}50JUq_&3 xo{jYT%3DVR&/Gn$e1 1J%t/C`JcOIGX' Y1%J4}igNW`,TO"SX9+a!SSTDx_ d԰۲t*0,vߪs8HH6ĕs%7#,}9P%'6zXr`bAPG\/bd$_69ɪUBTҬMw{>0+0&vcTT;L YT5(:>'<?XZ,1 0mv(,p+HdpUR ;=3{LlE&}RWdL>d TMR]:.hŚf.vJ>  !ėMbr7n7FC s|}gv` :{Px28h F渊^SI\S*֔jnS,^x2լlA2C]!Q9`=*iYM?NU䗁P;-LV"J P)¤ qWDI{==QϓF;Fg0 ܮ ]E+qת$^ (Sṵ1,Ni3@UcJ,KKsRdAaUs7uU*d܇|=*Vps~ML|oԇA%zp;˒#WD:hh"}qNn gx J C=;!ؽUMOl. #dڐ/[BpDg|.@;+CL`;4 +}Lp i&MD 3):bJd2)B#8}phAJ8dJPC3)¥tqpleY|4tn;YtfQ8ajP;E}98}cDs7;](]v!…4Qc28mq6O1?+Ki54 Q&1}KEݳ{ȯ0/$h` پ+P~Cm$R`14@ezE `_-y4wnلg$A2n vf!2A wKO1N2⥤Bu/I1?$Aw՞ V~]uM#FMDAD+LS]vYu c؜e@/u1l 1J5X[>R +Tq_#5|2fLkq=ua)8}l#NsU7}(]v)¥tq>FwWf~3vJb:FA^Go l4w !B{{aox$?,ŶD`dĂWS ϠK`n3:pLeJrPPFɥ08ˎiY5sPPxR8KxH `,8(@ei;뙪hŒZ08!n`0)QQVMsp×v1,q@}]Bp)y7$ŤC3`X&LQwAr`L)csɟ2Ouoߪ8 ;ox$:BJ.-RfZd{?`^(35Ud³[MٶEY˝bI t-^އ܌*EP< Kv3HVd0)l1di`~FF7g昢]L p)y;B@zD (y 3JfZHDSѪAaR; Pg;LTԡ౉3LIM-R!`-#_UZ*Z>f08h> F "(LpiEwh0-lLf62eij'(Sv@0LF^;+]v¥sguL[#00 5&X7ax83$ac1qc 3P7)"4P X [Xryܐ.Vܲi>EA#cIZb{3W)¥tqXΠhh~E!H02qg  v2hg*ZsdmgoRd8(ŀ3m53Ygf)h(w;B>7Ё%D 8<| -FaPt^*IиLqs~a<1MPJ}(LWޤp 9qvPe(492ubtOH?0my9 ,ߐdڟp+Ֆ! 2]]P/9@!rAv1H~y>t0Y(BF0 ];2k^iZ |5\Xa򊊘"0"8}cp1;Es.Y(BJ05e\Fc0 U8V`[g V`b0k }<;c ]0)"40m6UjN̶ M a%.)%QpppX` àqɢTp)y]-(i|;\Ւ FѴ488<9w3г a6FR:8)Ba߀#TR30/$PZ5CtO336Ԝրfl( klaO>.FRq/ʕ״tDP% eIp4wVYʰ AvtjJ.s8 aIwp3\ǒV휬&VD- pPG.{ g͏`jV(1Z^g~@1-cĒy9Qއ–NR:8!pڱfiЩ¥\ ;u~QAu(A]LJU m{wty-g1r/oyÓlJk#=;#RD-o@Q v8tLUJ(qLR8KPZ(VoY^(ϟ4]UkoPCuOGC5ch}+L:w 9!Rc.Ei[)|>Y-pqER8K0+߬Qerʑog+expk[Ɠu](jhѯlRyЖR)-LTzГT7v-@Q.98<90Ia!eu40iER`#FK'ZU(zҭ( ҥ0,1k}K`PYӬAaBQSվDqcƹ,.!̱|8 ; ka#~~~Fm~бV 2bOB[ =@PxӒmxPN$Cv j4 Sˡ >AaB:(ledcz1=FDU̽YSvke ͱ 9&Qa u-ED_D+e=ٕ}ݙ}qڅePh.UysT*@$FDە' WHerXS- 1/af0 rsۇ. r A"Z,:`+W2ꘑ΀p'ammB% V=fe9_w̚?>W#pszUC8@s0 "ʟS U5Ձ['0IzP^XL9o>0rY\3ws%? ʩF 1=(]vetQl~[oup$o{AC!->}K)¥tqW"}}flfs\5f9填ՎNz0pXdXu7r #cPl.h݇!@C=mϖ1K>³:VMh}~{c&2-} Ka)8]lHZe9` CP< ӄæ*@A<┠Tv ә> #:kp{އ&(\Jpm)MZ[KYyBl7#隺9^ *^dܛ;ܼ;0Jם.C 7EtA91Y.9+N0dJ7pK4F)wdE$=h(8Wp;Iga")YV W/FM/!#{Ew!d7c K?@вA y6ʣT]M3jibU [A`ۯ-fǢ-A'LBc0S{q묢aVb"UEl }]v OH|t@a*y)\D=`9n5e/\Hu #(WʙzRQahMLP2E3a-ӓuDCo"(LHgpv|cu;fuRh$GڇSHQGP<ݱl|iL`*s<"17j^qoA%s7Nb@ppX` dcrNއvPI)¥tq讵e@!=aarעTA!,͝AڅeiZF sF2QL+\<,my]hM )pps}G&:(Bp<̘W٫mVhϕJ~.k,h ; hgwϛGX+Qmfe֬u,C{R @_4ۻPx N:{O<0b979iB.;ӣt&30xNRqDR}b0ubU6;K-M.#>[a;U9샟0Iˡ)\npK5}3F'b_/tM/ :0Xpn :v ! d4PX':!g^ I'PD.@J`-Y(A.> f\RбntDefMVZ@/ vM}k0s" a*!%4ֿyVT9-zk+G2N^p[k^|y[ܩ²8=/4'#_X{`YܨgtEy -FJpX11 -qhqjqɊ Dpj'x9@,o {~|~h.*ar^R,|vo~cZ_,-;wK&C˗{{Yo9Ζ։{༈W=U잢=;fiSZ,Æc|5_S%pTkt|N!hҢr,zYڲV͂M%F[2QWPcK@R狿?y}o|E. ~'1N?}|= R=vˏ?GW߮d"N*c#ߞ߾ИE^nۏ6@OY@oo_,y+֥t{'r"|Nr}|aXphÊbV{Q.84wAw+E#_Xox$YQ:1+~Yy}~4gۺ,pnUc'}f1q |:F1ݫ_=p|SA=oR>4no~|$#YO?˖R}ގ~rbnOǧ?#۳>~o.(-0KדwOo˻@y>+G. k<) ǧ>nz׏{w~$ӻr} 'Wk U:RmUr#"+">o>B\[)H1z#wͅcZcكcYp- 9 buZPUzh`LdbAP}'i2ڞ}Y'n3,j8S{jS+׾˸Ule8>upK5xi~Ccv=NLJ]zZ 'ֶ$04VnQ/o92y}}HO, +̶endstream endobj 721 0 obj << /Filter /FlateDecode /Length 2362 >> stream xXKo#7[̨p&`b(xrh[ ILSG7jy' >ȢXzeA+?tpE/հR9b}D؂3W *F X/n?W AvUYmamE53+!`dT(.WIC6KQGڮ > :G>U)9:/`$?4?~_뿂Z + \ɖ06߳BU܈ >ָ4˕BȊIjeSd%h%%ךΞRک2AbH%Ӡ}s6ťRy:m73 F(p06ߐ};s SSqb)-l E9y)DI&-s~3a*%Dt㦞sJQ˓mRG~:sVrR9i!(yG>`VOf4=j5wyqQ2 ~9vQnۘ6w6+X@^t<jӬ5(t?wDCw>…J)P+a%+ c!ޜjvQȱΜFLǯIƐ9q)PFR!thEcm6V!]#i1:Kdl[obҧH![PP PSHw Ow_sa &]O\0(Af-!yh`~&uM]ig8zx 4hlؾ`a+nb<.cpMe.*ː7 ):JBZEt]yj>+1ܜt< ǮnrD)<>!}~%fF[ܖSH͹neYx PUAP28&/;ftm؁՜gܞ%!q,0{ɰ>4IۊjjC`+84R1$@H |hJXFѤBWM ibsxq8 9x >r bJ 8R/?,hN&-}+,vYP]v T$aD6&~mI^ a[1h)a2o8YPs/B0Of4j̡gfE*%0F-e|)xxI5 Rہ&C *%(#Hpy& F hj+񱘀6JP 6s<`TIdMa)~βIJ}>w,n^c{HvBd&aYN+kW Y1?{D)gSn%=ޖ%gO[I(J> stream xYKsaad"~Tdvʖj|%pHb`w{̀\˪TJtOKZ%aA7 .şi o*G[^\/ [Z4TNaA$_] . WQ&bxO~Z^9VT è#mEy^LȽVNZKa"~sQa$PCꮩ]`G!/zoտ/\uu-]%A䟚9o_Wxjfj ,ÍXJŁ~@A}sa!O.8>c;%*(TQpҨ+2w^\ty8j3b8'+Dz删VF؉.pү#81Pjώ渫+5`uivǡ6ODP~HɸRc}r% i* , (J2&큫R@2.ѴʬT2:}N i@Mbq8R֠C'-P{Kq9&Zd&Ej[Y> 5gʘZ+[H WP:BBrTک$VXuuf"/Dx^ι*g˻XCuum7Y"bă(-\mڇ/^T/}wYH7g\Eyȫx3I &Qhb F.iYG4d%RZzTiR_3xH'Ê[TY,9>"' pWc zXo6%,9 bLH RS.F&-"G'm~ƫĝ!RF!'hH8 OژgdM)P[X$]CyMLy7{hGG7ok Q˴o}A\s9&ޠPϣ-O1 CH3dIuiD D`Ҏ 8x= zܒE^C 4W ͫ$[&#879KUS1W(t [M3]oг̩=4pIA"%'C :a0YeyM)!B~;hd]l369 `y8W"[~mUWJ:zCů.vb,xɢ lX:DG2U4PsjJ`X l8|#ڈRYFvQ~ b\eFԍqTl:Ibw~xSpw2`g\=K#,}h4Hm=d\ vîMN3캯t Iw~Rĺ0>ec#NY\=G x?4 Wj7EXc[W䩲gR9L5::fe+2h3_&# =%H |$!p6&]ұr #J+NCwdUkwW\{`ENqfi?ef~_+9vpNɭJ2UMBg }q׃(}T {\ (Nu\>7U^kcdAt> @0/Nx lrǻ(?C4 '&u')}0/UQVC>0l$+2ڃ-Ph n hx$lGT:IGNAp'hqix:GIiy8劊WU\a>xڤxdS* A5*a !#!+3o>ȴH.qF%8SNP~4?L| v[jY8; DK>~0s^;6ێ|iNrq* 1CX. 7h*/UGX{XM U~}'yrfJ-)gBiKt]|zgMJgyT.W:cפ-ݏ]{U_5fhv0{>PWq7dqk+ٴ\ \7`)`qˍ*_ G>'> h. Qyendstream endobj 723 0 obj << /Type /XRef /Length 429 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 724 /ID [<0cca12601fd469d11740209667f4fe39>] >> stream xM+Dqs;afLXH ΂d|_@M24eBJ4 >gN<ܧ)iwEÁ*j%ر>o<]77j3+.B pYB踢k ػWWAqqHXWᇉq4X M8y˯Z4@,ẃi1{C4`emTXͤjprc$7'RN`mwd 1}ԙc&;FIX92KUTRr+eoAW8f') \item Fixed a problem with nsamp="exact" or nsamp="best" in CovMve(), CovSest() (reported by Claudio Agostinelli) - these functions, differently from CovMcd, should not take non-numeric 'nsamp' } } } \section{CHANGES in rrcov VERSION 1.5-2 (2020-01-14)}{ \subsection{NEW FEATURES}{ \itemize{ \item Added parameter 'control' to Linda - to select the robust location and covariance estimator to use in LDA. Now any estimator derived from class 'Cov' can be used, even such that are not in 'rrcov'. Return this parameter in the returned S4 object. \item Linda returns now the location and covariance estimator used as 'covobj'. This is useful for controlling cross-validation, for example. \item Linda and LdaClassic use generalized inverse if the common covariance matrix is singular. } } \subsection{BUG FIXES}{ \itemize{ \item Fixed an issue the 'predict' function. \item Removed the dependence on packages 'cluster' and 'ellipse'. } } } \section{CHANGES in rrcov VERSION 1.4-9 (2019-11-25)}{ \subsection{NEW FEATURES}{ \itemize{ \item Added data set \code{diabetes}; data set \code{soil} from package \code{rrcovHD} moved here. \item Linear and quadratic discriminant analysis can use the MRCD estimates. } } \subsection{BUG FIXES}{ \itemize{ \item Fixed an issue with CovControlMcd(nsamp="deterministic") - this would not work, because nsamp was defined in the class definition as "numeric". Now it is "Cnumeric" - union of "character" and "numeric'. \item Corrected the code for Minimum Regularized Covariance Determinant estimator (MRCD) - \code{CovMrcd()} - the step of adjusting the eignevalues in r6pack() is excluded now because it has no effect when n > p. } } } \section{CHANGES in rrcov VERSION 1.4-7 (2018-11-14)}{ \subsection{NEW FEATURES}{ \itemize{ \item Added Minimum Regularized Covariance Determinant estimator (MRCD) (Boudt et al. 2018) - functions \code{CovMrcd()} and \code{CovControlMrcd()} \item Added data set \code{octane}; data set \code{olitos} from package rrcovHD moved here. \item The 'pairs' plot is now available for classical covariance matrix } } } rrcov/inst/Citation0000644000176200001440000000133514172616047014071 0ustar liggesuserscitHeader("To cite rrcov 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", doi = "10.18637/jss.v032.i03", textVersion = paste("Valentin Todorov, Peter Filzmoser (2009).", "An Object-Oriented Framework for Robust Multivariate Analysis.", "Journal of Statistical Software, 32(3), 1-47.", "DOI: 10.18637/jss.v032.i03.") )

0S&֘g}F N9G8 ZxNO$~E)TjNWLvJmőRp\#ꭒTĒ.^NfڍT%;e5PY&;~ZS~vʶIȯ1=[ ))Y9J=?;%EIՉfiѐRח\1S*WtvJwR+DfdLjqدr"i+Nׂ^aO)EC1xכfV2Kt~CQKQ)]Y'%% ٦ȥgeԷ!OOY(e$HK'4A-2x3Ի4=حVs>eDT=LKzL]VIi1KzI)1czU uN^5ľIzL 57d?چ!æ>qKIal%s"M}^ɏy 4}Gc~K1U1L"!WZE 17 %vO)GnR ?aQT=wÙS;/OdarvE/87ߤ #QQ۠ZB*"HH9EVf1c4kUt[BmW]IӤI3瀏@Qy̡?T\ZdY2C։MII3 v6Dn eQ4f.ՙT%(CIL)/-! CjY^i*xKe6œR=]Żvt̨zšRcؽÿ9acMD&IkqI+ra2Pav/FdLo$AM)Aivo jfaɫ؟P:RGO36 b@jݭi+elΏeTvh=S{ǎH݋'b.q( y6tޅZ#|f^UOFP]ۛGxI"A'TmI'M}Uq]>ҹs>@:is DGwBE'$I+؏rIA%vf:}u^}5]VJXҺb$-ݱ&y.Vo/VG'ߧDSV Is"NT}(jM?.bseo_P4T}2 3G E}CG^١/AO++Wg3EЋLP< 0/̜ԅdyV}ฬ/L"3F.pRNe`V|Od7"b&U m(ha&: AwKξװ6$fZ=P8qY -1!bU掍9sMPf]7o JV: shrIf&E:&E /wL3_&& EQkn#A3ՠM욓P] tpnxz'~;߈Vn>a<[Vvf 6Ֆ C#^ =3a`URa2Qw~MRggT+fEb:MJ3 ! 9+iЩppg:]4pHNw!VыR}=r~XS|C.AI,E}C෠a{>)!?k,HY6̉l`p ]%P~e\f73QA/kɈfY`z%y$w9DiQ>'׹ױ= 9yY I0y& S >7Ҿ;>2{kE3/6xFhhi1!Jܽ̀(쬟[׬B-YeaO>>DYޠ%b! ,G A vxtWFEWA_oa&99DIB#7 5G>郄jk״Fn>M||Zj^\=Qd~ZϞ]lx_ (爯p'@Oh3g:{³Ng 8:M/ri]Eg~޷>fܢ77nsR2^DuET.+~Tu2w75TTMIE/r]ܙS!Y잝m|䛠lT3jǻn| %9 dIkm=GB~ ##6(~뙐<,SϹڡ-jF͟#='oE? OT;[(~6d [ρpEe)罄D9{7]/?T$WZ>eNsb%_9X憹ΡՇ|eo6ZV Z}ӌ{b5xٝe 7>SВSsI9ENqLxc@}/mUTٳ*0}Qvڢx%f2Ύ- W6crNߞ܁u`DbY'PLQtpaҢ>'P(w:yYpӠO*${$m&.bf*sJC7煭^,-[QV#zb(-z>P>?.΁Q7".*SB. zsF ywV–Sx/V0 ovOs"鐃:ՙX۠VH`-M}Q457h3ޞBw[R!JM':z@?hLП|tPXllD/۴7EQ ,t Pi k.ES 4S2 lѝbE{]Pkh| |C(BBP>p,w)e cC[7zA$ϸQ@:qqNj8_%q>6s\ Gc!dxASFK}>OqLd]C785Ѻ/bgCL@L+$1z9Di6m~ LBnIR:oXο+Z4\5 D{ ..w!y[ vUЫvշ-3tP&}srO{eg0FZ4H!yN q[ UЊ1TƮbqI8V"EVsǖ>͒NwѾS:أ|Յ#st)_w >5 p !BA!Id^ MCxONǴmQ45^HkTUHA_f:`I\;'WJAm;6=.V$zQ4=MVD4TzeCGVbP|>H]W7(ղH.!iPprŪn~,,9Q|$VJyތK7}sJXjO/(J=ɤ^ Tw"P3POb|YkroWyA@) ]c9?]QU,\h&hSMoB4hֵMjN7`B=4CvBn(iqI+'JNnEɴEOD)PFo$AM) zogsGM%{u-EX5aɫ؟E—xxmÐpDp~G;?њIaX}SKYo:~p5̾pVa0Y?onzn-\[\^ZΖJYU 鳪w7xժ'lߏGKO` O>US0SFo^? {v X ;?e+̈VjI&.TUdX zkh>nSvG>w=h퇭p1>0!WZE 17 %vOP'B 4P)#IJ5 FV+btlzwas* 00Pջv熎:ȎL᳽% 9c&|Fî+0s#䆻I?ER)B(2cC.oyM-);9"3M8z&a~ɨyhݑ T2FmfmTjp 7Iӳ+_h{T _u< C Ib I3 fD즀@Jނm߾7" XlP?, Q~NJ95ͽU ?mVS.M=}_W|Z8d- tcP)mbnܴݐpC v|b ?ϖm@wXޅy4xu5^4PUI>C 1*N? !b@U uS[joM,\3^н20oWPQ~ʹ{ձdrfz-[*MZ|!O)B/ 1. {WbO{$h!vYmB6H9DI:'LN9D$^-o5і KKK-&9p8@WDƁWA_UV$5}K8^ܭ\4d"'@_~];p2c -l$(Ih0$gF2,7w@ѦL$huq,ۤ?DN~,9m˵d3<Sh<:hV-% $vۋb?!J3h`sXi AB/ψY5e ęr|0b(ً5ɳh6:|$$$.*&)l'-28Qg?o`섿%y'%q?c?˥?{?H'BK3N~K/~Bs/ԪxQ/p:qn3t~&ӈj{)rC6 憃8sRksDk z99"\mDH^ ll5"!J $C̱NB{`TOXU*9\g8m~"ٻorɉ417QtUxmcQ}9%b7\S2}s$씈QwJ\/Y-ﴣhiYT@{;+QfRN8iyDĉVixp L^8A*IoA7]-ɷyb#oߵN@;!}~-<{oUDQvήXB92oˆ\p,wUC{8?+tYN?8A 릠,W?ni򤊷H^9Rbuσ>NK*Ķw4JX5bPޭ*2DQ//4Nzh뺡cOi`H!eصTm:] 8rRԕx!a`4RVGD!bwh4TJ!d h?XcDFmA9C,[ (hᓙDH1N1#[HK5vCzE . &Q 5"E*IEO,iH/CژlݸOU[yaj*eG%ngl-?ĿŸѐH>Sb[R+aC$RCy'U*G5m<#FC!ž^_!YNHy5*; ?" C% UDߧbH#P"ZӸxA9#4Ա%G(FS3fgkF1gua <$Ҟc Mm.i E1L~"gj  ?-<Hࡨf nAnΩiqI+r <||FCݮ9)6lᠴm)E% $Q5|aɫ؟P:z'YkレhbDk:}{{K]f Ey47]eїXKXª*GHQB~d"!F>ef$yEtH}Mɾ>:I A?yMGM:h[xF_EeWiN6i hX]Ծ]s"oE8C]U\5oҪ"8DIZ a`*h1629>2>B{|0#'h44"7ʷHR9 8DQ%+v1W֔d ՜vmɚGEohp:|Eʘ.^Tfڋ\3iP|hNO54*pJƔ6jw^>>ab* C%R%9 CIˤW(W !1ꆜed5tb$(nU`g j9sV,MA-HpHf&K$"9Zf_"v3_$$KQŸF|R3մ}²ZBv Nnz˼ΚD͈0\@FȮ޽#\;ψVm>a<}[VveFuPmrۚ0'vS"셐[TZj Ś U֜Z]َ nQ7oDo3[8d"_~\Měk͂;i0"ዤ|Q>XQȤz!/Ղ,_0_VdgS#" 7i[o%o6L v|:b?[\dgN-̉:8\5EVǸl8@?6;p2-XsT(QCEQjO(l#þfQwCu4aFB ς>e $95׺^\5o()cgeYq*iҨ%4XnCJzD3 \32J ڳ4|^*nZx*I~2yijQKQ6t3{aK`{sr?=%p4+8*d!i/TR/2 ;*%wA2 cusj' ]ע,&K$Hl-׍ڲ{ӢD7@o(YSDS` u;<=wMK?V,h+>#0,g况OmvRv:Hd0?X"$ή`._>(XG #d9,SO_wh-W+W_\ʝhآk l6>RC<_k |Қ6"IA)Ч\a~Y!b?!RB*8 )Wfz+%swv\SR#OR-taBA(U d)п];7n2)9DiC}~xj&J \C%v@}knYRk9^+Na) "qƁWA_MF+#k5펈$(Q{@4;) rʘoo/BǒhjIЬFWkMJSS.䋿n-qТ3ɡts(. =e4^-&@lFm<(ZH~NXDhݖ&LZ ~E`N^dMyE?A\/pJI1DQTY̻)(%%vI# cC3zG@$8pS# :>uQn Raw;\:‘($oUϟͺPE>ا8K|&0T}~S+"z|P*媡8Tӓ3 J5Ơ1S$-e?CFW*%{j.yNv$]R7: b7 ZwokgEMdY>K.{_4GZ s 6"Y 3jK}F]rI Ey?D.֯~$?Ȅ&MVsGxa_ %21S8wJ{pdΘىy%3QK.^f'fH^ M:hEgw^A DHA,ݤI_1e[Hz,ʴpˡIЗEy'ӂ9p3V)h΢LB!YdD aHΕ) {iҕxec`4dQVVGDebwȄJed hȢXczfQE#-<+'͢LҎqRH]] JԢ,_YKeQ+bp[&6ȢMpnVI*~bI}fQd(E9znTSA,Eo ?Bd-Yv; e$͘hie-ƍ,ʊ,,(P=?2EIՉEfiѐEYחE\1(+WtewEY+DfQdQNjqدr"iY @e01gQb;(y?4͢EWJ B_JVʡES f9}g9]Hgo4-k՚%) ?R(S0rmv -w|]I+~CMZK| 7R(ǨPHR&ڠBAB9FpcŰI؟P: h'Ykレ mGy4I}V^ɠh)GcϿ ،t_bR_US5dj 94bGFC{àb'hXJBu&iaQTŸ!Fƫ/& U10HBP 3ES]q{WtA 6gDkqLz]]G.,y(jTNG'{8DQd \zV5( 6!w\2IV@i33T2uRmJ͘Ni1|M, -OCZ6$ hGiHY Mٽ!Tvpբ u)u4daX-!*e6P&sO_l=_wx1CzR8$^,D Pްw8!bCUus0f~`Y&f{eDka*>h':6O߀~'vm&hzmл0›)`)[oUDlUšԝ96Z7FF ^XqA)mb EK1WA"͛:VwRrnV%%@WDBkp1Z&g@g+*6$Ъ641l(ZdSJwUM,j{ӈ}CCqf@3t`*Yh/V("h5E VcT o$AM)Aihu jfaG#UCp*VgmhI{SW$i>tn룃v=V'mx^hL`A\ρ'\syG~Q4gĢLkj߮9W"T^}%Uh]Ҫ"8DIZ :cMfnx5sEN-GLu}|7hSQ1߂6yeH*S93~(r&(~oc.漸撆5TvwՌ>jX,8}x8 zZYaD>.^Tf V|W,W}&|8!jL]@QkѨc˘غ25cm&Y^$(SYIU'" Z&uBFݒﵫ IVE8z\FVCK'FbLpXUQ$)rΑB̂ʺ^hpwC#hHf&K砟g/@HIEQkn)3ռCvMΚD͈dW@'нI]ݛ= zUwnsPۈ}xSlZn3U%&X$uvFba> Q+ď4CB6~oż;ϑxIiNDE$`aώyE`Ŭ= +wبE 6t VLg>rJD/(br}&Pr{'3mzZg$fZln|EEe(=VOOVKB~ l%jP[\v Z2&-y_?w{4a2{ -9hp1Z~ّn R]d>X Qp^$X5TT )Ѫ'7L0;ΩiRXfٝ /"y@[ pD"i)_th^ئH*Kt=+Y/־U2'痗LZg-wa*i?Op"?GϿ$Q?PoOFyx6{xϨWkRdhbIJ5'}o_)sgpkЯloVV2J.H/ jاgw54΁KyQZj1.t%Ɣ$R?P}#8n+狹< 1SխPw$|s=5-H;߆F$T;g:􆛯!' #er@6sF&߀ OVǼ ՚Gm|1|QO!RGzQ,J0Sb Og!1%=ĉ ]=7| 2QbqkEǴ(t_&$"Y޹2-b5Vf51s'':ɋ$B%')aHػ(IwXľCb?xDob#ѓl#GoĮxU?`<h}wd:+Na)'q.VF s:i^ߊeNsifReo\;=pBP"nyzGz&DQK#{V4O_hVOk͈FԜz [K7@khURڙPY9b dGmvO;{$£5" i0.yQjhwqg&s"T:5{!;a̓[.ES 4;9< labEq:q Bs%}v|?E ׿",(wײq1ȡj g p T A:(q]7ha`ϴ˗\Z8 $۠&4>]2Z}Ø|K/"'>u|C=>_<{<4Z^g]!!J ưN1lScNWþH < Z~;o4wErX'?frhgE>.:\0$/:unxϨ_U4oSKg]>-u'UT1Y@듶i5$)RbVCG5t״(Zw$ Ǩ%MVsGxZ !8}tG% G %ɗk!_(xE-1#\O>D͐ \bMuZ@cDRkג<uQ4}5SlS94L`,gهRqV+^A97P$Kǽix0SМLCq+{Ɉt܋h!;aB׍tܪq/.鸕!wX:nOt$ѐ;4t)_`:%>Q³Rz"t$'D-JǭUT:n"eqk(tڄ 1Yo"'ڗl:xmL6n\*㭇4zM52#D֒kPMb݌鉖bhHǭX}H=7oq_=?7EIՉ/ z}I!yE&~!鸕Bd:[0BtI-UQ$C=7mtsH-Y-I%rk{qԢq)D\fY"2$7(|; ,q4Iroz*&\HX2nIX2nҜdܫpADdܷV [bPmpS.?K ,hpu%!Q4iE.Ao4$Q)kPZo$AM)k z/6$^:CqǨupp!g8 $)kOm'7mɸ،t2XrWT ' 94bGC{àb'hXVBu&iaQTŸ!Fƫ/& U10HBP 3ESNY9HG1ԼSEØ ~ѰRr ?ER`o(T~r:hZ8.(4s݄guۑkluV.T(J/tG֏Iw1ȫoK6 0itbmIρ>'+t7w/'D-$eW4%bBځWA_U~g:ew_JYoa]xgh6G#͈dߌ]'$zQ8A_n%m`/?a|RI4P}D@{Xb x9hbvѷy^kXr cIȎ6jah];h3k.\cEmD? -p&;%r m`Nia:%5ojAx) ;%딾U_"̄[j$ ߃>=Z#. ,]6O /0P/ބ H^/thiDs(#rڶJh5!ٕ׽ 3LTšu.y_%kSk;9.{7yK6{D7u$~KW'?q%|Z\PCݷ#庭2߫h iI5#:F}nqv$ ܮePos[owGQ|TGlZeSӮ#+=ym~(iB (>{29A)||ծ;ߵtg6f*#x'mD} z3iNkrNGz,<{b7|:0 >ȸt$$2=k^H7Gr5*uZ}&#ި}=8,SSZWp+<E^8vXE9] \8C z'=?e*xk=Pp2 \-1m{"-u3+X=ۇPx/_E>>;YN !b,K4kq\qU :$n0۴䏠DBܙ3^"-Jnޛ1@2??\fxšǐpW $s} a@@«b"ـJɽ_+ M'QjSX,۪gR>d "GnH !6ԣ5aKS qg E7'Z.5Yt^}4%!Q4iDPPa?DHR^&JFRzmZA^BA;3L5/aɫ؟Pt'm| 2P>+\_(!Fl(b5̼`!˦OFP]ۛ9Y|¤u6MQ4餽}is;d_6衭:is DCgBE'IC'B dN9G~Q4gΌOkj߮99AUC=W@_I@U,m8bWR!Jb/k j:sfxIVXfJTeD-uNMhJRs\^XI)?ERPqX+dk3.c.2)1PRaqr)}8BhȀ!? zZYaD>.^Tf%Wz ?b򝐨].#t?HQy=9-p2nCա }bEi_5a^irCbXe m&(#gՕ^dmUp$k)훂Ru59s|H`f&u@ߵ}͒QŸ+1;bh]Z)L5}0%B.&ꭳ(QS"Aߏߔ4:?F׀׵~v?!>ا8k*8.fJ%=3a`GORa2~f~FRggT+fEb:MJ3 !dN-jŲ tI#;!(h6bN9r+;d˿j9qE)]\ꏇDţj. v.܈Omn'B$IiYko'σZ @ސ9'jkw QMDhko<.ѴKX-p\V;˗V)>;ܑm Gv JWeb΋vxb!xGj4?GNsi.kR~؏s"?7'rF5N괏q{9b-5 ߶{٥|Vy+cdeOH MЛvتXJv&]t3Kο۫dG~7d,($aH>{n2Fsդ6I=>4~$vg)'9Dہo/ڦ3/kE,a@"o紓tĪuO9ژUH '(:INPwdg ﵍ AKAji' F Dz XOn|sSʊ9a~سiVZ.wZ4r)XNe,FR]->#Ŗe d=85Q|&hXoqҢ>?X>^1$Nπ>[V aCbp#jv=cʮ?^11ا,K/oxnx uH+렯kSKG_uQ<6(eyZni6jeceNF-?})Mvo%FNt)%RDmE/s4^-59Qxh5VAwUǽl D!zNAr++WRF5F1ovɪ8%IIͶ~oGJ+{H79|{ | ma y\5g G4}Cq߲={G+%++J#YĮt0K1??o& d!n{)uRq,窭X46Eg ^K['΅ę-5lcr?yNWH[opqlBlMT9CM7EuSv!_ukh JJ;J7+1Bz3g4~FLRd7Alo*Fk`GkľCE1dL rMNX;`^+Ib"(jٵ%`( :q">&}12|?_vBP.q2ec CHˠ-J~j D\x_PzqRl D:@6sX G dZ_fo(>->aLdIߓtk"zx:I$jΔ#ʻ:n)TƔ8~mjj$1 'AKO5YQxf9hUKs D,H ʈ-Ya= ސ1UC{" *knH 8DQ]for𒘡 6Cv b!J#koɤE#bPmҭ*-r{@;wZ0ɀw1 v{i`Hbo~#"7k$Nl[O u%؛. ؛. e I%!wbyWjyK/(,Z(Q'MMҎqRH]%jQbo/լڥ{1+[Dq$&\8׈z$a?׾d{kcv?UIo=D&\kwI!_m_fLO47FCboDbiTCEK{H)QT8ʉiƝ z}I!yE'&~!Bdby!aHbw*({{KVKEC1CfՅ9LKMaWQk]y'U HY" l( A@) R{t慥VOl{억jMj?r B6KUML^+~CMZK} 7R{ǨPHR&JFRTR{߃:O cT 7V K흔j* | Cw_MjrH;G$hR!sR{c2cјNKuz!SC#|x 1B#iOrUJꝔNRF#&(9+چ-eUQ۠zsMZ3~CM8j28:c 'SECwA?ԨǨiy1qRz$8 4VoC8 JHG)s;A0wܙ甴8(*R7JCZiB9GMso|Yгv$+b$-C4`s^yyQGRF\li`h$ɴ2$]s&Z&jV߽ۧsJwiVYs;_rr*Gr6Y!_RHa(?AƼ] 7ȌLj4 `HB<>0yuHېu-lWȸJ~K2N-g[F$Omɨm[пM&!J56%QsxGͥŌ>N{c=,Bn*k=8[!XRJv֦ngdW^e[fZrAF` }I$u$ 5yUuڨFFiՖ*xTmF-ylQ2*)IG9DI_C[ _67, T^_86BNd krӼДF]hJI8!4\2%{qK> TV\i"*_ZfVhr zAY-#|i|ZBpcYFQ7$߶`A'1 ?9Cć|k0F}fݠe mژ 7T}W_}cQK[i&8 vڱpѨ};( 2.^LF1׀KuKmjsݑ^߂G?*I|pA Z\ b h^]xpA!J n*ε g !YV2WX * g|gUqJUC>HB~}nކ!_刹b=۝CΘonL-Q:M{i.4IW@ngfSZѝxClY,T8#\u=$ӷנ_zCR8Cٿ:q=lz V]{d'%K@HɴlIŕ6xy 4GT&X^UV9pRP*aH@ ڽ%K" m.rRG-uC^QLV)v #x1ɌJ)5_Q%F@RQLPMйþg]%A<~aĮ֚/k0@IX(q\ Ė@$=h( Q4}׶Uzw`NG (n!xNXɡuSP+C0aXdJq{,b-5WgqtqzV\S-V",v{P*'/^QkK^< i4s 8$dXaE$/&vmŲN^<ŕŊO^L FCbeuD$/&v7FCbIu$/&Iʼn5f.ޞbc J^|pԨn =hbvzLFbYP%/Rͪ]*y^$2ɋIGbm…s/JRKxK6yq6&k7.SCdRY zgk"kI^Y(&9nDKo1n4$/VO$/f*oV ɋI(NN" 1+|+FCb5֨0$yWL^q$/Njqدr"iɋg _a yd$8%.V_t9y,5BK W9HHXwc٘QL^A@) ;y12’+ۦɋgnIք=.Oq6`hl%nuŊji&4A8z0y!Q4iE.y-(hH^RnA#ijJ`8(maJQI^| BWUW8dE))]IQ4ᆗZ3,k9*+5ҳs*$| FuFg83ϒW'H]UGqX+,NJ]̕eRՆ~aU1iohY/AO++W30L,P j`^HT4LzI>՘dMҾا8Dl[amlؿ᪫{ܐTwCNq2:vW!Yue"ZwrQ&B t%|9sڜ$L&3%\IAs%v@|$(qKVb"J~\)R˙â@P`^JHvWoRD|AD8 \DYj{,GbOqO/׾Up*ZQݹS[) !\S$ =5IyMLAQ`/!MvNf‹bt G-m'w !o<-y2-9%U.Iz x]e.O ls47!Ce JkrjO`jvrnǖ'rqM/pҒп^&z$%=)u&s%egĵ |ZnT|F__~ٲ甯jb'Bqz16]+I$}(-z6AU:ߨeoU4D *TJ>+-}{HK?0'i tf6L}V}aX0ᘖwͿC>cgzSF@% O:˝eS~O]hNmV˷2B@Z>d~žmnu8$$iVk:pz NzezfA`"s-:}:ϡϩBw!u4޼) y zAYe2K-;C>W 4E_iZ]_cr'_!MiVꂠ{"rw%tM\]gl$=h)+[G!O@?i]&SHm bak1.;GW+% NSs?ܧh.&-eCEK-dngOH}Q, p*$8jD$HMldw>}U "?VU֗Y{wߠd2$IzN -dǴRZHv(=@!*f?'MRigŏ8w *߀~\ |g9&"jc0۹x^t1aàH8&lpHFx; Lq!g#ᰳ# PU}\s?g@oZGE5H{7|Ύ4Np_#qͅ߇ ࡙9s*$Q?0EM.yh(vd Z}\zCs2 I>iЧ=b닐IR>-7= Io@|{c!J}zE}C>G|#[,ާE7F0zN}B ߞ5o_=b~hVrVm\|o oi:lжQhh9F@[櫧ޙQF҂-w( -.ى}CuvΨ~0a7lH^}C#r{^ '91UtjeM5] JPz`ݐDD ~8E-Hm|#Dԛ~~txR:LrP~x^%QS!vǁc4G@Ff0ŕ(ՈѕrbárwAԦ .u@sRŝD]C{'<ߞVS柇a 71﷼U".yk4lƌ88š5Jq3o z8zqá8E% ky[8"IF@KMh}~ kt.j3:|&V9vCP=(–T)ƎoP5LI= π?eq,aL;Vڟ9Q/M^Fgyibw8zNٮN̲lUZ-he{}\[ƾo \C`s֐\bwx 5e =Β`pw/|,`rLu\^$?V߬e5|dvjmArJ$jm;wou9Q;$iAK)Cb7| / #NOH@IYa22=N_3K`, Onk``r/rqa-#ѴHPiB̴>;IfhfJgcmnJ!}Iܧm"ZGG.uhF8 \stg`PmzLUC9DQl5y||~fdԜLss(p/u-C5,>Zd}Ϛ^SgsgJoq*ӹAhf-`$z+ar.] 1!#;cu51.!O8z\:r)]h2O{'/P'`"<Zg>~3tfuR~ ҁҨ_>s,nٟ].B:ÃC|Xy8Pn5³cƱ=M~ލUuhIsRH\8k%y7WeOZVKR5r0~騈;%QkU׬׿% Ep\WFMҕ`?7tbh$ƂM7iL3m/TZ3:j*PbYufLؓaѭVG e;s=ߡbl}@0Fk]1Cy'KS)jݩ6Wţ |OXyexOvf-w8 zVy^+SN{s ^j7\/ G+K8DGIq"8sֆ:4TF͞!rvdݮ,ݡGCHm+J>J^`>3saCL蘜[ 7#IKr7_lʜ6+Yukxcx< '@P2k4ڌc).D#4A3PZl3R+F2s`\}bšZԲ$ ;-|<}KBztzq/ S+i؟EV{I%Ag43HPHR^&"{ J <ZMaռ:σ>jQ ~漇gkT0$xT~v~v0'Y#k%vZ}mϱh97_= hsJ-\*8[fSDq=yEw3WUۨ]b"l>u)HQܳi"Оc8vC#bȪ5߿o[&Y=nizdDdZ.4U nO9tur'~k&V%nt7g)4&HkPxejEXqAsڣˈnR apTw:,s]G5S&P;r\IXڊ$9DѤȳOI%Axh>+IAGW|Ѯmr'VERE Q[%G ,c,DW\CI icg]hP;@y#(ZPa+N,e\g&Tr=ؐ"(orh2%ٛO$Mx ~6Dg8DT^\ͨ%\NdGO ,dQ8!a~D@QV[vR935-/$ ])qA'bXu*}Q{pydKz1fyOy xEuDisD*O@#' #p`_$2ݟ需f]_/XlM@w@Ey3}TOX]P[湏N܇bԥ$K폾KA_VV@rj{J$/jC+RK63\Z./SO8w &ƒGM U;{: ,)fO? ##Z} 6M>Yӡ;ӠՇEԾlg!(atNY$t{s[8>J=}M"C:I2=)#xIFS5'#b⾘[KqD$G A;5"r9"'E'2@S-IIQУ|5 TZU\C ɥjSʤ?^-5T)WkIeXa il;8vjTv<'2>}#ڒD= ͌S_58:¢]8Νw~WN&2㠏K;֭ɯ͡&0.:s=c5I =h}a{zJ#(v=2u=QRw=fh zdrUD`/h &@?urUDρKuc;:;Qu.^NQR:CfƀgxƷ6 hPh)(WKXx{9㻎i=btbÔ2`CS`h z~+1~e'A>/܍!d#LA!Sݴ=ZU X΁SV!ZkeZ%,OxȗP/txy.%^-uMqxh(DHhXtz2U/-v 8 Z}S *s3a`J?bK~%v@kd^)&c|Kix \)&9J--U-ZHȖ0%cV7i?SߨP-mv!܋c+fg[s+ϿiSEЋ7[0p·ߦo~CMYO ^ 0]at??=vsd-'>}daiq8a]r(q'nK[X#ow]Y )޻&2u;b(b NȽxPĸ4AZ*IH0QDO ˌPާ*9DQl_J1hp ZB,xgv8()H 0&JHE캁1)du%ҋ{Rz)J<Q{Rz)#! 0TJJ/dؓ+Μ P3d~;JC#ZxjJ/_F)pRz~.K2)IԎ^ڄ皐uIot%O[2׾dSzdSzэT%W{!1Ւ^Sj2)cOYKJ?Ų'1})Z  \#Wo&Z oOE"uq"vҋf%cOJ/ű^_J/:0&kRJ/wK+$* cRzK8D~:7qa7"lI%,i'ؔ^5$$I%)r{RzMA>˜^KMŔ^QKO( =}Fh69}Si݌V [bšZ:KҢxؓJKQ-&O>ViQ4iE.(ؓJJ>h9)l"SҶTZ˜TZmT +WH|qYk'@(kr xPu:jQ4о^j%HX0t0px42=O#EϑZiG)cЏ$+'H"ZDH2YY߂Vq' &<0(jhI暻D3]֛z{+.gw@QTRʹ!J} ;^jQX129}ǀ|ni* *Ix1v=&=tH8DTՇu#WќUHZ䙩7z[z=Vˮ7 cFQj-L|ʾ){dj $Õ*  omE}7I2fO3RY&vyyeb:)@OiI&I߰Vby|Zj T\3砟+kd$ kЯ%:61YpKvA5]LF8h٧s>}3[dg׶õQ3w/x>"j$kpD'v$hN;NVMd@/!,un7%+\K߶tľC.PThb 5eix|:qC*E]v +I\^}I=ޢt |ؕ1LuE}W ƀk47Aw p)x2:'kid8 ZÂ?Է r>?-C {ιVZ9D#!Y/N@ ;%c'~d<]6dr8Zjɾ bDbX&SM-rt|d 8z<NrO@m6xҁP {c~0k-ϩo Itxh>nS!vǍ[S\1wPb aꫝ'G(b.`5O(p c](~ -hA\kDŽ>&Z9DIN߂~\}$#h_-KCfh S\44\4$=Y4wmOt /kmu>#O{.  Cg}(v/uZ>;1﷼,xdTj(B=@kL7`67]ot,"9Nq(XEg)A4p^J9#Jba;ZNYrC!.p|/,.z1qCXbC /q= =؁K8Diw%vǀ\_VQplwJn;]9DG<-54C4:MzI%;wKev3rWf7ľ6nvbICuvӥV"3y52,N.[N}]BөW,OU ^6YkFfTšp8(f6s4~4o/׷=9<όUi.yy)/ϖ}fnuU;]85uo/ǥ hDqnnԭם"du[ts?a3۠uٕFn0hٸ((Lj!;-?1.!O8z\:r)]h (MD1cZu7OgVW/5'yQn}XZwݲ?;;\Ku #J|yq~ay)kO87i@nr/ӪN$u͘U,}{l̚_D}گKGElvDoyٯYEK.!O6⹮zۛ$iu@,־F"l,sq56n$LKm6eClꨝ;~B?W;e{dY~1}cO>އEZ ׏%Uâ/_ښj۳wN. I7ZǪH]H:!r֝jsyJPF[! P' \v>o]r+岦2#5q;Y%0>|zE!U'oMw[,e*!ݭ}ccHt'@뼟G lNAp^}I(Wye Ig溏x<|:F14\fxb8ix?vypD4K1wߥc߁:'6eQ4՞6m cm`.B'uc(6ybGE#MBOAf-UUcgy`7YsDf.{N0izi# s}S= zq)rwBOsI+=ӐQR>}(q;栦{A Jv <\*u*9P5 5@3aH8pF2`GO:~mGִ ɵgU[jϬ{r]Zerd!?139Q\y^Uj.`;5K,Ols I.L fD }rGB vhOᇇe{㿸b-i#V^PGL+TEO+Z6=Ha֝W:)AQ)y2b{Ö_@ > O>!#UœjU]h>}뤫'CDNh(Tr=j+n-Eci)؟%STʄh>,XnДH3YгWwN=Rw?-hWΧ *[U:U =6]-բ];sj!ݟ(*R Q[.I||J%2zޯ[^fO0Y՘E+z*',.j3^<)RKE!ѣ2- Sid"i|{ /f K("02jj朙N$HjM4jV/O9|*?x&2y@)DO=h[w+)I7%_&gf1[ xEvOD'sD*$F캁7ALK[n}۾pw0H}Lڊ4lFi좳4MNRV+Z&YӜ/-7-6mWE> *oľNb![ Զ%{ [~?[߿4w;\ hp@ >i9ySՃH%H#N G v xqPW(4r]-nd ? | DuW]\4?eI>at%Yrf)~Mg@t_Y2lPSyl^6ڴ<DmؿQ~?9.U*1n\x;ԑg nuM&؎5[z[B}Up繲g΢[($ͿWOb+_w)tSTC`AyOa1\֗!> S*eX_Ҵt4*4X=#VX#14phU36x @d9i-,϶Y߮#~6 3QMGZ>jh)i{`sSyA:=A*Hh6;0AЃpg`JLlގG:DrgQI\ h~U-;bekCeQֆM <8J[K`Sj{9vE} @bΗGQzC3d=w=QRw=U3l9U.< iMHıՠ'~h6]2 5?<֌%jvw?'/[?Wn&,l, 2>Cu6wE(3ntW&Gh$< ,&s B(5wIBGe^>pJ{b7|Z*P(b|Kc2c˩N$l_ &LߪAn:c}`Q7e`zؕTBTpk ܳu,dA,7jcF5Ωv2 A/*W{ҖS.GC+'->{0}7RS݌`:PuVmd2~Z={Ds l jyKͭA~[1 MG g1bCMYO =(#Z}(8{-/IJꈭ]F`+Y-pRtamY^k4*O(z\4)Ad4i ~Ms0|b~ oA? &v 폂%$Ie{jnm8 Ŭ [ %eRM߁~,Itz#~R': vKV|v2`dbM؝S6=,@U*;f;9:4 F"TCpCVPUgk6e퍚ϲϳ,Y~$k ''ByYcWN!E2VaW#0Uy0 Q *k+.% +9~sl@SP·*IT O=zUք|5QM?Cy _y?j 3cc ǢM`7UzŬb5Ǫ=<bc0E~ˬS.㐜 'ʵXZjѩQ<P*[ܱ\h+La]n-?mfX5a=xIz#g {V]`:|yw̆ } 8zΈ΂z%C!_Qa>yBAتH7(-$DƼ]/)r֜Ϛc3DS Hi;v_|7v' ÈK*=@h}sx=0o4ÄԧVĿ7<N0ۣ[{+oﳰhˤPOK<^SHa½hDќc8{n`LgY] gq #ΊOeM Tf HHL'= %ա9 {8֙je֙O ?%p~G1&ZAF I~N~Z%Pgگ٥8Lgm#6&$] Ӗ =?(@{;>M4jf'~9d#|)y ,. Sk w\zU]p58Fbyyedz} σ>,`WS~A* :W497g ^Yqb:T-a.mW 'OX\JG;6o_;+o!)atNCܯMG]pKZ{ݤצrE.% + Eiłx,C (!zڗL֥Y sqw#N?8Uvt=Sa?@.k7ƏN~B?ws~ɮHt֏!S?wY_Ml3R+Ǯ8΃ZMOxM8Djɥm}ƞsEN}kShRJ?A1iۨ?Af.ª!8lI[/{){xFjoַ3K 뇒bik ۷(giЧwT)D.m|wߴ؉t"j.Is<'2%Flr"!FlzB (d0 ڳ\ ~|.4au!h!h<ZVZ\?f͝I7^ 4` v~юNQ1q"PxCVɅV8~JϨY=g.OV+> mNpl|`RCM~͸!vy|CN԰HQ[r!F(H JLڠ .O%!d 㠥:t(!P@~LA_9qy |@'pGPA?JP#e(яtՕ$G?aJ!Is'ܰɉĀ3JO$i"H*3tO$Ii#R!䁏A?V`U#L<VYoq2bҮ#խKʒTr*V:_؛b^h׍5ґ3`9z0qҡnO0t[$9 wNճ:bC\hh!v|#ysSX2#v9c'Jбdv"¹/qdy |Z}> Cd(ӹHؾC(<th 'l@r-Ukn; ZʙbJ}?(9Iu8Ȟ&yLe9 %lSî~oiGCʖ߶jtꆮ*Zh o $x 8'E+v3JCJp='TE;-TPiN(6Fad hCx$th'LဪHx@/;J/sv@񑤺=["y&)P%vc@}T/ǎ4k{(I{|-%J1*)A: q* b6Yil3;%p!]EUŮpҀH!S]P߀5*+hC(^&Q7AKU-з:a4%{@yt1,pB4%hZDZyg <".,ݭzGGK4umwT?Lr~xssCvbwQfFcIН;;Z9f|l;7;7gYU]슛O'FiV,ڃIsfbdL/עHA ://)6rXB+;NWptG\[bH3_!vǁ^˓J 'Ii($7yנ[Bb=iYF'cqRpqF[4w=)N'͇eߓFDg׌fv ;߁KѼII1~QmQP@!ˇ~Cq1b7ed8i4 $D}x! `!q:_~ Z߱Z#o@k8#E)[o/LGR,?Aq7h 1vvhpgN&c8ڞ AqQx hj͜B{OQnb!E{]-%-+$ 71(xdTj؝A~7:Y)͔+f)u( Jgx z8 ZC /x0Y;j: XXe|/m8ۋ%1$:h}WAЃC+b{let.79S:=πo@K;;="h9%N.ٷb:RL{ҡ ME$:,(=uYUEgv52r9Udn9 9?S"-?w&pԑ<17Ccǔ5vtj-wH||OR;aFGPSv"s*k-i~4o/׷=9<όUsk \u-˥_{\gxp087s|pz^ϾOgDB2V///,/%Tx YƱ=M~ލvl}n2R7V^ϚMlX~3kn56 uOtR5r0~騈/;%Q[km}kVߒ|i;6moyͯjX:`F̆7iL3m/TZ3:j*PbYufLmFâ[GJrбb;|lzY<J}8}8ᘆ^"8DtRCiUu\^694 7!^an|uxծXN9Cn g]$shNVz v'BHQUqp +B=ZO>JAw+u;`^l'@Aж|y5Mؠ"v@K U\%f tAg5ƸBf4 4FqQBF<#m1[o1 VbCMk*nJՂ7P-@ZqWc(6YbGv#¢=ς>V2Dk ؽ謱Df,{V1iMJ 1v?pF#ĐUg?kɑwK+(֣wie[MznMd)|k+U7_᢮f;UJ@d@ 1ujXWc]hmJ}(bLqp+qa,AFA7|Fd|fo: ,{q{y~#3H*ﰪ8V idu7-3|T]l p2ȏVN,Zݪ5שG͆e2 nMЦ^|EwIH5ͷ4#w =u`tAYiET6D"_~,5fO+NժG"w=?lRruCQmx}pS8flvȡڸ՛=PH(Ɛ_Lts̈}ARy<\E)djy{磦UmXsRsOؿF*jKeyz̡PT׫M!Qb})u7?jDXԁR?Û7om P;#6N5U?c@甥Bogw5ecqOBP,謲7wsYI&#f6߳\ڢo} "uC8TrFTš?!bvy 6K}'!X\®geܬL@iR/:n 7Q&(9(h.c{6-ImK& &3=K8zPԶ;h3 Ďc4jKIZb8dd2t wIlӳ j>~\hp ~!/8DIpm3KB 8h}Hm,&ii9ZQ_iM_D|;k;&(v76c:Ye@`&d  v(;Up>DH8H&'>?EQ̘6zoZMs{֥Vѣ.YY0 /ݭ{Va 0+נ_+W@ա-ۮ[/43uQf$PtܺQ V- `;z<}$>n]Fqb+e㖹Ǿk-pAiҺcOsA O~\ u$Ko4vO恋խ]8 \,L+kܖ`b̓9<T̓}ZZ;-Ipxymj}@zz.GA*DMƀg)9s*Q<[ߦ7< | , |5T.Ø:fn $R2b^}EY?ya5i6[=VQͲ~ Vu+lr' {AG^խU*A@|V:xf@o1r KJ[NL t2R_7>:U釷h-Z~ ꋟY,.Ckz8E`nY^1*O[ʕVvѪ @|BbU&* +%P)E+hb;MdOegNT\xA:XGg']v]8^] $v`?~eD_#Zn8NAwGB{,O|}~;[O3O}5ֶW  ži`ya|t_o& ډ}Z)|IqHGh2_ \gA͊E͊dx|Z}̽NպG!A-( (iRݾ#z&h}}û4wr]<.vzAYDUj6h @Rn8f γp -OK_Tp`>G"{zegxNgvG46ʆ{ŬQsYh"wɆ •ذ%3Xe@K^>>?82a8pÖ'a, '#+ħՈ&΅;xl7߁w;K,h)O%}CԻ]vED 2@.inERd4YcYCrx5Cߚ_Lu)ixT5a]A+Ol+Rp$p vkZ׫uAIGaf^$qpfr24$]7Y\ӪS-9E`QTQfGՖ; IK[e$1qRpŦ|Fux r$rt)RæZCOszEW l_ӳ󺂄|iR|| G̲eebwKu]m|a4/)NXL=t"LPl 1 &3Mt$O8zΒ΂; *FCpn_MCR|%%m19$]mt 2^RkĮa r2MYՒ[1?U:zYs$uG\1jOsΤy#@/wߵnwKeQR11l_w?Ğ-Y*둸S|<ҙ/KP70hl14/i_Mc4K.()$a#$Tg<;"iZ;+#l24i`tA]oXJ%$߁~%!v߁b7\ wxb!FZ7{'U[ 7hq4vk锂kxyMBӡq2-EnWOg븑Cߨ{87n_8gկ|OUѫ)FpPԕL)ƩnFz0?~6kn(#~ 65ш_s%fe&=i[3hlѼbCcY<ޘHNɍvYni[50mˬ7<6OШk DN6+ OnY 3mjVu;HJY Яn}(d=ؖ'mMž^-Ȟ| 8zq-;ZF&ɡbC2nVC2!6с@=M@8DTêVr(4d)%&UỷJ(ҮqEE…/=4)DFtx$T͕h1~٩y x?1tIi/@VB>`;^JX!v Wb^-wW B$^ v xԻ|Bn$ӎuԬZa+N)[l d *%Xy. iFQy-#^Eo@kxO=̞5F$ G$l"Z"{uMfx$HAĮxD (ګIƎix% QŮo \r?쀚ģ> ae8z@%wa?2$J첀v#=ͺ.7MBs(q%ۨK< &ch6UA!qqf!n5uz$pGo" jA$0:cM'q#p#3)_7kn Z5C."%Z5I3Inڄ]֦a0 XNZŗ%^$V#DisW!nSn`ɉ_C3R =dkl X.K5BCs]J./a/o0O<ΦKhjq'[D+ Ժ?L^+jSߩLUף!*AYfkTM?=;"F5ϘSNq+DqTd;7-MMPo 2 W-JXE'!$K/? !vWFso.8S(b|OagͧU>W-փn5 &$Z-dzCY W371sErX'=<ߘ{(Zy,ٶfy^5?.ޠBF DHA&wr"rpLc)B 67uPE π>~EzgAUVݮ]G+ȬI}輙|=(FUtt% !X'\ͪQ#qh߮,׿؄s-w.1hπ߃rb==e'!?Or- " V0x*r=Q6[,3!SÅJrq _+ؤ,+&p&u.eNcmztQ]v\Eҙ^n<EU.|9SP!"V>@A5:ބnX-uEKqVZF GVBSq!&oAUd;^a#lc 5q_`lVʔIkvdfL0ebwQ̔)h5Ѕg99m?ʞHpxwr8$] )=!b滬M%&ϚY޿'Q7b3?Ao N\?\.:Ԩۣx8uJHA5zD(ĮX-5v^?6w!)Ɓ3V:OmTBL1# t6iF3֖6+\(G Fխu)FG$Rx; b <zQQ4)k !O?pFmRۋ@Qs0>66>>!sIQyͅ/V}kR%OۍϚmVL-o6}h*Ao}  㙸`A8!RgP]xw݅o܆Wd|QxY 4/I pT$މ]70;S=Px>.I w!P߁ቑQspllzp'aW@P"ዡbO&2;6I8ԵIMٮ9v -DQ\aǡVn|+ τ%!%!!uބ}E ?[Be}Sb~xIu4\ԔЩ+;-_q~ʹ[; 1RM;!v" K\,Ug.q،}XtpMQ_Z.13 _C~;gWvN`|J77/i(CI':ğ6?Zez\l AK^7!^an|}W}y )'| (ڼըo^c ^ Nj谪8U#L!J5.4_cfs$;ZiЧe3LhĮ(ֵHOI,jV3=# ŮI-90Y@˽*Lj4(*LmIjFGbšڸrkI#|=Bf)YukxcsD<膰Hw=%|8fd#Q0;񳸜>d# /F3qŅCzh>,X/ڨY'9spAqp ̽~R3q6!a/hdϊs # CC#n01 _l{'RFΦY  {*6 {Sކp}P+hiܕnxWk+&R( HɡuS5\;99 2$ L_C@M}-c.AXqʂw ’'N [[ȗY%7?5:.b9nL+>}7PĿiôBOqI)Нd <Z߽ToϧbCob{xFgaH F>`GOvmGִ ɵggea6=?"|,/޸E{oWjzVY2;N5=15YOLNs읦\ŪQ85Kؔ?4;]Ћq-Oj#@q.G}򵋐Uɍ B`uJ>؞EB]&^JtO>!#P,מR05"xc]FZ:jvQ4 @O֧%~OP:&ՉBQYR$UXq!B ?!JbB D2S4`=ˡLjv^)vwߛy_kU9 #"|F;r\W#˜F$HjGUOp*/iEed.g,ٞdOznܠin-V(J%fP<!$7mjd :cz^9ԧodۥ[TP=HD AK5f,#w oaSe-1S$jS$(Kl2_z1 U ˜DfE<#31:VN2ٹ1>pdG%:< Z_趏Cs5n#?ϡt˵wdEϩ{Ѫ qI֖VA/r"i4i3lg_@d{8 T!}/'eW5G#EIAM7U-c3j6p6tmI#̃Χ`tAY E209"N&Z$pr!%v.k mkw@88&ES?4 H4um]_Y~x\ ۧF3G4TucIГ\QXM,n&NI;n&=<쑲../bW|:1JeL7srGf}?nf'2F: Z*Zנ[۠okS"=.<$a d8 Z}`g&Si R/eΨfݵD#!YFB/;HdTySI+ֆB@h(ZʁkPM-r !b7ܒNƀ㠥: -=)NRCœ^ uP'=F'esۢ%a{qݦBAw Ԧ?Ȩ6(i:p2.Qň=\>1Q$hQbÖ4ABtjz ڬ,7hʩeC4-՗]#)A ܸ{5o).QT1v1EQHQ],'T:l5kq݃. $|< :xFwq"9hug$;V~F8Z@MXij|{v^s*kf3_G)Zq}3ߙȨ9_Щ³*} pL,|*o5Ey'\{?V776M+uΒt\q['45 1vd {jvѪ$#;]=Qkn.p & "8h1#Zu7OgVW/5'yQn}?evvv } G? 7aRB@ qoӤݘnщII/#u3jk%%7WetxkCZ◎:?H)b=xje5h g&\<ׄz$iՖ+ f4l_q*oo;$k Q;wV¥vȪn?6cƞl8n=J+,e_5߱;gWyniWɏWH.Q.qN}d .jsuJP-u6+X%0>|r!l~CE1 & ƑoE[UjQQ$QUqƌp+'B=;OwfnJ$vkD$<CڟN`:{ "NS$z)&Z?K>@1ܾO( 2qyrKE_$i<6Ә.^J4&@Kd%qn[eMDi  ]1$x)o'"DQlsή$^RŲ77w;k-㰐լeOܦ-8ɣO pr hhJZ!9DѤPa'cz2 EL6GԔ2 P!sSP9cO6f ꈞD<`t$I&aKt_3o6 NCgLo{n8 1M WL?;)DcKHL]H۔EB "&kr.4D;-t5c(t[H*jYPnpF%eZl!;bCM;TPBIz@_ӦEZkq'R7WERE{ B/EYXe/gΙԨiy5Fڮs{l"uD#Z) v+G)Xsˣf=JP(/~(Yܤ[j֧8ue?X#D4K/ Q[+liQ] ?UzsI:sܨ%G7QW$W{KjQ6:IؓG]RW"yԭˈk[lÅV|W_izou(!Gܨr٩S s%D'ǵ ՇLuC/.Rh)ZH2^1)4m"UW5'sP)=d{֖9\ug.4m`>©|I~c'Qt%I0_.piB= uM|ly%ݠoũZ7*>>OiO7GHï%EzWUšM^Q[Eih䴱kGY/97Np"D+VV\,Yu\Yֱߢ$voߣMQR7ah8.$pf[Ĺ ui8լiΗVɦUn`[[xVMz߆Ί9fFr:%QHcK/?"vA_VVO? N 9٢Zs%bb;z&}'Ig9DIIr$-&!Xx 1bl0W߮n).-SN6ă?]?EMRYѳ)=h;NH mka$vܩf 5Zau$<gw9#+ovKv,7+QR|V6M&z6f 2^E_6y!r]Φmp 6܀+U:p[iuEPJ>Q )iRS(w@ߑIS@fg]ԅ`QУf"2uC]% a\lBK1vrf SDMx~ (5lvՈVktdeH1Nu3:]i1(d5j]ȝnnyR]-"MQ,A@7w8GthKxCԱ޶Z/?jZ$XG(=ώztd-7ÏNrV9CqUqIQ[YA-u,.HCoWVo`J-poax@WG4Mǫ7(!rGf΋FU4:!a~OA*Dxx%- FsE~n Ga˄AKS΁ЍX5z C"=2G,ڋnCC(qӡe~ruNmŖ[d;t-Hևqe=pR%g*fbM%5$^$y[3 RI <@]JhqOّ:vo_5z1;BBFr90$'j_`5gt4(&]Ň[QNGcKxؓtO?KG]{)Qr=wtOv%'y8Z=\HTvVpc܅.~ԘO  Tg2r[[[Y}mTQuۮWRdJ]빀0_J5۳ z*z}kݨW=M2nwq׭ C{uG9o0)Fgdo=L<]$DfAg5F K*0:i;̃+, s7k`)Zؑ6O݀p ЍtLnLDŽ~nRJC{ z[cTƞmHpǞ}jЀ8rCVYYM{-yu6O]tl>L a97 WA*Aalz{9gAwB8(<2?\mxtn=~b 73I# 5 ]_1rݢcFrԵ]RHh`{Գ-AQ+"׀MڻHsx -Xs˥۠կw?3-<$ GRnT}8~z cC5۫;=,Z9ƛ=+so c׭qM|5aGT4\&nJ$@V!LT܁,h}vOJ3| i({\fabXabrJ؃(π@K߃.jmq h.K}]5 ;oH߂u{~Q[ z1h4?KK-~v펆5ŠKh:BBG](`; Z8qJǀYRkv.t !pt](VRx"p{ccx >9h "B=>tlnu~4o/ߙ(/kK-xA-Ƭ"I;~'wX#,7a.m=r[[ bYo2 Zj&=]7p8'-i7W9=]hrD cc}'I2 | q:3wI3d~:by?yOosyQn}XRZwݲ?;;\Ku #8Wg 'x'=|yq~ay)kc{t5;;ʠJq"z 8^ϚMlX~3ˎ\Ŭ}~wگS\JzEl} {$ ]μ__$\Bums] moU}S k_G#W6vt/[ƿ8?ivb 6jWwfCPG[E Y,#κ]w7z[VaަG kd8b;|jю"Ǥ|4r!:*#|s*B=OO4v>Pt7% ٮMЦFϷs{CLtGB>EOu)d%vAЃ*fF7@nwS*U΀ia{8 ZŘ}&N܋!s{1n;{id5R{ie)B캁Ae EC[-S0KkuqL%a?0KR!JMuREhY,h>1 |Zjx7ACrR M(jtշmz aVDGCaľC♯' vuCv5K?A%QO_Y,o{ibUD l8`Hf=ukBV_d~1SيU/$Ofavgq9^-w~+./71PXͥĞthmx;9„__NvD%̃+}'ST!R@GQ3|vrJ\"$#c^̙S77 g@KDIqb_J rZ ~?O NhL$CڳR99 ]m2ȉRn@ ]`FM@.%3vVoT* bU)S+u)yʐ0:m:YX_~؟bbš|fϪdW"(Sc>Ra^$󳽽zqNPD; V ?!&%ss <Z}VX5(r ӿg_ 6 WAh: 2vN\ۑ5Br9)~a6=?Ǧ?ZY0ͽqV9ޮrJkevnyzbj(BbUsRQkz`[/π>H!??;gDn~Z};~yb=2*2 WFl*s-w[؞r$/N+_[*q@ۀw)91L"!F\.d ݁^ 'dڳ\ N~&[TJK']N"&aICh}Z9ZrkqtR'^zu4qx'zx*;Vܴ ANfyQZ –IL c)nBI!M*>P!՝z9G5H(<*Ł'8DQl\%s6R3G>蜶^plyd0)JZ!O@?f܉.=[qK D Dy | HْN73Ld_֣8Dƭ=["YT7AI-]~mgR/V8׈h2DVzMFE IrxumMѻZShP Ob!oY gYBYdde2fTEQQS!kvU αhǚYA>B.=&t&ۥਙfGDi sϵApywؕHR⧁ __~,GNG붬mL<, t6#:5&.7b7-ףONsnl >-5jSOX |.rH9"Ee񣉻FV+LVeq I)k^5a06H$#7AL[t(ݦqB>`+0C@.HLS P_8T`N8~ݮ>ps@7,1-ࣳQ{jhmvP-?u ;H씴6ba)߯vUXMh)mĮ_Pmhj0*]n\OA?혉TM\P3`AwC{8쬻1.t{!/Nacm%Q4y\tS2=S_Kl5m$U腎uuU7TCpY3TWud pvbibCM.n*H6!@KMyHն U>3ľhB2$9`(b4_J׿B.Z1s xrʹ^BsCݭz5ۛhQ$ٳx|CG@hM,E$|gw@QTRᮇF> ʾ?|)OcIГnV0ŨXl;;FVŮdbT`ˢ=D;L1* v}@}Qx2&m"j]%VIA :QUMꁈBn9ZBjdtNHG'I3 8 zAp[$`ۉq_rGtyҊ!!Rrxנ[o PBŒAțNMG'g8zt$-CBrPz/f 8*?!%4Wd"mJqC]cBbԾ_MV0>+QX~cjզDR<>T4rNh S\ ɼtmOS, G]uػ@uqQ4~ϯB{GOtv5b!Et/uZ}m c Q2Ȩ՘*ڦiuYMֈ-zYG(@M1gY+0$20@DG8DiwDVEp(DNV_7Źz1qCXbC Z%;(hucsr.tz#q߀~j\ءNC4:MzI]CwnB[f5wqئ"up/:f7˪mUPf⢷n:SKSߐaN{Qn Q_C 5nъj;c:UXrI~N~!tD/g&6?,57?_̺ާ\wG:^P9ntTE(փV5϶>5hoI%&\H݈?EL{Tř Hm?*!ݭ}cwOp'AB|)$vAw. s0w.BH\:FqO( vK5Ÿ!佟Q5H[o1YtLcweMbI.~ӱAN.Ve#.b_ES\m}7!8桡0Sobš̭kI&cɬ_J;ǝǰլeOܦ-8aߗ>zЇ?[ ɝW ?!&d,C}RQ<1IsPS:nizd6UdZ׮zZy=km)G}sUpWhc!F ߧ侈m(bh  -6\ZeNJ ]%mt5c(bLqpq3aLAHa=(J@m|O?t,sѩ:F\r%sa'3RqVn/./<A;a tIםz9q|6h;}MuQ$58 Q[-{g%R}2Iɇf7F̴.IYiCN'| r~fub'!KVլN>j6(plj*׉)ŸAZ%C_! 9ͯd,(61D_7L{S- 0v-JJt /_Yچ5G)>=k4R\|JEBƍ|= <`zPRb})u7ElD\hKx eQG j|Ͻͨ[vvrKEyކlԀ0$_9$#ݯ,ə[-2brK|AE1FmYE{)_"X\f^ECD78d|D|K=렯k).vMwq6C(=nm8`t^:ÉE\Xq.ZgYꖹN2 =K%I캁7@&Lor _^h b1hqǥpHFNh(GJ?IFE]j>\Y4[Nq Xb\r߬Мf£琸ثń]Yep*: 4'h $p|>?EQ̘6٪oZm6|(KpV5r ip߸"| ru l`ͮovgBW?ĺ(n|2D%,.hqnLfM& 6rH:pؓ]fCVDg0.-5v(Qڋb?!J3`2ͭM 2SOɈX jf{4)UJIGSxVT$YO5 \7؞-5l94(9mcӳsRQB 4hvP2>L{~bo3g Og]fAr&s': 1S67M!#WoΒ)g@ϴYbLe8 zV[JbCvD}zE%u_y }p%_+/I.4HecnQ\Jxª[O5:7[0v?SO%uÿ cV?-<Z*=8׽FOE,pi3mg7oHSo@oM1Z-&Ki|#v/eбwha(߂VGE?тy& k$ւZi8E2s\Anu- #Z+lQI}ê] x,vojT1KZpA[?b-MsطmspokVF泝urޅlpggwa 3SHݐ D- 䕺6zV*UCQRGa஗p`>j ۫kTh0g]; EJrNV?D: D[DvUzV1 JۓMAoꉮMEp }cB9%nM΀vJѱb!JN) K$lS:vJ7T/tmmAu׬y]yҊ]bA"R۩t,G8ZG\gMjΙh'^߃~>O?>Op.c}!J}>6" '!\i*FwL7L;29$&)O nݷϥ& Ʈ6\~GCƁ+W=(SM&{03}bVN0vv}QeYD+Ev#<@+-5FVv9}\W5c.Z%zQJ&$'-/%MT7zTlz*d5d߃VrE&/j4#,3hsEq4PǠ#taBp=;z}v.Q$ L\䊒lMF"ό[6]F;7:?QzMr>`+2ԅQΉN,E TjqvRpx|"eWApIu;ezŨF_Ӑ$X?4~mᐽ b 7QcAg`߄p1b7G&IO/-5 | 6K:lKܦ HKZFEQ -O~ r/ i6UA!qqf!ݯ#ֆAGE-AuL#;դmȄﬕw8Z`j20cKl*,wM/)sћL*2Un k4<-nS>STh nZ]>K&ny1-ّIh3xiֱl01e[R2 &vbʦL ;?(͌3c7vajRZZN Vkq *.Σ߀V?4YʱXZvc$rͣ|Ѱ`-B50῵i0tנ_| ukQgȨ/P?V ˙;u8w]0`OmQϯځ . gWwt5辖S[g.Q$;T붘8JQ<1Rq @t/'B۶BFWT6^px ~Z*Fc`|mŕrEM@/)Kx47ްrEf>C͆囄wL) QRL؝S6.g9FëAOfxH8TTš8(4m;}nl+ub춱n4S1?^ɭ?7hY·Ldme%fHw6[@ok ŕzgd~!zhYB mjtvxuu% JHC)k"/!]:5\J`{8 Zqff ccd΂VJ-ޏA$M,]_jO8l>>/̌gOό%%|Xy8Pn AZ7i@n\ݧ9X^\D8 5fܨkl.|;zrɿ0CNh"^:HDժ˒I5hoI%-j.ۨIwNZuG Ύ||_J/]c5ߍ:1wQpVRԮVdqsG->jql:vُ[c3o~aѭVmvWQ_Z.:Z}CO6MԳ4|XK:N3ZBM߁~\!Sq.WQP tإ{PXOg-g+/=Yz?=&,n,h R(ҏR y@KLFZ;{|ZH~Ȩ9]?66=qO0ρ+Wwˡbͯ{zѼepʿV\?pȣgK%ϱtr̛$F|Mn>p ۾gG\A@uoBtMI]oY0$dȽnI캁à1oU^Z=~I'@'e066);IIcЏ;Й?je֙O7*~0(xO$m=}@_QGIsRH0GٞݑWJΤ^uLj;ڄ皰 IWN5X}D]٘ݸO{fڭ)aUvX?Adp韫Ųg͘E~5߱;gWu ؅D5qq1 #E"uq"Zoމ'g2O* >gzb0k7Whx[Ϫ?6QB>ϗK7zD?B ^нbCWt7%D: <S p?=G*SjsVA.GA{r&C7rZ$$p6^+SN;| =,_Em5JPuO8TaC z8R*4jڗŇw$![,c;.<F w^]77 >n]d~1(HFr!u^y2͆УUmXs콩Qz'˞f s,m%L8 zZHx/Nzq9mfkm# of}DYVҰ5D7'ExԓDKQgtchS{Eu7sYT9~@#qK=-5վH"Q?wz"^QXp(4!ڊZӔ;B=MSyåwSK5,aJ+]e$lΙrι $+H垘3w'U:prrwCifwiTYak0:F&~FpI//Zmd6cF22ߕp׫oUL 訄}~n0Ah~$ 7ٵhu৽]K{2[ot}$U| 4A۞]-*y -M{ MssA5RKs ݀=K*E}PO;NWuLHbmXe9N! zo#]'"0SRGz"Q_H]{dX#JoX`IJ!Je,ף%6 s?uħ~ĿCM-Y/qg iMP/7ewF8%ݧ.?[wsA; V ?!&V‚P9x짚 <<Nyğ3D CU7ZN?A>2k;]H=/>L?v r3n޸E{oWjzVY29=15YOLNsjbUsXAF?4[;]JFW6$a50;acC{_0G!Z$>{j?;ȴ2Q&6ls- wמr$-N+_{PjUq|t01%Flr"!F\.d b^ 'dڳ\u ǍD}IWOI'dЖLh}ZAv-pAI7^ 4<-Hb^ʎ7g9er$ms-!@-38E4?>7GɺٙLe7i+HV/XðhS/uh"YMKT8DTQUq(Dq'F vy`RNWp28jfAp 3m]2qP&>\Y]‰__VOqܖr]InAOnAká sx }WY_C 퇹GUvJ԰HQ[r!F(H JU%f"3t B]iέuQA[cǴ5].&&핓FGN LݺhB=@OC˓K^}Y刾nJp_{,b%3XmTl)$!hZq@˭1ί6fZ^z|`EX >{u;J[tMr٩S02TXad["j&1,6;uо-.{C .\aUE2O>91ZjHSQ$ǖֵ+ձoaH~l!y&@ہfƀAo@4ZuQCA/*uY\[ 5˷KY a̝Gaz8y L`=_L&y@K6>Xf1{ P0OoAU[~yv9` A뒲a<34߂VB b:Dn&|iHGj΀ G:b?!JFA?aG4m oHpܱv;-bVUQ~'sAN%@GL@dFrG՗N]8%Nґ,o@χVaAxh2 pԎ@ =hB၄C ?aQ/Q@^-LrKli%ľCɜ̃kJdeh)P%v}KFP=y|$OH `TP˱#F~>F.JCazIRoj| ʿ=B >2z,;Hp) 4M{8D.@I#qND;Lq&v}@}vר.[-CT?5ʖԷEM$:f4϶Tq`?t_?4M M9:ns:p? e]]>$#{|(c$I!i$u$Qt ө5[2q}|Z),r(}GN߂~\}e:b G ȍоLGSsŵCtľC=t2+AԦ uFo.[ES t{v.Q$-Ͽj)iY!III|'D#Vq=qdNl]7;M#DIV8۠abx)p(ċAhQp(8B.t{th 8š^,1!AA*[@%CJ_hc,lw UގvAx|Zj-iAK͹5(-(it+M`m> P֏C9DQl5|\4?N׊۞gFF;vKC'^J Ϫ[b\wصU?k!4NzM ́T@I.n+w\[uǯ9+z}l a3ոw?ͮ6vAŷ7hIqq y qձK l&O^066yOx!I&A?@g~Zg>~c~94׭OZ)~kur/%* \!-ܟg7Y'?Ṗˋ K ^-|qlObwc_D'U$m?'u͈Ufl̚z͟/f]S.#~~ _:*b {$}Uwͳ~*[p/?mp\WFM4׺U}S k_G#W6hƿ8?ivb 6j!6uNUdp韫Ų=e?n͘އEZ ׏%咡cɗmwl5u a'`S'0qq1 #E"uq"ZGlWN<%(#\!l4i/oBl=Iq.ݬ%:"@{]r+zG8D杬F}>2FOЅ"D4ӣIzRv| vV꾱 Nρ>1=kdJ/K//ʹۚ-qBf4 (FqQBF<4"mo -p R+!m}7a jPwqw}8G1Q嬿ncчaўCKgAf+U {4n ^tX^@"T3=y״E&4$tm&{%rGvBOsI+=s>}(;栦Wph%{ uo^j^CAKMMTC/p"+{xF}jo.N?;+vdM\{Vd\}mϱ|̪[7n*ەZn^Uqz-GLOLM3\ŪQ< Q1|&8`0{AsoXD01١=QƇ/n~}`~b% #V^PG5b("`E"*ie\ ݆ ɺSWV%nE]w|G|ׁ(b -4\ZeNJ ]$m>QTŸ Ƒo$V@f i5H7#–Y棃o,v+b=17WTX/9%\:!r6v)@!(60p2jZچeΙYLG?QӷR@ͨY,eA[Bd@~a̫&yQ8DEU/rS$n b=POd8D+VVR06^VzCugˆ]7(bCMfV>ܵhqRTȅh,2_1:Pw~mk]E܇>\Y1[Nq X*TUoV( /N e8i4##fvgÝ0L_>DH8E@_^)=Ϡ<E5bX&Dճ ]E}"F]iΗVMܰSNC5X[]5)6.4cu+S7 > }@?nq %q ^%Үq,$DǭS{;l2NgAէMB'FjE?7ht A/[Q8}pg;]*Is6bux9e͜g;@KMp-2JrMLGI7SԻO'ڗIiCy\]ܶ&;ev2'IcϷP!u7/V#7mfp'%jo P"*1| 9PqUTH묁gyatytS]8zNY9|#cЏxwS.35=+5zk#QFŪn~xTsu"|r]^X] kz.E`nY^&ۧfJ_+[A|k;hU.B|BtEUgsp*h>SMl)PآSKPiIlPCl'AKjQ;%eNsynyl劭O gUKndW^V!&@?gsIz{ |];~;_%~%4&κhXkڰ3YZ]<#7z]D< ybyb c}!J}jhN `TB hJ#-BA L7|xxerRHQqMyf\n/w{^EnbwhVq2hUQbdĖ&rɎ\ Q0۬yB*}SBBd-o+HkvYwY:&j0ZIy7YP.Z~TpThFOnF\%Gq `>f6>fMrGGс/) [-1,34n%. hX@}l~ !O8DTU`ʊ])qRb!;*Π)VybiqpQ-jEA ѡ>`SdjW-c/GGdӣK7 5!x!h&x4tDI!`/XB> ؏e\ݱFN]\#.C3WPHk{.[x~cAY B/᭴4G߆\\(U\("cQpR ՚ydO4C#zðf;({UӮˮHzXr`e;${蟔^ {BG LuAbhugmtJ4 Ύ @/)W<EnVvtÉB,kIh>A Mc-B6AЃڜV].9~}$b>e85k#^]  ~ QZ- 5׭DLB=qVw M0Yn]ԺFaQܮ&:lZ5%62׍]eJ pԐfB ry۬:q҄-{HV<%<wEEeWAhڰV]Cd Ɩgsm<;v%4 W@/25-ؠBQAu3Sɢܫn9r3.A}W!9^@“ bCE14X̗V5Q\<* hݥO[ ËZesسlF4r_0MwNߛa R`Q,!\"ԷR|ܩxݗR|K)n[>Y5Љ͵(xGjqYw5q $~1~3 (4}6>8̎Paʠ[(}6t21l0:\~>'vYpI&$$ HF (.U, Y?D$@TzF=66RFQdL#d2dz'"v>Wq>-!ie,T,܁r(cJk#A`bprM_/fYrqGݻ%GPE|ث__UX o~.[N_ 7?ӀQZkL'̲^YpG]WA*NFEY桔3 c//6h%K~=~W3ºZ@=_~XGrl u`4rm{@;8Dۛo# s?#5DQl/>ϲ{c.fѤzKi]- 0h`/A_j58`u[̱EA]22}]`A5uşP"uAB&d#O1)NHpsm]fAg[?y"v99eS&]q̒2JMW@(K9tXv#vk{d&vCqLPi37Fحm%ccMaqLs0궙.(c艐{apOrˋ$Nl}wI솀Sb%;=l-"hJ0Ib6|Zjxr?''&lNJYI[k,0Z*) R]L@K@"Ygc:~쫷s8$ WTyCDQlq]տv>]6ZY{;sՍX66i1X5yq_zE˟d?lZ8 z2,Ucv@oӿpCRLAϧ<ՄLw4돳gY|n~^|&n#!(IMWE mnnZy^>MVk,|| zS2^;a/CwW]S,?s-ѹI ZNXB캀@KMT pJlǥ-0;q -N'06b!m8hyM_FYH~ywǝi,{ =+eom¦pfJ8 Zn%e#qQ1Ȼ tv˦mDDu=['@ =,i46]ߨ¢rGE*A_7vv~Cf*ٮ?9z|o~ ]St___3?Tm)d\2Yrl.,,~~(_ij2;uwnNGLLgəu]{xu%ˠ/Vפ;øt=q:I{ԬDI/՗ U܅\0k;[o^WKVfKvoDg?ee|u+F8bw'&\4u굼I:bg|] i_BS6vl-qivbLjGs̆E.MHG׭MFe}_rp t$6Z JzoLn? %/D4v!d'uIAQdkSӂ]B.JBbK oxȺY2b 0}h\ԔHE%eQ-eQ6,<8c<[ ^bR>ȪF>7$ӁSo@ n2YZ0/ = 򽹷k;Q׀,(ªi+؟%!놂u-uSX5?Bg@I_5,(r }g{T[$ ,~O?;Տ/eM\/޺/T<'v(ޘJn+UJ?}3[efnNM7swr% Fl6bsYkl_ viZde/czACg]ƳoM ~yZĐUj/CeW^Y{u Of$Zi" ke*|сBR7ʇgUJ==!Ob}~2ErY_- zlqHkjONd6t:9[/7{(?&I' 1Y 4<~Z#zd(ZFԒ{ i+؟%m1!6-cV_K>+e l{ ڑgy(G!ˆ\i)"( T>I`?(]4`:֎YfS @t #́%õCqhČ;M@/)knv.P_ jX|W_)־>ZLûadLП)Wf*clK[b#'{gm*|k =t1Ǿ 3Kӹ^Mu+Q$ Qƙ-|"=$#+GHaQ58ɼͅ__k).(uD8 z2al 3ጞfE ;A[S砟+kS< _(1BW=f6Uf1lukg]vt$0!Q!aƁÝs񿽆n.(KxK>b2 ?z/CsQ+jQohO+谌AK#$&fMlH@o/m˔:ސ~~ ghyf)ݺ>6l(Sc,.};pP9D $54V63|Q:&3\~0ѫO$ȧ_* t vBRg`t)6bPu"hZx 8DiӈjMkuQ2E},G ۸ 9T[]t%<\T:0E[>-g63 |)̀?^~ca e0@R?f,ףUDޠ=Mdl0X.^"Z!.,ABW E y^}#lA?ki2{0n7OlErt;-b5Zj|U%Q~#"j-ul@G.Na@c.Xw@",/AaAxhKd X 5kH0f 7$-(mH. H -54s KLؠ?5䐑#p ՆzyIat4ulFFcHD'AOqhj-b?!JB; Q~Ĺ T4>oA.0'ma CO%9hـD3]ƠXxY>7ATw*)p>f@g,X$ _@#)&gFVPi&6o# ^=o&=6LYCh!U]4̛cgiF($Zx6⼙ 9o&.GNke$0:(pDۢQУ) &܋u2>? s:I2T\qWcd }FBρ^-ݓJ$W@Kƈ+":h<oIK,N&Ӡ:΀{R? *=)wFۂ׵[բXޞDhU66Zm*8 +mp_?{!Mdb}-QQPGX꨺>N QňQy*vSՔAu8:9r9ċM]/&hھ r[B$-h ]y/ loI&gA5o׋/^ۛaadekqAy| Zj-4wˠ ((i8$prS/Af$e6iwpآ2;] xBS]t8Pɬn_zpZs*}Q)u+xPZ[eë:߄΃OV{m,4D5[UEU6t]{GПYşJk:kpx~w)d\2Y*l.,,~~(_NOMfٝə59SkOWTxw_b /rv3?.H+Wdؚ%|Alb}}*B.\mAUmyڽ]Ee{1nț?'\LĄnW7IZk|] i_BS6hqivbLjAjcoYh7"]6͢wfL_Kw?oуR'bPb׻c:&` Fj'h;F"up"I5;JY|aX{Arae@GmXd2DdXA!3_%ɨza}U\Kpܨ9!Q]Rkf$Ih,pp7ư= :Įm V?%+.]'mayX4 ct XXQ-Rŧ$T{:$4kp>| q7!ZĉA(6)wejiDžE -}*1[^7?J1r= vsZ[@5Tݚ`)oU MD 7vm'4Aޗb?!JBZ96 EHE)w#ijJ 1K}|hAӠOy 3髆؟Em [@5M/7Bg=Z}r]ִ ɵo 9[T{ibYVR7sUv =7s{vjrf~v&s+\0l61'5}upf!("*Y׾Y7&} ?p"}S~;EX vR(3,t~ۿk7mkk[NagO +:}nݲ^ѫ]knlWbS=}p|ʊ'+~Q2v{z@)VS~ZLvDEH>S>|ZSwDžO!*cz**1#1|ڦwp6@u(yŽBDQldnCF/S }Qgdv>EP.4&[Q_8o]u9*N?4"bQFpuqCuH0!X3´ٶIo2Zb.uGQR70-59}x*;\-mpAn+VbqO"yb> <٤ܳ98{3j,:1.c[Jj,eO;ӝڅ{'}ԩ/ntj Nb?!J9Z靇i$!Y7)ќ?S]n/4loZ 'A5SOӷqbCm;QL%r*I3oJ׍pIq|@Sֺ_f=HI=/  E즁Wwxb!,%6aiƬGە _]n}&XFċj= w%)*%dBn[Vՙ՟yM|ruZ-^*Wg-OJQ eUkџV#NZ!]ځ{bNzK3IV=D+݀оU2HǷ)qLψAܵ,Jo?YTlU(018%tͅl>no^V|נ_+Պ \KF%;q;ܴ \גߖq}|!r x-2pFbm,TacWOxf͌f4~l:~w~Q4r {#Qz NjZC tIvfW |%K ?fu 4!JBY7*4#xm: HyUqhd<&(A`Xw>γIMd>?ڮY;(lX16)6nLa^8 عCބZRFlل(;poC0oT:V_X>ǀ+?=-'h%Dï]6yɎusQuK],7Db۶MB|/ +v!\Ns0C Ws J: ;KlCfZVt0 ,ѫP)gn[?E`7l5Z < l-؅y]΁>f2Pc_V`볈m~ Z>*ԏ7@g)hՂYcRfyîMrۆςq| Gs&LCi7:dbEG8-u|+l(aD~ ց܎B|AqI/@Kus\bz϶{o=(N$|{uѺڵfhu4j'4ȹY<ѯ[&-0T9lG6_bpB.p#7Ha`8A&VOtI`ohI6rǒ7J V&(w "F=yTpGY iz. Hk|uJUwCVY!c6(ؾ]=-snӧXMz W@(WjҺ'I76qpOsIӕKڦ.X,&\-u w2$?o}/LVߢb'/@˝&FkEfdy dI\++oA~wJEQ r1+kfk].zgl1N:q) 0zzClARc7 ޶XW`Dx|2m%8F7~r7e$%$ P'G@˽I(Dss(pRFچ息޾|l)Bg : ew.u#Sn:vּ]-OJnN0߁V儻Y1)G +8qA"^}5A獹sNà[gn5R+ za!Y@K=Oi /j0$\t(IA9*N8*FЧ ބ釿XZ[2m jp|q# #E"up8nQ$ (gkd-kf s\؁xY/Q~,!#@K̏%*ud$KԧD/~5˖uW0hB.eZB{,${dV67@Hjq(h{%ըz۶cd +jTba2c$v!u@h BwSJB9D}muAqԂ!=,$c.ˠ\\'v+(ۧy -(YNEH hS q΂M$÷ջ,%[wMrnp> SI&w9Dt+NU-BDQl4^Ca)!!u,3{^6')aI;%?wxɍ'0Ǧ2ә̝ pvq1"w7@Km5w5>P б\}Ť4,m7nRmWK{=(0 't r*D {K{wUNAL- 7_e16I|북rź4-L[Y<{">P3m9.\pw#3_ |TF0ѳ٬x [^9H܂`W@-$$d?{0n׿Vksrec̑xXJԮo̵GHIF= J+,{G8 zX}|@&7c;%);8m:&+Q!V֒ AҺ<DJ!'9DIH)}%md:ON.AAxUCr(k$+vk?4h8E?맟艿|eM\ɭ=^ȽuMͱmRK;osoR%*埾ȭW+s3g&ggg9;Q+l6bؾD}l\Ӡ9G 5U}C7&psZĐk/CuO^Y{u OfoƚRzy>MgslZ-="`1KD?_ԏ[.Ks?& FstNe&}~2ErY_- F~ oLBل0HK'5 %!tɄIqtrZ9^o*Q~M۩N|b:QDh8<Z/zd(ZF0A*-s$ tb3u- ^}55uA5àWS6Dtn}*C8z(%1ZO_IG`!^H%v]U V/i:aU4DpRpTąOՍ t#t5L֍}ݪHVtL֒u tki&SBIShg]ᚩ pk"f=e΃Wn\cDR~1ڴӞ =<ۤlV3IГE#@$]v׌?Fs!3+!cLJC;GAgɲ=BeyEr-6.{ MC%kdͮM!9,_&^(u|a ;],p(Wh5y @%|i/w$"G;bwzIY/Ǡ'( kЯQTVTIaB4z"3YRt׸Z6wƽLM\`Ԅtٷ^0ݼcUÏw.\iSS9(ˡȠ;gDZKlXTc@K"eY՘p +7p]dՎiДUD-&1k; #w$lm]k~.j\0(B#7&aՖD+tIRa$hZN$u֯0G8DQlcOAiNA#EHtGܔŊzh@K׉MYNA7AWqDc $4fL ӡ/-xPR55zZCebbvW@?^O0g'\IىN/paf.Ҏd! 2{ *Ƴ<,XZ,--&ɳigw +*!VX #b7"imm /H^Į8 z8}%8]V+`lL82s^,N//(}sq B u#GڤQУ)H< UI,pL::΂M@'* =,GUP".z@TXջ嬽7 ,hIZ}:u%@K-r{Ғ@\jI-5WEuRx }#d8 z:g@Ku=)}[Y|[Uު DM$xYBm+ZWK/b}-QQPU1eu/8(KcX,hbT2C2FrC&cS5s />pym{}K/ՍWJ-ỷ@K5mOE^bw/Pik(F%1t0ZPT-RTľæ)^#'TFɵ6 zI[%8 P͋RQ$-f;,D/;.x7gr'e>"R(Ey'\Om\6 >^C_`i7a3<\7]YBBvGA'y,Ucv@cVx ~q v3`Bꘙg 8 Zj Xa:*ol&&f̑Μ P͙Ov~}PqsLEq=c\d9ٳZ`[cצ 0&Swf~tt֚4]{xu%ˠt;}'ࢗAtO^᤾"#um1,g zdcoW_.۞Wqr9ìl"[W*bajvIblo8ޭ .&tbEs]^˛#~F>`u,7echvclډ3mZlͽ3jcoYh7"]6͢fL_Kw?oуL_9`Z i 5_ G&Zj'hΊ;F"up"I5s?rmwJPl}>zxfhg wz!1:n b]7޶0> !"(ѣ*N.#5L>$4BZޫŸ%88 BdŌt?m7 Nyr}XQ d EE_pt)mcI^=.Zovq xz9}'q8NvaZD|| u:%/1UЫm25oZal X]L.@ұ2rs.bosPFi];fzES)MaľC5ӱ'bմ7 Q9`xqaf R`Re?'xْ9>0󽸰¾awHR cLqkuɢ:u n؛U-׋J![`){3͡F_JvǠ8aq@;ckґ3Yf 'X~|G#uz.^VL`|PX%+4J~uAvnAkF;8TC>*AhxBSx`3xoNԅ{IrB9DIH+Gt -5 +UĿ45܇MxR6"?|OAӠOE 3髆؟EO {jkDN_4g?z⯵ 庬ik[t;A-U*Ox77f[JOmV=۳S33͜\( iaijx>Zkؑ>0r܁7)V[4GU}soM ~yZĐh/CO_MGv7^{Ǩ<,'R'F 1u-:\Eˈ w):ȩXZZ!6M2x'^ ~OccA;(\J,JPTxʅǴF8DTZuEaqhEU^ KmA+~-|!bJзm*uA[UZd|v`m^B2 aVѠ1v#}n<6! apѴOS}MAOP>]VmvsbF/Y9J|øc|@JVTWn*$d@=0 H xq*n$Qn*!w"}0QŊ眡'0}ޕfe/,ꘐKžT'6렯Q~CM8ܒ8R>XBniCojB}rmck!r~n+UЫ:ٔv~_k=Q '{O<=&#hLOsOm̵b _"ЙV ptctc Z}M&>^QC&m@`V  TPd5'AK=,G@K5,uihL]Z%I 9M/WbU 8⛅ai¬olSo(:f6 U6c/l '5avv}Eߥ & ՗Ž8z(n[Y1qwIft6Y]dϨzvFw fF/Q0.{O4]FQQDkmY:>Ju W5]jMgj,X%˥M BF#-55hZ6lfQiciVwt`Xtp r>KPN}aKPbCԗ[v%-uDfJ_ۻg_F~Ͳn^=HS'GStQcX-!݌j kw7*~GeJ»-6<%1|EZ*F}ct]?CQpIr1xLGp&`g-hև@RuN(䟪hhf%3^_46$ Ʉ;$̄0q( վg={m: HاT ~rU1ٵJޛ7EW&A**JTn'<󫸳-g 8՞dzyH솁S^ ocqW&4p8#>E iզHCt4y1!vO(+>[8E,j5#/?UF7d<vRnF ³˰L/A\YM"֮ݯ4Tt0EɟQ qڎ_Od>T*Ot5?%I]! Te:&[ MFJu&''eR&\=5f.^ڬ%Ӫ_)2C>KqHkH!fiz2x,N<B۵\Sx[k Lns#͈Шݴ.6Q /0"dmVu}lx#Y({1Wi?gǾMD&a hĹ_F3z^7lH +R F3wʖgE}ME\~=i^K6ZĘ9_coxj8tw o@ #2IwX׿rQ<, 6[ S 6 V$D'$̸V;adu atNYg#yR[lhtw:c'1eRHLA'RֱY'cI!Ư_8Lelv"k_l:vɟP gVImmګX'y39==,tU1D~vd]bMudAX7nS|!!r2(o/m4NzClYj`K8m ٭կtk ic{1Į6&-*mƐSim_euĤ!vic$ա6$ji#Ƥ̹@ ՜oCicr>ˠ[EicH+Wd]hMicTic11IԊ1 5&GMc?-ZMZM{7.*icZ<5ՎY&m̿qI{Hdo}3/ښ6Ő/mbJژ0$Pj'H>m !d'<+w7/mX\*0"mk\w6&=VbC:5SiR4<'Dy/RԭQ1 mr\YzC!+ 'N<d#TPd=N\)*IR/f6ɕ_ë@(F=0fuX혘iRZTtd>d/:͈ Y}F%!DGWGDGnjg@I_5,Mё zg"i Xg- {`\kqyp<zP# FG&CMUtdeMJHS)AoYGݯt@\{W ;D@CH_'5 %!tѡ`V Vʯ>nN䭆DeRI$@⇡ BI[14(inX G8G`!6`lMOkfQaeB(Sp]ZG0&4i5.hPW3K{dnꂒZ-Z`B]epm>7:(#H̤b///@Hߢw/9DQ˧%A1U+*bws_~^ (CO3%uIrIГc8zJ}L}F9D7d.m "JOŦAĮxam_F/X߷B$-h ]y/:߂'9L֋%1$*諩/qk]/!JVͰw12́ε]8DiG<-v;eRkC4fzEqVk)֐)0 baV78HtuCB&Pm!Y̿*ܥ$V,I?|v[Ȱem gaeS!p^[ Q֕Sk\8(Ku ' ]P!%7wq "!ZĮZ+M?s&k©H)ശ/:bRk[m_j-ٽZ$,/Vj<3`co'/\ujTSkW8H]5KԦZWfJk~ZIԊZ 5&QMjIڗljژlj߻qUIvMyv42LjHj߻E= 1}Z|-}WRk NnKɧ":8D줚A]5 tkI I.(Lx%H񹵈E}ڧdԴ!JbSlnQ8/F!(f)6z8L*eMqtF;:0`A}:ǰ}&A1gVpX|Kσ>E `t6Ё9йtpd"4)lhK#Ҧ Zi_~iW@?$T{:6knj4\& @;8Tw|8W0ætrݶw5Ze\h$lZx &k,0Ռe}k& =}ύ&Ob?!JBZ%"}$[IsPSJ6b׹UrINB}$[I hjYrI5@>SIt:dNr4+R`)A#C}Pr$DjL'WaH\KZSIsn[1KĨK#6bHlyO(0"EIفf ksF${vB ZdzOEuޓۍJ%N:](m$AKk$׏K"Z>Tr@21#+O_EI҅FiUVQ*y$krL-H>$}ERy!";T (?b/RیԃdUJRgKFk8 }pBwl \<m Vbk Z[{lj֓{+cؔWY؇^vR%ftZ6E}2;;>FLKZ<‡*b5}{__}җ1$kO3 s5{͐X\u8Nǵ*@.M(nE|`wyH}!XG'(q3Mz(|o#zb>6u>vx.fVK m(uZR-_7ZDԭgnerğwC`pSZY'ʖ7r ׄElVZ=[&rf<RFqO/eMvL#OGMݳm70qNI(i.!h9 'N<RYEeݮz,kA1)?771y{b:Qa A/*W(UsW@j뿣Yz7h"j$O? 3xbw xYe\)?F3ޛea+" .+: 9+NjAނNjqM#{.Yg2|^D(Sxűwmfǿ{[?ՒYs d 6,E Ӭ:0:#5yY)~^;S%c*ZޞzA!d23RCׁYYnVB!9QZ'IГ굗I3!J|>9L֪u`XBn`?h&&f#n[{bߗ*UKELB'Oʾ!ҟoNV|Z/oxlVܼO UY*Sܓ%/uU0+f`=n򙕙靇\W@_I?ؠc{|fxMz|b7npS=ZDȸu*‘oI Kr dz=}5(@@M!JuA#Laњ0JH -uWhݠtcqkvMO Sc-N1& eaK {VI T署:iuofֶ%5o (R7mPU7ؿ2da 92eP)bw֕tDMB-W7@ e8ZjoD\-ij9ϭ*<5|Z@0?/U[oQK;_8Dil#aۯAl!J no` WFFԢy@: syij'\^ ./.m%KrS $0< cfغaz"!Y70MI3f 9.[ftX>HBnz>Iz{| uKb%(u^M!k\ lEo/#8 Ѻ5շδ?*NpM_t=FF*#\Xs]hC2}|Mb)-hM)_V-!\ 772~!Jp` [œ[ ẁZ9d|#L׍)nfpF*3I9-w8G3챚&D+R {O옎C<59̭bٝTv;:J]܀܄@K-$ 䳝`bCj߳n8[Uh0eJM@;8DI[0xAC5UqƵzV!֛Jc CB~OovYaFeTLdz(L Co7beꖙne^tr'߇!1vDw߽/>N-hKWW%|>z0swYOMNNWA_m4}=.v|+kQУirqJJ+Y4t2=FB); mIwy|:5bwh5iw\h苩O;I5;Q2+Cx>G5{p_ihadxKQ8Gݠ[ogYT0]>UN/أpVOWvM+5=Ӕ< N`ԲOc/@P)> GV}r-VB!(~O8z>1;]*QlɈ k$#hI1 $v 7"P ǥM=oW߄*BmpvC=Ij/uߑdTZ =OWnPVEzE2 )h]zqEN62Wemm} U5=ڄ3bVOaھpw5@Ɵ ^kz. bcsK/!֐NX/"31Ǡ0iE#M"h+ m+SB<.Vg+[%d{\d] b)0ѻ@ tbM6fbEOFk9%;A7Sb7 :wb=lI=MrϨz6]iឰM׀է7|vѺLZ]'!?vgerg )z ul|'H!}M5lT®:eA. Fv{mueԳ  )OERe;m?1+'$I y^hhFKmJhc.b>.VU>NϏgɉ)1ywnk̐7ԫf'2:ذ{@RIГZ/.`;{Le۶ 3I;ߵ3"vSuc?(eͽMy/,C!!~CL7t]{GПYşJk:kyԁ-`Cbű2=1~cP=rP7 (S&-7ǎA ?Y7]}NBvGA'ywNhƁ7AKrLK3odo[d- h}c3~/0511{G$IfA?l3?P͙Ov~}PqC$Eq=c\ܨZ?{]tV ?w?lkl/&Swf~tt֚[۵KWWb* h}MQ"bbDH+Wdf%J|&ޮ\з=.rYE~;J]tWZ4p"6 9L.x6V/q½{i+nW7IG|"X(oƎE3.}c3N̜i}bShV;;~Bӥv躵iݨ#7cy\?+-m)Cku10{پ-Z<JxHDoGH( bPmmwh{Rtwz 1dI޺&Եוcmv,(\:!7"E:ܒqw"P3v?HMȽRټ.9G2!YgXaI60Ek;Did۽n~,,v+&/7;d`iK8z 1[oNuk jaJ!'9DIH)}%Yd?BAK G 3髆؟E4h3B?맟艿|d6벦]H}W/EnRy๗?XޘJn+UJ?}3[efnNM7swr% l6bAؾr/:N1qKCg]oM_jϏCV0Wk2+kϿ{հ5d5QkĚBz9>McslZEO>z(Ems|&>>؞EB(N M:eڳZmL`C뤣$.8841NN+ v^%O%A;u҉BLV'J ǀ@K$\EˈZ6.$m3-FZ Ħ5Lkakx2TH |B C8z>A+, D^^H_}Tq"&q2Wͼ;L1 ;.Jqh-Hm5 MqvTHG/@IS: K -h AӲ(bCE1BZ /h^O+U/~C3>76b}>{ D-cW# #!Sx9 uj!6^}QY=2wCSѵO^J5j6E@ҫ-۱RV%& H};Vŋ^b;mĩHZ3>(6J ([=Dq#cSS?1{TsIBZXs) zvJ\J'Z gl6;.:["~~Z}Xq^#J1̦UMեIboqѽ8A93C9D@K2bC'ZR*E]Ct7~MOw&\,a.AI#BnsGxapZt<)qMg_̈9ռL'OӠkcn=fŽdM%C>%RZD'GZN4jK Bl:O9s9%6 4J( s,|)(I4aij>I>)<IsɈ(#{2Zn;#R# Ux$Q#G% 7ڤQ4ұ+pd:NRECiQ$&q ~Ĺ \:}E{AkcKаCDIȏڑ8W>fm;&N%[O!v(:\cz΂M@9k!?WQ?9+td`ۭ [5Di.j)̛O%2Hfb.`MOqF//$}e3+qur 8Zj(qRcZ: G[F!*[vIF- EgĞO%}9>Q1(w33юz|r# ;IV-2SkDcϾo2~ҷ^6L,ofs%Us:rt(&Si3ƺvE~^Ԅ5ʵ kO`ǤcpoX|H]󿕝WpylӜoumxľΣϫaϋZܤ9iM¯ب2^{68K9H'4x_ч j:=,=|ij^LQE魾7 kפPp;|Z}`*c ~C}pfPq&p*_Rڪ~]L!M]EH@ޕ5ʩl޵;fvc76kF:6-ebC캁@_S̄!:pԙJ"EKsr^k4ۦi᰽Ӑh˪h Ţh) 7)I}"B/?dt2 z: މ)phb 9B+~{ $L8z&gAa_k%sP9afY{Cx#dxJHq9RpI#wvٓ **hB.iTBF7@H' ¢d8 z:g@Ku=)}=P[Uު DM$xYiZ=w+zR̡e1!J /|F9D#vl'-7CL^qC&cS5s R#ڍ0z{09,sK,{#X.i]=o)n@ڭ_sip6h{B'&\|#=.uq Qj^ mzF;8D_Gj|3ѷa}Onն?o=丏e]\"Ǥ>"9Nr(v.ы$ħ4 "1 ᥔ3Ρ$^lDz7A 'FqOx*D΁VЕ8a^,!Aj8)uP?Ԓ"k]V?ۇ/+V7bȺKXrulqAy| Zj-4wˠ ((i8$pr//AZ`쥍baV78HtuCs MuuӡVC!&Yxf{#2t[,}𶩻V)l%x8> n5qhjޫ*s*.؎oϬO%5>6=99?їʈC8]y)gH!R(1{ ' oe;RRs7]e7M%gG\7]1%N@-&}6V_ofǸ&*|03-!ptذ3o&Ag ~gP͙Ov~}PqsLEq=c\d9VٳZ`[cצ8=5;7s'fw&gLLݺ߮=]]^zSNe}MKYa oR_6ek3_=/mϫ avrߎR5{Wn?UEajvIك 4޻#oKp1 E.]Z$qv5X} EM٘`vclډ3mZlͻ]ljYdT;d{t4n1}/e].Gb /_!C5_PD}7B;aEsrS1CNyQ.K^c{JPVO1rAIh^ ޣY,YCt D ȺY2b ߋ~49DIw2޶0>|zE݈?EL3&!&sS*TB S}#Opp'g@Ip A1l{gA(ݎG<0Gq7:zx\:Fq8 z24pܖAF1P6"m@J4+W1YkЯY$T{:6k `m<&;>VC䞽(6iweEƅeh K(Uk^k QZMXivsZ0˙Wzb|k;QGsIrvB9DIH+Gwm(܁"9)l"dot% u\7vjBg@K-TCr"{xͣښ&с͛t~k7~.kڅڷ'[t-U*O ȽF1,Ur^RZ雹*!17s{vjrf~v&s+` &_ƥH9-?̏zFC}hk4gw_٧v^ĖUj/C&c }?>ټI\5M4zF.G}wٴ|l/]V1RLj M㾀2^1{4%< <P1ɲQZOvAb?!J{UB[ǀ&uhQnKZ1t҉BDIH'4H`\ 7sc!)PO{ *#=<+F nZ#8l𢨾S[[:UwzŶʢk  rb :FT.tA-W@_I_E~CI5J?(]}m^ޅoF QWRG^+ʕz2Ak̫EM7Mte;]]d 'L+nMeEka%i %%krC҆e'>5t ombVٓW )1ug" +hed9v:L orV+F}|te]?_׈ߛW1u!_ P>*Wb?ׇ5_k-д:b!d_wDyü"b< :;6> ' 2:e Zԧ %%l==2#Џ8Uv}{r2_-޾|{cM=[zvq ~\galӟH +m- J i:V^1UShEZY Zq{$KϢX \keSŖ 'wh+ze<760F'g"v] /([O҇MZtK82u8 z61;E#{%K(6SПRiR~҆O4ˆwmg=sװhZ8x7`Z;U6 tWy+Ugea93\0cF)n(pB>9es,s_ T7jLǖIxH:5\ۗ 1 xlj~~n|ܟe=\Ea1LHL[ae0,=r' r(%LqX g9,kXk[9,$P7P}Xl>:xXò(ks> qOXDX62)BAwM$X0VYXqųEV'Zс(-$,hUll!vY}(>EЫ]E8wmbv-haU-gukݚe*UK4lu$#Fo)e8^( [!xb=ЗˤS9|Z}kfj"ZAkE̴f85=):Dg:hu|Hx6*׵Z:pf1ZC3>]G UtUa5@PJ#!Z78hWL&@q}r<axSb\RHl^}QY?]tPF1:h=Y-Q-RZՓq\ՒسaI h^,z{x R[5ڙ>T}ћ3QZEU'~3ˤCԗala-Ӌ ɺ}g8I4cٿei;v ;$h^{$DO+WZנ_/9Dius30AWu(:|v:]韄h@ngzwMº;N,H!wKn&G/(^Sv=$7ߴ!v߂V-w!ï@zJBDŽc3c 麁'@}X/fS~?hl dwLnBɤzQY]잓(ܝ%>~B}l!^ixALς> ۘ~wswxx"o,dx5j -v8zNYFiY*a2bJlEloXFIČ/z%v]Z-Sړ!J' aJ_b;z(I9DI}Ґ ntWu @iA N,Ym8X傕7]Cy h;o $4J m)_uN-ʒ$㠥3Mz]tzW>.: 'Z?CuIR]ڀJ9DI}@W l݀SO!!_7pT;17ɵblNeK4٢)3%O_~A6uLwT׫:e7H( u:4I)>t:vI9DI\?< ZjtնEAjy<(/,Vc*Uf,#j=[Z{3 ."9!U$m(>>d/zG2ȓ4RyB+PṯuᷠKoT0fL}*lT=Ҧ[TQ AB^Bn -ma)VGJ_y*d  eVFQL~oH-ϫ>2bEG01+ Ɇ:5鏅K_K*ܢoMBnzy;N׍0noP~}lm WxMR@K:c{q 5e`JH%h)q.pjsb7 \4WQxA+Hb#嫵+%JAXUYO˞ôOd̶8 tqd2 ,Ӱ^1(?fctcTprXN6] S8i):mwcZ];T t5=AK*gO݊3[Z+Qt]kڭ4vCRQ.?%I3y]QKnRF=:g0g6 E۵7֚is%ѦaD=9osXabS}Ve O3庹7)64Ht e"U pF=sX=at>} Q}ϺlU|3wx9%&x CUB FQX<ԺzZ,6rx\rN,k%?w X>V[&晦UL"J-l [) *KJ8 zZYn{72XSwӯj$( sLҼB},qHp%!hG2m/SD*YE? 7TbwEkß5N|j8տ &Ke[g jJ캁Nh!C6y Xs0pg|d