rrcov/0000755000176200001440000000000014556271701011415 5ustar liggesusersrrcov/NAMESPACE0000644000176200001440000001160614443667016012643 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/ChangeLog0000644000176200001440000007113014556265372013200 0ustar liggesusers2024-01-30 Valentin Todorov * * DESCRIPTION (Version): 1.7-5 * * data/Cars.rda - data set added * man/rrcov-utils.Rd: (mail from Kurt Hornik from 22.01.2024) * man/fish.Rd: URL corrected * 2023-18-06 Valentin Todorov * * DESCRIPTION (Version): 1.7-4 * * DESCRIPTION: ISBN changed to * (mail from Kurt Hornik from 06.06.2023) * tests/thubert.Rout.save, tlda.Rout.save, tmcd4.Rout.save, tqda.Rout.save: * Follow up to changes in robustbase 0.99-0 * 2023-03-23 Valentin Todorov * * DESCRIPTION (Version): 1.7-3 * * data/ionosphere.rda - data set added * R/CovRobust, plot_utils: 'xyqqchi2' and 'xydistance' plots, fixed to use of parameter id.n * 2022-10-22 Valentin Todorov * * DESCRIPTION (Version): 1.7-2 * * src/rrcov_init.c: Fixed - warning: invalid UTF-8 in comment [-Winvalid-utf8] * see mail of K.Hornik from 17.10.2022 * 2022-07-18 Valentin Todorov * * DESCRIPTION (Version): 1.7-1 * * R/CovMrcd.R: Fixed - maxcond passed to the low level functions * R/detmrcd.R, plot_utils.R: Fixed errors "Found if() conditions comparing class() to string" * man/PcaHubert.Rd: Fixed NOTE "Found the following math rendering problems", see * mail from Kurt Hornik from 11 August 2022 * 2022-04-25 Valentin Todorov * * DESCRIPTION (Version): 1.7-0 * * src/covOPW.c - Fix for USE_FC_LEN_T becoming the default in 4.2.0 * src/ds11.f, fsada.f - fixed several Fortran warnings * 2022-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.md0000644000176200001440000000675314445074035012705 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) [![downloads](https://cranlogs.r-pkg.org/badges/grand-total/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", build_opts = c("--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.7-3) 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.55833 1.80333 1.66000 -0.08667 #> #> Robust Estimate of Covariance: #> X1 X2 X3 Y #> X1 1.58739 0.03129 0.21694 0.10748 #> X2 0.03129 1.60733 0.25612 0.02864 #> X3 0.21694 0.25612 1.47254 -0.18174 #> Y 0.10748 0.02864 -0.18174 0.44081 ``` ## Community guidelines ### Report issues and request features If you experience any bugs or issues or if you have any suggestions for additional features, please submit an issue via the [*Issues*](https://github.com/valentint/rrcov/issues) tab of this repository. Please have a look at existing issues first to see if your problem or feature request has already been discussed. ### Contribute to the package If you want to contribute to the package, you can fork this repository and create a pull request after implementing the desired functionality. ### Ask for help If you need help using the package, or if you are interested in collaborations related to this project, please get in touch with the package maintainer. rrcov/data/0000755000176200001440000000000014556261354012331 5ustar liggesusersrrcov/data/wolves.rda0000644000176200001440000000176014556265567014356 0ustar liggesusersV=SA> 2܅i`G.$(ل;%\2"V쬰PYثyݓ0z3c}yw3>dYVdoZ2֠߶Ma yU^X7 g&uyMRfp6.CަD*}(O?ۃ4)IwaY@<@ H/{ֵzZR6oC>Mۈ:6?q[ ̴CIn0Adñovmؠr(A~{BؔdcűD<]3 (_IfHنLroE9{M:А3e Y@Uyd[ ?Ԙ9N]3_UM_{u5yQo$W2z(wl-,/)=r .ߑ_|P9c (T_?+eN׆a>׏:- A}L9@a5H2PJ |? Z|1%`8.9)/F1{XR[*$({CI+h Z <ޚ=P@! (ɸ{h]S{([ևq 7-~Ʈ_h.a -vb~ [|85Wg}TH6p-w~FQ\k7P-OX"Ȅfݱ{qrPE< tp43_yUm J9dlM6(qsOLa;]ބP~3-9l^Fq%"j{K[iҲJTڔҦ6{JsO@^?A`PIb #.ٶ;IMS=Z@|[Mc&5}Jӧ5}Fi,-N@:@+hi%v rrcov/data/soil.rda0000644000176200001440000000452714556265567014011 0ustar liggesusersYhGeIK#GjZ|o4R$%gQP4,RHPhҾ!%RhK ]$]Hq tSpӖBkGky̜ߙxtochiK;s9+4:<)+B䯜P~(59vhB(W^)M΅ҟM=~k?6?$/w:8?WzNo<[ϝvo<95 C^c^w*y;''_L~n/E>6c"?:(3WEϧ/z),,|@[e1M׈|hKo3]Nԙ 63iS4VM[~t~Ye|@y65;mӎd܌{ď]M}& |m}# ?ķ2}TمtƃSa>gv0tϋ'$w_G}F,vLp˒T R=@y$W씏 ?鰪L?W&p5ca^y#b?|ȣ}O?y߆S&Lz/N+?y3/yh<1<W|UyB-)<+Q1}Te[;bx*"E 8+[2J<(%25xȡ^Gx?s\{yzA}2?8>y2y/#9ė+v7ٿ~׃#+^TCG朶J &ur@mel^.s"/ ȳ>΁/y#%!<|Z{gݬoҸುeߢA&gnbJ=u_K}Գ&]Gq4SNkډN5y,>΃KڸwxWyzqOoF4S/]}r?<;dx;Ľ\Cy'/^7oxkc#ɣ':yB;v4{uTG#wލwf;.vp6S5G-sN=\}w-"lþދ78xEm3}m=K幜{8 Xozoh NV`^s~ df87/?䙙o?.w}p+_:㲜̻B'}ԝi=|,O·L{gय़73^Os\ 1}?a;u^qJxh^Kc]o2i9]wΪX=Q\{x5%R}Sߏg{%8q_]%}' U)8xfXKy(O<_;߆}>XelqJ^מ뻻mQ--Q$bѰ%ڢ-["^K=l6qL#K/mYڛdÇu:zz{}#Ћ99Ļ^K"6HnX"o$u؋::x8KQ^9sԕyy=Gy^߬}Ƿo;w|v}Ƿo;w|v;\z1,n˲w9F~^ߡ;9b8b,Y}Ge,ƒwTfc;a/9/́%ᨿ쾣2;*s9jswT_^Hǐ g[&IϿPo#rrcov/data/bushmiss.rda0000644000176200001440000000216714556265566014675 0ustar liggesusersNSAG( $&@ ,5!qeDD>ȽZ O#4>O`#tGҕx33wni6i=gΜ9p5n/o !D*~N_SSsΛJbih? On ^Vv; h[w:y>b&MԲz 3}粺<?L1xQy|6%ǹ&E/>-(˕ xmz ޻R};nK /Ňۈs/g>wsh~΃-b qr? ؘc=>d^/Z/!/ËlRZ/m'e=:K=J?e=K=W?"^c{K>GnB^Iϣ7^c[G:1#}Cpv_juLisZE^.O4h"]he3S+KZ'rNm.ҷ%-ӷ,\Z-98gB4;$rrcov/data/machines.rda0000644000176200001440000000567214556265567014634 0ustar liggesusersY[~zmgwg5=Bqc 2D΃ٙw΃ݵ-AJ!R^?_KJ"@P~HH|#{]]m :uֽnU>sITQJTKEJjNJ-a0x צQxIC p(_MBWԩ]ذC]Gp `C؝#]`G7kdWȭd1A̿sezӂ;1JO6:h%{6 lQoi|ϋmS@6y)({p2}c6nxقr=}}dw,8NxӀM5\њ^*@qF'{RPj.^GaGj_\?p\cn×4 Ժp,`(lz_`_~EKFm|R ?ǗcH}<טΟ+Ss%nGgx6[^/+:h뼗y5$Jԉ{#D P?a:P{4EƟcƄsDz cƛ-|[X"–Cd_ƝcgyyǾ?3WdlRs=l232+c{~'cvp^kk9=r}̼rZ1a`_> ? eJd|pU0A: mc'}bs  yAnr\f|yBQm#2ܞu((bIpFρc_Vu({Lg\m> i,ҼJaP}qp p!s ȅԇ0;,u+zJW j1Q=O^ ͏K{512dj~8lcd|}`=4+v |4}>7=U4bT91nUr&M ƄGrPR1#_@Q$ K*9DHϾ0!8}$u  ӯWǑ%ўW391}#[Q56JeE%6"ٍ,aFv̪aP7}E:ԏoy$,+}g qh^4EX$=<7mgh.Q:=G1@sDJm@sq  ZSWĚPxw8rftf~}91d/p'`)}矕D;>ɮqbyO=ߡk5-/$wV$ʼn~(š =qU}A1 1>Dqy GI(yi‹.!qV#S؈|ق%$ώRT']zd#h_Q 97[da{Jΰ3{_-R;NlA+7W g7w|h p}9qQ <,y[<,߃92y x>}Fw$u_>77#d꿆º4_n+~<Kc`؟T[6Z{zD/hMC 2=57'TsUܞ '鉒Uz@OZ&ۛX9[f]~j&%z` p]q 8/ r 62ھvhG{n%Sz*aBnZoH5ȔEͨ24V?i&JLJ╝zٔFoJ}hFې }/twpv"qtNVϡ=;1]w{Z A|"MuC>wB} (kY94Ϝ7*tTv`XV}shTh9jolԲً/XL.pf%/KV-# W܄D0%B&l_j(M;+YONk33Aӂɴ tNG[V>Vg%C $ƧLB²ǧe;iȮD CXex\يȎκVֳYek,;E,Y"d0Kſn@uzv01wv[4X^pR߫LkE>,rrcov/data/maryo.rda0000644000176200001440000000070114556265567014160 0ustar liggesusers r0b```b`a@& `d`aҬE@> Gc ^'o1BΡw N[P`+쯳NojdW ݲq n?Ef|'VO߫ʆo]_sag'1>gv?fUU]en<x7.{㚘۫O2ۦ{X}银r?w*7mhlaR'?銉I/k }Un ٟNՎg_{z}dO>?^PcS_(v%x6zWnQeT^oR~ eNRg`(J8JsSla@,30C8*Ϡ?rrcov/data/pottery.rda0000644000176200001440000000155114556265567014543 0ustar liggesusersUKLSA}çRSт*CaM#Mi/tÆkb\aҸ5qBʎs`I;̽ޙ93aܷ3 ex<ίz\O1[La0ܭuޫa%bJq/VxjkB7d~X2FA1##2v(#>3  |LQ n]M5_ W>wkyaP_lCҪo oC> x;o>]߬zBy݈ 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)"9RgDÈ~e_'2|2 rrcov/data/octane.rda0000644000176200001440000011722414556265567014313 0ustar liggesusers7zXZi"6!X&X])TW"nRʟVɴD'۔yĔ@z5,x(A㒙wG]VlG^Ou)t_5%eWt@H ܞR>yҋ5eDŨ6r?_MYgm_m(]~`&O2)x-Ya*b>]:Ïa:AlM+WH5I-8H~2"ᅪu"Y_(Mig JS/ό0 *D?r eE}e\}:C#쥑o;ф%tZھKCRa] y΅x=1 .iz_=S*)7[ V=u"H3,᠎q|c}Wi69ăZ.l yE ܮq? X(K/@zgxme'92F]O 4*{( i"1Nu@!b 3;N8/&쎫52̌5~u="rh0V;Fq,-q52peIbcsZ(7Цp7SBO WjJtsb\زMCg$e,lЀ2uG+U]1FO>ҏfW8fNmiiSE b+XV~I=06HT/{i +sOlzɪJb)7)lce.X .cմsX01];Xgc";FKa#]qU^*&~ Ksn+4[+\2Ky&nH N>fr0s~ d~̆mPػ'565J< /s*\K_eq+z^|ؚhn ' {NR6?>/!q5M NKաEĹ]Iڞ)VUcc po除%݉RYT75oXTEQtھ,\ԛ1q#<=K{E 3J$=xޕS7x3D^?Hu?A5JR)݂uَ3$W! (Rvᜑ׵G-RsQW9Z@G;).ƽ< @: 2SJNf(7O]݃?k{6ʵg }CΌ]0ښ^X0 1)X%n1yT6 y8jB}qa';^8yŵ/H#ʨKcSRڢt8X%X/L䰶A[Sz[ +vb@u摔}ީ`4lD҇S eMyHB~E7w{Xۜzr :Ƕۅq{R\d&):fgZc}@,NINǠdm" j?`pHXm,t J.-z%`Vi#6uѝA$UJHS1Uگ: 2,Dv6Fr &P&%Ntj,QȳGm2y);*~ÝhDq&+!,t?Ky 9Ö(ǩ߱/_?g8A'o$ uRyGzM;D)Yj9,%ÈwXc+cugK5OΓ˹D1!;z1*9QC*C& #@v9oɰO!wr\$ ){!B$0T=rK;^GU/ǘj\q{l$ݤ8ٮ޼GvDr'4L*o&fSj}i_ozA;6sP)M_\m7w ;*&!-#=gs7q mLAŒO=sW,l`lvZ1Hf4 'Ȩh):IɐNN~~8&;+#}ƭDޅ]Ȓ.T˳h33Q3jkI;~y`B#Ks HeA1pP#~N(tV K9ļV]aew+' ǏY//+ 73D I#D4*?y2$VH-̙lݜsYu`2H8Pe2؃SMLVϳղ¿D4<+`.?S}xD̀Lm<@6E+ܜ6UٻBFxu7 ?[::r'J*VigcgYXZ8D%pPc_1ɸX~ϸj}e\bZeb[Qv%=Eݒ a\+2WozM~8>octՀ+ 4g&٫_ۛ(SVfq(r6Ov{M"OJ6mu+DJLK)ٖ"J-Ig[kۂm^**"O%G{JrT5f@Rѯ܁S@x%s gt a1Ps}tw QYz;y<+7k.g8˓L?u1t8R+.P8"6 To}Qʍ]gr`kKlQFW@ZͰSfcF])8r6F%8`oHON|ȗoү1  !#r"lKȍ2K!O%b@ͩ3 ,g=uG¾YG- q@׼!#x$D9,n r/'uw+laΔ]^cX5+*w{%dPWBĕԵaGlDvoO zt*Wwgn6dmsZNŠ]J49ORհLSKݏl԰AyƀC<*#2,(j߉Q1`O2(4;xE\)dgp_&W J\N` M xf:A*Dy-VǑL-7 G{7>3Y|(&P⬻P@h.Lj-p>_IjVO%͊)M3U@K,@k.ɟ%/aq)@TWǛ+ǔ-Q70 3endbcb;#HZ>{oEsol*Ǘ =8`VjYkDFL?z* . y8FK[1eGeO4n&g dVMFUD)Df=SOdzI>hNJ \ %wq,G/ƺNų DŽA͔t&/w"IBM )J ,@!ӾFI9i뱎0 =U%gB/YC=̵CF*ٓ[-JR8qmDy>Z2h#$"w 0(4N1_^aN B+תoca~!R”1m1؊{T2GS!UO["[ڰNJK;g^ FbDYg\'ħh @ UkW$ bֵa >X_+HS^ק|spqzv#/6=}ێSQR%&C|]OO7},.1n+Ÿ!Nc~ai2 "Jf;@vәR#:r**Rn\Ч(s =?A#0R{BW"\%BI+U Vh[3UZeeF$ a<c3~V`m&4dugBA\nF9_N=XeP| 1[L ݋9]݋VN"4=GM[䍎&_a <?G8j(`P`G c/o5hSjqȁN8T4ى\sŋ<ʙȘ$*VxC&}^0IavZpq#E \I. )}ŏL;8B#/ylZ6 `(xhμ^3^;2J}%Yأ^]{ۮ!ş~|ħ!zs'Jz=[/2 H~D(@cT6p!u6Ѡ(,lDl{ @˽ȵ^ēh7&3/_3VaKzJVy. 'VN~Ib)#ՑOǶOh'cV ,İ_*z"?o7~kt*ڈYS?W b5b'*J0p% j\-x<0iLa:"-\!lP'_6mDr.`Edm g B/pKc"ucM@i܂]+_vgmrh%/Ga,n ]f9pZְrq %쩕t5 IQ3[4+qf#_PQ;t_B$4]t[ih(,7٭Z*qM0RxClLw%?@),;c1 l}vQy-,ݏ_:p BJl\/YbӺt<͍JN BBUU9tΖ٘k)>e vC#lߤ܋2 9T룜4^oB4b"+ +"fh[Fm̷bE 64oC5U\IV>K8 #h]Cy9edw]mي,ת;U3:)rW&̦Q~{F#\ T/t&6n9Cv`x-jfnJ!uϙL @Sf.xM>2")hH T[>{ ]y ԉhs> ~}Tl~壡$i, P AbGηgR#Fk GGo]E Wu fw k ynG%長mN_`_m|$sroڶ+1 Cq|W#k̯ lLD -c| ۆK -?I$/q3!=8=6am 4$Iwх/RrDY'dJ[%nQ"b̻[ QXݲԟBHj b=5{j`'ΰ2`.J| ^'d,zlVUOd`;}3N)?kOdoSEktPm1(jeGty{9aӱ?Ykvr#@Yl',AlWI!+vDW7 fFbsdwF-e% g 1t)ʡEWƶxW9^M '8q>7yü!}1APwQ+(bƣGB[pBjo>*:m2=4kS@Sq|N|Js]pNǖ>:Ǥe%#(4?ce% bs~Iޏ6 RЎ5ߗ½/ksI[&pz54eL'1o/7>d1c͹IE5S(嗁^_ͬ-m5pGWu] si7GbH,-K`g"P6 Y4IJk;/q׎z6UrzJ JFoMeb [rV'w;]nƗ6uU4k<ј“]~>h@8±f~lE-3cņHQ?Dc%ź?Ꙣ /&5s[G6]#y W0cg9]Fg9jvDN5_ c+e!ɹV<uviZC+lOZuu}gX'tumj7 pHd 08th[C']lJ\$l@d+DE#/y'?Hdį `кk VS"KR%-$Wk?9yP ,c/4z~1s?nwSY)%U (@l2C6rL]wavĈ>tBh X:$D)c5s字!I7SZ>QL0h/SELq iҠ9㍵.mZXݮfg_BOA]6d?ܩRm)0mΧ0SС/1?91v s~$])9 +ӈiBAfl@?vaS"띣5qaga nqt9=B̭;Â"cB 6I/ J__QPMx\(ð610Nbż:|?4hhr* > !a?|䓂 CR8آ*?h\m-cySme] ~L?K?YeG},F2CC)TV3z. AٔMCPj7 GRcu楙hLfYq(JE⥫;Z^[J?q,%͐Ŭ$nL؊/*]oM`ԑt1C*>\Q|970=?תi`BM4Y:dF !?= ZK33!hՕGy;Hm1 ;q: )Ҙǀ`<3)+BuݯkM;ЇP#)OH76 (m_4V>}#* Gcn U=*JL4*!镰м^4G_QVK2eFD"JP GY$~ ]sKƪrtxL] 5Eﻬ"#*jƳ1w:iltOxvW+X2Z<(|j/uzƧmy$ {-w:nKt,\"mF uPוhcJQ7F T˶~k^/O8uٵ,:c; bKHM'1eݤ:œ8Ø4=,=.׮?h|WY!l M Woa.M~؞j)L8y Y RBx|>'@=~%-oiУ+Uu;[tHg8rAX?Ĭa*#qIE 4,0Ͻڧ%*0$-3m,Mg9R!/QD萗%+.?qxKT!`t*8<^oS#-8rq|,X5 z̉_ 3,n&A;RghܑbIډy L5 &>\gL۴K t|`yHnjW9gMM*/ n`?sxlY&zvRjk|YhZu<\z/!J5m^4a7$u;-X E(K%3Y>Ѣ&4A@]Zbh.g#r)@׵Y_ r5=Pa?EOX_pv*=-'B?K覼3𼽨.$.((?5?b<ޝ[oհ>9˷f B) 7D'Hwxy&쿛Y7WJ(ĺƂM2z6o#YGFiL# ZvY,yӥ5" 9,Qt,Uhn茻=%5{raצWAd *$Yd5h*N{f!ʌQ he) 8.lSD 5)I *Ւ0O>  Ix,~}%^ہU=p:ƛngG} IH>㉳0G9!D.+9/U̕ɼ du PcgJ_2Gમ=~7!]K]ɣ6@ Aean#慺G'ћ&2Ĩi|-<(54J0r+3az,W~= "hG*a&3'R>gA9b8yvaqL`r~M8"$ϸq|9qu[V{YG*uZ5QɎnG[j"K$=]#fyitiҗAq' }&Բvt Si|FgGH~)Hys- 6ʹ FT&N΅=Iѽp%8Nk>†YY*LAeSO>9'S`в9=zrЧ[˙)y/忖G՛Z9g۵] EY&7Ё {ĭD'7VLsF}]ōᑵG4y{LKp]n[6F=m={b O0-a8$]lw,1Y<Zj-.O\:*T5^vWs'QM@/ڰ'&B ld?m(&Ff |c0LȒJ\TjC`đ?ve5+Mo:2^m°x~;5Pg u>P[C=evB܂!b/eoɦj9ceg!Z*9P*kh`\\kvzUV1F37̌XBLcMm_DxKD$3{ u7 0fm{#xݻQT_oZ(~cL:3t?Nvi 8[4{kq rFv猱267x10?&- t2}Ȅ1xmsAk*&fOηص:pgμw_dXpE]Bgkj栭e훚r@ _/N<8&'].,zDl%e y$Hڀ9PW/'q#șhQ9_ J}Ynwi{SF0$֋_KڃA_}Wjj5⩱G J iJF YcߴQ&4,rN $304BvIJ 9Y6 b]߻*MzIX1N8P0{#U ͱv%6t4ôųk ~\<*vq`^"xM>=!Ͽ6.pE.q1&/RX|<_os7J~]LTl%C2uҡН ^טH"{&9ڈZ o½7KA`:o%e1+^8|7*y)<1)Cg0-c]vu EtU#z>QeL^I?!#G4 F$z' Wv+A=P]nl^!'qEͷmč?m #΄ī%;.P2t)vʓ<4e 篍 bZL9<) e}v2_^3^<Ս7OAcI#/4gV%F ?ҀXvNxyF022Zv2qL `gkVU㕞t!.A+T:Gݥ([GJzyp j.z@K㙺L,H~]rWc0yN u Zz϶tשi;:ͤuĪ_<ʻ=BYW)VnW8@ܵL/*,RЋL2E[<|}/Js(G0QP@L;sCrI+3w 1AAH Uo$ i)@8*bߍgsM+UeIIԀLV5{dB62Nq,T`$RkY {Z`ʬ 9n\QGKdzo3^Sџ^p&Ta-p{[4Hz8cB(Jr&4?fQl96q[#0p+kqÕiI")3 !eb$忟υ+ew>TTpc(aFH+)=KtNCڂN"B_Gah6%zH A>K ЯjLb6Nj,gN#AT 40yj%=*WwwK_/ _#PNVloS~{< L2ÁN>8v$tk/D&8ŽY!}O:Z@+ K@:׷dVUc,E| NɄm^,t%˿PjSL{ίp;2gB/BHHM%sZm.Ae/- w7DsaޖaX9C1LŊN1#G;H 3"óNiZ+f )sgTͲLc\̈뵰tE(0FgW%-vYXmՍԙ270" V "]n2:/M[iϤ*à+ NeDIK(W(!.k{O.X.K`Uތ` !lƫX *KF;ټC̎HbDt~ mjn &C-X&5SEDc\dlЈ9J1`ıP'Li8Eͧ^}ެIr$a/&P4^Gnd utE& sOf^P>U=VU0Y@2)c$eTG@;T#G12M, Ϋ\N'8c$:JBN]H|&j#:fg15 mݺLbTK=[ ]U9qq M#y?ވU5!BHA8;#Ati1%W{-oY߷ 6nD eAFOEeK(<į"7}6WاoEn[U2|\j2hQnQ1j¨LsxyY\(w j47!y~a[E_}~UAǬ݀-Up%:Bdf1f$"G6*F|)GP_R"lt)̋O{."=ʖG@B1s! I1G ?dvЀƊ k*v?!{N^=Dx\n`qCp&Xb gB[AHݢ8Gzڳ:뭚tT^cZk`ԛ 빃ZL5DhXr~#b9+9cBBmF'O[bsޔ5sOu ӽ,*e958"&>ö-INVưoMNci*/ 1HzaS,hپ=`#{#NtVoCyYnjaٟsboL2h PyǥFF݃R=g Av4g_(ZpCK X?K&Ϊ/;L:~+sQV1NHfSi ,<m~zkY,dYD}WqÓr.av$2 k"kA\Gz\F%샪ϓU5=G:gug4*齁cUaZM uI%Y P@cW `G"JwrB2!Rb}s%-kƢBo1mPCM0.w_'9cFttʂVe &܋,T(l2IAqKLb {N ǎrt1\QՀ=XT lo@.o%Oy[*#Gޙ|ն!x*Wu6ͷ[Ҳ _PeWyQ/c^`K AIh{V|V-ٕ;C K!:#8a7꼱_"tO C*BpC|A9SgS @S }WF'PDՒOlyB-ĵ*޹ sbj~ς*6.c!ɖi)[ xUWhؖ/W/2 qBm"2&/2T8zeAgz9]ۢx.ZmĥE<.jo41K6^9vLq>gu᪗r-bQSk%3sve'q0=|GyȰ{*,lR&M΍}ypDݏsĪ_]1(؝Ą?mZZ h!UZ-ѠRJXU9@0U.  $h3_Qe:?rP& >b5b9/item ɵ9syvيδݒQyfJ"|͚Nq/J gư[Zg6\)lvՓKFlj7KGW7?mB70\nO*եh;TI_^H~HvE@+9?-eylP oXn-Ť;'/CC5Y#scjYrWF /̩F F<6o )5+u(-h/خNrijpV"؝]ϷY݆wKlUTAB 4+3?1X)X]4*[*I؀|op& F\.AG0xd-D#0<|voq14N+JBӕt᥶7m*j^+78WLN'8Yz%YQju}k.'Oġw̎ ҟ,pY1܇a0v>s$sD!) X6W:($gV8(ߦ>@7~1_t]t?$RǜwR^t ;lnnߺ%$\؟fd19Wn:PU)}& }1:D/Hb2o';%b\?usxzօ5vT&_E**a>G-#KOail9K+,6ͳ ; :WŊ\2Z{d[(_†|Zݖsgz2KXp;B#@ݥd@[ыWZm~'8 7mޯoF(~-vgnex Zs0͈Շ)VeŮDpU逑/ǁ,&|Y殮A_-;rFqW=;.2/CS+*Yj|\α_qBD gQ<.ŧQikf~9,oыe\ -j~H-sBL? {peNV0UN׃J>[ƆK`EU]YΟ[VvUgY{ڄBXjIZyh0OXvo0NܨnCjW*pP -V 8[S'% dm*)C^?퉌*!L:<CMY(z)y!)d{./õ,ݳçEC!:$| "ҪvΔ9f&$߇l,簕jt ąPXW4'GY7ɂџX).."RśZP7 Wr}|b|l ?'ʾmz%׍ 2qs),QznU @E!Fw淇m/Mk?||}`Tʘ]L8ň2_]F=Jb%_5ǰsf";/8͂> $1N$]#iYy|5ۉuV{X֔F DvS;-pu%EBUɾB+~2~Գ(H=4=exu^Hl6= Y+ajS2ҥ{]ǷR}~(#nO jߜ'$N ȵYr_pѾleg;)v RU #&3> f] * V%:Adۅ^)pdvǖ*T5a&8 $!a&ޑ9kPdYFjjdAz@lXb_]Cj~ZET>ytJLsӉiaUJcH0 )8e/mGbHHj}VY=^[Uލ[X[XPӟ ܁I|G` tht˽Zٱ{moesW W߅C]F]c~\Δ1qn]Q4fV|G[ff7զX0M :bf:/L>I),>\p/+3gaqx>p<\A.g+}쩋Bԃ_D@U` ԣhYUk/+ŽIHl/t9xk|K@{,Q6u&pɫQv ~XVw S˫M8(8p y4|#J!%E.2O!!WfH'|4 P_[Y|Uv)ګiNLcf@JaJ7VE{ۄ8^0g4<Öe_l2tvU6]P%::X78@fQq!g3fLמζsҐa?-H*-JxNʃ- 'MUN\'Gi7ZioG}v<_mce}҆/[Hsw4(#[*wׁBǧ{O,7`غt(} ܗZrjJAMkQjOuו Ou Ȯtyjy7KXmci+2- 9 -AKɰdkBK1F[;ufDIY@+va5+S@,W Y'i@SDm`+*&6 R .2:;K0ufyJ?49y;|뀾 l Ͱ]Kxwn3 NT/u!J\26`d*xdSǍQѷk!m,,ʆinϏFl..jw>d$IY V1QЯ%ߥn'>(½L4D3C}cW]/O+VY6{94҇?aTQV@gʲLdb_&kV^HQLl) G8\f5j#ՒrU%b% .5}xlY/ڰ x( `BN}tHK.xWȉX`Do?2@xvg*&)<^'VWGƟc%W:B+*YSs]Ƶ|z#_o&X71kvIq¸^;֨0LB>m9+Px4`HHZk67/q]il"iv;NA/quu,^;hF0XgznsdSh*Z@3]=Vɪ=a`Pi);nDnJ Htj|](֩аӢ:S?T_۹kZԋHO=IHWL]rMy Kz1̗Y֫qs*sȟqA)݅&)w{$φ1?3d|`3ݧ<!E/hH&ǟ1^$Z.-g]nI5`t$sytiЄ<)O$ ۝]md~3}Iw0χ!WmCtyC[xf+,#Q&6"pW;ቲb! vӗS;kdH5|+jWidə ^ +puѵc}S!)L*d7" -bÈ^?Lܹx1o%y>`DZrU4raMW\: *s &{3: \ͧ[QJÙ hݱxk";[?3RBTeo,y1*w&>TݔJ$)R?41n;#ߘl6L.oyea֯훨i˹s9 G oAa CyƋAG%(v6It3H{z<sUyP@+Ο )#juQhr7~nי 'g`)70 \x$iWsU35 4io1zQg on'MX苅\; +Y0V1 3`A n0nKQ-[SU_7#Ƙ ˒G.n RV 9C?͹֛h }Xu0py ]=gCȽnבmF.c1R;̋K1ǫ2q+i.T_x'k$d(6\3y6:S*>"v ۩;]G`ҏ@\ b ؃Ւ7W\#^OݒEC3uVfȝowwU<&LzŅZ_ z<~Gv|(Bs  LYTZv$54:1ȍg!ًo"?dBk 1cG-gT>V2K)4&JB !`M}b>H-_{ :֫u- crlm:1r+Gu#VnɧRlȬ]&`.f 2 fׁk\a9?;{DGUfب휜 І[ZM¹2Yt~&x l_ްw3O)`TƷ⑎$ f?% ĤՍvOr&PH+۪Մ^KUHq%MQJ">>ԗgaT)q?Ɠ6:}UOD @fyC2ts&ձalZQCX6jGs}¨c-3~ۅ?ye 8Td8\ODCY!fQz] (J65ńy c0;~s`zbG'FZ9R2:)Eo vz](V&1/j}TksC;lB_ϓR+pi^UPG!1ԽK[yXcVTו9<Q8 kiÖyK1au <隼uQNkMQŰ^+opVlb '3>kbS\af}|ϵ*\{MJTWd2<.KxovmQ*6뮗Z{؍QAf9"_Džۚv+MZ[x/]͠B1q=6QRiJMHXD2_eG_%msG#@~SP<ҋ慲!BWaT]bC0Ww3|0"Ʀ4TZ<S9S0*RH]Mxg-#w(_+%f <+Vq'HHgmi6/d Χ&doO uoOx0Qh'H!8HnL&#Lp ruz@>xg=` 0deZIw2xt5LxGd:ߙIHDS8ֆ$1@87`rg^diq6HkE VۖS6QE(3 ]M DH7MDrߍCHċuTك 咎?Qܡ?Sƫ"*Ou!OGK2̟O<>Cp!*يk_,b>wNIuhar\95ϰY&ف^ x ,6TnCGa'>Zni}ݬQiP0ŽDh tͅu<#A]Tqp[&SH^ϣ#&~q!%w1$Ľ4Q5[uy<*TyL陚:LK&v{ ^K(x3|\oS=AV3(v7P"Dd"W&Nb-f+YF`[%>sͥq:=xN]R(J@Rrcqcf"]7u;`o #a! 7\_9ԝoюwʈNmQmQ dOw^a,l/1F,.Su͊JHXCnE%vYu'(Vm4?w \8#Ɂ3lؤPL]q;5+#i!Pl"ǩaʕPǾd Q`Uc~-!JަPːjVs{T1Օt܆bз7S[=B/{ז cDXJ!ЅV}dF@/T%FZ?`O@UVY$3XgE;ՒZGTyHA\ RÔä8vb矷d\ܻr(va} 73c]џ}kM\ +U1Cw#ԉ|`&R^D$l?&A(nPrDWwH'J΋0H/ӱ\ +^3қ$;'Skv٪ ˏQoP5H ۸.Muͩ b[g3|I'=X%|j7 N:k[p(̓A,QZ!I:B{h<%Y pDȒI$@)X@cœdPsJ vh6׵yr,ѦLՄ1̛D9=s@@%vU^Qưu/_:(~mF 6 K_utOj{fa,_S{\ct>(nRVkc-H!1wjbx燘@0]nׇhddǿӊfea5d/а{4[INٜ~a-kn=)yXtK#+3YVOp9^Z-k %)oVJuPŲ=LƠY&l$؇fdk<0flM?>N:nājz W3'Nt@ "ߕ&t7[nrbҊ"Z^ : R.[zVu,orvjG$ D+ވS[ɴ#&\_*-JLC*o}E2M<D\ۥɊKC= L^j _ PֹS3eYQIO8S"2R-sph${pRDm8Ceac֯43r;: G[1X]aǰ*Ӽ'ꕕLaZ7Oa m)mwנԗ(l.zPd}c5`3F¬vuRo؊mI̫_y0z)/%F{m"Ph_sziYf9 iZE~`uG9x5&0$&3ENb)ʯݷ|gX ngG-=.wfyoը h̶ieD5 s7R$ͯ=B}_$U79ƃP]lA闕wҐKC!1t#Y2a{WRL; K:=!.s5sʾN^Ų]1*ҝP1Y) G" l~߲q{Is9Q7ؕꄉPE ~1Z}Y}+!S]ƶ0H>aTo?(WX>{.Y9$}gqU"' d7<ҩ;uGT`9#hVA-KnRv\œڸdϽ$A~pJeX 0Vu=0];[-߃,@PY ϧˡ=;xi=tXvY&ks_-]{53b;$֤M;wܳ$3"OhI$թ5 hH%6I_B՟|h0~>Ҹrq $3`%񦩅6>_ |0/$2,;'pk!ӦR(e=>{۸wPLvĢL+b ?~KJ[zoTZ!ঝ2b$bû cP$zݪ˚0ͧ #80xח#wӱzɇ'O:EҚzEa:фsX&yB0Hٗ_[Ў?I^+&UYYwZƹ $Ȇ2ozC'd/ewx6YSFh(EF LaUr>d c GA>EBfq{*&gScEQOoC .VQq\jtE})&tmnKSP1.]k|#L<lZb̚%`6֦~)=tk}c1WȌ\6juM#, fJ>!r!rT`51h dZwכ>TӰړ2m3 ֣iD´5B^xdT(njNbDCR7U:Rؓclvd9/u2uHؚOE4vvj+Q6h%`SA~Yn*gT'{Q8^TF.-YbWՄq4a;ZVRwz]pH5nVO R JSJ/`Lͅ tI"v q6 8<:.+߫Y+Yh KUi]tdG5.T1g״+O(G (#7'sw<Lkr6jտ\"GXL$<]0ԁuʂ|Րw5ޘ&K' 7-%b(@pt5E8jWWSmϒU> >@i1$XUf@@XNTP\ [Z߼ Oi2CqݢXh7V!VF80/>&<ЖN~|wt2L+J sg2ѠUwtV?;[&RxxW~Lc,oqI$B0HROq}G5.J#}X`'f(B4\hyP `| ..DQlBnb4zO']8+r):~#z?&Wޟ''ķ~u`4a[`k<㲣>"}hshFx@buեpHրp"1Ȱ UMdGl~WRKqVPO!bMB~STbTo֜&i.OA.m;lkLB'k B"TY^!{;-lnVg:z>eGlaekӵJA[\?٨=W:p}O"&M=L.~kSSڔ"[Ls{3 -^WӣR'5Ͳ/3Hѽy]j\=d9DpOܯ;[CT:*,haYp>'cϡfRDIh0ݞ0:/] z4z!EBeZC(o5Ig#6]qQF>C5 X6O$Sonʊi#:E aʄŘVr QG+&=;tcgLB.ઑG #yqIK'Tw<6_?(=Ax53 _E,Չxߝq,NOUA㯃:?4ds}<nޝAi c> Zcq:"5ґw)GNй|ݺgH+jY"no`ps:vuR1Kdw["0Yeg]8}KEOzٷ"㾃Q=3!ײU,F'dpB+}`T]a,sm = Ofj> wHyEkC9.֋f% ;kQfsUPčR<"#'R9EoG֣>p7{)Ak槡+~^|N?ty#v՟h\Y-ĆJYQ":=REѝ.Orϼ_17E$otoФNp;AqtAq*hB:1f$tſ8~Yr-'ߌI?|EsZKkX*[Ku3@_OR~aDZ# q++|ARt~S"F@vR60laqcPeG%ysae5g/s}8*:[_YpHImyf#u ˄(8KJ1ױv͓F:~e'*!;aËH.}؍v$;~h {3]Nl&>n:j3 M}fiXtFj*`U0# ^]!J!Dr;㒘0ڸF5;;_-%mÕ80INN>(à$Cû]^0p$Mva,8X~8tM ˋ:WE쎠FKWQtU6N4l2]q)g.fտط.ݦvw[m9YG! im$'9|eOx*@ӄBB s"3% MZ)zV_z%:nÃD \Y{'q6pF9JXJ cj 2vɬ2^+HmE}$Ps۪25,0F4 (,D6B=^0ZkxHWf E#+L'D.CEv }kEVbf-S8wf؍X  @\(栁tػEKAԽ>[gR 9ɇ59*}̹S奆d+ ]>c@U[|vڦd+Q )5<}yc\fG)']>l/ N85ASȢeZςꝮHTap8yCU֖0Ν(}me) W;xTC.tVWqj?6jdLbҪOL|־t{n8c \>7XcO \3Bt \Uލ.vpR=M%CPWbfX"끾`åsȇfPila}m2d1JjrGWWJ`>X K :Z^!K=_е8Ɇ7E^}*CvJPJwd_sO8M# kzx6IIwbkVn U;![oQ ۢaHr,6Lrmm) P3³&wTbtc:7R/eq@ԇs|8rkBf XttUPbg$̪4L-kV>Lj jR+61χV l/-rxC u-U_23(IBT| 0p[UNZ4 T7vz)Q'&!ΝSnKmJQTmbpιՆ(@c(RUc02̖2h^d_m}[H d=tB {EX=kW_"0WMz/I}#HU[Ze$8_+F'7%eIʯ<΢#5~`Q)k3OV"nH Eϙ'Dv D/g\ݫP༜2"-U_bIFS1߅l<1pD2-Q&P;mTtH$9%<{4| (ǂ}BL4vݕ Vx..kxZh~ܯ9H7\;TJ!6d`D0y{STU~9#B٪A>r;%9V@q5E% 9m?]NT ]n:؍$.uѸ1æ=P92i&mͿ{O }Lzpj4[Rʱ27__%%(:V?l<@ARAcgf K ee#8Ҙ q+^uUdžgmgAb_4vcm"a`wBοd؆#¿!ύB"QRэKY\-b$zI|@7h}AmxfX  avqb8}&P3gCqY LL*{r<߉p7i]wr0//aƆښ)'utd;S] m]>|XoY؊圲PCwʤv%sl?ûj'7sEκq#~UN8VޣΡ!:#;E;W 8]A?)kLږ%&ĪcpvҘɸEǕiĥ Q zPwQg^(3FK:m:yF؁L-]F ѵ,nl +lWw p%#,A[M8<D1 Pť򃪪FWЖ^^,ϬsӹQcFB!C;9(8tn: Wo-Yv)3vlw -`ԸyRATBmt¯ Q0f.7mRՊ;}zHv+:I}1H/ZcLU{\Ph#K㦶p ?3~?i3۽GFp7>QLA2A뫚g&Hp$ ր%f?>-6S%^aN$D W5 W؂t)8}C@Bђ~c|Dqkw5b}e_43Q.-Q a-i=bJKF.u_)]I`)g 8Ӎ7 7]Rމ vs hxWP0 ew213F~ z~Nޔ#a}n}0nj2: k3ZH|;t[}w3~5*ء0Г?Wcwq-_JvoE<.$҅ފI5ˆu 0yOh^ ~N=q.d5MjYK꺴HR dGKJ-ӆUen_4DBɩ&X Hue/eTK(8cFLp#v?a_\j2 ֳf"gFg}#{noFzUh\'\ʝY&")G)gAU;}7wtsmE`r|'{Y Oj,AHȇf|diT@FMe@)c +`Z@lg ,!z>%͏lUZ䇹oۗq.Mm4^els'-܇D "jm 6X_Mh5ѹ݇wc>X >J4jw E)Rf\,Jߗev+\!![wωh`VS[\&~DKY &BcO܆郬ORs}ږ .v4U{.9n#*odC^Ԓ2'{hx:buZn'gW%O l 4jAkm$K=l6AQ8=yIZo!,:ka*F[mZ 'S TL)oq~~ZdФD%F&$"fdkD0iQ@að$f,21dXRӚm6g"啴ƿ$x{B'v! fs@_TP4T!( ٖ5u'o? Mr1,z7Rd Fe.01)"m=0$Od&r0eGC팊?J…'BbYxހY5kG Օ{17g>n*3 P DH~y:&7˫%]ЩPcF5yx @E%ITİ51^vIdM/6ʗe f e|Ox=hahiQqj!YW*PecRb" /€`.i҇c9ǿjCo1I1hhhvC:b'Fc÷zRZeg^x L=\~h!u2T54N`&ax=afeڭ/ab(0OC+%^4!f7P-z%Dx̍N3&e5fjz>KbiԺ` 0;:.w%DKYM,ڼLn+2p/̪a8Ni k;aPj[M(H39XVmQ1EArAo  Yra&W*tJ  uDo!U|")J%[II,BJN"Y˫&󆔆LZMB jAP "4mgMmf`ih:a%0 Z^VC߾Cd|flwܩHbrCtSmMJ|6K1EQd)\uu7! 7!Htd g&C7%+ĥRD`*_[0I Տ Qs?hH "`!0ù|\9=)LBVET{15 O=XC{GLg=|]aJpK4j|󾪩ms? }lzb9>n=X4h *ixay纜Nlvb+už02fZ'Tt߰~)e'.m7{6~]h_ㆿt ^ϰɖwb]{d\HCӬ8`Rܲ[ny(~ 4Js?y(z/RIB>Yt/0=[P|$dXq4<08as (Crip|*Pk˳FdJ$!rw:%oƽ4A ͦUA ju$il0c% -8Z_9تF2>FGy5<+N -tPT\厏IO(6<|nc\m0B8XA\;UƴY\btT(0UH NI%w7f_gEIj; @lTkkAQL'S=7CWNe4ɍ| ͻII/n]+D<$GTŽղ qGlc_Rb=,t mu[}Hp;=hgL!DvԾP*m)L`etpy\U+gnH MrL#Ly߽P>_&pQbBZ KHLoyU1[1Kd~[dH%TIjf"O "X( Sz`qDŽ! !ékXt́DGAzp]rac0&&@Xx\-y;<}6՞fcH'hu.#¨^43]?xM05hι_:]f#`@ ci_.z3 FzE1/C5w TfsQ ag9-,-;jG> $h^ꗣc6Eēo(y?1:Z1"傼J #IIO= - |  Vs{ G@ኊr:@Bm:(:?lab9?}oQ>^H&  I;yn >0 YZrrcov/data/salmon.rda0000644000176200001440000000114514556265567014325 0ustar liggesusersNQ9mEibbsȂ0*&DбJq:i*xi0ApK~ ʤk9\f:ݐLgҎ$T$_S >riʮ_,\m Uh65J5lF5yjFs_|\@na=bX8~0lN C?Xج֮Ku[j|էsx)Ƥ7qמ`Z^)ًگm˸3N(`B1/ڰ)Ϯ| 3_w173\CL)7+` ^`B1Zͩƌ[pv'~T֚l}, b`@5tkF:qg a]Ϫkkv{f`#2Xm̠hx. π9T''KEw1&rwW,Sn]:Ϯ+KGm[jW;g?~`? o y9(͔YNCU%?-8o ;o=q?y Ls;áT?(WR>zdYlp&R`:Y'O^[uI`nҟy G{! Ź湓Q}G*{9EڿOOuͽ:׸U깐?ͻu տ_ʓּj_~@(@0Tӹ't)⸜zR `mrz9uWF?fr_fpO,`Z75$_ҳ-E|@۰6gOx$K ˞퍃\ͻ}",DO{/|7Яfoa3/sq-a󷞜-N̅wC~c,|}Xp`N_sΥ_yS g6u<ĸޒ٩yҢb48 J0F01acf09acXBLp!egY&p)egYX L+%$Q/E ޳dIrrcov/data/Cars.rda0000644000176200001440000000453614556265566013732 0ustar liggesusersBZh91AY&SY6]fP@ @@C oŀ*`DOSzz=@@44Qzhڍ{TLI O l(yCOQSM@BaF@b0FL2 @d`!@ɓ  &Abd 144 ɓ&M A d1h4`ML&M20`L `&`&"Hh#ҍbjzMF2fH {!xTAE-me+R֠ʃZZ[J1-kmDYDEaaQ,VQe4eD@թZ[JXJ֭VQSp-Sp|8 ɕE/x$AcY"2Ec x;HXr` m[aCkPNR!%O|( 0]]~A6l2m2t-aI+Gd=Ҕ@VP'NtҡUEQT.urk$b1g,o҇IPߴH6(?(:7D0;qɀvqUDH,LRi AdR И*Z$]ܜE S4(VN Za^,YAt4[y<&,Σh6ȈH`/R {3jBCR4 5#(QuGy+Y'OfuGRzg<.]xZva˅;G9tk<:)0]AnwVWa/چ+ ,8UV&"lo.ȥOf+eȋ"j<yWl; :ߔSD .\c4T?h{v@ig B9 5^> ooɝ<LT|JO lu ,+W;(p',`-'ZDbR_H/M*Rۓ~},H@ؐ4$+&,!Be C$&FH h cs߇q=ޱ6S7%V#vwpR&2Rϑ6=836J-%NK[Fj+qr[NpksVXb۱:5{ZWxG:|JhH)I h -&68's"'|*÷eE>iMV)T풩ּ*1fY,BG"IҰDDQb2HQ`# C0R(,_,Qm *1T`UX+tv,Uŕ`TAQEXEm"Ȳ-UQT(()V EG @S XAUUE*ŋPcQADS,_.'h+!O_ k4ϖ~R9$ZE[%Ϙg6,&HEB[ UQeOuړEB&$@$0e  ݷ$PP0B$ Ja"q// $H"/nttra.n%JSdl +"Q|$,8PQǬǼ@o_qv%—n QDҩL1 P6MI.ݪ빣r6a[|mKiu^.3d.3mn-Aa&g@AI4; \01pS s7a/$D#*ȄRWұK8ɘʵ/ 8`8@lRF>OǑFd*) k^z ̶@> 5Jc hCI xu@eZM:7R$<ƻ:q332L &BTh^D5ZP+`<~SԺ` VkClbU%-Fvy^fx V4D`LEL v', Lĝ dQ;)2`L2̠waldh ]O'ӑG=@ԋl) a*Ө\[4 P8 .. T\hTT0E͝)н JF HH/1 ǢUxy_0Y Q h2 gjd[kU^%Vn-\i]tg00"B,ߖ;6AM9)sX1J(Ĵ3@­b3Cj"4pC #&wfj OH<" Qcibf&cpA(!@8dDC!(!b4*ڻYTK’2$:"lH; f:-H ˠrrcov/data/olitos.rda0000644000176200001440000001630114556265567014345 0ustar liggesusersBZh91AY&SYf.Y'fZnZʻ>Q$}Y;ukWmv㻍W]iQt$IJ?JxOT2ȧ$ښe3ibO54# M(4&CdOz=OLjj=@=LP9J2HgB - 5B/0إ}VHۜR$$6zVZQ2عNq!/?C슸8LtH>%\S􇓧C96 rܐx>J b ;?ksiXxCcevVF_~o=vhޒChjVor_=!֐zPBQ F.@ 8Zir-J ѥA|/"Еİ $M9M)C7NB'd՚DW"{@i/B%M@K}iiBJҤ韍f97]T(&%Xc(/9' r-GcdfFfe)!axV{>Đ&Qvӄ`b! OKj24L;~\X 9H,U]i3{ۦE@Uv hv, 6Sn{F Su WY1(zC@& /vp!i^\uĔ۟ˊ0H L^02d4JBAAvOnvElm|0,_ y2> 9H" 3NESlPvx_I\vrg6zZ={kg֑v<Nkq]ȼCJB.5  T"tRA%9P")-^x$.SKL@Kdan̋^fh qG6;,fh@=ͽXLXت8a F R@ol!z y.K`S F>FqvSK:P6?U<\:cY:tH0rs+em[>Ip5(/RUP<['"3ŷɀ-ZX7-(n5붻뗤l (b Q2VSXĚ{8ݕ;N0Vuԟh_"iVz(='\hgUnbq:[9X2 5(̜gEx zZPSX{U1DlZK&z:RLXz) =Md.$ÔBpJ P+0:tAC*%\ Zxv*bZefέ[е4u83IB&k'C,lq/Ah̎v0C׌dll(0Qij5KVVl]rl*G2JN'8Ѹ{Efys-x rm &¾4{x*^bП9!k.eקN=~%]m golte( ltBqF7dD%-)ꄎyoLVXF/33@qm2 შAD!&"id|]D |irλUf36 Q C&*`n4\:16vL4zmeۼŰjTz7@^"Mӝ}5saU88U剪aWQ=S=Onh/<,! 30||{kyr}rxVȌjBHAC*ђxyJ7Ν6(,k"J7An oD"ta\qc'[K{/  X s" ga3]Qw*kJQ`AbCG2 [9<:ډN*Z*iPy q$4+PB ibb5H*Q FveZeTNU*.yaH S>a4jԥ(D \uI'}_rdk/2ְDbA_^UDÝ@\^ ^Dm,_ٮf̫Æ!Qu!2;_*2g_z`l1QG4 tm< wn=zU݋|ݞk>{GލjQ`!N`@ET &YzDl8û\gH F`u7۪@~OKz\?@7fM:t I m<iuavŊ&1Zcn$DXQhdDtb;?&J8诗 Iݩ$go4Z; |i_")+cgPR!b!#` 1j^VxB{]/U$L x5~?3!r8>l:R"}F1 HE!܉ߤtN[5tS%0nSn &Π>w(P/g(FS71hNoPqg$t.-I+;?stB.x3 3@E|,@x#ӏ[FsHkAo<(- ;l I\4Q${\$[m۹e},ݔ!d5 K+VYx}7{kgW3:w,TQH$S~Jo<P~C# pn!gxfS󑿇)T|>0Jۧ|:fihىOkԛr4VkCri51^ސmR%B%~*E%{*?JbmڛFA "#ou5nKEE?ff@`,c3x]"L3#Tm< 9$42 ǣ%e]g9$m;>`!b|Qvp?$* %]8]&4Q<5Qq $Ri[!VWhe "e$7A4@'H00m2-0%8}}ePbSDu(r(A@c*lbUKY)}p ?4sM"6WY(D!oNL 6N2LƪRȤJ Rw֓܂t\V8m U@Id$.hf“*^:Q"22Gu鰙f$WmVcl\uKĕ u빑Hh0M&@lߐLjB^̖$;9<5$Fr󴅣lND"})Z_+bZ2$)3GR5@D9cV0#.En/`I(D'TDmO4u?nH>S/`x̺5Ϲ_5;dAS?;y%`_t葸y7szu {/_aT|kWH=6xb%mbVDPN|QrW\}!ª荸|+]&;kcwҌpvba@^T-ZhapY$/sž\ݻY~\ys&yNws!ؾm nDlR҅R9-;&AÑH։}D`!;`S^J8U-aj_ z\dـ4I̒b- ¼k t+hC# ďo88 a"a&`E}ZܐYut:0@#.'b\g XJ/L4Q+ "]g=Ǘ{&I 3 ZËEl:Tv{s"Eٳ?:aaGO|B$%aLs>iOM:abh QV]OF\Erŭ}E›..rՐ *>43hLjBc* GZL&)ύj @0'X+]+q{}n*(̸VF8-}b ew#{jf˩i16g`]E D,F>D | Y4ӡIJ%Ti`kWъKDۜR:i'H~n:,:0(?)ѠSmd2@Z]մ|HzJw lN%37H  ;C77Zϒk}s LPOjx3=ې8| 74[A8h3pY/)U򔋷0a zJ|/qfX2O͙9\0#G[%iw)N gk%Q|Pa D@y$s`xzSɢ>-[yWoGXD=! UQXSړlY ľ=Z"` Ֆ<HB[ ,T9 yvg< oN_ sV=p-O)VpX5Pnp-zjh9)gatQįm/rЙu hY%kʿv b\*r2Ά{O49Ys'}.2b@۩M"Dg[o\$Wn)zNNsz }!Mk3|QkFԆwi\VCK7B#+d,3n?нFT\pX7p/7%h4O>?!(s!_ÚD*W] eJ?Eb0oh7V!-%"`7Үj\gTO9eA/6_To%$E sJNөp8U6 ԕDce~A^K}3+G- yTiƓNGՕѪ]}=ъuib2P{;m eO~c8 U (u0Le ㋤SxB ;nww~;iYJ;)ip۳.YW [woqA@m*إ@n 01v|"i SgRonRkE4[ - c97@O!Íꄁ.m#9feΰ4I%3>WbaB*;M~v T %#D/>OAhUniE![.*>7{0ʕkJсI {72L+beF"^P"v)y }N.SϦegƒjZts`o6n?Yu<1P ;RȬrQِv&h;6ΰy?'֩f 0 GԡxԿk 3NQз(J<Y TIU#Iω\"D D |rJjkjbv׹4`݃ؿ,Gečxx|(/#D9LH\&o#h͎J~%֯$r3C]݆'z/QdaxMͰ5^&˖L%!Uy,C5@R|L3h腅M?B8[[s ۖFyQA]l-Mn!Y(dKWij^'*6 %v9N vC&Z|"nUXmIZVtP*]l&ٹt%r iQ3TT?w;Wj.gCJ#"D9x=}YDi 5_B-*KBF WhZܨ4S b#ס ݧ:x?ldE.Qe->L+Ӽ&UZRض/$e&⯻vAoIj IL1PX &?P] 0ƦA~t7D*||C?ヲ6Q'A֤J^ "VGi+UJ,&x7g*!ʦ"K  Fa ,N+iyѠh\cXF:On}G4uA"gp(R цcp79p>ܢڪ4 Pli,n8pB~hC 'ٽ> _ttCaն)UJ>3byX+kC_e"] J4kd@Ը1ڟwl4^swXx!hJvP}}F XBu[MȈ))4M i|hXB"S-+3N%2Oڰbo@JyGFJ֗ .\KT@ }Y"/ Ք5j0zjߠ 6Jtnf{om+JJ@Ӻz?9F#ySkV3x`}m/ U BCYoKZ&M)kr8ac3w6C^MA :z5 =_ dGp_Z}8x_>B`~yU 2[qZD7.lSI6bK%eynGYP0Ү8fi}hRBEQmxEn^#ӌ&ɁU+G d6s|pf?h4{J`e mjCrDگٚ@Cj,eDjJ]5d2WOQf2">݀?M/*p/ߜI9RK6MR8e8~$:.D9`V3VabRHoW+h;s^m'xW$ˠGhD s&r艷Ȯ7s6"mȶc.18niôHEgo(1~JP%-#1Rf|;*9vQ5rw r/dDA%'8!hhe@8݃}(ߺT@k"NӽD{1"JBV1zXAUxJy]i5\pdU #wWDzss3Yn 3vh0'qyyΎ"5bP)4a"T6 B΅vֿw8=4Q.aa=~\v`, o-T~[iȹ/({a"imDa#J1I;+_Wg\dB6:X< ܭ_ A?¸!3R0DLun WJ326ۥ$eu]YTmiN b|"UFa-1{݇6S۞XV$͔`r:w Aj0~29D~!Z83SozMIL ϖmwEl,b ys /F*QȈߕgL1@'!hPҡ 64D"6aS7-;vC ̱-dj0IMr)6#,ez@<G΃ׅ<&iE:ǁ^bQmehֿ[ jU,`xɶlgqږ Н@mȪM>2ikəqOu0w@M(SW٩%5ɏI=$޸QL>]5 6Q.+׵H[%FAU TnޕVZSkdSw}p KH.ټ9UMUܡZ~Fu|ϺM_h.4GB[x.[ QՓ}$-?-t1aE<18U#4 Oc۶ÉޤZeY-=iW7P` kgv^gsAk?dތη)W;w}-HBڌ39|jaocIc(vGx5C/AD<ޮ(y ,,t(:΂' OEQ4 oFnccX>3WqE5+NI)Z@fM?@AѰ扥j3F'{#:%c[ff CߨAH2e P ɺ؛rZA5bivp NUi^@Ӈ`.q63+KY謈'`֖hY%fO$#ǃGD:ER kR z,C*mB#{М"R!gg^Ub.s&'N,1z`Xf.ҙQC-TÄ^a)~Xdž<!ɗd5|գMZ^Uϒ b> ->s7aһJixꀩ$ASFɾM6ז^/0Ljws.Jڎ# E6X[f2z| f=8x&A6c 4!tu&`t>ʕ[H:w-MKU,06Yh4y(qyNKׇ߲͢_{ԕ!;7 Y,g"2ݗoMO&DKf TaJ$J#["G A{|ԘhEB!?K΂hH?3NS(}yk-=iP3DKT_DVkrk 2 )\CБHgI0q44Y.k&jW=V*8֧:Aރ kg@swe%m} K~< "Go@<%HE QРFCkvV+te,e 6G=57o*rӢ|!*|3HDBO@5<,>308L:&|{y vܩٻoke?V cA-\K0>;2d sk"8r s5emNkN[#&aNVmuAaКN8^|RDu,Z^E? >#V|-S+&nJy@͍#V* f`!r-?{< î>Pq MhW9S wxeZ_xEA;UXD㱠+ h8UIgu>2# w?)?!uƒ`֌AnUJзf|vbqv"5r9uX`h`QYhP[Y@re4<uMp "t(mj!<+jr~(hĹ hSLlr: o+?KԍΒ ^J (<kY$=ͫSk~^QL9\&.㦵\ʖ8{3dP})ykQ?ɖ2]we"GJy.>֑NR1IP2m$+ 7iwO;v_cǭ5)ÆTؽmL! Fb@S_ Ź"ƊA%݈*ַ4vDoHnDo%ykcnbdœlm*֌NdE =S/9p$W~;<>W?w=;LW}jnNo*,:f KCD|թ]ox:t+CyCЗ/cCYhwlw(]o>+?,/=Zbn6Z6\SLşn]oj2oOY  ! McvsFn 㞸6>B۲[@ RHAwTI, dQsr|ΜYX⃄/Ż%or3,j㉵'2(Zxm^X6hFRBa'Бb8Ak\Xxj}fi뭈5 BS x[d  fe"#يn(؞5a^JQ5nT }ۿnJY2,Otcbp&|`ڂHJvlT=g-c$qS'hٰ)`ip7 w^v"YXqbH@@Sn*y&f !ۭH;jTkBMb4#fcnZDAqגZ\!A PWBȋv(`/< ؎  =XD9ʬ ]dQwyYo2B雫ewFΠą\dqGgX*#,‡{/;/NuK{ ;,X-GNQz7MkSHq̻R[m>K`swmUZW }j:Շ|'7`ul[P.g='= I)7ؙEB@ewť?Z2mv4TTUϙT;k3DB=~ QS:BCi,e0&AbЃ!8qlFjTu\eJԘӈCb +sALZPBMU]fLGp_؇J. !K{ҿzm }ma.U귍lا>mA Oݑ>}8e#&3$U8킉  d C|٩Ġ*꽲WUCeSB ؤM:kg >e2-"DdrɖüFԒ[YuLׄSE^9-k^s q>"9orEJ)@c&:C RDnU 4"QAExw:qeugϖG?>ګDsB{e)']{>y?rN?qBu{.ZO\iHJ -}S5*K7zz5Uw~&sdT`|[vٜ?W%f>ُļ کț 5m<I.PĐ@ć"i}- bd0Tΰ.}bA &dL(C&L;4fNIl9Ju/1D 2B^(ߌ(_% ciCBaxilu4 ;eeDlp#?DbF>sg8281wGA}ִ,xb5BbڱۏFBKH FӻA&2L_leߠ=f~M<\zZo NҰJ JQI=!#>4MG{wSl(*0y ]jm@Jh|9D9ZDbmU]q06"!O,N5Fz쎾KԞ֭&XmXrI$RgmXL-T !P:ReDžb֓SY©ؑrtOLc\Rj O],U!2EfVu9cٙl#DNb `?Ycp1VgH8ElxLJ41HWqpͥú(.Rǥs 3|?geϩ ɐ-\~ \_[ݱG8r{5p t[ =ݨ#NcfC/.L͍y/w[eg;MB'os}U9v# :R+O9Lvw5*$ wܦ&\Uu~(g ӑFjH- ,YIt+(qjjǣ8ۙ^ KHrt_琖c#N|t@-~3mU^4]`2Plg<4dm@2Fc`7m?IS+ 㤅@0"JtseKX]d|4ty M{j0EL7rJH q޾neN-1 Ws~|=a$~Z*sɴz2hWEYgX\9xg #"U^Mãҥ&Rr܃)Hm_Z6xr)D$bǫ变.Rr&7퇬C.nt+f5F4&ZuzD{1K2wS9cO(cK>&&3 *wai zjQHxEߘ1F g\Fui]nJNv=A~70|+ ~ޱh/eLr՗T藔*&?켫{'$nGS#4:k^Q. u1weB4"!\}CbF.:OUwkA8"D?|tws|@_yt-=JFD'埲SBړ"8X:̬5 dܴuq?pDH2+m(Q ^Pr#%`E;W/22V`6krjz? y_#BeDqVvz5T'N06= D?Oo$ *4DP9<=D !H58R@J-2 Y}/2[@k-@./9ΦjȲ)8 ğ8)>ŀ«qHeM](P,u?#"|"IDҗO"rlrp * ֕> Q/LmL_ƀk}A>w(##yw*CaN$ ׉WҤ!Sþ֓[㝗W-xk#Bsx=:6ja|A(PvB״-DA@xR{2 {C$+VNm^> cd M6w,^-/nSAh;رI45;c22%=z1d?q?VpQ-+>3[v]nQz#rΩaI.8Q?x#{Ηi{˸$N{3+p߰Y3>8bz4oduqWH̏&Hq#$[pԷԺb@q n[,Ak"gh1R2X93ߗn%DZD v/+~8W)Qκ/$ʥF=06p`JIuoi9&{T~ԭlڿz RY'j>_=JRLRyv7z@V޻u,S ͊M^=B̍=?}}S궫b{X# PGF-rNXͯ' o-xQ"["sk71`1}e,-ô !ڜ- /)@Fju!LbǸ4"-פ~ ϹCTƱLsa[/3ƹ#IdBӈyw/ga3J% RVX[@_GB..ބlT0( 6O'ݟFQds deH ^XFp mKz͓F_qMKE4bNCf'Qܶw5%ۭhCx1^0HS֛p~/ GJQˉxV.&=~ci4OATRc)z)K4D(a3p-II,t3nQGZ˖ZheRgC( s-S9P`"d r)g2w`E!\4G&)'yXyn{`[#? wg~g+Qk[Z#`j&Wׯ2eM坤[c)~ln,Gr21X!5uD:Ε)A ngwKz 0 jHSih0EmiAdd,)(@TPK GQ\A4 3t'p/ W90c*> zJ~dz _ZrC:*ZejwrJS]9ݡV4c/8"[A>GMgګF-z Ed M.>5Β,SSłGQLUanz#y`RH Af4j/$[b*w*aG.u.=+'a4ȧ,i VuԥN2A;';˚~4?dH}-5y!=h$JNHΈo\zT[d%&/7|]A \Iu=yq2Uiㆠ}=])6W6#C }'™]l#5w]MCse7% }4AXHQs_̆S(g Q1gv,d+`Ad"^\N0~L Jl`.KQ#J7T*JZG97ev/Կ% XR6pPL766:߭aQ~:>$t =2+.(0yIʿ&t5~co]tl56q9 RV#KO?atE?e QlMsT` ch0kނibv4@N%( ]}wbqN4g7J6xlν>>kKN~Dm/n{~`]ڗg5 âgm6=6_kţU6Lj];"]Ryosb)pu$[CDŽ "1Pfpdq.05i Yzk}/!K>o6c1fszZ}2q !Q?q8@-fCJr Ed4]9#9i8?p9Vtz e%Wmʚ`/<מU<}l?y##N]>UDi B,b}>&ٴ[4. .E܏TtpQABfW"B(>;eWTQVaiza&E $ u\G)z}[C~Qeu3QV$0lzi)!M„88&x|KִP og@̉|瘔y>$W+ݤJwU0rz .J> D/\U G |&\ϖ#W"껥duw1e\uLyMDLM͉“$QX{O\Dk*,zosG(kgZyoPx9U bXpܖGI:U=ήl>UQ%$!Aj"`,:8D9e f8AB)PDp9D~ovlwpȬ% UCNKK 2m[~&B k&I'\֪>&)֚k[̘whX]m'}{,!3yl$8،ILD~;/ļ>rQ~#HA_LiQFڬT)/z1*=";!\+^tPN$ڦ|1rY[G~[v%76p.X[WH BIⳐ{$HP3p)ipxǰ/Or+^ӛ t q*VͶB %5|XvR wAܧ R" :Y8e5 'pi€Etl$8QIп{0Mh:wP"Tk Op ,ۥ3C>,rI,=>f7^ z/gܡΑlZl-0#>R%?:aaߧ6V7fImuHR&oXVQ? Z(+*ѕ%SQ<՘9c8kͳIN) "|ƃ_bq|]%Ma?N\\%I}.H?K zZ vJս9s绺ޏ!Aw~$ jqܨ4뿧xD<&R2*{.QiMnDD!,!sJ᥂EN;sgW Zn3oM LT p9$HB6&v 4w6y0_$ wS[xnGEЋLӳ;)% @Q7K;?Й-G1}hĠ]]@7VpsU;C#=ϖS@FB!X$.˯0[8!ьD Ug1¯*)lT`veBPүvA1x܎30Da7u[yf--x<){*%Q=bX$3Jڱ6}+ "7BQc$)!;i 1Wu>16yc*YYuHu?OϑL?R$m^v ԉ`~{T^SL#"0'*+5DRY*(m^vLNE=AE{ KG1(J~+,z.ޝ{&GD>~uwwsLOCRkrN^}},9ێ]ڵor /ӗ ! gsO4n BaXw>WhVGwi|p&V8~჌8Xۜ E< 9jVW:%g| #qCLƲ|zȜkj]\>0tkA'0w,— g Uz3G JsFYEaJcyso>U=wUy 6,>خXF_B`ܓeDM~7NC@V 'Fӽ㗆;N/նaObM-2Y0. D$:1qIK8U1rW]P{yNo{LF9cWQzPum IM t"7b'o܌[WƱ8\mZ SV=G y=Pћa%pUBr ɂPƑY R'b>P7ybQxc=J@h')f3V.eχ܍,y>jAbOrZ)aj7&(z|K0M 2D>ⶖTdh;meƒn^n!U?=6Trog,؁ۛе]= 0 eWSD^)ԽJS_ }I.8E^XCh2NԴG"0@N"۔tLp_˩nNvivvX-Ic^S¤u~BveO~eY@rF"w _YٵXrF2wN7sT5fK+q%)8{Ve|&XY炣Fڠbt61}AӴX5B6lYB!8dl/eFM̝ Y⮾ńek%XΎKu):nv?@0ŕpXnE`WkG4c@&2pο1h$ <9{Yvfu%dyn̷6Ks[Ai>ݦz::$)Ȃ"B*e#6y~)`zEtE+<j")ڜPZӼK>-'~3E@|/"Ac 2̎=|7 qbŷ(`)f2'QFRzu[fjS<^B9Z͠s3K} ,X z"$<lB <+/-ՊݮԈ%s=vi;7!TAV <,=Hz:饣|21 5*J_HGV3Jh6ٗGpk O~`s2%Td|foTcl3f9I9ԫl|n^.Q\wl/7G:.l*no3i˪ئgDхA8X- $8k6l<eП.9_Mvn8E†K$Ks, 5qۥ0JYlbitM }i a `E{\o@̻@FB63Ƶp.WGFЁVoMe^"tXK.ezȜMA}}šG- 0~YGP.4ۼyPkpsrYD}2~)jM~!9Ր$2;'\eb {yQ|}D l9/Ze;%ZJO6;f҃UD2L[ծ]0k ͓3|[~R'^/(,$>6hf 66vGn-~y9f gG3?dvu#-PDB162{`W:D**ǔ҇dwCs>g>nj~ˬ* j+`-'6ySX1ƱY1 %g5Lƽa]T2RZ /iwlWe$?qM6Y 1P? k}[X$D}wi iIVJț9(Ax_푃tw٦yB`.jk pNAKrQAЏ@~1`>8ބ!IPo H%I~Tĉ.=؁7SGj9ea2bC?!c Ewo [lo̓pU34(6.w ͤ8kykMԮ_l-!  TqN qY~,,;|f׏498٨)勭C$9@9^DWȥ\ޟVP-"+3IF2[^_9-'vH_$ݢ(KbIZ6Vd.K忯4#^AD.tfv#nt 즌Rz&?A±I2(֩K8]v2B",]|$"d33GHJ2%m'm ~/ }V_{̏u|zB;/~{aX]v cxUbBU֥UG?.;,vBT!۬?@ρtPohڠߵUZzظ 2nej&M7t.NT9tԠ, 40s޴=rȟV񡳋&3W9]#NrBՈ4܂l->˂R!O xT&y_8$JE#O2iց)נZ7:mpd@W'F;i\/"oWA&A6ZnrxdI&8ZG65ʑjCN{?GlKfM'ػT7}BllgX{s)UR ^!3S[NqoU5ƎZ@u@z>yGu˪r1H$ϺuʦIfO((tزf=4Qf|B h)x'ʆ4U#G|hB4Ȃt ~wY66:>;>ij=?c8llH4ɲ=ȝiK%=ou6=gwA.2TH/B|}U2&x4C{W'qhƜDyy*3<T}jY]dcRgeRlش~N4i~BG<ٶsԿ~\Zc_?G )k:UR/(n}PDE#0t B}Iя.3=r*wpw$N(gI2!PLkDʤEvrτY7!2`}vE>Ip?& 3ƪcX;≯J1oGPkҚ+KDp+맔Sp g,枘s3 3E>G;gY^! FxQwSKrNmZp0=#\}wp#T( Do{Tzo׻ܶ }ϦC]$=K~VY=Z#Hͬ4 uP|\٘R"y %Īnf!ܠ^ q#ѬűI2O5G9ً*"E~1M4L 8UArLe +\C <6sWnA:Z"@Q88jn(v<~NR׶_tQS1I9J `c,(AktCL^>ό4.[_l_|L5abPaf%- ʡ˻x|o2ҝDS,*<0K FxqCUX .1N AŌ%/_G~1m;e*T\ wa/H@y[>GHq .CE&qD܃|/BQl)qd([`liOSVNRЯd7ċn}FU+{?!H.c0O g%#I ^У~zVpk"|>x)"0~~N?!N`Y<݉FI3NTX F1-n.?KRMFZ!*CgC{>Z* A_E ;8, /aUl2xwv}?SC Ђ Hʰ;D.dBe:0u8B؋暴4hTk*vܛ!(p!9/}:2H'jb4'YK\f$`2t#WpΜ~>_cOclzo kBc<8Xtl TXg^BT見ZڃՃGCeP\ e5z{ H0-b K20$Ĥ5[('ǁ)5x%E3>dE!w7ΖcAզW}\ܷf't/۔ۼ9G4rT"Wh1 eVC F!U!.{in(̛*dҡΣm^np@o.cb֒٫wBT858㚖^J;1dJxܻA(=sr?Aȍ_Z!@wS}1tWLń.gl٠gH ~y#G G&낉_)Gv#c 2SdoG_(q1Y2x iy=E|fJ;'ekF)oy -mq¦1>_ZPtO{N >!*{7"+h֓$ e8-5M˧eÚIoQ !tL`vY6MOдq?B  sg9MqOxrstv%1rثk)\ʈyP蠳3 C,h,dPZÏPm<7yawNw#Q'/oY"?`wtP#躅LV,3QܙsDr%"-Ӈ^piD|0TV`4~)W!ba528gz<~J;kʳHn6kc]қ@$5cP Ŝ~ښ,n}Q iQ~gJb̟TG(mZkĿ/kN*Hu*Qh"}X v7Nd26!kz Mj$*߳|I{db0약&쪓0Y;C24pG-3(p.2'5NDek@`?W;,F`_C(%Z CJPf6Yc^SA4}Kc@;͋(S>߫y _hOùT %6Y%@ 8N:/RdiwH@P}➥{(֢}$Vp)'\!}0dK%>EoAH1h˶s66cP1l(К\8cFL[s"Br/2nA.@Z՘F1@^ Ig*:6{ j 3w _u51RiP!3yf?d +YFQ k/pYd)Slˍc("fFȞP̥1/+|=65A-. PB[ H$ PC0څU'j4%0jV^|C],ɄeIhTa៕? ]Z=#%UqQEw":Dj.Lsssv\fiڿfX`^3"%:X&܀;3U&g+cN)6#4d{"0Nѭfu+P?tM<WVW^2<,2"?8M&ˆ`U,?|m\ ?8ʕ{  M H{5Վ^ M2,Ge+(=υ,*QlC_LDkϞrnfUEif>-Һ~d;uiEry2H;KAʸ_mڒ7{90gHT@aL#l?ֺQtB%pBH\!,P%oR*liV!] !ϼ{;ouOӝRivǛ"A{+&؈qpeǸi"LjGpcNôj" 6 tZwWO hhitg d1̟I~7op C\X 0.p@w€ʂ&g16f3]#^Pm19VKb×弯o{% `QB_d7?SzimC)osOj~;[=4_Mn(GvfVt.| '=OO;2!h9dy8Kx6)ǻ\i,7(F٘AZ7ݾ܆5 A=89>&CCLu@ԚDgqJ_} $)y`0$(6 yat"?_unmV*2k@A &b|%ۤDa_Q{ `tWź=ʯZ$xCs(.A-P(a"I7ym\{rgQ_\J$XS+v:1:SbtSsâba[t)fH~sjk5r."^"+F_:dnjW~l4lǀE[U(Gx.C{5t?~Y]_uIE>kxV2x6U)v2W^0/9{w$ U#Of`GpTK49fR Y(ª, xzӋu X$Beu s%Qْ\!hVh(ܘ /uɛ^o(k_&|V)s='y{葭 %)ߙdG: $Tn7dytLeiN?ZZIČotŸ>/k= cXUa˺ҔUaEr^*&.FADEPtj9 )bwzKr8HMfQJ5̇bwM'2ьI왢;IfxFTgO?%w%q_x~s&E?x_IrItY@"2K3:%#gl!49R2YSFvYA쀬`mtsX]\@QU-A@6mvR:hլ}iP {+P֠4 PG/(|珩)m6C[r/ ?TקbL.b!K)8a'̍b,, f6dMArjR^ς.s:ɇp50#-,RHnQ_O.Gqi A2O7v.K"fX7N%A<3Jqqk ɱG:Veb{n(m̭}:DﶒA#t5 LXG('&y"҅>\CN`nXB xKv֩"`#0"W(<)*c,n %W0'([oъdZϦ@*5I*,c ؙIvѧ)چl跶w6xVě=s*@eo*pC)YA[ZU|1Nj ԚvK  1&ksTS!{$Qf/AޜjA@ӯ2y9zWŽ^yM$zv4l!i~8cpMy$ T"\~pK|^@Y,Oj_(YJRl04 |ڑϼ)/Y؈nR*s2H!HЛ3F ba7Cs훅uWucWƜmGOu.N<"ljELl?Zje. zmRvNǸ:2f|[%jni-_Q~]\Jb l}WK&~Io ʡ &FDVazޟ&{=AXGI iWh9B4sOԳ,;0E_.bALR bh㿪i 'J2s]j8# Qef Io,9[!#(cbv3LӦO5[14YnNN>Vȩ!P1 }8z[Z4!ktnQL=:[>AC$?-ɕGn#YXhT+3*y<@#|G^ B de)@Wߘ(_H])Ӈ"8Q*ϡVѸ`sN_a'&nIo]cWc 3RJ~XYcQ剔U7sWMQ18%/xSm 8~B^Ki+849laOXHeEhחvovV52+9J,Nõ, Ay{miRJo:F\$#Eձh@W:/ʕUUM0W0%QD(&.6#d^vC!ӷL~T Ey)Oa%|oPX$bV8?=$3Pl]}G+W⮅rm]˵µ7*S i٥U}ŸBQ=-mZ;tdD ސ#laP{EN.gk`0B!>0 YZrrcov/data/un86.rda0000644000176200001440000000422614556265567013637 0ustar liggesuserseX{l[wvA C4mBKҬ c;NI8iC)d's^ڷi3M"T4&I `c0 iciYA h}ns}󝓎NLF@m^[>k?5@?/ ֪E%zfo2E*dѥƟxԑm//ƶ%o򃳑{ڔS.{?Z{ 5{S"oX_ZNDBxPh ?2c"}?#;ݣ c3*yh*A;2.Mȥv޷(~]gZ_r6 _דWݦȯUSԤ_͊OcTGiw`!WmwR-p6CQc=X5C獤x&T;R{j/o~pD=Eh<8Ġ&8/B~7QaG>H:N## 8\ ˤx |w34On[?5Ѓxuymí {ۡq_Opv(51D=5K詜~z/P/3>#n|ː;K= lot'ez52^Ե/,ey%ػH_iฎO~@<_5s "^P?0#y)9ϤV?_1W _\!y]OA"݉BכF/}nѝ {">qqw#l-Fw&د;7򷌼6 .ȫX f1>D^C`Oq]wp6Auoϑ>[o>O˨fUuRpnga.9u?'֣w[)j_aMzėIG/[8?M[\x8w}x{F&zp jYP>uQ]E 4j_c&ZcQ=MoQ19@xg74ciD$Jx>N8{4::mEߟ"ۂ~1%I~\#66Ajx">ށKg? tQv w!m;qble7xux+43"9wqO;淿[x}9_d<;øǸ^G?`?}WyY+|~R~2^3^+x}&ãB޿Ÿ/-f1@p4`nx?k{bfM xltN/F2$ Fי뮆dѬbIu]lbɕ9 zI;8pL2Y f沖4seif/uḂ: ť-3X9ja' MJ;/YLW:y˶Ҟ3 ̔H{ ٓ&MTJW)Tg9ig@+4c g,y~ Hdx*(xUHN46vFchT6z>TǴZI(Yt*K2悃U7g}kdeqV\Icf} '\HED*n3uFN1'W,J8‡S;L[rrcov/data/OsloTransect.rda0000644000176200001440000002767414556265566015472 0ustar liggesusers7zXZi"6!XB /}])TW"nRʟVɴD'۔yWQsp |B΂Q\MOsnÞKPGMy;jiRH Q\41BEXMO'|ciXHewWZc sI% # m jjed瓯Rs$qƊFӄHhY4 ~HyF<LqzZRtt!6ҾTFv*!3T%ZMR?o%|N?pЕYm b gm m6-}K]˜C&uѸҙ#/I= NoIiR|n ;֐b3 G>7P R>\Ⱎ!$[/Cت}}e17oGw V[f^j꫘ .}]yBw)Z9=>~S=ʘaLd%/S"1k;UAg珲(溲q?cɃn>ONt\B&."j _ l-B$wh#%/A +C[M,rwEp߀C[Ĵ}5چlx?6tcMlcBy_ٯXcdv=߂j6}y|Rnw. a93<'7@"F*y\5'$l1˼WZSD:=BhWiy#vejK=gʗ'!/l)z5Jr-{-2iu(7Sy#jAuvuW 9BzPI;2χJZȥ'. \^0x|2ĽfbL^{"⢡e9.bxЄ? ( 70oNSmsaZ26ı\#:֧R:sWȷ7We*jrx#P] Xi!=o!OvIXL~lM вa~eD/iUqz$=sha8'y?~Ȉ2E#cvzS㨱T9D=[4#)m 8~0jUC_;\k߾T/y 7dpW idU޲6D$ƒz"bI gŃģWż|dRq?(ɣ8 cj+S> SAM;_?׉7ldy3 %@BW(O=kxVh;`D t$ԓcE+`L˛ Hf۴{5|[ QXbT{yIb]8EƇC-( ^ : 1J[ }kLzhk3{EZ ϸoȎF"ýbbՐhz2F n2{XctXܙv򼀹$[e=%q(;coːai :;OA楱yjDٱ9R:?"x@~}vpd\SB)s6< i!=R.@aQӠ HvlP?dȵW/zOj )<%ֿ@-yƫ` 4/01Lp~5qL剓| CzvNg9d_8[>GaX6`ڕx2v*E&QwV}~)i3d4q$K%ت{^()`IokK,8@[Ϯ'5iS 9?m?//(m} XWdv\SO_9M~ٞĻhLlRO-|᭢K"ۄBlϲ<7 jq\5ad8i۹niLw eV@'UE imٿ6#vi fԦ&6np.Zp;f]*5Afnb7G/TT<3TdghLe4'Oi)[Iևbl܊ =|͋f_٧Uhݗt =_-CM}6Z\ȳӃa`*J@a%GC`А hj1^]L.K$V2y-يzHAqԃ\AAhCOG5C61aiZ,$ǽ9~HTOAxZFKH483mKMVNէ~*"[42L=8!C*gȃ5\eXeU^E{n|}D5B5!. GRScΫNշ .Q)8&$oR!>[~qt- )8ȼ6&c\l eٲ7I;K3HsC9p~1>#JyIkd>. l\Xcf(m_Ӳr"aIHx³(2_{5r$hoppɂ'm _e`p*plMCƚ3ט >E`O)u 4ڴEgk[^+;c-qx9# ,qw-09c+! Lp%khoV.d:>:ֆShN4,\c:^ĬgКs I6q bd7ZҲ: V|ƾ|cdqfj|x&}|}"u%=MpS;Akք|*[.Q#(Vj) lwO8C7b.bS8.)Oʚe3/@U'(ɚe'`HZd؍ŧphiHeyE;C5̌ajIL2xq|}_\(Pŧs;9@ Sa-g q. Dhi;jEk*J+^į("` p[^Z$ ny+dd!3*@BUFVRV2YIrlM{u3UQcyxڦqz_>IpG9_YAo|k0 =ZHu))qXK]aEg(~8:'6%P⒡w֋Jm2YyIdbo1n1Yn@qM3cp+%Q1F{']}V8LXȂq3L!eQZ Pr@s:t#~ůR5a/k0o\@x0$ZsVAҳW 26+/kO̬rG4~DntVw%: ͯMCw1.ƪ+Ҽ<Ĩ핮.h ,zD1WAG!NW wf_D:V\mt/?ĢȶvcCȳgYph*:G+ޤ04 C/W{oש~Px`' 'ce,܄&@FJ:u1H0Oi&8@Ky^]&9TK 2Y$-g8B8uxFۮ^i,+O2Gqqtlbf-h29cUSזr (90_DScP爰,aj7h +$RsEDZy%sH*%H'%͸>ڟ~5uwz7:eH@lm 6W?ÁKQ13&{RHwVǤf>?t{mv|k2mzBf0af%r|7~S]lu-Z?cΓj˿Q^!NկT+k$5ex>C;1IXW -q,}C|%鈮ب΁ᄅʫ=: U?j "UK}}5;N39$6O U1*bmtwu @S}{BKk,)W+\IM|Vu;]҄fbE4F$_~x\ :Ym(N5(d{\oSebԟAH4N/,SN2 ,Zqq0V\!ڄӛa)S ZiRsS^PRއ44| |S{ bu9l7okq\7 oHcM4IޕL!*){#'\@y z4'ٴͣvY.!{/6C`KxGnβ3?^@g̞3P{("1@veAweGpN4jsoQD*MV6߽s'Uֽd.jz]+85Q &Ip(:ɠN'n R8ꏨ[ݦZ\n0v-jV{/b2-LY|P06 "x1TAKN-W@$0n0fDm)Dv%h/ 2lmGܟۤ;cKJD\Y*Qﶄ׳@GÁc%l~3HKse*u:YS?7װ taSWH(߱2FiUzHN7-caT6ad-VI%?qL`42hb \L%wmP{ЖkN.I0 N6yAai5x\$̡"\i!{p~I W$T̅hll2 铛[B~F9b |,<ᒣG_?]N Z96 b["|m\DLTA^D`UJ`VRc@.9~zZhhCU#&YkD|n/iEshPfB4kvӴCBMW'I7 v#o@!VpD@F ǥ}4sL{#|gm90mJXgA Bga4}Z@=f%s#f3}r])Ʋ5 YWHSLn/+X|לvÏBt І|h` L{iæzn]Kk抺6&:_z/T6_7>f{u;wJ-JU4?fV!Y{иh2Z>3=g8̿6I%y;oZِd(BPq!P 8qcSӡ:L9 "?0hKl"~B.Phzm͉WsyY ˝Cx0TDNs SãD9g UҢ#ۧ*),prݨ^t(H Lf1Wz)GIx8|=j{ sf֥L)Jmnbk"I1Sjt)\=[ 꺒'U:&lL`|n٫`mKy VsgM-_iw+Ue¼5UdR&;'șg/˱$' *BM䈈䰮()8CGzD:#n#FjʥDx'1![AMk\B #8>I|ЃAe#|#F͎du-%b{gqXlnsy<"sV**BCWs^ 3_@[욻gĕ9$L' $4t9f{U00 _hî+>>!s=_ěz/y7S\>B}pԢ t-+M WbfF~_,ZjFt>4E$ V>9)^^PC7fO3[Oo=ꙭkF\uY!n J /F3ɾf׮&{*%jI!&pˇ$)]DkUN@X Uf!tfa -G 8p/Q; hITô-h#AKuӞQu%(!oƛzԥ 0pOhXXq78f&ലgo]Xt_i; ## P'#kpNz-9`8 U$H_ wف^3 , {o5|mNU]J֕ ԰?Ԗ DYҿ/ bb;RJK*g-G3G?ՠóv(5ӄe# w-AD_w WTA:+ `4k_x RW71\l6 u)~5 M_*Ol]Џ>ZN!kOoޕ9.5 ŬrpxejE j5`7ˡ_e sLxa!q|*,; "qI)C 凌[bC땆Go!xu?ϖF0`n"o1"'OY÷' H /qO|^F_\D<>(p4 ~,-v_| 1$Ȝ䣶Ǵۤ:$B  f0n~RIy/Qo (puN9V-jlo>;*w zߢ8Qρ|BEewPF![ 5l4~6zc×S+&NT'a"\H魣T<Х2Ƕ/FW;4]9ȵ||SΒO 0ko7qHh:'6 mj{j'^ZcH֥mL 9"ϥitO"ܪ+P^Q⫆JaLbFp 2&vYg @o W\NK2"t8MU vmKd}/y-P`]\q/2~ť>,g: 3ӷo77=//l˹"ˣ-;_&p>0 YZrrcov/data/Cascades.rda0000644000176200001440000000126514556265566014544 0ustar liggesusers r0b```b`a@& `d`aΉɉ) @>H %&o=yj#c"B{welT~Ro{|%NO;~Oηߧѩxj<߳"G)~ige[:uFC[js-3 ֌wߊ?b[TKۯϿ$IjZ.,Sy;T+دɪy[JۛIWl!{KUiuB?[];S/N޿px#Te ok2{ZYC5Ξ: nC^= #B`IYGY]wiA \?{&o®^?䰽$~yOTYmk y6PCGu@!ygG>DG9 -N-K-.FdgY_l0T3416FY!,<#Kd)34@Rinhf366D" 315D`bjhp gbnʳD͑YxhវX & WJbI^Z0 rrcov/data/lmom33.rda0000644000176200001440000000112614556265567014145 0ustar liggesusers r0b```b`a@& `d`al9 @H/mcHEDD3t aTf'!YeQ>u vbPyj2Z{_{LZcLq좵ŗ4kB;=Le86 xɑzv Fk9 Je) .)3P-c4dQ{ =v;_ǁ%&jКQpdwKtO/zXkp%Q-,:BPUZ |atŒ9݉0RG7iLx0 4FrAWK5F ieS_K3ha_Z&(LEp2)zZY ?'(xyA('8/>|G&f,}mxُP"3VU ] )QпuEst4^C N hfsM=Q xYtWR42$GLO;B@BSvUMT [<;è - 5PhF@Fg5,oQz4е6rsaN;6E@)3S(ׅXq[fa6 LOycV+ꨝy~vjah,K7x*t:d %' P`Y0˦yH%m U i)W=nNBQ4)w Qף#aO-uB^X\(:{aH1wCSTU-)jq G6 RP98\ (fq1g.qeHBs7C%5ԡU(*%B͒)`ieVLHFK^ PE2JN;Pyx%5g||O/ 8Ǵ17hYo~j9N |*l`NTpG*D%\^9Kq5-F5bT<4exo`Q=_М 'b!1-ksw8\m2BPv>Z%Q'hdqG} 0 kQ,~p>5 &:HAMfDm 샙&^fI'Q߯=2Snrn,pq[Tc,6YzTOl1afqDn 1U:G\tC !^} #6={ZsAn؃?z>J['71ؘ Wm@z3_1cc2+`y$AH+UDj*k$ A6<)xkR w0WZOQCpܶ4L$uX'<:W|`hU$R@tåw4mk~γ'+:߄4~Ac7W^y^frƀP:|d8oӔ !N]Q{4`c̶~%'\)u+t %kt VdzWPt'!PLu_704<⑿,rN♊1+9Mt+2偐Nnm[ytz8;T&ף ڌޖ$M,+@ANj"Vќ&PE*y&L 6suz A s酣?`z\uFS`Ljr Y YQDz2c>V ^!͈ "0oXǿ%̱ ;>F&Yc-dgBJV'GR4\p O ޿?p-A3w5o6+HL7w5Q4dG=1ڥ6}Ax9 bM1W3HNmsFO]iăMZ#ckg kͱ~Ƶ!}47_9Aȵo#6?)AK_[>r3A" G:ߙjrCFLF5`_/?7oVcR+vI]Ft@@h:"dB)Ni@$Ԋ¦=}&Z gfpf$Uo)B8.;oq잶ͻJLu] _[ `wİ6 /R'(oE#|'9'=-BY(b /a}M4}ST #Xs| ZZ𢰛,&HQ.O"vMu4P~->R5Xn9+ک1yb:RXАR 7J21O*V* ʝFHfy3ZD <_Qڥɍd6Ŏy{|Ln}-ubϢ.\3[bSo!2Lm"3)•4]㠆8C!fCꯏCjom mP4ٛuh.Aeq2c#ͰU[c觨nl᯺G+vHKȔyi:6zork ;,QĊ]y*[}ja$4RFX|}JI-̥d-E83폾oy+@9eJӬjl}v04IbKG =m Xp;$@X|U+V;qX˶ HĉC5U/~3#dN }hM0&r ظu&1&oadd%)u 4 {OXlF^Mt'z޶2N`>ٝ|OꨯvX_xhË́ edF t,"O6c:=*GNj`).&Ǡ;g6OU1v M;LFɜ"2n2EZr uTNԩEMb# DȲT*8:..MH;a|i5^h2Y"d Rgub$ ~(g( لY<-EY{@?}>VHx>GЎt]wa; j 0|p)FOv;(#2&DUu SM^acõ)Mv}G'8Iujf ʇ(tˍҟ=l ˣC*@跹*9CoA(W6#<#q2Cx,e썫GyK$Cv{2-Q z#6RCQEPp؍xgc7Zh EnP5LBm=]@3)mcfj=Vm̀NnU/G=06+$SxyeCG™~5@4[YUpLjFf8v#Gbvuq̲evggW˛:[14&PwsR&zex>^T}!84f{_JyĘԖW2!0-`$)1^ c#%gu8toFIDG(`ߕQJFzBQM A k@iQF0W)Lm b RN-OꕳaBKӳ`뒾r/W+yx1om)ԈjbQ(E ur m@|Ѩ%8/3*/={+GLռwc:N8˷k2#G:H@u*}4^o]Y E8f8%3!ٍssàtg:@ěm41%Q2AxBPZ$K=8̬A5odL~6O>埒<9SAޢt"9x}JuϡbT&&$^JlSj+e7s?ܧukM;m{= .ZJi^CzRLVA9%b7-n5^)4r~936@nQ[%4Ggh:gh~〩|M-!v`aHD}:T4N' =4[/HW<ժ ;Lsx t?,K$`#lwl@Vs6wňD|93NgEd:Ԭnu WdS@MefjYQTȸX$~+C¯P+ĖPbm@^I`S =2NlUjrizES T?h\R8V^ kuZA牔vM0]zj`UI N#y16d/QikVra,fM  ln#BGt,~!ˆ5؄p۴^$1Z1"_\1G]UyNa|}H\8gTn}#Q@&٣ "UV Z|J` QOĉe x-7T I> UxE-).Y(- 4l%)/!`vcֽGWӑ @Mg\G")U F|wSְ٪=%ka\d硏4 4CԖC%^?4nCC.$>[e"' 6;wEѵ_Z=B$jr1l{ђ.ܲ$sRCӳ9%,@GJ+gVI(eE9A{A2k d5 hyI[Phtb5 ` grnNAg9 ^"R M|.6>q4AYv楩Ҧ=O+Ŏ}@JZ1r#4SכN XU2<<<~GYlG= ǚ$oFKGrl1f[$PKʶ/% ҷ]n+~X;`E ޒ2H0NSD ȁ=gݹI|J~9T2K#$:E'WUHNz"&P4pܳ~}9]ߍo"{0ycx?bgM;*qI^? K"p߾W<1jb%J-X8A?<1һ/xSxS :Af7+v&=89c;, N5݀l/mh݃M趘3E*tb'.ʧ &t0]m ;n\˄O $@w2ES!e`T?1Oas"(SUx)Dj] 8r\ޱ-#~b5F (~Vr&ču.NYOت}:SRBK@^;agg7V%^gm3h7oґ \6$@Ͼ(*9 ((u!$xPo&S Ԇj? w;%VW1?!BХX*%A,a+V^G[N9Q+χXdM8aРG8yyL]hi$r Y'_lB"@ōWpu(V#twxCd =t+mͱI  %s9{uc"pPrF s=!Q(pf#t&de-%!lg@"*Ld _X4KÑxX#CAA3Go =MMG`5$2/㔜Gj ZubV~~x"3A>l?2\z^+W Z:uUފwtEjf9h &v騁 DN=,|q=w=T]XiY;f\'4-}wm% )($pdQ"0 j._=Bký7~d*DQ NK n2q6y%{ApT;(2}]?#1 dѭ[GщNdؗ@h Al| Pv[3FOPbKaJ ]cT3.S9iWhc "s~&(]8] =~udnmS. Acs4}:/*UL>bnSPGxkM+moa$MӼ[:mK!mVub-"6Wŗ0r]n=eSFd0k4L,1원K'^ȾHˎȜU!6YI#XWc}1EY|lL>;w| \:8NmA]rI߀QT%rAKܵU8bJt喟GKP 2Tbݙkw/1>(g%bp]C}{U* 6|Ȝ:oO^jB{G&%,Ch)`BBޣT! \P3`zo؋Xqӗ^t~QXV@+9 8|Ѹ1'a–&\z1.)OAS`*BPZZYjn- 4@G鼦7{ VO0n14LS-=WxVNchWE ~Q6'm@L MÉhjp̅6m>*1vV 5b|z`f!{њg/6ZeҔ7NjKxklkǾ&=sYG}Kcҫ@>KS¯0lXt}z,6GQ6cEXI-`3WALFXh% ttJrM#3ʐn`˫ *ؘ˶`ZO8=u r jo/Bc{&ij]+3x"2BogkqJ45E`&*׹S.0%u߅F=}N4&Yohg&N&d}G%eF9˺ 6~,ӟrZwVxt.TGf,l]H?oпM"ȁ۰nhֹo/PF 'ȫDڠLc0hzqÀR^Hz$? e/Hp{w ZfXq}ٷ4_H}G=bR*)"xC.ar, Po]RW E|DE7?Ǖ9AO*1V>ı8fU}1/p`yxbOm,u6o >ns |K'cWDNʀu0`X?y-ɢD!͇,iй6@۳5&WS?ّ @ N/u Kwt(&J$xWs!1!1\oFXytW[o[tꏬ0<>Y6B9нh~6Y:qEw.`7$YYakPKziq齧9:+Q& AJγy<b ggH`pB }Y/;/'aLTs4ki5/ÈqG{ڥ$§{*4; ?-vQ":_5ޘt5;%4 `,[:zcYNC7Np ȏAep%OԘ"` MnJ~M5Ar:o3Qn#ȁ!a29AE);sĒA*v4>,4n&>FF'E=57NZ$=qJ1h8dPf iPB 'ҨT))o0k׵Ԇ:?L*/ APf7 0 z#HZ\y_҆-rHMo^Lja~tUA3$v'lmL v5}x$Rn'QO{F9ͽYT, ;tz8ѣe@P*qMR ̣H_;37j }ߙDv`qҔCvHQ>9sZOp3DhK?8ha%4&صui;4a&U4`m}Q h,ӹqK?( 1O6zܷ3W ޟ>Jڞ=?'֭2 FUKxˏ7tQH3'X>|,J EyHQ{ 6 W\㘠vc7l{<;&Npq҅6(Dy< 5` !gZ)TeAttsaHv$z^Z%b]$>~Q"vуZLzkJda m[/𥽵`RH܌|vٌ4` qS`DA27>JB~6\Oc"!e$S\eQDӿAye߮L=z``훠noڠ}ģ!$3Xُ&'mhG/JvYܡtfFv7jUQ%YN3ӂN)Ty'-i SY uUꌨev+Z OLϑ?we&L[\, #QZL*;א*h=NhW}F]Aðp gһs= |~Y궎8Kf&f9IL3$^?[Tgc i[ԻU~Eom-MW;*LCVPсJ( g\̘ ^I|.]P CHL7%Na9bHTp>zk2>UOkaܠ&>l }}9Q¨,ut:B; 3RÇYehkЗqgDۙS,?zJw)W)lm)@)cClj/E _.U1vrVaiF/fy7RyMΪ5?4^1)N AڲA-\{zpAqXH׌s)U'6uafXuL 52Dn #g ;Ɨ@%Rތk?:\<._E~;9ϚSM1'n'%- ^ڊ?Ƞ;$tLH+"yt6Ho%$o:3 A'( pG2:__R悶e-hJE-.9*w49<]QEԷ/@&|\۹۝KNcg/o[?'j"{TQnJXH?'”݂4mL3+V[\b3bXS&uH1WӚXa[k9G)wc kʄ z3Z&S J Lyxa(MA#訳Aɫa ˜Lbd~|0I")ٕdI Cp+~Q#pizjJq0 \$}vvne\?0`>EdKbŀ~E"orkhq QG#PHC[<L"0r&nWK_GlD6= ZR܇ j\̙P{lS VNwc['H0CPJĄA?lϹ@_;Dr-ܛdIRe_8|/ȟt R$-7F@/&EP*@A߉aw)9}1"X9E/PQLg&wu`dلRT ҎDש.a@vRM8cׅf*|qXWd:O=^ dӕQDEGQtc~܊!tw~-m/!AawԲfJ}0wP>ȑ?{Mjq-_Ea TyCbqVwKmR73ܛk# D[Uhd:!d|9(vGp#-ٷԷ^׈ ij `9*S6o!ZJ%3ouHXszW]0y􉜩O{0AB|UwnǸb&A,?9 S\R?ҵFv R;jmؘ> HhF$ '~R4ҊSdИUWNz1{>\(uE e:@MWS=$hΌH%};[,>! /ߋ1iX|Mq<u*H\ƼL ^:q/8̴Ӛܡ`Q~2. ia=LFJgdjֱ7vK`>iZS)R6E$/lٺ)Yi x͔sbs- 1$Ucg#UyR2]2RPC"yLAGO\Xcg:~k>\8ҀpBUY.ՂZWYd4g,@B/,n‚C {fgDy; aI;bĻlA'`wsinlNc ;`vkHZi9Kf/Ӓj^C;3qK{ͧU~g "M@0$Xpv(DΤPx=ØiB/sm]]-2R_1}f׍vyǺJQ*?Y@bEtB I V%; =?J̠1O~W%A!UÀ=CG33P֟&vm9[@j3*AG!8%% bn$[rO=3N]J*6d ?D4GhVqzf9o:tk[,eHy--RM<4g%zW\&jZfAuns-i^%I2K>w)ױzU D]3FTyrZ~;E;j ͼBhY斦57`$$ F" GR.8{+"18)ªBՀXa8+-{n/RmIG(93~Iw"5RM^F-# ƒtN.Jj+#.<^^ e b;D,3% )高c&c U%-JUD?SaMmҷlMe y%phhӉCS"(WUBip[OS!ml/'vC\tP?` X"֠ˉ?eCMv˅@1jWBـUF!FÉ^Ϫ,t{si{$gS}թ}=^A ܕo-1Jöj^"L=rӵmP;=PYn7*5, *#GDA"C+2H\ *)-;o8r;"vNbHK+u!<|`^@Fj#< 8d%N]0-37G9o_8AJ5X-vj_<\ c{RIs~8rw@Z@Q:PvW{u[LaQRAƹdw{QvSpxHN 7~4.s59n^ݘzީB/:n grnhhїo"N`®}A7ý=XW%XO""su~LS3 c&Gr?W_52PğpXX[`+5l2~CiFgBl$t85I(d_|mVk 54Ө&,& <ƺ觔84Ҹu}Slnk'Ъ-CžE6,inH.o?p!Dld+X7I vwkl&iD -7b} ='c I+?d26nT~:#č&+@8I67a/[aIj<؄A-Jպ Oѡxq\7% ~4b<9TUqblHv-*6ɯY0"(e<0TM:@{t3Aў %)$kŀ1ADZ SF=V75I$'GpQuqA.QߑڂFd =y$>ab׹U(GEg"k{t=V=(w(L7;pU "(DZ /̕#ҽ}UŇ8 ^A"N@IDm[><w.ÝO>K83FOXdnUڂ9n1 8~38%kPW[jڵݪ \ŬY\ؿ,KH$VV5qcwq:7.$..fmyxy--Azi c%斳yɌNV.c9Z"=m.49=iӓ@#خ]'|ȿ58c.#a?-Z}oiwWZ[|D[\B\]OO O<Ѫ)PVLpfe](y'K4n`ٻ`H!2rgW H}Vڞ.(Ld3 ?]6y*@j.WW7 P+D;c?l sUw@Xn  ]tA}*.|7Fq'hh6{s`>{|&xe+q\2lY̓k#+u7({>(`4`բ<篆9mB2$v?L3ZbFECf KB4lQ("-=1YDUA/Pho"if=%էJ0iˑ MQe-ł^U4l{Q;0d;'paVlDW,}B6V yLZ@C/;+LNIS職\(vX"jvGK!dP:dž%G)7Z}{ԎI <6^{dx5Vd63* PIr2ei~P޲ c}t+c^~nL!E{>'6c,o#Q-bǭ/ qe烩NUҠE*Ot, H:n`ObC5p0aR!P͢ڱFAv@ ypt>ᚤ_Q]4?Ku&d<2p2C66bx+ L a,bPHGPрA*f (orU!+=W`]☹9@uT^ֵbnʢSӸmw,3wloo'˒z ֋5E/ ӿyN׼A)'0Rͥ4qy0 9Oځa=Œ?Y[:4*!ׄHf I.0E !idI3eBWq"#}x᜹'Z>@V?)kiRrE#g4'h.V#/w!o{m0m( }vnq~"}+q59kAo xKAv/ϰwdl%E_qpg-7֠kI1i:jf4zPG_&]en@oƖ:-n =$o /p.xnNjj_>0rGq9a%U=>/iDPԃ}WF&>HA ?nzl~ւu.04XUNA (4Xq?/,O4[$Yi!"ڔ 뻷iX<K0N16cg!E-3p*j PcbDt=}G)ɠx ħY7+-toE^OWMm)r)[co JqEcX_cЌ*^h#,7AŢRk:,1G[@du0>VSm}80c2(*0'ۜxGޚ,cI@nJ8[#X:Xl^4"^LpEBUO{mGL[~im@l׊u_m>BHl2zZw`?Y{ <}h il( 0I}r #R&::fzǙ_ixn$}meD\C+k v*w-c*"+WxcZ5' Ya Tc$Jfcd*- Vq͸ i8c%0%x9=Ժx^oqgoZS\K7 ea{euvN <e @kO>D&?!%^.鎻)#>tO &C#*5S}7p^g,jCth9KߓaCRe\9s{ґ+M۞CTܚޮRi!7J=Z3qPbp9nK)/D+$·(ҜӝzDo8{+3+bE4,9zb} )8DN[Avis^<\gD)>7^tBZWvl]؁P6iϒ5z 0l,/nM ީjnXT"w 9G@ܭK`d|dbY_8"(3.6CBUIf#qѓ*&8]qc^Lўwgjݾk`d;8J =H[l8)rcq3Ird4SC֟S*@U}Iu"%Z~W;`{ᥢ&gk-o Y fJ缫+h DBTOLeDisrv'z3sveF'˳V[NE8C+x =I pRz%/*H'GL+ a oR=XZ !/P8In2>B|(k Zq~xCNOEX[ 9r$$?Q׺RYM-T "6WذT/NeC03\!A(192o~&WhI7Fz ız΀zQj6e&wcv >60IC4vya"Kɉ埈lC3B@B@󅆜^WيOX̰5EWw_cpÖa!w+ڥ)˙hAY7ȯPf3-eK>jԵ<πD3u_ .$ۊx&2m5({ BbSWE]>of7 4V.Ğxq*K#pvtu w~˪G6WL:rG I7[kYsF{&xUm`Iwϡ6ǠWGsQXE+l~U 奙#j7ْNPԔ7߿*+`ڡezhM#/B3. dShܪw `cّ+\54(&LbN=ysSVt7& xmk(z xN1>\l-w&mשjGk@BKC|2$ lcReB(׸NO4,+Bv==}1!wwH\"*]0@sVIP8|ND ΑĸF-95*Ƨ606_ ߃z9SwIOb̦\&˙Pݢ 9xE=k~I'xKN>zb5ظ߈hz9g9NPt׊+KP&+ð_VMHIaCD:+,C6"޸vUcČʬuhmA,{ao~xIo.v{ގiZ,GOC-AߣZR<ޒ^-<3DUʃ'Id[#I: tR~,tmh >IpcG zlg`EW1 )[۞ôl`!(#?Ɯ_xj>H}{F~7/c7KN=٢7 Н3й)QXq%dQ2d;xEv#kQUvW0ުv1jUOV؇ r3Gށs'v.|ř9Dwb8k0ܖQ]4!Ud@\lo"1މFڒ ʨ9 H`|yE1$ɽ0||AG+ ih0ecjQ7 $Լ! oh"%kC €JbRZ̀IJ_?V>VԠ:K zݑW)wT;upv2dY@3: ݾޕ2?n$ŧw4xvAģ荏kd8B@=ƑE۲wj=y?5e2F s{Iڰ8>KfKF9p"Fr}Np<%2  (>]7R.h}Q8NP v }xuYH0cL vEI\'4 /B-D TqmǚkOҼrz8/FhU{kȇ*2Ø jowsznڨiy+Xjq?&̚P$Ǜԑ9bq@!K1VnֱG %PDhk5lo)\ɿqֶch,=  OEGN,Y)UoY<c1\ Xi~cB'%P "1 `ܩ ӧ>pRL0u($@QjQ|<*N &'^JV ' Wb9:4 K7åAQ'Iᯘg9)⎛9y9 92VTkMl{lE617 wF4gF_DoeLjW͏˨v5p5Т'k?F݄tzQ= :Xx$&d:3|$)݀ xR`Vub0kVcxŖBOYY)kX8! ՜}gu^,=#\hDT#gkbݗ;*h~Ҷ ¬ TǁUDӁOgjէ/P/^B>hOM ; ]!a}ӯMWCy7qXa.)gD7Z6u5$݊@9F5GԻlDgT5{DMcQ g?lމ8f8)0r+VP%`7tOCxFZPdlI! 7,spuD|)<9ShcHxR7Eރ'%.>J9A~Ll{dYQ5wL0p<ג惪gy1K ]a.+ZUjX8.7vul Xw1C"ZA(00YbM 䱰q1[%|I*Zu/k6ZDI!&LDSfƒ-Jxg'/qYWd^y=f=ZTiVR~ZM东=&몯C#OR:IbΉCnsjL.dQ%p{!2X/o7|چ(YC/ZTRx0fMn"=k0ڛ/W0(I0M~)w;XV="6|]|KL@ zJ\EPb,یNIxjSҶ|@:@˥]J@` / h-y1eb[[ %Æ=mQ+볅ͷUãZlvݣ6b .}wF4N*:Qkrs揶*Yxw?7oAh_y5к?3К@&voKzgJW@9zb^tu4 -YN}'p(m) v۱9~(Q2VfOiMk|g0Qv"yuj|{X:pՐ~~UN9%1Xm/ͳB cߏ𤃽5\~2إ}ྔvhn{pƘɼ0SM`AX[:\_^òQ))opZVgfdn|\yM; Ӓ?kM*,T"roXwۨ8hh_|CƳ^_Zsm '+)~)r_dg:)-hC[xږෟCnGju!c\8h'vHZYzCH^>˻H^vlǒs̮c.RrrkaK!r*6`mQǑx2aV:zV"f !fзm:)c9'ꅷqk}^o1}Tʿ QC19 yp)(%j R8q~Y99<_^ 0INo[/g T%Q[+濫Ʋt59a8(i=bbiC%dAYuII8tgcU[ItSQ^Z;YY@_&JSڋkܻ9'Hil_]Ϙȗ,L^5TK4,,KW;L{6ݞ_lH#q.)V9xVUq ; _̵15"Zm2dR-tѬ;;|9t2ឳú2QvAJS̎ZdSoIN_v P-/3!-j~YښsU3e$n}ٛBDp%t% ?SS-zU џ\BxVZGf_g^anՖb C06sq R!) C}<!-ÞI*nպ~, քv|ӘrRrjΏFgJ 5ͼ5(,4)Lxgtqh/z7j? %NVXh?r'Pg.t9ҡJ7בPz5SF 3 ɳ|fϔE ^*1Xa%{Q([eGhj'tTZ}meqHTo8W_O;Ƿ6&Oh{--: ŝ?7&&ZN1"y0I5F 㔍 v n>ꖧKh|1# 'Tl$P/~,a$\Zq'($,ij(ѵ i RfW \J)l $DVT_mF!m<9Dq( l}ː`o'qR<|P7V~2}RjCt$*AH+]φR ~B(257,^]+1]v Jp9Z|B.53זWzu۬acG.;Ƽ1;F%]3zU[?F3^wj>]s:hY7< tz_],~K*FYd<~¥ Zse d,f;.j %gG5FNXW9N!YH3rL\z:[ZMmu<67x4}LJyj lpW.e6˓gA_V6sKS"#bJ^܇3rʍ^R8]N!4)W =gmwA4$ղoeL;:+8swcx(|<\qj!"DJ_Vjbz9}?mTB JuO#{Z%ѝ}>^^ק1PVlp{|-CK܊$g3GsV|?5jOrN=<_/$4Ȓw=ayNFV~ i*T*""M3#[W4?ʯfn(Fm|wF˖m_Bj[Tޓ>!㽰_7}d$08)>:q32nla$ @22>rD&zNF/ǁ CJԈ%|Of8E& 57b!U 59"6?VbtO&y3pvQ2X :y0z/֦iPL,2$'  JK!+CUc7=]jf l'~?TҲ<鿊:Aѯn6Y<1 sb~h7N$L/*]8qP˘u*nmjzMZ2Atl[PZMXu$$  v<=]-wCe)_Yw40MTs.Bm%nbd\L d,MS0P;; M>LH׮m{to3{CӝLfh#4k&d e?S+*AwjCO^n#8F 28ݿ!ܟr0c͝T?HH?oIHq e0~>Oyl5u6CR hvry CRTϏJ=mi7*7ətNG/{YdvjBEb/*6G̯5t~SWӷy0 }|8x݋Oq:2/v#˥E[ u8٧nwfRk: j,ssEkEeadxߖayVViEy+@62XiuQ~XYhb1mD u6c8}GG Үkf I3G Ӊ?7~e|L3<ɿ|!ٗ_d>MfM9P8g'LQ5~y:-}`^`d}zdE`.yX`8L_+BQ?Qer٬}i _PGR2%s5ۥh(M QnK 4@8>;zapRF~Jӣn2yeۃ;NFD3QGw;FDaTU*8٠B{;êu׵)$Po!Yl-qպ+~C/N{q7dxinPvvliry>5I+.Qз=KK D:բXk:1/^,ROy0E7(ypa zgtk@.3rLQ+гmcW2 ,2A3Rd~N![ܟz[{ uOs3j}XM EimTvR>;ܳ) -+_.'~~_[|Ob=]GG|~OpS#(DuEz&[cM=\]į( AE].H}06F<X ^#!5%"(:烀#I+T=b}(R^| R?[*Ee(MmVl`xmqZe:m/Ran:.,aS8bC <)N5SU31'/uB[ a](`"xt#^Ǎœ"gJw5~:b +M!{6yk | Kp')~E3ENhvHc(u9sG>E;fh!g^\児6om0NTva՚+A5fYL_sЏCTަhbn#GÖYt%:«8;y+2W5EWp03ڪS[ن;Y!VE"pGPXґE7Z6^;-OsG7.;|/R3²GU2Ctc;cehȬZeLV(P#|֯1=zo݅\mj2{N-1Mt1׉<< MM ޳mК_}⯮f+wLkrsȊ3vG;%$iW- <)Soݨ@Zϗ@uq0psÇO`h@{gzy];p4\Roߝ iOM-]B!yޥ7afYNKQ1tEbO(^IRye0Ш&hG'l̃i| #OO^Γh6J*&Fաp,Qo*ORPPG`edDL,0}LtXox& U==~o \(N6!|=Zz 5b_m49^MgB2=`)h/nPӝA۞% ,|e]qinldHcLF^`6:26SYC` ބXܯ]fO ֫DuMM#;7cxb`;3]¨ 4x:ۙrT'o?:žJ$ f@vO>9' AIѴ-9V%U1 nOhzb?csI^g9y?NdoaN`!0L^,hb6+PlWh?U@S"J Dw:2A4O#L~st]^#pǢ+\HXcf*hLC|{xީD^zxp[dwV2xKMYReSFf+GG5c9AJ)Eq\uY\/zkAyE:3~WZhrm8iMh]gJfARm4oe'S|?L( O"B|1ȯ41^D"Z]5y7f90Xs$J6u0rwXl<\nZI|5֊XM@ß`>gD|2 l0B2(S9}2f.y'p0&}}2=n?S2A oމ3"eNJ`*/;8D5oʮ7@9FmvXo%7FKG s*QB|/,_ڗL39.MpRu+"BG+\m7u[\#QSv۔y(+5~֭1ov'Uv:걪4><✶&# Yy[x>j+vJ0LN[I&oH&X~87z: jeOXY0UOz:|oP'N; ENw0_D[Le8\Au翮?eE`倶DJRG*z2;T@K3S7h5Uo.qZNݨ1xIPԄrQ{OelD$xmTohq>-*$|s;A$'47jƨR85tDVg@TѨĬVT?GE;E/_ `e1”FF%bcӲPA14eOjiLdž/csх~ 5zR$9CXזKKB U,k"ULŢVfC{e"{#a`;`dR۝,F՘} ;e'QHOoRoF9"Va 8]JwjbD龦c%iJx_h!ckEF 34r4T4fyw\[ %4a`fď+@g ^Ʌ<5}xǙ5_d@{TUQL%3Z<+N2cޥvQb>̯&- ,taLqB輝ՐkR[/фKcnD2MBU#}q[aULfyic-T mr:hxע)͸O"{R@r=NH8J ޕHN_VO뷢t𥳐VJ&Qo[C\>9,G bL2 APފ I>ɎH@8SLkz`egV§sV*d?,ip#l$Ep}nI_&i/U<֖3^Yy8tMFEv *'*zȦSʓ;ᩳ0Yj!1{rM2u+rcJ#(_DUG14xx׎W"8Waok(oC 3U|7n%ᅇ}xGv4fdGtaZ*BdO[~~3B\|詤R_Rh=W!bh< W"=¥yŠ~pyMh=? |a#~ ~cC_2gD7J %CuVP4tD)7-"V&'w|]̘};aϜ5d[*B&w.-ZFv]2e:KeMZg [ta1z GZPv+*8QVǻViC,`Pͧdf c_[d9vN&K)q5 DxrfL;HHÜdCrT<@Jhv{\4VlGͻzN2ybME=ib> >KVt|( *_ONkGU&<&gS7|LAv I6!e巟XP5R.hdþEx󝑃%| h%j'9;he-9krS{K8V'N=;u=^hQw ۧ6-uD"(IR;hA$.>e]" y La |Fk0ShּKEO[MҞo>&ڋ ޻q]B=:c +J560P֏`s@YJ$M._!N76UscQ"e^\zy_T΂Mg[C_:lӹ30'mʗ!͝|yA^Z4֥t ƕVj,Ѩk BZal $)[ 7z )E$е̚S=(Y(oCpQ oyM ͮ/X=;KQ4MXzČl;.G NNRܖ74 2%sèЯQU KU(JfLXiKDJ\k6[x ogіCr.v,ϛfj|w|6̨Գi]ڤCiҌ֬A {7zFgzo8mr?@V_ ' HO*O:0Y)Rܑ]S!F6v|CNE`oepV8Ҵ)7yMI"E65%mZ,aKAoiBy-Tp${KFā똢@svIp얧~j!Rq@o^jqm(AY*Ą R˹m9Q:ёeI]|NC\^Ə 90Nk dv]op$Y[Z=(sH</b:En+38.i|3ѺcQ5!#][]σ8#0;"olWQ 㖓`;/m+z0 BN7qQ0'qT7o@jNZ2Po '3 vr9j>9P[)8Z ZX=yM+idYP6qsYϥݒej2堔jkCcf̵2;.gˏIm -k=#hgz}W)sÉh`1Į'ia_BKHo+˖l*oXPxևhtCnj8-sƤ/Й)av>ݱ̲4ZA_I͞+q nͻݍKa(+Y\/RMnL驇Q~* K:Ap쪡1'Q%]nI$`JG!R4Oп+01&Jі60Z&eʫ)YVW1BT!q\^ RNpy?LdgA*ܟV7хL]ۚkwmB4oۣ0Pg"&LQK3zTd=;WX-MuͨQN,R#ZڸKnk?cڼ6c{!MܙJ: L@&g+fIH-Y9BwP.*bf!U0M6KUHu}ul66!maeIk֝uأUwq1?}ty[+&ڂ6-ZI2#]v8/b~zD>{!_synTAh D7j:|^آUq) ˢ=ϖyN cV @zwFg+:-]2}0Lce[ 3:UqZn[' DfNd@.=i G)2ՠX""icyhߎ$bG;4;s$p"\]79I}2e;45?]{rGiuwzBr߿Z}kv>Af,D7t}ܾl s|FqaUw,^N_bٞ~˞q2hHpT`n8>D„+%/'Η }\4mzY~NcT-%wb ,~7%|Q#Hۋ{Ȍ1X|ḲbJ_ vB#|"SBd$2'хQp+Cl[T_2Ru_>]j>Gm(.,dnuҶ "=bexCޏ3lT zo8$llz%^{r"T~ʜw JB[dzWDߡij+ѽ5 RKOoZ pᷡqHLV^S9%(t'U.+O ,mt@~+BT!^VО+z ,s.^_]Y kCePE^xH\J?Qũaj7/P1ʷ~[@!* eٰ&`CQzEgZ0$ѕj62ۋAШ# @<L4jRBb|SrSd ]bʉE' ag,m25p]E|;]=b?1`|&YkH)}p#>I 5:(GGB۫T-P[g{N<-W.䰝ZMq  (TH⡌52J[qZzuY"]!9Hr˕YMs@HH\OJ Y8vpHK쫱ayfؚUqSN @e 1FvgRb= &dvRP\3 \>>5M2@ɒD+#:xq)ip[YU6߹:J "p6Ba%宼d\C} PϗSk*|l?:nK*xp4rq޾غ{נVɴS,Pf{H*`+`n`h>`)3 3[*mӍ+} v@v\:MDU;s1p\eƢ>w~^7t *U%sO[Mve圪y*`BQj: Qez(`&Ix e([=xzIVb = ˟I9MToiﺳ,/EWnOZC3^H~Blj.3+i\?Lr͂u G=KF?oJ4D_&m,TkUs ʇHk1.VxGKAoSW!v3MH}b4B% =Zs@uG13vyFhWc sTF߰mT+)% +UʱŒ]T^j྇BV ڴ[E D"jhVP@=~S6N?<']hdeLPO]w*x`1r0Lqr%4F.>$Ng ڤG =rqͨTPcYp\MgZj卙UhkM;&㤵t+[8r&]Uyaw1ھeC8L@iơB~/o cBz oEt3H:Q53*1Q[{Hm>rvē^b8+й." | ;,b"`kf8aphm}XuʲJ+]&dC1"Hh@>0KKu$ir'5X(&@d;Fws L##I`Ws\g9|ص&. "ee{y ,Vz%u2N9#xZQ/›iD5(vI[)$+vqAKdLs6U1dk(糝1yGCGPW,9HA,3F@$}|h%L֫x%L7!z@~ OgH=Ce #aq 9٬(0K!7lc>/&  ^ɲ?N^[M8wjloT޷͂^U Ow |K@VÖLu|u]׷ >}C bWFV֐r^E?1&/M )$zұ]}_YtƟ+L\ 4Wtzu)] 3S<5bխUw K™"Tw,ćzsj]ИZ4o {[?mSe@w#w,BdHI27{D>+~jnp vx_:lه^G~{uJLA E-̷ %);e˛5% MًŪLa]xttC!Du*1@2҇]M j6eEP 2"&c+ږŨv;2'~'ZNkR?c%eFtUI-lqɚs<݁1Ҭco6kT>c+ٚ2_5F؞Y+aXX@Vl֘_eoSu맓Skf(?bAf_7vfѽɣE\Ԣj @5]nGw ˹-m'=\Jxe:%?y/V߰]s9btt~܄jld1#C3=L("oӪǻ$hwUPS+S9Cxf:}ЈSBDx&)pЎAjwMݡSSbذ3ۮ 03&)4 4F1tM2rT\ I{}3& 3`%1j2\giYsq-m5HopqdiG3wf<8ۆ]E$-Ɲ^uUc,1n# sj!2ڙ.+OxjQʈac![8y ?7TL]HSCӇW*V q%+ҹψ5!(@3Q:uԧ 2_' @k wA:Զa 6?*֦qwQSVxFHAR + T[Qzv"3VcJLqK1oz?K$ȋ聁Ԡ~z[۩HQԗ͊Տ[ (Fl6)q">4bVdqWå'hB?I}Z늱1g(P 5U$Gߓu(8K4# 3-y}pquFhAݝ;u̘N lA~N+L.Y"'SxղZK<Dܨ>sNք0젂Nr*P}Hp UMg E>)`7ْ/ZL̉o4\qg^L|XnTYtaՖ3vӻ[' fcrBEECR&J `QpէU*_dzTμ%CR]֡ԝc/PaA 7B'Ze943:A#nG2עDCeyrw2 g_H4VA1S$[)X;7C2O%ܩJ+D'inK5P!*51hꦤgRQwԃFfJU@뚉/OPz?Ó~D>*S0.[4{yxFܴNS-f 9S \yiC?^2gԤa3\~HK0m)rp[3g-N܋RPsrv Fkԩk;?␛-G~G|ȗdЀ-}Xq$DR)T$-m¦sQ[%oISO٣mM`wnFY[>M*Xpt fd~|O焊wWFrP397灡OFdRJ-H\{S̩4EbSW{'MEYMUP'h8' VŝOC vg!8"ҭ(.}~WFx1M:xeyRG57$ ډlr# 6c/ʹ`ЇpJЙ0l2 OYtc~$= (bnQ.cd!;z¢5>So/i?4_̢pNsmN:ʚռI/l=xnNBfO-ʏ/g^Clvտ-VrZDj0=:l^=B>8ޙ>Ge% h@_W~,qޣ-W sK^lYXCdٌ~^*ZzwO QP0 1,q^7C;R?_^w=x qC$5OMcgzf"gA գۚ:>t"5%[?%ŭD%c:qQXg>UV*fiE+*g"P1* 1 MyD.kщ ϑ:oQ(US>csP`Z@1^Glp7Ce|iYx6lOsᇘ km9<nz3%H4T4ѩ' F %DB"mHIܪA?ue7w"Dr&wiO1pgtr t}KhkT+h47} .Gr,F@GWXڼʹoqr6![IXb4IH /È([^J do^0fG9bPS 6H'ӼURUX ix|3xv9ZO1 [&PZ_00fz8o_VNJl9j2ƄW ?:JI_$KHp J/* OAN9YflJվ3" >\ (#,.H_gcKJadx>(Hf1]xY@ 4[E\]^PNtICwM3u3_nǹ4Ol:;Eet_N=7F5ť <`O"74G?dKJ̲1ty/ yeXԌ!$'>bIH׈e0@I™;-m("j5#x.8``vZ`u)OKU-i,BmIsQƘ]EXX_1,**-RqJnehL#"I8@j/$~"B 9"_ rN}A 4ﶉX+QX- Ph)&OhZx1e.ܗBq oe }0Yn^ij3GY"o(3Wo-#ӋOڃI"޽4Qv ӎM9&$Brдy)ǔXOݾSghY໫v"rp/-`*O=?Ĭz*:~O.jfu`U ȒK&>ZRۮ5*tr9 x}ـ9;7vtdzk]< $IXNn}&׻r(*lW q?_(T< Fh Jbz=.!UY?Ťi7gfQ+fۥt!,6QblѲPƳjXdr; wp^8ES7}t3xV+88xF;+4 H %%YO{+.("[?[BczSC 0n.g~TGmA9W3N_.p ,GEW WZ#^gЉ$o,:M*ԩN&)G$_$ SĹ #HNSXUT$z tkNTW% qtXYĮsF:-k/2%P~Pr9NFp%Q2TF;yL򄇄u)y].$tcOX6}4 yӵJO9юy;M|ވGF T҉#x~cG&gF-ߞq%8q09҇6Եwm4qhb+xUpyuAL:-f5Kx("KsI@z-8wY SR_+(uB*A%po^4_KXNʔ$O5WpiI?l(3jAakF 6ʀSSBZF?_Jv['+Ð:[s&G""Re$c}_NxGžuU=hȳ]#1(X,׃_7Oa$y A()Y,2aoa Mi*/|t l1s#)LO驫B雐#p8o42>e nS|U JX )0BwbҘA-ESp)\;*}jOjtRg.=EyMKOUF~AQV91 Thm O|CUxh3?yikU5C 8&ZRQDҩNMn Qʹc`]FkӖ3'IzL4\=PV"|t*p+Dլ`4 .ZB k$~,bW""q$"0MͦY Xl4XwM+TD 6/D+^J.'Zte{,5y|U{cDԿoeм# 6~" q&ɠ>V‚puQ!z2Y3\hoA ۼSA܆zQnx#ꓺԳXpAFA^ M$8'=˶l= p5 Ա|TCgu,ˊ x+~}qkBQx .<[â<ȥPW^(me$z\E@79留SʺigwUo@u40q<8Ili&7 "ۂkf R?#[z q`@ oc a"=o|]*%A_ TcR)L k.82Vl ip^ :up>xpL.ִN+! PM[5t?6kIGran-6' # IA{n^X}]2͛KlMjK ?nT "+=8rdej:K_/yU@6:G2`N< SLCKH}(E<}vuً~XP,꫑W'; Izk@5LP_, 8ZH+P:BJ#ܳ1s2y@d^>/p \|z%]gJ@Z`v8u>hdp>JOt4X|2[B̗獉Mwq{jp&f}ۭj*F)ˈm/6! p0WO3qݎ/v?{l\ F,ܳZ3St;㝌Y:zhul!@ h>'9+Q7q\J3 mZ@)@uq)RVj6\)N݊s.5nW+AVO!F TE2}Zcߊs5#d0~{9u\=P}IJ[UIF+4l15EwV1`O{\gw*Il +xپGWo` cP.BE!}> }ߔ~xWIV*̸V"o:??+Wv|c9!rnاg/鸌g,tyԀ jA7(y }ž3Fb]qեLY A^!ɈY#a%ΘM1kD C!Bxfg{Y='u\u cb%!uAnJtk#5cBGxFqmq:z.TsI$[3%<2Q{cx2DQMw8u'Ew'~=@~ZT t@Q-xzh4OTrZ>[:8,YJl=0K#]{/$B1eu]~}=%8%fѮxX$tk6K` eP*_u%yGRt=PَԳϊpoVT]RD*Kk0KaQ}<̱oc+QzUi} K*{Tq%e$Iai,dacd+ȣW<3ll^n:=|jHσ/];[p`T GF)+f̔^jj-${ oMwBxcXRsF=28Nēw7t/d[`%H?ͽ,C n~ÜWJV?lb&%)x6`r Hxt9}uH[F{B} m)3vʸ+F~?DOè&@즚e+uw?~nr4iرy=n$N;Q8G/OuY2*ʴK,{"fZk"x%J_ჯ}^+wFDu Nj)*Y,7aBWeAs NSM ?urk*ݰ+'d."qDr{"T6/4wRF#)|j hМ 8γ$M@bǩ/E7Gȷdٸh`8i?D鶓B嘡u2hLS.^<6h!Bjz l/Ι#8E0v+]'`\:;agc_ /I7$O-yR[KמM tQ(s'̅nUxE*~o&2{0fʽqO(v#sP 5U%D)iCužOѽ%Z0n4 7OKT)#y2-$8 V(#C O7+CQ{mIDzfA\Rffx\2t)M[["ƋVe2KP5"@aTpeu~޿V[)"->MA90E1oTp e E |=1,~S_ ft?oss"Qi%x70$[6~NJXNFȢg&TB{镰唊64/pDw^ nt `XWt]ۙ}, jePqW5<6pK?駾sY5CYn>QG)lF j6yqFKz"e #4DaH#nѼ+mZ>x ,{Y jq7FJ'"DNpG/9dm/G˭Q~"*rWݒŸX@G34cԧH ǂN˴-2!߅]&yF.#2~`^@emV-Q?)j8,2I:@0N}c$@K4?dɽ!mjj]ld$vonr%M@A.VW"Iwq%l?}H2q0)6 j,6_8p$bߡZ@Qoݓ/e/|h81x͆pL 1c'u#]i5Q] NJ'TlӲpFdA+HOWn!%Z;=&"f^ے@uGsZ7fD5 I}{W8"5>mTsmd}.K3dϮ FU{9 BIH5?4m;J;~l0/o3v,jq+kVVc?9A.h5|e#27""Ҽx‚V <khZ'y9)4%a/h3^g+aVud𔈯i4V8thW hVh`/ۍ,ո3 EU7GR ϐMh,VNpM~Ҫ^$oA&B:&i¯ ;c`WB ?:D\"L)ULɩe~v"@HW Ԋ=y.|15 v)5V1Hn¿YȶDC2*0Bs7>}SIY]I^o#tN"ă|5dW#]ܜ#.)HdkyLYAG0ERhEaU͘&YHxUׂ %lg|,mЦPnŕ -k\t=53LXjDg@`AL }^ezJ'v#j8".MGK|2g=hf4IX̣A2!e$hlϽ \JyxD/?qjS_}'d}* F%%, xB9vlm7a'Ӹj8nd;YWSƾ_m]w; HNH4C'm QJj㮟>}4\ˋ=q?9r:K77= 44ū= '%ɯ^HJض16r&EHz, Ex> Yz/vEQO`xJ3ԧu O, ֒uiU.Fg^>mc*-xBE] ?`"aێ)ww~|xI~ xHZF#x =#v{pn_󷦒-@sA9WH}N5X'#ث/6#l<&k1SVxoa$.VtB b{v.wVQCߢn40`1&L}ψ^f@*R]%[io/_'TKjc))g9$q[W%VZs㑘ܗ-}ds߫*?0@$T̛n ۥ|

# ~ ,N;d᳀PºHqhl#=а>W{nlhal:x/UTc,evk/d\X8WEqZs%yosS={% (oV+S^n'kOzF W%nlm· O @}VPkG^0SJXo;=b2iS[ؖ$بS^^ t P9/k#EtBAO)y/W[,k°C A9ʼnqD#i6<0Q٥Ň d1g?e?z+K^UR0)a6Q+J }bgcH\HҴ':겷*"32Wp5+yKFR|RZ;i/Jчi6E9_}e<xl߈fGb2%R(ePړhiW7p'+ߟ8Xƶ`'E5%;  \1̏*`7 G1 >)"Q Q6yJ3>f@Hj}'l[g04aܭ냞t5"z98=+&0nX\*>/hlsW>:s,ǿ;,OxnM84%~yE_|񯺱TX<U υ3aB7$uLiє#I݉.o& umXW(;7ʞ_e0&pkF_98Vl3gݶ9`^]G3`- ܁sT"I8Qkܠaׇ ,Nµi½Jlqb9\-$ٙڡa1w%I̜8ȕpvutC3?c&޶bߤg۞sz)`?Z gɬf;ԣ1ޙWBG&L8Ș)ݯ-ΤoI"]6+b"=JX29bOP ÉFE?j@,qOxb9)H >bu5~YMH`8 F;WIM: ٷl/_/A^rPd㍞ NU .P/d|Rj.An7nνC J1 |~Y`-E"$N,A](oHOM!ґL <÷8~H9fzqޞɰ C&pE- h%RcVF#ˎivIڅEONJswt@frdr}k,,NJjFFK^WhB!aPMf  _ᨫ`3BT饮\4ƅwA؃nYyrZL`n[+4EWG'],kGUgIm>0c5r2-}J5}$wٴyo[o)O7v٧ww$8d}J~׾g  Gt>i"xuƓnF ]VK]ᶻyYn`0Ϯ1Ɲ9=(ӏɥEd49p?:clPB}< oRgL TJهCl+ Bm͞]{3 ('E?zƘ_5Tπ մ~s4u 񾹸ZCe}$ᅠIޒҖy 9Fpu׌tWWav^~8XOt5gYK61T?U:z-(9s%xu ;{ܑ@SQ `[AtVi/Pq i9Erpߨ$dT)XqeLˁX_9x<I d@0n 'A ]埁pTO>{W] ,p}`碿5$wpKWW[Ƌ}\Rv^DPg-mYKe>&ayUIӝ'VjgK>Nf/IUm, xS;N,E=hj!df+IC^Y4 0. 3TOOkaWZ*GFMרS昈+OQtϽW5ACpE*?\=\kR?FW|5,6= Q0@ oQzH*6bPB34\"/A Ft\ozAfQ_`vtf{~ZW/U39WZ:N[> Z VBBV=B:;mlD;I1)(⦤-sm'1:oB%WW=0&@)ʹW뾰)*S 5Zڏ^t?%J~e*oj8 'MAh^˂\gg4;/0}clj+^cplpׇ.{ơnq˭iO^ 9!To'0ؠhvQ#t#d)q,#'׹k7ƸrN2֮t ,E1bH6tf/̬ eIC͹lbڛ5o mlO4>M/ *I5l' -d)Yk* Φ ֑3d$A1A6e?$BS3oȇYfE?dž2JcEe] yԺ9}|eic"+J]w~m' &*j,af_\lEʝ): ET9FlKeFӫZ(t;ˏ{c ˚;jP]9_cUF̫f)ddyg.oӯk:71`l9啦;yE:?ׅHO$_p#[/3/Ǭ9i 'ELn65_n[ڪ/5_嬪hp%dM1el+oRd]/':sfF͟=y^si%F?'*f4@mK␐!IBe10t;nqS{؝mK%M. ѽ|y 兕s]1W k€1ڜrZZ]&*ɠU¿]> KYMeoVpP?4_.Ċ0Ɛ7aӥmFa~qP;@hsьly)Z1~hyI km.W!JT>hňVk)֥9GZh;6q/^ѧW?9<&m\H ѣ 4r,\ YbKؖ՜d-VAzpDK-:'>Wo V>vc%Y()!m,|n̚hLFzl9Zy- 3YFx֛wp+/K m-'e`bqaޞ3B4Ci@.!9.,D[.{Ǣp2JJoK/e 7lflǪE:8K*+[lZ{;Q1b J;#^\ܔ ͘vn3چVOt1u &nTSF6zΗ14ڔ04]-銨gDbPaeQ ^7B)nc5 n_a3.o1i;SYGLӂxFĿfT*rTC'yB2c2QӎBYeY_k&X,C !=paZvpoܐndl +oZ>CK3tʴ~F!Bj)ML~h\ULMJ xY~&Y >@@7,\[헩$$NBaA!n/cA`\{ly<ͬϒ'\M2}AOH\~$!ټ{ *Mr +M)_ͺ;?-e⥠tܙO+}$'U+ea,.HG Rv \fdՖo #Pn:𣫰\Tm闝]s@r@YkF)kr􎟱$̀niX@  \n(Ew3fO╷lBaO&Z(^Ud.vkl$\SA{, -b87# ,x $< Hխx#/@#>p{(#tJ<ؤnjx&m 2IE^̓,KSؿDB(k`d+al`D,4ݍϸ9`B1e f\N҅\浥K>DZ#UjWdjŶsbF^yYީF651j2)C ׋i;!;W^jqߎۼ;iZe:Fxɫ8DZ|48  R*<4+bZ]qq4YjJpu > ,T3'S$ui#2r |Cc ѵ0Na`E ZA%Q;( @E_ \1ѿF6}h37(0YjҼƼZ`4#c{}_xiZj@mt}Du%)kTVgQ$ЖG,UND>HrpziK|>ݎs1U+S"׻sBdp^zno|7UfcwA4sF3}~X5`9A^D,ANn;0Bhv|:` 3@Dχ-`G16SyKGT 3$۶$߫=,]p5 e$ЉŴebfq/V1n(aWD*$ !i|TWK-aG7ug¸&<&ѷ T9 `Kۦ3c D:ֹAeƌu3l1Ua0{$BSO4ODS k7tQ +bsJZZ.?w[Uc dˡTO$RgRW3,/5-BwbL 22 9,/?pǹ25 /3vWT K=yv͑<)*sㆃmoA`BK8* nR ͒?o7}C:f`ƑS#a/er' ^^??8 t? T4SĪ`;jF$ŧN(X0y=f @}؂4cK7 JPw&%D=+t"Op׌uIF1^qPܿX]#/Or?NPԝth5In h_H+0QaOgS8LJrS>]>( zqFmJ kVp&('"k{#;Q53կ^N^z/.TbH%ЌEbCabl4vx!"t&B'EN7&ZaKoE kӉ? OHOT)b9_\dWHWO-FO|nv(ֻ\)iSpɛm! ]x=kTJ)K_NpTeĬZ斐f&ĐyC6*j)dӃm:6r&ߓ"!T'Cg^?}oWy1wt[ڑN6<wM:>m/GhB3~hN]3` Y k0 Q; :&X\ra92NtóTDM2}(-rej9~XȵmtՇ JG^6 ΢9T_F=v6-VXgyUM8 wLr/s|g֨cA6ؖTfYAa\EȋQFQo#gy*E^E34nIZ7cd=֛*~h ּƲj+ 7(P\sqӴ\#g+uc9%KsB?N9!L]WȺVޏ犔,pѰ:8GMShym}ug6O9r[Ѽ]xLsAG?i"Bޮ聰?+߆ԠX Y;D1Meg$DPְ'\*!#Pħj1%^eWt (YHL.27 SJl#@vnn,,|e4 G:򤂻:'T~Ģ\!0aNeg1ZGy<^gJ\&/F`";p-'9Ďt,FwF9,^+V FA:ӏi/ yE)j1IΝ_4Q~!r"z$ ~%/FkYۚI&I=+A%HM.Uȭ i3?xI%XG\zqdpﭬ1SscN^-l ^EϡA㏂׬68p"#r lj~ݹ`t͒>DZaM` Ɓl+lɓ@*OcX)l1,*A|!U Pqc"!+:mňvj-HI8O/3I`qc GYN_\Q!G,i }e]bbK>ݕgJ CA ~chdd!ۂ E~FwYX,$2"nx&T<PE2 y|B!'m<"P\4)j+U  +,vh`޻٧G+]5|g,ٯ&)/<ԁ5!UFF΅[qWhL %b}Fy~ 7TK ݩ^6uQv6d' lR}at`r)F_'(+Wr5cE+7rz/MROp[1$&<nBeC/Htቤg7VJUH~(7{T)uh&KtDCn`!B;cRp'eAaK Igc~mx2xYph:Ơ:eObH>5* yӏK[ 9Q~?&eSgglf?IV.ZAP?- *ZbX偐:}()|V]". Nn\yľmLmNG.l77O 1`^ q [t+@(DzJpoCv^Բgxb8(,P:ri2YX'XSXwn[M{j6 д[/Փjj?"[GJc%Ƹ)AƘ'4Z4!^ "]1;TbatvS7P UQ;uMVf-$ z;7b]}Wp-.0U=Ws~Ƃ? -\vf9FnzdM!,p${Ү% "4)*y]R&IԺzRfJE( Cѷأ8TG7}X(A -M4L̐G -Fl= ޙ}vZyђEe2Ou.]|eO5D3$}?sVT֟?*&==%H:Sv.z2wYJft>SqrZT&d[ȹJMHҖ4R3*u OL_AvmCC 2ާB("E4êfBÈf/c5z)6ۜ9+F(u!'Ԣ8w/},׳RBn~ 7j0krݣ'J_cB`@ ΃O&5T߅~[ww'2|w HR!W(D'uB+ gG"WO{q]:G~~@ϱTURL+1(so*"}>,k٭ð\`όnw^V𮜖qf@l7欅ɋ`G%,bK:ܽh^*fV2f&`pk< ï {ʯrk6 ;}y`5Q儱BxjP]իJer KUX`UA ~λHD5aTjܴ_UE)F}H4kǔ-j*I-Ż@;@ ڍՎ F(YiE DPc}pݤQE-f;rWq`Xt+# ;6{3JOIv&z"?h\EHaq%uSH54$)0\]C ci TyN,pHÞyٶV/I_HYڛKMuJ5043hc,ȺճҔKwܮ)FDhFVP"70gh{z`vׂiUo7c ` g$إ[+giƟs;a!tn5+,@ 0o[FMtR3Px c49؊Y@Yť .$N z80WY"rCך NXVv{!/ڝr^h-JkTP|RI LWN#7:4Ze&3:[˃9"|V,x<\1#!O-y k5PXؗa'P诟l&-ُo_V$K›>>LpR[%XHd85t*>/f ڕ}Ի*:B%ا'[}#=$DCo$6%kOEG dBQ 9= >u˕ S$n+U1>Q?a~QwnG&m\txlA0'kO'f8 A_pZr!V6:gW΂#kܛȺ_Xtb-,a up *WW<:^~E*J]$Wx^'4%|%~A`erǿc -;vudԴ- Yx'|ټoS`|$bpH6_]] w]2/\.Ұ͹\>4*VռIwK=tyj) 慩>2lڢVk2Zۙ,O"x{җː8ߕ졜˷P#)4JkxR 'm"?u0 +x87M/2zRmk4s2 ]3ilNSxQ^鿫sQ(`Ű3EC6g ϖT)ݒiW8Oz2s_#q5bt\8)p>U߅aܣEex_}X6F3py5գM۸ = [a4QXRTٝ}]`K>HYE =RuH=&Hִ4j 6QR#jF_cӽ_8vZ: ,9?l 9Sgp Sl,Fi@A.kbEKb몽#ya['Bo!K q"UEph7HIO3 @9&RH{]ŗxR-K^szʡ""FEi\˿svm[q?=pWWM#v{?Bh2¢KcFGnYil&aLs.jeI+J1K =bt= xF UE9p%5\fknxկiE0]v?ƶ5FkV?]?Q%i{7XG]$0YrjNq/ۃ8ah)SpљW, ="㯤2#~ռU|tۆS.yz({$5_wkxb!rFEI_680 R6p*,$n`́T)Nɡ+7RsJKx|CSB.O˪b=PYŖpq`3A3DM+e9=_^f8_ 콓gE#cK0Ư?%}l%'7yة/Sm Ԫ]K) tHȧ$T>%?7X2xq7aۅQy-W*mm@nm>i鱊2=:Np5z_4B/cAtuWhgl{g4BwY!Di4-G½c][tP@)Z]<|rXeA/*~C|24{!37VG u5PٴAgI99^ Qq{dveN7 ,M<"Cz6Au9purH莪]Zv  HSᩇ雲3r[9Q[y H|ymhpK)F);fƤwcزկ dV. hYC1RRsCނdK"48T*1=䢱"(xX?I~.akk"s`ĦS; sUaYM\_UʫHgQYn=i,q泠pDUv 0cwlL GQ&)z)C6wrS?( QrY?k,1¤ _ޏz ~wAC%tnX1 ZIKMLM%/?bZΝ.{c/\]ToH ٕv,qd8h_ ,£vET~Du0@^vnz7@/G5tg0.d#8K_mxK$rٌJG]ydBBJ@OQ"@ OLQ&Γ\B1a9Y,#"na)_9bMI3d㣯/$KCvr5tKE,(+P2^UUK`36ʩw~fUh Q%[^n)M{O0Bj-M'4`qs%\,# lco%M9]ē x7SG9? (>@Z_;J{Y)9#=H)PC]j~V?OzGWː<,û}a$ק0 u+܍YS-c0~Qr=H*/D«yCdMT6X6dAƳ 8cal35׽ BkMf*2iYF!m !z BdڨML&wE]Zv0.R"8?W!jwH=bQC,T.ma5iƺ5Tq1~83w׼míJd y1:?A},K.PDJ2焾_R!,˒)]p}?Oux%BCهz=sm!f Ee4jLpӥ++ *)5p@շ]K _AయE[h&ʟu,:Y۵74ϛGadP~TL*Єrvʨ5=xo gUnmAʣF&q}}c nA`-ѥ  U@!#лݘKaTn wB5LQ=jp-Q:\P>&n[[]PChE類:@GT'cN6PdS~|PP ޺aZ '2y1 ;i.&1N6[A4gGĦm^<)tYA3$mHު1˯ %* h,/Q4gfUe~w?RM]:Ɩ!oBmĠvtn ,ז6'iI)H$rrF~>5h+uɸ9Z|.4#{Jaed?<{yy<}}FeH ֦0_1%< 0$ ;@/xl?^ STJw|SnC !1W"7-ٺ_2Y ̛l?;ð{0!,;F@#g{!M D+˼~%'% فB|3XڪQq*eA$@rH|vXxjb1KJ:W]k$3AV3q(2r,q-XbN}ptBDu|Rse_yaq|fgo4'6nOa/0O~:ꦩMM5FGRCRNw|>zgϚʒ/aЭ1_bG NeU"D%CU&0u[<>H|ܼ/m0i#*rJQ: GO2`\LwR*dô!]dG(enqZǔXyMT:U{$b8Hi΢^@i캴-̸r0WƅL1g%]vޒQIbɖ_N}eE;DHn|F)lmK|P~WEٹN?-!i?m~v{..dO7SNYda} WFF}yA2ִF-zGK%#Zf5Xߧ>{Я9ӘoGh!C |U9V XTp,L]}y~?1K3L&ET{K[ǟZdRNۇ ˑzȰ$l< 턖L f,=  3cS,f$hhO!JHê$   }zS'؅o=r@qtp %EW-ya$4׌(\x0 oSt:cr X! cr ;dY{;XҺ=61Y,˾_,^AV9jX` >~%`'@Cp \0~v+٪5*&=٢X]U"lr35Ӂo6ksz!;sw^UwkuOg}#FRZY9HLM Gـxl;Ϙ[ U%K.h83\jSqd@)j*p,]090~M2TV-*>ߤ`7i cb@GQIz;8cy]"d*JwMFdҫÁ]S{w90ܾ^4*4|* B;# phLs6pR)B'9z.c_dM0* eZd׌OrBnhSd4fO./&476;Ao/AnRCk3 Hܞ~e}w2я/<|-i?-6:OvF;$Es]6ʉ݉M:o]H]BDrs_W*B_Xd S|6erbYFʁBv5̀yf܀bLrX FcXj"!z+h3UY&b>5CswٖIJ.QE[i&`D[諕'31 "n+@R1֍r)$ )*cL96@;oGcK]ΰMW>sB 騢 XUw5t ~ 50"75;Ún߻-lAms5Je]qΔJUHV g@$v}*TKy;er4I/h5k7"، > X$lA SW+>իݜ2dT囄;',SnAXՊe*b3tFi`~?CϗД*=E+F:l6qQ5Fo֥jwχjL1N,QķWi$QHBA?JvrWYIeRjtfGՏ=2cWsǒ4Z>oկd48P (>ve3\'k"s/5PO})Y_ _y]p,{G'w/~ пx|J5=Q]y]Lȟi/ȼ1a`3V '!@9]gU=|I%rǢM͟qGe*bVxT8RZ$ɫdʪ@ϐKvmz~v{$2kݗ 3̌=eƋ\zr>K}^| +@Yw-ҁRZv ʮXIf=l6i|\b_ $5DQ} _ùZof Jhe FPJy`~ug5HDž%%)Lgl@5v[=nW@F˳50p(™\dGEFw}SҌ 6O1ףcŮf0q`jV&$5FR&fG?]I&R]ctDXK[7Aw#W/"m-m(La,켁6@_yT́NP&/tQ"D.Z :)=X 2]]JW*a,"ݧŤ_4 <Qm,}^M MA~x4ܩ}Ek ?I=>S//\D|3%8cw6RUyLvX6wc3HK?9 MRy*B2Z9 fovu|iWʒNVtڏw$t={}Ze?cfL0L۫ p? E6a$5d oǕA%yz”D=c'#+aػ66MaSH0Y;\S3z_G@<S'F{t>5"Q(S'0#a֕iR$kwYdGTN-C'K5Μo$-r%J1>47+*co0ڷ74Z~7 8/xR7U53=I:0 Rs$ߒ@+KpgMMJ3kDdzbi59j%q?H/,HT(-8T?qF"0*Álk # 5L$Qos^CJ¸@= M jg)E!md:5tDl`ؤ%St2{ jj=@f)iǟvR_ b~[8&A_{#PA^#jqS(RPtC mg$OB|rK7P_sOda^G (?rL Q]h٬l8/Wi=3w l -H+FE(=X-,c'`U,Nu1/]]W4u^lkX?DAQ:?viz'k[[?fKvA"Y:uMf->d\aw#{3]BoF!8nKP.Mm8J?ww\ܡxN6TEi+$bR2yjJ7;D ײ!ٙ/U+۬;1ɞ[ܾ Fǐdc0"M2_n<٘r{?b]}ӎθ߬Yu}YO!cWD:"hXZU*upSW z#[@ۉDّѳRB;f!j +sg)'q’QҺId2IR)єS(- yxV|!Uy Y3ǥ cf@*),y꿼W~,>%ӫP\X$"ϨF y5f [:im 4 VNVP2uP-nȻ148&2 X31u'dP6~uP[q4lKY6Q<ŀbJ#*djۥɶeeXk- ϺZ0k]pH-Jb.[qK\UgH-j\ʥ'2SRN L#l79(l-1l$)=NୱWXZ apds\$9GVy8W'!k;D&x) ,=ZZ3a!kE@/a>`VEZr .eݒRtHWb5)e7hW#Pg#n__ļ 77$q{li7ڥUH'`90_K)FL??0?F.c'mT窲B,:ܜz?VjV *~ՀHfT ##jo;.ػX;E.R|ҹEfۤ|}_ilm^Cbe̶| ~ؙ $9Vp$tf3Qh`,6%%o6jHwG+bWWlhP3!>UwV^,#c0) *)o-ÁT;>nNQvCju0-XAwwu@@ ~,?N"`|jt4gvMDtAnsH8=߯򓀗gmȧr7% #+Hԏ!.L *6u*a9LPg;n*}G{N etwC9 ;&gMs$ΫtVA> ꤄jQ[K8aV0'7BTES5nbn9pɤw _)(25i+Eh{89HR?e57rޤQ| 1qmD,?#H였%-* 0o Q,c $븾p4BqwN(iC<62U?̋+/q@9UsAT޴ʫlqId>lk$wɺܓ©,(%tSk }#6J)QPO9]v[]c$V0陦~lKpYvUkFݛ5u3Rt,4/rU_8{HESxĤ0?xRߕg(K'oTUTIv8dPJAK:75'qGL!C*[- o"rZk75HPwun椳[r5UY6(,:$ LpI;6%^  ՂgF)x=1*c2avILwAc0,Csm1-WԠi,38G`Z]˫M+ N'U;rF'3i @2ѴyDUj#|IȔBCsLL5H~GFs3%@ i|rg XH#T_ )<[tFjo.Ho.2xkp%b);0aumL_(x ݌Yo]szC&_1ᩰx&tEZ3gDP( 0OÁ'^);0o 2U mjJ_ TiX:@}̫"3u$Bˣ>/:=N ݪ4)Աֺ@rd{ܗc )Q_VΦs8u?eυgմAY,lHS% H]!QZ-跁& {sh(74DZxDJz==j~}g2AK -޴.#w ae4gO\n711VBNkj% f3BT$?c뺔/5)M"q2dUbXPU!Ÿ;By_[CQ.sph ѡK'A zT28/1x7,8Oη3$\k&Bp T"**i.(_MZ\;, j-^v$Z2{7Vy+IMh}_x^aU.$Mcc$S)MD2X:և \)ʑM: NX\4;TipIy.wEAu9iѬӢYDkd}%e'h2vmL\ɞd:4."C'371:v@R)?m(\w ')Q N?4Z$)\, :]SZ߁BJ?yeH+Dt7T xKF7Ő1tb;~Y<ǾdpO栻'osa"gl D|_"w7V}^u:sقI 'IN:ipBެ0-3u TP= [ D##$MTP\sԕ|~lfxւM91@v<W{^ǦES,5I871EA 6%+ߧ$?YI3wᛍ;ήyB 7B.Nu9m%BouѺ.lwŠUlě8#ᛐX%vDQI,[];+ ue"E0q!̔<'z4u!CU^$lw)6Qh~W.>4Hx9 wy? ,۞[1J>rz+ 5wLծ ;1+^Ws">m oe? [; `^O;mפ'u'?:AW!mLCVZthQm$Bs7Yk3| ?(xv!Q@M" gC։jJf^P"ǐPM]-n>̚QImmPg*ybnjyVaDFx溏KLxy?*n"_/F/ZgD7#*_Jq2K;.4aE fEgi٢' *m42+0=,?. xV#þ͛|T^{EBx9sI aiQv+k>k@2JEGE<)ͤ)VxF.`N[2 ^<;6P_^zu{  f;hĩ7̣cDL3ˡ1 R:f)+/Q"s"ɕ 4tɆ:KZ@h1fn E;t\8'{.FtaQ iR]f9:F 1Y 3- =0!* yPO6S_;y}g}QϱR֏xESPKFJJ&V9wP m`UuY2fVT_"E$Bɳ548U2EeQJ)&|#]ZJ?qԭVU]O'K f}=n)ј!5")-RhQdL (uC2Pڲoilz+ 57~f잝2B佋E{21eB םg]g-QTbk*s>0 I3%5 ]遰˚kb(:jjx2g,}^k<ɯ#ywP#/J7vA|]+<ݍK a!Zb#ط2Gg n?B{bӵ.gmo )kQͪP.4pi3#!~{3O_\|OvS"W /R(Yp&VO 8N;!` 3^.YIM7o4J"td1 \z7K;Lr:f{8Ne4G[ IGbB#A+(W' pl)o-ٛh<#kJ@60B!a^I.RXJąlw\7@@\k4*wK0 CBNfS5-∭w9,'#jA\'W49)qz JwF10# zJ&7iV AvC[`{|P~nGnʤY;֌:%qD+FEӃ]9ٵ$ˮ&xw~"7_"g\mY\,آ{_`^'6AS ˠLIgh x5v|rɚKa gڌ}pFר;@pFHq;ֆPf* +/>l5OyIJ>~S]n }$F UoP~5=eZ%af33גU 3|2L轗') ҧ;iF`躲=.at!mZf OJ$[&rp3{?շ~ji"\2*,6 =>gZYm+,Q$c? ?g]I#PN\LS0'~Ϧ4E^z4]X7WI>NM;IM:DR nrP%v,-lbv D>[QzPǽOyi]`=D. 3MtQrv9`]o#YJD҇nɉCt |"_ DC"%ƽC\?)F6f bySMX熵}!ے;uY\S{KSz](h ^wb<5b[P] ;m.@Ѵ=IF0XL=ţPG ͔$ߎ1GOV|YLj&U{MJ곰6ecF|4ܦέ|'#ݏK/8mp>3A_ y.!ڠn|[c:hV}[v)"ogsep@JXnlW Xc&ށgީNLYQȚ41l=up8/١D)p^0mO6elpu~=ڢu.VQxG_xmkNGNi)+(7I]FUGRk&':fmyѡ;xV{ڏUewޯ̀S1 `b 玃ēiwFwZZ #s S?TB7T "$i8]i4G<p:JӃ@,- g{ IƍCb9U9ŀ6>QQK+ guZ2̍2vn5Q&f-y Q@=$MeX`s D ۶ xo0Z?I[C4*.9綞*X¢bPUؐ!Yl߬'#n: >+'Gu (j:+y {]שHhQ2>`O/κ-(=^mNpM%ʄl0ƨhˤ8R4_aU  k08c:ut5K N lS6sى(D|nyRS/ưBRu+XݪPf=98rO"]#eaəEe[X0hR1,l ]G0!eiHX'lF&:6m,އEHCK\6ryJ m eÜvSs:}we_43 * ZzpvR,\7ŒظSw3gg(l⴨0a%ʾinm%_Ԃ2F.Oe'7"y-6=nڅ)c]y7&a6^/ d׬OhcpPF$˼{g )y}*V*ry@pp/v}6X@>~ MԤQ&s8#YN:Ct^y,TBxPaΕ%3df8] r5|wMg_Sqo]K?7^:%~@)mszjp0fb0Y@O`GiBK);}t͇J չDžzu,z?ڝDb؎F¯j΢^@_<$)6Iף,5j<Ln%lDG$=k {B(3Y*@D'&=כO J1J^m6:&`VZL&!sA0*JGXE3nś'k|K-:YQҞ%IsxPk?&)yuo&E; Zl!UQ i>EGԧՈOi4),;b/Z\n) CJz\J:WG&·/1E6ZWd^d13I]T)u0fI Kss:BJ>J^:v5i'Bcݾa6Q94)yE YX{)oL_-/!" 0 hY-Ô9b StM^s/5Z[:~dsGlHs%! G~=ˏe|Ơx&/: b˦iD&~)l;3g#xC~g vgASO5TAxHߡdbnY^$"\ȸ0@y~MZu·4bb3G4EpQS&A :+,Y?aõ Gׇ>VDz]4ٔ+띇;,OX/߽Fزw{7s7릐Tr ՁxJO+=Ji7 ASrFcN0kLxoW$4fQG"Yh1]Ȳ}dRGN5ĎW,&_N SFV,I) vm*k1gm}PmwgShSS\ࣸ!=ʪj6A-".rR?zZȊQք2~&׼I 2 ɨQJ)4nL`0>/Ur~ ꍶ]Ց|wF>%(-."[`d~[`-&,͔ -7>S}p[4;;jY*!Iw\3.熌WeN H#H.<&6MJkah@a= v6QhZ]O1C !W2Pd) 9:Ce@MP 8E2磅}#G$Q<#GӼ۴Oc}v[@~Ze a_S)T"(˪ 2C?x#29λ2: nڈILea╲`{MՠlB;A4`b C%֭e9^;EKUG^!Ib|U6y`&NcJ..CBY{3j{M\{ {"7&Xne,TcZ&tO`%%Ěp8 :{`=LBvn;B"3()޴1xqwK<*Bl}ets/A z#kz"0BQ\c3٦-г=)0j+Eߘw2wT9q@fh@t[ (hօij4f~‘l:y<٠)ƚGꚬx,KB!ucMX4ZT++z%zU6p5 wt.İ;05 e4U޷D!B7qWfʫnT{P,Cq5h|vJԼU֖ƳV t|7NR1sz@xўO*/q:4GBt, V: ؟V޾;~KraΘ5$ q#ϷSOs0-ZRD6Qjp|)xq;nc"0Ӳ5(e ڄ;f;P&%3#p9R=uoN1v^ չu,ڭQ뇸vi h_Im͆YR1~OX.H`nU0:([-'z@uG$7ijoU74s_5)tKQ2 $~>ڝPvDJD'H<3()!;5ت ܆rBP^FK<-Ĝ'MBlm=ˆa׭&]f77iƁi2UJƭiia 4bކ rTbw8\S~-~g"d ֋ý>cX"2SoII܎,y $O;yzS˂VhDcY`**J75L!^ {Z4`uN0!Ww/AGCSXn+oyT[|*-}=sk?љǪ*KXǜo(̠8S{LߜHq|Dz —CY@3\nׇ> ;gd;&c7]ԣ+$=X 6#˫Yo`fS~o@%)&Jtz3 ̒ Ul6NZWx[ <^,!lsQFkC@]!|dU)J7Jʝ Eu)tiy2aG$t(y3~E89Q`)#VtR.]ЏY47&X;A#b9ygmiҟCCՔCC,C7|lA83(Hë C\%3J,uons\P]sw Տm#7=[ `Ҏ?0bC!T7bU)i^^9Ƽxa*HgAvʶm 466rX qET}{+j*964Tm /A /{B7CFAg<ɈT"qUVP_# gum JkK7s:ŻDBo xW,j潉x" TêR70qSTvB@씪WCQO_]ku!9~Z^7EG 30AqVx9`#ZuB$owR1;'HSry2.4<+=Dlx& b~muA]`4#Qr@ވ2us+|[7Q3k8~PiJY5^,L⬾b` ೗^{^̜Sɮ(" ,ݪ ؏,:#l5׿n%.NnMP'es>u 4z:z $$A\}`ʗ.˷ݡ*VvBD\Х+6oLCӦ>Kūʩ-A &#Iau<]w,g2> 8!s D Dd!6жn㥫A3W j!A*y׿|!1TTRE_lɶv6ȺCBdBpv4즅1*.mN\VvơDO8x-ʪ=*&3Qx^!_NCW馗KbRokhc?{2TA[NF QUzwg7mŹHl+ T& bE3wrE":QZ(:\B.nںыA_n5YYUdXB\W*$[ߗ> DɽӺ}4D[Lnƴr"] ~CCKW#.L v(pp4}׭2T7,<'FI/{裏0/D{U ,YDv{&2x2zgzTu!ʎv6?w LihSEtPWjZI;V[O$ɶ#4v(ؐ;Gb>}vW*G8(U,燞k~ w9B|4˯WOh*sA6孰EBjZ=+|~,N {nM7g@$I)&H6|;klKTsRw[FcM:[ZWxoEpCoE~03I.Jb>_I;Ov=L?8I~י}YLW_j4.:d*!x~HkQX+|2lHI"[q(F O: T:~[ 8,g{O]2r1-:AZM)P`7PD8C Đ݈E T\wm]j%-]7ϣ!,%4/\x}q"bM6}B IhG7ݙTo{\e3ig&YT7*X 9V {;a]wyQtw9t\Evri%*|I9&y}Z2atwny;enaX.0ZzC^I5sy j<#ɇqdPAQL"*ٿŝVsQ'iԻ v$y -fw~Ba(m"H}rVR&b1a.EB\)v9s9A_<dya '+'i>-xɞ0'%D,QQ}/L:xE4/qG.^2ϒ` ԦSTAc,ECm`dV̜,-܊WZr[ 9^F2r=M2$ͥiu)6O)(aLxڙP+W*CCJ0v\;owr{X j-8s(VNbnqj-OwT6bYG=ʥdIbʷ; O fS% V1 S/I+=Qa/u ad@܏LC %Xߖ|8t%8o>gnV-"Ȥ>-)ϼ)zj 7ΩBx,qN={"/$y76@ʒ;|F5;/z{L”Y[KU޴ '~ϮM0~]o8.‰7~+c`-4`[)dϤTBLP橢d!E(ɹDa)C1u &A"dd yU!YDYCɪߋ,֤2>ǁu4L|!V+; o6 4>q~hr$ʢ{"4u֍]'^0w`΋I[{5T_%b,}\&:e'o6ih)=%o8LCQW#NO0Kߣ Jٽ8IDb2/mRx+H$ Gdst~4ۻc_n/U8L@bx9>[e r;"j; m,{B;3ƲD(HgȠCLA`JF$lY܄prr@#DHD e |J&\G欛ӧMɌvOsGj1E6G J*Kdu3Q> )I;NGiNlC&\>!f|A, D^'hۺ0}h9/$PJ^K|'Sf7pTW:YVֆ}F`>Y%]0s]Y&" _}4RXi~I-hmԛaJnD3 ןa:Ա'WP:HzPLÁ7&4KT$WpzA5#J*n1rLrI\"J~ue!4HС5Kܗ +%+rܗeJ֕TOs۫ޗ.GmF+~pjXGIYDߖ%z V(e(4ڈw%5.u gݑ@&3 Xv/PG6tP*.\҈- 8lQ/jIḞ.p4 \ۏm4rmƇPfMZRy16{LrˊƐȜN,y-%V}၅:P+6O:8cA<^JQx#5<3dtJ7O&i^c{K1+J!Ie ?Jl?eJ'.||[Z6muZpe^[6sH5+e[°ĒN멎}Ƽ ڴ7wԑo>&gŽcm;If[DArڟ>~Cue 4E:bg;D2n8Bf=Tb%qEc :,ۦxP6 va:vvqݖd`q=Dd)8"(.`Yti \cL3c菇k- ~sGC88ݾDZ=oSHw, i}dtU( sMY͆fy6+&3n?Uskeǎ<,˚oΡV߿)-wH0@ju[j5-|վJ>UWT@ z1(v.E%kXMg}r y9'SnvLNK `t# viq֣9EֲINX2lvJe{xં%Gy }|®wre\uW(USy ūEW|{OOΙm7\TYKڶh&y3wܴʭ捞ֽԵ1]+1F4l0{Wk)Ʋ@@QS1vKj:d&YWؠ<,ڰe9-JY¶u4hs#)SR:[]o୓?{zXJ:pEHGua8[S^1Z!9/}eTl8 <>яKz!}<,U~6ÄowfQ30\\C1R7b2GNorh" dhK4V4hb~΀~G sQn#-oo0~Х0ܖ8A1@3ٖ˜jUh{?`B; M4Wɉ^Fve ` -&a@AY}pvN7dJs2ʢ\쭸W0YRq $cjA;W\ ^>`\g[d?2/"OR>z%DZx9 Yfmlo#_2뜓 lӞLrz,6Q(!.[FL-NX):9^Caq.bSGeV(gBޤ=@J eVZ!ʮ>f1}P*SPGA3cс l;oJ"((:hžKe1{6粁+ $}`݈5e[>4/)8j`E) P5.-JasX[qYk`y>y1iв8ê nDC+ 5|7#x7B\FΦ Ak ۡRD-:B(HmAQ\_\;>{pB?хΐ 4U۾/Puiay;ݲmY wㆵtp=-7B%c45Ǧ8  Az ;:a isvl#G+nM`kxq-doŻܭ"S덎fG+07H&6𻍭4M^W|XbLẋ`ogzݦ1:%r5Q/ɣӻl-y`20=Xyؔ>+s's4tKPΘ[8%BەqXNJiZEJzJ6> :N+X]uޖ, o?R?ɉWMv4 e!N^i`( HMO[rsAԤ4_ ^e/_?VB2ߜ)y/WْeyaJX8'xeRg(Q[7jc8eVY:Pۂ媕֧lV(Ur$@Qx9%hO@ѽ{p+ ne~: 5˥R]ZtI03(Fi)8K@XdUӐp 31k;VČTY )̦L#~?N^K ?J@imy` 'H^)S_&,c”.Fs=ͿD- *=l5  gQ>Taf2lzMKbF(1n M773[zqy ;e_ H8Aq/dGi\ 5&5ŏN' +*?<$(6)ӋFȂؽWDϰTc}&NGQGAIX2\p)VAڨ&~FG(iXꩀ~4O<~ϛpHN(R4gJF:)oAwfVBu7^Oa)BLOl9FEr(Dna];f>tKJ-f}}wa$*Άnso <).e?4T[@{fM:GJIxswT.O'u;8v3DE?զGMGsÿq}<#WQWQʀńE| % 0X`y#/{NfxǁS:[6 $@g؉pwczi1ױ$;Tp/~^_a&ILwmx$Ag>;}DJ PN ϺdFʃ)1kO+֟"RչUSm=GTC'1>ߺj(~S 'M ,bع;9!vrCлjn-TI)Q;OWeoJЯ zIe,کgܲ =@=KRl1$FnP<[ 4 W9 1 "kQN#^TH-j=26,8ɱL㍯ tEwШmpBgiFT5Jyu.86= ] Y!5d5*qdt9j9[~BYU qX AMvanTDZ#d) eq-tZ!HHtlj!Q\59oJM*0'avٞ`%ܔBҙjiPWsBR/-@&ÄJDI<*c7M`V/sdVn~f*7yZ Ph55KܫW'C4Bd3QO6f))PwpINm֛ NDP:9r$?5=AVR# jFU/EÕ ¸g6ɐZ/ҥC/lfץS 5{y>s12~p追^)f`'X %E+U.[nGW2O}qK-rB7L\Lx#+^\OWf!o͂d P8V4'>0uWvTD'J4"#v.&KSIҋ N$)t],`q4?;`:cd6y]p e!8ӑہX+Ŋ}h}j9  Q_0ԤƧ6ԁຉa+Yj|eV8*:+I[A.)e jpQĵTę^SV=l#`3tCE5߂j#W#UGhWuj54#䩰_Lֽ%mx׷{Jp!/PУ2} d?0(הyt >&ˀkT}|%ru7 `3efuSZ5!%X%Dxa)#Q{csP@:Ƽ$)zv5"SH.BDe dS+ 'M(R.wn6*[{Yd56 cc4\!\1QtSgXU?~.<2~c.d:܅eaVHQYAP- m,d{-nZ LL:[.?p-5@Y/N(H8kxK{аG,ّj w:@iqZ(TOd'| DXd1zD*Ϣ~O|)y,kfxD݄m+n3JC-TaI3X 97;_n&i:5zѺvj PiMVU>bTprWKhC?A0,M_+{At'4T;PS~f.Oؗ.MDJ`15}ٮܰ_ш`/a\hpӲi9d=ym9TR,\4r``̪W3A..*QghN8N\ҡ1fpd7N5`1d<aR'=H(Xf*{ouG-W⁲fr&)wFk\rA[=k3֪UJ.s0o2uMΡKpTOjE?#jC4K !o@}?REŧ?PKlf a۬r,W61nC'%N%A}3(ZnRdxJ&3.Dި^}Ao#J&2 a L܀4YMBx+` &"Nag%}V,JeroJţS{BcơqԠXq4˭C y/2w{9ʬ&A"-.Rp FoFf$ j:3d~W]g\EۥO cEn< VFU(Mh>;Jq߅ǽ3ኛRI2Yhޯ"a p m7TOR_wVl 0\FOoYb[ة 69ҏN\HݝV:%1kޒ?7͕i8'%G,h»8SaNތ0~uY8( IxC͟"Yo,T|%SbWƃC|CH% }B<qrڊ)8chB1![6TT0>醰 ~h|~zq 4v_,WM\b-J.KR? BmtOAdLNVwU}BE)OV!XBK.{ _ĭ9yk%+o$U,m,:ǙpJ 4%j۾$C|Q{Hn8"ܝXPf!cφ9hNQQTe.D9G+3MbD) ޻POpd,2§[  m>4O!ca1)@ϟ2N+d&[R+w]R)|:KCA|8AP%1f#ۈx{e. nj+ O٦đzdvZ?qȹיBt0N(W RCW8 qn{-4FQ:JrܚqmUkmMW> Ux>GNu8|aL=ezɐt^o;~mOjQ'| /%RVC.V v=}Bn)s/FsIk$BܝoWhj$"-DhpKMkcGq#_++D=|5&A2Dι>|rVIj%F`m֔GozȲ xONQ ǵb+r0c{d ' Vf KԢُ|o}LPX"P3zɩLd?lX3kmFIUni!}GU؈``*.<;3sɡ .v}*d ~ȹwNS"`XWؘT1h إ~tB,F0Sy9tX[;W7Wr:3YP_2T'J^cr? a uk9/kt@HCvA ;2;ANو% Fhc7,ڒpı bW+\H(P̙9 YGf.W_wK]`[-j1!Nq#jSK>Y&L ~{VUѓ  &BPu᧸mLkび-^qIP:ˑ錉fk8]Vw5jP?U>f_\`w2"J#έpCgZ$<7 >!뭽T;UWȳB4k)?Zݫtw1h G\YcUus}7b26£4KUs0fOC8&aw\gH)`ÌA7u* UoP;{|P#cij-eѤh @DKb呋# JQs4UgXgBۀtx2IcOQL}:wNhݧԢ0_jAdK,u19Zٜؗ%S\TYB ƊYKFZʱq"83u|!e¨IԐ]*56Ab{&_LO\&]VdN4dw}%_1v]A*u부NlH &bKh 9yx `2{b) ҙՑf'ԺN@.VNA xRX }DcRaW|g({A%!x'&l4I5&܂П kF Tx8+0=-ˋd}2x(AqWwNEìe.w+ 6(yHQ1 /b=st&M$#8J:ݤV8R#4ZZ~"Oٻ)_{ꚎXV :?3AAա$=*[{[V4$\"˒yb!6" Rћij7bv7A4 酷IՒ:\%dGP:9򦸜L &>u0=TR2|WW2.zj 56y)gSǨbJ#?+!ng>ĄE v4 "(N*V1a9CaSoY];Cc^#^;Ie!~!vgBz/Ǟm4D7L]{ImP%<Kg%#s/R@̥H>AV!{qnpN: >nC3"J1z,c'T*BRo>[|>*[ŧ.>mf];py|uj8 ^|x1m~yu$%X,q-r8;Gm).W`Er=@3XW[Hw Yr cXWKskz%%BcA7@TY IjHuȈ֋5_ᮩOH=@{r*>i^n/{H )W(zLق5z^nyy+ Rza3Ţ\1kuX#*vVje>leш{>@)ujzUv?b6D'rD윐V[Zx b;7d{ϛ_(;Ւ!'Ҟ1A&" 42݌dSz$Cآ3Ñ~0mC47k}X֗dj N Pf)])̞Ad&WL91DW`J vFts 0MtQgfbg.BhJwm7lFzmd{2kŦ$ ) /?ptocmQ!٬ [aV#2PgfȵUʞpkEiƣGE؂-G=EpI_mtVU䌾 KZ+' ?1`#zdtzhʅr琛/-2M3шQdbnd *Znԗ.95u/{™_]h t9e@s+tW:bJyEduL!tHB94.I",%skPӮ/Kǩ#198U-VCg6eT@+;dWh# d65Qϝ>H</yܴ/?R#+u^{{eb#.H_k>kUȠ߲/O0矒1Op<, rWoPdW*,&~f NE.,`ڛ:U1 {CU+5ȼ)LR D s!)iHlKjxlU%WK ٘Gg>?Y3PWple+҆'6v7' K͸JDH##}Ea&'W/,u P))꨼7]RoaT{u|r/Dy%*V#J??nx3 &į^)eYa< O2ZA'V'tyU?2gBΈ ) SUZƿf}ܾj16rif'*L%Nv3jnH+Yjm^Ph4;dB aBva`pis@R :$Ҩp^"zِpr̠T?m2M&A(\?PƘ4s'!M_\M!̪_(&9@ʧOa B?s̩At{zjZoz4ɣW]3R).k/qćX,EpF7T*ABZuU0&C(uMY%C5y%%Szv[+[0rnEjF_NiuxuPc5^\C);onf KΤ{;-=l0`;_uy4~ï 槆ĽY\_ h ܙj# iKgLj7ezh'۰ѫVGFvnJN$^\L`R&x|XM_wB@%=YrY7-:v nt@v Uoɞeu,( R6mҒ sx"_d!ݾ+`p4D[T-P<ql _fPȊTaO.@<`?y c B9IR]0T5z ˜g,+.Ԩ0yBU\YKZ/aYWB`ŔU& w^jd! ]1gg70yyȍ54N/[LεpVQgǓrt}@N25ˮxB>mjrMa]Z&"K?*0R_o,AZ)/ܐB6S>.XnIC~3&6{qzsL(3D; 2L[?!U$?:|r Ni]nOsC_"%x:b[uhסyR,vz_pW"`JU~jb{t }lΉC;8RнVgqkI{ڠx CڹjUXՕ.pawBY\Vz_Bt%mq@L ."y&cg8l@Ǫ:n8kPŒ5iK(2NAZl c=Ai E߫B.lzXBwXs?&K3I=HrOT rJIvGPuekHaEPUEC9kZN-ibչ}.[+j]fXD*yF+=AD|~T(&A\DQOoH4KȔQBd"WL^]i{O YfJ޺PK^G80ו?`!Ҙ^RGd/P l|WQ{mN&9]<=OV ?ͤ~6{s[t37+%N.muXFH?m(I`ċJZi TH$ǒ4-ܣn[HyWqQ1 P^ |VcS77:nӐ[fzMnd-?:@j3c9 ЀurwuKxЖЕqJ";d(tvQhk>Q. ]8k(e2#̖hKҾ=Dc1h DY}%f) xsdM:]LIK"liQK,mqaN. XpbSEVwL[V`vRrB.,yGe  ;4εuM~]QmO`)G,pZМ<+ ei1H˫6{;OΨ5`~@yטJ9(K)y-b $v/Q+#ǡ)qz gvw (lqL)4T6sϹ53ekwKƻM%\cG6[Uv)nѱH7X?찗@{WS+ak&v0{W%e/`n*|-vvLxoD9Pé,&21batƳi`"[6/7`3nn -yO"o-% űVS6&$<dZ'X-kaUcZՑƾN'lC _m3>CbLfpXGx _*CN~]ʲ.%k(kK6JaCzc ?wb ɛ&a {LmjZO +JoLWW߉kkZߚgq)L 3-hte0ʆ2SVڂ҉%16A*4D3I55M&`O^7kwr%6J󉍔3P JZ[E nBOr㓬0F#H@"n^k=YH(|Һ Է="xR.-r1ǂ02X3G%0f&~z$AɛYIiC F/kk~_n>Mfe[#پ(K;@1KĩܧغEэe2\9WdžKqīM \gۘIg0+uj,I?[a3_fj$v[IV_1@IN׎x &X/ sjßF uac&ڈ@ uQOȊ"k{T@^%GBV*kɘBZO!^FXmxh@၂|{TP KZ5S\ ϽZq_8MUZ\?x6hܢt[Rp,xRޖ=0wt ZW5% C`-\L{!t+r{0;iz ALN,_D,~U]F E28ZK!$tPJ3$ɚt&]#L9R9t$п{IKi`YZX Bў A #N7 *LHՋVw j׬ԕ (1Ϋi??>Pw9"!Gp 8-]{BU PH2Hk `"i*x&7QhqrqXʳV'wG{^p/tFÅ7 IqrTmWcXt<^KF҄myzD‚q0j: 7N%\LO=d#\gAӴIM'Y hEsa%1 ^Nh ?wɨhv).GX\C 0>H9bt+ٷ;1,\P<TokgNRX[(ݬdT{A"mDHd1c0Dï#u.z2e _ꐤvϑ3\dF7зcS@I# BR(e,_FH ǒI\'f `L,˙lV4i%V;ym̗~\og ~T'ȔAH<0x-YwskZ(J9(Q]M B?zO d+Ꞝ"[3[up\@TӮ`|e7cҮ_î4&0„7@̊Z]gXiCr'2W| d KXPGdFM_GZ( ؜{hvWz kkqz'o*K4@RU?#q^1ʇRƝ~~hx n')x*11mJƛ6)Ax\.O tjm}M';EG[ 5Az\]Vm3A.k*):v]h)ײR_~HQE.0 )<CyM}Giw%d-1J9,$ 9qWY~x GS]z9G mK$ح`5}*(b; t*#eF,G1 8ܕ዇ ]=2y7M=+rgpۚ=gmE A ӒՊI>&`YF_%)8YR@FЇPf[r,9tB1zE49w2ETZ3fpطixX^Ob(p Ka'ulá05m-$m6gqpWP3M*ua~CU<@_F}n=0%}F6YQ9p\0̎A04KݓN#'V-aML82w^D^AydrIuB'c&WN 'w6x5/װ)/8=d9J靇2eymL̴<SOV [2/fY,cް=)/muشvź)&8 d095XToK^"^nz /  '{#FDw$;%8UgI j8.K{?^<+{ lT}yJ'ര#xCi c>ǥaʽV_(Ctf˴Iz,=I+9mhXPGt&q%MnߝDB }Y^Ձ4E_u1(fNԹH/tciѧ˵R P8zGe,)e[7F {BMstW!w1 ~Z$$A] W=1 SSos}oz#͏wZ,ZMNKkN̕ h 3Qn2u\{.OGL["b1:vm\DՂ10Zl4b̟,J+cD~y ^UG|QF=A\Ҹ~h{р;a>UwJ)̔Tfvւ5 "(q0Yj0a`T\N+ aqO|ehsMšv7D)Swb[C%Af"3;C@~-X 7UIq=;q O8Rd!>qݰKƭRz:sXt=`dJ&/CűTz sn} ȹo;$줈k7 tctE[Xgά 8 ΑJT>bY.[Bj"J%܃v'RthPoqT/)w}ʛyky1!ϛ( fr }3bB9+Kvhp=>gdSRKUl½nKީ]6_xŘ>M$,ٜn;}嘄mE쿦/Za:ߣ3,hm"wAncRr 1 _v}jV\̄q Sx~j]d(ˊl:AWu`øs.}},aoF"DJ{:z@Vw]8rpdCN)auK,~v]>o̲`<,䔳um@C'u-L$O܌}ش䞈$a94O8 .,Σ vnX>W8ʠX1sS Fh>t!*PưES߸Zc%b>NE>h׌&"հ$JM ێ ĸ,8^Gρ ,E<ZsdTbQP m]j/5a,gq% `n /9j6VQScK 4޲0dy%#80@@@hu:[_q4@7%"1|ZGx$le&i!FwMN_>nTvJ60s[ Z*>y(1#:ۋ/Aׅ:duWU;=O²g 7ZoGEs ?BS$ӅD$JX<5Vt\ʞsS7,l_= vs/ N0wa=]Ga*;a6W]v[\tZgOF~p\s[󽧗`('o4/K6Dr\~;25 n'Whs;8A%U=`TϝHS\׎%n:-:&R"zK5Aj{{w:=ճLVۊp-bC!>y.%W!:/yCBt $~eT&PAQȾS7@.L 4*1脏[˓ߗ @H۹K^=}@# '"y)h+1j^/xlƯ7p#RT +ߔ,,unIp?|; J͕b# YFz0~?\'eIX.OpLJi}uTp&ͤ*1N/#l`hG(F]g-kjb0Ԃfy*K86!Սy}wD}Di tmjҪ0JW>m<-Fzx$8\vLZf0Ͽ+h=Rǩ;meOglYӶl~!=IOk]μpF >HC/*4,Kf :X;1q-y0D+Vq.Ӧf`q<:-C,& :Q+u\%mژsD\klHXgY1Sr3C~x5L–/IJ q5&E#@y |JIYgzi@$>J˔[lb56.}sn+'Pƣիd'pJr+ uDwԋ판FK$o~e@og|Oـ&b=ƾE q#dqo52UB֒c|pE5Zw*J0@%N"g=ˡVpl 2ܺ_eWFw =)|zPt~TV͕N ’[#IQ{w~*5$jT'j@ޚ]Y1G*YڱӹZ[dzg^ʛ3$U ӊ \lF],"3@1)" ɻ7,X2ÔVFZ1^&!7޺C=v~%h9ȝõXKQy\_TzFdGY+CJ5sjS'q*ǮnDWW}{s[XYǶDgk$Ij{vr`%jp/I,Ȕ V׈zb dx%_ߋS ,''?'QuR7u^ 埈=Iqm_1=RAƈE dKY/yxI?}LZV\T'lF.R2ff"t,7 xh1Qs]vMCfF̰1d{iU<*Wu[rKsMcg`7{/#% Er7r 0#g-M`C068{<b7aICq-M;P~kY{1dǚ*3 5saj?lS)^d5/*c )6@p]uD%䑽L۴D5&R0 "Kɺfyla`P[;UtmL/{%Η040ڎ{+92rӔEAQ Tn &P!|Mi<'dc[pHV:yn_lLavY# nCpMM 嶻XjĎ (b,B!ގ;u,b}Gti'h)x&݊_Í8|69l7X-ғcG.D$q J;ش4F~{|$qrV{"<:{B j> _4?Xߛ/Ke2I<O*B@67:Qs`b_[AU`Ďi0cQp#Q"{<^q6bEqsUhzҼJaX9%_MqdBB9V C70eH:$&źIԻȷCSa8Ӿ܌_ma rwTO&Ei RͤuKC9JnK1}W@lbvr|g׊,oRl Jɧ*AipUq?S,ۜ $?Mw u-WF@efyj 3K2R[VXQHZ, oN5XM-'za0y?R ϯPTFʟ/H =3)pe_THNQ cD#;}m yU t|ݖ| ^l+}+ZHjBLDYE86I)9E$9֦Dfpfud{Yd/[rL[6=L:晡ց'ig<@?DÎt^at Ȩ+ZfO4dD$` c?o6r8f\-6olEcGI`1PU5n Lm@(l7 -GUh2v )tJ9>l dj|C1joI'dף@`Rtmrx료`e`bok;4f<-U8_Lrwߧ0sq,ݑ73K(fȩ+]ﮅ4ts%/δ aL1_v1>M@6cQ#6b:/誺gK==?NFj'$@%zO?-@`:еV@ p*0IkxY*) 9E\:9UkLlF]r49}N?wALz]0&.eB}d΂n8z w"Ov{(]LLB Cxè w.;1kLn<ַ`v]o 0?@,Π<稝Y@~r'ɃnxΔl:xo*@m2~Jeԇys̡IoAT륿!HjΞsJ/qpl甸Ǝ8}5L>ٷ+J獋pK=e1vǵ&6Pڝ( lDx lKZly//e cفHihf{~Z }I!αx; 1JK 0"F/I/ mx]iH!tYD,y֩$Ñ:47sҒ2d(8oLgrg7:Mq5Ƃ%|EGn u5KeCֽ}q2wL]& n*8KUx=Nc&)Piо=LD"$f$&B@%9Grhd]_vc(w< oa ]/7JTo0J:ZHlt+&qi8Qj-UG^ux9z/ rmW&px5)e0^WDL+$KZn0 F̩6 4(E8 }r/5ŶL($)Ʉ1JV*/q8{Μ*뜋ԭC<"/NP Ѹ2ꎢpUǩ<8+H~1>vqQf` ^ɔD$UX+Y` Q{!d*/PYfhrj5<3׳,C*a)m~zX?a[6Pb# pi(ӊѥP?m;ͦЙ_ V8"Ş ccBEltK Յ7Ji6"nvBIO%`\ v 9רuj3Eb6&Dj`o%@89l])MPGKp9 ,_j?byH łIlLH#MH5SOAa/_ /{xK3beYщ?ix<ǰ cڶ)fSKK*K i5H,t&GŹ%~eZL^ЖftNZtu (7^ aέW;myW^c`T 1DgWj_높WZ# Rv>̜Py9gۊ~ 6 LJ[ZJ-[7P͵?OL{M+L%/iF=zB(_Ab_>h `헎IoDjy+)!]|lzrNOgbas& O,&LfaܗG[{}ؑ%^Q@H9ĢjkGϖ}XWAInWh=3e-"muNќ2C/79R.ȧ_χ .7sS^KU{>Ǯu*ņd[7p?YR!24 (W\q^ SQێ߸6oӔ}[xN(B+%kșAld= Erb-r 0|%/EBŭ|4s7y%UkBy<(TMEl" 2tBD~9iKS #59\p\B Ƅ|2EJ^ƺT5&a}GV98|k0n>EoUMqy}JKbk^e=Y<95rLG~0?[CcbNػLJ1 ^%9*gM4 X sQj2.Jj!-XgVk'( |:yp?p_b{8o  Hs2AVm 1dhihtui)̀"8\,qwX*C㶪W;nUyCr8@ql>m"U?6)QBqTGkzDR7eA#Z|j趏Cftg3ß]?PK6T oJ hp7*Vr3 JAnqy'lZO-qY|sRcUϭKqǫK^qZQ,?ڋ9h)`Bb8 h.P #wshxɱg2Zg2`K:JgHZz Otj1_YK w';C /BNYu]=gpƗ˒}A]PLx dbֻy(C]ƷqPtٗpp|8lN|f8 $wM9xB {ΐC]||%)/ɯ?#}% Rͣ+ ٺ5Ѻtۺl)Tp+Y+׈Ӡ͸0ىT}Nggj:\ .T(RIg,UX?@!xT$(|fۍ_RQ;>:"wC:$ qFoed~=FǢԤ8Jp)Ū|] -E!j6^89_}`l(%%5!؞(*f<Ӳ)E6&Oܜ[!r T?Y#1 Jġ8lҫ\5 @ 1ۤaG ݠhFeselW@@ڸSyfoaN .hɕ.ǝ_Zqtm%|oznx>ỗDs^ ~g~[=ierbepHd?aB^Y2VBb O']nJ,qqhBD\n?6FA ÑZq@D d@7`4Fޙ5`FV'Es9I F o\/p9<8t Z'?.2~ ͚P0Z[d2-?,Jhp 8=:EaHQqua BU=4z^L}}]+lJkdV_GWM&= ☖~l2 d\F@MצnհkzWtYOYAń v A44_^;G vl][W_z_L*Dc:EWߜU2nTC24*8~-}G)U ZEZrXa /#"t2 dă6-ObmnCNBL45br=ʳN`a=fn~`ݏmmDikŮl2Zf#oP$h\O:B % ҩfR~!ۢS,݋7jg-/9XNl|z@bimʥGy?a騏 }ˌlMMQC] զX s!dYu *-$`_~gcIj28~1z33VH{i7ː{T\wdv:X.]g0 h=fxAH/31W =}vYG"}ϪL~ ]ilrZ*#b44N報jhȽ˓K>Lf>euX67Q$Ѱ0?"{]T ߝ [w{yM$1ɑٴdf Ҥ~GkL&3SغMyCV8,}I@T{l|RT3sM'=DNk桻7z 5WdI(9lvjrT=@Tx5\\&NrΆ: 2K v;#T*ER7|F"ΚhiJhM V-Xc\ۓznoՃ ܭ$?3kx,VY+| Fet% />8X0{)x~!.o)B.g$As)N)&QʕK?d[̡KFK_A8V("p Pu%`m([vK}"e Vq 1R)3߻ƀE[>]AN@?>|\x seؠM˭'2l`쀸D nY)HJEc{-p*^eaq@åD*s"hA^ܵr[E_;vTʾ/B-kH2::+"1P[uD7{e4'h-or3kb_H,l;b=;߯*O teHW@޵H_ ~( %/!&9Z]܊o'Qp$r~XotֶGYcM=xAKKYހ-0nNw8Ys{xPyf?x!a&OOGX41',,Ec h#_ި{eC1dw$?.Y f:jdrΙTb6d3ux^}\ =4>e Ϧw:-nI&J~>`>9Kp0b-ZJHº8 l2}A/@]c'qhhfSU֢~A̜%夋r /xQrkb)@_:dҮyw&iHcOm*/gb vv#1WǓLilCg)=h'a^NDŃ{- AZ%<"A)jW=7zԳ,'BWcyը_ݫ*xq]s(1д^b*!TFMB[rGUlbRԧ&ǹ׮F9LzęꦗZ·̡#Xwy'~O -K `mt-ׁOQL! Thы-k}k^^[gu;{8gv8>Z?ß ɮBf+2>g4xIS6~ڇv=65'1w'i 5E/CYE|.:rS0@fpS,5W2xp5U)2:-lF/4Bt$̈O b+ddhb}{fQh<`aIDNMBI\o;af^+⑘|46=s0SI'(I>@gOP6k-pjPR;, 1u^8t#2)ͼ'FQ"mV8CbBN~)ox%Rwhu"~߹&K_ޯ4x̋a☝) kc_rC,~xY`TI<%溬ZK(clR.al͗(aط؅K űL+ u${T7L:Z j@ZZq8u f0T<.=;x}w|h9 DAO[WC`Lx{w]\@eѾd|I.P)* =:{UEBØ" ?NoxF˖SI|oC[a;e@b[P/״[8.Bhv 03]b~M7oPCaUh,ǁK.g83KIm^&Y!CF){)Eo4/`1νn{O1OQfma@%ή Չ C88y :"sٍWL{ +[E0l>T+6r+m5YJ9eLF EV试 m۷CGmk.Z@E>3eNꑹ(!]E:0y힅D~Eme^ĵ2QL$5}H4C%4 RRj۬~cCE* К(5r5gpD#'NJKXB,^)S yn ?^H)6Z?_rFg"HU<+c-fX y@0]F>t|ֹ+,Ks̚2p-uZ;Ӷ){8>zwkdHku>͊ȆiuL86??ݲ.1~:v,{Gzqh 9#59ymqvfn6uF/.0nNփtL֌ 갼&P1J[9I m~`_l^yܢ7>8 {j'k64RaJ^+hm9٠`,X[5L^y$W2 wZQGFaQJ# MJad[vQޗlZ~=zya>! dkCT~5n41NLy~rzvIU?oCWw鼎]!Ns'RRDn&(G(SRBDB>|Oxȥh(5N r!:}At3ȶ6^UK|{oX{&Zj S8}vܧg0)C_@03BR\j] ҃]Va8n:Hc.t^>Q!zCj*zi8QDŽȈJ8¿ $ͭu'YYZG(Gid(ONjDY}>!n|t?L,-%PDm+}jI,:tyyr !8LT&޶B7TS0B_t6}IZ^{t7&FPn`dn{O"'Tw+|( _ۍ4meBE /^d()Gp8 A6A?nlP=SVOYݾϴ]`&#R  07ah v{&`7sd>$b9T ׯ+.YZ=u9*b~cHI>)?$0Ncr%#$.&BaCBX%ۊk m {:[=r֚U<^|9sռmagi<:>؟O6ΗMppz-k /$mҁ܂XHK]{V(yǃ'k:–ۑ]}MlܦMO{2,=)9imG(h.N&r|5mafHt|Gvu |> ?Ғls{w>Z{Jp<5ť?f`E{05{ML 0Y˪n04[JC G||o\Ù1=i+ۑ:2 b>-mC!`; 6Bt0'PT6>H(3C=AЇ>zK#ڢ3Ҟ^tG4Gw`]ZrD̪؟VĒ&OuGQv~ۥ,.#qMV.c/(O=N G`SrVߣϨ#P'.E_c7KyctcMQMpzr:FV਎og8KyJįw;"'+uTnĪO@6RoD=W|VO32V#C×: i1Kù@M]jܛe9[fH&[]gLڭ[0Wl2gn'c]r5^ۇQ Ʈ]۷y8|H`G͡VENW$RHL \zW*J5d5e}Ȩ:h&]ZrVDa_4l)ǴE[v-@+डۤaMEvK}/Ф8 l#+De{ۓy!q4=v!"aM|Hq$__GEs,Y|FG*tlq6+_?[%|3$UNA(5Gp)uu=#XDju9@ym+]H0): Zkk\@dՐG7wi rg) ڊg:ujTT9oF:(@p&=%$,߀ go` Ԍ(@]%t[%'I3~ arsHF$ΰ8:bՄTb=c:R&mZ6&MӰ_t!BgN mhYC@ 5*F%bbİ+5&dT?;$Jaqzb"@8E&)l'C2efmm&l%0tUhLH,f]g4nT>56>۰Td-#-wv;t(};ިtsay8gD-xNN{H.e -택s`tgk.Sn_lgũΩonL4-$o䣗AgUjzs[ BaTѸm^8n:)wIX;,CӁ?kZkp+t_c|oKsz9D`E{x0Ƥ`E;)?5JvQA(GN iN l;^sJDyOcꑢ Z"Ԏev)$Ԫϣj&oUM&6'[w^/bǗ-x;I0|t$o@ATmnēj<[:Z XVR_%V^I] F6a סnq,(/& \E[;drz`T]B:`Ka's-o#-UAGt: %[Ks&CQVǼY#j\2th^~wL.ƛ*3_6z2bcA)+Hwh9FhFw9XT"Xw~2x88Gٽ e;Ԧ $U'Jv1r!B  r.f' {eQ}y]tm պ~"QM \btÿDJ=oT 5?fY$~疡X)kYoɺJMWиH͝݋Z/܀ϵMm,fݯrD3JAuM ?՗Q@%\v ߍP̿͛Ac6W~Tv3d%/%<6 V޳!jhs@Rt/>WǛ4'm޾gI7L?D_- ?]+u_Z/6Yv>2:lLzʻ2㎤b`".yڤ5%nWqdk!BK~q6hF쑵n9nIJEl[}E=n6S':x$.?kN Tͺí9"+H1N]0KրեgAuYt BYI~w]I~ ;L* 4!~OXi5L}FgM3W1@=> 0J/~@uYG"KJHڹ;a\\BT;~z squ M#AĵWj=O<a(+ ? jlHP^54czul= A;>p_d< Q:UcFw )؅}`F8BHFϚ3 GHlx26 7ʡ3D^.d0!<γ2KOkS)oƦoKA<)U;A(c P>g>Eͫ=Nh82} b.7 eJ44?Ѝf: gɧfp)kjXآ*-gluRT&A -+\MiyM H~l )|rlr۲6KQ0$q_]Md| =+D<:e8np_-@H ;8G)ECwpg 6;~Y>4'iػ5N_hQjrM~:ch9RUTA뭞:oX<ݹ8\36/jmq,,1GdّހL U9mgQ'=tI$DSX gϑ/@DWߕrb_[c 4ca䠲Ŕ:rp"_O()܄/U~/[{=؅ߕ̷68v/n,%*}+szJϜY;-!EzQ "p_<~U&`銴!F7W\`PY/ШFA\dg35cEeƓli5O ߫vȀ =]gT33ChʵЋFtxՌv֌ f kgXuy%; ŢRqРW3ɜJ&(o -Dzߧ32u&Go3%ؤS]N^%leuI~ jsj0CZX7@M2M@!]b?X+bd۴90nJ ܉6]ppG!ۓ=S2a%Hݾ `A> ݯeV;0er #l% IZ%[O/:H많87`cn,Ɓ4tU9 Z,&;k|^!;9Ʈi\/tس;Fn{۫{?VCL) y *C ܈kNAӑdd-1P,1rΑ"( ;!+maxX)8vJ^Wl@>WM5 \֓H ƾPC{%ŝOZxy3(/8~.m\2ݼ@U9dV͙BS kvם-9,oUE# Ѽµs?mrm#^13Y $xf;_wum[\si6CnKC wp DGG9-zUA tj򊚠Zujz+u +md?7fp+ ʮ*B"&anNV0׈0(ȧCb!]a$U yt3Zײ;8y2aNy# /j!iR/n6b\'*z#o]ejºҨnR48?)^dWA<$ϊ pB62a&*8=#ױR} ^%z#ݒ"ܦcLd6 }?'sΞE7e: .VԁHK Fh3Uw1D4dZ;Ӎ[V#zT,ŷ~蟳?}u1j:ЮDk:8]h0ZWx{;#hDHo6qL +Mh8]4Dng+NNĜ ,6`y^I.^@ڋĕfzܯE1iLνѠXTA0dr_L >Xn둧8v%: LB.|$_wx/ gs@$񼛜96S9aD5; \H䦵lTB\kA|TŴ4h]!C24%f<>M76%yE [KA͹e#mXf3AJ,My--1jo{L j5Rb#L΅tMC8g|qђP JDI>[k"]{c}L vn[,eqV_ʮXlLټsfF"',(F03-afqulҤl*ڼfaQxh(`(<hAJ[>bs8 ,~0`WŰY<u# 9  "}O[!7j{V<2P>ݼ-$hq!%3֯7sꄉ7 Dx\1켮u#CӾGyŜtXe[al/> lS1`ޝK^OP}ޓ5y^Rru?3'fmwjΐ-D+1D3ȣ2oi .?\KyCX hl$P!OsumR5*(K rց >"MS4+rwc;eb."8)ɩ^ZxE Dџe.s$Iqp.=}YniUd]z ̚!S>rA]ATLުbϬ5r?bE%#&߾ٿrR+/tܦn9 FO9B׫p|ާiIa цRT9=M:DF`,p>A1܊%c:M1U?]4ddeFA>C8gE.A{Mdwo~2cCM0]Scr!^e JsZ!JrKlXvO#%fB*6*/ @NuIh šf5OU?bU}0;o,|9KTPIsadHS%i[BC-m^\Ctˈf 3f8l` CuReOR#確=Xt8b.)A14/dsL×p 6_IiECLB7אYaH95ϷᶏpǡǮs  dz_VĄ=YJn8RN[+7RJk5j?l,\J{C0]"#btFƈgXMޱ,Fψ1F PDY$EVqb8tbٔ$}_AӸW4k5Ӌ|b۩pӇ;Nj (̄ %.ߒB]>Rsڦ-KvXBC^31JS*IHgYDU:I-!{ a3MٍaUD%B0l3^p?-@&…i{-E'ʓG 1j?,$4vCjlgAxn5ôyU6JB|.I#@TI/j.AΆ*1DňO!S FY;.>D+)rjcq?QPU۱~c'm91y'PIʷBTX,M]/+̨"YdGז-_9!g4YD!L<[񗯴L8iue+)}%^(߉ZNo¹FVG<VxVc9?ѫ"-߻R% 5_> >pr _M SƯI A2{`m6>% VȬ V lMNOyTaNA5- WܞZ'hq|?xcڏBA{#H\löPvQPt$IZErM9Xƨчݟ]B1=aJOE3gɖUgl{){ۯXKS%~rgmEl[eh|vk۔t;R@U.*͵x*A9/O;:~8^-8nTS9>e fW@ShI1t!FVTBo0F-{hǁdبTyj/28v^Wϩ3~U2r9A-rJuү!tM?hb%%ul0iU +[)$c(gM'}< v(Yi7nLk .pEP+KfgkѰ{ Z ,P<݊un̝KfT+0+wVDOZ'N>BYTXBUG@-6Hp5A(g EU|'V p-B4@=pcto*nDB-b&!M= !-7,Da8Hl,piM+W|C7B::ahͣ[0EkT7qHu lcSqeRe`m jK"SѾqm?T8> &AeV®fo<#iDŽY #lKn]nPq*X/C<@sҙH|({C= ] Rb0 _m{PneN6s'jXhUS; &.a2jc"t՚: r-ăS"ߑU3ll˖jZesȮMHkbgZD~c?,>?aSFBb8}Dc~PS{O x|ሲ#@rI)ܾhJPp3/*曭2-|79/ WG *m0CyZ"bBÊpq<"O᧨8Uo" ;gBDG@qi(/?hVKÛ1Q(gb<$%R]\B 71aX.,gHȢ(`7{ 0q1 ~l*60kAU:#BA؋{ݯ7x9Hxu&ߝ8xz\)dhl!#韁ieIgI֏cNlj'ذ/yhpTDbYa_lv\]<@=p;`P8)*9Uz^>ouS08R)?3j/r IIs0 ] IbJ4r39{Rs HBaj繋JaL ܲ.H=!Yŗ|+oc7A,a5P@WJN^lr"I!Pq(,q2B8BAL@䪃9W\v׆ah/pwыx!>xr/L]'Tdp@4}TxHKڙ41XZSWBWB#)܇qMAz7ggf*f*RZ7SHׇ8VR!ڨn["$rJ+U'jəXa2672_}Y;X-ֿ!f, PE Cy8)(![u@J#D>^{"c.5ӫgj"Q'R :GCilkÓpЛPe*\f &2.-ʣ=b-p`"&T$(K c2ٿx]=$>bVH5]b^k}4ՈРtۺ5@*1>`Ozry( *|PA sӨåf瘌Yq/&'JO e.{B`QCAnc^}-ߋMu4ţu(vxTƯqd!+t:U mYE>Λ6wLhb A_Roww-ː0#MkJi fj r"AQЙB븀R`,, a'iJu1X>bViR8 3r˿ "/u\Up[H15nMSgh5k$wMNƝM:3vVK+H)BBX˔0I䌳݆%5%zeISGI,5HF7lqMZL]8ßBj]cre2I͞X4K\xPz4T!AnPrcs *K_'@|kڰ ?؛#6 Q&h"z%]@gGƵaG~ae\CZTh _oZc'reqHnT_ Ump̵x3#1gq ; k;ZDtYrR )^pl9iI90 Es"5k{/3ab:> ^s)R7C׿` Er] #r<*F>g3|yaWs[y"~8W(?+ĨEHgmbN|Pm/cr^ȊAۥ5r  88]QBNe\bW)Ϟbv іS+Dyw)tPXExj[::t僧k|W~(̳ \&6BhU2kalNm0 <L/~R0 ւ/eSRQ鶖`(o!u)װzO,Ly>q3u9KDev&K *x8J ,AHDו57 zka à 4uGM5 3 Pa )_L,`i[M=V-UғK8onuȵK`܃vn/&$V _qv% zjt]LBɓM8P:evYĊboGe9l]^SKUp85w17os'T hňفweA"V7<ֳٝ &Ћ1ET(М#ZL=Dǚ-L6|E>fT'ٌef!af<3*UT<ΆLF ^ۛX.^Al;1EDѿ`w8+>2|ڒ~y:mu! 4Q̛}-/Z7,<(>vٵ[6)&x'b^ޮ@E_@">Nbƚt{*ka_F܊e9d0 i]{2 \RBEռX !󍻜2ؿźHxt+ (phpDN0L!D;{!%.ƒRCڢcGz]dEZK?YrM Q#m0bR^IMI" SU@"c0qM$c#/1m]C{`zm2pBluJ=8h?QhbF[S*BcP]Lq ]Ȯܰo > F ?Gkyь CylG4$I!@Fr]OQȋ\}jN0聓ouq6o7(0کA~HB C?$:z/SЗҪ}#y0a6:|oA^GZq euXU1:! b 3>wUiE:{wq+f+(ӆZ5+r[.44 Źe6=YE!d –TT;>Ȧq lέ\G}c_:½bciv%qXR ˄I)I#S!31|㖳KV(V ʒDg-Q"ԋ Ѭ7!.-P? :*D[(yH"{ȗb~*M:l!QG(GImN z>"9ݏȌIm;O:&^|ew9.~,faeliȃ%'g^0 Nwѓ|31$StXŌ@d议Ps DsI%0?v!g֔ݹ*N١w32c״O{- %ey&kPFU^<1!S٠F^mԎ;-ؘhD %}n4lq-s;·э:fϼ?]㗄́EP qnhz%Ch$Q=t{Sʕ8u|`YCWN%hĦRds`f66 WVfvN˜UK/.:YKy{.M/2:c->~G|xN$ٌ0o$>DIy&1}5û#UeĚJ@$XXf8B3rhhjq^ F:~&T+Y|Cvs1,Lz@c-C`>7|vi6+k(ys s1^Ad?ʗRL ?fbrp @Gu=Y7Ny$?uz@3 o 1c{(Â. 1Al Cؘ>CXXT.hekm?ul _Μ 0d&IwgP&{T1Z&q9*:yqvqFڼ%!s9d1)& 8tK?8U2jO~qG33@d’3F`0RYv*N=  X/๎~?gG.s׍œcLAlt_jr-hH2~B(X:Mz~.Ŗ}41@̲;C RpR0 C5Ҁ,aF(~WP%BCr WA9s)AG16&¶6q;eljat!PEWB1]C~: Z>܇5:ˑPO{]5Y8ץ82@Ig׎ *TRN3",~gtdvA4iY v׳RakK.Bx,.,=h_R a";si7AJAq?ҡsv;Uy)4C2Sd,x|+A 7S֎-H;z|1=/Ů {R?&WǎV Cݶx&G(&BVƑ7a[ 3HdK,"Q6 m:mwtD5JӅD6mIj NFG&>ׄ|A&sj5-R O& T8_BɆ/+4RPKSZ8$Mg>4e9Vp#!R0εTM:; m4 OnV?L :JҫlS7bfDKx<]c dE:܆,}T"uvSWV`M  ,E{0Eѭ]Eqqti͒W|30D 0FEeH36pV$]JjhtZd_=}d+ǘbmf~w1kJ;2A)pej5$BnOKea^nF,+:dX s)y:rkgxLPrQ4*4'=:Nhq'~X(`LG¾|_ۍ;ܦqZ`a}r~rO0⭏ , ;P-ԕ0~;%'+ap TE缭jokR"qT+adڃ޿d3mDH٥0);;;ysHc־il+ist^AkTKƲ #5jjx Apַ>2k3?ti]Ǝ[8չTH0 /b53ksI 0r-`Fو F+}cGi˧Xd1hU,^EGewDhi++ D*j?xp4ˏU{LO?잃(42;** m.%oa` E`^ˆ1}2 q]AM: #|i3&i˒msUrHݘ]F7YLT,#!y;992 9p=Ȅ+3 tSc]D9E狹hO쭑Gk|*!FyBkOvb8\UdvpG#\Hm%r=T(%5m @2]`+N"2}XK6N£M|O^^+ 4•3#ޟsVo|[0rFjaX)~gPkw8 I= 4gXiR~Lxu(:$}Oؔ A/(.Ejr䐲ڰҗ قP?qǰky[dmDxEܾG $VjNPp"RU<#m:S$dB=vJ=_)zMo @@ +\:@րgGZ2m|=`)d\ #dg&k VD_4$텬zz<9)i+x2FNuV3'9SjifA ^AF biN_; YYZ`Pْ=?sF@D"vFش8Ao/N]aaEQR&M61&M㙼ԒccRɱ?2d#(5ˊ>)3,rv3VLnWCsc_UtmJ;]3k*\_ :HɢcPj.@"(WB+,l"s#MM3o[hzmf̌EWN%)mkψ{:ZV0OVI$N8t"ڧ0RDvuVvT˺?0;2V㭽 Q+~^/O玖XqDh'8y;Sp4IX`o#&BS7ߜ9{hgQt[PV vtcfO\Lo!@BDڄ.) [T ȷ+=SPGGl֠ hQsDC0DF*0Qx#9q:,rɒ`Az0cفE[4Gw*+-,ew jݛIzVVe{2̚%K6[@IB8%t\0*mktJ^ֱ|$(QCmP} ^V\|H#pEؾ9Bkݥ{Bņ9GS|s_YdnᨼE7"r//!i4jJJ6QXgVQZ!\W Ϣsk%3Hh!NǽU?WIXxy idݟ\s,qEDCmV@??qOO!iKsOc[Y0]kNI_pKNɶpMBgԑY})_(QUAk<{L|Bqhǥ#eKP`5fpy1s"Oi5*R_yQPfSgjqu1禜 dݒY*q僱Ui8}.n7SP[X xJLX0]EQu[qۣ-%Sh~)Eƨ:%tZɬnU8x.w+Cc# ~_l`hxy΄`MciH_/ُ! '`4sɻUT SDNqvZl iˍ.*sD/ ;-QK6wWgEee#c4Qp+ohf<+#չ#}*2X1899iX *Z@sFqcՈZ ;/ES'D=~*ݸ4[Z`CǛHi_Y[>40ALջ0]<$^7hsb`= (xCQ21d eibB3 lp񴪲:>:7rȔFl/%<-G(;y`LeHu X<e|&\Yu'۟Ӝ"pi1=\l[GsڕVpݩj]|fʼn٣=3ӃdTWˤz{v v?P2y38H|K+i:nh ®3l$Z1RGA\?!fe6 €ϖu$@ lk=]0:H'"'^x#,,}o8Nv /$(ębZ!0rR~ p}ցOUK7a X2.kޛߪb в S'bAc:SA⍐.s"8|E1;轌hսʬڹyW5OWK>h۷#FrP*e_DkkJ7PIjl}8>TR[ioN +csAľ#爦xnɆdoQvўBtu`EۧmH.r·ܛQK (`Df H)2Jc-2ud.]Fc*oLdWZ_#g4gߓ9&(txP, V=hyabCNlqn

P\2 (BTP+Îc5zUWf-c~_#*cS6',s$kvw)wseN{HIӢηi3:BJl?( ҐɹmL\4fv5= Le`sA=@eU)5ҧ{2 ofP}ݎb$ď3@#p]J RnG' c$,7X8{8BEiCT! T| >zO8l'b_tIұNxVsFka}&2~24?S6OX @zqpfMʯ=1%kUu9]h{ 2COaղMFYnE~U^:'^6,qzQYy樈/ eT#{e6zq07D!pӷ6؎Hݐ%4%֜xrȈtxC߲R7ːx,:sD{G t܄BjQ8:o :j!Bhx—Y~S[SC|QCi8h0BM.W(sTʂÓ"HkАne+>}9gʺnc2}6-dgNcppiDbNX *;<<{++X0xǕMwys{o3mAѩǕz ;j ÛNOTB?$Zdi⸜-߄4 R՞ג#h~%gZ̟/0k&/8@{BUDJaf xX| u'8j"X}S"[:ײ;8Xu߱'Y;/' #.vK  1`VpWxECH5_|~@{L|,v 5 i4@Ű,Dτ< z~]BRAHYƭ*('xG#VqXgE}Lٚ ?1Ƥƨvaa:dR~ۢ;/:mc@h.SڜaX.]vLG9fK>X #2iD#!C Ve-[_p6Sam]k(L)bIfg. oYl&'g2'2(_Gnp䎽#Rg5E3L\1!tҕGTuAJLW_VO2˨nHuHsή{&A"XQfksA&(V2O,˜em'E&{;osf{AX=`v*;T"/g$-doRpc(ܵW83^vW&KIۦN mщea' mrx);@?PA] =#TG5Rq}hrr:F&%Ri(_la{";>&Gsw)}I/rL$@ \8}Z qz9]-V rL;|4ak4~keeʡb֡Ο늊*}ҷ&vqSO(/qsz0]ʾ3kvp<ƕPMU:NzrjZq]gGF6[&Ֆ$@sQ7NbSi=e[z?,lۢO,J.WL=zv4Uaa#&hQ)*6ٟz)^IQt=TBkQl/zm[AM{Ͱf'6΁ZRVUgLK)-p[l"5Lk_?^snEZ&Y [/`>I0%ү# 9{\CGK2 .#;mLmXKV zjAR.x <3 UwwWcMȿ<:>كcBlTgA2[#G~I {Эɏ+ a|.MR꛵2bi+_Zų8X!{-e&80bdb" '/ Xm UuVDŽJxMzz_xXН%"DpKYV p=c%n6kÇ'Ult S}\v#6f<;yr$d0"ynw+`ʭ^(xch~Wyj?nzRk=YstZ" mq" F/S=퓶H0i(NcECsJcuVPp%[ ! W?!\;הc~Y I/m3@5m)>htxA;Z[~4~طdk?<Xܞk5}bh^ŧE-K;0>1Ig9(nx~5C+$O`=E#}|y?85Cl1ǎw:9RڒB EIyUQ7`?Z[%= ѰBo]o%dlhƄ&WLNwȑLK\.%Fp2햼Wid _8Cm,TڹB;@x8 R«#U}$ŮB)^dѝ z@xZ E^T38wjQ|+Z|ǚVPy VX;gg9ܮڌ){](u*a:\pBQ h\br;g}DԳkB=En RlhQODpƿG/xs^o@R&n{lPׅgعȂPlBu[ٖ`qw9tg6{}ڂ]lbndtZ۶鬕xvH2IIQ]![.IYgޛ6G+yV͢3O$ٙAt l QPm T:(L0"|=ht+6We݌f̜4.IV GCrނ*]v*f>6+ __=0ЩŽsϋ({sCj1NO|K|CGAIpS3Sڴ82dќc%2l TKˡqTE;.Rʾ;4 gok΁#-UV > "Ї<}6lIo}ڗ6G L+}BQ>/lI||\OdȩY+!!O 섭bZ,.:G׉[Ke6gb086o3<*%`=jdݕ'!yq7׵(Bp)/̄Ҭ"C1Jt.xL9t9lVrr+%h_&wN5X[KEޟ%c%Arpl\ #[ŷu~6l/FF׫sWeI*w=>ar`םZl U񫟋(,7ד9 N;٪*- /yZe*1ciqؤg~sV%yԖgf5"WeܫeCD,B=~-r2IRΥq`PUE-[La7{so؛*PIfβF:+*ᶽc"c .7g۱+7UkUlWvrC b8>G7vEApVm)#`bAI0x{J<\4*B صTM9fKT׿(UmzG4p $)Ȅ4ZJ/WzHD{<)V\ŵ $95M2UTd܋wl]PnTC!Cy(߈AM<'HCjl,0?>A.g861ȴ\ 7dBz7qGS-;=uWҽQ[w}&\]Jf~b,c@+#@A`ߍl -`@NK!w^yJ+9?61㨧 yՊ9_wPioeF64sL @M0F" =A Lj뿫82p*R-|AϟP az^j5S3DD]s&nG/#MKW]լsX',ЋFo HQYdسM88|7e0sz}DaVs.>\I&SƪcZ+}2AUc%e3k.|t P`Ek#)LdPY^/{RqPq&`n,AŇb8:@~Ҭ;QS Gt?E \Q n6oBڭ +,XhezZȸ|M]oa`WB7L|ĩÞ<`!yGG J2;~3/3AW9g x^A/[!s͹W٭ө7D/{ikq!_ u@k .8\L"=C6qf$U .S>A*To R'ѡCU5cAߦ 1n60l(rw ߕM)/OJ7>#cr+/DOn\nWh%^VŶٴwW8{wφPOl+l՟-totGO)%%l@tp֛r94VKX_&k f)bAq NtB: ޓe/ 2LgY>rv4),ROV}|4\'OČ -rcԍXsobpe֍ZG< E{42K(K#Y:M:ޒ@*{l>;":@b"=n |*9`|A|CB 8caJ$} gtwšu0xجub pPI w_„j0[1qa?00ܷ>M4C[Hk?$!tD0|щDc!83~6xc/üO♖bx23FМ^1;rrX^j28 J%I+14F9 ]BUH$Q& ]\Vu:(ҫwS'-J=i$Sc||0[؞o tKg`뾍L=&u f* =[SEO_v2>8걐Ҵtx+>zh聸zNdP6 9Yo%! _E`L, c2u"<Ξ :Q'K~mm lA&=ߡJVq3lH||gFLO_K)~Vʈ$R*E@YN f,0]8>Ѷ+?V*4~ u9E@H<Gs"'v 3B7XH6v05[v,$[L'ҋ}fQsN(oD~>F\KGf`n s+l*؊c%,2oiw,SخH5cs,dH):R]PHt(M 1>bsbW lMI=\\ p233mH[&}5ZylK)CQqKto"Oʋ3%+P_ZF Cb7 &Ѥ}StKG85>=b=Q젍BĽMR/E$7 !/վ+ %|&c Mb'^j,l*}(vi3^}UL+}д-[/|k\&J/2=<NjXxxj֩IxI% (?zRWQ!Aia񬷺)Sϧh*ua'M_$cX?s5@`Sj VHSS[йt]0PqUqǭMVh{qգ4kn-%y=Zd2~xLK,g(LH.8 Pqi=@Lu/ㆽ)?7>Ҹ{L]EF(ԝ GCZeaѿq/^"HrJ̴v-Ɍz#c4)ڎ0R#{",%ڃ'Q!@V 'ҽ[w⊯2 `>(9K5f=x9Q >0쏮\ Үst&S.'- !?ZBo ״5YiohxL֝6K`M$O,2X&$ rzG<`9AK2 (|z ұ;@]km$y<`؂AX7?,i^cV 7#&C`,75&zrcqdX܅8hӌ{|N&DeSB{" 1!$s{ j*a5svQIf\B ñ6UQZZZۇ*턮$(\HDPBrFtѾ3?/B/]U$14SK+nh1.b 5^ Q-Δ;2b;Ϩ;DZ{2v>|w7gg#}ԟ+.x&![^P8:x)R֍lLIw7][س9wV)3ᓾfh^ugY?BmrkO,4h 9wi7AefungT_!9AMgVbAKP| Y4x53&hI/,l ( s$%W~~m" L:y:L3ɶc\48a^4)@8OR 09wb p jg0/yN o)<OI ba0O5+sGտ"˭ RrLM[ i. lE/7D;oDH[Li ijWSYSo4a.8 D6a%ܚނB=uW€D*Z{"SR(8|۷+y!|B,\g1?n2>HۖbMbEۡ+ PkX}x XDWGؿ 23B=ݞݜ7QD^~S69H%Xis w-L/CkޝqV+|5}D$ДNGC!(G]D1UEn= 3ǎ$/L7l3рoVip]g|L Qan|smȅ30Z$,@.7 kdk_ߞlyыZOD:qTc+ z~ֲjWB|qp TJ=- 4{oh{ KI"-N.L@^ B6uZcV$uK![蚩X(:K5D3}@qWzn7 L!y{.¤qtm:dU}'ɯ47w̭ԃD]&2hFѷ3Y=|$~>f(>tAm;Wk"'TRs$ lc, J`jY@[| Nlىa5" $b-(qȘ5MI$(Wa ?#0 ca\L}.PQ2Qꉱ $hYpL4! B x&: eܩ NWQKtXp7aHRP,שn~Waw8 j} ?3hX4[.Pzyv9m2RLGF\a$(W% R撮xrgs1CnWE.Ӛ[4[I?`O⩟HE_!oS l2\9zᩴk~)+=4ޤ =cEcn\- +ѡrX)m`cwG ?[1hH+b@Gbpx1v^NשJBoѝmoS~Gm?0;Ѝ6UoPӡGkbgj,=Paq7hdUya}﨧9Q쪞:m c]8rFbbl𐓖pO=ٌ11D2O\Ï&mDvUZCSTY!%@ rwH*hS=2& SdZ$~!H14QSs} -y J D W՗-[`yYYw90 -y MU6rF(Y'xOXS]X;0 MWsF ;V麡Y/#tP죶PLcxzw#o8|T/>ᆟwǟR7H+bjI)?q$=oݝOL/n_ N]d 0e[OS#J@}vʗ^ =TdW]A$PkF^\~'ev2Cv/VRA!(NQ2&@(?Q_gZ7*Nn~ϹDawij$ 90Suh 㠉:/$ wc0  Tk{%G ]stDءa0X;U5qa}N{n4C`L!G0}|\?{HO[[aۀoQd @>0BA8ٳ)kqgY=UwR) TG2X3&e]@h9mC%NE*P f~P41tU{\òDda~Ry3௃lW^=yݖGK=6VߖC>~uhu!7Zձ/Y2~ƣԈ > mm1HljkWԣ9Fng[6,͖('uA S ,pzo 9Une`LVD|I^Ig_U?A%u!}<Ѽ x,oc <&zJwB%y>z4'1v]R4}u XQPI 5-ς,GQQ9lZvyCշ^_$~ 괷{~ܯ3V-lUgTnRSܳinvib.$r@MM3xۛ(gѸY8y;IX *E ǥDvEW{v⺌|X}wMwMӒ*e2).'PM|q S5Lj ~A>+:s4Z6U  @G#}]yYBrQʬdn ̈́Pb@x1)OGG1۞-WYEcL s2W|.yk}$g cf CqR]*g*!z("o;OQL_%̫Qz~c;u n kLQ~ :w(ZqOT7%ShX;ZInJ#7p_ 0F8僲3 #=zR_;$jYTZ--q4|l*5I#OCQ f?D03 B̴u` w%R,x 7[+',zӳr(υX!0<' ,l"j*lP?ܗtv BoO51 {+iqW-s˳yUcCd ~| ~R=SmW`D0[;vv$(X^/OOofFꘄ908Fr*IeRlj WY8')d3_E#nD'v94ZD:C 1ŪVChІ(SG$S!x|a\8Jl">I'!Um#e>\94BGv7T|}C2dӧ/O_d<]9+[]v{() ^ݮ wʼ ]++\)TzfuF p:KL 1cfi-rܙ ~ d }S8@fuphR쓝Ȗ_v#WB(OѨkkl_*B6>5kOMBN$$_ʀΑHyP&_|!eOd+s|OypooIjޘr#:q`o8:_onGBdw̅(CЧ,WU6:%WO'́fz|j- jMv:3Qv3;,ug7:[␏SUmzY^#;$BZ⭆30"dN|b#mODp}bYë j{pn CU{%=M士 46:@ݑlޜD80J}:p{ѡ烞Vg0zJPo|-y,Ӝ%iє[ouB?s$=$4J,`Y 8`eIp̑tX`,QkQZ+$ogP'!kwi;6㿯ḭ8_1d+Kׂ"_yI֘ƫ Sgl;R.xHU0)+= z%ll|Oj^HHU޹m/EfҚun N?xIiQzK 'OшNjhO#mR(081?z)4&fON*D펂*3=<+A~'F"~ir} \1h8;2 ҎOQ t=HѪs\nJcEZ_-ֿ0,jdb6aalM@þ^1Zܲk;Wd~(b \Br=|z/-k!Naji Y礝0~!8apqojO.@4G jq8W4k|,N[2 =N !7f D7k礁;Uð4ʷ5AfΉ_<=/y"ZU+BZ4#e])}3GsO?56א*[Q_>gUQJ+^6x5h #л6u}`۲@͊4,lޓ8UM({%28K]g{+s[L*M7S%Z ӽ0:q$Pi8<_^%K~B(YQʨZ hh1o][M$IŧVy(*߾(!;;6bM}Pcz#"U|țiEms!4' z'9Eo=Gd5Qa[ڣ[pv ;(~vAV$th5sSP&[| |eͲ]ʞRՍU4G57CAwce4 i[c6*3{e?ݹwx&ZIU(?( \0stmO pb1ё}Y^3Ǭ4R;aUO7'cN:.{|bFDl(7Pّan+f^viݝg'3, g[/~|Ot E4l}gA-=s bӎDZ҅ 7ߟJPBDBّq3T;IJ:8:z*M%Nz_pt40`!)XsMC:nH4%Β6 < X FC6 #W/+E9rOKv:ch B0k LٔZ/l!^WM\?ޤ@YYʹ+MAtceE=b@}+hA:9RSS +jy\OBx)v'Tg%f1s@mټ:WPt #o2d"8wXSwdm1 >VЏ\jb? MU[|tNL?a+&-qȟt.{G1_O-sV΢$ 8]|%,E0'c/ʌ]㮘)tz1]KQmyfԱ#"caX\^h9wه LT͠;ٸb%.uNׂY1DxihC4nMq4wb?''»<2K򴨭o16$Ap1^V( _miV(nNeB֑HH+aY"L󿵲ugYn# 7:暝ZhwWr#OeV,C:HY eyBqw1_W^~G?O)Fk(=Ґ!~DN? MVuMQՀ$)Ƕ^2hQ X"w~gEpDh87?[NR=@6om~1񌲬ZNx(܋0Ni(wV@iz?[shOmsȆcncx'$pb>]CrZ줯ev fj|n2y,(+LNkVudA% gŽLx೘ !+.~=VHoz` iL-gVJlŚ(3@ 0 !E\I+v%Ͻ]6EM0RLBɌPڬ,תI},攲%@fHSI%(C%M"(T%ѬV'y;@+-7O^< ,-cf-V;Ȉm|#:rn)}hUf%Ŧ_p4s?!,=tI=U5h ϵ$b4 !KsS0-I=_7W=G:BN|ޓDDV$Ǔ#v]y*b*19'EJSW-ya.BA{wWg=S`MH5tp؈hmnJnpuTCe\Ǫ yK yaӅz7yv?H"Ɣv)<3Woά|AP̭ ~Kq" n*Kմ.rW˶`7Ƕ鳍2}!iCu~%<9AWQ]fJZRbw!VCBhn~Aed3i룛 fj 򐼼ĦYu/70BҔcP ı ӶTfcoPdY>VdXΨ+ɨ› !yn~B*K]*Kis'lLK0i66_YtV]>Άb D^0h/?(zC)g4!ɪ nY"0?OW!stO.A\="ӓ96Utk2)Ц˹a F'jɒEЁ y>wP}TZn?_F ڌ7Dpl!oZq` I'nC?L`x8OPJGz0l:(hiT3|2Yf$3DgegU΅ĩc '&mx:ke \&3dk+])D+x.ĝ o[C(Bʖ8#O$7yT}4F823\oic.2p5DWvy%FVH@Jjj;dv̝8@2L;y5zr}pvCdz~H} $,QX#F+kӬ"-)6QIiOPH*S*bexld$~ҭ杆.v qOlE}}ߩ_ᙕV1.LX%SBfm<TE!&n{nRANգRdB44BYx3B y3AU&Z@ɡƷ= юzbu&xbT$%m ֍ a>00/[K:NfM}}(}W|M 59- c&-K#+f!Qs0+&Y>/#X獜g΢/֯HsT ,;׶W4JJHn48V8XNpnhW0MNW1hWpc̮C\H'! Myc? g. AϺ3_:svS7Skw^_NUټ zIպݙ8q6,(n 17x=.6kXv2$NۅH+Xip!#c Dd`y!^7RbE,: Pe ?A9yqLdzKo>qGeӴŸT~ yG,0s""J!m +P_|ABν{w7s;ŀ;Z -$(Oqg.^-z[^ts+HwdA2vw<.^i[If2g>@;+!G>rT ;qo*0<*u F?8eNzsc"0v7V0$]r`}Uq@[vD[ٖ&+@m]iXPvаxIu ӪAOEy>RMFTihôY[ '@FKEu <ʔM:ie-0Q$K>Ab:$p)gK6UJ3 l6D3;Oؿ.|}fLݮ<8ܒZ-x:D߶=-ei&SKk[mgO=U(4*VNt)UzO9̞AlC'̄{pOYVƃ2q9p:igy8ߐt %9YNdfvndϦ*C$r(fr Ze S _rò:l(IiQ鶾 ~umAu:cЈ?~6љodH e% ao-!G@PaPw,l svïg|ţa-WUYuh^-h^"~ h;m+?,ߎLUĝ݌E;weI\[ka7 PEo̡ӎ Zw>! F*8 A3,-p PX2L5+;)ye&Ym])a$.ۉNP#UbPFA ufP  URE:4-?y%ЋKZJV$CM9C%sBЂxt7󀭌U'psߝfbY鵠";F^8@p]!C&/j-\"c6"l.*@ijiuoY(2*_e L^\VAC'H- 3hr) ^@ԈXb*C" ̟c9o֭km'~+Yu|& k bl~1zXM6nJ;<6ET 9)r:s y_Z@U]Fe0|eE }GwYhrཙ^_3t_, W2w5xU.@("XENR:hbm/lzyj.C+.< 83-Ol]TSLj3X2Pb 7ĿZT4gW 4"K@iMܧ鿗}&h_SZtH8zP/4uk;Qe+@利7m5w;.mx8Bn}]`ahU&Tmrf(#)NEǿS+}i9|5T p4aۘk9)H/F@F=\[WAH? D gMc^ )[U]Kj"+ D;vkWP|uW O0P,h #pBT? U3*=x#*iQa^0 NVqd~"qZ%p@L4@fO` bd$*5XPxd.'x߬UEIdܨnEXԖ)%y` Tb4CE A5zpbO +TMo L F-Yxӳ e vDt;n)`ThTUZ!Sf _:q b5pr`i|Ke zPo,@l S`]h?!<zW%3d,gZmAlG]w{z~*M1Nʠ9־ݔ@dukT snFVL*]0G+=*9qi}RvU8WV6jx$5ǓHSdq6L7fksu"B),sNv49WH0@k!^WEY%ʊudm!Z؁!8Hn!&ei%Xg Jw|E0;tz|$mJD dtthl33(w# f R֛ ?0߻(!u}lWm>(L3ͭc m{" :Ju 0F._(vwh[:~Ol螙n6;VxU!/W dtciD/ь,O3mRܣۦJ0qMt pf!X8 y *L$ vɲt 9ʗIS]"5"|;T!u޹1Dw9uJ@:W^ҊO9LRcZ Vai|.8fعQUIfw+OjfF:tw~)S"g};({a7bF%1|̀F1͈0lfߑz>\O8~.F[a&qN)f` ثg^k|Dw>ƶg b5µV⃈$g\q$tO&.;}`oY L%!vEt,T!K.E>{M`oSUɋN@Ld~Ldz,Ly]cobZ Yce0B YAơnYʵMVt pϩF}Ok\fY|c0TwT緣YY86Σjbgҙ7r.~E4]fRn8}FW~3ΤA+V3Amv"7<*10բ[h M{swQC-EItS}oUϴ h-SZ/~!/_k% ˷>Y~l .ڋFh[r[8uGʹ$1xKh7Σ"t&:S$"K0{nVZ$P W^l7 ٢y[5G*-hΒ?hBX;7=Gmuڿ+05z"ECܿpK^0-z|C{~Z1ɕ)t_86v8`*>|؍{h(Mĩ5ɢ*tGz^1>uۯTkDp'=L5\KpPe\'RɈrTADnu6s "~i{oזhE; 8|~E|z`[S">BS(T&AX |]e }AZXivN^q?o"D}BV5DCQ> @(+O]c:X\(P2ch dZj7R%ː_m8yܻ*PexM)],תT9s#4}ζuVçnv

|:o]|^>+b7D<+\ϟ3hLY]J<º*kEk j2 fJr9_dynU*(ʎQM޲ʭ7o6"SNw&cM-5t|oȌ.U4;kt{f>ȢIWPlDhۣ` (ܘ iIhe{nߩVʲE+I}q`\HJC_Qk#@:C5¾5Lyt8 o+%cl%r(3LaU! *B>4!~ji\?fF !6J+ⷾdmkZ,og;)ܛo^Mm0"hGؠ_˅w?hIG%k/o3w0J ȋX)> |p5B:N^Z@*Y(7gMt`<=Ppi<쾽\u bT !H͜ޫt3yUCAl*{7h]g%`MI'CFA@^)@ ϮL|G6WVF")VF^q#e=c0 (:mzLb#OcLC^?.I3C!d0BW]0.s~vk+}Mzj58ڨkK 8Oq9*jj[yzxխS0'6k [ wN̪(-FJ ح[~ru?I0kegKHmES{Tֻ &5}gbH'6i'az*PeQ1Ao1>̴ED HpBJWm+e ws zRuUE<:ŗlWͬMiWWlm}ԐQײsg5"k_`WCoBO7wAVA" R| NҒ/9'I^>(j^P>:.J  $=v c4|z,9f? PȻ w8(JF ̋?:$ͺA@!K/ŞNX, S+ >蠽.xm'جI&#:3lĽ(AB}6qhF&Rm6\MY˒?CgP=_. {5M!mwEp{|VTA.PCpZKQ,YzLqM avق Y-[87bMiXKӦ Ya8=D2wCu)"R^b6Jh/#˿Ñ i]φd">]6NQ(iƙ5x=4Ѵk >8 /pJӆ[ xT:Gwɳ*s!]CK&5yE;?b m:nY ڑJiG*X\o@\h=L%ݥ__sY_eoU%SZ[8#t9(f(N P` n, H}ǻV ,'Fn_ x5J"*I߲B8lʬ'Qin'kH .ԑfᨴB~bH^Lu-nql!\LaϒϻMa=(Ku#im)"u`!ݍtR. 1J@zZN<H>2N{vjݾli}bnc s MMG}j0u܀X Zm['YvU.r}QQȢW-b7l;" ]?zi]NQ_h;!b=HX7_bs[F-ڱ27[-. M^"5 RzA2jʭh B/ R&oE|;i$Jp_p7gͷ_Y_׬rh.x^A=nuEh(݂DŧmbM);=)=I%4m4O㐻 "`:nrTn (Z4ہA Ijbh)!0`@eQYm5%c4mS;e [= w1' -e!B׏yFiR:S} uiMjizڏAߕ0r[mZPv ?qƾ$u=dE,E0ӹ)Ip+w@cM!qV>O0Ý Y qd9ddL`LwZ<Ѩ|(bxI3UϠ'O7? O3xKӎ~gtg;Tisy24ī){hRY%S5)`c~F'\6;[ dp&+UD*d^(yx,QݬL@E/O/9j.r'j1^D>~28a_biwZ(NsmpcwM'僬B, ,<}I_8\8\`65o@2akt<̾E6=q ]y~TNV: ,Vֆcd$rpǛiF6';?6+ 6GtmӥIk-}_UZp0g m1כ ys]~h*sX.h񽶑G}/x* FM|N ܥ܉SXea9 bj#Yx>)顲7>z5? {ϻS=uXϺ|`x|'W,8 OGeUk]ZǯKT23ǣ XvxG5)Mpmv_q|yd*8{7=SQӊ5O u{6 T]hxw%eA8Ge" ,;h&IBY9fg{ ߖsYobd3B1/¶S{=LriviZH|ѩzLҸm ec&5WX9\#_1ld;bni"pChtz-曷G(gQ(O%P1t j"dEd4" G=nDC&\\HFK]4\*&\E"5(ntM϶xl?L9 WhpI)/{PM$4\LYjpMHs^_"c 0 Z5ܲmH GU+D_jg1{쳼),R̋eCYk+7ϓ(0af95m4NZܣ6V&B8(C9GiO=fվYJr+= #jJ_`h2QbeqDczR)7ucp;TJYc#Ni '~YZ {I~l >Pjef0&U+Gr~EA:%;& LkC#.. !5 ώ+蓻=JEM] ~vv/ħ ?%C/(r=Ohy^Sj] h,TqXVXƠ#~)I%@~>guK]AL)@m)>*!‘;< fV:Ժ9@W' qݜƕ6M@VWxBن|lI΅'#wu  rWA3v]l>j* %>-yˣא+jYDW[`t UsگרT%$14uMO򤚊ƈ~?p!Z(87b{&He% UJ}`urYTvɹKۑKdHfd2sV?K{gs~劀#*K v4OzFv&^" 6?Z}6+'{lZu:nqŶ+hJ'JSoV/̕5eEΏU*mş:x_ܓ mōB#oФ+@XIJ+! qV8u@ov,'/-ƺ끺ϵåhC5{k5IwdGs3@ķ)T'm#)q nvȏge'XN14HU`t{H1&8-8_oIHLneaFMD,ƑRMYq([I|BHjU6G=|w%2Ӿ+U~b9g)L#s=xQU]I0B"V{:C.?I$) X_uF_7E>lv ٺY!Q&J91xHPi?D6Jp,ms*ԧM[8kjq7}nY˭ "|$ dwC|zKq|v ׵T T\qwI lGBAߤhf!lstR*F2U$4_d#R ~ 1OAJ` g9`>XɭaL mGnG 4I!KV{B2q Du5QUiV8S.gWޣ7(n\ڕ$7ɑhVL&=S)˘ R\vo6rk[B{S>ks)a6/mqf cj"{Vg>.֚ jC nU: ʈ o^0 *mG=3:&"v=PD.>X8eB&[JA>x߀/"3ttО|ÛO)SodkE(MB-\xÇ]&ȯ(d3*Iuđ8.d|'~2SnP*HZTmٌ+1i)Q;@v /EkΜah"0P <6T3FxJMӚ~(߬żoW1*Y,@JV\8te nU 3 EZctp0T KňDGp!kLK=; of]C?F'n1m<9e#h , [)~U@NVf^(a~6њ \㰊Ai&|B";YCkL|񶤺:WNo;aSUb),MMaJ=;lhط2pƚÐ~v:5oZW#DdTjŹ[+n<C,zdi{b$'MOXtfxb0q71G]XqwlIϿƆs{ol&s.X|u;mXZ }/ ;5>hlfPUYB1wL'BE Н['9L0ŋue$ɤAj̻1( X[89Bܗx`odp 8@d4^;9:3TA(H3pymFHJGcRuk>|9ޤmCYӰ foceΰ%AωHW)QhPZ#쌮]Ua%T<:ij8¡w'0̻/]6e9^:QKF r<duf@Dh~wu<,WpTB0ՇF:U\`J{ & ;#Щ 4VWM8U^Q2xyU zMÏ`"~c~;s]1.J~ mYm{ے&[Ug)OصPpBH;X5n"ʴTNf'xY5ܴ7AY3}X({+I@J?toQL2?]|f;yW!Sh:;(nQ_B Cod4 #DԿIwJ #^|AGk;եB]zy]H#y#k[{k\Vq겤InlpVDj7Vm15xHcc_LaF  }nȁ(~…2>b:䃎 6ZJWql$A;UѱUVt)4e;u Sp+3+nyqfYqxQٚqUG"@Z&ngУqSOmm˦Qn%mp_PphC.!P#R"C4Qgy/\[N GIDhS 646a,t˺.Mg-H[.(w0bg8uO[֘ck1,kDVד:qr|0$$$'UIKApME,u ]&pdo[1k7`Q}i=.o%GiNȲǝ^mz鹬D4? y|+3t,s~Q#Ar~ɇ ۾c(aYUq!ra,z=z50u#XS2nZɡ`~tQ;HbMg'L/'`a`\:$MQĭ<j` ՘Gh@\^ڬ|TVIYd$~EV.ug(#?ysS^L+# (Vjeu:8~J@. ׀JB :dwFAQ$},ּvD3ۤBt 2{aۦ~jbc+Ef'(;'h'}H4B w22s,'OzMԍG=1ѲuZ_1~> 3bh,0{6qGf+W XXkH'3r13Aண9|mspܾ&c?s6~K߼"yW0`%@S~ٹ?{ĥn5t0Y n^`-;w(E;uR ,G.!7@! &0'WK 9y֤ bl+2L{_2ltV- q zYlD 25u]ZHph"A2swE-4|UC3 #]}yhw,=ݣUwxTm?A#j$'3G5C-҄RB4ӨN P"Mo =TC) h&=<LϜrI^م]:XEַyBl4p`'_6wwyR5( ~ܙVA[u<{.gۙc4 8G@HECPpٸY%-ȫbH`_Q5[kOvC#s{<3n5q!o* 'Y }aD! 3Bj F)@S G"&Ia ts30i6{P/UJ ߣ4I^'M |Qԓx0e oQ!/b.YgOhO{?Dð A!r=Ki Z 0}E -4͎=(ZiƵosgH=p7koEu0MpwɌo%>dCLpDάW햝E*0;@_Pc^ئjt^me?kOFuWi(xSUC[xɸ͚,Y|/+Ji5΅nILh~̀ L쭬 f 5МLX`ד@1 tF"2Ht> L!oӻV\lb{=I28qTGtЯ|jEwNGv3~aLv!Lƚ>PWJF 5vVAM cC󷪩B.w#mI_=`,tq75mN)5g,-aiٗPk)uZoCH^8`n8Y>żQjai14F0fc"mѳG~P,h2 4uMZ=@d G¾'Ӧ^zze|)8kQ =yV& -ؼBשW:&T[ ٥N ^Yp}w n7:af\ñfXN*adD4v" ޏ}=_ 4k  9MvPAU/{shimyj&@Dhyl 6biW$%]XLv^y5JkH~ϹgX8R\oR7I 8{{S t Ҽ@-,#Q4^\0&7.7ɉH74o#v2l6RgJtpwL`< q7< (MDbktV\yܹ'[V"2L"qtkrfHg2 CZ1+Q/M3鎾~5K9.se#oz El(g!n(Ǩ"27 ê8ЈasA7)( ,?yv6GUTY"N5ߤxTj*V0%d`9]0u^C;k=`2{#Cpsy.;Y歨'kx&avnɘ G:jg?ɲ Gd㑔9q:y蜞/e](ىF`#Ŷ bNa;/(97.}6QL Ҁ5k$۠{EZfsK*9H>-&dC&g93eT>lL[re Z,O|ꊰ]eY𨩂(qhVkQYɋЖ;Y̸U!0OU&/NxlA[E+mp9RY NҊ,NkdgoW4qFP 3iêCLA2+vd}WvṿQRy`ؠy+PgSU-orѭr]5uT;Ȍc,7lr2NtUn_ 7…Y%ޫm*f;j׻Xou7@3;7ziT[N.2ShilgDi8 v?( +d < :>wC+Ti)w@sgnA7v [45 #6Wvm$eF&OF h!CJ)Zg.Y(.?;m*2|e !`B l&n I(;I)폶(ga ́mYKI^ >[8 ! 貸;D^`vn^d<Clʤ!0ní&F#1:oZ5xq! .4rIqª+@Q¾GHVOXD YAUrt5x% :Ӑ*~~GːTl("0xgCA_IG0Z ST_B[Rkh-{\"b^˲y\֘~.Zsd{@Ӎ Unl׫+,|5摶eMm?r H *}s`4s>%VǴRR` %4ud+Ds$Nу!vR%=/StVq  mWsO[VO|omB{\:<;PWS1!Ǯ,ĽAe$k6P?''V rrqQ~²//%R@X ܀ǺN!ؕ mZkL2\wKd6S{:ټcs1g59½tr-6ϟfkQ,ybsASdw* T8mI54)>Grq΂#7=wl/7'1l\\G"/q! CX.;f@A~pt]3CR\\F*:/E3Rj buOv܋>_3o6ց`mO_II?-?|&%z}&nKS6C|!J.--FH.ety ;G;@Mug^ۙDwC=XaGy >d4*98i4c$U%WQ5yuN E,MkDm|/] b/:?ԑ3S{63@E U@ |0Hj Co{qdG)e8v"j D`! We5UԞq*2j?*5Rp9o$j㴨˚_1w yeߙ'AS0N U6bM%RAEr"~ތ9 w[J\燉SpW};mL%!71קM3I *@QSRł*ᵣ`c%lu[o]g]/;$/dQ#X36*@|od&RDnP/v[YKwK2czπܦ{}77qb!NH+NSyPԇ̯`-\ NV=ҟYX/nOsFBZyA(9[#Q $dՁ XogKtB_ uAWbQ5(KBYXASJ2>*$_u$`̭ + QWA%h0$;TaGlFHGkțxZ8 (L+JYueڊZcTMA`:mfg!Ŋ\7c@FA O1'']V0W[f5íB"=pNc8.qWr:k:sЕ iJIks* R`8rS٭×yJB]qar#:B-N%OyzE_xsczɆd=X#&v$7偓qAxXu;1٣[Bd L\5QSmaU"heyH!%ߨZ=^8[OMcсG 5iCDuzz&3ۺ/HDF!fJv;1U~+`7xe#Wtkf#9Ƃt?|n{ȍ^8jBNe9^*[c83r0?#۫BO0 sa4%0 I.."Д-y ċx7VV4?8(I9_19T9E"yl>!Ѯ٧_(aTh'L Mں՘2<:)7 &tҔ[$jy)tg AC;|48;IwTQcD3/Fp\0Ou*FBK{:"JDMS )[fJ2v⸌-dATkJA5[z ^OKԅ1Y56bTByoڙ}MXjJ"hr; d;8aB ׇ_ZS9W HA-#W' V=Uޔ*ey1 }ggz[!B8/-N)ȅrwbMawJ҆i#]7J{>;[؝qrRc,ȗ\֛⍜x=w.[ K DehaX`v<y? ~4pA g1;B:jA2Vv`!>Tx_H.]YhT FٷUuɜ;|(AIM*"#Mm:C?tcS^>R;sN+Uf*h=,MM 6LN6Q,XXwƞBh#;aU=/s~ Oic9WH!N0X DVޠW*8׌ѾAz~ `%d^te#Z[=2 Qű~G>п8/QSt(խy`;,Fb @9;`%`t$8Q .`̶uI'Dd= I[ǿFBF4Κ^{"ҫo~8@96&!48m&gfmd F;$#ðvv9!q,*Lr6}F Ka ѳWkX b uڞrḩn\ &qa>AN ^wgF_. H㐓@2M'=:8<)̀#?&v{chyk显]LaNrB&Ed}ې捕\Fl7)H3Xv?Wmwn~J;#XTױ7F2U#Щ (bW_6AQ/t8?|fLY@-rh+5F / ?Ί hIE IS3q0\R@p5!{t1B j27;qX5܈RNzʙFx;7UR\흓jtro]TF|-̃A+%Wrtk9h[-cSi蕨r SD>D•;Gc'(*sQYPxGhaBYn$Ѡ_XFqr^)nGuv ]D'Vmˊ'i/̨IL7ysi:ԉeĉgfŵ{=IreI;ӍD(B#- o[;[R).ěЖh"J Izoz(@QYW;B$pʕG=E+MH}[$a5]?J9]j! qz͢_SGE){ @D[.TI5M ╍8WK &pXP)΂-Tꅥ6̹_$)IŦ#$R\#Or>ixoSo=EbDζ*⚗}5xDΰЇ bN?Nxj'U e}*Sì.0~Ib =_' sPF[O&,6~ =ؚ ʗz[.#l Vi^UzqTn)F (`ͯ+u?mg7mg7MG[*`ttI Yؾ@@Fڒ>"pDž+R: AM2.BKVkq`P(AZ 3悪iݧN~T,^IW{gLmr&:H/u6?bWbviarHk;ug+n$;zW84N6Nhhau UWk) 9 hn=)gUK.11\"hea>ql-"vZeI欬Xj9Y"IUg`n!Wcww" dJ2ApbT"?P5Q*ˀ=8и7?3 S˝1-N[-9&vg%..gebs kI*&pm`497qJgޏi`lZnAe|@K5,ɶbqW4SFD,I/:E穎]^\<ҁf%,)&Eh]ʛN{r|U];ְ(i𣽮菗Bi Hb#);)p)c)MkuƱk@ EUv RkH0z(y2%3F] ٤0T)Q8᫲Ps8HP)R#82wN^ W1f^4B3%M-j~y+g8b;W7me =ne|b\BWa7BqhPyj,~]^+$gށ=i,+ VOo"?ޱʾi_b!?}ayt}q"Kv">v片6\7tC9"s沶3GV{q ѪǪDI9z)Ow)DԕUz}P4IHcZbk}B53Iq-b) ٳ(HB: ߂ p߼R;| RGg–ހ)yK, kx( yaizi ?ڿ/+C6n l4o[ 48+vu|MTXs fqQxkӛov>2l4Bg;IAJf*gKCO1p؞g Bhe|1$gЩx(W pKޙ=vR9o VRN cYt1C %e!|璉*p"=t%ebB{?"z4} w*@}ѿC&A):ݴia@*ڱ6# ԢI3uR;a.8uOn4:/ݢ;ῃKM -bd:㜢9[O;AOZj0f(͍(!tUɾ}I9 @kWFq. !e(E*5;ׯIH)T`XvC$ҌNA2\qHCL;6.(ll*fv55MvQg?tWƶG0aƞLlvufQ/Y@.vt/' {NG"kO l6(=%4)PxJ8ѤZXysBIO TͶ2wqqSUU_dƿ/CxDr*wvW ?S9OTyce!78Z5ǫ͐I®q8}J$+!;[|uIxG0fw qQ0 ,c1;Zs]φy[>}]!MӃ=GR6'q>1v]<+L}OGbSt^!Ar$.A& aHip.y]R *`yn\ N\S>͸PK+6Kvαe4^hSeݍb@t yn%=Taiou0߶! ;6mU՘r|S3C|M=܌?90(OSp92uKGJ' ޗ"b0it޿},c7ƿF^p~+v;JI`vwdf7lyi= /|/n@V~U^ Lj$I~q=!!SixS;l57#z GXѕF[qcӽ%okmأ{~8+O7dWr՝Ix=W ~S )'j .šIk##9.=%l|US\ R'.Ses4;$df9MiwH nmS)k83[K VbKlԯR'c2M|QNZE^]'\m(|w*cq7{!']ܾ* iLƾڱ^sF+U9 REgAiN et0j)=b$*MEp|WM.*CeV,mZ絿nA[BAd'܎a Zqclw3Rd㜐b*4JNnֳSvNMО(tvx4MIõQJ=BVY*r{]#ZZK_9|Vye"#"* cL&9F]l,L0_VzvIΠ~ALɕϊ.ʻ?VNlh A Z ?BP`%j DVl4GZYD5ːwNWkESG7J4RTfC,U]Uih,E ?qδF\9r~W:`Ă pBbD=d(<bhpwkHxbb*_ ) _)`% (J5hX=7j(nz 2Zѡ9"ru;52AW݀KI*}WP\Yve=o}:T<5JoH3o:G¥ɖ[ƚj+܃WaV b d(9 >ZzhHaEBYnRƗg%A(-wG[rǦ͓p~KmS|dfUZdf1gвwW)S8#5\@C}g[|D_@5}(&pj St$" _ i2aOE^ ,[@(B]k5 8lɥù"ޫ4A]O H[-PsE_kEuzIn*F ׍u$3x LH#=1ݮ;Rlvdq]Fs7ԁC\BJElu=iaóC;]wuN%4@IE!3D߽d^?Q zk8tW]Sb ,%mp͈Q#7{Hn54(S:8Epks%[ [_hsOvܼ ~J:} FH#8[>gݐG/y'c- Hla2h t~C?"]=Toh__sݤvKXO^|Gi$w {@&25ϩC–oJ89L:ny>kMstEs,w=(oKe+ERh6bIz_3pp4P?6W-t犟.5ԛh{BlYϺ5 CȯɊuD[O`}ƒz<VfMl0p(ދ7G,}0d,7ѐWbwsWo&)Bv<+X&h 䑥6ILAuSԚ k$>P!˅GfzU.ԌIss,#)+cє?gYh7 0;!;+#)LrE:RcrO9mKr?"6+2 ?Ζ뙘@6 QQ 7&p㫉z: 3VZ;!^/6~[J\y8_{O+~9]{\x^>h`<6RFlx {?]ǥ;ĹQUǤکhm9(75?`>6/=>/Q7mkJ|xh46*$1;gQ_܌-~cO L1ǫu<R+S+([SKE|%V#\'hFs|tкwQ =gp.xq.[MX{K2Z]./zG2-V bp`*Gw2c 1-lte.{bHxEOOPoNuA^$'S2= 7@*9[Vo㴯 ^OM MĹ}uSg$ Jӑ(M[^H#ʤ$RMҾw*ʋYFlztI{u}IhRk׿%%V.DAWӚP;'U{/8TJAKS1jaVyˈeHn{oWh-`Ҕ8jW!R8_EFpY3n*x33\"qbUR*Cמh6CT[R1ere_lR-#0ӪGC\4Ӡ0/Xsmv\ 6F'p/Fgc)#.,QS&ݮ-2cq3z3s;i2шܬ-l{CFlr ָ"FICo+IG iW)1u\llO[FDAU.1cfdϽK~@LcF7 O)p! `2i Mi6h scN%[zmjf*r_wYպQQJW'e M"d+Rx만-$[Hǃ,JIGՠɕ:k?ˉލ< 4D_d-_< ȽR]nLA݆q@N_Db5Sx=w:8ϱ8BU[ /buA(IxTcdў]F(5& 4H"k&fk*糳F{+yG)ҥ"Tv@Ը)iKoSiH$КIN݂ )8L A%40JP]o)(,Gkoqd\"ۆl~ %朋c|1q!20075t]h\%;*ՎCd&( %@i̪kb7:7JҾ(M8r;=4ږNn>;ϡfޏ6D'neeSq<Au}ɜmࠊj&RN3UK ֵKK38$t"ljpff&cn(.^&rSX2"xw1)Ω pՒ. (ż܂OPC>$?#{'7ެ1FV'>itͩ55rvbpit4ϥ?gӔS}YIO `x"vz:]Ef*zgNҸ6Q6Uajӗ *,Mq~;"s{'s M3K=Vs"> f44_2):Zt ocB$$vaHMȋԦ_,ЂO=ۄ2#,9ӎ^CDgwIE횽G?fkr욉Cc. (<. NUֱW]nJǒ TDjP=b !x[(/,s&9_j'w$mU ۇuI#(? x̵?+>F6VJ04V[A7x 7+z~&k@= Ў…lJxHmAq@8$pI 2;6ٮ=Tf?ߜzw *f=<-ANCHmS]SHfڎ[POoj#ߩ>ڽkҨ<wS (EHubƧ]B(+}9-1Fņt| NYCװ<B$zn?UW3e5 H7{NeLַ-"pUNȕYT}R|Mqɢ%ęc"03r3x1/njĽ:J`pl]A΃'O1U|-AܱDkf|#m*b%Hk\BUnrl53GK={P-N'X:p!uMx>1Ԛ|z>_c$ȻCH6#.@7)Z=ކ*b]&)ET | 1_HNgʞ <;n=ҟ-|Ge?C}s+dZ&"]~ݓ( OPw\ULUv0ZSV슰,/G{S .ww@sl 3{ WPc u$xB7Lׇj\OčYü\ALİ׽vm="L!Qغ[d4B< ך[N4FhO=~29`AX)pԽ=9U " =@d2@- sПDl452I&W=_Kx@Pe\`d[f)~ʐ3| ʗ1P7ru$qkX]HDeߣ.\ftLhO=u6 E}dy/~ChAYy~jq(mqS&3xV}_6PHiYh҈;=N(ځ*tԭ^2 $23Q~X+3(ocoz >K52NHᠷ0] 5&Hll1#|/&_o%urTYusgg?M@+;ڴyYˬYlP"Y?znyRo5ɲ"3pkBԏ\Xe4n%À%wS ͫVx^:y!I.Y$ \SJyyJEǪzAa/7)f,/>>ݸ|D cO!`'AS.dA.(5X&$Q+YgC#Y)ԟ"[\1Qz705}"rם̭79$ '8KXȣch6w 0^v+=˃ ~ ^&88&η5q. DF )O |aZLT?P@7pրɟD cPI|eeW_Jz+RDžLS`jȵ`}Y@Q % x^:\USe ֋ *.:B +u>~Lt/ƧDC/c5ܾx w1|(5'r(@*  =ęƫ"Pб:]eG zvj/ҙm-7CmҭaTpm$PV\^YsA-LA;')$«m,' IM e[nZo[ӑXiJr<7"9x˜zg4Y=pzI0X|=Ahẗ9R [Hs@B~M{9wRd9i4r.*9ݸ]0Noa wdڢK q(P&Z@.`{~iȲ= E%"is"ҙռؙOC쬠f,$ÎVKWY,1 8%`5+yEޟCyzEfoo{gP:L.h^v5:;UQ4]N,R|$F /GU~ /<na߭cObDWK",J>RɧҾ}=cE&h!aKx"2 a?;(6DvcԻ`,;h:CgT9vPXY)(Gl)c Ű2e'*{ V7SУ0`3ܳc%BzUߓ*PٯwB7{T8A\7r>zt\4Ldr϶ 553Y~M'TnP:ظV0&RQ=_fi)N$ `4!,dTWF&l0&߫Iϴw\Ch~7< {OE.[R8&V?;/4V80@y5>Tҷ;89dL|FV0j BTW2__TlA]V;! :C$ʉ@Ŷ/;щϦyƒ\ht.H& ;NݐKbeyKFWReM*X_h3Z "]%4t;yT#~`czDv 4߭<|eKxL{ɨ5dJ eu9^6OG[m({ѦawlcUm/^g;_ %W/ɞsO~J5J+cTu"YA⤉u*ѮsbPAs&ra&'%"!*o h 8nRKnOjs*'>@;uɽ?d%jK:j|jviK *5kV%E@H^9f>STsPFtTxWQT|̫]Y4} ZxflzH(i:e)BAWl"啚HYc͜XzU/rj.'l8mE-,ڰk8$ZAo(a}v7YRLX9j>! 6g83?!Onߨ]৫יH=;_aG7V%T@:*Af? ,p"CIJ_3E,;֭2ڟN .F:#Ek.IǗ96y;]*4I`#aH:eRR8U)p{]xXRSLy>ufh6JcK7JkW0~fQ uID8[n Ӣҝ$3iB+<͌JQOχGjD5 zHb_H 1aVqcKF^Sg]1f~E-vIW x~ijn<QY'"A0h!Hu  9H}'r97CL)LpZ8+~}f2+eƭMzx)9"(/<z88nJiQYDqPTV0U_LƋ􏕮#5!S!ިޚ) i*ň(#Mꩇךl/0I|QBnq}Cf$H#i!|QshWm1&ٔQѱGdEt֪`7@4m=acX">`n`3ffS8:<|& Wnw਽NU 8^7!on=8Dr/Y>H%&eo Lx"vd+ 5Ә)b͹;mܗQGI#"Ny1 DqJNڜ\sQC:+jepC񅥇Y.ɧRP(.vn"nߣ81O@P\uJb79MPUg&rG2OŚPĜMiA 0#̼F=A렼N[;Jd_Kb7~E:lrrNDdoc|W⬻cDvp2QL?$S; g_p`a^{z~PRTqGQW^>9-!zDy5` ~Aս]R@?@%#[E+`@JTi庞[sH{ef j18hhu*.&"j规dz( O?F]f/*|!r9V,m1ahP?L9qƉI-ӢٻѠ*l_NGOe>zɢ1 cjsJBJ~Tԣ+ n6:{OR)\8̸.1s~bZT΀kD1pac8)89?K5~g)ǚo uC %DG뙬q#9`]5 W7j#Px8Z/ }% am+jN^9 jVVE11"8bksOw~_\3ǺDέ y|2Rm98M DMҠ uRƤt6ݳdo\ p: .@gxHZtaW*#d-x,[גعl \P.;8u>ux8;{ `h#> 7M"@\Mo Z(Wzp&ỵJSuO;_op*cX:|S3jooHS*ǩ.k 9ygKXӘ;&O%bL486.ĬV/h>8ʉ[aMt[+fȮXB?&ąa6["0 pX2 cH _눮܁X!hL7rw ɧ&D0an %%38A A`.*]u#S8O'GE¼/e"sT߹vEs{UnnA{B)P2pMEBY(sR=!Qgc^פWCMR2{KK0caf6 E6f6ܺh˻B4:v耫)g hY:̩}+ڶ)DgVQ ݼ7'K[Sb&ef&b}W=X|bɣ x!D.EfȑCoTCd$ڮ\x+rJuNUɑ5(0o;3ND3L)pC;{>;#{>Vx>W4xX`Rt|vpN! hD¢p| L$<f17P4]y";S`Nʴq 6eF zD9}of^Omu{Ijp?>P^s Ι_6Vjlo4<А*_xDr3Tj[aF!C}dWvu`xc|;6e 'LPNxWnOPE#<(&1CsR5XWiJ4(FQ,=۫O2%Zv!Bt6zgEwouy>zvvOr[{q;P60`M- @;8G5n?۳t!dAhxc A".?b;蹚G>lL')|I*oNt FeFANj?dvvZ3M83oZ@ov毅Y\ijzY|Qwlw `6IDm Oiơ&X hD L14i E.A5& ଫ>a%}/"p蓯/mὯR W.J|8 /6Mz>}heڧj<"H"'Ek!ADw@kp=MתTƼJF’8g@1C _$u~V)'ĤUa샌{VrE* ?A6vvAi>--È1`zŽJ/5mHa-j˛( µE8~QpLo>9ZGÂu cJ<;RKDKz:#;״Kn*tr CWVP$nPb} dң^EEJIGQ [7)g h4BMײ~K?(`.0Jsq L4miAW HBCh%uŸQpի)7=L/r êNq"/&Cȸ?'`"AP.~>mR(U0`s3FL.\?@-g&`A;MEí|v@?'`1t!w`^m}5ܷ]/UH僿FC6-{`Gl:W1葇>'XS I9{3VvU?.s"g?Iވ+/ ݓ_"^v|"@Lh*AzNȐ3h0`2TɂmVC<&1@|%|Z}}FM>UMtY!?2w2$12Yh>(x5M,/0d@h?cf`sy6Cc è˛tH8]+Hlz'i}MK,+(bM!(Q+]WNMpèe5$I|׊ T5Ӵd8 RϞ 0qy2 V_ѪCJi::hv?R׉Җ:#{B #9A2XZJng:>*`!cO q -DQK< ցѤ9#I.>| 9Xp{va_KIYyfD4#ibh$N%%Y{a'Bף7Hɞw_M]qS{eJ5>>t*UD%ec.S ےP'};Pª% 0c=j`m%{J:p΋ZYZ嚡@0N%>^mp! F^§n,}YRX1r*/eBw n" laIM+PNogJ+CҸh3׷t7\n-! 6f%i*V>@= !4F8Z|ĮH)¨d6LMʃQf Nbh%Z#8ǦfYYKsHpY2Y5ԡm^Zϻ 2yck I`}~R)T"_~M˓/5(|^ eU=lI%ɀ:ϸt-r2(}%a3*Dp( ĭ$KYZג+=|=b:4YfHΆk:8 D;dg&g@A6ž/e@Ioݦyyz*/͌ٵ4;KoQw 3B͓W -qlWSPt$wt_mfO} e"Dw; NjÓWl57ǨEwIEwiꌓōK֢d/qXYKJ"QS6vIw0~he| gĊ ĩ" ErTPIgȭ#0P=SZto;byUQfŘ3 B'DrmODF|^GVX3(t ^%Bu(i䮲䲔Ys煬~ GQD VEݭxQE#n,To+|Ru[ FR{:B>'[075c\CRhr"/%052?4Qy,ieikã )vQЬWQ,`Rz-x CO(g [ *7;FVݙ}q"j)Cp5$"2y7*.8E 0zphdpkx?z* oקy8#;$m@6_ZX@fZOcʨ`]<}v?N4;xu!Ə㽧?ڼLxa\v%R dswycw]vX`rKFNQ0IlPz71zGmv+LT17LܽLZ,WJ,nu׉*( 14Z` bnR UOr]w_|51 ^#.2T;.LuK 緲} 8eۃ܆.‡_ЖLu 1£lnGϷd=cRɺL0sN<7?0 9iŠҜ)^?K3o_B0-PYA ;lsՐf\%Ʌι a1 '+#=aM="|]#Lv?PTa!=f⡃=m"nP!?ZȁVvσԭgWԬ| I(` G_0`lyL|^ںwG;cA!B.D[^7VfDՅ/WnvR D ɓRTYKZH3U (ޟ2:x%GXǢ\b6[61$x矜W\r4^Bhv%GƽYA3S{FlA\SS6[ˊ(ю.~|S|Qor Un_ ^PhRx_JF]ߑQP^-5vyDfD@xyL%o+JA FSF.55J%w*vًB [H~Nڐt T|ܑ s5YpQM C|ǜo3kԫ`D݁xkߊ̐`kjd#-9`OpXeh&s-*QVP">ʱsHLp9.@(׏ꇙ_f(SN#L(EMPdj9Hv#MpʘSHleˠwo7ޛ^쐪+bb|}0s}Nlhq2FܞB/ԋvR>$?E*lr `G,~NZT܆=1&!c -tf N|v6P.(>w-en*lգͰCטx7=$1\eeO-_~el5/Wh!RGpV**=n4ov`m˛ŬR J\KGs1惈ѵޚAy C1َt^FZ=nlnٖ؛)޴V3"$[sN1߱C|b,nμsLY0>?Z UQ]9վzi{H%+*Kk٣a,Ke(]Q[K\M8E(k`թY}z є03RQ03U˺=|qF੗ Y'c2ǞHu^-4әo*mS\$´RBtZ劈0c'B:rx8o)"RL^dg;QfR8[CW27y>!4u3KQT Ev^+ՊޢHG2Y{SwRp[,_A-PP7xqv^OZ79l0 k!CvS6al7㜘hGX7]-irsu^9-pM=jSHV=aNtjBlP 2\}s%(X{{+$ ^MEFSwGn4ߔq aAdsi6<* dB>ZξMLen 8|?#m7*ܻ.#nDx$Ͱ}ߊ g6MF,W(Yd`7i\7kL& -%Q-@9eBVQEfJWR5 <;(ib0)I]t7}pܡyl!yI)Gzȩr&S{^(N|]n`$򟞥]g=/L:=&T"Z:gkՏL%$u|vF{23Ugy)XQ-Du<]4"LFtxnpbYo22w;;ksIyBC1dBo>{{tF@=VƠ#+8H${y៾-q>krmbgPja($u_kUJÍ\-Z.g.+=^BC< g*9fa-▍(aVoI(j;R'غT"̌vTa!z;%pwxW̵1\y`]wʤh1ԍvL _xYKh3&GlH ẏ)%AkW5pk0?,̍?`[qkF {Dhazw|7([_bJUQ(]қ'kxI{SOuµI2xocضJ$c,H]qlt[L!3 o:*gU"P')7= 'iIDI_1*⧋!M<"{ئ!\ãe*F7mJhIoU;U\~ >VO,}o #kHDn%3cPQO ] &Xf l?a 3♙J_hCK%Ӹ R.094MI]1)o-8:{k%P -چ.ַ╯-tx v>.[wR^PmXF| VV% yȆiuj 4*~ 89y Fk~,!=/L(v0xczGN) mlaYDd);Y4τ85#)m.(Q TT|E5w:sEtZT́Ϣ"SZu ;ݷ/~|J.MAJjE^XKӫ~+38j.5J&ao$: 7A\};΃){[3Mt$0dɣlI48ڗ/X.8n㿠K}uűC街~ŀIaiÄFhAI6x(pد8jx[zP1fZʅR #Bo/9 Ɋ()(QĕzLа5̇f_Pg,X&9{'+aK0dQ! q-]![0 9mݔ@e VYk[w]Dz8b3rW/-q6epݞteB20ֺ,EacyY9}F"Vq{Z)<[ )y Td<*J+hjfdN%G(wCN}a`)(2y#|C |kvσyntƵ6AdcJ)~]{qNl &,J0;7Hh&HZܵECiC<,TDiYGIF$:7xx+5LV{+NauON@\ܣ Wɉje66Z8[JL~bE(dUh!WH}^oI fԤP`SI5xCq͔3wbFiSi/~; >^8\U멓WE׾LLsҕ3;Zb1W/߸뺜 O5~bj%AO+5>h} Ң;u>60\YT.]ѰTh1uAV {Q:9L2{=3'fBqc[_L0ک6o:BKA4?XI+ʄ9[xre1pΈBNi傃vUכ/THzT`vfi80Wzi*LR&R]E5Kso- >gwVE&R<bЦ* FsKr"Y Xx edD'v8rZ&ĽVLzǂ3EyxN% (hyy*FF1BdxA)g/M.| ul%.kKrFu#kT6Fˑ?[cJdA |:ڭX>\WK!4pg+pHfoƯ2tB*{ItBBw}ay@pmj +/+L z7d}QkբlSKR*^/9k]rn 2O`!kTL#Uw)a;]8e,Ǯiy-+j\}Z \C Z<̉[g+DnkZLe*SfmDWEz~L81PM0Q?xi\F^ŀt+aďJ(=7dW9 F2Aʦž[rg6p E[怪n*wV9w/X^@R< 5NTdhv迡dYӭ(8Q>,E J?r=?Llq_zKT}X`~RϤ&_tU}.kl8 ߸f=ײ6.$}b#_G:neض l*DnȴYU[YAz(-MH%/aWGeܐpFss-9lh7Wq?=I~;اX'n5ǧ5eq{fyo^֘^5nRf6%̍Є2def9u!@C0 nY& :=M,2kkaE/4R) e> N@hU`z+i&giN3y v$Ok剆x6@e7X?F } V#K\p8saϪhOKhJ]CiH! ߵ PMt+XAb'ytu亯M(Gٲ)ܼ:Sǧϓʯ\Kd([F5!NϺ&?nR5g) BNNf[402&,*5aa6-^j9 N9qǔhlS+pry_]l7_0x>5[_ p.Le|#%yJ_^q8Q%HoK ef&|ND MxmeC̍;3c &6&ݢ/N Ys;-[,:A1- YpqmFYFA)5lhaLQG|)˧y$HlƏ80#8/uG)F3kHLu͒=O-YSD7LAVSɃ8y[:?;@ Ux,7pBׄ7MlA.)#m~”球ZШ+LC>[38JV4h?NHO:l~>T8W`E,἟#Ee20dzjo\x.-ʍJ te>Pÿ;`ĴDű]tY:2uL8Tk .ס&6o(4kǡS!5B7-^ Em‹} )њNݎ j)``MP,pHZxmդl`PYѸHmLMb{qۤ[CtS'MȖqrֹu'0T@Tbdz1/:ˌ

^sv0(tljdtbԸBUx_w4yǻ־|Z2Oy!E:.ڊ-Fޡ>膝<- KKFp^6Gj۴Z#Y$#e9!%6c`i=ELP*"0NTYzdP@n'̐N؊=o-_a<ٕC:4~x02Vo=ӗI6*i%L/hWm i%䟙3wӄAҐ*%p^=k D]:^Gb0U]GhVOSrEsX)O2"ByTG= ƆR'lE4>i!{r2xVj ,V3?q'(rTS#ׅ?:F?MU oh̗ rªm sR4V_KaˏW-7zHb/VjiJBnh W6Gmp'/+<YEid!k:!L)8-Ur)hG($SS_/zLmO ؊靈-%l\GiRn+s&Dne ÀXPM!˻IVxf'70pj|mGnMCwx K6Ut^a;_jHQ[lKR>>~Dmd$I;?Mˤ#:9 I]b5HckʟnRYuP4׎j>JlKB0J#m]b]e>XJ]=қ (yW1ꉛ o+أjNfb"!FJbb{a=&Vx)*Ley$ȓ: 7 ϑcmO/i=;mF f*;˩mrX8tAƵײ!IY4wA[U}`g{_O#W4ps`lu->El"P.Bay}Z+IIn5p!T89Ǝ<^ObTҶI193Zp>CWg֍wZӒB1<, B{^@ NOlc9[K%h:ʜMQ}!lfJQ7|M^QxKMzxwǁqĤ/a)bDPVUs}3 Ntga^ý} BPHyA!9|ܻS9C̕t YZN(T>X:ja"{̵}dj F33GsUHyk{lx6 Ђ',^4H,{A==V،$#Y9; z[J ͜JhG0V~77Ebk-ɠV74)(/?xK_x:˗m0`t2C ]`:12^JQȻP>Nڈ*5>Jf5;灸y`T>/3LaK@8VGF_0'U<@V0,)T"g(]sO̓5gL)kiʠLcO=阎1o l1&aR?g>ZW#,8S9`'E%ޗy5[<&'.!ڑ6xoN!*7U#6eU"eDl6qaa;Pk '-gN}я78rE^;>ֻiYR+SKQK(ݥr Vm.ZB^S`s`.;S#uêWbPJG2պvƗ[m=Z~G*6 EuᑣZ^PB7͵|{8vo1GQj[PH>L BLMjۮ0[GQZA` t?1 kR72 dbso plsQM3\ήy85Me8tKd{tFdU<pB]$X?\-iFfڀ&fru8xLFE拸бdPazS^GjKRUЮ&%Uz kE' 8 <6CTIMR.E{`a.~BJ^#:kwfqC) d=S h]+D.X^v>1XX;bJf*\E'.]NꢴOey(Gz|0驩jY)t~*"0n^Άs8JF7/)xd#zqU'=wtզ廿NeerHVl/2ߜ g~n. h|}*аBb}͙;E-%`+:NLF눳G*ũC,"V-eKarcl&!m-qDƧXr8r8MN3]+t@بU[Jnߩ;?~dfA5nPTC}pؑkz-ya2 J h/jy%*%+Ae St'LoUҋy戋x~wZc$:qBJm^' =H#:>8vPΚU-W&1Tx-[+anlՂ',֥VGr𨣮D(zla8 ZQnYQPMB^}KCT\Y卻Z V g F]=OCg9Ȇe)^G9 Iy5O42nUyDмL\푊7;ylFՏEIc2 vIF*Y I@bcf8SXI)կv Ȓ$z~Ox+P`e!"!$ˡ%.nL"^_Gp0svG3myWh[5%ŹcbzS@ ڏ4ݴD7g]zX+4M\a.! c{ݪI1Rmа&'֑(5eah \kԊ[\1nC5Yܲ2Fܰ],ʹD )FvZ56RIm{UoViٱ}صL<3ɺt@E !6;Qm*,) (xr9Oq<0߼Nr䴯yB! E[G##LHC-jo) /$ wYdP 6` \1G62v)79>@Qv{/iMISꈂn{mfkFݨAf=rZYQưƏ/֎s0OYk4N,y15F"{:iGaK96D3Fɕ!760TIwDeϵKބQH+A(p#-\cz7"TG+HջMq}LJ:5R0B ^R$OY쳄 =؉ ʱ$@JXG;vYee:c,j,x zDs3F0[~iݏlm mHxpQW*c(SJF oZV Eg {jH,ռ,rO4 1~;yh?.k );u:Ҧ6(teH3oPy4ظHx m!{R-\Mű [J"q ?276E=ޡ n9eSEDg|WO[nkҼJ.ny6|){ z>+M]d䙞Ӊ#o71g v]>%;vqY;(9*xyZdR 3VzEFo$5>F:d|kK[a!xɵpm 'AoOYu E[3CHie^/AVv񥣁)gvj>Ok>q8~cz*;FB3t%`M{^(mͻDRAwbgʼ lwCU'G P{'+z-xc,,8-^8~.9^V گ7IW9@,9ciu!h'K[9b~ջMc!ɹ FxF '&|ZyADSyq4<$~P"ʖk1'GXHtzՑ`m?]) <ЅM7fIs?Qz;~틏'Pྐ3El4+r TXq7ns)k'fǛfg(ocKH߳ s& oYh54l^ ~wV擡-؂c5}U0LB*%T_U4lw~vߋ yKv{)wQ>B0IaZ>ˀH"JV!Ľ QXƔh2[(V{J2ܮY֙7c{xC)OrSkpy&ǸG:##=^K(8,YT7 /b"id`HkFm[(\5M6_FY|C}rQ#z)2, nFa:u[eM*o4ڮ4)DDKV0Tc7B7#eT\CUA/_c2DkR#K2\R:C>hPFp--" Jd):',1k?D-m7Pj;.,:fClWԢZfH8F`ʷW8pV[_*=P~ \fIl9WI)A$N,.,v5]_F3kSj.I."]6"zOwD_1g $9jy|99Y_́&g qvn"䌤z AHE *|$TUu݂(}EG]ڷп+9oY[ &__ P!#MW'- 9V<|cI$+íqf ,M0@S2%_tf+}{PQIdq adY,nb%*,ѡC#sV!Id#s6{Lq;h_ ţϺ;#"2x T}j*> {R3K HP(q#1xijSӋ^!Ձ^q6S]wb~ )M7 @Ug7j gO9alVQ\6,m<~jx-WAc gXְ%/:9튑af 4=6?>ן|rƴ6d]tO֧cv!`ߕj5s^S\Ӄ7G(>Y7܌R*Z8Цu\P޽j6 D34a;eL/XuXSPfHDA߆𽩧Q9RʷX+s1֓_xcTmOk&us>mA.,tDdN拤2c upFIwN3-N{$羒TC}8֔tt @,#mEarFAxAPPw copϳd-G?}{!m4|kяd1HPx!zW4@TG 1n X,,sI\7,IC$Y[ȏZZ6 KwZN!+D2$YZx2o@vŵ9|g.:YS HyQ 7 wm_Shc!D'ԇ Ih5q h.ʕa]˜\$݊QQNS׳Sd~^5:~v˲B{e-rū`i%p'm4?#=$ü9DDg]ʳ<mwUFcWM/R+نLdƶqYA[Œ;q#=Fq"{ɲ;E Oq`R=ѳœ2-me:Yt]zȯ (wKͨ(2UKlkh7dby-bUH'LbPx81W0啿;]MG@fJBzAf5"G${՜c#P T!SܘJ07xnjɃѯU&%iOקdʰѓ&xP X sXeAa* h41>^xgsljf?҇J寡"mH[9q kۜ4'A%QP vl&:k#~Aìm]'ʴA!U\W OqYf~ z !UY aQ-DC!qΖhPah*):< j(ԵZ潫xD94: X!bFHy]j|߮ Q`a?:&̶Dx xszo+V[h$a8?ݷ.ݏDZ&/Tk {k Zc, 7 K@LM(Q0mI^=KALj>KP' V]uEC4lɜnKx~I^)׳`c_V)Wƻ@1ChjBSWu>z|Vޱz[@6Z)RlhO+X)|srOV"C@*L?Y:ULvso|Ua%㔲&j/xWdnYEUH>)'R(t?ڵH7z9,f(<0"F<3SJ͟9wT_yrlKϝR$A*z|۱Mpg3̊ <+'"% !{ᓡReWɹO%NY&-M(a?lCh]X}ҞV#ӹ6 VZ$`YRZI ]uNNs(Px<"y >*ޑfef6 "T_%WL~_Bg,9ɑn!,4!]TN7Z[:29oWF`PDeơ>FղQV!G'Ta$ʋw sﳨcy 6IxAlߩ lZ f}ZO8MiӑX$\0[ӕv')+ׅD11octWM?S+w:HOn/|s X&Gn,3ݗqO3b?\fn-|.7|ee}];hFwۖBZ^}E<➫:ܙZ(=୬ /XkR]KKv3]oirt8fV0fY P=B[f`74'2K0|4#1͐R>d(1QwFuԼzMHFFG-IH)<<<(^X%/6.͇`Λk n4xZ0z n4 ->|\U⡋xL#G*zO{!"ɩ ~ ~=^ LPguTҾD4x v-y=5(|RЦ9;і6V̧W83l\.Oqw\y`i>+^ ['PЩ("'=\0٠8]_s?*k,C29}ԛ&⮸S5q9f'li]ΰ$m(F69KvVs  yLj-u` .M|YFw'Dg`s,CU\OypB=Lr 5.q3a '_ ;\QlLA5d Y ,Z_x&"%N֫,抃J>9qRg tzȾ"ǨJ:hahf DkvYOy8$` F" SY+=6;VC^%90T82U|mn1:l[K51䦧ShW:n Fqo$ȥ.CJE  h8be E7fqBͶG629Or`1L~->J *b;DOIB!uA=9;VlF7mD*l3RaP1wk/Is@:lbހP)WBsg8h _s!HHЩ_YBa.8OZ2c Ю_@}kNq4쩡|LĺHC5MUt1V(&Tg|ai8|%sFTM|Y٤#xY 9%[Lƽ{zd7b:3SOIP>L% 6=~HMPW3.)[_) $utrQJ;K6HhN0r"LězrRt! vN&8ty_}SRLp/:oւb,z(T|-֓`A]WU||Wapl}Sմj'ܱ;7KH&.Ò[с:&q)g8cLֿ /ɢ-ÀlnnSQ 7Aܗi8=mQ;~SG&}cD]hD-+_t/ ~F壳-ikY nda"BWSUSXAKۓғ;=&N%p]4X=#/clM;mO=8)w_ bqD.Gj+Ǽ-q KҺqo[{ECdeU)9)ӫ1LqOxyW!lOM_L`T y1&k"БKHmyFͮܡ=%Đ!| tRQ*٨V~,t?} Ê{<[z6 %B~p-/rUIqaUA%z dj2(nؠ6z/\}W1~/" Opw-"yQ]xW,iWhBԃFlv$1JO ; Qq9DmqKLtYLO@1ͮx.xMOH-"v%(@|کbyռc@sU CLwx{&HY٧GiSJ !&[8FI~f 5j&(jOáۋ'EL3t)4)Xj7+@}A>R, 2.:Z8iC\l̚xλ3"IPXB{&r{K`DdcS#ivg;d$zy|Eo5 Cʢq/ X%vG |Fͻ#e6mPq{" MfAdJ a[IxPbB$f#@|9 =FVF@fd2 ux'*״ҿRv]-XV4- ^S/U$ )Zŝ|cna<``BUo]s~(rA~eCl&=)w*-4ine-[nLAМz /(}^X4խMPZ 2J/Aia.hn]b S'g&m[qe1E;6wMȕ PFVL^R3sf^riHYa΍3mڏ?yM&zс(/W]rT2 ,%Gғon=r]m3d:f^0$e^(< `0]a;4D6$EIF[@ 13BLDLi6E 6-;SEh8~/ SVLN7Xe_-"/R |̐%?#$=ƴOo^b)5rMP[p{w*A1t,\Ͷ|'=uE/x+W }r*uj5M{~"@(5b` IUvHW6;ߩR㎦`԰$:7vk k!\H"Za z"\cwZ79hH ^ 7@\"<1J zp[$׷WxuJ/j.n8S۲W!pe[r< j%={z\)ݠ s$7w\b<64k-6y茠dEQ \Q5Cٗ n>{jby9Y_K\~UT-$=;QC5 Z2;[q dѺ9.Z4?c/lQJ $UA:+Cm!aK sw݇ 6Z@ 9`M5 ng>zH!UCp&K8- J0Uf * iWeBr{|<8hm&g&-< H"$F,6ή@>ׇBcǗd0ysYm=<+bWByӝs gĈ+-& b^[wtGk5t ff UCsT{@6|SL{E"M!]zkFܵa$#\`mr)($Sf>8z"`>?i ~"SUӷn<u24u+ȉ`ۇfT0CzZhу)Q-/j;Q0FRRqpCRq?A7˲!ىC߽UL/Yq5Fe\/E~ED."L˂G9AUZz_<QUjBW4N>t/" Vh5]8{v(++ar{ܸ>!M݅zu"kH0?ΉTM{,~ 53\0,TVy˘,ɷG:@DQ{BH1Ur?Q5r%3G;rk}y zM'Mh㳅>N\ Ȓ{js̙?rp*q޲.Te2AEߦAe޽ipIV/xcЄnq"C)l6 SXk&81*(H6@H_@b_dInTSN1ntʳ919(Ts\Q0}ޢf4xEgǵ*iF@who<dۣL鄄fd|7C:T,CMFΥP % ?&̥@NQY/kmu_@\# qk]=YjbdYev۾.%5OE'iK}?r5N9'11] <`w;05qɭ4šc>j D0*Ix9_{ړ:GKgK3o_x,t@ G=fVS/D+BД+#\pmzEoltpFg7M(eHimruCl9t 95%00\dY0հr/±.yZ3Gh*щO9m{`<(9ouBh=Y¥Zݾn!$Js$Y2IeQ{!i%g䷦chrwרs` mqDw׍b(S頔l)TDކ_`yqĈBïaO:KIjL]!I?Vt? ZiHqEAv'Y!)f Er@Hg(:1=2~mNEʳα@9q޽v!Wʘ /}mbQ% ]hdY2/{X1.!\j.uҖeV[4*`Ny#3PCQ@Z.)q6117[Nh 7OAm@I.%!9HV]6A@ڀTm`8Xj(˳K$C~ &/Ҡ)p4pj핇ôp|*XUfF yHJI]2kPItH1'w*(R8D [0x,4% a*:7Խs;wdKr3L֡e驰v`ipol0> =&HTK.]"eޙX0`bi E 3 |bOte}*_6R_h]¯B<Xt]2xA~tֲ3e]sU+d0=\:C0;VMH#Ծ'#1V\>5uL&p:S.( S%_7eӿtOcE>wрY>f?r`IӡҖȳgX(>x kx rB@F=~O')2X 0B~NkݷG5٪0 @’W %‚>snT$\)ͣ;4TQgoot$/z:;&cm.EIq56̕u%X-qY'Y:TDd2=|BΦS'ɛ.ҿ[e #p5b--kO?D>T1#fmocNIqx[*;on$Oxk ѭD 4}@[`}ZIH N[d(wc[i@оr #M2ZyvG`#w;- lw{X/b|cla6%)T :T1u(;LabF(T/]# BLUpPȽNàGÏ˄=$}O3VM_E䷁TG-i' `XFYeIݢs!RcD k?ﳊNd!syP~%CwZRiuSpVL"~xw s'GFʳ/}aQ頵˥ .|4%{.XE+57mqY.L]xr[9J_ }|ߨWscM(}0(&;ϲmK!=T<r1u ؝璨DEcϔ,(x'igѵKFp2* `KaBGtڻ@z`fDJ^mMhFp[P=w_@cNjw5E멸ug|ĪeLncvݏ a ű۫h=GqrRSRk^Е%1]'psȲ뺋U>=}HBA~sXoo"s$2Ŏ:V@*~ W 'wu\:='H{ƀEAB Yz@<-G7G"/7/Yrm-qt -w,r$vd`]';oŸ+jB1PФ"wU |,-,ZސtjP=Hu)׸ З&}ta(dSns X :SA߉ԆEsmT-gVl'9[2g&ci)A0|+QVTQ^.ĤDb;Λmz$7)7G%gY[ST]0}®O+f%TͤHIn :K!Đ9LN-ʁ䀩tᖔY} ΍U Ƣ TM@֘zGg]E%WZ挸_|+P0jJR3OِnEՕF!r˝:hϰJ.ۉ\ R̈ZQ`ӈZJaӁ1X#z !@ATX(IYY٢ (5oipbZ;My+Yeb hJ2麭;ΌUd2w&0'3'ͬQ#a4S8kg̯m5vcVxkG1,1?d-T1Jy,LȅW̡=g8`)Mhg=tgsi\H av|JJ}ME)PvBl}f'RoA}BE@9-ڑz5fAԙo/v,{?8K=*Sz`ўw $Xr,JՠH>zu2=;% }MZ>n-!sꂚ}?{UIO)WOE]@-"(w8xVֶ5d-M]/}]zNT6P)D. [&𼓍u4seΐ^m>i¬s 뷉 n s1(.Z>x i4s6g}G, 2Z~?EZzRbJg\51$O\oBTIt`p9,wfINQB`̓  qT^!ӐY.:- t"G5~Oz5v̔]>g<`wH:dž| M/p10V theqb?|ߥOaE|Ux|K,N ?vgӯאeC]ijVLVÉ Lmթq"`( $1T4^fJb<3Қe`AWZ? 4uߛ{vۡ2upRQ/CHY!>,b8sIdƱ'/y8WoA[ww7DKCvü~+|J#ߖ2#6ɛU:]dy"VVaU?\ĎgUNZ(Vr:oD8v@@#L663PC7/$u$h"B~r8xW/˛Ek(8eþq%Dxw}r !ծyH[vbed\l䜙jʞ(t=Ю3W{t-p1¼BxT'괮MtǑ%91ZB#HwQ d)7: 'iPdm&w?揭wlAY c@;J/ʧj7ύ&P*QGک)hP8)P˜E3UF}37ܥnQ iq+ +`䢫%|4TiWɘ{dJ2ìQP+V1Q2|g4VIzSk \O[ lIbV}@?=%_ScEH%AS&"S yJ#2c%ϧ}l$dԳ\ h=ɤT`qĠt0 [졶#'XQeW=LV;vΰ;c5,a!ݼtzd!fah>kQHS۶L70>K$s澲@ RR} +ZzCiQ}j(SY+*m0AXGM:6@-^Fee+%cUozQI 2(M*61al@^ KQPA"9Ήjʲm/* >cSp#`ڶh˗u |^fr0Ty  'c+sǿa͟ɣP AB+$L-"Gz#&.|pڷ?B Kx^sǤg6bd `$gz T| δGp!K,&%iG{ގ.'vrݖ[wg~Ӈh@/eǑg^;)Y O^e*K_YY$78|G\(>;Z#[mۦE1 R7(ߥa>YI9;JJsyM3=jΓ]\O^2_#mN3%\ p'@/YX%% B [DXs/ǷHPO q]3>柞" j"SbiKiRk(el΀Go0eMu ïH.ѲͭcqWV#QB(#(m[.#C~ғ}CruK`9ve1*ZnsyQ{5U*TVJpY!_fRFEgri2g 1?T4p\Edz]FGv~ Z"(2̠gH.0 te] "̈.CFГF*ᱡ55Lȯ l#Ɋ0l( 'Nf(:` z3dR;(?9;L)9l_X|%Z;ao=]OPlr"7Q>"Л ^0{(M{֨{6eU-mP|G=ar*z0oFUԬׇqyvOxaFPVuͿ q{68zjxBX1n xE2/JuÝj ckX ݢ%b};]awp[097hMInv$=kQZD@ ѵ՜/XQs׏#]{_=LYۻ](oh%mn|IBijU:kQq`;ٺx֦;Yگ7 70;0 4]TKPLK>lO͙Ġ4[“+8w L&13xpdk]?./mw&T% NX랒TQCz1lr`4GqPZ%F8 OeI!SfY$㥱=v [m`bQpDn1BUKrawY֌I,ӃRDcKwdcX*S/`X0dވ:Q(#UaM=&vX_ ˆM?!㥙9a06-Կxwy6] jM9zA!% 4FQy{acd(V~FDLi5Ɣbi+E?4!Vj3"-"C_>_p`mZP3jCѥZaӊfrreϞZ'n8߈`A~mRBa)O%j$\!V$˼MbI8F3͹ۥ?qaQ3RI,K>vZ"o3Գ5 @/X/r19L?2#T``2tJ 6ZDq26-QUα]3ED(^;,ӗ7Wy`lA6kuz&~m#ƻ'm±Ξ*#zP,AP_CBRZ& _f]A/2KSkAVdö|won!:` FiyqH71: |jٟ5T@gy>(P," (!4s|ohUTDӝ.Eջ̫K '{m(1oAF"Ssz]Sy\H}!Z`7*X2NLyZXQ^`KVFB);igu R "]9O}o0(2)+V:<@TK?4]ա+sߥ_+ȄB#ۡn9y^ON;j dʀQHD-k s2& ̩N֗mHbsx?\.*HUB1lȊ7xd/CƒbX@PCK0ve1ďμ,Kf}͐%Ӻۓ5a Isȗº.Őnai7ܵD&d W;EB?H"2@~5rINV'J*Sp ^}KT|qZGT4bP-F9 2D(Ӽ(4%Ig?Ko\@((NޥEAT;g; kˤ#jybQ'./f TzeBl4껎C=`R"\#&3T^j:ºD~C1=SQpܔ)Gf`Vs.`DEQ%vWL]Uvøz_9+w@DFNp(jC6sGN _>TLT} ۓJ>25&L:Pڨbn5q2o@@w[yZ=I2HFgH"#ZB)OxZ&}l@y`1UiizĻW3(Q>AEɻ^"Cҝa;:pAkr*kJ@W>f0h]pUL:H f0dK}&˴]΂6 ۂYD%6wKԭ Z[zvfe8V+WH]Cs ײS05HiiwZ*c61'MekYr݂r;\=ʤ{UF#l=-FWG1g ]qt[05U >WgfT:&}Gfr?Rz5ź[1y}Ә w1+)n_GQ7 9/D!" OtP^~q6ieL;&Hl>tKYYV Q{2$\㎸#5̶\3?D!F@ůjS8|rt**̎0uՄ+EN׌V!"fQh)ZbGP V$J!>zF?>/@̗YbK8ur~zJ,,˦dHא׿>a./wb'$i$_)clZ4q, N!>ƀrۂ$ .q sip#M8+s=|ٖ*7FLB.\#XoJW- 'nmsf<5'F]>0?!pњQvPxMݗ+꟢Yxedf:bbmLJBJ1KޔҨ3,`A~  ; cPy|$՗Qd[6l&SxpD~#F89@r돉 Bzf'%2~IQ,ANv: ReVwZbH_v24W_*ۺ!.U#5fԙ-QSRq|F6I)VL€~gd<qE{{zC1G!nfHZӪƔSxo:hW%OuzS(#wzHyyh08͖?5YpVF]1OJWlP+d  3%@&5ӄ`T6E>ӑ@=p?pV^ ^8HO,qugv?@XA5\q&~dpvɗSE4sM({."F~+@ ,RݔHΥ )LF޶|YD4.)Ip-*!:$Ք^*cZf M0}&[(GWw{q2cu Zzm'sAr醡uQL^e3`p#-6E 2k&GŋBy J0_WA'9u"Տrx~RX{ 1vl٦!lvm~V+/0,5`H.$4U93#`S6ơڙ$Vn&?ISDL,*J~>I_SI#$W jX~Dp c#&2 !%e<~@pV~#vzht^;ze3APOx5e1C .B+{y{ >䒁{=<9-/.<ͧ<,j1hkyf6 ֩TV26Sj*B ˦eJ\!%e>'Eh NG j&4>=d~ ާ:΄q}|#m]B.J` "h9sN^]PX-5D]Ҟ g ﮭ$ 6d8'6S7TͼMiDr}Ƀ+F Ű1al9!H7/53Vq'%CBT?8(?xF͡%~KVxħJç{j#&98:ޏ)X׬$h"kxi'( _Vr}hZbTY+L 5X8 ;^ M0Z$19|U/Y!qq.J(9 T=z]y5\* |Uj(CAYS rX[5N5F< ;`iຏkC5&"h9?P~)G03Q'ح!{]̶KƂ~*z&#M3^*OYkI'F(H΃z7լ裮^+0SR #㖰bԇ}m^kbSJ2:}'8cQN`s?VR4[&Zn!mg̼ ~GXMZŅZ+3hn<J[V>+[ h^7lϳq9g@,zSæEJ4}&t] c[",n5V-5Ļ=5_Uj}b [v@AnPȫ{zac*rĕ[JD9iMrFZi$e% Oqܨͮn*n@Bcpn,<;bC5=g,),uĖvjĹ~Et-ie/Y3lD}<~˕:NcI.TF#KP!? u|J_4LZeh&U2#5YscT?Ep~WEaJ fɟ]hQ1dA)Պ >~U pcM(w/fpٸ{l{L}5VQM$(|kҀwA/6`I*NzN7`JnX5X3ƤPD ^}q-y1CTj!P9bC,Spfh_ 6Ԕ'ߘ/jQM](}0 j0]J^HvWͪ=ZWR) BN]l͡ENBT9̞ŸTWoP{ظ}\ƈÆVv퓀k@,@?ٽ}GLh7U5CJX늸@q=AѼÇk5OZ6|W~dyjiWv}P_J?gWżv8]MZ}J\$,\Dža7J3Ĵ%cwuUGY6+c1&o/I[3FX yN&hڶf VTaCAM)1Z{H\Y%)U/]hNő:xچ,xT&yH9'B@}!LC,s~Ӿ "O :FH S'dDG}q,(82_-Ԉ+lc:0}1{@jv&ӌ?zAQF vaGfF#,Xy?;t? AeDķT)sM[s}wũ8R_>Jb_q%! IuZ~=d?L*1/!!mr'TA[Sso)[8DE`\3URuR SLQQnda8M5W_g._UHŊh?D~Z ͦ<5 77JlDH":Dlw7(PS(ST8I !flb %? P-\ueEQ=>QơkB[Pu$HNYP#7ۖ0s[LAHyM|s>H*̄aWo;yom-A)VCK]58Fv ,M܅!0qkz9D?[@<:HoMUm}6'Of&RRgdN= E`WfOJ?/!ےG0$2jpF3zQZdhe(Qԏ *G`\3s~l֎fZecTrz?cu)߀>$~KWx;+?5eu2D;lKBýkz^E5{0 ꅠu8&\oU )dIi uZM#H:\16DVPƫIՎW59T( ipo d kԆށo\J4T)(7f/3BX)fCtuܰr,ijeB9ZrH"IC=BI.gPlx!Gs0'p< K9n篤e6%-C/e9$+i0Lkqh+Ԩt`KM i=>rg/D o!]GFήN%YU%S#l*Bp9dB*H$]e8ryM aov )3'")gk,7j_VB 8sַ졅C $d M%}m : ' ǝ1%cf.;^ kk;ʛ2Gk[Z0-MHl$Z%(m1[Yq.vת(XMlZϓrﱅ(YR}U)M m+]]4?9;LG!Yg&bB@"]m 2ww*?%-pEz^vqJCK0=Z)̐[= c\/Lvs@Mhݣnt,K0Ap4zi)$,jqY O\!W[ԭ9*]·S '&Jtԉ8>l*oIxZWM}s7g k͓nUAmK#xsrPw\*rT1M3)2^꣌dSv&2ⵦO` ~֖j.0X(uć,3lAxahו]ԯ?eB :mItFS,fxӐ:y)dzĜx}nZP wL*b/ t^GPOV%\ õ`z=w0AAkmdZ/3)Ps7}ƣ.\ s-YA.Q8,Qm_b s(%OXTY\QsQ9tsTâҮaϐzo."[ewovx@ϫ϶}:/x3w{6Fq PT .H[y꧸J@UC ޝ/!+vþ)~v~<ݕϟc#Q5ܯx,vk䖙e&©y;.[_mBDZ~ C/1xkKg#KI^Tߠ3$. *gIqVh3*|3.lA=ceTADDʍ)nWF/%5_YR~U?+֊ +]ܻ q; r\+aM؏2FH.8t "k^5tocWt_f\AS)[\fR,5; *"rQYbyJF|eW/8j4GaxN] [  $4l&WocקIn rʔH@-c sEФ5 9Q6_%1!M[µSx<􊀅dGt0k } @'f HWzF_J!)[ES"=3A#'}Z7:]d d'tCj Po{3Eϟ!:)څi'N0u '12<ӸdY햫}`łO[TJlwk sQwy5Zv5ExԣkK쮚CjЭD?t {imOJa?w3Wc sΓ)Zy~mѮH]'5+WC9e+cQS[!i~E| ,)imK4i P4`Y\,F/8dUl%XA(4 ]x>a%+RF B]{ KƲNsGtʔ ~#܃^ErIKaIeyF+) Rsc$HvQƭR?b;Q#/.5 W"ݢ5Oib{=6F%>Mﻖ"[ )8w2ݰY0 s"w:i2CyG:e]* :z't͊;Q6_fZ.N hAc9 TbqlIVdNLRMB֛hM!7FLJC^8v}"Y G$Q4nTĖx1;zqm#|`_05(>8ϻ@x}J^ƍuBŠ:%q](B =qd^P!6R<.=6jaXU=m*]5KKVBc:%=lIk6v^__dy:'tΩFM$͓-YQy{ք$g= Ѳ>0Bm(k ۵67:aǢ| u3Ô0i$4)`ø81i LNcP;cヺʗe/o/ YqݸBy,*i$&h?f!iU|?6/y0vrZD_ÈLV E/Y+<1ŖlTe՞Ҹ c|9 #GQ];}H&v2B$IQ̂j-WY`03f./VZNxY OPw\V**nǨడe! +¸ܗE$.8FG-5&$ɹӈ9>W"!O>ܠ H u4t0 z{.;gQhR.,No\23 0[J4 #!t0A 7N_^7#H .r$yN' ޡ:v1hjT w!U-~LAGwU<4rѯDE+(xŪYӟ\#(-hx=n3{[:J cնw!ΡePy+c.O|xZׁ S;qf.EY~Kqb}hlkЫ=tr=,c`R΀1ucG a8mybHQ+. N Fv@Y);_݅\魶s ݑWefv7vE@]C1L"Ts{2"IQ_s%H w[0"6V[ܙ]#[VBʈn}:Uv laLRGaH*7ȉIIuxID$ 6 wj%&#%7Z&<!aǩ/0Ix?0'hfq9 {𹠣wE@8Cv#g _4DRR+܋TU"ӪƌymGSZOɸQG׬AzY7u˘,Ey;S83#\{C;(( -&,P~ .$EJ!^E*D qS:dҙ?KrPG5߫ ! A%0ZF|X we >y Lo*w(#}̯B3@D{*i91Z c(MB晙*yHPyT*@~ Z+)qsb9Rf{Fm A Ր9H7v-d( 0#ao =Z d"vjFc_mҘpjH| ل,}Gko@("R ޲RCE_(aQѷq*\<2w͛mbreCcC_۷ 1}r=O-rz3eyxa~L>HMpq5G7ăm*rq[vǟu.-70y G K1#lWA1҂qR1|jԳ=$T?j 3,pk)' L@Yg0fh2tY.YPCaKh* B8aHh)m;" -ӫZvë]JKnsس7`SY ۼ؝qFi9n{!:Q!ږP0CFkI.Q(PYOkJ<XLH)+e?Mps7wzϚ-ȷgFvRʯ;ԂgnN&=w׆^w[<5 5 OSքރ3=ЧsSG?*PpwR"}c0zv Z.sNJP9SVT|d[O>^Kox.U# Rbt0MnSgM&'.1{-ߥiF.z$Jc8X:zk }&w}^\zFn]y<5ķcFȋs.@VM ԰+kӛ[_1-;~L[_3& P|Qݞ $9%/l6ih4 Y Js:8N'q\aL׼ONE2'\z26W2Ѷ3(*#9; Dbwx('D(Zt$Db:Cvܡhzc=wb bJpE 0s]_E儗"wa#PGS^2#L{GEEvą羇Ì.$2b̴c߾$LaN ٫xpLu%IJiJ91XwP 6ؒ8 *Q(tIV#$ GAr06L+vMT%Ա@Y"`WS]}wȏ.CISlN$O9\VܿT;y ;ɒ>hr lYmF٪l^vIpEtn;MI˺-7_tO.OQVÐ]ld7 |8DdJ3LDk,4N3#|J֕>-~]xc } a!.<[u$Mxo\>eIbiD<A@)A;hw9|vVͳ}GO۱76x_Y}%L{sF:M3 \Oed}Wj,ݿe]6r+ ?xca[?^+\弟0ۊ G4yZԢb]~]Ԗσ *+L]o;TqO[Vj785ۗeKU@ֽבL1#W(1ԩŗѿm3E=Ctۨנ51q5 Kl _ӏO(QP2` d?y˩ƔA杺5^EKLhޗPv_Ǿ.) ?FO/H|EfẌ́Cx Yt1 O)yq*E >KqY{)(uᘰ $^'oGl 5m\M`Ҟ겨Cw V}֐v ^3+U[`ql!U0 K/fl/CXvaG@kdC}Tj[dcA{SPY^.n*yrնh!hlZoרME͚;յ0$(-\ǽڎˆdr0տ9{yl<ͅ;%n7Qز0>T΄9g 3ώR&QΝMƶs"6(p[8W B/n@o)%~]=^e @5>M}B:Ppŗ Fdxz#Y&z+P{.&z$!%BJOۯ`v r&[)Q͓$< 4ģ?lXV>>H61}ۘ'jP>q_0EmL0ڜUg{p/R^}ekiG7 w7Kՠu =pݎj&%@iEyoMmu~F+zM Yܦػ(vQh.]sMn"p`YwϿ6"hᦎ*#H_VW-,?cݶhUԜd-%]8-u; @)/kTt t/{Liܪk[6L]D6y8lv*d;j߆wIj#>t:bO8bqj&ovazhVD^8M dkӦQw:WCA>g?& rKTM6wM z n>h4-DsT2qWXo[o=(HcX/\͡>><0Mʦvyq_d_Ȝj&r j>۱ /4_7Hv&/`SgO_ۏh?r< v#$- RBYB}[XU Rz%TB P?I6j="6[?hI{s;XmbBkXMy1%^C3" 1}ahBA|NgRٶ=h6NJǒE|ޜ5]fL9/&TƇ[/#qSԞŹp৿f4Hap0;f~uKVml>CvuEL&>NŴ}}Yr1BK(GjSz \wX&k+Q~Z ȅz%Q*Щ26ԴF ٪J7՘&X~\!ǰ8[ ]ELKkmco6tvΗ'39d.؛TrZb ѼEj*.Fqg'k>QD,;޻ec#yTmxf# HafJFpHy6? <j( C) _Ȅ#&r΁q]1k0` %o*v&I `}Ak4Ҧaٌ W Aڍ4ҝ)s.FAmN d1i4ƒ{!ú ':;K?,{@%ܸؐ g[Q|V ɧ1+~.4 hTN5X; }X\zKk;A(ܖAW '$x>aESbh[d97XSYmEcypTWôO7=DfR/)(xViS#&ݢg+n)Avhj4ρ&P'Jܗ764uKl:h"g* 8QEТނ@TF+0$?"QlRA' ssvޏ8/Bwk =K}S@9 bہhHKݜYV(XbYZHo(0q``}>o&q`QGn'_fm9檠?|7O{wû^xfD@Ԝjh).-K.ϧ~u;؊F `矎 -6G"Zvr{7#˒HG:͇܌bV݋[ܗz7:f6Mlqz'"0z>jF(?8\FӱQDKAQꩄ LtSP*؝UP"P]t8Z: n15OWm-wm*<`T!7<5ǼX  Ħ{:)VV)ZO%hUpSgs] 4LKbDgZ`e7K+\̳]&AOdC l=lQ.~/[/+SSJdLaIsǤmt?T  +3k\/f`6q,D< 3':j; Q܎]&RW XpsI#%?2"bX40v\2814+Xl8Ia CY:fܺ&G>}TbGwJջ?UҚۊN*F,u6}&t!P|ּZ43\ "N0/=5d$.(LѤãziPI+*ʝ7bN->ba`m% Nž>#>K Ub,@:ע^k.D#}@k>G>6K=ܓ{cei]JAUnF%,}g[YT;&}ѡ.Yb塶#W emMBFa#0#Sp[Ђȃ`TVsf.Oج\V.Lzaev^8ԗ 7mC(#8v[S2X_4ͧFbR.]i39VtI8STRR>궵x#`Iy6/Nޝ.2beoqc # P6 ;#i 6^0h%NLAV#J[ʏg2pKr)T&9=T&JnvAU纓U PF^ǁ6/2ǜ_3{.p~Y "L97ڛc0zYEZ'E')vyN򸙑.6|$kݑJFtG*ezyH* 1=ɎZ\:,yOV> D*iSpa<_ ~Ρv/<=2:+i&vѩ!l9[C( ;n§Щ{;dN1I L^8Wuv.ϭc_3.b-zM~Gfs{CμWAIJ_bz=H|z2=gq-|13-> >`@[,TƮr8*";pP0s!| Ya$E6$@W Hs#0b`6=?i%k$v5bC"G^ɶZ#b jL{RGrL[aI*y8[m,Ǘ.;SeP0J{+\m 1 )1P:3 c98yL rGt, c%A) ?- 8~^?>˓.F^ػYŰI&'F23[[ѷnZH:l烘b3-JhdDm.]ᦉ9J 샼vN3TivrcQaQۓqm095t]a9$f> B{Kn-ˠ=Ī`k &kB.([&)d"& HJ:m}BqoeBc՟;ޭ72=mV^F0+,CHUGf "Ym̄菡OIF2+;Ok٘Ek˄&INw=Sk` 1s[Z N@egvb~,P4өQXD{=R2vդ&qnl͔t_ܴ~ ` Ę4 g@}uDRSytOc9۾ FDc0hRhwZBʇK"L*xQ: ArG :`%$`.]:c}<%ef s6PU t47_ 6.)mT'26xP W 5e܌(lo(c s &_[c;KKgV-|FkZ҃ lа"%2|X^؁ dltxA@5=r+h F[ul2'n&ʌntbMwIC}f\R8|})>Yrϝ\kSTW{`32ΥGk @wWAE%P(`KSTeg'Dcf6&Hjq1S72{`R/rg|⽈s4ۿLd3SV4аRv7@꫺@D+?4e}G(H6h1'1j{O2pM3dbGN],;Ӹ1cfDZץ@; }(V|%g07eU0kmnǢW%l$چt߲O}0e7 0\z S4rveL4GO?1]u7ɗJJLESTh3V-?9.Hֶ:fP_INN+ mӗA)Ꮃ1iI%`Z bٖQ 茒Nw7strӪ 2BrA aeGcjkaRwPOG}g<~7w=0y%Jr{b/-V.c?-|iZ .XKdw!NP.RԺqܝA8tqNֶ$.9t_uNձ5¶`cq8 HL%P(T<0"uG p  >ZJfr*[?_$ƨ]-84iwRszJ# HiR%R5@:r'w87@=@Z\o DX@F{My=XԀqi.~ e徔"TI"De$ۏM8nw/2VlLZ7qD:AoR8 1Vm—3rw(6,1}ըq܉;]˜G+` ,Ͳܭ`,29y=GFZ6*>ܴն+Ǚm&uhq"~όJ& #6~0P~zƖ+fж #[0]h]TRdlU4ջ2}hjP:#U mE8cZ@hmA"kŴN&>Fĩ4(FT ` /P' +Ў 1M\}2$ۿ<(a )/$Z"޽R]3Wsf;68UyIt^()S; *q>wTNޠ|( ~4%P/eg.%]j|EJjھ)1XqS" @ vnsjNgM?rzN_$2ty~Xw x鯎Ɍ(B_- 97'v8Ϟ+@|!i{. 7P"uHW$b2go ^d%dM+Ԯ SB))}@\{3o־kU;RUHE) PI8l,gT7ʔ9eI#.hGqeE\,Xbd&5L|XX^-V:"B\̕荲bTX_Yx9Jkoz@A^ ĨZnRGky#;a|hYWȎQuo3e^=֠XS$ OǓ{~E7ü @Ȭmk͊x4<<ӗ4˞UF[ePB<7G0n]k /ºs Fu W=Ip p>fn07e%i_Y~4c$0޴iWaSv2 ؆$iΩ aft:R߁*' b9(ZpV V}4OT@G\!xbEN/$ -[q!o-9PBTړ$iV\ǘgG;l>vxࡔDA2g'AT,Ѱ=JyߙX9b-@tF ٜDU`뻲:PFқdd_URނL)lH ]fbGt,wP@ wǭȗgiNDm&-bW^?ZskѦ6`$3Ɨehbte}^K@A||t?y#v>7w}eT@@qμINC\qyk!W M? ףluATK a(ş1IbQ_׮Q?.3T鱪%^yMw%jYl{C0VL;C?+SLjSJ.<-N>&dz:M=vFKQl>@Q>p1U| Q]_2ΟcFHS4*W'bRl%I6lq`\# vu'4yx*B~Fq':d.EѶx )h(,L4";_;AS,7uoި:da{ LV!Vu' xETe3%}-g߈.VO%zՎ4Oa0Ԗ"ڨk܀h.|<ao gS^6L9d%M%L5lHǻgΟ.Q;c8B!Ŝ.़*2:iҏgGkV¡M@ۗ&ޑ *>ɚͥ# iY*New MeVLq#bMjׅR0Z (_TP]cGv3+8dBo? ԍGSw4#)|0AW  s)VӤ靓~++zY 7bTF_)&z\#58{t?@iԥ"p,׺g$M! Ċ2nSjmV`m$HYP}9iaг<'LVTĈXY 3Zw t I)XǩevdXD`WL_'{rP)6ԖIFʇ5dJ7>Ǽ EW*h#O,,I{zʭ `NÄޖ9J J;xMA kYa?nBC74eeЧ=wy1s+EK]iy $A%9NcI4m,*fL}(a4LՀndZePDo-|A y*C7 [g8XJyWQR3$y[IhD'[C6pLTAK>A0bAŚOJP۴+ *B"`ej5$Y. vu]v LVtf=ˤoCa9\NX(HqErwOn;2[- xژ[[x}v*ڭbJkup?l宨MV6aY,ӄ9ͦy! )gaN-5EwZwk&DZa@B, /%;jc$ATm@ԡM&[u'b9@Ȳ<(=iw #v_ vev 1>rpͽ0Ҏ0Hc]k`#{X^^ސqVb !m 2ŻAMg7(DX7tZsOk55St5v/0〰W~G 8[*9.WBjDBѦҡ/bN5 uNzw+]e+(ƌ {zLa@GH(;|Z4<躮g5ɠ83kJ9J ֒$zH ieV́Gm%q7>>,ze|L`8Fjм,?⠾yT'{u- %W.3ŧWqdTcӃlYۏ"˥<̍잲 6אl$xlC̠H&UMȵy{BXXQA^ ?*z[Yͩ>W3M/t2~#F=Vb󃪗ȪJ[9ՆP9Wqp&9I˚~̩o̭w u}6/35A0;!CrohO]Rx܀6.U?6ٞ|1HV(( rF7cb ܠ֍>+/JfE0M,vO$m"{Hpsq>'h;Dnf4NɬeJM!J׶S7XKO c'ͅ/E8(= d?|-pI81k<ҵ ?C밌™t}>$%𱒵1moFuEMFkڳ5h&G|[`.d9G7t v|$E  h́ntʠtjJD"aFk&;+/S?Gq@ՠoEʭR#% yG®'Z^QRxY-B٘3d#i1wXt>IJ8A:3Ўh]>HDGXA(h8Z1z؇C,> zAK=LZ,PG*T>MOAoNSkv!-Ǹ"+xG؜\uAL*Ū+䣥 ?WPa"o41ɐ2Ⱥ[|BAn̹ɧl3r;t<ʡ>¨ޣfB,PHG;h<=ȮoE3-P>]ї&$,f=K=f/"+% C2SyM5wAe>[(^=FxTv_Do6- 8jVL*}Qnk= ڟڸH(! =;In̡dh3"v$̱͑c# ߐ-Bv~Mh) rDOU\Z_)mR_bhz1+=3#w舰՘xTi_pWӂ02GW&ј&SM1U8 n?WWJ9 ht[=]xfadjɩ\l_ a0۲٭gYq^su?Q̚P~Se!*4ʧ4eM qWJVzznIC4z4W=76ԫ[ư9ɨw6hI G'NBM 'p1T-KnD=5jsxE܀=^nz%!C:X_:qSnZyXIV|5I@09ssCdV>.e(ġf9ySj Hz.Ku޼S`c| }|KR(-״>o,nbޏ] ~UeVIb(:nhCu 5E74i*s|z$쿃Ńl7xH)B1]o|yOҦrn}?-+6*#g҉=Ⱦ7Ajc{Ci3rcArtk1{p7ţ #Qv}M1:pe QaxǺN@|޼2|}1BD :N7BCI#)?$lbi;XԌ6e%}N T=o3ĝ(Z*+Btkl4>~Dsx#vG)?RnOoZ2{HY.G+'nha]oA6Q56q-g1հe rN6LL& xa|q7-Y:F1HF bsdb3cplIȪOM3f0P} ]GZ_uUnд)p. #f°dVN yR{l/J =4nώ +)xX}?s@H+`*o͚DznYK.pq36@ fi6@_y0miFTΤ "h4Xd&iH|1xR+C)2Q:A@#{qB R6*ciڸo˷Z74"X"<|EF͝"rP^8!<ҾOw g-sQ!",ʪoju!OF8&(-kV#r%StAWd3۳A?#A%M>(pGh,$N.{&a tB,mSݱbZ"4YpXelդtY*y} cfϘC̀)`C7s)NVۗ@b͋adi-t{e>P:ae>@*[<ƒ1-_Rkǜ+}+z$ ]cO^#JĆB-9(LDasXLBdYޮD1dsPZB(b|wq5'sx P\kLƴ9 =a"O2Dtsb{誦>מGSqm羏`IPGl)BWo{ .3~BGsT|\jbQ)GdXhtX[ؖ0>$R>I5X2E>GOdPJ} C]el ܖܭbr;ͫ&K{.j4dػ_q lFИz #*n5D*1[iQvHR)80*Q[ ƻV­AyEyU+U.qLԚ(o!Ǻ*mvғ*>5 !I$-}7OU섓 KUT) 1X{CJ{mUWVE΅LB|L6'LĿiII6lO%N\|f c$&PBQNΈs(} qWM]4g{v>6O{ýmeJ1sQsಲRaML#*c͹iQךwLz{'q8ՑE$YԐx-7ɕKh9Cd}a)d]}â H7 !~'3Fc[b<ɭn7Fߙ4 agc+եb= 1K nE_, s,*Br=0W]V[ ȦG[Tf$#p!kU]A]Ckt@j-hG1NnֻӠI2DdG b9K҅Moxv IB&/eJ%۶з@b'0}@L#076([-+;Fg.of%BUTAΧv Xp2i[SlzIڨ{Oh#gytC4,I{L~^&*Dsdgצc5JGeRqxfODgXsUrFD߿zfAI+IJ.Hevd{CL䣌FϧCvDE3\ * /v p(7;ֱR~߁$yTfi|Zx;7Q[ ZZL S Rujm1cw4 @j)!RGD=Qbȴ3h 2Æ pv͕Bn]-p*P:/ Ig.E$9E>b Pj`\e=DR=j\]M3e@a5٦]SBћK>aAÛ`] `,u]8-XVwC1٥6)4hVk8|]}9RJEY(Poy7'Ton>OZW~EpDel撪9Y| ꬡ^Y)~d~R5iC*A#Z^1Fdog%82 $~ÇO Ϸs{֬]W ᙽ5Ðq/;-uu{uCu:I,8Cq1n(םfa< AXBDzQ  ל}^j6>1VQ/;1Rܿ[0syjLֱd8RP-q<۝ߧEk' Z(Ơ!Wy\:ڞ(؂=#@ST%"`44)/_ $Z>s j2ŐDn1Wu^!dT)c^A1Ö>h㨧)$,ǩvaK R?A*TWR~4>k88L ."Y$𤿰+bx/z ÿٴ;76&dقyo“4Wzl~7Xr:gbOx>Ye.N:h>͛t16[7 v)7w'Y+۶ Bؐq#Oe4ÛŌ>o9KaCₘ a3e7g=T }=L׊cN愶eO'_߉Pa-x]:am9voc0OhZOєЧXkc^T eK}/dZf)˳:٨ CwM:h, s|ǰM\qoyXj[x A'2ׄԼ*$6߻rDˎRJgd854~qjQ7a#vg.n`$d܏erN>mn<Srgtž\L{(#rWn'wb`(}=kZ3YmRm)N3VB'?U.|@*xg:ݒlO10y+Q}Ŝ@~3КIm*dWbQl#< 6xnj߹VgKVvK<{tR"l0Ў)Dʚ}~)CGZU~2ʥvBYX[giuEQtU܍f)HmՅO`.8^W{ /6~vv{M-M(ns:+`luAYfॹ7Im%oBi'|}L[slQeQ)F#Jj_ ZS4 x2GFEFj֐GB,Ft NkMhA!*co,>Q)Nf< dT4!xG9qg442z `I+ o~bfo^^^aO ӱC_WQmɔr ŮR+,m"0w!ɛYn39G)bקK1G&p +XB% O${jگNӾ8TD+B.I]L@oR[hM-[Jѱ0,F pJL8Uʈ_#c$>@pV9@[\b1i)6cy7U-^f]oG"!y UxiŔo^Lpjz8ζJdR˝iH=#wG(ߛBU "΀*[u]!!6/TuaqgQ{fGJ[W*ׁ{?G[MGњn~dLL!Hw|Ǯ02sÉKyMU؆^|*@{h#sERÎ<'m2%:V>7$&~-3ju%شi.rK(ʋ(D}'j!t)oKhru&xzEDK 5 S9|cQn>d8 >xx8:JGmD}]?ۚiX~d 2i_ڡ"!C^m,~*\įqxh*ϐsiRCZ:xYh~K7|ͥ#Le~%c2 t9: ( f3P 9~U!+Ҁe k$Y͹m ;yWlqhL1N-4Z>I>gҥe5(tb0?Ua8XOTc K;\ /$:@ٙX>s*,px%Hko+x=C.EP,$sWww\' 9Er0.Le!1iwL>buQM>d+" N<:iwˏd0g(&ZGR\NL~+݌R]%td^3aWoTDuќt =ħ#u;" rd;>w¿{;Ե }왻M~2*^\y^ZwA {+ԥxiK{w nF+@d D1If TH?DRoǰGޜ$  K\H6'B&&u H[;]L."<*;vFL͉[wJ㵍.{=dUB9“>],*R dZF6{ἣ͖+"a5ҁInӋV2&غ&`.:%1_ε1uyW[JYʨEP!<9M/16'jFk2G[:EZ>Wo LRLICI/`fDS9LIdɚ,O-nc@x5*EJFJ7.r0-A}Ac甴*XwSc8Ց~I  XIyP+,cІؾ2ؔVr1JJ ۚ_nHg-;p 2踀G(p P$ ^V漦[I' nJ 9|꟤}byE UOj{VoM'c";- v1'7uF{P*PZzfKKԻZ"EM!57:B VhlH:.z/j_Sb5jL]D] Vb7E饋(g@F?C`H)P߉u׍qeR^G%(e dLᴇVvjYj@L J6(;/OB*VpP{Jw靭| _0_ _@|0{,aEt"}q4`АJЬqC) HK]+]\{,TH` }zDPebKT,Jnl4QPD .@CZ mySєڐ |,7R8~!d((7>Al:74O' Y;jVKe6*KSXh\+n:&3>}N?&HL1Tv3{KiqpB=u-bD9u0. bk*1 W c* 49ZTJDɔ^ERpfxs(8LQ7 W.yjK GtT) ϼu˓ P+*y)mBdU3mPt+Xɺ[RxdCB'*zj).t `ߎ'A9*J%̓nX.nt1،l5 'SH.FW7cL|RɅ򟙥~dD8X?OB;e&?q 0!#E5(p r̠jOԦ bD䌵m;EN M Ec_ZFԳ!V$]*ЅtGnihŕ0 fWS jxz]ps~uZ%lqXC-~.Håvu*7r`OϠ G+o(#N+c*uYl[Jī [C2'b=\i6,v2|2݂rs'+"NgYģxTt<| X&  \>҇'uX;Q_qnr.s-nW\%uMJ$ HiHvFAl20K?8JKVJj@eGp?C Jx5VA-c]0 dy…썦.@ ' A?\΅h"U!űF)v!kV>:3f~1[-K ZS|k"FQ׋7͕["lbC&_F r`W3텷i5-eFML.NiMiO[HĻ.ᅝcbM~ nn Ӥ !ARy0: C`H3jWpz bZDn5\iG=OjF4+$T=}q H̫OeC+ڋyf!-6(}b8B0.ǯ"0nQ:ƿ>岣 w)n67LbDbi]砃n҉*᳙u.Tw*? 퓩WWFE3K'ܔB}A6ΰ9%u8]s-_YOyt|H>ۘiQ8^S4ч(VW (csʨ—m0_T|U ^7Vv@AUzC M~B %.FdŐ3vnVs>s% xvf |xINKx ):{HZ1?F}&WUa?93Wpݶ2#GaSewۥ¼Sӹ\%ُ GY1 agZn"M{DGzk0[ly$;h=zMswkay{ 8ⅸ?3Pc F3S9=w<}!y5+mY&{?6%/u/uGUKVHlIFbm?؉]x(_ RWu=knVӲ1d{B ȳu:͙t}L⩏S' 9wLfD=$l=`gi4̜@sT (b!Q|eJ^C'-bLǧYeے= )~u)l&+n Y W#9m/PJrƘg3>ԹT 2+H2=ds,L__XKsc/㜘,ϧfקi4l_Qh:Qv+B`j;p\ _%?'reD^@N_->_Htut ݥcT0a^ᷩb+8 #$b/374BrH$bX%0CXD(ZR6h4ӮVXM&ѶhFZ&pS{'`XVzp佮<}AqYyu Ig,C;n<oY[ 8+ν@^}qvAoZזbՅ` & !qun$yr .2K7E%sH8ʮdojzLtY0̴ Y:>8KTϹm~.7 [!`% sʅ]ZهHBdvŒП{+ 'DO-D.C_zt]|UqL_ $і}aNbWUZ`+4{ ,Ek(Q  4)9uď> /j$*y@q?t?ye"H E=mXV{P1rNx(j]ukP@6FuXAEuI޲61 AQ}:?J3)F=8PRyڪMI"^Bt`z0}8jZs%Å ȣ'^vX+A/rA@y"md8pDʗŗuFn6`um! x%hi9aA)R#lbE8KEE8>HZI'=5"hr\mHG? 8'muf*^nJlF'5Z7ִ7߳~!6,մZl'Yp2> 6iR2"n+M. }gӟ?3]W\׉>ie<5D >(,n.uiTq`W$RH+{qъfTTQ2eKiC7{O+ޤۘ?}ZxBxs[9E^O~ya&)jKU5 olfhf&ؒg?z(V,GMG̔itF]vƧ\.w"(W;@b 4N9%loEǁ[<@::#J?֐q0s^Icjy[n^rI-hb6Tv cU[,ן-])2"|M=֖k^\'53Ŝ \߶ePPE"d{E P!r\ˡMwv%g+,7 oΑ݊^ͅ\URxو ט2K &YyKO~4P؏mX֫}ħx>.IT=Եy>HΨ;,%{ ]F7nsG0M}80X\%: P4i)Vw?a7齝"Xj920ٹA;M#V:)y(@R;/Q@-}M$(z'4[=Cu'¯qyg!}t_L.78с|ӅAj̫Yt{1SOlU̟1E 5;yJ YjǕf~Ո#7UN(mm] ϮV 7rPN-O\v` 7 ܵMՒfQ]oobJtsȊ+T#%Hvb,Ī̙Bǀ])V}d%lE>mωEؽH G2gݔ`!keӘ W&Qy+:$b}+}|(Kr&ǪK >3'ӧv= 0J4iݨSgoZU;LCur{wfq5v8^][g_ڕP/?/h>CFl[1z=n& RRKh«dؑESVx[ (Uí/ZA6G6+ vzlܞgA1ƃ⇞W5^1Z,dJ<0L%mOmm E|v"Zb?":%E(Ǽ!A85ګ\~ sP΅RGZmp[ %n=W. ??N Й?3/Б݊g׶xŶw޾ 2KFL6u`32'a8XjwksӱRIۂ&u*x*, GyMxs%p-, Xzz w}m3Z2&IVq"Ո$޵cIhاwZm| GP_KZi"[ ʰuw&gw"A-Ejk),^nPV7 zKB}BFњe F$0qM`^i(ݰWf(x^̳ס o뀂;3~1ALvʧq(e~=+ڗ0yҧږTqC]2yMx`~sӈݰ67Vf;H Vճ>@2/L򗠛kC&0’xNŭ۔ &P@~sKl g)]в@ gܒ؎-7N)7,='͏pUtþ[%t/Ԇߤ Qi%~teySt!an?dcS N%0LX'6 #yY7VU>F1Uxt9WSE[ټz-wWuB>D Un:ɷ:kɿRep4-)%h;ueFCR#MJfS %~X{ao%qWM(|w2/n|o?xGyӺ|w F<%[/iC(;35I[M-y `gQٍ"G@3xOm>B ߑQo:&}^&نxm<ieaWtYӍ  †pR~J_Sl!F\EOF#XH ׺Uf}^T$Sv;^ c$!,,7fNNo)X0B!hY8 Vutb;QxxLCvTme!I{G/qkP;4\xMHXAs¾Fzy#r#Gʘe0P}Be+7^q&6b{H+#|4а$Ó{<7tQ]xtG+g>r`346ם-P`DH#^![toXuìC׹txN.u\Bt`|Dp^wqeh)hat[kQbS^ī5/SAm-KЕngߘ?45/J?]R[ rayxu93?]vjSg0>&pN\QQ(N?)ۺx]5Ag 38T0#wr[#2$3ܮiAa0I>S)vF1"8b `UyG\9[T5f-9ӹq1rJ^S|uE ɕ.rx RƵ#!]'l'%nsN~F@09T{maso7xlb(y~'+(b`U 8D`SWggQWR5/2$n6>a#\F-aD7>F} 7L+!t76h) ەk'沣&jۤ{|HEm~1Fl_8\_ݟߍ&~[(ߐ/p Ga^u\ځ`w<ba"0=w׬$JO%]Z+#}ŀg \_fy>~c܅۟ RͷkHTI?q\rgd!a5;4ϧvR3ӘpSRyFSwڣGAl7 >_E 0.ڗ6_G)yO'i \CR 7r3ZcN%k_06, ؗ*1N#Ne9{ȇ\dCA"*?_QͶ՜eu0lχ~3<4/)g]{|atk~Qǡ-]N&k+<2 @n==g~qx/^6أ^\0pIQwB<>EYUpS LЫo( [#%Zm/~eQ+qourf G6,,*)ϊfW7nhf\OVRZ Ӣg 3EKC ټfaY 1?Q[|H8E@Fc/ &xCYsGR=թW:$JtA@c3Mթ)m(=jA Yo 8hA#C""_cR] Lp"B‡([Pzȳ$9γ(eCIvdX,7(h^uᛟjpNH*hԭf^ J6~0'e*"sjDҨ;SVU_Qr+ R aD> [l< ^fL :$q*GSs?Hg@f:Xaw!|if$XvVN⥫I{pƟ˕ "^IeKH)ےtd[p\a%p^Dn˽S%92t{'@)dAD<½:Go-ZzTS!ֶ_"p{WSH*úvwx_tcz;=5H;-G;  F*v2W{zTu'> #hX)IÜPd54Q,>L5[(wәM"Wt咎pfL|$^!^C X?$zԟ̱1D5g<gy,#GoBs\EI #~bM0, 1&XsΠR~ac#A,~!ca,Iv=##պ,jSA)&{@Ϧ澴ńסAA{WXgZ`0{ ?7aݘ,зt)P&kkjKcٻxsu~CؘKE氇[`ȇa!p;&eSƭNѪe`a)h*i B45kAG}4UCOoNb& v(V}q <.fԢ1ag1wdl!kW/; PMD :@L* f]:1ulU.phΈWDVVu-j3n*Gk]0yt:?aE(~Χ\UOA{MFjI`f qp"7zEfPT$(1&ZW\^=E8s$ g3lȎ&6\ޔh|{X&GA u"SZmx9̲.C9=AZ6K=\' QXǕz-$fҸK7(z$z[#Q{F^U`'n5@Gdqn8#iTړLHrI7ֻ>UEcxYS?W0\YxjZzx4Ŗ,&4[ЏO']CP Q.YO̭ÐI)r 5ǽFjW)r/ ¯1Q+O^ P~*Bd "#2 joHص"s 9*T7Ƙ%-v ,۲2ҒY=kWߤ˿7^'Cр!eitwt,ZkRJ R ^}bόsY-cKKu Z,Xr` hZ]˻t \'Ֆ/Q(qX4 |dhh-H!DZ5%j#q8קȳl˄VJu&!CGNmZ^" @UD3@ٸmƍ\ KkBBș+UرV*3ӋZ>~OIF|!ކ+lqڎ&@lq>Ur~(W%E^є[- - VA a6Bʳ/٤zUi~dFU5J>'o, ߡ2frҬ~ͬkto #~#H(*ߡQdH䩆d%پVFTdf '( EɄ'P>/vsBlm: !HuG@-u+DcH?5nځAi3ݫˣr`Ka'ER~c.QbT&Vh;ݕG{R&hYLdH%C[>$ pwÜx|cc;1eǰfW&6$cmSC!I]_lư ; Ѩ)$D< vQf 1}*SLcpxݶrc)$ua=<&Y=PTB5t8JG7*}h)*°PC2K đ? ;A(Q~K cyP4@dRhtJ~iT fwsg%BG%<뗑9 ?׀ +XRAfl>f4>̊VUyLۑ^(p#SQCw4e9j|]%`Ɉ2D(C+ŤnÄwA̠zt|0WbtsVhv~ 5FBE]xyNMKftF>xb>\Bg[ÁҴ$&V HHha*.mk9E#UEL˃XL gLt68:=:{xV^tםN)uSdp) ~6>O3--oOȫ- .{՗/]k¯_ U<C5at /rvtQ&)~5RlBD[,˧u[т51;dsΏ3њ`+Ҟ' %GeK LSkowJ@{&U{WNK'f+g ϷKL.|W1h&Yw /xd>;hòƷxY:5R I7y-#&rdc -T k 2|)R7FR8D\u+Ѓ3?lo1vI;57%km+ ޷pߴQlb<V Xw+Kzf0@Ϝj5p+PػM!Muг#$'ϓ]v>+B"5~,JXxB撯,bbxZE!]սTƕڅK+xl~|^[/oPƤg5Hed@~uAgh?'$BG6pƋtbG&-6ͬ9nDrH&<74i8 Y6Զ@ n)}FW^xcS:c5ق!eJ)CGeD-Ҋt<q(5ff7 俹Gܕ~ZWkS؁ 7$]Z銬C ʕkT*ҷkjRsF+o{ti8ECdMr6E/2|\gDZ@Z1215$W\\aY7qgCbVya$#j.3ٜ5%*b7;9(9[p>yxDhFNy[٘m$k(URkW*b&)=p}&7|77y,0ԓ=}C|?xr{Y0'ۆ `1n&&|Nx,c\ev,)(ԦP~%}7xsɩ&HMrF4uRq+%8ﶣꎚvc-EO/Htwdzf* e:w 6j`@\(5-T,NɦWmBIG$ 8 *Fkwl-oEqԶ=Db}Y-O{giuG2 30o;c?u1F<QV0dJA\KZ%2|'}Xo >ƃ\g`+V1tmzV_5'dQu %Wg{S@4MIg5՗?@1lƏ,(AdN2B̑b&/]1"¹sѦMT+$j\mī$"qϝKpm0[n=î Xp=R rowbS4dqCמִ<|p~ӥI@2i h0@L]yU3NMNtT%u4fSr$z]Q|e4n:w#QLJ`9j=%~DZXl:NWǷ9*7J=1)t!aMu02il=ibH4)2#T(2I mڜ ȍi]XuzPK[qѺb[tsWMAXǙDHyOIye1睞pX'r$ghO.oXŲ^GzyVz7\\Mɪv"/,jJ +iC&Ӡl qYGlE:I } 7BDxT?vX0⥀T6eE͢/z;-W{ !7Ejj&] XQ 6`Υ62 \qW[jaL|`RCYIs#l,{;UWڌ7j7g32*ӏxU$XՕNL@ʋT1qїz_%,]=&O,\I3>.;Levua7961ӮxH)\e)шCQv=C ŵSMih KUj^ʹ&]GXۣNj!wKįG`hZCi*#C=&1?Y- yJ&5A]> ީN=GNd4tg>F9/m36C#_dw? / y%&i1\ \XzEw{]PT9&ynfm2/7e3}}DiYqp6^xt'Y{:͐BSlѢd3# dE.-8 ûg||(<9`lH9OR;M+#%lB9쯠TjL%VOwo&f("_rPc~5c=u̖ZU5qyaif;gV?&|RN]ZeJcbUKwրT6_iTȆ W۹g 6F6=qZdZࠓQv'+r i>%oanbdz -S,MWx"K#e>40]oHkhaʖ ,VEAQtGx?4J;U88Ҋ!of·p$|7L<Ҭ(]KX0Ht`R.*,u]Za9f; jת"C yu;ս pϔ901:E7,.nH{p켆]vji[L3[]̿nx[>,xF%i-s:JiAζ=Ngb-.:gDt3 }K(BKpǣj(AEtRS=|m*$z3F6kp+QW=&m0# ɥW,4O$1G )Z/4qJ @/h%v e5o9y?3` OQNC!k.帞 D):'P=Yw·сEd ) 9h '5BgX+ă݊p5AĠcS"~RXd_taWr'VԔ\J]y:حh(j^H2vbD+.~NGWKx]VQD=@SEQYL ̡03BeG陕Q-</4ϛF/iaI r>>U=bԭ o `$h12lz\\>Z7ЛN|-L1][j&4oURL`=-96kVN95MH9 FF0~ݨUaPT7éY2ޢ Od],9D왮A4ϡiAzӋTy`+=z5&MM|Λ+q_K;Ǣnw;.zX5{}hM9̓n0~05dﲘ!{d8 `u^BgNX -1wmg?X̋!CpQ-C{|5[Qvʉd-Lc_rMPY廸M(GYlȨT q7>ސ=(&0=7ݟF ^.) NP"Wl͓I fki2h FTU;'5a313C:( s|b& ȌdSd!}0pf`nJ:YĦ2@qa8k+"k;N\6΢ #z*΂5|i #im]% g'u0z [XD+>i$VOp"hݴAr[4Cj"\n4ɜ +b+7VU%.=aЁQeC|nA~TzmYj 7ΪDJ+(\ly^<o3~֑U~L4_0'O(,σSUtZY,7ZF,y_戰mXrլll"1\ШquC#zge [#"/CTKwY0S-d۬5:f:z-4o؜N+\Ɖ;p i?/x`,wrqE.w]rOפ.{ifNI^/Ff+vw9{9Tj8 m @I@UgYC?eUg9Ϧu͵4 Gڟ[.hY'_}3}`T Qq-)ٻվvT֔6Em϶1b]EJFxOs=]2-u:)buJ8U3}q>}|{Rjr$]M[x v R>)4.@D>P[k&yQ6\hVVn$b_VȜ87 Dnn U[/pGx{lX(!)~m ԛ%7ul: @ͭ@4mwvO= 0JeKGoͩ 9QT,'&MmtYż< `>C#m37-7jUΝΰ_8Y ,^ Q±<0Vg[j-sjPvD]3uY;#qغ2x||?ɽ-e&J/DZ?Ye$!uZS5cbe[VD305 0.c\IJI|y(0N6&!F1됒O6afm,^{iҡ{|b)~!tA,<ŝqDd3 BMR`3dS:`<-jqkA\%H 1-O6{+APbR1WPV/T)jazr?~2pjncZRY& \`ض׺\g*~P|[ =xE!EB ZZ?59 OP/뷬l,~#: ]hӥU8iYԢd_xĤVBan+E>U ~tہ3t}>j#G&9 vGdH&Xܘ=xm*Z.DR^%/>ʑQ=-]-D}wR 9Ȉ\dyҩb #2, g?Pg߬,~l*#/0^h ’JiG3Ț>a놿%`k,]\Yuhx>$89&|~rOy53WTț7jtK|_.d)k&uK# Z8É~X-{./C%7|=J8EgywD("gy>{vԢ|OX!'hꃼiA3֪8{ZOW?}-z׬jN@_Y 9>!S)C׽ ȼbS .Wn+0D-t`͈~ͺRx.>#-%* gzO[e:P'4e={=}#·n'>CN6NuMLIzԾ .~pXxdn%oExfgʢeL,%Y7>|A,z'ӻ}F<#@QJ>7?8t 0RW_}"4'u򆚁- 7q BϹ#{n*H.H]T_Ğ7>D1vBW*(+k>w|6ÁATvymm^7w=m,-ֵeڜ>󤛅և:ou$Qn1n)~kB]bl-1:Nd5B"݂lFtOoLM$Yhr0b]$Uü@,:Qč'qfz܌!UBzZ#" u?V?tp*YA aLlWs5eS-H,7\Wpj2ҹJiCb;5}p@p \eǨKE_WqbzOט1CW$*?߯)\+7A)HʸN4x? 'QS1<"5{U+5$y8;0[sU)݆jWt.F,8l[/[cW* ,Xm&[M| 3en^P%;Ŝy7X!ET[8.vrR4ټ^ZU~NъxxT*N 8 2t9:j-i@`eY݃莚$ܲ߬Zq5eM}_2xuhRσ+iKQW*K` @ztm "ǣ#ApJ9.RPz&f43sBw'}o{_xxlZOR<|{6Ru&.tkffRZ_J>c&PʵiD(EI}֠Mװ)0"e#4OL[WϲG"ayZ%5W*`5=(mTkÃzE횴So|*-'{?azPMR0vDg#][J~ }9n5mɿt[`.3$/?/`fY]\(}}8uӵ |GWT:S ǧ̯kSLٺh D&Iމv?*$ '1iJfnU L^]mhCD(I[v@_r{RU*x@Ht~_ -V~^ux-rī唓rc\TYCB,IQS̸l>~.ϭ% @|ȟ.Gj>5/ձ\ك->Y5*ҀUJ*ԫ#Z&ei6wsqo3Zc)Ǫ3!2v/ǯ,nr*|C}zy7Qn,u%GsqqFA-:dqQA>yT4c ݤ *O,]V>+W@76xkm1(}󗃖EFj殟\xlfr|cDŽ+N*m#p.}ؚʌbU>/g|>]2m"Sg"{?VM AZ̀mFP o&a{6--=Z-B%ɠןК:|/Uv_Cl:;v+!6JG)E?mp(XO@h]'M$g ])`^?lsب9JW`'͜tsZT$`^So`SbT~9+wDqh/lrԱ ma)ܭ!@f-)@8uH#pvaFДv_[7\󪄦4 pKBN|;O"m+ب7m`F!4:L** c|9Sr 23( ᓆ9/=Rx:8)&7$ŋ5AA߃-tB&0XaEyCѧU^L9}m1^:8G+oqT7G'@D,b=_S=5v=yoߪ\gOAmϺ "qKwvC@`C.J 1&'L:2pB & Y +2d#b,MܖKF| (eJweA&LB܋wz!z]4&^!ȑPl-V-BZIchL%3>AXR>M'bk$@ 7f1N0[w>\U@`wkn;get5h21CCphkov{JSĉ% #)4<2-LGhB 嶺1ʓ}oMP靏Vܽz_ ҆$u-ʆT{:[Fm E85ѩ}u.sRx>'aZ$#RW?-UpMɬ}NYUkp"TJSXn2f^w*YCEkɰ=݌ JcۀVcъTX7r%{E{f$Zv!m-p- SvvD*"VƄ;t%I:0fZkL2y`"_dm {%}3 m{3=-+8?\m>BD* yRUTrj>Lq*|Qg3w$9tWIt pv­ ^<4e.N-okrXӨQ oJc=o'\ڟqn> [@[Mn'ݓ,¹Wu}K7hL: \^FDk~H`4:ֹtxĉeo11ƥҰ\h3 ԃGnX L| =us OVwӘb9=W?E5hL!sƎgA|/E~b){g I[}fس5>V^먬o"G$cָBN~nk ŎzQ;݂θhB  NW5Mعy4#A&2pY}Sb5.`]iѷĽDv"2Hnݒo˒l5c6įܵh!e邲<6bsPU9qVWŴ<Ī=ƂZ x4-X  hDMӀoW#XGEqN?SqE'}p5^kw6U ܋\y~3:\u UkiwBvwju^PK!;?^=}UTiD.H21K aoSfR\T_ VP +&!'_&8NA3}:]Ke ز@b!qJ&\hm3+JiH/E8/߫r;~ "MJe>Qʨ5U5Fxz2J NrF=2G%ݮ$z<'֐݈؞' >_V+!z F 4W. ]Bzt8Hsn8B^n܉cHJ4!FW+Mn?kVF6\*ґSgZ:慫1iiW!3x>#f,[]0|6fIMzT`,U?cx1 Ox/%ƛ^biv'] 9@ūqAqRnwvb)Ilk$͈9bjmĢΒQM òUc͈/עJط* 5]L= mͺeo']I5z𭩁}/ХeI8+kΥܠfW_y%2q竄'֒$zwκ$4`I-qY:EEt~5kXnߍU/"O$ReDNA䧔3CpO ;2t/dzI|LtGMO)0)\ls#XBnڸ\JwpxjgF.o*7h'-+"tb" } t>4{èxx{.`PdlَԵr_RaGaZE֣2~Nw^O/>|U`ZhԙwaGߖ W>>Γ m*迼ɶ @Q{&$@=#YAP0񓗨bWʋojddy'fXWw<@S 悮uP{ gQ&3s}9ޤ{ !X3rg2PJ_(*5ק`UbbjGAYPYߺX?RF(&s&x/v7)4 |! d…>QToiGj["RS⤈''GPH0:tIOwe䳿e-·48ߪWqR_t_֪㕖RGGJļCԧdX\ot0qn{*d%Y``Vp7%L򐂐YKUgBL`0:o\(5NZD">$NYZnf5Y=wġb?]E> %*Q.[Ȟo5HNo",+YW, XT:ϱ1)%]POXn]fS](9[J #r53i"NV0R=DL2 FǠ6F=y"U)XV$5՟Ip4Rgke9hJwI.D-v`) ֏bj#fYŵ;cRw῟Dj B锒L#G ݡpju هuu̟1 ^^pΒfz=4^,'ҕwoL('Ku2/0\QC\O|~.sV\1Qj֊"x qh'SYa*+sp V&fFX -4Lh^`jX'p!pEo\I/oXNW޼c CYw%z~ RL!zͳA"N͖jr I{+JZOZ\ X(STKT@1xv.yRj~2 W b "Ҝ`UnfH`4dY)s=l.4&ibCW dZ^!n/V9Us_=1EZo֍%(C*خ5{"i8U*6~K4fB)jX/_n>0V;$IHGOR$iuCBru+`9wyvL2n';d'!+xGL߱pUGsLt~H6ShI,W~ +MJ9,}5 (zgւQkr]!b-K4qL_CtR[ƌЫ|S3 e',Up ڧ8rBq$ hzFSSt= =j܍0{@.h p߷ ÏoMfnKRƩV 4 n9ս=y XFv^(I$ð7 *Hl^6sP7~}F; mΉbd)^hkM]=^G6-.ۃpB'#F%vh;*^g$_H:ʥrqem8qMt w]p '^5(wNCck旑'=U&-''#NVxU,,:G Vn鸉PPDx6Sr=t?8Ս8m\_oY>GU>Z]h(>Ic^\`o%^')XƟ{wjd%0~mkxХ<4a `FkOmIw/̧0FMOÜagÌa_iIUr;] -x7C`,ԍe87gZ?a%r?YhX^ݛU!Q`mxܞiZXJ}ᦜ`,l"߀,lzRmlcw3T6Oq~zAyک 7Nk/iaYB.kTg$lS~/I}1LʅRt3yh,&KOM@d?XV4s_nM}>-/y/B;ɽ35}tJd"t:[q#j>, պ%Wrz o^O6+- %g)Oٲmg/DV1N[5I1s+]tG ,o;7!7[If4D9 娸k9Wۂr =H ^(޼XÇU13SW.IE-S΍?:_-tFĉem"Rץma¹W5^uRix-K-Zi(Y-8!tFhG˂L$@O [8L;OGwsK]z]XD;g򓭔|W).E_f+BɠxQەu \QRkmKxP:>CNj,[y2ǍasۺT0Y(Ss*\H?! +ǚ65T ԤՕU0L_J!qegnؚq2'GgCeo^6|` elڞpU֩Þ3e!wNrsE(Jϭ#f-P$pQ1={KeKƪnumUgCH@5U"+|y|0J>iИ'?x6Hܖm rHu;%pqo̪Zu*$̹6!/cj< N\5ͨRv*T(yn dd %Zeq6'5!w2>?a)zpw*O$7hP!u([ ?ȼ50S@c ;7C$uh087k9q _/bPӘ@ :Ma ~n \rثϓ+ r}|k-9̲u`~{_h8UԅL0۽-Sd0韑>ȧr_k@Ge֋;.dճE7Nq[Ԋ(:'Ʋ?i]+ՙ6FGן hJ}j&ijgY0ͶSq ?Нq;9u.p6AJهGJܴqWZ#)B'yG9=U(0ʋS$!$uNթ$u*>t-@b焑qLΨv"mҭB#1? zt IVjX'[0ooD7D5#?IA##4f[*Y wg@wuvDU £<8.uyLu9O P׮2v9ôD饳Gq<Ʀ$7˜/shn4eF\g2;-Wtn"DzJK%ccdE߮GLuR4MRԁ!fZkˋT>WQv!KR,P{mq%]wp,<52:jU;n68$c\=8lUD$yOw.(HIۘL6R2Tlv~P]]A3,kN<#I5i\М#}{3h \/]i:(!2i9c<< 8t71ȉم[8,܊$ϟim V=q.YiU-eqm\IK" oOKs3*4}yV?AGS\ բ;CD"ϟ_h.TT]O][X2bQG<\űY~RU0ѱNkstpϻ%^UY{SwF9GYc_X YAz ㎝owFS4s&)P{tQL]dИ2Cd8mc/:^lpb_'}Z^[nV݁,pM. 6D+01bnJQYzZ o{xRiޣQŇFʆ.\1] x9ZQ+ӍiRNFj_ئyV}yGdAu{Bxq]xS,'qWǠN^Y#A8.5N Ix[/4!MPi6\fZ4i~)?ΖR8(E*,obpq_mzce´)D#x uKGϳojf &s(~ҵ`eɮuᶿ"]Nv/DF^1ts"S颵[1\Rnרc p(*=Q`oEyQe:朼jorA;IGsLޖy6@ ~]SXU="ddn},`K|ؔotȡ.NMkd&w Y>=''`LmJzR $*e'Dr=(_LX-Hi;Vvrtkvq% S:G1Oy:˕ yX=U>Np 454Rg/̱*S6USŢ, g#AnV&=&ئatw.9`lyBjY9C!~ZP2-5B!*v3/ʠuN7;f~XI=u"T\x~󴀂o>KG]K~B$ܝ]oȑD+"AnJnvDKa][7tr_﷭][U~6oҲ <@ 2+[|wWcr|,&&'zߗط~YY՘ △o'js6 = )c!XA,vfDhVdZAPkϙY%KΜ%mp8P+L!BOg!zс&%`=@)p`7>ji=\u^=އE~߱x2N38yH%}bɝ+M$ qw )اGlB})H+otnF)?=$2hLl1ogs3RGk?F:jsjV( E4bl,˽M}uwv,$!zu&Ä8jX^2/!-]X1Z0e41&!3߸4}VCiHbmp Ŷ({Sا(Z|kxkȊ0w-1H GZ q.D2z.z{plfɬNw'#}6m(2!Y/C["9Y|'F%٫LfTE%"̽%YHYۮ`hVHm|àWFu BdUY*W]5$jwa?YSH{'gbpH+&)S68?mX<)w7`/E+_뢃lGM3>E3Z\2 h zB4nC]LM7 /~BU7]}E|\c%2RN>LekW$G#D*ṋqEd[؆׳{) o)/yqf*̈c A' A'0PDG%mD9wa0[ؔBhR=2`]Ǵ8 OXjNfV(B*kJ̆(P`c5˵øSc4|1aIFu/>S2쾧e=,޺>VTTk+4kspgHק+] >Ai'O by};$Ol1S CCҸl2EyKjKaFÆ$+9G:cQ\ډƛ#6Z!-uAYJQEweRGºBʃַLq,CP ]8 Pr)y 5:l M`ATڟsZd:W<&lލ!?zxeɭg Uλcv!_QjEɔYcլ(fIRm-^Pjk=Tm*6& GB _ejZsX֊5Umx,jGY6 ߃Aڢ IS-ŚsŨ'kp98'X#ҎUg^}P9̢YzpzYZr}z Ȅp5񗉳 cՄڈݯ/Y擎Ѕ:2?U*Rϰ}S=o}_?T4{o ޔ-N5sn[_g僵DC@M]Y۴\Eg cqj^ֻ>NW lh{G@fa(:mscG,cFNHD-YȊ Iiqnd$fBr4L97=ae4_c7tOqm1߯^n@?RyuTFFliwqOZ:cc0Qd9p]YCkQkP|4KO{=Pl&6{VG/ =vTIaZLh3!I'' (>kT,Yկd.G+;tgc:SR&jNwZ"4Ps#/  iUgg䗘cbm -:nATGxq ܽ7kJ4 ;Ǎc8YSpOA< Cl,aTLN +~n54D&FۏBT_t8+͢+z#Wb^k7FFl^{i;H4rD[7=["@T{Xw{컈 .l?rdJkILl՛"7"d{M#xp $!0xys/A345vr)G2Ff](rؐLŎX{H?ZRtúLETO@wU|)>Yx}!^%(yYNI L?֯}u/ԜOSEh8q'ϳj ߇UBkqJeC#) WQ []ֻ=n=co}oefe5!SMa"܌Q=ڮ5yjk[kOZ'h˨䴟04տcRڗMTH2aUm;K f3BO2TQ0<"(H@:Rlmk˵ n*>wOΐwph4x6rBޚ^90'ҽD~z7d uM 0K# sJ])d:UheB;9K )/(dBp$=T_`c#&n.Ph yU[E;PBZq.c0d谤p5[SNRWvRI/pRw^Ӆ/S(ͫ0۠Њ&FP+7LiĴ豅^ * B.c۳U1jƘW+U_j#x䒛!vO9 iU2Q^|__1{p!?NgѦ-bMϙۘ09fuITґ K%ݪiVaA9X$)ˈ}ƦK E11:PƝ̎V>8b\qxnaL hr1 [L){A1M!ڛ~R?,SU+ 2pdGDc-s [fɍ+),fJB>fG"A%LsfVé ~M{s h 5w0?:jFfOӌ` \(U6i ٣B!PZF 3j;"Yi Y>䈚$wku1.^T*s^?t * -ஶd.q8yB:뛨uy9WOtxJ~hʌ{nSԞ/t!~mA.uf;P _Xw,-6oʹ (U2*iAƭds, T3|ÌdxyS|H̐q^Oz 4PNfVez& &;Uaܥ΂%JVGc| Ɇ>k:$79~"YSJT]Ɛ41`RY*"eΫqQr簻}^0Ζ%ֽu^]fU`ĤcVs1Lc[rcG9s}gLG6>9qZ}ҏ1#/*u/n;\"@y{]2ʝ|,2n "Dm> \kF̎uKzĴ(\:3~ؕ1Hug̓Fd]8W/ݘ٬u Eސ>[Cˋ_as$fk4 k_:m[@O~8*u_s{ž|XIpx9RVHI+)zJ/ K䘅Q*dnJ y(![2[K *197;Yk줴7nboR#hqU/DX@nvbbv~< ? OEfw#pl^xgvR?M*h0;۸ w8!`y1!!A36PwQ468Q-#ι4sy`vjK57*Ў2%B+VQ>$x_uAό2])J-JWFcb:W; 3%zNQ~$ɷֹJuœ ߠl ʋUQ|9aIAb Up]b$zʣdRK+E0Ԋ 2VRv<(쪋jHrCp}$'%/JDBn]6<:1¬&mrD*F[`nFpMn1e)Tˉ I68\M ѩA‹Q> ﶁB,ZcMyR%R 폹(R>Xǭnp 3\-TD:ZSܡnq)\wP2@#چe'=|s#04swlFjVRu}izGv\-Bj)t/c'_jE4sgxH$55}Snñ{) X D@J2t9GvNo,uC,dw/Gu.{NAW#\cIڨR?vvJ5ٚ@;^pQJNrz> )*[ nОo#\L}BX}T%HZF=oCY#.3_U_ITFB`f}qi!ϻOjѮ*ɓ.xs,?rU%~Iکw8sי$TԜS͖TH#< ixN^L B99$u9XŲ50S[3ڙU-oTCNb3o qIL8}w\֓B\ =Ɠ)&~61ҫԳUF Dxqߡ:؃e#'ٮ5>櫔b@!o+1 BL@p-;ӶRa1wB# ;#\ Zݴ 1dcJ%>!]5yW{YL$1PcLZ4:9ˮxq\IX$8pe|SXgLOr#%6z:klz߆^ȯj0 0տA3L^֭&ElE$=Wµདྷ@'[0_:f<]"^Q$<\Y4G.mji# <}^ay }G3ꈐ`ylz{|ٷL(>m?Ӓ" Ȋ+%K>Ub{ !8.ЙM'a93wn\vkcFe4TAse~]FfWެ9Dl^ſ^˜U+sʵJo/Ih7/DR(ws< ,N Sx$Rj;Qq y?U6WnA]z 9JWoF=X_LSa^k^ub4ۢCqk6]\[Vh?< Jd#DCG|4(sr~y|,ivBjWYÿȀDtUe4 [D]U:e13FKKsџ>W m7k-/b5; os=&߃VrQ8YWI|?/ijlR=*} .#h'N ti~%VKk5y*앵&R@vdζ5Xxto;Grl\b碂gaӹ!ɚ薂~K7u'a|`=qzՔEՐٰm$ }`' L!+]6KG Eb2]cWpI"'VaAH˓w>bByܧ+:Τ-*p2롵.I;ZV4r/wx|MG4 )[[ B lqyGe$*]zTݝuŽ&U1|;27FQ0і M ,R^<_6(ĜsڑP$(k1&r?bM1{{اZ ,˫wvWFh,cJ,#o'D;i ^qjEX7(>6~UAz_ݰz,}KSY0L Gûq7?Flk{{O!XL. 9#!qsտo0BVfq$E"51xzC .Mŏ=+7HRҨtKΡ`:)1I33x0ҵ/]I>Gnk $I: C'JF.W-Sp(x'a}QF76 o5ToZF@/aoF1YmہpGǒ%]:qFWWu4 I}cֽ{{jm:]ɖ>ۚZ)l4b¸2?7Q:EZBMf~D4KLT!2H."9C(  瀝%aR #%488r[g>ϩڏDKhMR2ppi?}z>;6/VY^T{+>^jk>f&Kib_3K{_]49dI%zYҟ#O@lMjU t~BtFuT~n+r9M |RayVOOGN b|Hzƚ!ht&CD3Z sH&JxXTUwG"LL=(@[ˌAAAJ3 r寥GV{g/ ˫֡ۇ]96Tb캁 |t-!*vaMiHMOqccA@\upb٤X~1,Amn; dIJ3?NaΗ1ZTsIz(ߖ a ,jo"ЭN g֌yHб!' sT>omwL1i;(`hv*TK PT"g hh= S> SOZח2SOo2^9@x$ɀB@N4iYeML,f+X[:N碻GZ1(Tz|1T 7g̩RE.S>xIjH+ܗ)8 ak=Ktp~tcC8"/GNaIQ!2}eCVĕq }f;2D:8_DC8>r0LŞŻ "f#橰Qqqv8ֹ C[,xRp$Mu1O(Sx;;ZBP6`#1m}wr,@E'ڐk#]uY8 AF5  4yn7$雒}?Z1@dyFeղ5d>8Γ<7pۊ~Pqg?x^MO2n4'!l9~)'5VGEn!oLz}c0Mk}NFF$SQHx2 {ag5*F::w)mkBx螆 H}^F-?e2 8P .y~t2`bd,s1,ao~H^@hI0ވ`>`c߯6Ԉ./H/݉Fo?unr K@*"Ի+EJXzO9VY6bmH7 }fMMWsw[,,Zb0q-om:"m CQePQC?S/ߓ*7އڪ9Ҁ8NK}KZ1KM݌E "Q?DSp,QnhY;Ϸ|&܅׀p (?Y9a51Iޛ'4Ǧ+Ҏ>Q<17W;v&N'0qʆio8؛Q,~ ?wtLNoҰ?waʹyrL3|1FM|"](o~f%W( oyy,9 l\ǫ VXF:V)<~X1'AJZ,>C u)q |ZK~0niUɤ"6^!cՙ\n+/"dR啚xW $)տ#}d:ggɢ]F`i;B|IW:b\W!ux@#%@eΝƶwj֙;b%aJ$cV&+ٲ  [س}d XgS钴z̝vsdFwյ/|YhY]m"ߺV5E߃FGE{L(T~E2eyX-vxQG E:1ALvTD&#T>C7°59&:yg^x@nÏ߲튠PS yW@U p#4qFi<Ѣ,4,GvWYEyYC(gc(Fj?Si4cN:2]VC)5-g }ntY)u* btKq MN8*2dϙwfN;Z\?ui' 'E +7}"] po-b1רbkHlbMт3|r$2B# ޶rS}tbnr5VGZ5Ԃ`,Uu$|Ӂ97PoC 9EvL3~kLI}.Zt#sjYLJ*m uϷRw@;\8`#[x[>i]_RU+YrD}_K)u}yB/ ޑU+6xő۞U.L0+ -Q#^,@=|Wy'( ;ϱY!{<$4olzC_HRr0̮)ؙR?kvQ?S2+H,ejOdkJmLAR:$)l'B$|ؽD[I0plª31`_IGam98S>. E e/q]"z9X>!^L "~ȀŦb?CwX%|*-6&4թ1T netԚp Qvs%{1Z+,վVeZcd'A'ymLJSdVHИy\{FT=^^T-zWՖ$oGOFH%h+T#İe'vY(IK ßCh@pi4ӲivDbC]zHXU @H*a{4qYZZvIQ2V.Ȃd`T!,8F ZJ RٍU|h&gŰw5;ϤPŔNthf, a+;1S"E(t&P7VD~5 6K?Վ%؍BtӖiP_XACB8O .~/ ͎eKͬ9;b1HHfq[+%i=JaQtב h?B_kJl* -K-mV| s;:8 WEu;_@o3WhK}]ctMY7Etnu l!ɻ@5臗F <cMX1CU=5֪K0vnL/,:Uފ2eEJH0.\P_ S%5'SĴL5 Wpo?;n47~ܣh؝SCxB15akfx)Jk1pu:^pri9掲ie0$g?uB}q;H.TMLZ&cUWO㼺Cʄ5jksntH˟wM[3F|Oe!;IJ#g1?ΆϏvHyH^C|JQ5θ\9H3wBGE5;"k/M84IF(M ؄ax޻/9΁W~N$(UQK?T&2M RBAxu63V`cfbywﮢ(b,b2yJFn9vqqnGEy3sKzvFK-ຶ#WٙXPV ^t$NօA+(XjO.''tөtTpFKf Pkd%c bP6Z{ʦR | 6j7Pw]Qy{Ћn)._Z93]MKFt֤'yȀ0;_4o$/F,P.cxF[Kڃ\ϻ4-@E,ʎ SB?79yu*pb]zZo-g_6B̆ `:CGSv~^ ?q4XyAVkZxb~Qр[-4L h< %lP`ofrtO^[k3wUш|wf|f}ig'Doa)֭]E%pB5 vz1nb N.D滣b}o~td9 Q1HpϪ-Z,gm[a\*yk NB de,>\ÿv` I8֦P&+ 0 20 :Jm"fJEf돢5 4ҹE-Wkm@v i2/4"4AMdNw@~~"ו#A)k4i" 7J8vJdQLnݏzlNE#צ*V/PJ6X :tŤoƜ ag*C[)@VfzLŇ4-e$تf|YFjb_ʴR"QҖk˛E[y`jxQY-:ꑽX 6k& Xʯ.ZHn:y'vU1;ccb_"NJܸZeToRxĂAuD[R^ΧZ0yh>x'ȱt vWm;)[m n8wۏX"{0D94OZ]L3k!1% Lv|qNx~ub OH 8u$YsC/}piX9# ֫9l%u} gL% SpFcS­2CY@+󬜡cL:Hl l勾#^Z6bvI& <J{,N&̮`>y^nY"8lI\ry#SO6&M:q8?kG~ .pwYhS$,=QjM+H迺IlOKj1OWDNٮ?8L AlX*TH0@lEoϖt>6^W(Hbwɟa+ijrW/U NZ*u*e4"yA] pc'(JCE@o8Ƚc`\.۫E/wiѯm|̇Va&hdhg ?aiKYGbx.*9(s단Rҍ}\+lD& p]g$Ol3 }:޴b(ۜYl<%MJztUADN g{ UR0t~{13#ĩRStPՍYf#$*MbFI~z-H+Qy8gW8'Gfu{EH+Rg/Z >m;~I&12YOT03mwds%&t!Z& "4t2$tNMJlU0J]`sU[;6? %,Bb5-Aͣr@ Ha]GIP, [qOԏ91(=SoԺ)\٠@8Mv%vh'yӠpwf?q%ݿ5?e ( dzѧyYSNPL9$hsvtK{ X7*'EuaUrC/f Qr`DO3YߦPbj2Cv|%HcY#'nwA#LEg{ ?zT˴Ʈ©5 5' z]= 0+dD3!)qjB" ߶ہ$W{2[x J0`V9f5a% 3Q4w|~C2mnG.}ᗂ?daK!F8%ՂX9,b)eLg~An)l/xm^# #sWv)GCOC&|IH Ż 媸)8I1`U]oszlApEy_)7bClR6wS,ml&>  濖x@@!5p$ؠ xdyf7B~RgKyY$+Mׄӿ" k1)n$ BDA+%O u.% ;Ŕ34>f52_C,//H~M*W$ͯ1aʮ:e wkKN" YF \^_W;hE@TCU1U]깺T#^w<ӵP,R)f1 3b; v?{a vէ0< iQ\7=gV/1I}=zٚD# 6 ce(ܽ )>$uxLaKϸq;-UBL$;L:' Klc<>IarklB,OTtzq=9R$[ ɐϣ+roK˗kpd> ֱqLOp8T$P6}Z|t9%Ubw_T/Ε^ne,3ȕA'anJ6NnYufRԪ(Pp)(S%)$E'۾-me=XYP\amM+K:4t̸{[/=˙҂o,|TORD|э~޴-C7th޷94a;`Bil`H]e޾,;\/w`=X h $qWru]¦0D)\{c> e Dzh {lXtG=jgXu-JM,>~\tXac~aW;l&.1XZz9JLԦU|FO/*;Vp,5O@zzNh pSUahƺUF@О:0z""sR]uU `V<6E5 xbf#<62R˶EjK3.)9Ȏdp_Q)qDk=,TԆZb!ZdxʪZF،ekW$Fu\!oWis 5ml2NBg5]1E jbZY0mz(֒~3E aD)_H\B.+ }Uzc!Q X>W ׯa/ լױ{H'rTDDV(+(b9՚+k]>ao 6"*5 WU@ {Vv7i͸;kKը>?;lS'ٌpW\;8Kͤ iMT9E6G*9~BC+__xJY\&VQ,G $'网=&ںWbd`5m}AX]W%- K03O*6Iv=uMfYXLE_sj'.D~ hqG:|*#t6BS/=q *4R3E98-ˊUcL*geROL]g<1ZFXG[!QM#.Z 2QtI9EQ5xI|_v~}{eU !>+\64H7UYđYzޢY8ep LyY Nnھ4-rsUV 2I쪐q oXa>[U;(Ǽ *CR} o4B[FaY%RJ.,*Zz(U_u>d-Π<-ɍl\4vc.F@G}ʴЛZj/7DC~Ogpk+%dVt.Z&' -jMiF;eeV5*5A%TЅvI# ^Jd>_ phk]Z|}P~D] t}բ#M3ZqU[E+Z3Q ݞZ sP99=ےe` X ?_?k;39tĵC)MM\@@퇄5jG*'rgȾ#M)&!ZHWWHܜ<ŷA%G~S]_4Z֨cAo s<*Y(,b@95x# !k'-tRIO$Xy{IχgP2N1ex"+4Bp~W/[H@.^B>z`+_Rx T/`QܢL\*ז }[ cxiMldT|D:tWK2Qq U/0e1^G9;4ZTI D Vq0&DH1Hl"](ei7>l\ٷH j~dYbWC:p`שIZ',csab@"/&Rdxc h5 5^ԕ\(yf#t$ 5 Au\Va,z17]U{" u׸'@~=im7\N˕?(@u-լ+Z$L1YDw/Īi9-H2eԱ<rT^` e`^>b@%5e,8޻˩pӡ-1KvA~U&;S+2+QH3b@C#AC΃_h6޽:p>ިPxt9qtuo@9M< apwo/4ai7=[AT&݆~2ءh^L?bfzգFFA>}7 ԅf T*~T~?M(^!iY y8_G|D>98kFN _[`Ɲk(מ( \J7d~$S( N|][VoKH"ƴ~QE%AςV e w>$`T!WSVpg_X473o.?rnMMWp,/9.vq2-J4 #~xᨪllW8շ35cwG+pk͈% |>j8)J:x6}^{Dm?- )ki"N`'>ν,,q衝>jyN$nKù%&L;$ 8O5ܱ-"܄z=>D<5mnTC6J$"PA)wLS u`hhw,?rX]*@x= }PTX胮XouRIyWXo&3Qjq=&\QWK4 l> w2 OO QI| 9BZ,A؋2~qa%iB-+8z=T ́DV|q.jrNK{k nq# tLMbs¥M1 25ю1m2Jʔ y.y mϒ &_\9\ gw"`QGѝ1vb}{W]j] ogRI okJmF^A%"_Jxev))qNI99f/jPBsy¹MF f|S՜F׋юQ8'CH03Ê3HAP@R4f]ϥ_i,G4Vܽj]ʜ,͟Ull"q 0UI/N 4&n!|pWU$s#r=UC9MJ< VaRg'HN'c^]vzMLF舘hEnWGA.4"ޭ;*R*2. /,x?!y6!?rTBf'#W]yl}0ҌKhn  NnRi'8SfLeD^$uyvpf[jQJ E*ʂS`ȖUDvh$.H Kr-yL꣏gIdyE,&8+$zI@u =z-M'PlQQtm7. ƂDDt+5w*_t@$Ĩ[^6vMSB8 E7s%Şv [.5 dWiOFő.0$0(-w:F񕥄"pWO>dP%gp1tLvrP_saEPSbY VHIJ 9iW9T#1&؟%P>\YУ[('yXK0[1=uq! !B'K4RbPAp`Ȃo0ޅ2.!ܦT??ZֵdI dj1q }qd1A2T׆Є Ϯz3<ԥ6Q-=nZ6#lM:eKW0O~[?ps0hf vQ~S^CD!e"% LТ(U>Y4 P+ Ǝ S6-hW`Y%0 eY $;aj{3P 3q=-wvm鹦{F,-X΂jp1%EJc=T]Ni얘vsH)r^t F;3B?I O3u1D3 =i3L*pOM#?Jq>s8C j y7.{9od-٢t[< uM4l/|جD<QGM!b?y7ŐaK_9Mg:A40kq:m}?.~G@g7vTe'S$L__Y؏aE ;ԇaFjx=eE'nxأ3p L<Z2#[O{P3k&$nhov J.w/|$籥yQ^ -r )dR6=֢ݷ]xSdk#r`b4@`МEMg:5IB;%qJ"^1AfF:dyrD\@Mh, "ITg1S8^#`n:kP-G[2z:<? 7"Ű7Ӷ,lYs aab=_U:)aN"rnA#TH *Z0>x*LeTBWyô^{/NH>ߵ9E("B:Fݯժ mŵy@6>#/VO<(HLfSEd L?v."MU"/%+ rсJ|!?e@5؞".MEUi}I Ýkox@VWob4B!5v"ܓȞ]F6w% ]DMOEEFbӿ&x~F@t_zcq"Em'5"NY{lyLIKM7%‡RyXz"0B_JYæke`xsbYfqGhfT&i<XӟK֋ ߡhsKpSifeyGM2G ~F|;=~ DϮYyPQŴ;aaD*eKYǬ#܎`C({`}!>E=fR( 3&>u gA{quk?f> sA V(0&1 4m|.EߡTeh06aqc|r\yi{wCڵ&ich VGYP`NCMՀetX1 3Q]^1\I-& qyhR4b̩IW &iJ;[KmYoIXc61uUvOdy溓:8Xz96 oP"/:d@4=YjI@G2{=A%$Kܓs!{[$MƉ51q(X+8C? KŜp -j93Ye&eƃώקt1BwTֵDJG VbQrUtʽwŊϯ!QڈM*|h6 `< 8GL.[&k c9,s=b@=D|RsD" yYH^P~F;Jps!0|ĞM|WMRpx65t8˘.k FMs^ڌ7썞97򢸛 xˆ#9+rv| l`Rk% \&i:KT }"Ԭj.iT7A<Z?eoy/x[f 2vJ@OJ)tA%S~i0Ue7 9OIb])y# -"@&YVr-Y嗢WR@L*^wu7$|щG-p- :R[7F})zz7)O2ٷ!XpwsA#N U8dd37AfSNh)> [YGp hXOa2N#({ѫ&eM,=eҚuُ^XYO(qŒjb4]LN.^sug U܏Z!Wb:8D߁9iXlEggc>Z04wz HM[^"'_T\HDTtՕȴlHX[0oy\8L@,P[ e3! L0 dku)f]}8 i4:S -nT͘NrEAIhA*8-Ӣ?3k~J@U~Wa;2X[/wa ? DmdUXPOJF,bX e~.o +~]mخL`})O1DD@-ZU!\Թb&76]'MQGX0+G ݦT? .M05ǣ `KwrHk ٍz6SU^gC(%x 3tMML?nm[.MkV>ӿvLق2ۄ״9k"cٞ&=;+r0un,eg##=bJfujP5qʖMq%r ť ]9=^ 3 t' 6 -ۘ;|]uH>G*o=ߞȥITִ9Va4LD3/rCX:|>ckLCt =3Yyq46DeSF_S5PvYB!vEk'up18)Nwjz[iqgŢPn̪FLe]-w RleŸgh}RSh-<T]r(=y M%"p8=q.ץ@ͯ|Y||Oj#&uWS?%w2(\5EMoOwK)LGy?XHQekGKKd&I?VSv-^X7^|H=ڤ^sm<7}ܝ) =7<\MpN -&lK|L2Z6i[r($f[0_ċ$c^,k DR+[&(GoG(hmiBUfX'OUOaI{>74Ild"Bro" ]{2!^'_djҸ3:V=%Nn[g~(#5u$g>Z09`m?Ҽw-;%gX#~NN]TeWd p5)"jR 1>d4hgܲ84zc8%$"j?7V0]zZ5;sw aQp9huę/d=Wh)*_G4WE%[ ÇOLJnWu.D=8"bMZ+=}KwSF;hXyUpnźn {{Yl^l Κ$2Ӣ) dP/U(Au (>!Rps;YXzGY1MiI![t(ԭ݅n b^3]WCNh#~^JuOy͛FJʜqW6`"qN90;:)b'=5zKF}PysRF=DZm_\Dv`%HJs!q+ŨWZ-jC融m#:J9=GC: X ̠Yo:yGzNT6!~GX 8EG-9dlcT~v13EY? klOLԘ*rx.fT tGϐbKAJԩ SNye*7 ; 3(q̍LИú=L#s3ݾ 1?3tJ8&;,Wh c~cpAXW{bIyuzX40e/#GWSO9yt/?NRc˱HkݡJrzɝq: kYd :nacԄsS<0 6lr-O7e8 _+==l>%dōv5쁞ea|{?vQC? ޿r@t E vq)pkInc4qa~3IK*v]Tt3'Fƀfˎ9?7FE =[ b<#=Nߏ|U #)S=9g~G9jxA~ cH瑉~}XJǴx :fW"{vuz8Y ot}qb,5j@NA߉Y`sj*L0?[hxF 1(&@'/r"]Ř:tahʴmì{$]ISLi ,4ɻxBCWN-T3^Z9Qդ7oVX  V_ˋr9@sJlCJ|q\ç=Fʾ?Y.FKJ8L ;0q1OEA ֧xLN7HD $$b::%^7-1[3$1?9,0zֺO@eq,H=A &3!S$ O_*7‹[BT:NBoNË⊗fS* }xqqVy1l9c-ڏ _|ڏ;Tn)foqUT:Y Q+bJ~s"~HHDF NjL8sk>ϼp|l2/@D[n*dnnbEV&)6F-ĐFTxhٟJ= Kt/x{JB9StF? gG0|+_IV(Sa!e ׮ #{o8BR6!`H8 ۔g: 0ڤ9DbI{! ΍.Gk=5#{3[N?"[j):Ύn6.7 yiK} ڛvFUVH]QFB /s1\+ߺun k:sz:K@܏ ^ut4_9 6sy>9]O(绍d.Ivxݪ1\\mQZ-}~GYhJZ9=hRUБ)>c5&nɄLy&~}7kKPY"Ȁzge5)rAh%0]uNmbt5IgVS2Qfӿ[a|?u%?$YCEf#?԰4:n/reXA?R12%UrٟGT~d0u4B ',!Fxdt {At;0GO|7h@cmwI NGO-rsƒ2bH@h3Jx#](#cuOeN2w ψyIW!S5H xA&g\ x_1-E+:Pm(b½4*?H88 ;>Bv&(%l-Td)\zh^l 뼻# kY(f,ENm^F 5ѱYckܾ]nZ?vLaW~\bF4= & FA#ж{,A@V7im3jFwљt9V__Ә2o ]JMK_>?JuyfPެ@uvh)>H!`{,f|:S܅8m a 93GDm[0; pʕp8#?i's` z{P` ̯5OJCHI]VI%{Q 9]ɸǾS#PCKM1)>!GPfR&Ld&0Jyd)533{ls0sUMQP-EF-7m2qgz/vr&L\QU' ڕ l!H0F'y  81#kOc90xz&쬵̕):x5pb_+INiS ySjaQ1}D?0 xg!R (a&J i *%HoSβ]CC{ͥHߣGb:oZw K"P,A4#zn8a禳l$]x@ 4]t@+ !>H<y SLrg`zgv2 WkO[ 㛤Ζ(UXt{0#/y \܊ L3å(hP/WْƾGqMǜJzN%MYŖ'`04%L4LE8fTLMWMws W9ڔޝJsqZ8jβk}1ӹ4jP3+|i)x: 3 .<2̚Kq@bgݏUrR46ԜvuJM"* !r_D7~Ƽe.KħFG@q)>GvȩZ.Cm1%Dxaż;6֤kM "O2vǚҜ(ݲΙ_;_MUeu2{H.o)eϧYhQU¢*g$y.=j}Ժ+QE6a%LQDehoT!} կ&J+P{ʅRmGN)\D-U(:V΃w]As>p ` 6n2Qult!$_R@RN3U5~ge0nbW*_ 0niQA8F1"ڊ܉:)MyW:tys 0[E!iwǾena+;oڪ} bq<^fJ\AZ(gXh斅w|BPSץq%++׸ E` ɫHSk4#/@+Ö>N'FfLu2q- *}4rOxKhڎ29'6zoDʋl%AiޓSۍ瘁oK;|zÉ$!XȏnY,Yz#].5.ϺO(K.Zg`/}[E, v73#GOs;Ĩ` [p6*s#?"ٚ/mm >pUYBdr~!G[d/qPs€Nu}'In]LRwq]CjakٛZ!E!/K֞ xd UBe^|<^M%ps:͑Ue K򛳠 .Vͩhkq@9oM" UnxK-HͅT_8ѕ]\|[coY=)&4҇) Lco-MHT3Gb|{=7c"(Yۡꢨw S;>C~,"*Ub;bPԎYDUd/$?EX2sHݦ_ Y v}_mWN li@ Cn~ 1?T0bo ]3][[:-X%*̮FML?R'WSxK[ 20oZ#.|K31Co|,FR=3N:]ZPBF=1j0_.TLx?ly%(2&d:b}-Mp:5fIuny^IZXIWF2'E]&2',֕LTqUq[34foIjtԈ 5G#ȆʫkFw+#2 bbB WMU{ϦU,?a Kt)hX7.~?q93ox浩4=Ƣ9s;*<;hԘh/6vGr1t}K+q4}-Z( eo?2_g)Oi<}p"zD..|F丳:$c۔suXt(gKj-GSQc ;+`2B9+t r MvHhl&G|! pc8gT;Y#NsƏ-W-N2^nEgז~MjN^²N\S 0Xwz(Ǖ֒Lo<0#E͔)0-pR6eD,ð2㷰‡viUD"-p 4bG$kS܎T$NbHe;+Ey+qc!n2֭{V ڑ6=(q2p5p Mȿ%!YyWl(i'H dtڒkoY%t.WXQڱw~ 9.E@?uչ}.o1 2tXd FϒNݤN3 n!"8( {'+XB^e p_ieP 'JDhd. *QޜiKǬcR+,9ʌsFlp0yο(:6>pE/2|oDgjT@J+:+1Ww*וVk3pΈ 8aMdB7*Eъ[^u 1ALũalI'ok6%q5F *`{N9/u'IםBqPd?%c3sP2/QM7\~"O9;3W(:2keO]K1e:Ӫy*w\RZ+q 8꿜 蘘k1Y3ޕnVR$8h?6KL4% ^3kNo3RB0Hmc4FT%xb)nMUfՋb t P"}QM=EܒM=^f *cU^`5^^0-<<…¡IVH\z+72’y/5v'{,i*3d&Q|pFR"EUJ8h؅tD5k"1pmrxeb̻Gזlo5Ga'{C33.ot#hstaFWeulUͧ-uC;~: 7ͮ$BS6 x}zOC{8[zL[w,[&;̄?1\j bYe/'#nh56d}q+ BBVwX]\ ^ʠjx:kh `^|zNLT;_F&GM~V#0ӛ`@C=l?. ++/v?2b,#-Sʼ~_?HE! c<|$9VgBwۙ+{NP+9d~C)M@t zX=͓RG'ٰojS!2QՃvxGվOx^ U)>2cnU |9~4mj |RW,zdL v^}-/9dcc aW5 ; }:~!  "*-C)C_:hC5 ,fZk!li8$.o|c'\=@چA"H!vSh_}IZdέ:ټXtu|1 :eUEd" zdzqݕ o:>w8ٲ^T[>}()]bREG{) . ZUCp}f ? ljI¾x#Qњ7j+t,D`OqLL$4dUf%CZ`35A_,M7jTy(fOҶY 63)D[Dm&a@D01@XHjEϜѫi׫. *TMP1U'y `Hcŝ-"Y21ojNq]|OCWTns:Q%o/ݣq>rx䬴RsF>7w:u%%VXׂm'R,Ko^o9k=w Qè!0/ɶzCVYΝ\fK&cI2oFL(ZzÕAc]TebS Pdk܇5n)\FN 5WxtZ5ƣu  ̆6w8dz6܎I]M8MҕX]{ꑳaXۀ;EL$8rZ4S0"ِ̗O(|2 "~$Wy|jವz0E$yj-4w6F ZR24aaf_֚XzqNenD6ѽc(͑FOD*H Zn,~'`oe:A_ccأ?V`X+ MZW7y s*Q}{dCp!G+|w^"2ceڦAMIKZam/ɡOK-籹ٖSj2OKupm B_=^UŃ~72(zq\*0z '|ʫ"f^;Ф?@VJ@4 \Iܱ(LN8)93rgVP;g\%:ٟkM àS0z,785Z C-WL}xGF{űf,/M0oû ><7kTۙ@)MU ~}/'(&2Ő>$X& )ѶU_)[yV, =; ܖ V%k)NOQuCZ:R %s [FчVDas:u&7*W8i$Y V3W*_cG4>0v]RaD>/'^pɖMՎ;S cIPзɃe}bb_XoM|  i:ɉi7vb{ MF&})NFjH 5惩b VY[<ھ\P)*W7GYz\/GХ`׃ßq`jb(+\2xnV77ߠn=7TlG[5ҙ\j+Bh6Q)O8cZ`ɨ,A (/JjDƺE.ɻ3!8%_=78F9iWX\BΡ#Rj؝$OBp`Lٽ :7:Ԛ|U{ x"L+Q-P, V `Q,*]v Lӆ5U@C>zSu߻)^a`+ሧZ|1t%:,[oŶy %l'l_SW:ZAS h)8ƪ!~5J4 x [H²fOw@OE%Kj66t3̮ qLm܉ii@V8zv:HEaݺt>Ӓk$tyʀC\}kͥR<ZD۹¦7Qd̯?Tt=(dg&; Vož I.GcZQ*Gb|͂Q 1]bimmߦ2WK,mTŚzJ]B;?JF;ҪVgΑlf2턣 ^lqLȬ_2M ~3vE:231*z~3r9vG#\xTEAK~Et.r;f\3U +Սx"9pjW°_Kϫ\_ͮƫl&8SkdB mb}F 2garm]<ѕ.TS,XgB:cיAeH 7Vv';lyDMָ12n.\fR,}), d(#uy u2#E>-ܖljԡPxcpw>75LW&[K9r(v3K,bbǥ%:Pףrǭ}*~eXX1"7B;LBUŝoT[TfŰ^]/ ytiI*a聖}Da9*Q׃޾"TMC:wOd0? k%06>h?X !u ./T7`|/h-c%lc4`u (F"t8pDžߴ;yRFdU/M噧s εޅǗ{ 7]xX!wqcCE=: ';R1SD4JYX >}6BͦTsEz{ נNH] `seo vFq`.] 5/G #O=~;(do/8R`Pc^ 8SI8GP% Pݜ+KOexVm8$ChMwB#Q'(67YQBcBXk_#/ n唿ҜنOZZ4.::dN;c&spc5z)X);NVa!amhʇ-1qÜ\[%ת]%YZʹH~LyS8mGmqE!#\7d+Q.ԴѦbyGL=ٖPI"V:2aKG- Vuyc`(K_Vp 7KiICDnLgJqXlLao"-%rnD 'M`ZBz012/RahMmh7'ҹa{(?ٟD̴Ę\E6GMw>/PLvӱ{` dx/| )~!YޟbO^Fvbo^k.0xmO,2wQ2o囸VE>A`SnGYn.ϥU@[̰W(%r{:m7^ߗ^ pan."\Q og {SS1Euh)n:y{|gdeUdWz5: L|_"s%JhVLC$>cG"QɖQZٷx9r[j𲯃<֮i*PBF<&/@ szIpOD˃ y9'9xkVGO&Wc[r-4۪lMJh+3)@bEpu*pmE3ã31:48WjhpJld; >[ӬeѨCpQ['$dkHw shU:#UYAt][Y[P4Bt&] SBI8ToL]8e!wvhݚqz5"5oŗ٩Jehgω܋elgws/m8Bw%nHj޾/Fffvɠ<ճD8_AB6FSdA?ze*ojbEb$@ x#=PH- 58>u4H[nZ Ձ}JD9 ZV <8=CB @Lm}~z0 <ZLrq[qt^$ ꭞt@2B˘hRU}IS>2n 2]z$И̨Qr:FD]4)3a$=[?;ݖ:P{Z$xWlM?֐(.NW(9Tj+Y.GbTYo\s]/.M@͠-Ӿx@v>͓FI6w\QW7l؄|36! ӑ6 SNKv;o!GTbOc`Or\6w3y6_)A4K9.Qz֭?ۮCM+t5L:f#Si\*5Wu*|{6}"H5RȔ@T*Ug[v>NJcLv&&j4ݚմkhIPGsQ!M^B<3h?@,mz-xeX80u1\ K`uu,';?ovӮU[~F-m'HoSb8d fymåCXkl'}z94vf"6j cGZL$_}:B/!c8Seq!M{SRfYb/x~|d@ ox|R_7+yU-Q(gx;.qrC ^"ޭϘi u #p ZAvT,swPzV%]`O(gFSL߉P)}eyǏ/QBr#~btBϿJ7u6C{QzUEj03`ad^XC>B@_m㒔!5)DR x P<,AԸ壊Q6\fQNk95כ'wQ>zGVRq~[YKYOK{q?z]W|"h;}ӫ"p^q݄_؍7rq.gh740xp_Z,Gn:6#6;`O[C{b1 h]o=E2|be{3WU~" 4"_SaFK5 k)1DJd^:H58ᅬ!=*pqf, dw`-V8i& tأjXF1^5hMW 8N+%6_Ki"D@Et(N4ŚOkFFubkE0*._E4ùD+Q@{bcVXMVB.h"b"*`w::-Z5HBO׶ƛ|0!i~ ұM1&-XDT-5X~mKȹaD=Ё? h8g?nfW-c$C TEYӻa#j|c3*Fp=]:[Rn 6$U)ͥTu bs빹91vvƉ/*- CC-*%ݫ㚆&DbV6tS -!؉܄0@L_BvXCNej`~u?23/0fREIßY.U߳1:9P$=aq?m}Z!=&?Q15WƐPk5;K>odF{7?̐f̪=I1oWw?|H^2'\ ?PEʑWP^V{H;o~HSdsYfrލOɎF/ CB<2d8\#ߨxϙ)yiŸ,Y_VM#ªlR:sCsՂ8ʧ>,/[MPLT:} MԋIYY!X 7~djvy8]N:|q?&xW xgΙEgK?Q7ޘ&YHW78Hz ALF۱5m^wCC+6rzؕr%)Ƣ矑Q[y 1ZC E"7l*^#ʩ)o6a4.ͻ6`WFPYkaARy 0*ݲDm-\& Rzp`)#/Mv@΀z aȍF1Ep:LN,$F7`nV CZJ7.22A(i0'##o;.h:}$v̀Fnn(C9[?a-?zK{!Pcdn`<k n10]UOѐϭoAopCvV\4X|=o#R&RfpTL '< n>yGT$џvwP52,Mͱ3Kc6bi8Ư4T$Ʊyإ p}ps"33_[7'M!7 *% U6=!xJ)DKs應AlIecؤHjDR/uB(TZCuwE )K(wݾo88o_"I͆eL'=c?:C~8 {JuYpFOL؂d+GH}W@omQ_P=h#`ԑO倁pߡϋ^ `9Ci?; >l}((S~RcciBPЍx/4dqyqxLrR# pF r#Jre~;3.&u9ѳ$;DJm_#rZ@rnp;c$.QqFx[@q<԰α8/R̕MEGU_9QN,+ 2vؒI҇k5v m&7 ,`e&2Y}V3G^$B}qEdF yTRŎ_X}^}/Vr(YG5UӠssuPޯ8VzIn]ba>ŝ\6d^)NV)ifnPo`{r~\ǰ+ 537iýf Z [n-)<eECT p$mI`2gI-Sŕ^j4Sշ璕,p1qXVs]Ⱥ:Ž[pF]g"؆b2(4E~lՔoKYWـF"]ƊrkƑ ^:DZ,g0MY)$ Udb2lֱ? g09֟:~pequ]|谲Wi\vU0)SK#h3Ѱ:F#a[P'X+԰ٻ!AJK:WQ(v g=7ؚo5'Ӫ # E0Wmc0jMwQLDi[@/;O} P lc8`\͚X2!fsN|}Eؤ̸C4@CёR><lnf ӛV 8roB>E5y`?Htzm  3f"Ŷ"hmk^jmAJBދerx L;~)oraBxըLxuWcapLS.>@8t)K힝;|lI6JV = &T'{q;%?gy LH)b5bS4@xҮU,Wwf%UE=b;jb/y԰rdM_[b`qVH7#4kR PVX%z]`x}u&c*5~1YISIZ22^#:nF@Az_ WSG;a +]@LJ;hfY܌_M&6̓nZigb=]ޑNo{=I(Ji"9+%dur{xUOx4""STVo?vJ?!j"&*ǵgƾUeduOD 4ƈ34CJL@~\p)D[+umN-O$Akr1bQDd븄L -2_ysΖv'k:7L]EJp,5%B\QeeıazFςuh &}ذ|с7nz\ 4|涘ݚxJ3wU()$}{:tpw(uN)u_s*Kn@&]cBe5f2r qUb76jhEg\#o,gؓBƕOY\=;Pe~DPpT+'~V(0P4cdʌOkN"Oc6cE)#nv!fIxzJG:%)X-/`*uu3293[nZ{-i$жE꽼dzUv܁Ͽ31V_rh*fy fsM#?~v(&ffk).O*7_-%4`^y0qsp2@'>16hf  lEYhB&b8t.B(0>+7zT(\# |u*F,\(ï”*Zn^X\N$/FK[ݭ`ؑ6 ?>l}2g.dH4E! RMdTle*u{1aJZNǰ;kkīyC!=Ѥ'm雾8(0eQcFvrFwF^>iq3t<ђfnga`Dl|?ucIޞK/ -KkO._ũDKX]g,oX^n#NvHf}XKd^{V:Q@}p{W9v j82:(΋*{/2 s;Eh&^smSWa'ّ_ϴКܲAG>U {ʜ:@!&r㊍FtB7axٮ`{ 4Hm N3sDmF:sc?%mM%N@B26ǫu 801Wo%y?AxdR߆W1PvtMI3&]g,")>?|#LG:`=_*SW%S52.x/TDQbʲ7z*t?Xl@/ow PBg9xPiT|Py\_^ښF/hа$V洍ydzn#Ɂe^UA[n><$JkԜ~EˎnX,IpxV,"$a#)EoMtq\1B2_%1LW= La:#n_:]ɚ,U*"]u kmlO=A5c3 )m8m{_TnT)4"1dH1uAj~WIx r)6gXFݪ˛>iD.sd-i[?o[h'Ir`ŞgUόzM(Jg/?3fdRt U}Akl&:.+7ЇqQnk<*+B=K S4:}@>?\ 4d̶uZتH i.Mj3X* iW#z_+; i[GNf555ôe9)|8O4P .JԌBӾkz{jƺ #6@N^ ˗1:c1*\= U4#u-|zKdkEb$/VQ42lj!lr_JFZoPd;_`k ͗fPbX捋h;7Ul3e#L!S)(,(7N}s;e,`H,7vo f8jˋHFvcHmʪXz Z)ƹfW{KwxpfRK]"8uB|17}nE@ZI>%3JH kpxZف?7V]sfxd;Ly:QT3EC/'fJ0A7XYv^Gw攏ݥح,T*"?%ߛVi&58@v3V쇫&Xk=:n78eȥQ(,[A D&s9m"{](3c>6djD1^Ƭ]n0%/v7|Kzd[3e,AoC[ѭR/1'ݵw~z:j:ϋޢ3O  Yp*uPL$~|x,UM_cV)(a_ OI/>7>Yq<;T (z( hcgo.}ē?3}͏)/c %hv8;qHxԠ2aiUD/^P\F}!r3bR X_>s \(474a?QrwХB|U ;zp[tD_4? BJO>LҕMɜ:G1AH޳cJ%-l*_?[`0Ց]/wiI947.fykBmM"I`xr\7̦>B3<E[ W_p(ꖼ =Gz_rh dn ]!Hڄ8Cy;ͮ1!_4BBF-mf((n;&p= BA )z?֮R@飴C2TWx;MT?%e3>gm4pqd F'QUoWAs DWE0ɃF_52łc|}ig'B"JQW򆈊xKJӔXZ!/8ȫ;|aVbJ8`oaV- ./y$Y5T"%Q6LZPF'8nL+aThHQ_ax3֔w(AIG࿃xYY1{/grޟף5h:䣑KFh3D֞8ȸ}uٴ)GKB6%tMȖa{E \DWA&w$K*VTMZ9蹟B"PԖZDRiWk.ؖ ׄ{eĨ_:cף5~p-''=gK@Xxߨ"I4 o#|bjxWgشnDBrLfzˣ\P|B#TfJR*P.Kf ȟ& ݹ\!I?G`uR 7"Ȅj:JQdhMr2~cKc>QSKW LȫGz O!R9G8yi?TN[/YQXGc\}6ҹBY@wDeėJJ>A3i*iuߦ='38`,E>!ewx;Vͪ@O|7UH  ?N@PcgؒK涪oe4dM(xkڑxE&~`[wm#wMI,k{GeDȞ*i7 t ӐYΞ\bOZW3C29(m#||g\.Y̟*#Խvܗ2|׼sLlKhpurF̙PT`p#.;#tk:W>i^Jq"*j] +xkXw )f]+L/np_F@DlYl pi,X-x١p5pA8v KYMZȯB O3zbH G)4,Q|GHJu3ap )-;bM!u]Xe`.tLajL`9L\H .\j:iҸf4 __`)G7ixLt^%swۈ-#fRJx`lJ W{}xy 2K*K@ ¤3Yj˔WxfP>(l&ס V`q`>A'hsf9T*pp8/OYy,D?g˃`yb;Kj4 2#ԟy6h_34|I(_w@o]AEMHd}1$`LØTRmL2T8(a2BP.e0Nڹ#oaݍOU Ö)YJّ&&RA~mp ^! 6 ŏ>DQuK'TOw1jyccT0ܙv>3љ #' &&dh-a 4Ǒ{sEj).`EGZE 1Hd#Z%(+P\~0Ǣ3ܥ)STy\VU qP#NuП񲈗G"&xo.1= ްBv}S%8VVv0S!&rE >TE_* ]_&Vx1ҮA*|;ͽ%Q9~,6M[4W3&Bј3qlXf&~SMf>7?={.҈wMܯO~]Ż;n(p)ڎ r6D/uBAu9XDtCЎ?. (N>sf*?Һ}YؿLlYa^0AjctoTt硖(ӏ'}Ԭg6R?,p 9p.$~/spj#aBY^NjQ; uH$5$vFٔ "?l)}£~e{qÚtEV-[1pZp@2ől5DaZ^VdX@=̅T`&oA(^vjA$ y%T ?ΡdZ3~('8{Vp(*!]).`뽜%R) |UN21E# jf,AS t^9 ~r>/L @C'Q&ȷ: ۰}kQ)n%@\/L~,Ƿ4%#O1YTtaTGR͊r3?#)RE9u~뢘G).^uoP-r@V#V>GO2ΤzytoE%LJ$P'9-_*u\ƱRcNje~lSi}ی_Cҫj.MFRn9CC Vۄ3T|qܗU{SY?ʪOʑZ9SY? }@wSiށBfg~{Vc@ea/&m&2kEGhRH-Uky#6į4Є9fiOl/,dҠcoz/D5% M-BpfƦ%DO!)[׽ڊNYOEM/穇lo]ңπ|I`"[@Vu;u%Xo]ծ)|{aW9vwglSDɫ[%EХS%pRefKMxMF8i-gӏ*fkLl0I gӑ?̓M/hIs'v; >ڄ JmpАtȻ 9͖v8)Зbj~prSʾ57F ehAǮHf$\2K5 cɞm`R°PQd Wn %.CJlv~Ye`Lc4̶;GhޅљT> տ)ݯ7Pt Å\Uw6Gd,m=N MޟH,&$ ;-`ugA\zJ<ԬZ;S8\=r@IM$Y2GK(8bݚE!8 MT߰s7YH* w7ݧ2,'fL DB|һ~ ~rh8>7갱f)޲0 2NW (U ͂H;Mqg P8R_XX=8ԦG\s6 qȒڝ+^`b \#珒@hS}k[SX}1|bz$j*YbfəJc2-tF- _58m#4r[[V4 82.R":&9|ļ$;ŀi6_ @DpB`,³٢?Zk eZ: g('8aYgᱩ/z}8ه<@ $9x49/T{]G։)QҶl)1/XԺ'bׇT,EK'^ޞ]H YJJ?=47dh6!5t$7 è5Ē7+2`_[`L!YD@C`gW*nL>R4W) lRd_[onHD>d7o|&$՜}&ɛ2[ʣGn4#*e7ӌ3O xڰ4OXMcsY]АVTXANa';mnoٔ"=N0"**\h Y]w h˳˜K]M#ڹ<X0@b@r#9#`PL6zՎ9&OkOmLo5e@tZ3lVxo)T*u97KMVC*DBK476 =ӮȮ&O8yLv FROl#N8c @Qy cGF-r%EX۹S wn>':&&A\PS%!&5x̬ 7\2ːw|ݡ2\^C:A_w_ɩ:ûY=^fN2x!pH}nyuNYi|M}"\N\׫Iϑ$,׬p5 Lu`p|fC3aԦٗ久|n"n ¶ ~)rfh pգIiMGE aOG= >oUYv03 jtWKMeS+u~=RN\辚vTfv&GUݴ x䷟ǾOŹJ[f\ n+ҖB/lZxUjGWCt+fA0ΎɂG+itB.E|?"8˄2wH]ݫ\^$*;>pEJ_wa21X4,M4ƧDz9١sPH>>4拟J9`AҫW|\r~P3xo =_aA)vB+Xv.[qyJ&RPmlAU]bV\rk:-NJpz ]Ҋ ;ؒifUDG&+ Ὤ"rn9Y\ڵqMAK>^ (XDeDw=*0̊pAPeD|bպ6~cM2I(DOCԷ439Rykɺ'p*!9F'v&k8}m'auAO'܀Oy)KU֬[Y3U\}(sWܙe_KJo[LO %FQSPk-g2TInD T?e\5X]kr"ٝohh*ًJа0;d)&Ɠ8m _ Y.w /tuDslg%>D:]C'ɏ_d<#3(ʛ{DvF:!^XC R7_yKQ*s 4^X/yp Ƅ΁Su̘ml)̾ P_:"N!j7Tª~uG.W*rQ=ŗ&+k?F$m`@$j2Vér[C,tYpG,y'y/Տsh]9]pAcJPAh?kl /}[T(e{1Mz leDnnTgڪ_ࢶ*ZtQAi؉rV=={D51WX8Μ؈5JJ#nʐ]N͇`EQ<άǙL+kZ1K j Sܱ2xcv+^f˅Մ26K}&n%RL}{8S,JV``S2"hA 3f]9^`R^(-r;Yc 85qєp]BͧoQQ!SɁJ=8&EmLG >ITC[UݤLfؑ&AB:#z]ޣcwY9JP!f{:_Jŭƒ5zJ"o Fx;-d Sr0'C$6V-?*C+[ѩ<\v) LP(iIM^AV M}ƭxL// pL_cChrnA 8jdM- 1]"RN [A'<X+WS~Οr!=>T(ic;dFHH8;?!f-_.Yڪ6ô K#A|.]:\lޓ|ck 3JrfKbr{ČyIHok-i /+@*fhU[d Q킶݂͔  BM,V(M5zWVC[Sw{A{xnAdmc6^u_Ua]:'NszKB0 A=|؟\590>/:e^"sCAt*CuY$Ld8_BɁ/a%=fJf _]Ua_: = #V@]$V`OE~UY>,LEtZV~$(וSo^:*af>#E@p~ E1 !MqEN@S]/TM/? =0@96[KD26B"QPC5)K[z3Ċ[.w9p 7Oŋܧ4"l.~~9qhC9kuVkr|D.ۚD;/;p*:/;M,=&%郳89K,{(a){V[tjƀF-%GpkJQѣ:Xfl:ӟ=%y[toVw4#02/m_^`IjUCTГD=a W=2E:}´;4*}d/PteѕN@dmiUkZ2΅$ |)[h:rcH=,3*(`VlM"i# xIr.(UmQ5ɺ]e2L=CAYpQr?ΝTكX5iS] ( u b.+K["x0&GBԥ[_5[%N" آwDJY k(|i]/W0Odz!qE 9C炟( z]y6;jSϸl 9sa~t~)QtJ3D׸#=R?(wC 4Oۇ3ܪ-U}@]'DhjĠ׳٦vxMinxnze7zk\K ~5adJԽ .V:9gFQdG;FNg84N֏"-pRsexUXxҊ0iqCե'N0 wF6qe4>gKə'"ggaN}6fGA4pגhK2`jW*Qkvs߫< [*'i4"0g1+aP* Ŗ}$ -p+l5/ _wu}WW )mP&^0At˜#O9L)_+.ʌ5.oԉu&@gsY֐m3PðH>`ӇXsP)W Aݦ{pQMvx'oX>Q*)?[Мt[ `<>h,LI`p)ՏXa-JCDdw:xw5{o_l?9򟮃m)ɬ'FՒo< _P9yxeu hS>E&dNN4>Q,:ήdxA~o-k#{OC1ZN9]h9HC֛VG;XVo VKG\m6@_]2ηIGj]`G,n L$,/8b',$U,]莲 ܥN6S?@#w\;ֹz٬?!D"E|(>'zĎ;phRen]7f?Xl:0;14Y,wptn)z!Rh3+\@ortX;"9\dǐ3}][u!옒\Æ:/LTQ p Kp6n^@?T^bR{;MNW,2,t??>I;+ox3ZM=>˼R >/{f0.Z=t^#2堡l7MGJ *x˃}&KUǦ7YiaT]lFs HUP> *KO8c BzQ)@]N|e4 $sF# z_ShnEWmh_"; Oieru4J9"b GYQWW7OL~bā6 LF*: ϥOS"QKCtZBJnvd:?"Gu#{Βj7.=W M=Z j\-,[c3Dzhh>ѭ]びXptn^ĵ9N5egO4O&y˲| H?g%$Q6P$QK91VC Z<sNUHobB s"vAɹF'f+_ SpiEJ_hFz'4DO3BiÜn5\5a\bťX@լF+t̽GkL!0Z(?8uʷH[?~@(n,Msp "ΰt]Y}dqp:m|tOF D!2µRaP`mLІ`g5aaM=U.$ѿn/K q'7L6Ҷ5 νkaPUeʪ;iP;7}b8qFsFA%Ojv–YK7*9&1޿A ?kҖǧЄ<ə vIՆX/ ~BpN`_[(%yC7OL`HI|vD{{"XNC 2rRh 7H)VFjǔ Wn.3߿K٧p,L 9)%j?xVpWbm6f㯋d㨀 q߶>|WoI:k$~ B^Ka&Dz%?Yڣ:X:P^RUv $(/K|5 q h\LAkB72YOf7 WKRM( v#vy9 R]j2WXu8V*QZ?t# b<"!J}W~7ܦ*ߎ|Ħ{ѻ@ɝ6i2زT >,G"uB.bp_=Hdd/ġq BEe |xA2T4u{.qd ]ӚbూWx|SB@nMB &Y68u#c-g(7E+nTR\*;:,:*Eɉ$ZAߘ[{JF*Ds Wdbh+g:,Y EM0ElNZ^2iEŎUu #]DN SuJ9ߩڧCDmqT6LN6GWW\+j.F:Qy:inxmؔF', 2`*/Sԝc{WU{3a|eJ48կoc/,5%tDkY 2Ӡq?5)$`W(<pROK>v_^OޗNHoD:6{"a(|찟j.ڗvDѕjyoLLb"zA\u{(dw'Xx@#ʝ[_(HU%vtGiʳ /?8KNʛR_+WeQЕh@E7NI٭, |+r"vo-{'ƪҘCHZ9,{IFOsȦv HX`z 1fsSrwX9;3^@DAbn5Se\_ٔ|k+@O8؇X,YWwM\cNf} 6SyvWomfղ_8TtԴ䁴G*3batxD]Cd&(浧s$ e t7A2('nhJT_,>ut'6 (I4cBSLy_ Ly&0]H~B-*+Nw斷09B֤U=UZKՋj'VYEHz@_ yF;dFf7Ϋ^lyDF],E\܃@-!L z8TvoUNH_̋Vv@Ltoa;NTMa *3J9 @)?NA568,qߡ!OG9НZf`Eu &wQKhf1U7Nhl3Icuϔ5DK $.Ҟ%ZoÒb1X F oCÿ.2ӵ:xN7 ;:z=Igxl_܄{hljku5ePԄgl'*0wvv̎faF}kM*]JMիĸ%zN ._xl;Z;`ZMn~XYBKc'H:?8ӓł e"GCH"Pʧ%[Ll%2O64$jR|Bk,~%Ug2nwEEp7Z<#@jsxWr v+{owTc`.Etd;@pOQVWԻMH> n%mc⡭Yf l|TS6ٷ.h)F2p7as$k_Ēhuyo<#%9O}ͧZoj!kApA+k(Ʉ]i鬙S?\̬HY_U@zV@gs '5nQGsM  a1Ja*4}I-3KRڧ<b9KSˉy8^UC"aU3m.p|?aff lSDKۃ(MZ*GѝN[mS늪YM Z >ȱfwwfҤ`?S&6ؠ^Q3#"#8vԸ`Pkd|.[7xr~~j@)0J7:?IC&gK8@[ ^ueI]XgRW]k1f°9+NzB_ݼH8o*0/ {bvH}=;m dT)9JSu)'y$v3 hJRx_)k Ou+::y hAv,S:ʽlh&¤+{ME@?XPZϱĀNGA5wU KBh=WHӧ᭄HXOcJev:L 7]# hPƿ*3%!D"642dY=? dRypc'Wk[o!+<`uۼI"/Q:1ե"K#vmTxk W8Py/w. ^Z\}xޱFWXqOؚw6b8k{oX\6V9IW˒vXVCŽtߑO&c $Ks@$ow ,i4`K$_̽NDs@{Am oW-j#<`ZϾKƦ 4?w04Bˇ ԜΔ=#϶oaXe:2S cڢ֑n 'f4 5T K4#%2.z=Qte}KRXUW\B׳IܞڇqTUٚpD?zpW6OQ -cwJS,) X)ҝK!.L*^HM9uWUc4ѯ 5qA"6Gu!{~}m`K6[S@ Vl{,S+|n(⟪}gf%z='4~ 7_ߪWTIU$)o;cGhhC~Qp~Aw:GlTeФ+{WZXb򠈩aBLO+%AS$ÕoA|[@ѡ\g1|a*onFA?%SߝS8ky6na8 f3պ[ %MyBty.Nbn*k#lE:4#vT1!xך|h7A+ᶳ_D YXl{8rdz)4~56 F Æۑzlrȴ[/Å+H fH^=sm7W҂UmecFm,jei#J!*3\&u'V(.wb,v}}kx ץ1vf ק|\hES*Jz9NSn tD옆Ƥ|U0)OlOa|CD`A<@5bt~Ub}# O5U;Q͟?ddP_JH}͇g_-cwP{hY#rCSi?.A/MӠkJ zrv&;:OA pr`ݦS!ᗊE۵$߯~Du*͗j46qX!1թUo[7Pmd5&+ʗ{4[RERH⠦I(l,a }ms Z+~٦=)6<}Բs]5lkN4*mbx*'JPd ObhSwK+jH$_[uCeؼ"[.%!9aעIa9kJc;z O)I=5FE Lr$eڀ.ؠ2Dt?mݳ`' K^N.چޚ3gOrS#iV1C;ȧնz mUh(bԵOb`RƀJXNtmR_b8Eeas&x,>4JT] <|q#e(õz&' h6P]d![1B:&J꫕q5]p5t bZd 9^LUW2ۜ$uR챲@uB -{tLKHz3])-:͐+ Gó]lQioo04ظ&dNv*s!ЛH6'ib\鿠K(DL.t$ފт6b 0*(-]AaXviԛCƖ.iV(q_rDMQb;.;6:yTQB[FYH!hOΓ^*5XΰvUDLߩ5U16@1`KFsLJp M ։ -=\[L aaE:_rP}&H>AM*!fH/lwvяr&$ߎXBy}O臧͉,dy1DsDQYg?ØpiزQwT#zAug7ѻ@eOָ04ڙK]s~ C.uw)Rfj,y,E0NP'tv!rILkv :TT 91T ?i(,%6t{k@5n鰅2܆cDl?+D 9Jnw^.U"E? U{®.|G|'kaX{{)#+: ye֓g9]oRz]Ul$4z-@@{밃a[FQyġ97Ev9ˋggAaPm,4]բb9w4cHL2Kqεg_QA61[5A|$B5ذˋj(B(mèlC>y:m4X;^Ny2gs*ȉ톺k|UGxy.7i386ϒKxEöꑼ^p=ǰ꠷D4{ZvFN! #?oEdQnJgΜ}˝^G݂d|u`0pێG篏ZPHԮhU{EDX1"8Oi]ˌ.-Ft1l32 6RtJlv%A&1 ,&eREYRܔs_ +5x28 z1JibߝD~tb{c4XWb]c;MebtŪү;m1O)db$a bk桒+ V0"D]ט㖺־+>Y{HSq HlQ\+T5pQRL{Vy`#m䮯j~Ш.L~ڇܿoY^Zzm趓T4y!7ݍy=e؂F\*c$c{Uŀ֌ޕ"/!wL-ɂ1Ӌe9120(^L?/XH-/ !Ԥ%}~tZ[d~>a_4JFJ'kP'OUۜ:HW܂HYeY8v~ۭK̷86|,!\7}qsUS?XS aaSĨ#F7"e s6zp|jg5=l=]!!3|^ʝk2Cl'ƒ 4~ieiy0{hSd&[d҈tYR໷4x(9]FH0Ͻx{YFRY9i#eQdKd{(8r$# Ɯ'XE}1F2#N#Ic;l!Fî%~VJ?oC0ۿ&0}?A0'r%*S 5\M4~/&H3:  ]yWõyt)8f __!CPli#IP5aƦ4,BKQeQKjz\|o^VCfGQҌ%ܸ͑)@̐pha7>pni6Et~hH/t"":zxB!ieP/-y|8w71țNK8 bb P|9 jsO7$'e4H:ǒ.o5h4K?QB@j;֤|]PȤB~#@$glB0q\tY2ǂ_t.ypgAq0YWw]N+yy>U89[@2dR)#`&r2FQʢ(\D)X(ջz?7a#1+~kZ(ٹ5z&\m(\%XHb(9켲im=|Un{܁pb5Uꋔ cRe4_'$6yY1wq]a 1.&EFX( X«!yqY,!LGX츾qh4:p)dٯLE8q#]\EVLahJ#K-?qX%D~G,E&L[tO((Sp:޴/.=$4 (/?f)]*fwpRJw!\]$8se![b'="q 0wTWԨpU";N>bg  MTܤ{ѧ=| ]{XHxϬCbECs8DN#=eG%MZxN]R8,qnJ?SN hvH|zA}rDLmKv}SC-eV7dd_YCS,4Df5pn'& y3spc#ǒ=Ml)^#{iS Om|u!ßqAe%$:ui \׺q5$cYSsRx)®s6t [` HSljڍx+7):۔̈́ч8t(]ލ^k=&,:xQљ԰l5Y g}IMy91-QIe 9\Fb -q!GvC>31gVZyFMԠkOBi/K$+2i _iQ2(¬) (e(*ޓoCȋƗeXjiMuyU YlUC(ܒ (Ĉ<v?`1Af| .*`U+!^Xf%Y0.BTqh?T=)sk1D7[L: iT%1ו˫a&>ƸG/l2/.)h=1FB;@,C(;~'0;Ax[9W&c)MB=3\\Bw8cEQwM(6 ew.l yeaɄhRmN#gi $LO/=aݩncI;w"Zԃ NK]=wOjk-6X0Hyxs#XƏ@?SFV*숬xS~2rmk|~_H}nҢ|im80/ъ֑*5D*T53;܂EŃ,: `Z@;Mϥ1*uҽ0?+DĒ-BR4U^xG Y7 k3I<ڻMa7.۲Wк܆S='Q v^ :1m+@} KW#1Jah}#/pE5HJR4]2+Ϫ%>)9\[]֐ݳLF Mcն\rdsc8Zť8lP:%C*NTbBTt _~Vk8uΤ}΀BAVx@:IߍjP(hNvx!vvʱST4.q>3B4(O2+K;_Z X=i -id.rHF3\-Ⳇ${ϪїCNe Ti1̕m`E}Tq?4r @hi(L/8M0wua/2?;24x=s/NFVaaOgbg5[T $rIN>ͽ`Pᰇ6rJ_[~b^KjQX9L.^Dzmx^=gxj}W"jht?'Wi}٫G,AᣦxO[[>D0W. U=':S ]ad1̉1Zܖ_OZ'+Ҝ$m{YNt{ChoIbaa~3QKj#Wy-mXڤV})`s_􃓝]plQVCA<%`ƲI<=r+};c1TiZQɗ͞eD={I~԰c| rICn9P 209K"'C_$o*"~Aeo2d)`a tvlBR3nW2;17*)郢yș"E]C3 `79Q<:@-J95_^j3C3C2\ k^eBUԝQvBHPϑ A4Q[GIU.HX[Vj~@3,bACLCQ>ts,O 0egDqz.*9ʤVaC''bm/GD4dqFf?O tݍHTM$sm艦a~k_g |S0.l"lqQH΀n32}L8>gPp-_iMG%u< QNu TuSkArƗX )1t87$pTa}}f+uVqr#G]{3d;j̻i9i@+#vRlLʡM*:#a_FN]f"] /vL+c:k۬(xdv 9跃gZ'͒=ڳ[-h2z:suc8ݽGy滄_PdUǞa22[q ~D1}/3W7@K8pUC=Ah/K}K';sAߜ*ȓevNiѣqCՋ-,f)"Ėź; )BM1@ӴZ"tRtACR>}nJ:BAc(S/{-C:˃!.1)6_fg'i5bQS(WNﰺT衲BO&$im\at P[J+mk]D_ c֯,kTE+ud~]窫AyZfD0 ETĦ;t8`I6ʫ4xO)KPYt0xd%] N0V)o3CpE6YCxw3Di7T7xO9Mb+HގqGM"wmCRiLx@_%l|w$[3YbEwWp q98(ad)UJ9&0TOZ KW21 ?K}͈dTy2ϝN~(auh00blnw"d-Iaku8 9""Kg@ q,~*.((`pOM,snf7ܞfr"#h>-Z->h"@LG3 EdUo#\|4z -̻_ը1&h1R1 HA.ymPI|CZ* #XZy|/MU(҆oD8 c"bWz'[{+ČbF&x83, mX2{K%씷5>T2"ݬ B rLFh&}Qѽ 69jՐ Q[*>vNP?&QEr*=NnUD]=ěS{vM Hz\9C}L8 dhVd q}i-yWB9c DRQ%̙cr.jRpx2Z<:|\:u@)qLL ΉU߿D85_83HӇz$iPֹYoնƉX}y5VWrgm )r硗2#W(D1 Ks}/s@=^o_V:l8X'L (y7HY/s%BU51 .'M9$ x,qt, :Jd'=._ڏWk[JsڙuFֹsC]>eC9]'=r\|vܡy暆%3rā9hv`7BD&q棵røRj}L+n/AZP !(y$J8*-CH8s^@1&ꉛ[ѓ<ʄ33b" I 1٩HsfnŌ!Y5qb4㕨DMR-akB/j'EhY$a zyQ4\._ Jٽ98Ҕ?O~`;Z\ee{ђGvPj.?3G79OOy}{,ir3$gd+nf rh=3 +iv<'ii+K&/-A췭blF]DaA)N:IVcf÷Ovoo* z ܬMnnraxdPFZtR5S n8DKw KW08;(}MZu]6=OVeK05dCٿz.ax9T =^0*ˉUCA1/#oՕ4^~$=0}e)l9%FnWu6<;1ڰLS`]mo5tpn()? ^l|CsGz&g@GΖ79q;ԃr@U!hA65BuQcIQ\c 50BF6W'?zUtGVF&W<zL#֘~ryCfβXEÊΗ؟ V%֫aui36auw~ja+~peJOxX)/ݑ7g'\+.\VդjIi$1i%b_?xǐ/@Ntk[; vq]3ZuG[)DY6|U(Zº|PvE[H֜'Oc4"],){C_GWkvYc  |%ҹH5SB'"  {R}JW{N)z鈭< /N92fQʆt$Bsۍ9 蒆GX;2)Wj"a:%`cʫiw|p`t6S<ĠKOl jsx:lyK2r?J'h*șFlQ1\f4vDlT#[HNݢ 4* ۚ3~otY)_rU*/qOk>3~oet0="S %ܳK#6GV{Uַ!'ǣ1}|Ϯ0:o|R8Z[t~{xxI}vvo=^r}8xmzgݏ|!hU>+ S#6Ɓ}SAuK )F}>BE5['> ˣ_i쿱Ul6q&H׸/Ii1QviLx^L_O;8zċY8wЮO PFԌ£MvD/Z[ iœv k8*]@9( C~ߟQ?KkjeEB`>xJx3^{90r0SDdp bC,U em+,}DǍR')oQo`!EC{G%2|lVE¢3 4nmip%l_ſ~ԄJ',ޠ4j 9Pd1l,ej#ЍIڏ쇝;JdO>$=yVxo}M\C8@=jfU# cve -d>S&uVu8Q+: $ƅ88P hۺf?&J!vx#WqTSȐI` (\Oi՝ 0+aλ |@\v`Qד 4ٰvU@YCO#iK/Y%P@Ve֥ri]/mgn%"+*&&0c:eaDMraE$u£Ik2|K /@4L!ԣ5ILʹSBJI~pÕ$.>|$(Rw*FŞ'EzfL?N|=~_C*ˉvJڼ(}=khPd}f EU嘣"T!V5]N, Bxi71Ia-h6& '{~i ӖkS8/K+qR8m-3s:꒎{?I@wk?e}/J1[ΔuU%ն?ѸZ *ZR0BR];i v3$?I+"q1DP[`GY[ʄߏj@g;l =$1ۊ31brVwuz`J y?/S; lm4VbvΞry.w莟|NՅ\HP,#T:kXGY,q{?y6'\SwdpܻzVodtsRNnpXuh4M(eM`ʡz.n7$?O njVpj܍vPx{,oIw2,@z 8k+7`?f+@"~~rF3-m>P(G ,lNիWh8_e.]8aKQAai=c;}RR3Gk'~" #7}{0J㯀SLɶث%*u֒f~ԇ%aL-/tp\ȶ0PLj'';MVs@P=vMY?zBTLG2d])*D j֭o Oo7(]Nx[HLU8#S3iT콭+%q+ HR9Kb]!LҔYf:A⪙ f' wV轄V˵I_ Q <"?uH_qYLd7e~htOAcVN+sDrhC,AƨU AIõwV "gK]`kL64p53퉊l=Oy^MhW`d6xMYNl'x`E6遁}/j#Apu>A.$NܶsI+"[Ijʈa L<3@pbr+p5N6dl;w '1/YeH;­sڥ{@XG趹>Ek,P`3ՄU 8!qqp@HŪ<gFݴ]}9T#&r9?R4FM꼮n:K}X VƟQoh wESC. 9"GǛZ:kx}|>V*`D5HDSQ`)brA/O VSv5`w5i] ul;rC|̸rhW9t4*wҼ¬cqU:JO"rTc*?F+^|K~ izID=+; K 8X'7˱ I(YP9@@P)$rdg-)Ռ㩯:,&FXgg2!/#1J_bM4UХUNj߲rn<ઈҊSP`Hh{zG]F1Cq(l 9}M]aqL+c 8wYM%iL5~kf_ujJKDVSp5LER2  &6I#~?=V56mRxNJcJ=yDŐ\@h^j|2AGG#הPiͻцЛ 3c.8S1iFNiഀ\Pt `7Yyj4ݩ%-y ju_T_RV!$@H[\3sVmkx/G&oU7l3I~6 =T݌׈PP&0L%Ӆ2U &vhmy+OG8| A$t3o^~?5v4,u @siސhyE~m9,PM'Z2*|Z[S(~/-t.ߪ gm0V?9}U.-U5z\Ѧz g%:T|PkN҅lC"C u_="|^jy`Y#-zw2݄#O|w TI;4 @#hz-A+e* |X$Dk76r8߽oniEX |!3xȷ+qmznč+ xfMV`˸by xc#HA3o$ ".%I 1a)ޚ\Dڢ+%{E}lL|ŪPfPDHT;_u8X=nh\$AST5/ƭgKIԶ畋WšӲ3=݋eXP/c qtWELq͔, '3Æ-.ϢspmZŔI17jy^:Q|xRS߷.҃gYS_ CbɃiqJ4JmjRAxOATqDkIj9F\0scBA4z) {.ITsYT"U1@\|'Ү-8bH##qvjًd)N2a`'lJw:<|Do5P#$pV^5nӋ:Vk]MFޘZyĦ#[.n_%zMHqeǼ\9xǤ4Z.<ӱ88YK [5C;UQC%zCldscNTW צ%:z,a.9/0'oSs D`ݍNQ7˘#sKN dؚ{%KMzkx9]7b*&S}wOڎfiC΢H9e}5`;azdi@jPm >m|,EPœ"@9`|S5\]x2|Suhcw%(uҝŰ3')\/,|E#eZ{s"\*l @! K(O5DFM7ƿƺh,U*FB)4˞i& >O4-du5cm6)HGX2xs~g,疃Anz?FS훴Э4KpqZOۉ|f=z1n'Z6~Ce 7Ȋ/ː(KrQl@GjJ i@+hG[% 6,O?'FUNd-vLJX"&j,!1Fk:5YJ4Y #9mx#I:Y M\0SUZF'LZ]'B(/H a㯁 nyTPy;n:(dj.6K(=2@fBUʺ2TA#LOnua2u  0Jc.uar O]oyG?2Di?|%sͱ˺[P~W~892 x8g{S0xVH'مlSFM4崩w*GtքC! XA/̇dUE1!%bdNm7Y?mR]|%*D.BN!55$!ލ)\GRj VF crsuFvNeI.&°MDK[ļ] H39R*>9׎/҅x;= xx-2jM3İncގ%^q`ЖQKRqॏ!2eK (@q*AaL)J3Y pGC}`-$햽|_t4Q^%KȻ. ݍit2 JhrݛA ^Zy}T{;d+D9M/WEPB h{N̬(oDqJ{qjv|" !h=;[*l qj=$~`rݚ 7OG D# ?Ji2uX,VgҒzTs|L `Φoꄾ3JBL8ˁXI wlI^փFceo'[k\zPr|jnO5z ;2%u2Ok̋^w|+cK7oTޏ,BR@Y ;䩦.wN|e %^]3U]'P\C|_OjjJ7UmGA3hS #`oT#o99(b<[Qa65}U<j5>bzHx$d ;uKyj:^RWX-җW)ꯣ'U=A#19Le dI:nH GStpP %ݰr|&bQn|ylh%Uy|Z+@dH #?@]Ĩ m {8qٵ[Xh&mKL)8$𽝱YtL+r9xr!|C ֩ ⍷]2Sȡqt!όIQ2dhKC3(@tVOf?/YLXy$0 VXEv,g O|,T}{c>AK t/jN%JpYSYD[S\,6vߗ&Aέ xgXj,gp?`o^V,\e/{Ex̸֕CⰇW>N7GSrQ!/Do?W>y9c~<5#~j+oi\ HW],kq[uƺT=Q k"Ɂ/ulؿG3LWQA|Nh}Vs+(۞t(83ȶIvxii_<<|8K'cAi!&p6~r':6\?֪o,=u&nh28 ;_='?$);mGzca|YnI/E47}'Vڷ8gEqLK`˂2u;~f9oQAmAѪk[mڊ``\}\SDix np+N1f[oH%ya#yXs0ǣ!ltAO/D7$Ӽ7#GnEv K2E&zun4-i`tgړ?0fҴuas!H_1q\q?hØ }, (thχJ;f,+^t:%c(mQs6-r&82ʿ)v 6uY3Elq)·QbHv9ӏMdi'"$O&\Ku4ʾ.a 'O[GSbֈeh]8Pp1yŸw|w2SR֨N:j`TDʼnP`{rV=X5{fSOrReq%kgw)@[)v[Km%4Y/T C莏֨ g.Wi:uaBD&Lq]u=>˓CnxH"q/҄X_ i ;Ŧ(D{"fF!s }(i {=TfP1`Rtbэd>IT>&۷ZZ&ijjPx<`1M{8#XIl",_ZG ͞'RCW+f)Qbq36_ ZTOF/~%;rFN?R;Èu3.}Pѯl:p|,/5G #mca;vU's쉓 Kx0* +1m `C|a`9}ŽiU!:`vwٜ+6UߙLpU[@'pBmRI[A6l)؃aɱlԼ' 7uC9p@leҔSyF%FZYw[x# W[)凄^|NdǙ(®Vq9*q-e\d-tc3׫bmXJ b~ߺ<UU9u4bpxf$=KiƤ\!̮+u ;&sq8&`T (Pv,`֖HzrdVHͤ ZM)ke)`~??5hQ$|2ctT +sLb\nCqHn~~ p`9 0F6.>t8$h2n OVQweY™H?v= SVT٢"kaׁ$^̾b^AȓRabQ,߁[ӆ6g8Oo ũP6l l6 ST+B%T=Qyqup"ΔHk\{-w6"{>I6ziu/TEEV4HnM*:pGE.o{ӑ,r mu%} U$j^LCXWqui}3rx¿%Հ&m9.!ssCl_3szh )3yAYp Q'.CW:)rLj\Ù t]69Z,a vx.h?)w4;J`tefʽdrtCJGC02]ЗEH0{N"4(]7˸cu} 8#'E6^+B?.mJA[k i>03H˷'&|Ud>XPu7) [ #dWR^1 8A%QFGOK{I *hN>>ԤȺ3%ePI)k @ T,Sws/Ї;OR (D,# *ǃ0(jϜfLhkryƉ7# r܃^}>2!C*B@Jjf@S .L.%$CowZ6:Jm(UݵIRS)k+x2 ?;jT^YɋX? 9"Z|42;:䇿&ɓ2hC*`S7CA}+9~ۑ+*A*zjCeqM먰m[.&`3HlIu񮚹}mb1sғgw~,~n*R.^=@<+L`Mj#(|IZ1V= T(0+.EkQdTEst˵OΪ YLA0JKv #).KiLMM;Y]`F!_eoc! xzvcT?SL0-<#;*gOap'!ەꇮ ڨ4|vƼޞCIٍRȉ@H_tB~"WikD7z *$%8~H;䕥GԐqm7]WbzU[9e+.}0+Tc=փO[ׂ(XQ0={F3I d,;Ri>nj@ xf 6,dkpGܬ݊<=íGi(KS1MV ͚+<%h6^ty4r*swZfR+I"=b7`+ Noc!2&i)f9%M}A%QEL.e[z "q.B8s6M\_Fokw&A/IgWJ~u̯mgY-L_8 5qǴG;ƨ&( H=i^?09`S4&kUނd&xA_r1%[< Q"?&}I`c\X1snL$}5!Zu d&\ӑ&vJfY NouzTy)qj\@Yq:vv2[>x6?ks) ץDl?'$.C̵;ر})d:ѠcMI)t30@@ 0@@vYT'ī,=x15Դ2h6NX vyAI_iJ&=Һ2C~.7 J0褔QBU!FA~@!*pqnS&мz&CmPE2+^񉖋$? ] Fj!݄0 E2TԻJ& >lmCV߰kQiK}gTzi&Հ:N?PȻ/ yD&h]`*Xx3PMO"1;^iRnʹKjdBd&zdMӦl!{SJ0JH&%JLֹݍcqg"J慁ⓖUz4]qυx,B?-sh2tOrER,V0bӎ1{"! $dW AI.iX(ᒠ*3ɵ[R}Ii {qٞv͉p%6 SPd \JKXz+<6XfH۪pMF'ӵnWwgi,>r;[V2#b)bzmM`vi4x_"H>U7Kl3e>"q/A2[C2ȩN߬ICC_-ڛlq)ڡpe[J lf߀W7t΂~6K| aigARFSǖË9I5 uuU9H<%[-iK#k NqA|dy`OxQU2┊{`ȶ@3bڭ44Gli5F19KohbCwT4 x\ĥdxփvWB袙+RSVq7u,:`X<=#+ TrcRy5e1$# ZuK8zh^KYL^ẖ,*usWwnwī>J 8mhj bM_7PfeI@՝`^ByT FA"򻘐f!.иFKxݐ1,j$ij"6UnMb!njB 3T u'JA8Ў^!Aг-ξU״Df/usYk3m@)rlwM!*͆ib^=Ɂp.2jY rTA;B4P9:h , Z3ۥb7ή MWğO/ pZ,Xz<#?Sqb.Ua7l\/վ9oɰ4 7VV)N2ؕ'{Fvhfi$q9R& {0 B"䇮-X@5z^naotzqf mCOkKjT3HYOq\D[3G6':$E94:vw{yobN> ,oIҒ^k!x6֭E';UI%1( o\xr"6/2?pUqT?0,f3Ia,P=\3IV/յi1%twCknRbx$a3㈗\Vyteq?^^?>_hDsIiF8ds^=E˄|Uod/Q rb-iXN2-Dg<$^Mj4V-6*f=R)yQ_"fw.LʓG%'3c`hr*~\pU=g3>gB#%O+l4HiwRaXHO^K%%$QiA= &,=x#C2X6~صPyCj%AHt,mƭF:,7rvϴ$`7_mIkY=or04r䎝c]ZmU>w\B YyUlL╡.L-Z'⥂O+kFJ> _= \$ +9u|b8o@w6ܮ[c"E<GgR)t RӒUN;:!`f@ƾ S݂UFtFF5!1%Eg^ƣزhv1(Z je! |/}wڐrgIg/B1W$-HuYq(Bubs萣xv۲:,9v_2 $`|6bTlZ$ ò޶us]𝃿T% 09 -*&G3` 7dԙBD#)9K&\,/Z= ns6b|V\ԥ/zMkHvrl`9ʢ!/lٌlC^UUj92z$M)* [trjS(/u"9(eJƌw6w}=rV"Xc ceI]b ㆣw#<)F<$PtpÛtL"?<Shکn?˜^ztM9}c(ILV<ߖ rᤥf!|mvyCsV(jm+>1@QH碰Me8/*FY`3{ר> H4?x;Yۥ,弫2^DqaXùl_˛]CbNW:w0h5b@)Ba#DβzHU/Y웱P~UY7Q%?+0xjaBs9)^(;D>KW!-rezTx6w?O |_d( wt$ R?,TX9zXv}dDQ"v|z+e/˃\B]?z4ru?eɱ[իe`)|9+ݘ6@Dtr0n,DZR!+YSQX(h4b'tZDN%Bv]9leRhmjUIH2ޓQaS@U;mf$Q jOɁUQ|)s=*-܈A_G_h c gU$iJX;bVB is$j&(%Ht*Ѧ /䁭-B_uŽl!.L/LJ/{=LQZI_ܔ-]>O׀q4֖trNR`=*E ˽5}U,v?:AEcNҘEg-~y\aok9-f=o|]ڠן0'p?چOj8ݚ/Y^R3/Wg,⋸e90xO Ӹp x)4N@NVESgdO`8$ a)ǫ/ʇq;`>(JQgm6DY&hDhIaX-WLn=ʨS;ވCLUe~Wrddz_)t;&̽P~Ҳ8r|76RZHrl@ O=_D9*^ZVKzl#sfwWIl(&EƜa8zh5zsk˷73Yn_wtUgv̯yr7l/4%BN}_n O9]Ȁ @$>w?.|N1R<9O\)MW:Һ2c V`[IX "5ehiOn!X Xj(ʃY U-MvGԦXiU66 } VZpRR5AA\l0S"u*BlaH7eK4pGrB#s2DVR-!gw0-_i3MZ>*9ɝͥ>>0E=Q@G y348}SP:8 GƗ㛩JM@^"_˄OPf_ /Kg靖vWr&'/ hggW!W>ySOk>Ua"R), e%${ io ч5BBGmY IXxYz# y 靭HqD#Ojl3}JwϼLUHj5ԒL74Kr W13{jbͭ=4>kmQ.vJ]aïbl*Ac/B Z2$M\qɧ~ql>Be3#d}3EGOJ+ 53C&ߏF;VJ_ h:ۊWOO./v<9`ц/ %E{_M"UXItN85RcBPV˱i6[k ^:rU4fBvŘu ) "wS~GraIQ#*OivC^f2|BARŢBT t:A/OӪ]Daj>`ԙo5Wm{:kG0gP8>YXЅk[BS.vXYZpI0Y|;)ii%,3ֽypDm @HCzis,VS.䉽"4@e\CţXB"d g Z_Se9S5~7C 7"֋!g /Ԅ}VW{w*hq>[c6^rb.>zqĺڙ'b7W N2b>W?yN?|=l:ľ>Mԫm!əDaޔT~S ^xyHl %#-&))Ғ|G6 fzp t^"|x(a0Rv/'&+Z)g6pQ( uO}F8޳g_Ж5Mc)lfD H|2Ez|)G_1liOnPSJ6+e$=ĖF7F+t.b Y+^1/k,]R'Kx)uۆ0L8BK<3Ƒ́TF:S)t[ $f,4\N ;ܲUW$fl:bW$Een]h`\ADT6d A,?<, cEi΍|AMrXQ}Zc',]"ŭ3N՞%$6ulU_8fОzI%8>_fy <{:qpUȵ$]VaTO3!E`Oqd' S$"Lhߛ [zݺkC";貯 \L}tKFoi0JyVS\tE{}WQ0BMQWˣF|m[ MQ 58@3q n|GR~w gg1ސKGt?l Zf53GlrePP >$ QC9uxJ7B *\C,5@Auasau$V.:I'G^%\loAT+# 8LĔco7|)(RSyG+8k *pH-|p0"3k8D 4^6c ɔ|fܽ+9sB4 dA-HcQ_ g6)aU\ڿrMf2J Z]+քÅ8|~">9yw, >uQI20wZ鄘 xGLUuM7Yekϙk6%g} Q}0LRЪn9×5µ?H*Myqxh~sN4ϓ`pD?zPׅ–HֵA_l:!-'\OZO; 84GVs{6D_x7{zXĒe}Y#\5gNluE!l2Ѐm-}B|qi\ߌEbNX6;S& <9'(FAH~U7%pq]m7٦8Ix֚=gWqPqJ?W/uNUvR*Qˋ3M@z 8ώAwsqPo6.HHG vM}LF2)=p dpVG⤋ ̆NPNbLBAPlOq0!_E=rT FCr~t|:O^výg'\s߀yu7jxVMKsoƦ"[KK1Ӯ~=Kn)ƹ k¬݈y^a}q6A|L*HDj5;ǹPY1ރ&Ue5zNfaOLgkں%>hAƇ( UҡfBgHZ^%JE%PRu;X}-h}OFa@SO`ozy䥟e/[/ {ŷo "p0J%Dp).5]z >e;u Rg Ƴv^ho7d Y 'VO3ƼCOXa{VVN_m{I͸nէJn{j(]ekMw{m%k)l8p*ǔ¼eȱSKeaOD)Z9ii׵:h$AX+-Q$kW`?H+Ń12˝Wv8KgC9ؾsR~Y3@t>]ұ~( 5 -i]IMG,__F/nqѝ]P_58t?~mWL) Ӈ.c @qqAڵi>lmƉH흩bee_|^E8 Kj\^>%8'ZC5iP /P=D?chvؚ"cDE1>PJXVs2*#x[aڕ ,ܭ'ו[wҾgDTYYe:/ ,za S U``\eHx4F-s=ߙ:1JPZvh[  B֯ o(R%taOބwoAd,P<gʍh2pꀋF4 (zQn(R6חA~$ "Mh .ȹi/-bLl" 8x%Rb JY1/Q\@ KxD_JcMXhU4) ?cHA<)Ffzhnz;[zZ-xPOrE߯j!$uP|}Yy_v C^Sb|vv;rrZa# cI#[B𧭮׹=-P!,d<'w50Q!OL=c'I%kpGujhϚ68эb+\~+A w{t^& [pBo-m;( ;Rl>G3 YSB%S7[ɬ%mB%?X|~f-> X/TkK<NFwNVw+9FJx|׀} N_` z`_U f0\coqhy(iX%Od"wohɩВbOT3}ץ5i$J<Μݵ.'\2=P} ~L O9=wx> cP % G_$.UԖϦ mηkHхY4էt6fAyRWpi$ LHf2)?;VB"0w <堚C.^H#Q{4f\4kI|AȬ n:}Gs^""TaɺR#qpe\%2;|Ԕ_NaGy'&Rٲ}}y|;<{z*DO 8-[3ȁJR+1[rmrJXL. N$%yGۃ}K**1jQz_ 41T7Jߓ?Ydv[jfM#V ]S{oԈa+zr}QS|vS,NoeQRDGar|s$)<(6LWۧ,sQq"Bfe\VL8alj׸E )u9vR[2Zi+F"c-pf%I4f"IHbM\"mLBc[oե`,`\4 WqG;4ܗY/jOs/;h@Fاa+CV{_+t>U8Pˆ"=g=r~tYAs ^=S3>Ccv$veτqebD:}Gr=U`6cJͮ)vm2"\ϕ &Μ/E3b.kDO٧|_-PAJҋׂ r*8x1x0s6,GUg;@Q|by%Y] 'b>-!Gi,#ޞ0V}(zNP wMsZ-z[\-7n/oA!ѭv|ٚ&; zt՟Ū4 tdaG"Tjۏ 1eu3OXp=eyFݤѴ)ldE넎l{ qջc燢4lUıS-9.҃zmX<{|I-K9̐BЍ2]s~,Uk 4-M̃jďE;r\pEa"&BAϮ$0]7ԉgnu^2ɒ v*TE o~=\ )v/{:r&ED)y~Ob{nft Sꆈze:=?V뻺]LفS.T4+lS=8vux8X>-Xyah@ Yis[qPLnޯ&*:?,[ejݖzevAlu xfiMc.d1/W=ҙGوnqQS^ <\U2P4``S%,}\l yRޔRk͌h=WRyX 6NbU_-kM\Y$p\Y @;E=Akv57cȌFPjI;)hzX ` L&N4F2Wh/ezϥQށ+(UG+@k6~s.*b"[a к O*gqj+Qެڴ\ɛxfQ*32MZOb <ے:朿::Xڐgv%a8)#p0M &JQݺ0BBe 3ҏ cK6;-Y޹ D :{z:]or{t]1ƭ3`Q-zg ֧J" IP:j*`>:GU,Ki}SnXVYŕX4RUּro)ֱWDʶQ J(_Lv6PtxBj /0Z#4 R 1@RtG{~Rjy4[ //OO܆CCW*|w``۷_w K£15qav Ļ (!r,:T| oT90X) u>\k;є?!π蘇:jdݿ\Gfj`9m,U0^>8q B;,5(Ȥ(As\wf޷D_(}S'j@\)QN_@\ idk`3Z94$|ۚ+9' Wž_Z)y&۠=sKr2ՇjlwbېK%`$ԝfFM2[{z"Il|о&dͥlPsⵧ8Lw6:PQFBy/ql̒0\Q>OQJξVVLH,\T{DTJ 6?h0nl􎫆Ӌv]8s3+TmC9T֯n)Ŷ1Svʆ]{c<{ڡ75!2buRkҮE>qYdҎQu IYp8 >C49g Kh&橃wkAZmq"$ 3 r~1WH)4y*E+g?._*̟OmiK&u:"SL3S^ $܈?L/B(Q++ :\XLsB:;D1b=*q)^PjSxBQtU<^YM|l=_K )CG(xcUX>tR^QuO=B(W2 n*?=L@Kqtkwd+Iť?]GYX53}gາNύ@pA9GR4HMԿ c 2C+M '$!Ja4`>)Bѯ82yFUqa_ʞ6E8BqijՅq?Q8 "U?vHQp/|uj9t$*Ԃt>tJYw7"ex ^5ZZO% Gխ(I>`-NO's\Z~QH̭6:αUht%,J/d{$:+{V8cle1Cj|p[=w] ²&4x EΓBF "yņ  Çi5O(<q\\b8h]%KpTsun we]}h\V>] Dɷ&D:Զo[3̠gȤ?t:+EUƍLUIna[0580RTnz*hte OGlD_ƜY0+oŸ94?dV`){`5F* U$ MʊAlԘY9}o҈lT߃'t Zj STOXEwA2`@yLxW g?U1&m>G2?w#<[E!҄(yk]\}g6\}n\qU2+d#+!uB[R[A3 ! I2M}2k"vt|ͷ ZHq}sK7ҙL6겫J}h'Քd@Azo"Gz9 :%J_nzuI^HG.#1(G]ϣc(!eM2 WQؤ<ʵmkzeΜ cuzL~Obn*!yvT@|)7`MvA 0T'ᶏ2m0ѥlt4Mw% H//;b@GsJށx]f(@WZ?X'&f۷YF[p+U(/+21nݚ[})-{) N1ws%t?,@.j {B>Be¥U1.t?qPj"Tx@tWձbFןQؔ-LDz%V7FQ^8'̠+u?P=Ud<}a4ͽ( Ո={Q@Wl^Qmg:ccF2;/H](skF(6ģ/T.c=T7 1`o{xjo5ǃ&:޵Jps8KB2$?zR^G&+-Fz(.`#:Gxc]]:쿞Ce),D5G ɮ|Mjţ' ]G?8509Q`OJd|?~EtvQ:-8 \Y$I`Ib~nKEzQ`!Śũ~0x4-Gcɟ{M'S)]#rcӯh@y`]t/UeV;k bWcQmqr#[s{7a'"ť$:Um1S$ ^q!N fRNZē/ا#B~]M>:JA_נA뽺 Y'7NBA~LϹyjk)L )KMp9{zRdc64u[ X-HҦԵCCz2||4^ mEO{UCJrIeIDAyv4ߝI퇩 rgg90#00L^azvMਖrerf25S!B'0e+`wK(6^Sꘛ;!г=^gX 5)>C2aBY w?=Jmg_?J@GUSD˽D-aOMLį=DWgLJ!EA39s:E" c8E[Q']O: i0[xrJy[ᩳ>@l3jt2,NF $Fb'89h@٦)̈O"j^ 8agsˆmFL+*JAW.4a],6BQ9BK37lYY=1sbM#qЩ~iҗP0м/,癷=gFbn6p:{^z)HF%7 x4$%{z' @koEP];YՊ[,#L$!p&m1Ӟn]ؗ7a/J6yP`Dʹha%~9=fB?+YyNln[=>U*TƖ@᧕qHheX+Z0<T7QAփs467>Z~WȣRlCʛ!['^)*"GqH*\P1V,OŜsʚk j^9>@bU1;jW# W;5⢬H܁iwZގ8yVeUnlښLHvyh,Z'(?J,?`01    >@rE}^X~Z0A $CQyk}oaޝpC ڜ2uݦ"y,IPB9e3zc_v"M&pء&'cl]~ SV g@rh>2rhǥ$R,H@Wuh#xӧ ze_ӄTAlz:3aWޮڞ`a 4-ʚK'&5Ww'MZhWO QsQ3!K50k>0Kkp p/ scf(( M*x{![7sw>2fhP ޝ'rN9ؐ* ޳&c9sTMP u\wW>Hyjw۬ix;㨜F2 kZS;5@S~ִ;j>8S7tS|9HYHU !u+iQqVPڸ$}.@yN|QlWW Et(ytֆ|jb+P-N`8!p}k\f#p>6"G=KG@E捋/ #& @%eXcF 4~"-Tՠi yi=]"2dqtpaOȄpܭI8RZp|sL(_}}\@PEQM'6/-*m~k2WZolFʹPdT[ĭc?GvϬg<"DmI whE#77Xc,h$x͜i]䜹3Bz{ pE@qg"i:Dي .1f11eֿ[,Hl*F;,n@4㟡LvSEn^p~g1 C>þ?o~3`ļ^J9nzeiJ(?-˝ `sxBҔƅ:@:/ SMaYhw?ίXz_J)C}v~qj( s%bgJ4'HHJ J)@$2M ˾IۀowM_.62hm@ *0 "-DXGKs1XT3Kza-ǠjF~@ DiwT㥯QۙlxܜZe3pb|/e?L$bDI~%%?CnD:MEuԚVbe]qY:0$,Ǫ!ZXGH%Ĕ[Mu g8n7>|[)1NAF|5(1^;v^Ɉt\1ugv4. ar[=7+w! tu!l[ǁR<=gymq_֌DWU7rQEr I<mKp?qF9ސ除 .u16BW&ԝI;h!".KPMt`sou~E0ΑEBB!MCE|Y~m}ΛzKʳkQ͟I-t+2pI`xaw|ELh )jѦ#2ts1-!ޜ o{!ݦp s%oQeXw/YmlGIj2RӵaRWzB9r&^`}VoIv&(d_ =M] ҽLCbfQPx;Ƈd)TME~Д4.&ѹ;0  6|j QX"PKZ s3m9w.}.>,^¥l >5;_|*uKXh|؊h#]q>r/E`ϥy 0K3iI!p"91|q¤kYƋ}DVtX6[vP!H~>iW5Y"=zdwGMpnYW)g\~G57 ӛQj%gzc7[{u`[&{Wj ^miapY ~X oJ\Ԓ٨?\Uvᢅ91Ŏ=;ԳcqY9,ч<U]?M 媏B$GEcUkjUy.'CVʓ̆H0-ez뀟Ms g0/tm\O>=6 ~zs 9>%t'Ud^u3 <Ba_,D}pbCo3qsčK{o/le'8 ' ƌu1ת)T%@슧+)_09-6rM'ɻimUDzD#bXG(ٻ_Ɣm-F=A>ExMo{'o,|`qi ^nt·r`3,0@(C{i1٩MA䣤h=7ើ`R3yj aޚ˽VLXcv t.dŪ-l+dgeG0lؘzn|_ss|wlܑh!f&9(}gF%ɺQU*n5x6wYi#QxEY[/sajEr'H}7*4.mTMXqX5>E`-F(:I~j_xAm+_'|Lz4))r@aTSѳزqׇsWYӞ2Z8d 5~ N]RFZٖLzU~xUNBkWO pYXd^_XCB9z +ء~U>-'kPYKm3 o˟ Q#:LJF-%ݘXj0u=Yˇ]^;:=P =D[joj~wg1B׷t$4`zZbQ\3\W=+{6c'hAR\\@x1BgCdyQy7Gsùi"zώ/s&Qŝ<J8OnV>cby3i+,@Ϩ?(=XN1׹}:x +LOMU+H4rԡx +. մ4H|Fv:z RotRȳ=ŗVG`o6o颯EF`nԷ:C|0\͋c4*h1K7Үgm,^`W`DDn;ͅ[cБD1¸p#[y&QEv Ԛwr̠j7/BUI ^!YV?ݗlGteQ}!ě#jТGN:\V w <EPbʭ!3^N"jx0+`5dџ~sܰ0tǀ=鯓T'}5KɏNP]`s\ML0M'Un=3P ۴q(8H1e{ _4qXq!e9aCI@^t:O J3A6*i>Ip=^D={nf=WU,Ai}jynk09ee> ¼!/ Bld'DO= ][#4G,6o.^HiφY=˘oi|Lg.?ѕLbBp1_^+w_0PLpexGM/GˢVqsqcܙD 3 6c'9s0q%РP*z}ޘ<%bXʪWn b&-Ng r*KecpӳeVɀ٘-]-cY_  Ό$koJǨڬ/M&LgPwGؘ"j͐b@FC#~N9j4E.扏1*[zRLa#$U }ȵcڛ2exri=5E'1\ }V^' ͬuΑgbHW Q=[Ӣ"|a}3 ?y͘{ӂwe=kB7WD<4a=!&'I%_`A2ՊM 2d,ug'\{g7B9d̋h=Tn_x2A˹R׺%lH'OSĪe#ᨽ&>WM$ɣ8{w;`n>ސ2t1u`g,F Xvֶ2l ؔF'G_OwfljSt2RY~LsZYݐWxu)\i\>XTRL wDzy%l1֪G0͛U?)`m!ֽ%+gը029-3cv"(@q٨9`07K{&t:mN$ě>y{gPd*0A3#J*@2I±={QǡIr /=3&,NR }y{!5x5fGnjz'"ek@WqٟRoB9]j,F|5 +5W]8KPxJCyȺit&T[H1% KNmb lt:#bo!N{qu [/juHU|d.P ?6>=D7 ݒ ޝT0Nui &oƑۂE账H&̫\x堏˺$pR((+ozi/ZU&E(z^ Jk;3 ʍKLha6PmVkhvϹ0HVu7Li]8UI0z@F2x7 *ߔXx$~2tOc<*{҈'8K]֢Y VE% xߜfuMl\ !aD"Dpft z%U53Jo</0oNZhu6"["=͂oG_N-ѿϒ\O,޿ZKm'r/gz@zT$FLXc~ts+bb>E`ŬfZqξ@M <^nh&8G)hAap*_dH#͗OqF(r{۴.Y}ٛvY_6o @Yv)h̞0`kCӪiYֺtbN'#>) NjovW<QRPGI=w%},u'4:TR;b}<;2z=EKjnbAf{0+pW*_.c`>F2]c&[,d.bWLCRΑK)&b .w@Ɩp#R(-ڄ߹1ʵy>̣?Ti:}V`FW2uDbKݖ^d;vNJq8}$Ba=HF5јl22f| \.1qe$fb8 !"T!N!5~4n6{+CP4^ۯMvOi-ްEnzŽ +.1)"U_Wc\kkNWM pˉ= noG䍼4l(҃d&}ڠ=@E|*yİ*ҸY2TΣP|a%/Qڨ 8a-J s[v0bQ ,cYI'E/"g?ק/4t~D~ al`,%6Rl+eZͺ+Kx5UXuT&($r,vgtR'ai'w=tAQN.9i wvؿcLy i  #P^BS1&9*?`;E1ƖQ jm]wkYPBtXsz|_v'Xex%,IE$u<(~ړa\K4../д¦X7*+-;+3%9I{<x¹k։-=d`{ V5,B/LB6N,6Tqk)t f,RNZqff y+̤Dž+hYzho2 S;yrr_vPY,mA6 BJ1 =*΀ 8.sq*Y+`,槕ܖ_|b)}Y&EO^h<Z#/>S6ƈUfi4[:sy{Sr:J388o]ub_Ԣԅ6$QdX?pwo2BҥKv:KT˞ c}Zx[`pObl,j{;)$#ƵQiQB#a t~O.-/8e*i??&?Grcz^M(~}$ic XHzw1ㅁb7Gv 2Z0+PKԍ̢(PhdD%Nplg?ptyۦT&A_v\H~WxQˇ$=u<-BBb]<ݱ fNMzv 15ϻz_[mCLw\}DA /WGdOh ^8sCb'kKhLi.R#[%T XDiJ /ٛL{rEH!+,+,c;KSSe62ԒFi`bA!B*Rl4r0sv ?o#ңRLTw5GT~y8k(C.h1kV9tDq p hvw &݅#nOȹd `zS\." ̐ޡynϾ \TtT3(Q'ґ^=rwFt.<2d'bMm$x1r{:Pxe"!17ThN% ; C~ ƴ*p/lf)g3\ccP O %g̼s,kxvF}CB@8Ѳ*YϨchlOG!&m1"')[/Kmu$.jElmeD aI70:`{t]ӎ}fl!uqxcX*&n v%<UthT3mϯE/T^7dnRM#5 =h527F$YM,_WaHTp~5tShC?x)pT):*{pӉ*4[ݍ2LZ ;eH%@+XWfshAEbaG^)ƖQj{?U*Ъ ud/"{1 :eߔ!杰]47?=np W/-v/:`nRk7v&kꩍA4 2 tUjjE#w$|7JGSꎿ:)r7&3ޟ߶ٛ3 'MI[&64CI+ |{7K)@]>[=tϺ+dE+{Lbb%ݟaj$՞G5'mr|Úrw +C`[\$=Ot7q]{%=V yrBv&oQ8^o옚XC"怍_TfێίlSa)#=5(r\Q/t Ԗ:RCN - 8Dž?yV+[d+0\ Ѧ.bC>W,Fz`@G 2m8 WgUrꞩv {=*󃨄C) 23Gӛm6K9"LQUUP6~#I1ZKe\&"ԓpf66|5 l562TF&6ǫSZm|.2s 0it+.Fο7]' =#4RmasgxqA>5|`23 qbR)1,& ʫVrJžd?\CllY(R!myPjZg]gC-{$!&2cCbFUN nTqdGH3d^6mX2WD漚\i뤩 pXaN)S1HcgQmph0i~*uoh =9w[m.n~ZL5&gIP>! 3$YنK+xzr>X7F.DqdEv?H.L4i,GpO)c(Vmۙ,>sW-ˀB/aWCpl9hix&qd."#ܧ $$]XX\ W&+鵓dӁVg^wf:ib;ܴs]d>ˣ5<7T12xva~ADfQ {AqBA ",<ԡ__$.>E`2{-x宫㯯<ªs)J 2&] T`2}2ŚҸ5&ƴ8@qc"0!8>DiGd~AT0*$hDBF ,)$}i7, iN*wX<8Ń[I%`h-~$Ott\;x_x;&a4Ao&[gg܀C0GV> rcǤ2H=H6)Xv@/, jﶹQӽMJhkEͺYWr|t Ro!>h"sƾV"vU苪TTi 7MC8m%9y5 ~[u}A 9Ӫ%'*ڑ(oEx5 (T;jQ'(2eI*/8҃h:E 'Otuܙ4j[38&(]I"ibV3*lϣnQp7gBa['֗J6]"_,sm3wx[pP8`s'Lxo#9;i7 sOEDmEDŽt8zst,EzJC]#ގ[B&>+¡2Cs؝p6-WQDr<0B68"#XعlaU[Ą8"8!UʺŻR]"  !JPrh JoRZUƫ{ fafמ!'1<xTjpi k9.Յr6XGHiDYS4 :㳜yO~mTcnByy|wZB;+3=u `BцfhI6@k>_{zzUƇudLp3}ۥfM^_e I|v3KF7qMj{z/K90*+hւ~ݣor@ȯ%tHk"*`PQOJeU2zJH[[*鿴իӮZG.ɗw,W8$JFуS<u=[m+NvP_Bb;4Ohhbv@m;3~o-,8qtNڤ`JMC`i@aEнΪ&,$U)F]i$4kmBD`:+VJ`9hs.o74D{ ,B/:7ׅ nJt1KIbmn@_9pQMR䒟S,{tyaB > h(׫N\mN}Av8I\' *<[]dXV{j$HQ/M3XTдG\r2?tt4:yAKZ* 2@ B[,UY#-jn8fs ]٫ڌF\wl'4G r AcP@kŲl˪Q1,bvٔ4<ìvܤ_;=&?i R)7զ$/+IN4KA!WWh7ŝT=v@pTPR gg͛^$_Q:3'ȉΘOLPCű5aLKɟ1np_&Ǒ9(ot-% ! ra@Ö. V01jD/`-{`!k&yJ/Ħ*RSft@Ozm(J@ន;/ vy>Q)nXQ,*~IV&)mɨ Q7 8YrAQ5SRyb0ťDrl>10FnV)kU!|jbu@>5N.ƈ6's` ҎNJ'ty&Ȭ&G\9dqq d\|6曶# :2ci^{?cE Bd'͌,VJ'Pq.E}'KGMXsP왦|(SrK\# t#[)Ѹ bUH/Ķ)ƬKmV˺\?zfhuHnsʜn;sGXK6OhZdI6ax&ۭ {sjvHVWRˀ8GA(g$&Pvہ)YJ w@]"^LULYO]_*Ɠ{0 z5W$ o,¯7B^RԵjWC,_|Hv $P;]pOv:kE-q3Q"jmᎻۦ@@;C]Рd^QAaie M#enEwN1^~U/K۳cj?y[㱧BYfGdrX~čM6GQ>p[QQ];ya. #e"a49"Rz.se$BzCl^_ ?"c9j2+.,؛S=da ~r>D:c:xKcMml9 6jʿR"k3 pc! ǖY8mwA{<DE 69[-≖bMU褛Oѕ5bޭDE /:≰Fq.Ko^$z|u.piQ5{KAP#<CKlijWt͟Z\T: Qʭ-ժRZ [I[wi;W,j7`Кr*QFQfa? M'^22NfZ'+غl)ōA9(rLaN LzН4'H<њ^XCTm!oˇiuAuhi`*]&ozK8?uSh/Ɉ,LC{!2!ש}ߣ''݋2 }ElK9~^re˭2&YT築 =,b]2ijʈr^m5=70=FaĀw_\E9Z 1.b 6@(Dzd ͼWaPxѓM("E?E7O9 MtssL’ئnlef,f!Ň`6A!x\Bu?S?^dAhl>ƛgK^ԮvӉw "( Eaȉ{䔚 ڮ=,H[jb2ҟ/0N\ע.Ҡ(Pf !ke _IshޏK\ -|:+F]{h4&sOӜdN%sbVVCQ3Դ#6:ad:ɓPYTpٯ9YD. 鐩S!k$H+D&[/fQзI<]+yBvPj\j}dBX[˸NF.}?_0c \̹/Lz쫯id'@&e儗p7@ys8AgDI=M,(h kҫ&5NБJ\$j?d) 6y|]?d*roJ,U9'EƞuIJːDRri:v`jڋLe0щm{t`=J9{/BΒpNgeyE׸HtĒ7T&Kff˔Ҏ' +ӻBcx865?<972%vI3]0mKs,w Hb˚O\#,uAIp>) k' &~r!,%ҵVKl3x=iɝx[ ڢe&s׊x́2'kNw|Ujz%. lP+bHˊTK#6n9C{*Őc Nq-+ڱQ1O#xɣ w-} /߀Lo`f?$  =0s'YJ“}=^)kYOS}r3Y9Gŷގj")PY(Ye9ۑBB%_tFBXl4nHa* &j~:dr=Rb (Z{ u:߮E\k^͏z`n Ll=7ߌ%f潎/ _fZlzX@1!26 d ֋aPsh@},+kuzlu|a!V^C +_5~(mîXeۧ18Y,Ex[}0᣻0/[Ai5^,i]&=ثˬ0s tP M539lc ٧ȸ  Y6lsP&;| CDB^"~Ob"F+#"*ܱiP`y#ʀR^͑YՁu>&^1XϟlM šׂa =rhs\^']/iԥYv9Kڭ4Y^(ك_Y[*"ZZTp6kh>Ze3<D=3N~KcB* ZK#4B<" (|4/,ۈŗX$!oyߖ8-so9 ORmKo"NyOw)M̌KϢ<?z5F%ubBe%1U-\>5]!nSh)7y ;`:30 c^ZĹy!dZcN@nhWNn԰:A أ:Ԏw`'G .gswe)spJp]Dp{-:DxQW rc6"c "O^@X2oQmKޙo[6 T|sp}[ iVѩ%q~Ny;U:/ xߺymbtjw6cHНXń|֠}):Ϋ i T0'~d鿁܄`jT0~ԭLJyz F57^w( XEJ"4Cܤ ?P4*\Xg"=ԓ6B)GӺVUKٜ}-Q~{X~+[l5v Q$d|Y:>G\ gO^|;<1D COas-PHt"N㎶FK<z!"$؝ͺWl^.g0>'=Kf݄T[=PgUWM|'\W3YhfgWOnOE:ti3)r/ Y6W+qD)ٓjxvZC,_mB!c=Iy.VoJ߅/AO!2/p}vҋ2L:?="gIjoL)ow tY #u ! q`4Ry0{S> #D7̋Ȑzv%c$9REm- D~J]q#Km` #>ׁu)%\bH/Jm|mKn=I lPܘg܏~PZSl? +x?hU+-DD>ǘ5g Bc;:71R#s l}Z=σM8u`<^Yt"vrxڲ;viS|ꨞ /j=jgIro%d-yG>ygteW,"·MżŷPyN:n#xg Lf^De-2^Nt$. NjY.<:4'ٝi9mnoq#XTZWŚfa\ۓqo|'ou$wdRz6$n5F4X$^iCvIt &(WNF8 FrBTwӵ`qnЪfP?K#0(gG%l?_B7 Tcf;܇_Alt]3=}F$͍{1X1Z'\*6-p\NZ|!?ar$M6crh柍5(![k,n_+$,H*0ϗP}S"q,4iِI:8{7*q[@9s]8o]'8S'jQL %-B|]Q-lr^0V.-{zbp5 )յ`}{C()Ο5ґڪJLvyI+V:>ReەZe{MR ucǞDf peWTJEɆ/1PC<S a<ǨMɥ}Ȇ^nR'զ1ṕŢi$c4,q2xq*;#@ނ#; l*r> _9c<Íų3Q]Qrh?y+db8uM"y n[E}F3=y#vǦ:ƋgcK\{[0O~zdٞלx,o]@-wa]|PBM,_!겭 O|x֘[4druf' rT<LTTaʂ0{ ơ7gZ,hz,@ ;N*) ULQ:M;(N3m{ĒsvNFwoҞm'~k8m rh-Z!>d 5f:x @ **+0,5+ @).zV9'<¦=.Jdڶ!rH|0l(jtIp DT}@V{s: I=Y 㭝IDϱNg>bsX3pBw{V70Ǜy)܄:n!cxM vN~ֶ`n,I~ 6IvbW*`*!;m#XlMQm=S1[1h|:;G̀l#xVFu ob'7vČH~,f<CIT0>0:UQa ?4G]%P^a[o9Ls2M\3mRhy$;w|$8=kBcrш/7u ErtryP_1ō ,Bl;b}`2Ь X.^x/tYKڹgGi,5:j yf 8m 9ix#ֆtL挺#g,0ڤٴ_Lp.DxխfZo[ᅡ]^5cPtxD>B0gQ1{fx|8niIQ=6bJ$%$̀8Qsr%^4E$C LL{}@^zs.=5%7P?}RN~wPBrv`[>zMgwQ=;Y,Y5R#bO/pK@l ܏NmFX;lL{37^)-]UcS{/7k/11C~E%P{WaҵQ-zt+tyVɐOco.ak+">#X{ZwGȴJ1&Xr cl5<ĆC|cUZ=)[YS\\8 :`:& n,n=Mʣ}d߮i D?Bh܂SӦ5DEnΊv:.}J@a\A%n%ܮDi굛}H nᲇ_5(uJxz$$~OQfF]j"ZD`SnèY ø,EB0iίZb@ ~ T&kOܷpF涞 C¢8&aPy[˚#^oƜ .rUlI NX_ \l_q9e.ܖ ܶ Qvʾd,i(=bgu7r8 fǻƦ<1@Ȧ>)jƼ{mSЪ*F,gqq独M7ϼ|y,$rQ("&0)2HK FsS #=eƲg^'&dXTQ(Fr!AmKoJfyki&O11Nא.ZA? 4k8e4"${'".,ˢ\—zR-e38}jjM۰?UofAppaYǨ,^cUӁ P%$Gj.Jw6Y^ᙁ^;^~iXH|=Z$h:k(xcMC<)Yk_~*8$M]Q9n$SE^T͞-M~d9! .9Z|V[/MrKFz6ZFmnXL+Ij};450=@㋧&?,9ByDscNvpBi ] (Z)V 96=K(5n`HV&(e,d ܵ Nn 兀pi/g{&gz:m}K"Dq.p,3 | 5|+cT@&N6d}:9|E]Аfą5KB=T@zbmKNԕz[/"Ǭg_@f[h8.qל)^>qWt{Hry'%𹍷ǜщ 5)fT/ 3a? FC8`˗{#SCsLR2,Kt*Nsz=ޭB] ,WhN5Ik9F-(cQxg etËjD8Y-8!Ş逜~HgZ$RWVdPsS_Wލ0vWmXV?F9<0z?8q*}%L,;}RsԆGwr|-)0ܨt-mb=FuӣCWm"ry]vDn?m$TY6:CM[As\e;S4vʈʲh+? 5ͬނ|3!618 ڻPGdDm'eTi \}+ 0¤#\CN~JpFUS i2jR/# Y7JM<?P%{aSeyt: H&E9oM MS}Ɔ!UlگsͲ`kbMv [|@1h_DWJx㑩)9;Sȍyđe%;ۂ2|eN>ІJme}+B 巾H]/Qa]na Wm뇂cYy68+bmEt4j}c 5?F/"vXJ0vAGPћF$ *vɍ$+[ N XF[~,wl%0׎*~]ߪ68hhG7KvJFcJ>֔E֘Bx| xkT|\VJP=67'!^<;ɬ;@wX]~ư/Si9d.lZ`Www&`.akBnG J򔲛-WkG=2Zag&mWGfфN,[ -3h;m O,dNL\q"x%+ DdYؒ͘Z%\Z.3d)i~"S+V$*oGH#`uz<VP%(B w M)©<Ѭ =('a}S 2r#6tt}3!0'ynfU_-n3ɘ0#VN rY~7V3pI]qEMCX[(.q^j}ƹSS@ |7'`,b >l<AlFЗTF?5+ܽ,_:d[F~ɭqb.FjV WInyL˜ NJwAE?T `v>7-܏!o-* cR,-U ۶)"KWe7%%$^.ݧ(!X*-&Caj0ݧgxN0TXԉ6~;kD/oYKCXޒYLytnΉ}A3̣k}g vو‚$)0bKjI=r9=|OƐH0|7!0.+[70̖t -vDT"ʼnMR>b`R/׼nLNe#nV RqcPz;#ZHMQqj Sh6iFSVy]@9J3"L9^Lo P7ɶXi/CR&b%BhAlX/NIgm޺l4 -gd}rܘ uмGPO"%`yJ>Ļ3/ F-IceqCҢx]EưUq\q~B~:co÷&RԀmA2J[z6ϻa1;7I=~> is<~kc'L&e^<1\`Yf0etc#>->ăK+9,jn9JSs!Z)MKc#_cǠD?[ƜގEÌ嬞 'UbGHeVz݄? dH@ x*B*ۇ;X|.<N'-u!/(&05[$@XG ̪0Ū):ը&vU9H@ioc/VƉWJMV8([99= NFCa I>r BZ}-=IPI`6/An54g1M1/!vX?@{L:}t+ &?ᜦ3C4]sG be.N>Ԩ OLi)Dx5ݠWWN禲W`BI.wH-b$Apɼ3@+u1ЅBx+S8?. T3AEcy];o-%8.#gMN}'ay"1Ԩ\nC$%ʏȣ?[#(b%:rAVy".9u fWK< Bb>:IB kH p! ;:ola}=4 - nS'y2L-řcZ?iD|Ha3Ux8ZȡJN?GvV.>Rq[wT,' m *z0mhlVHX>sklP/5q/ΤӰ仚4/V rh<1Ab|m<,|`qy~BN:UFnOrZ-%9 1R.b;`HnOO;"ʠUmȈL1k,27Fׄ!i71Xb4%]Vژ{2m@pP_~ta8XaWY afgj0~@nq͟H#LWMr42ˈ86 q!ڌ ch 35Үn%rn"6S}Z_ iqTIS9EPUT#O!2'ko@w5 FBsk4WV]Be#Bd$ ksL7T4!єS]<>G}[ZànJͅvl^4Q 1kO18;LI>QQa/E \ّTñ\%Q QB\ +Į..URÿ ׶ttSFF.۸MJ/iAE/M-E_̴AA]:`9S٥v^Rnog>]2Ib-\CJr wr0'EcěZ|9M[VxG yְ>A5J7!Nԋ-kv]︴[- D}=@d4X81ɇ X ^TkMlϥ9'N_ (F՛A\diY?wy\ Q:H6"?We:5\~E\`[v|8z3q['̗|*c~Hnc~8Y£dewMMB'~  Kb/6ha3h嵞l *cC)z-Uoo.N4'r2=?w$OO1hKQ( Ҙp v&C  'G \_srHǜ67.q_q ȽT oXsTpv!isy A{}_\G7 ye2E zGJ桫 &$\wWKtbŻ8KD.3HԤ=6SIX T660 ??nGǫ{8ƠKe3%!Eh0m0\töbpB2dH1t ?]0 !("$e('B5Ե+SJ92UA&@g_Up{Y&CAlE9R wxL;& KuN;_/{Zc}vt4,LQ5tk4 .n?{4ߌrfiN~V}SB8#&||_j>fL:A4+E7"ůe9S-_Tt -g7\ 1  Q#eF _JӼMKoDBơy&§n`0iFӜK$iF,@ S O=k͋J\"$)9NwH~(ljX (*z>e%X(N,qkw4 5!4v8(Րy-siq -Fo) l2oLmޞx><@0)ф6)ER 'uV|5TCC1ܹхL1-WI,.xUM?lvcbIyhlj)0Ш:/3aBA͍K.ӑG`yz7CghdrGHSq\ E3F#V:bSX4 v%د}@f[8-/ IBя=ѢPD{ejYvoJ{h@ߋI&BՌ~k̀d="_%#_]&{dl Cc\V(""tcȝd ,eW~NFϜ4>m/Ȁ =8Ų64(:$g]BPwkƬɐ+t!zˡ:^CS@#Gy*^@99;c`0s ^rPQ.;8mD &21iUOʭْjӴ.Ҝ|sp|*$M0=Ct+kKaGaP˷^ܭ>kzO(+PzxbAp|97s ǭH=D jXtG8r敁{]ڏW@>7oe'5t EZ/:/g~ihkD%&I$5"8jz7╼:kFҕ˨lko(jbmE=M/zց}3'UE/god М5jY0ǵPa|ƽ/5ɣDxϘRl ]%αP*-ҵX0Vi4-G۽d;oV~J'Xn׃'+Ҷ5 $7ad,wQӘ4t[p?ǰrdg*W;uZvR2U"cFFPKy WY,Iq\W6S[ a9S^fu*zUxmC* *N/iL).oiX1z{>tҤsDi2z J c)&Ad%:[^t1IH0;?J{`KA\]);^Zv}܅/(>WBS?2ycQJ$! bwSM'w@9u7bO4$tFF._6 |o]pH17tx-\N[e4'ë$,y>7ئeAZwH##vK۳TtBϖho{S2e1{!l9WLyPx\{c;ҍFW2hEVDz(X/bW‘g `ro[C1$ [r6<]aq$/cuT ( f- V`.jD .'r ov{Jvڞ!"=0]* *O;=ȭ$#&?K0UG'?ˀyg{$@{&}ΤUȓk^\ijfTЮWUhiwU.7P⾒&$t+L7{e9&n+L:+Mv #*BպA"(?lYűJ8\"e~9Eb_^A*gHh{Lb/h4%jCTiS4\D  "PV@Hftmz9$UTp QQq qř*{OX A(z>}DqkWύr0o7!gKWO+1'dH N^5l. ~6D@g~IFG,p6=4Nz+ cL>V\lj"o6"e)B6%[g%$$|l<H,CG&Yyc:> ":`{{F1A*5l/|ICC'g2 LIBX~Ls q3V:ܰk˱:]1c+QbsT}k^QnLb>N[["0.k[g*܍ S ~tnӺ<`&dK6R|2*G'v9`a>RNmժt ,EBpÿdxxp3{iUPƏ"Y;OjػVD<ғ7\;㨴A{pC@QQ$/Nkc0"u@vPvC#!z|MԀSB؟thR$nj-.KcQjHπIN>ý%=Aؠcv/?`Hݖ3#Tsf5fpZ|qizS>H^}SC ]stWj{Ci[ݬ+UWdrgPR,u9,^k HIxR'׸eҰ$`BkߡMU#!NVJً㕪k~iHyjw+zʊ2.JDHl|:0HYڠ]rB=BINF.a6?RzneZؙ\&-Xra1F;l*l[5( yFS9Igğo<199,|PAJYD?"_mͳI'>Dľ9FS}?E'􁓢9}WDkfJShWS=aȷD^7`S RZnQȈ"KG%~wdžn!|sQ ~-1^DՅ:6=liլo9q*HEջ0Z?sqg\-okGzKqDdNEhfL!^ӊC?M@TُF4O}B̏cn>=ק%uw!|bC,zliڼYO>ے7M-;1#>_Ɓ-c;19[yB\~ 5DYY c( b~ %>J D,늬sӁ¨@Rߝ>wZ# iY_G`gvZn[Π*xtxX*[a+ǔCS{$LwyW/oW@.9V`3Ce-uΘ JƬ(kQH$6pA b~G2[ZN>=nag\=e8{z &ukt_$X 1|ȥ@gڄI' / c)$w5ԟF@EI3MLK"3'JZ:H?:b| дFˉMQ@YZrrcov/data/wages.rda0000644000176200001440000000260014556265567014137 0ustar liggesusersV LUeι{.W$Dd D #½WA̙3A"(C9g֨\fsҕ9sRѩkk5֚Bw]ꮭ=<|ܪn!. X:h֚o14 d Z b0  N(gr52 _u+k Vk|k ꋕ5Yߺ 9wO%sd$L#g 5u)(v~<ݿѰ fՖm99h_a'g9 _r:c >s|m|89վ{B`֛=I%gfO.}cE}eRݜsz[+L"sU RTrA5lS;[k9[o9jg\]yޟVu eI7بǀ聻`Q@oC @ 9 z }.C |ρ8Vgt߯aʘu }M\UX{v%hh@lWq@"4/j)\[y@$t]l35bѿ{-~wK@d e9{r0=1BB ~9#o/$!2W x?ICqnN !1 s~"a8=!R 1~CP,lPw2#5Ȼ@؇K'kgɿ^>s~-uoųe޿{'ȇlάFr|8-xGwY>r}[\fOʏ釭AGz50yl;@Y^kȸpMN:p H#>93G$x$TI:='w$frQ,y~jJҗn/2(CNú9c2Fp=9[cqD.1V ҏAA~Q#7}>aI|syʖ3X_R|Tc v=x3C+/ 4jg2?'sssؿ}PY^qV2כr d.e/}6˙Yx8G^{TPwymAXX qB /ZB .xEPZ)|`@HR;CȢ44]WflauH-  rrcov/data/hemophilia.rda0000644000176200001440000000263214556265567015155 0ustar liggesusersSSWF .l/ -snTEňlEqE\Ԣ).u-H+KI A,"*ub}&gZ 3/ޛ92oz ch+H,%RCRKB"!U GapAΞy(<0В&hU>Ճ~~˃Oo|o.QNɶEcҡP6#c*ޖ$һ;Bru%W%Ae%MLp|2-{BFKEݹ Ä =fJi}(A ?}>&/? =|!AE4an( Aϑ.`x`^Z?W͚?9GEۿ~P`ېd5m0NZO9-ylh6嫞bup5á1W7u4z/wAK7gBY[/Osܡjނe'Vhѱ0n~8T/<%a-vyMHδ:NW~7,&ڟJi߾,ʷuB9Ͽ9HMnG)1P>(0\t*88{?{CVUuB4aGO'r|_ʠk"4keu4YSged nQܿaKѯ'u$& \!мq k/dRFN !,bXxxN/54)Z%-vC.WW߬&g6H([)6͒(H,'GBf@{kʆA7ZDRڃ@O-lt+vhTD3zLq@m7ʭkuy]ZR(հARkܺhтW4̔B-ҝ6?-ZLa [CjiA'U},"898OpUlP"^-3(۔ۮhhK^-#νo'boabBU$~$MI ";`EcKC?}Z鄳V)ݣwxdP"BT;7S(2$t0MTE$D%TT\DXHi2lTѫ]̲0 ,dfgY, K~3eX}t}J·9O:h#OpR;Pz q Fnsz˯$@H.yxYOh| UW ]vJW ~|^_ \]NZOzd0>sRhՕd'a75:<w/jq 7;`z<',~mO#i36^i:@C=ӧ] t=kMYQQtsVMWSaZjys2+{=rU(y}oP ӈ5 tWyLx޻_'M>(#^A oIq8,xLZVcyz0*@+$zp8/z̟!oYRAY_uD}.AR޽o9}:w }!O:tju6en&.17/'M'~GNy> z.ZT8dѥw?ls~y.Vëc~ x2nEY8N]{ޥLCԗnqCIoz /Зh|v^kb2)8zsK ]>?2txEA}C#N~mKQ|_k/6 7?2ewѧ^ȯ /q4>,.~a$+<v_I 9x2?LKI>m_n|Y?-)M^?>ܘo2 }?'wq5^|s,k~(|ޗyC1olX___^_R-/] JJdΊ ~>XŸl/ܔ_~CѵQ-/Q/Ϳ k>xÓ?Զj?`rrcov/data/bus.rda0000644000176200001440000000766214556265566013636 0ustar liggesusersBZh91AY&SYl2{\DUU@@@@@@@@P@@@A9ԅpT|}7L @ΰQ(^SѤɓ4 =2MёI1z =M2 SHɤ@ HiU' hM i224  4OT4#diс100&PhhzM4@b4dOH!ɓ@$h d4&̦A&cHɓ'0M0ʩ%} %#%"T@V H@JTE*5ˑt)b(``‚@9ėu.%ܺӮPwnspdd(!!i 1JAFPDJ(RZ  LR($QhTQUAӧ.rwst"BYQ|l3>1%ab.: Ya4¦K /)7Q)lˈȃq@c"r31<9ea*K$XiewFX@Qd hLAR1[53hh4’GS MZc[1ֲ átg g)NpYgAӸ6,,ȨV kV'CIhl"`$'CSjnM8&.jWrl-VE Ć0F>MYƿgr`-WPCݗhSĎhhN1IB&b7W,Na2i˜NHVoOGA0FDwRP%&6 /8lj`(JQbHBe䋇`NĨƮa*Xl-PaඥSP 40 PU& qeC Xj\*؍LU7RJbdL+!Pl,4"rZ[yjR U,rQ'g fV¡,\b[d<3MBJУX|j-zYazFXGL&A9,B0AbQ[*,š1oϟ=8ͱ@yy9:^] YnarveE.5ˢq7E5hmݭ╚Vg)'pD>ծxS'lE5Ŧ.1|4j.kkz(s)cFVR_>1`nYngӨ\Kz8  30S-KRtyfP"Ms al Ҫj1jvO;+EQ$&/hB4MP0C!'$]kPܻ]DY3 D \O!E 0&GsJrȍiTLݫA7:חnۜš[fSNƕ pse4j|j9]}B[-,jvٵYMVegyjUJ(R1OtT 0IR' SY%22HIM!/AECYi -_)3A!Di:4(v*@NsLb2YH{#HCh@uS74y{K{irZ2~s]أ\N7qބ6S2qA1ح*'(-I7IJf;rn&j,S79Ŗ{LxDvYxb&;Y*"M3A2x4u9ͮ(_=iƟ"մJh<.iPCe0d= KCkr9k5I#@0T61_;1ꤏ'RMtxNj@ֺo[y]::sD?:FJ15b˭Z ԝh)FT$RvAAqcB\T.I*_]e:?w|=a!//mml?.ZntKlYAAUQN;LTw!!ƹALt~ZPTVU^%'\dd]QC.8.h䘤EȩafkdH\ P"Цޔ۴Ova")43p LMnps>ϔ$h|a(4{\h B动QPCE`%يS9׉bC譙T>mhfE$A~8)9yd+[KѐE˅+,FI;iJY3eޠV7onGOIuuH3@s#lݚ9|jFr MpGoP=/lBfs91˖rջ{uLW5(y VPep]| ?5F5Q58'7^0=U@=Z $i^BC\=rHv$s 1`DT4!o3uO5+_==}7Tyv6x&PXqː8uHN:I@М+[MAzYgX J)ս,<'ЮtĈcﳞZD(v2H'k,P#.wop9?ܑN$!=rrcov/data/fish.rda0000644000176200001440000000375514556265566013775 0ustar liggesusersBZh91AY&SYMHwp@H@@F`A@A` \qp]ja6'#ydڙLH !i4*QOU=T h4#!&F& C&C 0#42dd%<)(Pߪ  db0`& FLM &L0ɑJo)=?RoTC@2lԀihފБPD EcB .KQceI6yxH%F))<M 1)B{|y%k3iӡCf[Kp70ܓ ' E~f7B?K@PxOH71rӥ.;7 !lNO)jtSo4әrO0PmY&oT$X%kI:7aw>ߵ,%H1c׈1`a3Œ!B HU@'Q.BdAk@e'y|~0Tڸ[Y @$! I`HVB,%B "SMIc1DՊ“8䊴S8D2"XYJAfPn$@L- P8T#̓R#9FM.,"гXD#VJHH(2Le ,Ḓ2$`&Tbg E +\G~oɫ{/qqqM..ZQ񘧤÷W~'Wr1<^ X"n.cӸ0L en뮰5L!2"'Mj&QaJyӧN1sx;Y9" N[.㊍c&. *"blF"4-nj+ ˥I6ۡ掔 ʩlpP.j*+jkX*[u%ĹYL+FZq×8ۺF9AV;KI-L0hpZ8IlFv͢ʱ'Y`%E*]sJ8xIɩp6 I(I"Tu5\(]MuE~ hgY̐P Ұh )f0qF>D2s2 A,WZYW7ݛi@:ӡАu_f ľZD`yX-% Oo^V~4?[Y5Z]1یh- }iF2s3xho8,3;AD+Y+ćYx4ˍFf}#=Q4[qWo5 V-Jʨ: IeD\Ww*`QW^266ox'cyf4,cf6YHMwt,2 ]=H݂};\bnxiA펟 &kF1PܑN$orrcov/data/Appalachia.rda0000644000176200001440000000426414556265566015063 0ustar liggesusers]X |LIP=kZbXjĖZT*S[R%բʓؓ'lw;!굴ڗwqsf~$ݳeHm**JC~G1QWU*mԌq&T:6 w>(悟`ubJ}5E"ۿAZՆ 4wii?cӘjw 3>VMqYh>?$b~x9YT2Y ΅MipٱQۯ5(^ uCey_2 !B)!\}wr.%ٓ@v|m/g<ԑs(u J8_||330¶ OЈ^] ;x) ٵCVR[ 'wː>N }x6if\ 5Nk\bccvz8( 7˺\+GO/8l3JmԂ{ea;G "#.>B/JR#y-b8{ cӏF.QgGnfCb~Py7XWeN kJț4+lv!(+d~HsR6Chw\{ߛNT(468CO<.VsuDRFExܥ}̏~{n/`XVilO߾"fbv\5΀ps}9̢;`^ff8eck6!{ [T)y%܇LN}e8plg)+n^Rě_iS,KaLr+^ ;XNKX?I=sVe%bؙs7k &ZjjEZ jE^VFDq$sͺ^p($h4(iԪZ8 P+jDh6"D1 Ь7<:1f6DhP'  P/N֋ " &Rp(N l'PkQ1#.b4QbFzCȠ;7‹S01"4aJs FɉdF*vke2"AZ1*Q$1(jAhGM4káNVVJ`;dMhfq+V/)ЛB:9j4*)1>uVj„>! ?mrrcov/man/0000755000176200001440000000000014556261376012177 5ustar liggesusersrrcov/man/PcaLocantore.Rd0000644000176200001440000001252414443667016015040 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.Rd0000644000176200001440000000335214443667016015204 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.Rd0000644000176200001440000000225414443667016014562 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.Rd0000644000176200001440000001216014443667016016200 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.Rd0000644000176200001440000000413514556236111014747 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.Rd0000644000176200001440000000621614443667016015220 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.Rd0000644000176200001440000000246714443667016015616 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.Rd0000644000176200001440000000732714443667016013736 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.Rd0000644000176200001440000001404314443667016013637 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.Rd0000644000176200001440000000307714443667016015412 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.Rd0000644000176200001440000000263414443667016017076 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.Rd0000644000176200001440000000216114443667016015650 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.Rd0000644000176200001440000000325414443667016015102 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.Rd0000644000176200001440000000723214443667016014320 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.Rd0000644000176200001440000000424214443667016016510 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.Rd0000644000176200001440000000562114443667016016467 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.Rd0000644000176200001440000001160614443667016015106 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.Rd0000644000176200001440000001030614443667016013773 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.Rd0000644000176200001440000000516314443667016015474 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.Rd0000644000176200001440000000520114443667016015120 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.Rd0000644000176200001440000000433614443667016015417 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.Rd0000644000176200001440000000470514443667016015624 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.Rd0000644000176200001440000001360214443667016013424 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.Rd0000644000176200001440000001523014443667016014532 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.Rd0000644000176200001440000000743514443667016014500 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.Rd0000644000176200001440000000206714443667016013760 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.Rd0000644000176200001440000000536714443667016014423 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.Rd0000644000176200001440000000313714443667016014754 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.Rd0000644000176200001440000000553014522251476013413 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, [https://jse.amstat.org/datasets/fishcatch.dat.txt] accessed November, 2023. } \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.Rd0000644000176200001440000001036614443667016014026 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.Rd0000644000176200001440000000345614443667016013623 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.Rd0000644000176200001440000000530314443667016016317 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.Rd0000644000176200001440000001556414443667016014032 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{ ## This is the first example from Boudt et al. (2020). The first variable is ## the dependent one, which we remove and remain with p=226 NIR absorbance spectra data(octane) octane <- octane[, -1] # remove the dependent variable y n <- nrow(octane) p <- ncol(octane) ## Compute MRCD with h=33, which gives approximately 15 percent breakdown point. ## This value of h was found by Boudt et al. (2020) using a data driven approach, ## similar to the Forward Search of Atkinson et al. (2004). ## The default value of h would be 20 (i.e. alpha=0.5) out <- CovMrcd(octane, h=33) out$rho ## Please note that in the paper is indicated that the obtained rho=0.1149, however, ## this value of rho is obtained if the parameter maxcond is set equal to 999 (this was ## the default in an earlier version of the software, now the default is maxcond=50). ## To reproduce the result from the paper, change the call to CovMrcd() as follows ## (this will not influence the results shown further): ## out <- CovMrcd(octane, h=33, maxcond=999) ## out$rho 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.Rd0000644000176200001440000000332414443667016015125 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.Rd0000644000176200001440000000370614443667016013436 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.Rd0000644000176200001440000000415414443667016013574 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.Rd0000644000176200001440000000472714443667016015220 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.Rd0000644000176200001440000001112214443667016013642 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.Rd0000644000176200001440000000533414443667016015520 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.Rd0000644000176200001440000001154714443667016013645 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.Rd0000644000176200001440000000210314443667016015651 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.Rd0000644000176200001440000001233114443667016013253 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.Rd0000644000176200001440000000663714443667016014541 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.Rd0000644000176200001440000000447514443667016014005 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{https://michem.unimib.it} } \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.Rd0000644000176200001440000000342014443667016015463 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.Rd0000644000176200001440000000414614443667016015267 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.Rd0000644000176200001440000000244614443667016014521 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.Rd0000644000176200001440000000450214443667016016312 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.Rd0000644000176200001440000000252314443667016014436 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.Rd0000644000176200001440000000250014443667016013401 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/Cars.Rd0000644000176200001440000000464113002212631013332 0ustar liggesusers\name{Cars} \alias{Cars} \docType{data} \title{ Consumer reports car data: dimensions } \description{ A data frame containing 11 variables with different dimensions of 111 cars } \usage{data(Cars)} \format{ A data frame with 111 observations on the following 11 variables. \describe{ \item{\code{length}}{a numeric vector} \item{\code{wheelbase}}{a numeric vector} \item{\code{width}}{a numeric vector} \item{\code{height}}{a numeric vector} \item{\code{front.hd}}{a numeric vector} \item{\code{rear.hd}}{a numeric vector} \item{\code{front.leg}}{a numeric vector} \item{\code{rear.seating}}{a numeric vector} \item{\code{front.shoulder}}{a numeric vector} \item{\code{rear.shoulder}}{a numeric vector} \item{\code{luggage}}{a numeric vector} } } %\details{} \source{ Consumer reports. (April 1990). http://backissues.com/issue/Consumer-Reports-April-1990, pp. 235--288. } \references{ Chambers, J. M. and Hastie, T. J. (1992). Statistical models in S. Cole, Pacific Grove, CA: Wadsworth and Brooks, pp. 46--47. M. Hubert, P. J. Rousseeuw, K. Vanden Branden (2005), ROBPCA: A new approach to robust principal components analysis, \emph{Technometrics}, \bold{47}, 64--79. } \examples{ data(Cars) ## Plot a pairwise scaterplot matrix pairs(Cars[,1:6]) mcd <- CovMcd(Cars[,1:6]) plot(mcd, which="pairs") ## Start with robust PCA pca <- PcaHubert(Cars, k=ncol(Cars), kmax=ncol(Cars)) pca ## Compare with the classical PCA prcomp(Cars) ## or PcaClassic(Cars, k=ncol(Cars), kmax=ncol(Cars)) ## If you want to print the scores too, use print(pca, print.x=TRUE) ## Using the formula interface PcaHubert(~., data=Cars, k=ncol(Cars), kmax=ncol(Cars)) ## To plot the results: plot(pca) # distance plot pca2 <- PcaHubert(Cars, k=4) plot(pca2) # PCA diagnostic plot (or outlier map) ## Use the standard plots available for prcomp and princomp screeplot(pca) # it is interesting with all variables biplot(pca) # for biplot we need more than one PCs ## Restore the covraiance matrix py <- PcaHubert(Cars, k=ncol(Cars), kmax=ncol(Cars)) cov.1 <- py@loadings \%*\% diag(py@eigenvalues) \%*\% t(py@loadings) cov.1 } \keyword{datasets} rrcov/man/PcaClassic-class.Rd0000644000176200001440000000630214443667016015573 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.Rd0000644000176200001440000000361514443667016014006 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.Rd0000644000176200001440000001207414443667016014046 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.Rd0000644000176200001440000000272414443667016013740 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 \code{y} 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 227 columns, the wavelengts are by column and the first variable is the dependent one (\code{y}). } %\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) octane <- octane[, -1] # remove the dependent variable y 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.Rd0000644000176200001440000000471414443667016016333 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.Rd0000644000176200001440000000360014443667016015144 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.Rd0000644000176200001440000000437214443667016014763 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.Rd0000644000176200001440000000332514443667016015675 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.Rd0000644000176200001440000000177414443667016016374 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.Rd0000644000176200001440000000337714443667016013765 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.Rd0000644000176200001440000002174414443667016014347 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.Rd0000644000176200001440000000440714443667016015365 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.Rd0000644000176200001440000000555414443667016016525 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.Rd0000644000176200001440000000227014443667016015647 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.Rd0000644000176200001440000000350014443667016013635 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.Rd0000644000176200001440000000560614443667016014274 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.Rd0000644000176200001440000000236514443667016013270 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.Rd0000644000176200001440000000362514443667016015477 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.Rd0000644000176200001440000000405014443667016013572 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.Rd0000644000176200001440000000233014443667016015234 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.Rd0000644000176200001440000000342714443667016015526 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.Rd0000644000176200001440000000364414443667016013620 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.Rd0000644000176200001440000000242014443667016015734 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.Rd0000644000176200001440000000471614443667016015452 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.Rd0000644000176200001440000000356714443667016014753 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.Rd0000644000176200001440000000512214443667016014317 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.Rd0000644000176200001440000000157214443667016014607 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.Rd0000644000176200001440000001167314443667016013671 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.Rd0000644000176200001440000001021014443667016013503 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.Rd0000644000176200001440000000640714443667016016310 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.Rd0000644000176200001440000001721414443667016014055 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 = missing(initHsets) || is.null(initHsets), 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.Rd0000644000176200001440000000354114443667016015572 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.Rd0000644000176200001440000000423714443667016015161 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/ionosphere.Rd0000644000176200001440000000442514443667016014642 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datadoc.R \docType{data} \name{ionosphere} \alias{ionosphere} \title{Johns Hopkins University Ionosphere database.} \format{ A data frame with 351 rows and 33 variables: 32 measurements and one (the last, \code{Class}) grouping variable: 225 \code{'good'} and 126 \code{'bad'}. The original dataset at UCI contains 351 rows and 35 columns. The first 34 columns are features, the last column contains the classification label of 'g' and 'b'. The first feature is binary and the second one is only 0s, one grouping variable - factor with labels 'good' and 'bad'. } \source{ Source: Space Physics Group; Applied Physics Laboratory; Johns Hopkins University; Johns Hopkins Road; Laurel; MD 20723 Donor: Vince Sigillito (vgs@aplcen.apl.jhu.edu) The data have been taken from the UCI Repository Of Machine Learning Databases at \url{https://archive.ics.uci.edu/ml/datasets/ionosphere} This data set, with the original 34 features is available in the package \pkg{mlbench} and a different data set (refering to the same UCI repository) is available in the package \code{dprep} (archived on CRAN). } \usage{ data(ionosphere) } \description{ ''This radar data was collected by a system in Goose Bay, Labrador. This system consists of a phased array of 16 high-frequency antennas with a total transmitted power on the order of 6.4 kilowatts. The targets were free electrons in the ionosphere. "good" radar returns are those showing evidence of some type of structure in the ionosphere. "bad" returns are those that do not; their signals pass through the ionosphere. Received signals were processed using an autocorrelation function whose arguments are the time of a pulse and the pulse number. There were 17 described by 2 attributes per pulse number, corresponding to the complex values returned by the function resulting from the complex electromagnetic signal.'' [UCI archive] } \examples{ data(ionosphere) ionosphere[, 1:6] |> pairs() } \references{ Sigillito, V. G., Wing, S. P., Hutton, L. V., and Baker, K. B. (1989). Classification of radar returns from the ionosphere using neural networks. Johns Hopkins APL Technical Digest, 10, 262-266. } rrcov/man/PcaLocantore-class.Rd0000644000176200001440000000416014443667016016140 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.Rd0000644000176200001440000000502214443667016015175 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.Rd0000644000176200001440000000420514443667016015575 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.Rd0000644000176200001440000000462514443667016014610 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.Rd0000644000176200001440000000670514443667016014200 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.Rd0000644000176200001440000000647714443667016015002 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.Rd0000644000176200001440000001163314443667016013656 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.Rd0000644000176200001440000000427214443667016014747 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.Rd0000644000176200001440000000325414443667016014470 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.Rd0000644000176200001440000000523314443667016014275 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.Rd0000644000176200001440000000252714443667016014477 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.Rd0000644000176200001440000000417014443667016014616 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.Rd0000644000176200001440000000401114443667016014164 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.Rd0000644000176200001440000000217714443667016015652 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.Rd0000644000176200001440000000451314443667016015104 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.Rd0000644000176200001440000000651514443667016014166 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.Rd0000644000176200001440000000476714443667016014267 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.Rd0000644000176200001440000000246714443667016015611 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.Rd0000644000176200001440000000405214443667016013575 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.Rd0000644000176200001440000000346014443667016015225 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.Rd0000644000176200001440000000647214443667016014751 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.Rd0000644000176200001440000000513614443667016014247 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.Rd0000644000176200001440000000455414443667016016633 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.Rd0000644000176200001440000001357514443667016014303 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.Rd0000644000176200001440000000341114443667016016042 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/DESCRIPTION0000644000176200001440000000273014556271672013134 0ustar liggesusersPackage: rrcov Version: 1.7-5 VersionNote: Released 1.7-4 on 2023-06-24 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: 2024-01-30 21:34:46 UTC; valen NeedsCompilation: yes Author: Valentin Todorov [aut, cre] () Date/Publication: 2024-01-30 22:10:02 UTC RoxygenNote: 7.2.2 rrcov/build/0000755000176200001440000000000014556265566012530 5ustar liggesusersrrcov/build/partial.rdb0000644000176200001440000000007414556265566014656 0ustar liggesusersb```b`a 00 FN ͚Z d@$$7rrcov/tests/0000755000176200001440000000000014443667016012562 5ustar liggesusersrrcov/tests/tldapp.R0000644000176200001440000000223614443667016014174 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.R0000644000176200001440000001266414443667016014060 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.save0000644000176200001440000000365414443667016015666 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.save0000644000176200001440000002707214443667016015622 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.save0000644000176200001440000002227414443667016015431 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.R0000644000176200001440000002420114443667016013717 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.save0000644000176200001440000006775214443667016015344 0ustar liggesusers R Under development (unstable) (2023-03-23 r84036 ucrt) -- "Unsuffered Consequences" Copyright (C) 2023 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)) > > 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.0057546 0.0042606 AHFantigen 0.0042606 0.0084914 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 9.8671 8.6611 Postwt 8.6611 11.8966 Group: Cont Prewt Postwt Prewt 32.5705 -4.3705 Postwt -4.3705 22.5079 Group: FT Prewt Postwt Prewt 33.056 10.814 Postwt 10.814 14.265 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.221983 -0.18658 1.86507 -0.44427 0.1725348 -0.0683616 2.63439 glu -0.186582 471.88789 45.28021 8.95404 30.6551510 -0.6359899 3.50218 bp 1.865066 45.28021 110.09787 26.11192 14.4739180 -0.2104074 13.23392 skin -0.444272 8.95404 26.11192 118.30521 52.3115719 -0.2995751 8.65861 bmi 0.172535 30.65515 14.47392 52.31157 43.3140415 0.0079866 6.75720 ped -0.068362 -0.63599 -0.21041 -0.29958 0.0079866 0.0587710 -0.18683 age 2.634387 3.50218 13.23392 8.65861 6.7572019 -0.1868284 12.09493 Group: Yes npreg glu bp skin bmi ped age npreg 17.875215 -13.740021 9.03580 4.498580 1.787458 0.079504 26.92283 glu -13.740021 917.719003 55.30399 27.976265 10.755113 0.092673 38.94970 bp 9.035798 55.303991 129.97953 34.130200 10.104275 0.198342 32.95351 skin 4.498580 27.976265 34.13020 101.842647 30.297210 0.064739 3.59427 bmi 1.787458 10.755113 10.10428 30.297210 22.529467 0.084369 -6.64317 ped 0.079504 0.092673 0.19834 0.064739 0.084369 0.066667 0.11199 age 26.922828 38.949697 32.95351 3.594266 -6.643165 0.111992 143.69752 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 1.71 0.42 3.06 rrcov/tests/tmest4.R0000644000176200001440000001031714443667016014127 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.save0000644000176200001440000003754514443667016015447 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.R0000644000176200001440000002106314443667016014364 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.R0000644000176200001440000001306214443667016013646 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.save0000644000176200001440000003505414443667016015340 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.R0000644000176200001440000001607214443667016013752 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.R0000644000176200001440000000634214443667016013636 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.save0000644000176200001440000030654514443667016015422 0ustar liggesusers R Under development (unstable) (2023-03-23 r84036 ucrt) -- "Unsuffered Consequences" Copyright (C) 2023 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 135 259 weight 259 564 -------------------------------------------------------- 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: 7 [1] 7 9 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.0132 0.0394 log.light 0.0394 0.2743 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 3 [1] 1 6 10 ------------- 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 129 130 organic 130 182 -------------------------------------------------------- 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 6.29 5.85 5.74 Water.Temp 5.85 9.23 6.14 Acid.Conc. 5.74 6.14 23.25 -------------------------------------------------------- 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.253 1.786 -0.266 0.151 0.075 fatherWc 1.786 1303.382 330.496 12.604 34.503 sstatus -0.266 330.496 119.888 3.833 10.131 teacherSc 0.151 12.604 3.833 0.785 0.555 motherLev 0.075 34.503 10.131 0.555 1.043 -------------------------------------------------------- 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 10.44 1.01 -3.19 X2 1.01 3.83 -1.44 X3 -3.19 -1.44 2.39 -------------------------------------------------------- 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.00e-02 1.88e-03 3.15e-03 -5.86e-04 -1.63e-03 x2 1.88e-03 4.85e-04 1.27e-03 -5.20e-05 2.36e-05 x3 3.15e-03 1.27e-03 6.63e-03 -8.71e-04 3.52e-04 x4 -5.86e-04 -5.20e-05 -8.71e-04 2.85e-03 1.83e-03 x5 -1.63e-03 2.36e-05 3.52e-04 1.83e-03 2.77e-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.227 0.055 0.127 X2 0.055 1.249 0.153 X3 0.127 0.153 1.160 -------------------------------------------------------- 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: 14 [1] 2 6 7 8 9 12 13 14 15 16 23 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 929 1576 brain 1576 5646 -------------------------------------------------------- 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 346 268 -1692 -381 -311 V2 268 236 -1125 -230 -194 V3 -1692 -1125 9993 2455 1951 V4 -381 -230 2455 647 505 V5 -311 -194 1951 505 398 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 4 [1] 17 18 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 10.6 14.6 Y 14.6 21.3 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 5 [1] 14 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 1420 11932 Reserves 11932 208643 -------------------------------------------------------- radarImage 1573 5 789 36.694425 Best subsample: Too long... Outliers: 117 [1] 164 237 238 242 261 262 351 450 451 462 480 481 509 516 535 [16] 542 572 597 620 643 654 669 697 737 802 803 804 818 832 833 [31] 834 862 863 864 892 900 939 989 1029 1064 1123 1132 1145 1202 1223 [46] 1224 1232 1233 1249 1250 1258 1259 1267 1303 1347 1357 1368 1375 1376 1393 [61] 1394 1402 1403 1411 1417 1419 1420 1428 1436 1443 1444 1453 1470 1479 1487 [76] 1492 1504 1510 1511 1512 1517 1518 1519 1520 1521 1522 1525 1526 1527 1528 [91] 1530 1532 1534 1543 1544 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 [106] 1557 1558 1561 1562 1564 1565 1566 1567 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 123.6 23.0 -361.9 -197.1 -22.5 Y.coord 23.0 400.6 34.3 -191.1 -39.1 Band.1 -361.9 34.3 27167.9 8178.8 473.7 Band.2 -197.1 -191.1 8178.8 26021.8 952.4 Band.3 -22.5 -39.1 473.7 952.4 4458.4 -------------------------------------------------------- NOxEmissions 8088 4 4046 2.474539 Best subsample: Too long... Outliers: 2156 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 9180.6297 12.0306 0.7219 -10.1273 LNOx 12.0306 0.4721 0.1418 -0.1526 LNOxEm 0.7219 0.1418 0.2516 0.0438 sqrtWS -10.1273 -0.1526 0.0438 0.2073 -------------------------------------------------------- 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: 4 [1] 1 2 17 31 ------------- 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.313 -0.167 Rate -0.167 0.728 -------------------------------------------------------- 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: 13 [1] 1 8 15 21 22 28 29 33 42 43 46 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 35.5615 17.9337 -0.5337 -0.9545 -0.3093 -14.0090 PA 17.9337 27.7333 -4.9017 -1.4174 0.0343 -28.7040 GPA -0.5337 -4.9017 5.3410 0.2690 -0.1484 4.0006 HS -0.9545 -1.4174 0.2690 0.8662 -0.0454 2.9024 GHS -0.3093 0.0343 -0.1484 -0.0454 0.1772 0.7457 y -14.0090 -28.7040 4.0006 2.9024 0.7457 82.6877 -------------------------------------------------------- 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: 63 [1] 30 39 40 41 42 62 63 64 65 66 68 69 70 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 105 141 143 144 145 147 148 149 150 151 152 153 [58] 154 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 69082.99 1477.81 1613.64 1992.62 1439.32 -62.12 Length1 1477.81 34.68 37.61 45.51 28.82 -1.31 Length2 1613.64 37.61 40.88 49.52 31.81 -1.40 Length3 1992.62 45.51 49.52 61.16 42.65 -2.25 Height 1439.32 28.82 31.81 42.65 46.74 -2.82 Width -62.12 -1.31 -1.40 -2.25 -2.82 1.01 -------------------------------------------------------- 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 20.58227 2.28743 -0.02039 2.12648 -1.80227 0.08821 AL 2.28743 4.03605 -0.63021 -2.49966 0.20842 -0.02038 FE -0.02039 -0.63021 0.27803 0.53382 -0.35125 0.01427 MG 2.12648 -2.49966 0.53382 2.79561 -0.15786 0.02847 CA -1.80227 0.20842 -0.35125 -0.15786 1.23240 -0.03465 TI 0.08821 -0.02038 0.01427 0.02847 -0.03465 0.00175 -------------------------------------------------------- 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: 13 [1] 9 14 19 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.388 0.323 0.393 0.389 -0.195 Appearance 0.323 0.503 0.494 0.494 -0.270 Taste 0.393 0.494 0.640 0.629 -0.361 Stickiness 0.389 0.494 0.629 0.815 -0.486 Toughness -0.195 -0.270 -0.361 -0.486 0.451 Overall_evaluation 0.471 0.575 0.723 0.772 -0.457 Overall_evaluation Favor 0.471 Appearance 0.575 Taste 0.723 Stickiness 0.772 Toughness -0.457 Overall_evaluation 0.882 -------------------------------------------------------- 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: 30 [1] 3 4 5 6 7 8 11 13 15 19 21 22 28 29 30 34 35 36 38 40 43 44 46 53 54 [26] 58 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 582.4034 224.9343 -12.6722 -1.6729 -3.3664 226.1952 MOR 224.9343 2351.3907 -286.9504 -32.0743 -35.5649 -527.4684 CAR -12.6722 -286.9504 58.1190 5.7393 6.6365 83.6180 DR -1.6729 -32.0743 5.7393 0.8339 0.5977 12.1938 GNP -3.3664 -35.5649 6.6365 0.5977 1.4175 13.0709 DEN 226.1952 -527.4684 83.6180 12.1938 13.0709 2041.5809 TB 0.4002 -1.1807 0.2701 0.0191 0.0058 -0.9346 TB POP 0.4002 MOR -1.1807 CAR 0.2701 DR 0.0191 GNP 0.0058 DEN -0.9346 TB 0.0184 -------------------------------------------------------- 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 6.12e+03 1.73e+01 -1.67e+03 -2.06e+03 9.10e+03 2.02e+05 RATE 1.73e+01 2.52e-01 2.14e+01 -3.54e+00 5.85e+01 1.37e+03 ERSP -1.67e+03 2.14e+01 1.97e+04 7.76e+01 -1.71e+03 -1.41e+04 ERNO -2.06e+03 -3.54e+00 7.76e+01 2.06e+03 -2.02e+03 -4.83e+04 NEIN 9.10e+03 5.85e+01 -1.71e+03 -2.02e+03 2.02e+04 4.54e+05 ASSET 2.02e+05 1.37e+03 -1.41e+04 -4.83e+04 4.54e+05 1.03e+07 AGE -6.29e+01 -2.61e-01 4.83e+00 2.44e+01 -1.08e+02 -2.46e+03 DEP -6.17e+00 -7.05e-02 -2.13e+01 2.29e+00 -1.30e+01 -3.16e+02 RACE -2.17e+03 -9.46e+00 7.19e+02 5.59e+02 -3.95e+03 -8.77e+04 SCHOOL 7.12e+01 5.87e-01 5.39e+01 -2.14e+01 1.63e+02 3.79e+03 AGE DEP RACE SCHOOL HRS -6.29e+01 -6.17e+00 -2.17e+03 7.12e+01 RATE -2.61e-01 -7.05e-02 -9.46e+00 5.87e-01 ERSP 4.83e+00 -2.13e+01 7.19e+02 5.39e+01 ERNO 2.44e+01 2.29e+00 5.59e+02 -2.14e+01 NEIN -1.08e+02 -1.30e+01 -3.95e+03 1.63e+02 ASSET -2.46e+03 -3.16e+02 -8.77e+04 3.79e+03 AGE 1.01e+00 7.03e-02 2.39e+01 -9.52e-01 DEP 7.03e-02 4.62e-02 2.72e+00 -1.94e-01 RACE 2.39e+01 2.72e+00 8.74e+02 -3.09e+01 SCHOOL -9.52e-01 -1.94e-01 -3.09e+01 1.62e+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: 14 [1] 8 9 15 18 20 21 23 24 28 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 959.69 771.68 -60.92 198.38 Solar.R 771.68 7089.72 -1.72 95.75 Wind -60.92 -1.72 10.71 -11.96 Temp 198.38 95.75 -11.96 62.78 -------------------------------------------------------- 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: 10 [1] 1 6 9 13 14 16 18 21 24 26 ------------- 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 169.34 127.83 40.48 110.26 91.71 -3.59 53.84 complaints 127.83 156.80 52.65 110.97 96.56 7.27 76.03 privileges 40.48 52.65 136.91 92.38 69.00 9.53 87.98 learning 110.26 110.97 92.38 157.77 112.92 6.74 75.51 raises 91.71 96.56 69.00 112.92 112.79 4.91 70.22 critical -3.59 7.27 9.53 6.74 4.91 52.25 15.00 advance 53.84 76.03 87.98 75.51 70.22 15.00 93.11 -------------------------------------------------------- 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: 61 [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 29 30 31 32 33 34 36 37 38 39 [39] 40 45 46 47 54 55 56 57 58 59 60 61 64 65 82 97 98 100 101 [58] 102 103 104 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 1.64e+01 -1.22e+00 5.59e+01 9.98e+00 -8.37e-02 mag -1.22e+00 4.13e-01 -3.19e+00 1.35e+00 1.22e-02 station 5.59e+01 -3.19e+00 1.03e+03 7.00e+01 5.56e-01 dist 9.98e+00 1.35e+00 7.00e+01 2.21e+02 -9.24e-01 accel -8.37e-02 1.22e-02 5.56e-01 -9.24e-01 9.62e-03 -------------------------------------------------------- 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 ORAL CONT 0.852 -0.266 -0.422 -0.155 -0.049 -0.074 -0.117 -0.119 -0.177 INTG -0.266 0.397 0.537 0.406 0.340 0.325 0.404 0.409 0.430 DMNR -0.422 0.537 0.824 0.524 0.458 0.437 0.520 0.504 0.569 DILG -0.155 0.406 0.524 0.486 0.426 0.409 0.506 0.515 0.511 CFMG -0.049 0.340 0.458 0.426 0.427 0.403 0.466 0.476 0.478 DECI -0.074 0.325 0.437 0.409 0.403 0.396 0.449 0.462 0.460 PREP -0.117 0.404 0.520 0.506 0.466 0.449 0.552 0.565 0.551 FAMI -0.119 0.409 0.504 0.515 0.476 0.462 0.565 0.594 0.571 ORAL -0.177 0.430 0.569 0.511 0.478 0.460 0.551 0.571 0.575 WRIT -0.159 0.427 0.549 0.515 0.480 0.461 0.556 0.580 0.574 PHYS -0.184 0.269 0.362 0.308 0.298 0.307 0.335 0.358 0.369 RTEN -0.260 0.472 0.642 0.519 0.467 0.455 0.539 0.554 0.573 WRIT PHYS RTEN CONT -0.159 -0.184 -0.260 INTG 0.427 0.269 0.472 DMNR 0.549 0.362 0.642 DILG 0.515 0.308 0.519 CFMG 0.480 0.298 0.467 DECI 0.461 0.307 0.455 PREP 0.556 0.335 0.539 FAMI 0.580 0.358 0.554 ORAL 0.574 0.369 0.573 WRIT 0.580 0.365 0.567 PHYS 0.365 0.300 0.378 RTEN 0.567 0.378 0.615 -------------------------------------------------------- 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: 11 [1] 2 3 5 6 10 18 24 28 33 37 47 ------------- 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 16.1 269.3 20.3 25.2 Assault 269.3 6613.0 567.8 453.7 UrbanPop 20.3 567.8 225.4 47.7 Rape 25.2 453.7 47.7 50.9 -------------------------------------------------------- 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 108.5 1039.9 1231.9 -465.6 81.4 GNP 1039.9 10300.0 11161.6 -4277.6 803.4 Unemployed 1231.9 11161.6 19799.4 -5805.6 929.1 Armed.Forces -465.6 -4277.6 -5805.6 2805.5 -327.4 Population 81.4 803.4 929.1 -327.4 63.5 Year 51.6 504.3 595.6 -216.7 39.7 Employed 34.2 344.1 323.6 -149.5 26.2 Year Employed GNP.deflator 51.6 34.2 GNP 504.3 344.1 Unemployed 595.6 323.6 Armed.Forces -216.7 -149.5 Population 39.7 26.2 Year 25.1 16.7 Employed 16.7 12.4 -------------------------------------------------------- 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: 31 [1] 5 6 11 12 15 17 18 23 24 29 30 35 36 41 42 47 48 53 54 59 60 65 66 70 71 [26] 72 76 77 78 83 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 247.8 79.5 11.9 age 79.5 25.7 3.0 Seed 11.9 3.0 17.1 -------------------------------------------------------- quakes 1000 4 502 8.274369 Best subsample: Too long... Outliers: 265 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 1.47e+01 3.53e+00 1.34e+02 -2.52e-01 long 3.53e+00 4.55e+00 -3.63e+02 4.36e-02 depth 1.34e+02 -3.63e+02 4.84e+04 -1.29e+01 mag -2.52e-01 4.36e-02 -1.29e+01 1.38e-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 135 259 weight 259 564 -------------------------------------------------------- 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: 7 [1] 7 9 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.0132 0.0394 log.light 0.0394 0.2743 -------------------------------------------------------- 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 124 101 organic 101 197 -------------------------------------------------------- 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 56.28 13.33 26.68 Water.Temp 13.33 8.28 6.98 Acid.Conc. 26.68 6.98 37.97 -------------------------------------------------------- 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.391 2.956 2.146 0.447 0.110 fatherWc 2.956 1358.640 442.724 12.235 32.842 sstatus 2.146 442.724 205.590 6.464 11.382 teacherSc 0.447 12.235 6.464 1.179 0.510 motherLev 0.110 32.842 11.382 0.510 0.919 -------------------------------------------------------- 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 10.90243 -0.00457 -1.46156 X2 -0.00457 3.85051 -1.94604 X3 -1.46156 -1.94604 3.21424 -------------------------------------------------------- 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.05e-02 1.81e-03 2.08e-03 -6.41e-04 -9.61e-04 x2 1.81e-03 5.55e-04 8.76e-04 -2.03e-04 -4.70e-05 x3 2.08e-03 8.76e-04 5.60e-03 -1.11e-03 -1.26e-05 x4 -6.41e-04 -2.03e-04 -1.11e-03 4.27e-03 2.60e-03 x5 -9.61e-04 -4.70e-05 -1.26e-05 2.60e-03 2.95e-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.227 0.055 0.127 X2 0.055 1.249 0.153 X3 0.127 0.153 1.160 -------------------------------------------------------- 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: 14 [1] 2 6 7 8 9 12 13 14 15 16 23 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 929 1576 brain 1576 5646 -------------------------------------------------------- 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 346 268 -1692 -381 -311 V2 268 236 -1125 -230 -194 V3 -1692 -1125 9993 2455 1951 V4 -381 -230 2455 647 505 V5 -311 -194 1951 505 398 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 4 [1] 17 18 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 10.6 14.6 Y 14.6 21.3 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 5 [1] 14 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 1420 11932 Reserves 11932 208643 -------------------------------------------------------- radarImage 1573 5 789 36.694865 Best subsample: Too long... Outliers: 114 [1] 164 237 238 242 261 262 351 450 451 462 463 480 481 509 516 [16] 535 542 572 597 620 643 654 669 679 697 737 802 803 804 818 [31] 832 833 834 862 863 864 892 900 939 989 1029 1064 1123 1132 1145 [46] 1202 1223 1224 1232 1233 1249 1250 1258 1259 1267 1303 1347 1357 1368 1375 [61] 1376 1393 1394 1402 1411 1417 1419 1420 1428 1436 1443 1444 1453 1470 1504 [76] 1510 1511 1512 1518 1519 1520 1521 1522 1525 1526 1527 1528 1530 1532 1534 [91] 1543 1544 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1557 1558 1561 [106] 1562 1564 1565 1566 1567 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 123.2 21.5 -363.9 -200.1 -24.3 Y.coord 21.5 410.7 46.5 -177.3 -33.4 Band.1 -363.9 46.5 27051.1 8138.9 469.3 Band.2 -200.1 -177.3 8138.9 25938.0 946.2 Band.3 -24.3 -33.4 469.3 946.2 4470.1 -------------------------------------------------------- NOxEmissions 8088 4 4046 2.474536 Best subsample: Too long... Outliers: 2152 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 9176.2934 12.0355 0.7022 -10.1387 LNOx 12.0355 0.4736 0.1430 -0.1528 LNOxEm 0.7022 0.1430 0.2527 0.0436 sqrtWS -10.1387 -0.1528 0.0436 0.2074 -------------------------------------------------------- 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: 4 [1] 1 2 17 31 ------------- 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.313 -0.167 Rate -0.167 0.728 -------------------------------------------------------- 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: 15 [1] 1 8 15 21 22 28 29 33 39 42 43 46 49 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 35.1365 17.7291 -1.4003 -0.6554 -0.4728 -14.9305 PA 17.7291 28.4297 -5.5245 -1.2444 -0.0452 -29.6181 GPA -1.4003 -5.5245 5.2170 0.3954 -0.2152 3.8252 HS -0.6554 -1.2444 0.3954 0.7273 -0.0107 2.1514 GHS -0.4728 -0.0452 -0.2152 -0.0107 0.1728 0.8440 y -14.9305 -29.6181 3.8252 2.1514 0.8440 79.0511 -------------------------------------------------------- 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: 64 [1] 30 39 40 41 62 63 64 65 66 68 69 70 73 74 75 76 77 78 79 [20] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 [39] 99 100 101 102 103 104 105 141 142 143 144 145 146 147 148 149 150 151 152 [58] 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 64662.19 1412.34 1541.95 1917.21 1420.83 -61.15 Length1 1412.34 34.14 37.04 45.07 29.25 -1.26 Length2 1541.95 37.04 40.26 49.04 32.21 -1.34 Length3 1917.21 45.07 49.04 60.82 43.03 -2.15 Height 1420.83 29.25 32.21 43.03 46.50 -2.66 Width -61.15 -1.26 -1.34 -2.15 -2.66 1.02 -------------------------------------------------------- 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 20.58227 2.28743 -0.02039 2.12648 -1.80227 0.08821 AL 2.28743 4.03605 -0.63021 -2.49966 0.20842 -0.02038 FE -0.02039 -0.63021 0.27803 0.53382 -0.35125 0.01427 MG 2.12648 -2.49966 0.53382 2.79561 -0.15786 0.02847 CA -1.80227 0.20842 -0.35125 -0.15786 1.23240 -0.03465 TI 0.08821 -0.02038 0.01427 0.02847 -0.03465 0.00175 -------------------------------------------------------- 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.466 0.389 0.471 0.447 -0.198 Appearance 0.389 0.610 0.592 0.570 -0.293 Taste 0.471 0.592 0.760 0.718 -0.356 Stickiness 0.447 0.570 0.718 0.820 -0.419 Toughness -0.198 -0.293 -0.356 -0.419 0.400 Overall_evaluation 0.557 0.669 0.838 0.846 -0.425 Overall_evaluation Favor 0.557 Appearance 0.669 Taste 0.838 Stickiness 0.846 Toughness -0.425 Overall_evaluation 0.987 -------------------------------------------------------- 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: 30 [1] 3 4 5 6 7 8 11 13 15 21 22 28 29 30 35 36 38 40 41 43 44 45 46 53 54 [26] 58 59 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 3.61e+02 1.95e+02 -6.28e+00 -1.91e-02 -2.07e+00 5.79e+01 MOR 1.95e+02 2.39e+03 -2.79e+02 -3.37e+01 -3.39e+01 -9.21e+02 CAR -6.28e+00 -2.79e+02 5.76e+01 5.77e+00 6.59e+00 7.81e+01 DR -1.91e-02 -3.37e+01 5.77e+00 9.07e-01 5.66e-01 1.69e+01 GNP -2.07e+00 -3.39e+01 6.59e+00 5.66e-01 1.42e+00 9.28e+00 DEN 5.79e+01 -9.21e+02 7.81e+01 1.69e+01 9.28e+00 3.53e+03 TB -6.09e-02 -9.93e-01 2.50e-01 1.98e-02 6.82e-03 -9.75e-01 TB POP -6.09e-02 MOR -9.93e-01 CAR 2.50e-01 DR 1.98e-02 GNP 6.82e-03 DEN -9.75e-01 TB 1.64e-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 3.53e+03 8.31e+00 -5.96e+03 -6.43e+02 5.15e+03 1.12e+05 RATE 8.31e+00 1.78e-01 8.19e+00 2.70e+00 3.90e+01 8.94e+02 ERSP -5.96e+03 8.19e+00 1.90e+04 1.13e+03 -4.73e+03 -9.49e+04 ERNO -6.43e+02 2.70e+00 1.13e+03 1.80e+03 -3.56e+02 -7.33e+03 NEIN 5.15e+03 3.90e+01 -4.73e+03 -3.56e+02 1.38e+04 3.00e+05 ASSET 1.12e+05 8.94e+02 -9.49e+04 -7.33e+03 3.00e+05 6.62e+06 AGE -3.33e+01 -6.55e-02 8.33e+01 1.50e+00 -3.28e+01 -7.55e+02 DEP 4.50e+00 -4.01e-02 -2.77e+01 1.31e+00 -8.09e+00 -1.61e+02 RACE -1.30e+03 -6.06e+00 1.80e+03 1.48e+02 -2.58e+03 -5.59e+04 SCHOOL 3.01e+01 3.58e-01 -5.57e+00 2.84e+00 9.26e+01 2.10e+03 AGE DEP RACE SCHOOL HRS -3.33e+01 4.50e+00 -1.30e+03 3.01e+01 RATE -6.55e-02 -4.01e-02 -6.06e+00 3.58e-01 ERSP 8.33e+01 -2.77e+01 1.80e+03 -5.57e+00 ERNO 1.50e+00 1.31e+00 1.48e+02 2.84e+00 NEIN -3.28e+01 -8.09e+00 -2.58e+03 9.26e+01 ASSET -7.55e+02 -1.61e+02 -5.59e+04 2.10e+03 AGE 6.57e-01 -1.64e-01 1.13e+01 -2.67e-01 DEP -1.64e-01 9.20e-02 2.38e-01 -6.01e-02 RACE 1.13e+01 2.38e-01 5.73e+02 -1.67e+01 SCHOOL -2.67e-01 -6.01e-02 -1.67e+01 7.95e-01 -------------------------------------------------------- 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: 10 [1] 8 9 15 18 24 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 935.54 857.76 -56.30 220.48 Solar.R 857.76 8507.83 1.36 155.13 Wind -56.30 1.36 9.90 -11.61 Temp 220.48 155.13 -11.61 84.00 -------------------------------------------------------- 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: 8 [1] 6 9 13 14 16 18 24 26 ------------- 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 199.95 162.36 115.83 160.44 128.87 -13.55 66.20 complaints 162.36 204.84 130.33 170.66 150.19 16.28 96.66 privileges 115.83 130.33 181.31 152.63 106.56 4.52 91.44 learning 160.44 170.66 152.63 213.06 156.57 9.92 88.31 raises 128.87 150.19 106.56 156.57 152.05 23.10 84.00 critical -13.55 16.28 4.52 9.92 23.10 80.22 27.15 advance 66.20 96.66 91.44 88.31 84.00 27.15 95.51 -------------------------------------------------------- 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: 49 [1] 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 19 20 21 22 [20] 23 24 25 27 28 29 30 31 32 33 40 45 47 59 60 61 64 65 78 [39] 82 83 97 98 100 101 102 103 104 105 117 ------------- 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 2.98e+01 -1.58e+00 9.49e+01 -8.36e+00 -3.59e-02 mag -1.58e+00 4.26e-01 -3.88e+00 3.13e+00 5.30e-03 station 9.49e+01 -3.88e+00 1.10e+03 2.60e+01 5.38e-01 dist -8.36e+00 3.13e+00 2.60e+01 2.66e+02 -9.23e-01 accel -3.59e-02 5.30e-03 5.38e-01 -9.23e-01 7.78e-03 -------------------------------------------------------- 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.7363 -0.2916 -0.4193 -0.1943 -0.0555 -0.0690 -0.1703 -0.1727 INTG -0.2916 0.4179 0.5511 0.4167 0.3176 0.3102 0.4247 0.4279 DMNR -0.4193 0.5511 0.8141 0.5256 0.4092 0.3934 0.5294 0.5094 DILG -0.1943 0.4167 0.5256 0.4820 0.3904 0.3819 0.5054 0.5104 CFMG -0.0555 0.3176 0.4092 0.3904 0.3595 0.3368 0.4180 0.4206 DECI -0.0690 0.3102 0.3934 0.3819 0.3368 0.3310 0.4135 0.4194 PREP -0.1703 0.4247 0.5294 0.5054 0.4180 0.4135 0.5647 0.5752 FAMI -0.1727 0.4279 0.5094 0.5104 0.4206 0.4194 0.5752 0.6019 ORAL -0.2109 0.4453 0.5646 0.5054 0.4200 0.4121 0.5575 0.5735 WRIT -0.2033 0.4411 0.5466 0.5087 0.4222 0.4147 0.5592 0.5787 PHYS -0.1624 0.2578 0.3163 0.2833 0.2268 0.2362 0.3108 0.3284 RTEN -0.2622 0.4872 0.6324 0.5203 0.4145 0.4081 0.5488 0.5595 ORAL WRIT PHYS RTEN CONT -0.2109 -0.2033 -0.1624 -0.2622 INTG 0.4453 0.4411 0.2578 0.4872 DMNR 0.5646 0.5466 0.3163 0.6324 DILG 0.5054 0.5087 0.2833 0.5203 CFMG 0.4200 0.4222 0.2268 0.4145 DECI 0.4121 0.4147 0.2362 0.4081 PREP 0.5575 0.5592 0.3108 0.5488 FAMI 0.5735 0.5787 0.3284 0.5595 ORAL 0.5701 0.5677 0.3283 0.5688 WRIT 0.5677 0.5715 0.3268 0.5645 PHYS 0.3283 0.3268 0.2302 0.3308 RTEN 0.5688 0.5645 0.3308 0.6057 -------------------------------------------------------- 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: 7 [1] 2 5 6 10 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 17.9 285.4 17.6 25.0 Assault 285.4 6572.8 524.9 465.0 UrbanPop 17.6 524.9 211.9 50.5 Rape 25.0 465.0 50.5 56.4 -------------------------------------------------------- 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 108.5 1039.9 1231.9 -465.6 81.4 GNP 1039.9 10300.0 11161.6 -4277.6 803.4 Unemployed 1231.9 11161.6 19799.4 -5805.6 929.1 Armed.Forces -465.6 -4277.6 -5805.6 2805.5 -327.4 Population 81.4 803.4 929.1 -327.4 63.5 Year 51.6 504.3 595.6 -216.7 39.7 Employed 34.2 344.1 323.6 -149.5 26.2 Year Employed GNP.deflator 51.6 34.2 GNP 504.3 344.1 Unemployed 595.6 323.6 Armed.Forces -216.7 -149.5 Population 39.7 26.2 Year 25.1 16.7 Employed 16.7 12.4 -------------------------------------------------------- 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: 31 [1] 5 6 11 12 15 17 18 23 24 29 30 35 36 41 42 47 48 53 54 59 60 65 66 70 71 [26] 72 76 77 78 83 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 247.8 79.5 11.9 age 79.5 25.7 3.0 Seed 11.9 3.0 17.1 -------------------------------------------------------- quakes 1000 4 502 8.274209 Best subsample: Too long... Outliers: 266 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 1.50e+01 3.58e+00 1.37e+02 -2.66e-01 long 3.58e+00 4.55e+00 -3.61e+02 4.64e-02 depth 1.37e+02 -3.61e+02 4.84e+04 -1.36e+01 mag -2.66e-01 4.64e-02 -1.36e+01 1.34e-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 135 259 weight 259 564 -------------------------------------------------------- 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: 7 [1] 7 9 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.0132 0.0394 log.light 0.0394 0.2743 -------------------------------------------------------- phosphor 18 2 10 6.878847 Best subsample: [1] 3 5 8 9 11 12 13 14 15 17 Outliers: 3 [1] 1 6 10 ------------- 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 129 130 organic 130 182 -------------------------------------------------------- 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.253 1.786 -0.266 0.151 0.075 fatherWc 1.786 1303.382 330.496 12.604 34.503 sstatus -0.266 330.496 119.888 3.833 10.131 teacherSc 0.151 12.604 3.833 0.785 0.555 motherLev 0.075 34.503 10.131 0.555 1.043 -------------------------------------------------------- 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 10.44 1.01 -3.19 X2 1.01 3.83 -1.44 X3 -3.19 -1.44 2.39 -------------------------------------------------------- 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.00e-02 1.88e-03 3.15e-03 -5.86e-04 -1.63e-03 x2 1.88e-03 4.85e-04 1.27e-03 -5.20e-05 2.36e-05 x3 3.15e-03 1.27e-03 6.63e-03 -8.71e-04 3.52e-04 x4 -5.86e-04 -5.20e-05 -8.71e-04 2.85e-03 1.83e-03 x5 -1.63e-03 2.36e-05 3.52e-04 1.83e-03 2.77e-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: 14 [1] 2 6 7 8 9 12 13 14 15 16 23 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 929 1576 brain 1576 5646 -------------------------------------------------------- lactic 20 2 11 0.359580 Best subsample: [1] 1 2 3 4 5 7 8 9 10 11 12 Outliers: 4 [1] 17 18 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 10.6 14.6 Y 14.6 21.3 -------------------------------------------------------- pension 18 2 10 16.675508 Best subsample: [1] 1 2 3 4 5 6 8 9 11 12 Outliers: 5 [1] 14 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 1420 11932 Reserves 11932 208643 -------------------------------------------------------- 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: 4 [1] 1 2 17 31 ------------- 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.313 -0.167 Rate -0.167 0.728 -------------------------------------------------------- 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 6.29 5.85 5.74 Water.Temp 5.85 9.23 6.14 Acid.Conc. 5.74 6.14 23.25 -------------------------------------------------------- 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 3344 1070 Y 1070 343 -------------------------------------------------------- ======================================================== > 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 6.12 2.12 12.87 rrcov/tests/tsest.Rout.save0000644000176200001440000026726714443667016015560 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.save0000644000176200001440000041252214443667016016055 0ustar liggesusers R Under development (unstable) (2023-03-23 r84036 ucrt) -- "Unsuffered Consequences" Copyright (C) 2023 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 358.175786 4.590630 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] 18.9255 2.1426 ---------------------------------------------------------- starsCYG 47 2 2 0.280653 0.005921 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.529767 0.076946 ---------------------------------------------------------- phosphor 18 2 2 285.985489 32.152099 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] 16.9111 5.6703 ---------------------------------------------------------- stackloss 21 3 3 78.703690 19.249085 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] 8.8715 4.3874 2.1990 ---------------------------------------------------------- salinity 28 3 3 11.651966 4.107426 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.4135 2.0267 1.0764 ---------------------------------------------------------- hbk 75 3 3 1.459908 1.201048 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.2083 1.0959 1.0168 ---------------------------------------------------------- milk 86 8 8 5.739740 2.405262 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.39577535 1.55089079 0.92557331 0.33680677 0.19792033 0.17855133 0.16041702 [8] 0.00054179 ---------------------------------------------------------- bushfire 38 5 5 31248.552973 358.974577 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] 176.77260 18.94662 16.21701 3.95755 0.92761 ---------------------------------------------------------- ========================================================== > dodata(method="hubert") Call: dodata(method = "hubert") Data Set n p k e1 e2 ========================================================== heart 12 2 1 315.227002 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] 17.755 ---------------------------------------------------------- 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 77.038636 18.859777 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] 8.7772 4.3428 ---------------------------------------------------------- salinity 28 3 2 8.001175 5.858089 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] 2.8286 2.4203 ---------------------------------------------------------- hbk 75 3 3 1.459908 1.201048 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.2083 1.0959 1.0168 ---------------------------------------------------------- milk 86 8 2 6.040806 2.473780 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.4578 1.5728 ---------------------------------------------------------- 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 685.776266 13.127306 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] 26.1873 3.6232 ---------------------------------------------------------- starsCYG 47 2 2 0.280150 0.007389 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.529292 0.085957 ---------------------------------------------------------- phosphor 18 2 2 288.018150 22.020514 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] 16.9711 4.6926 ---------------------------------------------------------- stackloss 21 3 3 28.153060 8.925048 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] 5.3059 2.9875 1.3020 ---------------------------------------------------------- salinity 28 3 3 11.801732 3.961826 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.43536 1.99043 0.94546 ---------------------------------------------------------- hbk 75 3 3 1.436470 1.181766 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.1985 1.0871 1.0086 ---------------------------------------------------------- milk 86 8 8 5.758630 2.224809 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.39971451 1.49157920 0.93184037 0.33183258 0.19628996 0.16485446 0.12784351 [8] 0.00052622 ---------------------------------------------------------- bushfire 38 5 5 11393.979994 197.523453 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] 106.7426 14.0543 4.9184 1.8263 1.0193 ---------------------------------------------------------- ========================================================== > 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 1.96 0.57 3.40 rrcov/tests/togk4.R0000644000176200001440000000531214443667016013736 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.R0000644000176200001440000000241514443667016013640 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.save0000644000176200001440000014767514443667016015342 0ustar liggesusers R Under development (unstable) (2023-03-23 r84036 ucrt) -- "Unsuffered Consequences" Copyright (C) 2023 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.018036 0.011853 AHFantigen 0.011853 0.019185 Linear Coeficients: AHFactivity AHFantigen carrier -28.4029 17.2368 normal -8.5834 2.1602 Constants: carrier normal -4.8325 -1.4056 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 26.9291 3.3862 Postwt 3.3862 18.2368 Linear Coeficients: Prewt Postwt CBT 2.5563 4.0738 Cont 2.5284 3.9780 FT 2.5374 4.7250 Constants: CBT Cont FT -275.49 -265.45 -332.31 Apparent error rate 0.3889 Classification table Predicted Actual CBT Cont FT CBT 16 5 8 Cont 11 15 0 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.552 0.172 0.276 Cont 0.423 0.577 0.000 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 8.51105 -5.61029 4.756672 1.52732 0.82066 -0.010070 12.382693 glu -5.61029 656.11894 49.855724 16.67486 23.07833 -0.352475 17.724967 bp 4.75667 49.85572 119.426757 29.64563 12.90698 -0.049538 21.287178 skin 1.52732 16.67486 29.645632 113.19900 44.15972 -0.157594 6.741105 bmi 0.82066 23.07833 12.906985 44.15972 35.54164 0.038640 1.481520 ped -0.01007 -0.35247 -0.049538 -0.15759 0.03864 0.062664 -0.069636 age 12.38269 17.72497 21.287178 6.74110 1.48152 -0.069636 64.887154 Linear Coeficients: npreg glu bp skin bmi ped age No -0.45855 0.092789 0.45848 -0.30675 1.0075 6.2670 0.30749 Yes -0.22400 0.150013 0.44787 -0.26148 1.0015 8.2935 0.45187 Constants: No Yes -37.050 -51.586 Apparent error rate 0.22 Classification table Predicted Actual No Yes No 107 25 Yes 19 49 Confusion matrix Predicted Actual No Yes No 0.811 0.189 Yes 0.279 0.721 Data: Forest soils Apparent error rate 0.3103 Classification table Predicted Actual 1 2 3 1 7 2 2 2 3 13 7 3 1 3 20 Confusion matrix Predicted Actual 1 2 3 1 0.636 0.182 0.182 2 0.130 0.565 0.304 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 7582.0 -1263.1 1095.8 glucose -1263.1 18952.4 4919.3 sspg 1095.8 4919.3 3351.2 Linear Coeficients: insulin glucose sspg normal 0.027694 0.023859 -0.014514 chemical 0.040288 0.022532 0.020479 overt 0.017144 0.048768 0.025158 Constants: normal chemical overt -6.3223 -15.0879 -31.6445 Apparent error rate 0.1862 Classification table Predicted Actual normal chemical overt normal 69 7 0 chemical 13 23 0 overt 2 5 26 Confusion matrix Predicted Actual normal chemical overt normal 0.908 0.092 0.000 chemical 0.361 0.639 0.000 overt 0.061 0.152 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.26391 0.76754 0.18606 -0.33763 0.65944 0.59857 0.28932 index 0.76754 191.38080 38.42685 26.32923 82.43953 91.89091 38.13688 FL 0.18606 38.42685 8.50147 5.68789 18.13749 20.30739 8.30920 RW -0.33763 26.32923 5.68789 4.95782 11.90225 13.61117 5.45814 CL 0.65944 82.43953 18.13749 11.90225 39.60115 44.10886 18.09504 CW 0.59857 91.89091 20.30739 13.61117 44.10886 49.42616 20.17554 BD 0.28932 38.13688 8.30920 5.45814 18.09504 20.17554 8.39525 Linear Coeficients: sexM index FL RW CL CW BD B 29.104 -2.4938 10.809 15.613 0.8320 -4.2978 -0.46788 O 42.470 -3.9361 26.427 22.857 2.8582 -17.1526 12.31048 Constants: B O -78.317 -159.259 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 13.5941404 2.986675 -0.651132 0.173577 -0.350984 -0.0051996 AL 2.9866747 1.622412 0.485167 0.712400 0.077443 0.0133306 FE -0.6511317 0.485167 1.065427 -0.403601 -1.936552 0.0576472 MG 0.1735766 0.712400 -0.403601 2.814948 3.262786 -0.0427129 CA -0.3509837 0.077443 -1.936552 3.262786 7.720320 -0.1454065 TI -0.0051996 0.013331 0.057647 -0.042713 -0.145406 0.0044093 Linear Coeficients: SI AL FE MG CA TI Attic 63.235 -196.99 312.92 7.28960 57.082 -1272.23 Eritrean 41.554 -123.49 201.47 -0.95431 43.616 -597.91 Constants: Attic Eritrean -1578.14 -901.13 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.0125319 0.0086509 AHFantigen 0.0086509 0.0182424 Linear Coeficients: AHFactivity AHFantigen carrier -36.486 16.4923 normal -12.226 2.0107 Constants: carrier normal -6.1276 -1.6771 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 19.1751 8.8546 Postwt 8.8546 25.2326 Linear Coeficients: Prewt Postwt CBT 3.3822 2.0780 Cont 3.3555 2.0144 FT 3.2299 2.5996 Constants: CBT Cont FT -227.29 -220.01 -261.06 Apparent error rate 0.4444 Classification table Predicted Actual CBT Cont FT CBT 16 5 8 Cont 12 11 3 FT 0 4 13 Confusion matrix Predicted Actual CBT Cont FT CBT 0.552 0.172 0.276 Cont 0.462 0.423 0.115 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 6.601330 9.54054 7.33480 3.5803 1.66539 -0.019992 10.661763 glu 9.540535 573.03642 60.57124 28.3698 30.28444 -0.436611 28.318034 bp 7.334803 60.57124 112.03792 27.7566 13.54085 -0.040510 24.692240 skin 3.580339 28.36976 27.75661 112.0036 47.22411 0.100399 13.408195 bmi 1.665393 30.28444 13.54085 47.2241 38.37753 0.175891 6.640765 ped -0.019992 -0.43661 -0.04051 0.1004 0.17589 0.062551 -0.070673 age 10.661763 28.31803 24.69224 13.4082 6.64077 -0.070673 40.492363 Linear Coeficients: npreg glu bp skin bmi ped age No -1.3073 0.10851 0.48404 -0.30638 0.86002 5.9796 0.55388 Yes -1.3136 0.16260 0.44480 -0.25518 0.79826 8.1199 0.86269 Constants: No Yes -38.774 -53.654 Apparent error rate 0.25 Classification table Predicted Actual No Yes No 104 28 Yes 22 46 Confusion matrix Predicted Actual No Yes No 0.788 0.212 Yes 0.324 0.676 Data: Forest soils Apparent error rate 0.3448 Classification table Predicted Actual 1 2 3 1 4 3 4 2 2 14 7 3 2 2 20 Confusion matrix Predicted Actual 1 2 3 1 0.364 0.273 0.364 2 0.087 0.609 0.304 3 0.083 0.083 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 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 5061.46 289.69 2071.71 glucose 289.69 1983.07 385.31 sspg 2071.71 385.31 3000.17 Linear Coeficients: insulin glucose sspg normal 0.021952 0.17236 -0.0041671 chemical 0.034852 0.23217 0.0215200 overt -0.045700 0.50940 0.0813292 Constants: normal chemical overt -31.976 -64.433 -275.502 Apparent error rate 0.0966 Classification table Predicted Actual normal chemical overt normal 73 3 0 chemical 4 32 0 overt 0 7 26 Confusion matrix Predicted Actual normal chemical overt normal 0.961 0.039 0.000 chemical 0.111 0.889 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.201176 0.084299 0.102984 0.037019 Sepal.Width 0.084299 0.108394 0.050253 0.031757 Petal.Length 0.102984 0.050253 0.120215 0.045016 Petal.Width 0.037019 0.031757 0.045016 0.032825 Linear Coeficients: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa 22.536 27.422168 -3.6855 -40.0445 versicolor 17.559 6.374082 24.1965 -18.0178 virginica 16.488 0.015576 29.9586 3.2926 Constants: setosa versicolor virginica -96.901 -100.790 -139.937 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.27470 0.24656 0.12787 -0.34713 0.48937 0.41525 0.20253 index 0.24656 204.06823 42.17347 28.25816 89.28109 100.21077 40.74069 FL 0.12787 42.17347 9.45366 6.24808 19.97936 22.49310 9.03804 RW -0.34713 28.25816 6.24808 5.12921 13.01576 14.90535 5.89729 CL 0.48937 89.28109 19.97936 13.01576 43.06030 48.30814 19.44568 CW 0.41525 100.21077 22.49310 14.90535 48.30814 54.45265 21.82356 BD 0.20253 40.74069 9.03804 5.89729 19.44568 21.82356 8.89498 Linear Coeficients: sexM index FL RW CL CW BD B 12.295 -2.3199 7.2512 9.4085 2.2846 -2.6196 -0.42557 O 13.138 -3.7530 21.1374 11.5680 5.0125 -13.9120 12.61928 Constants: B O -66.688 -134.375 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.0949 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 13 0 0 1 0 42 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.232 0 0 0.018 0 0.750 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 9.708953 2.3634831 -0.112005 0.514666 -0.591122 0.0253885 AL 2.363483 0.8510105 0.044491 0.485132 0.241384 0.0023349 FE -0.112005 0.0444910 0.247768 -0.263894 -0.503218 0.0163218 MG 0.514666 0.4851316 -0.263894 1.608899 1.516228 -0.0292787 CA -0.591122 0.2413842 -0.503218 1.516228 2.455516 -0.0531548 TI 0.025389 0.0023349 0.016322 -0.029279 -0.053155 0.0017412 Linear Coeficients: SI AL FE MG CA TI Attic 112.705 -368.69 530.54 7.5837 149.60 -927.45 Eritrean 77.198 -244.65 366.95 -3.7987 116.88 -260.83 Constants: Attic Eritrean -3252.6 -1961.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.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 6.78 1.20 8.89 rrcov/src/0000755000176200001440000000000014556265566012220 5ustar liggesusersrrcov/src/fsada.f0000644000176200001440000003653414443667016013447 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 sum = sum + cinv(i,k) * (data(k,j) - ave(k,ngp)) 45 continue 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 sum=sum+(data(k,icas)-ave(k,ngp))*datimg(k,j) 60 continue 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 71 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) 71 continue 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) sum = sum + cinv(i,j) * devj(j) 81 continue devi(i) = sum sum2 = sum2 + devi(i) * devj(i) 80 continue factor = rati / (one + rati * sum2) do 85 i = 1, nord do 86 j = 1, nord cinv(i,j) = cinv(i,j) - devi(i) * devi(j) * factor 86 continue 85 continue 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 sum = sum + cov(i,k) * cinv(k,j) 15 continue 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.f0000644000176200001440000003036214443667016013132 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 AUX(I)=Z(I) 100 CONTINUE 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 CCCC VT::18.07.2022 CCCC IF(SWITCH) 810,810,800 IF(SWITCH.LE.0) GO TO 810 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.c0000644000176200001440000005523314443667016013341 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/Makevars0000644000176200001440000000012214443667016013676 0ustar liggesusersPKG_CPPFLAGS=$(DEFS=-DUSE_FC_LEN_T) PKG_LIBS=$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) rrcov/src/rrcov_init.c0000644000176200001440000000357714443667016014545 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.c0000644000176200001440000002244314443667016013535 0ustar liggesusers#define USE_FC_LEN_T #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 FCONE); F77_CALL(dstegr)(&CHARV, &CHARA, &p, diagT, offdiagT, &mu, &mu, &i, &i, &DZERO, &j, gamma, A[k], &p, isuppz, dwork3, &lwork, iwork, &liwork, &info FCONE FCONE); F77_CALL(dopmtr)(&CHARL, &CHARL, &CHARN, &p, &p, U, tau, A[k], &p, dwork2, &info FCONE FCONE FCONE); 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 FCONE FCONE); 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 FCONE FCONE); 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 FCONE FCONE); F77_CALL(dcopy)(&p, center, &IONE, gamma, &IONE); F77_CALL(dgemv)(&CHARN, &p, &p, &DONE, A[k], &p, gamma, &IONE, &DZERO, center, &IONE FCONE); } 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.c0000644000176200001440000001453314443667016014103 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/0000755000176200001440000000000014445051614013421 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.bib0000644000176200001440000020364714443667016015730 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.Rnw0000644000176200001440000033555714443667016015275 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/0000755000176200001440000000000014443667016011621 5ustar liggesusersrrcov/R/CovOgk.R0000644000176200001440000001213114443667016013132 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.R0000644000176200001440000000622514443667016014141 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.R0000644000176200001440000001627714443667016015203 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.R0000644000176200001440000000510614443667016013303 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) ## VT::18.07.2022 - maxcond passed to the lowlevel function mcd <- .detmrcd (x, alpha=alpha, h=h, hsets.init = initHsets, save.hsets=save.hsets, # full.h=full.h, rho=rho, maxcond=maxcond, 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.R0000644000176200001440000001201214443667016013745 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.R0000644000176200001440000000404314443667016013105 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.R0000644000176200001440000000057314443667016012606 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.R0000644000176200001440000001341314443667016013565 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.R0000644000176200001440000001604414443667016014323 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.R0000644000176200001440000004247114443667016014002 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.R0000644000176200001440000001046614443667016013762 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.R0000644000176200001440000006000114443667016013363 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) ## cat("\ncase T=I: ", k, e1, ep) fncond <- function(rho) { condnr <- (rho + (1-rho) * ep) / (rho + (1-rho) * e1) ## cat("\n ...... condnr: ", condnr, condnr-maxcond, "\n") 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) ## VT::11.08.2022: fix error "Found if() conditions comparing class() to string" ## if(class(out) != "try-error") { if(!is(out, "try-error")) { rho6pack[k] <- out$root ## cat("\nOK: ", k, out$root, "\n") }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 ## cat("\nNOT OK: ", k, irho, "\n") } } ## 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]) if(trace) { cat("\nSet rho as max of the rho_i obtained for each subset in previous step.") cat("\nrho, cutoffrho=", rho, cutoffrho, "\n") print(rho6pack) } 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.R0000644000176200001440000000413714443667016013255 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.R0000644000176200001440000005273714443667016012465 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.R0000644000176200001440000000704714443667016013312 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.R0000644000176200001440000003213714443667016013001 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.R0000644000176200001440000001005314443667016013774 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.R0000644000176200001440000011373014443667016013337 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 = missing(initHsets) || is.null(initHsets), 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.R0000644000176200001440000000540014443667016013465 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.R0000644000176200001440000001015614443667016012447 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.R0000644000176200001440000001627314443667016013130 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.R0000644000176200001440000001331314443667016012474 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.R0000644000176200001440000001266114443667016013135 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.R0000644000176200001440000001070014443667016014032 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.R0000644000176200001440000002154314443667016013350 0ustar liggesusers###### ## VT::03.08.2019 ## ## ## roxygen2::roxygenise("c:/Users/valen/OneDrive/MyRepo/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 #' Johns Hopkins University Ionosphere database. #' #' ''This radar data was collected by a system in Goose Bay, Labrador. This #' system consists of a phased array of 16 high-frequency antennas with a #' total transmitted power on the order of 6.4 kilowatts. The targets #' were free electrons in the ionosphere. #' "good" radar returns are those showing evidence of some type of structure #' in the ionosphere. "bad" returns are those that do not; their signals pass #' through the ionosphere. #' Received signals were processed using an autocorrelation function whose #' arguments are the time of a pulse and the pulse number. There were 17 #" pulse numbers for the Goose Bay system. Instances in this databse are #' described by 2 attributes per pulse number, corresponding to the complex #' values returned by the function resulting from the complex electromagnetic #' signal.'' [UCI archive] #' #' @name ionosphere #' @docType data #' @usage data(ionosphere) #' @format A data frame with 351 rows and 33 variables: 32 measurements and one #' (the last, \code{Class}) grouping variable: 225 \code{'good'} and 126 \code{'bad'}. #' #' The original dataset at UCI contains 351 rows and 35 columns. The first 34 #' columns are features, the last column contains the classification label of #' 'g' and 'b'. The first feature is binary and the second one is only 0s, #; therefore these two features were removed. We remain with 32 featres and #' one grouping variable - factor with labels 'good' and 'bad'. #' #' @source #' Source: Space Physics Group; Applied Physics Laboratory; Johns Hopkins University; Johns Hopkins Road; Laurel; MD 20723 #' #' Donor: Vince Sigillito (vgs@aplcen.apl.jhu.edu) #' #' The data have been taken from the UCI Repository Of Machine Learning Databases at #' \url{https://archive.ics.uci.edu/ml/datasets/ionosphere} #' #' This data set, with the original 34 features is available in the package \pkg{mlbench} #' and a different data set (refering to the same UCI repository) is available in #' the package \code{dprep} (archived on CRAN). #' @references #' Sigillito, V. G., Wing, S. P., Hutton, L. V., and Baker, K. B. (1989). #' Classification of radar returns from the ionosphere using neural #' networks. Johns Hopkins APL Technical Digest, 10, 262-266. #' @examples #' data(ionosphere) #' ionosphere[, 1:6] |> pairs() NULL rrcov/R/PcaGrid.R0000644000176200001440000000710514443667016013260 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.R0000644000176200001440000001143714443667016013754 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.R0000644000176200001440000005537114443667016014073 0ustar liggesusers###### ## VT::14.01.2020 ## ## ## roxygen2::roxygenise("C:/users/valen/onedrive/myrepo/R/rrcov", load_code=roxygen2:::load_installed) ## #' 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) ## VT::11.08.2022: fix error "Found if() conditions comparing class() to string" ## if(class(tryd) != "try-error") if(!is(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(vv)) # 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.R0000644000176200001440000000351114443667016013117 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.R0000644000176200001440000000767214443667016013270 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.R0000644000176200001440000000067614443667016013770 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.R0000644000176200001440000001052314443667016013122 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.R0000644000176200001440000006775314443667016013643 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.R0000644000176200001440000003034614443667016014021 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.R0000644000176200001440000000564214443667016012460 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.R0000644000176200001440000002621414443667016012710 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) || is.null(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.R0000644000176200001440000001636014443667016013151 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.R0000644000176200001440000002416514443667016013702 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, ...) { which <- match.arg(which) 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 ## VT::04.05.2023: no need to do this if the plot is one of the "xy" (lattice) ones - ## in these cases the computation of the classical distances will be done within ## the respective function md <- rd <- NULL if(!(which %in% c("xydistance", "xyqqchi2"))) { if(inherits(x, "CovMrcd")) { ccov <- CovMrcd(data, alpha=1) md <- sqrt(getDistance(ccov)) rd <- sqrt(getDistance(x)) } else { ccov <- CovClassic(data) if(!isSingular(ccov)) md <- sqrt(getDistance(ccov)) if(!isSingular(x)) rd <- sqrt(getDistance(x)) } } ## if(missing(id.n)) ## id.n <- if(is.null(rd)) 0 else length(which(rd > cutoff)) 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") { if(missing(id.n)) print(.xydistplot(x, cutoff=cutoff, ...)) # lattice: index plot of robust distances else print(.xydistplot(x, cutoff=cutoff, id.n=id.n, ...)) # 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") { if(missing(id.n)) print(.xyqqchi2(x, cutoff=cutoff, ...)) # lattice: qq-plot of the distances versus else print(.xyqqchi2(x, cutoff=cutoff, id.n=id.n, ...)) # 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.R0000644000176200001440000002422514443667016012711 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.R0000644000176200001440000000510714443667016013452 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.R0000644000176200001440000002022214443667016013437 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/MD50000644000176200001440000002721014556271701011727 0ustar liggesusersbca79e4668427f949830ddd1df5cb6b8 *ChangeLog 16c3ce6ed760b474acd989c1080b88cc *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 524ab2b39522a8c529215f4bd462d1e0 *R/CovMrcd.R e77a9543db99d9d22930bafdee807235 *R/CovMve.R e37a6bf70cfc6570731adafd7a6e8105 *R/CovOgk.R 2139b223e12ac1c84b817ebef15d4aa9 *R/CovRobust.R 574a90e594f83533862c70c3fb1e1ff9 *R/CovSde.R bdaacc4aee99b9de04d745d9359ac0e7 *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 d4a01f4cc961a3b9d004e33ce30278bb *R/adjoutlyingness.R 2dc89d15454adf96bdf3091bc436bf17 *R/covMest3.R 64fe6f0d948e281b7047b4921786b59c *R/da-utils.R bccda258b67c27e57829dc96cca292b7 *R/datadoc.R ee34aa24acbea965c1571f08b648e2e6 *R/detmrcd.R 447228792a324ed98198acf3d8f2bffb *R/dets.R 649f519e49932382f68de71ef9cbe6ba *R/donostah.R a249b8786c271572119eccda90cb4d0f *R/plot-utils.R 6731799ffde9689f52b53bd45a8273c2 *R/psibwt.R dcebffecd8cbf489cede75c6813eabed *R/psifun.R 3762b8071c38856c5fba22f1f17797f3 *R/transform.R bd6c4b899751d5a2e3c456fec562af91 *R/utils.R 5752f99eceda48e21d5743fe05c7c9b6 *R/zzz.R 733dbfee701f19827e32d56dfc2208b8 *README.md 181b5ac5a69bd3e3e542680739e88fd5 *build/partial.rdb 107e870ce5cb9675c0376db69266a6a0 *data/Appalachia.rda 19178f4568c1720dfe96eaaff472fb7d *data/Cars.rda a8563c9e6fd666df3141732de412473c *data/Cascades.rda 17a6013c19c48f79f7042f8abd047652 *data/OsloTransect.rda d18632bcec2af356a337eb0ca718fe4f *data/bus.rda cc53a66fcc84c8711001b93e42ab4052 *data/bushmiss.rda b62cf677891f77155845933398134746 *data/diabetes.rda a668256813809961630adcc43be80069 *data/fish.rda 0fbacfbfb75ab4e87fa10cc21f9d0a4c *data/fruit.rda b9fabfc8ba06eea5c797aced3bf3b333 *data/hemophilia.rda 4f651850376436a73dfde9469d7cb13b *data/ionosphere.rda 0577bc315526f332cd1469ed57598fdd *data/lmom32.rda df71e7480a1987eec1c7c09b10922b80 *data/lmom33.rda 125f4acc9c91b17f4506b0f8ef4006cd *data/machines.rda 6d99feb69a324a93c2cc72ea559827fa *data/maryo.rda e1afb2642636d64763b94655350c7caa *data/octane.rda 2ef2c9b77ea70069d6a48fa36510c973 *data/olitos.rda 61c22d7c21162ac77ec626520b61056f *data/pottery.rda ef11671a1a840d762546b224bafe9caf *data/rice.rda c8cb6a66a9164d10950b5d8a7106da66 *data/salmon.rda f3af61e3d8c83da5ebde10e2455adb10 *data/soil.rda a8bb6eb29fcb87b533ed10a6e7c0a914 *data/un86.rda 50aadfda23d26594bf423ac6e615b546 *data/wages.rda 2e1fae4aa3d659f0dfa188657fc1ce2c *data/wolves.rda 278f3e507b3bdf4849f2a0cde6289d5d *inst/Citation fb07d96da608c0c6b2ff577a4f53f03c *inst/NEWS.Rd 0cd7cf2b0f3e787248341b7eb7415973 *inst/doc/rrcov.R 58ccdfd29ee1d1c42b759226e480a68c *inst/doc/rrcov.Rnw 1b7a55086124fec4471a38dd0a4f9c57 *inst/doc/rrcov.pdf 0f5844b638361c83e2a90f4605d3c0a9 *inst/examples/bm/bm_lts.m ce8cc65f5ce8e9aedf1ac45c3f408022 *inst/examples/bm/bm_mcd.m 1cb5f88839eb05cd065e67c2c3415252 *inst/examples/bm/bmlts.S d5434aafe6a71ce65a76e5918a93a285 *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 86e971b493f5a520073d6cfe2740849e *man/Cars.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 c24bed4d64080da408cf15aae3bdba71 *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 7e05932e96ab650ca9aa90a66ab07823 *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 1c27285a11374f85a15263e9f2994803 *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 09f7148f83b100570fb857fcb555b90f *man/biplot.Rd a758ab85fb1d78002f8d73e1c9cf7b55 *man/bus.Rd d58dc6ce4cedaf8b7d01e975f31c2c17 *man/bushmiss.Rd e173a1c4b9a309cd285ddab43d056067 *man/covMest-deprecated.Rd 91d4309d9e5dea44a745e12c508c3e0b *man/diabetes.Rd 7d2eb1cde344729acf65313b4c7825f8 *man/estimate-methods.Rd ecc669659029d7112a7faa0d98c35565 *man/fish.Rd 046b6360e3f3e898093523bf259f8f0a *man/fruit.Rd 88285f8bf5c759de3cb014ee5ca89a45 *man/getCenter-methods.Rd 002c9b22248244f92d7cc3b0cc7d720e *man/getEllipse.Rd cd32b6c3686ec967354fc017a406626b *man/getLoadings-methods.Rd 19c9220469d7db644eb7f885179cdb41 *man/hemophilia.Rd 46d47cf91c356726633175b2b9edfc54 *man/ionosphere.Rd fc36c74e0a3682b4afe2840be79979b8 *man/isSingular.Rd db0e5e9ff9798192bf162c122f29ef33 *man/lmom32.Rd e95c14bf85f44bfb576e46b9f9a27a44 *man/lmom33.Rd 691462e2c566bef6c4bded7e0230340e *man/machines.Rd deb2edecbfed78502752bbf1dcd6bb5a *man/maryo.Rd 45853d13f16564752a3f1bb0c3c95c9a *man/octane.Rd 50f17a4ec856128af441627ea1661fc5 *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 91ba7fb3f3ff22dd0e655789f65ef6ca *man/rrcov-utils.Rd fe6e17df1f5d0e88e34643a97ed36809 *man/salmon.Rd 6d71ebe0454733f9a4d833f0493909b8 *man/scorePlot.Rd 7444d705777158155f3388c7d0e99bf1 *man/soil.Rd 8bd94e84fd2ff99d7d4f158feab1b324 *man/un86.Rd 4aba21bade7daced3ed3e4825cd6dc6d *man/wages.Rd 2c634fe5754b0a3d3a459edfe2a8ace1 *man/wolves.Rd 74b17745ec11d7cf47a08e77b52e9101 *src/Makevars eac4382f7dd2ec1ccf389af98314f557 *src/R-rng4ftn.c 46b3fa031d3b2d9a2df4fd3a87777443 *src/covOPW.c b2cae38d6ec19ed5dd70463c95f24712 *src/ds11.f c1e732bb49768c40a41f3d196ed921d2 *src/fast-mve.c e16860df529a72e3c8352fc335aec3b7 *src/fsada.f a3fdb50ee8aedfd14275e1cc871cf36a *src/rrcov_init.c ff85fbb3251f152021ad1adab2c37007 *src/sest.c 2b6ccf6cdeb6c31ab10e8da35b06c5bd *tests/thubert.R cdc1ecebd022c8e55233cd5a2a976af8 *tests/thubert.Rout.save d15b8520f3b8e1e2d220e1d87815d138 *tests/tlda.R 5c3f1deca87d3ad6f03e309428987cb4 *tests/tlda.Rout.save b438bcce32bc72667d5f353a77e32655 *tests/tldapp.R 439f62ef842f1025f2b8f1f98bb1be9d *tests/tldapp.Rout.save 81f8599fa2320b93acc1e48740f26f8b *tests/tmcd4.R 0c190e4e04ff9ff9f809e94551223552 *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 4d3cc1e7da9d5d47005a56c0e952bec1 *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/0000755000176200001440000000000014443667016012375 5ustar liggesusersrrcov/inst/examples/0000755000176200001440000000000014443667016014213 5ustar liggesusersrrcov/inst/examples/bm/0000755000176200001440000000000014443667016014611 5ustar liggesusersrrcov/inst/examples/bm/bmmcd.S0000644000176200001440000000636114443667016016025 0ustar liggesusers##### bmmcd ##### # 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", "mrcd", "detmcd")){ 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 if(method == "detmcd") CovMcd(X, nsamp="deterministic") else if(method == "mrcd") CovMrcd(X) 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.S0000644000176200001440000000612314443667016016060 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.m0000644000176200001440000000435614443667016016220 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.m0000644000176200001440000000507314443667016016254 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.R0000644000176200001440000000356114443667016016467 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.R0000644000176200001440000000430214443667016021247 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.R0000644000176200001440000000311214443667016016745 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/0000755000176200001440000000000014443667016013142 5ustar liggesusersrrcov/inst/doc/rrcov.R0000644000176200001440000003052314443667016014423 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.Rnw0000644000176200001440000033555714443667016015007 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.pdf0000644000176200001440000152224114443667016014777 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4527 /Filter /FlateDecode /N 88 /First 737 >> stream x\Ysܶ~_ԍ$RK8lYrkMI[MdKIwwvˮj$g 0<0sL %XS`Rڜy&5ŔU *,n*}ʹ0;ɤE :f{h( ܔhЎ T&eS*r*e9*b1TrhM䞈 S V( b$+tΡVrkXQqz[;?ͼr`ޠ>홷gF0FѸ9bZ\a2et\xQ0NH \(n+ ,1Ղ>+#v=YzPcQ3jJ5+C_X4'5c4 ZaL>8fV"QxFrGcMh#ƣf8l  a,!6 Z@I,4=΂-(ctrK j$9(tD9QfHL5҉׿?,h "1㯦ݸ-$=(XxU?ٷ߆*Ma~IWM؛zT7ʆ=_m|OrU+ك((!B*=)e7Uw.xӔgj0|ڏ_7u3jك>nfqW]L <$]5٨l j@EC5h:D65WɤhhK ^rb(z\O倏xC ^N錟ѿ%?3%~/8\E9c~'|P'Sk^Ӯ5_+2WMh4Q\#c Cˁ>t P oy[^V?my Oގ.Mͧ|:5ﲩ / CEL6 qVS ]|S꠆fK jhrs wNg% `֌o??B[hMMj~cn[Wѕ΍$qpZ%(S޲@, [QT7Qʪ"y/*b,.( kDD!>g/*yқ^- HY;*w¶BIJY%׿ՓA.zM-eP/x@srEXˌ3ѧ\v?OH@(.?AoLIjDfU@ Lnm'քɛoy ʱEX63*Jj[h0ly#|89"Xͥ: [9}4FR3a(i oH)zC lRBC'ft/ޤ"Ly+֊V }ᬋ]go[\>Xr!v"ˠ1l*&PKLoՈEM|v]ĸ|Haz]Q٤5$d,1!l:E`/2#t)̓!"d$݂^T=!^ MH鍔>HQrlBO͝Jj|֋uBɡ'#$@ǎQ5) }%:V&eXR&aJ; Bn@|_֋d=ZM!jKX4o?]0gю(w/^aoA}|ހ-XǶHYb]8x ֓zgR!^Tyl_㧵-nssf) -ݝ fjUUQT ߗ]@5:U@5ǐy`Us)u5.v7u5=wKLVaݔw18&&yS³Vm­ZumE,&u&װ7,0 _.,%vbi)M"I<z .b{,o{[YD& rigWҹ%0< `mbKoU}h"s{ȯQdh E dIJ0v;4S4Mti]}9{YXQUNen?]U[L$Y!3Z(e R}3 &:L/CqO23g"ɐ2k$iBIFd6~i hdM 0sO9}i{ 4y4u˦ F,,J42.$ i.∴aق}Y,3Jgjƀg"H>dZ2-(sO~zIAg" 5p7nC+ڞ$ f4Ј4c4mC5,EicIOS|Y|'\h}S@x,&Ȝ)yFzbr|fkr1p^ъZ|A.+~Q4I ii rO}u˻(x:~1{!,g\t7dJY7I6f7mÿ N D`((Նmॆ{kzA "Ӵ[nIMd!}дjEْ5#|tP !0ФoL.4`BӴOnVo4̫_L@󎩶/@p@R=QZ HwDuW끅,GDkJ^w=ȴnx%=d~;?Mg?-/+):WLUiD\aWWK0q ضmsav:wwE'V[LX ۵i7,,t[\Ϊ4Vmqk+)uS\E[Ω5[$Xb?$O^rєϨ5n叏ˮFgXJ(@~xF63]%F ëM8YݜW.tv1Gnȝ0{;Ⱦm J? hyE(L>VY.tgv8vV}}5K״ Eژ HcɸU;D"<>LiF;"Dj"HA}y(n!L^iSܥ 4O' "^ۙQ@+H%u0R["9yBu(r2B~ .qf}ꊀP<[q,O[^  0V~lE~O˓)-hՂ;b~> -lj|}kӹq{lwbWJf>`>ԞO0)-i+#tМqUMRGM}zZMAʦ wrFjw.P`}oHCai hoȟ p#Z2盵qvK߃w -߹rBD-gQ9+, O8Nw6UyQF‹ &$>djJloŮNQ[[QWfyVCDS1=? Xџc`2Z4׻>)gMEg ?!f>AUqZhU F,ڧ g e ?In@H_Ȼvr iuvV6Y,mf{},m-* GcLm8Y؞MtFf~ mEݾ'1зת7VU+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-08-12T22:38:38+02:00 2022-08-12T22:38:38+02: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 [<4ec963720efa33c493255dbc8320a829><5522dc310120810c543d2a25f170c0e5>] >> 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' (see mail from Kurt Hornik from 06.06.2023) \item tests/thubert.Rout.save, tlda.Rout.save, tmcd4.Rout.save, tqda.Rout.save: Follow up to changes in robustbase 0.99-0 } } } \section{CHANGES in rrcov VERSION 1.7-3 (2023-05-11)}{ \subsection{NEW FEATURES}{ \itemize{ \item data/ionosphere.rda - data set added } } \subsection{BUG FIXES}{ \itemize{ \item R/CovRobust, plot_utils: 'xyqqchi2' and 'xydistance' plots, fixed to use of parameter id.n } } } \section{CHANGES in rrcov VERSION 1.7-2 (2022-10-22)}{ \subsection{BUG FIXES}{ \itemize{ \item Fixed - warning: invalid UTF-8 in comment [-Winvalid-utf8] in src/rrcov_init.c } } } \section{CHANGES in rrcov VERSION 1.7-1 (2022-07-18)}{ \subsection{NEW FEATURES}{ \itemize{ \item NOTHING NEW YET } } \subsection{BUG FIXES}{ \itemize{ \item Fixed - maxcond passed to the low level functions \item Fixed errors "Found if() conditions comparing class() to string" in detmrcd.R and plot_utils.R \item Fixed NOTE "Found the following math rendering problems" in PcaHubert.Rd, see mail from Kurt Hornik from 11 August 2022 } } } \section{CHANGES in rrcov VERSION 1.7-0 (2022-04-25)}{ \subsection{NEW FEATURES}{ \itemize{ \item Fix for USE_FC_LEN_T becoming the default in 4.2.0 } } \subsection{BUG FIXES}{ \itemize{ \item Fortran warnings fixed in ds11.f and fsada.f } } } \section{CHANGES in rrcov VERSION 1.6-2 (2022-02-08)}{ \subsection{NEW FEATURES}{ \itemize{ \item Examples for PCA/adjustment for skewed data and PCA/percentage of explained variance added } } \subsection{BUG FIXES}{ \itemize{ \item minor differences in tests for PcaProj() on some platforms fixed \item scoreplot() corrected to show the labels of the samples } } } \section{CHANGES in rrcov VERSION 1.6-1 (2022-01-21)}{ \subsection{NEW FEATURES}{ \itemize{ \item Data set Fruit added: fruit.rda \item URLs in Rd files replaced by DOIs to fix for the migration of the www.jstatsoft.org to a new editorial system (see mail from Achim Zeileis from 06.10.2021) } } \subsection{BUG FIXES}{ \itemize{ \item 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. } } } \section{CHANGES in rrcov VERSION 1.6-0 (2021-08-27)}{ \subsection{NEW FEATURES}{ \itemize{ \item PcaHubert: option for adjusted outlyingness for skewed data added \item Data set Computer Hardware added: machines.rda \item Data set Wolves added: wolves.rda } } \subsection{BUG FIXES}{ \itemize{ \item Fixed some URLs, particularly the reference to javasoft.org } } } \section{CHANGES in rrcov VERSION 1.5-5 (2020-07-31)}{ \subsection{BUG FIXES}{ \itemize{ \item PcaHubert will crash if X is 1-dimensional and mcd=FALSE: fixed. \item Fixed 'noLD' issues in tlda.R and okg4.R \item Fixed a problem with wrong scores in PcaProj() (reported by Matthieu Lesnoff ) \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/Citation0000644000176200001440000000101514443667016014067 0ustar liggesuserscitHeader("To cite the package 'rrcov' in publications use:") bibentry(bibtype = "Article", title = "An Object-Oriented Framework for Robust Multivariate Analysis", journal = "Journal of Statistical Software", author = c(person(given = "Valentin", family = "Todorov"), person(given = "Peter", family = "Filzmoser")), year = "2009", volume = "32", number = "3", pages = "1--47", doi = "10.18637/jss.v032.i03" )