diptest/0000755000176200001440000000000014044221052011720 5ustar liggesusersdiptest/NAMESPACE0000644000176200001440000000052413761214237013154 0ustar liggesusersuseDynLib(diptest, .registration=TRUE)# <--> src/dip.c 2nd part importFrom("graphics", abline, axis, legend, lines, par, title) importFrom("stats", approx, complete.cases, ecdf, runif) export(dip) export(dip.test) ## export(aLine, getCM) S3method(print, dip) S3method(plot, dip) diptest/ChangeLog0000644000176200001440000001047313761214237013513 0ustar liggesusers2013-07-09 Martin Maechler * R/dipTest.R (rdRDS): rewrite (R <= 2.13.0) such that CRAN checks are happy. 2012-08-07 Martin Maechler * R/dipTest.R (dip.test): state 'alternative'. 2012-08-02 Martin Maechler * R/dipTest.R (rdRDS): utility to enable pre-R-2.13, also used in * data/qDiptab.R: 2012-04-17 Martin Maechler * DESCRIPTION (Version): 0.75-3, released to CRAN ... * R/dipTest.R (dip.test): more careful with approx() extrapolation. 2011-08-19 Martin Maechler * R/dip.R (plot.dip): cosmetic (to happify CRAN) 2011-08-10 Martin Maechler * inst/doc/diptest-issues.Rnw: at least now mention dip.test(). 2011-08-10 Martin Maechler * DESCRIPTION (Version): 0.75-1, released to CRAN today. * R/dipTest.R (dip.test): use readRDS() instead of data() in the function. 2011-05-25 Martin Maechler * R/dip.R (print.dip, plot.dip): show the extra GCM/LCM's. * man/plot.dip.Rd: document plot.dip() 2011-05-20 Martin Maechler * DESCRIPTION (Version): 0.75-0; not released, just sent to Nick Cox. 2011-05-19 Martin Maechler * R/dipTest.R (dip.test): finally add a dip.test(), with a P-value. 2011-05-17 Martin Maechler * NAMESPACE: start using * data/exHartigan.R: add deprecation message, and use statfaculty. * DESCRIPTION: hence drop 'Lazydata' for now. * man/statfaculty.Rd: also mention 'exHartigan' which is now deprecated. * R/dip.R (dip): new 'min.is.0' argument; store 'call' and return class "dip" when 'full.result' is true. Further, only return the finally effective parts of LCM & GCM. Allow 'debug' to be integer > 1, and support that in (print.dip, plot.dip): methods, notably the plot which draws the LCM and GCM. * src/dip.c (diptst): allow for more debug output; also return the lengths of 'gcm' and 'lcm'. 2011-05-15 Martin Maechler * DESCRIPTION (Version): 0.30-0 * src/dip.c (diptst): simplification: return 1/(2N) for N < 2 or all x[j] identical; instead of zero for N < 4 or all x[] identical. This finally makes dip(x1) == dip(x2) when x1 <- rep(1,n) and x2 <- c(0.999999999, rep(1, n-1)). 2011-05-14 Martin Maechler * inst/doc/diptest-issues.Rnw: finally look into computing P-values from the table. TODO: make into function 2010-08-11 Martin Maechler * DESCRIPTION (Version): 0.25-3 2008-12-22 Martin Maechler * man/dip.Rd: add note and link to qDiptab 2004-08-12 Martin Maechler * DESCRIPTION (Version): 0.25-1 * man/statfaculty.Rd: add missing "{" after "source" 2003-12-03 Martin Maechler * man/qDiptab.Rd: names(dimnames) in example 2003-11-29 Martin Maechler * DESCRIPTION (Date): --> for release * man/qDiptab.Rd: one million simulations! * data/qDiptab.rda: new data from simulation with symmetry fix; the dimnames are now named 'n' and 'Pr'. * man/dip.Rd: describe bug fix 2003-11-13 Martin Maechler * DESCRIPTION (Version): 0.25-0 2003-10-31 Martin Maechler * src/dip.c (diptst): o symmetry fix by Yong Lu -- changes results! (now <= 0.25 !) ================ o speedup by myself: not dividing by N but at the end; o return 2-index into x, instead of (xl,xu) * R/dip.R (dip): new .C() interface * tests/mechler-ex.R: the two examples from Ferenc Mechler's Statlib readme file (on his "fix" to the diptst fortran code). * man/dip.Rd: describe full return list (for full.result = T) 2003-07-14 Martin Maechler * man/qDiptab.Rd: "large" scale simulation * data/qDiptab.rda: table of quantiles 2003-07-11 Martin Maechler * tests/ex1.R: added testing examples; 3 data sets * tests/sim1.R: small simulation (~ as Hartigan) 2001-01-01 Martin Mchler * DESCRIPTION (Version): 0.9-1 added `Maintainer' field diptest/.Rinstignore0000644000176200001440000000004113761214237014233 0ustar liggesusersinst/doc/Makefile inst/doc/.*sty diptest/README.md0000644000176200001440000000157013761214237013216 0ustar liggesusers# diptest ## R CRAN package `diptest`: Hartigan's diptest for unimodality (including p-values) Although this package `diptest` has been created a long time ago, with a first CRAN publication in 2003, see the official page of [CRAN package diptest](https://CRAN.R-project.org/package=diptest), the package *development* sources and history have only been made available on Nov.30, 2020. As with my R package [sfsmisc](https://github.com/mmaechler/sfsmisc), I was able to keep most of the editing and development _history_ of this package, using my [emacs](https://www.gnu.org/software/emacs/) backup files (`*.~`) together with some RCS (`*,v`) histories, using my `G2RCSn` shell script, and most importantly a `ruby` script to create a git repos including history, see here, for how it worked with `sfsmisc`: https://mmaechler.blogspot.com/2014/08/how-i-got-175-years-old-github.html diptest/data/0000755000176200001440000000000013761214237012645 5ustar liggesusersdiptest/data/statfaculty.R0000644000176200001440000000033413761214237015333 0ustar liggesusersstatfaculty <- c(30,33,35,36,37,37,39,39,39,39,39,40,40,40,40,41,42,43,43,43,44,44,45,45,46, 46,47,47,48,48,48,49,50,50,51,52,52,53,53,53,53,53,54,54,57,57,59,60,60,60, 61,61,61,61,62,62,62,62,63,66,70,72,72) diptest/data/qDiptab.R0000644000176200001440000000006713761214237014357 0ustar liggesusersqDiptab <- diptest:::rdRDS("extraData", "qDiptab.rds") diptest/data/exHartigan.R0000644000176200001440000000025713761214237015066 0ustar liggesusersmessage("'exHartigan' data is identical to 'statfaculty' and hence deprecated.", "\n Use the 'statfaculty' instead") source("statfaculty.R") exHartigan <- statfaculty diptest/man/0000755000176200001440000000000013761214237012507 5ustar liggesusersdiptest/man/statfaculty.Rd0000644000176200001440000000176013761214237015345 0ustar liggesusers\name{statfaculty} \alias{statfaculty} %- uncomment, once exHartigan is defunct: %- \alias{exHartigan} \title{Faculty Quality in Statistics Departments} \docType{data} \usage{ data(statfaculty) } \description{ Faculty quality in statistics departments was assessed as part of a larger study reported by Scully(1982). Accidentally, this is also provided as the \code{exHartigan} (\dQuote{\bold{ex}ample of \bold{Hartigan}s'}) data set. } \format{A numeric vector of 63 (integer) numbers, sorted increasingly, as reported by the reference. } \references{ J. A. Hartigan and P. M. Hartigan (1985) The Dip Test of Unimodality; \emph{Annals of Statistics} \bold{13}, 70--84. } \source{ M. G. Scully (1982) Evaluation of 596 programs in mathematics and physical sciences; \emph{Chronicle Higher Educ.} \bold{25} 5, 8--10. } \examples{ data(statfaculty) plot(dH <- density(statfaculty)) rug(jitter(statfaculty)) data(exHartigan) stopifnot(identical(exHartigan,statfaculty)) } \keyword{datasets} diptest/man/dip.test.Rd0000644000176200001440000000461513761214237014536 0ustar liggesusers\name{dip.test} \title{Hartigans' Dip Test for Unimodality} \alias{dip.test} \concept{multimodality} \description{ Compute Hartigans' dip statistic \eqn{D_n}{Dn}, and its p-value for the test for unimodality, by interpolating tabulated quantiles of \eqn{\sqrt{n} D_n}{sqrt(n) * Dn}. For \eqn{X_i \sim F, i.i.d.}{X_i ~ F, i.i.d}, the null hypothesis is that \eqn{F} is a unimodal distribution. Consequently, the test alternative is non-unimodal, i.e., at least bimodal. Using the language of medical testing, you would call the test \dQuote{Test for \bold{Multi}modality}. } \usage{ dip.test(x, simulate.p.value = FALSE, B = 2000) } \arguments{ \item{x}{numeric vector; sample to be tested for unimodality.} \item{simulate.p.value}{a logical indicating whether to compute p-values by Monte Carlo simulation.} \item{B}{an integer specifying the number of replicates used in the Monte Carlo test.} } \details{ If \code{simulate.p.value} is \code{FALSE}, the p-value is computed via linear interpolation (of \eqn{\sqrt{n} D_n}{sqrt(n) * Dn}) in the \code{\link{qDiptab}} table. Otherwise the p-value is computed from a Monte Carlo simulation of a uniform distribution (\code{\link{runif}(n)}) with \code{B} replicates. } \value{ A list with class \code{"htest"} containing the following components: \item{statistic}{the dip statistic \eqn{D_n}{Dn}, i.e., \code{\link{dip}(x)}.} \item{p.value}{the p-value for the test, see details.} \item{method}{character string describing the test, and whether Monte Carlo simulation was used.} \item{data.name}{a character string giving the name(s) of the data.} } \seealso{ For goodness-of-fit testing, notably of continuous distributions, \code{\link{ks.test}}. } \references{ see those in \code{\link{dip}}. } \author{Martin Maechler} \note{ see also the package vignette, which describes the procedure in more details. } \examples{ ## a first non-trivial case (d.t <- dip.test(c(0,0, 1,1))) # "perfect bi-modal for n=4" --> p-value = 0 stopifnot(d.t$p.value == 0) data(statfaculty) plot(density(statfaculty)); rug(statfaculty) (d.t <- dip.test(statfaculty)) x <- c(rnorm(50), rnorm(50) + 3) plot(density(x)); rug(x) ## border-line bi-modal ... BUT (most of the times) not significantly: dip.test(x) dip.test(x, simulate=TRUE, B=5000) ## really large n -- get a message dip.test(runif(4e5)) } \keyword{htest} \keyword{distribution} diptest/man/dip.Rd0000644000176200001440000001364313761214237013561 0ustar liggesusers\name{dip} \alias{dip} \title{Compute Hartigans' Dip Test Statistic for Unimodality} \concept{multimodality} \description{ Computes Hartigans' dip test statistic for testing unimodality, and additionally the modal interval. } \usage{ dip(x, full.result = FALSE, min.is.0 = FALSE, debug = FALSE) } \arguments{ \item{x}{numeric; the data.} \item{full.result}{logical or string; \code{dip(., full.result=TRUE)} returns the full result list; if \code{"all"} it additionally uses the \code{mn} and \code{mj} components to compute the initial GCM and LCM, see below.} \item{min.is.0}{logical indicating if the \bold{min}imal value of the dip statistic \eqn{D_n}{Dn} can be zero or not. Arguably should be set to \code{TRUE} for internal consistency reasons, but is false by default both for continuity and backwards compatibility reasons, see the examples below.} % backcompatibility both with earlier % versions of the \pkg{diptest} package, and with Hartigan's original % implementation.} \item{debug}{logical; if true, some tracing information is printed (from the C routine).} } \value{ depending on \code{full.result} either a number, the dip statistic, or an object of class \code{"dip"} which is a \code{\link{list}} with components \item{x}{the sorted \code{\link{unname}()}d data.} \item{n}{\code{length(x)}.} \item{dip}{the dip statistic} \item{lo.hi}{indices into \code{x} for lower and higher end of modal interval} \item{xl, xu}{lower and upper end of modal interval} \item{gcm, lcm}{(last used) indices for \bold{g}reatest \bold{c}onvex \bold{m}inorant and the \bold{l}east \bold{c}oncave \bold{m}ajorant.} \item{mn, mj}{index vectors of length \code{n} for the GC minorant and the LC majorant respectively.} For \dQuote{full} results of class \code{"dip"}, there are \code{\link{print}} and \code{\link{plot}} methods, the latter with its own \link[=plot.dip]{manual page}. } \note{ For \eqn{n \le 3}{n <= 3} where \code{n <- length(x)}, the dip statistic \eqn{D_n}{Dn} is always the same minimum value, \eqn{1/(2n)}, i.e., there's no possible dip test. Note that up to May 2011, from Hartigan's original Fortran code, \code{Dn} was set to zero, when all \code{x} values were identical. However, this entailed discontinuous behavior, where for arbitrarily close data \eqn{\tilde x}{x~}, \eqn{D_n(\tilde x) = \frac 1{2n}}{Dn(x~) = 1/(2n)}. Yong Lu \email{lyongu+@cs.cmu.edu} found in Oct 2003 that the code was not giving symmetric results for mirrored data (and was giving results of almost 1, and then found the reason, a misplaced \samp{")"} in the original Fortran code. This bug has been corrected for diptest version 0.25-0 (Feb 13, 2004). Nick Cox (Durham Univ.) said (on March 20, 2008 on the Stata-list):\cr As it comes from a bimodal husband-wife collaboration, the name perhaps should be \emph{\dQuote{Hartigan-Hartigan dip test}}, but that does not seem to have caught on. Some of my less statistical colleagues would sniff out the hegemony of patriarchy there, although which Hartigan is being overlooked is not clear. Martin Maechler, as a Swiss, and politician, would say:\cr Let's find a compromise, and call it \emph{\dQuote{Hartigans' dip test}}, so we only have to adapt orthography (:-). } \references{ P. M. Hartigan (1985) Computation of the Dip Statistic to Test for Unimodality; \emph{Applied Statistics (JRSS C)} \bold{34}, 320--325.\cr Corresponding (buggy!) Fortran code of \sQuote{AS 217} available from Statlib, \url{http://lib.stat.cmu.edu/apstat/217} J. A. Hartigan and P. M. Hartigan (1985) The Dip Test of Unimodality; \emph{Annals of Statistics} \bold{13}, 70--84. } \author{Martin Maechler \email{maechler@stat.math.ethz.ch}, 1994, based on S (S-PLUS) and C code donated from Dario Ringach \email{dario@wotan.cns.nyu.edu} who had applied \command{f2c} on the original Fortran code available from Statlib. In Aug.1993, recreated and improved Hartigans' "P-value" table, which later became \code{\link{qDiptab}}. } \seealso{ \code{\link{dip.test}} to compute the dip \emph{and} perform the unimodality test, based on P-values, interpolated from \code{\link{qDiptab}}; \code{\link{isoreg}} for isotonic regression. } \examples{ data(statfaculty) plot(density(statfaculty)) rug(statfaculty, col="midnight blue"); abline(h=0, col="gray") dip(statfaculty) (dS <- dip(statfaculty, full = TRUE, debug = TRUE)) plot(dS) ## even more output -- + plot showing "global" GCM/LCM: (dS2 <- dip(statfaculty, full = "all", debug = 3)) plot(dS2) data(faithful) fE <- faithful$eruptions plot(density(fE)) rug(fE, col="midnight blue"); abline(h=0, col="gray") dip(fE, debug = 2) ## showing internal work (dE <- dip(fE, full = TRUE)) ## note the print method plot(dE, do.points=FALSE) data(precip) plot(density(precip)) rug(precip, col="midnight blue"); abline(h=0, col="gray") str(dip(precip, full = TRUE, debug = TRUE)) ##----------------- The 'min.is.0' option : --------------------- ##' dip(.) continuity and 'min.is.0' exploration: dd <- function(x, debug=FALSE) { x_ <- x ; x_[1] <- 0.9999999999 * x[1] rbind(dip(x , debug=debug), dip(x_, debug=debug), dip(x , min.is.0=TRUE, debug=debug), dip(x_, min.is.0=TRUE, debug=debug), deparse.level=2) } dd( rep(1, 8) ) # the 3rd one differs ==> min.is.0=TRUE is *dis*continuous dd( 1:7 ) # ditto dd( 1:7, debug=TRUE) ## border-line case .. dd( 1:2, debug=TRUE) ## Demonstrate that 'min.is.0 = TRUE' does not change the typical result: B.sim <- 1000 # or larger D5 <- {set.seed(1); replicate(B.sim, dip(runif(5)))} D5. <- {set.seed(1); replicate(B.sim, dip(runif(5), min.is.0=TRUE))} stopifnot(identical(D5, D5.), all.equal(min(D5), 1/(2*5))) hist(D5, 64); rug(D5) D8 <- {set.seed(7); replicate(B.sim, dip(runif(8)))} D8. <- {set.seed(7); replicate(B.sim, dip(runif(8), min.is.0=TRUE))} stopifnot(identical(D8, D8.)) } \keyword{htest} \keyword{distribution} diptest/man/exHartigan.Rd0000644000176200001440000000055113761214237015071 0ustar liggesusers\name{exHartigan} \alias{exHartigan} \title{Hartigan's Artificial n-modal Example Data Set} \description{ 63 (integer) numbers; unimodal or bimodal, that's the question. This is now \emph{deprecated}. Please use \code{\link{statfaculty}} instead! } \examples{ data(exHartigan) plot(dH <- density(exHartigan)) rug(exHartigan)# should jitter } \keyword{data} diptest/man/plot.dip.Rd0000644000176200001440000000303013761214237014523 0ustar liggesusers\name{plot.dip} \alias{plot.dip} \title{Plot a dip() Result, i.e., Class "dip" Object} \description{ Plot method for \code{"dip"} objects, i.e., the result of \code{\link{dip}(., full.result=TRUE)} or similar. Note: We may decide to enhance the plot in the future, possibly not entirely back-compatibly. } \usage{ \method{plot}{dip}(x, do.points = (n < 20), colG = "red3", colL = "blue3", colM = "forest green", col.points = par("col"), col.hor = col.points, doModal = TRUE, doLegend = TRUE, \dots) } \arguments{ \item{x}{an \R object of \code{\link{class}} \code{"dip"}, i.e., typically the result of \code{\link{dip}(., full.result= FF)} where \code{FF} is \code{TRUE} or a string such as \code{"all"}.} \item{do.points}{logical indicating if the ECDF plot should include points; passed to \code{\link{plot.ecdf}}.} \item{colG, colL, colM}{the colors to be used in the graphics for the \bold{G}reatest convex minorant, the \bold{L}east concave majorant, and the \bold{M}odal interval, respectively.} \item{col.points, col.hor}{the color of points or horizontal lines, respectively, simply passed to \code{\link{plot.ecdf}}.} \item{doModal}{logical indicating if the modal interval \eqn{[x_L, x_U]}{[xL, xU]} should be shown.} \item{doLegend}{logical indicating if a legend should be shown.} \item{\dots}{further optional arguments, passed to \code{\link{plot.ecdf}}.} } \author{Martin Maechler} \seealso{ \code{\link{dip}}, also for examples; \code{\link{plot.ecdf}}. } \keyword{hplot} diptest/man/qDiptab.Rd0000644000176200001440000000343513761214237014367 0ustar liggesusers\name{qDiptab} \alias{qDiptab} \title{Table of Quantiles from a Large Simulation for Hartigan's Dip Test} \docType{data} \description{ Whereas Hartigan(1985) published a table of empirical percentage points of the dip statistic (see \code{\link{dip}}) based on N=9999 samples of size \eqn{n} from \eqn{U[0,1]}, our table of empirical quantiles is currently based on N=1'000'001 samples for each \eqn{n}. } \note{ Taking N=1'000'001 ensures that all the \code{\link{quantile}(X, p)} used here are exactly order statistics \code{sort(X)[k]}. } \format{ A numeric matrix %may change: of dimension 17 * 26, where each row corresponds to sample size \eqn{n}, and each column to a probability (percentage) in \eqn{[0,1]}. The dimnames are named \code{n} and \code{Pr} and coercable to these values, see the examples. \code{attr(qDiptab, "N_1")} is \eqn{N - 1}, such that with \code{k <- as.numeric(dimnames(qDiptab)$Pr) * attr(qDiptab, "N_1")}, e.g., \code{qDiptab[n == 15,]} contains exactly the order statistics \eqn{D_{[k]}} (from the \eqn{N+1} simulated values of \code{\link{dip}(U)}, where \code{U <- runif(15)}. } \seealso{\code{\link{dip}}, also for the references; \code{\link{dip.test}()} which performs the hypothesis test, using \code{qDtiptab} (and its null hypothesis of a uniform distribution). } \author{Martin Maechler \email{maechler@stat.math.ethz.ch}, in its earliest form in August 1994. } \examples{ data(qDiptab) str(qDiptab) ## the sample sizes `n' : dnqd <- dimnames(qDiptab) (nn <- as.integer(dnqd $n)) ## the probabilities: P.p <- as.numeric(print(dnqd $ Pr)) ## This is as "Table 1" in Hartigan & Hartigan (1985) -- but more accurate ps <- c(1,5,10,50,90,95,99, 99.5, 99.9)/100 tab1 <- qDiptab[nn <= 200, as.character(ps)] round(tab1, 4) } \keyword{datasets} diptest/TODO0000644000176200001440000000112114044171400012404 0ustar liggesuserso The vignette inst/doc/diptest-issues.Rnw has mentioned the "new" (May 2011) dip.test() function; Still have not finalized *analyzing* the simulations in ./stuff/ o Consider an analogue qnormDiptab which is constructed using rnorm(.) instead of runif(.) simulations <--> This idea is old; Werner Stuetzle's student, Jeremy Tantrum, did things in this direction in 2003; see, stuff/jeremy-unimodality.R would be nice: o Visualize the l.c.m. and g.c.m. and the modal interval ! g.c.m = greatest convex minorant =: G(x) l.c.m = least concave majorant =: H(x) diptest/DESCRIPTION0000644000176200001440000000141414044221052013426 0ustar liggesusersPackage: diptest Version: 0.76-0 VersionNote: Last CRAN: 0.75-7 on 2015-06-07 Date: 2021-05-04 Maintainer: Martin Maechler Author: Martin Maechler (originally from Fortran and S-plus by Dario Ringach, NYU.edu) Title: Hartigan's Dip Test Statistic for Unimodality - Corrected Description: Compute Hartigan's dip test statistic for unimodality / multimodality and provide a test with simulation based p-values, where the original public code has been corrected. Imports: graphics, stats BuildResaveData: no BugReports: https://github.com/mmaechler/diptest/issues License: GPL (>= 2) URL: https://github.com/mmaechler/diptest NeedsCompilation: yes Packaged: 2021-05-04 07:09:15 UTC; maechler Repository: CRAN Date/Publication: 2021-05-04 10:30:02 UTC diptest/build/0000755000176200001440000000000014044171433013026 5ustar liggesusersdiptest/build/vignette.rds0000644000176200001440000000036714044171433015373 0ustar liggesusersMn0'$@>d6`Fږ4eɁ $ Z6Tj:̠a*d[wsouv3U0銃6UpO xvt}Sdiptest/tests/0000755000176200001440000000000014044171433013071 5ustar liggesusersdiptest/tests/sim1.Rout.save0000644000176200001440000000600713761214237015562 0ustar liggesusers R Under development (unstable) (2015-03-03 r67931) -- "Unsuffered Consequences" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > #### Very small scale simulation to make the point > #### --> See ../stuff/ for much more > library(diptest) > > P.p <- c(1, 5, 10, 25)/100 > (P.p <- c(P.p, 1/2, rev(1 - P.p))) [1] 0.01 0.05 0.10 0.25 0.50 0.75 0.90 0.95 0.99 > > N.sim <- 9999 > set.seed(94) > .p0 <- proc.time() > dU100 <- replicate(N.sim, dip(runif(100))) > cat('Time elapsed: ', (p1 <- proc.time()) - .p0,'\n'); .p0 <- p1 Time elapsed: 0.512 0.085 0.597 0 0 > ## Lynne (2003: P IV, 1.6 GHz): ~7 s > ## 2010 (AMD Phenom II X4 925): 1.3 s > > 100 * round(q100 <- quantile(dU100, p = P.p), 4) 1% 5% 10% 25% 50% 75% 90% 95% 99% 2.29 2.56 2.75 3.08 3.54 4.12 4.70 5.09 5.90 > > plot(density(sqrt(100) * dU100), lwd = 2, col=2, + main = expression("Dip distribution" ~~ + list(sqrt(n)* D[n], ~ n == 100))) > abline(h=0, col="dark gray", lty=3) > > round(1e4 * quantile(dU100, p = seq(0,1, by = 0.01), names = FALSE)) [1] 191 229 239 246 252 256 261 265 268 272 275 277 280 282 285 287 289 292 [19] 294 296 298 300 302 304 305 308 310 312 314 315 317 319 321 323 325 327 [37] 329 331 332 334 336 338 340 341 343 345 347 349 351 352 354 356 358 360 [55] 362 364 366 368 370 372 374 376 379 381 383 385 387 390 393 395 397 400 [73] 403 406 409 412 415 418 421 424 427 431 434 438 442 446 450 455 460 464 [91] 470 476 483 489 499 509 520 539 562 590 773 > > ##--- an extreme unimodal case -- i.e. very small dip(): > set.seed(60); x <- rexp(301,1)^3 > hist(x) > (dt.x <- dip.test(x)) Hartigans' dip test for unimodality / multimodality data: x D = 0.0072617, p-value = 1 alternative hypothesis: non-unimodal, i.e., at least bimodal > (dt2 <- dip.test(x, simulate = TRUE)) Hartigans' dip test for unimodality / multimodality with simulated p-value (based on 2000 replicates) data: x D = 0.0072617, p-value = 1 alternative hypothesis: non-unimodal, i.e., at least bimodal > (dt3 <- dip.test(x, simulate = TRUE, B = 10000)) Hartigans' dip test for unimodality / multimodality with simulated p-value (based on 10000 replicates) data: x D = 0.0072617, p-value = 1 alternative hypothesis: non-unimodal, i.e., at least bimodal > stopifnot(dt.x$p.value == 1,## <- gave NA earlier + dt2$p.value == 1, + dt3$p.value == 1) > > > cat('Time elapsed: ', proc.time() - .p0,'\n') # "stats" Time elapsed: 1.136 0.018 1.158 0 0 > > proc.time() user system elapsed 1.765 0.129 1.935 diptest/tests/mechler-ex.Rout.save0000644000176200001440000001055713761214237016747 0ustar liggesusers R version 2.13.1 Patched (2011-08-09 r56694) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: x86_64-unknown-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(diptest) > ## These are from > ## the 217-readme.doc file that explains the bug fixed by > ## Ferenc Mechler (fmechler@med.cornell.edu). [5/Sep/2002] > ## > ex1 <- c(0.0198, 0.0198, 0.1961, 0.2898, 0.3184, 0.3687, + 0.4336, 0.4987, 0.5661, 0.6530, 0.7476, 0.8555) > > ex2 <- c(0.0198, 0.1961, 0.2898, 0.3184, 0.3687, 0.4336, + 0.4987, 0.5661, 0.6530, 0.7476, 0.8555, 0.9912) > > ## Multiply them by 10000 here: > > (D1 <- dip(10000*ex1, full=TRUE, debug=2)) dip() in C: n = 12; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 12]; l_lcm/gcm = ( 6, 3) while(gcm[ix] != lcm[iv]) : L(3,2) --> ix = 2, iv = 3 G(2,3) --> ix = 1, iv = 3 --> ix = 1, iv = 4 --> ix = 1, iv = 5 --> ix = 1, iv = 6 calculating dip .. (dip_l, dip_u) = (2, 1) -> new larger dip 2 (j_best = 2) 'dip': LOOP-BEGIN: 2n*D= 2 [low,high] = [ 4, 9]; l_lcm/gcm = ( 6, 2) while(gcm[ix] != lcm[iv]) : L(2,2) --> ix = 1, iv = 3 L(2,3) --> ix = 1, iv = 4 --> ix = 1, iv = 5 --> ix = 1, iv = 6 Call: dip(x = 10000 * ex1, full.result = TRUE, debug = 2) n = 12. Dip statistic, D_n = 0.08333333 = 2/(2n) Modal interval [xL, xU] = [x[4], x[9]] = [2898, 5661] GCM and LCM have 2 and 6 nodes inside [xL, xU], respectively. > str(D1, digits = 10, vec.len = 12) List of 15 $ call : language dip(x = 10000 * ex1, full.result = TRUE, debug = 2) $ x : num [1:12] 198 198 1961 2898 3184 3687 4336 4987 5661 6530 7476 8555 $ n : int 12 $ dip : num 0.08333333333 $ lo.hi : int [1:2] 4 9 $ ifault : int 0 $ gcm : int [1:2] 9 4 $ lcm : int [1:6] 4 5 6 7 8 9 $ mn : int [1:12] 1 1 1 1 4 4 4 4 4 4 4 4 $ mj : int [1:12] 2 9 6 5 6 7 8 9 10 11 12 12 $ min.is.0 : logi FALSE $ debug : int 2 $ xl : num 2898 $ xu : num 5661 $ full.result: logi TRUE - attr(*, "class")= chr "dip" > > (D2 <- dip(10000*ex2, full=TRUE, debug=2)) dip() in C: n = 12; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 12]; l_lcm/gcm = ( 6, 4) while(gcm[ix] != lcm[iv]) : G(3,2) --> ix = 2, iv = 2 G(2,2) --> ix = 1, iv = 2 --> ix = 1, iv = 3 --> ix = 1, iv = 4 --> ix = 1, iv = 5 --> ix = 1, iv = 6 calculating dip .. (dip_l, dip_u) = (1, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 3, 8]; l_lcm/gcm = ( 6, 2) while(gcm[ix] != lcm[iv]) : L(2,2) --> ix = 1, iv = 3 L(2,3) --> ix = 1, iv = 4 --> ix = 1, iv = 5 --> ix = 1, iv = 6 calculating dip .. (dip_l, dip_u) = (0, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 3, 5]; l_lcm/gcm = ( 3, 2) while(gcm[ix] != lcm[iv]) : L(2,2) --> ix = 1, iv = 3 calculating dip .. (dip_l, dip_u) = (0, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 3, 4]; l_lcm/gcm = ( 2, 2) ** (l_lcm,l_gcm) = (2,2) ==> d := 1 calculating dip .. (dip_l, dip_u) = (0, 0) No improvement in low = 3 nor high = 4 --> END Call: dip(x = 10000 * ex2, full.result = TRUE, debug = 2) n = 12. Dip statistic, D_n = 0.04166667 = 1/(2n) Modal interval [xL, xU] = [x[3], x[4]] = [2898, 3184] GCM and LCM have 2 and 2 nodes inside [xL, xU], respectively. > str(D2, digits = 10, vec.len = 12) List of 15 $ call : language dip(x = 10000 * ex2, full.result = TRUE, debug = 2) $ x : num [1:12] 198 1961 2898 3184 3687 4336 4987 5661 6530 7476 8555 9912 $ n : int 12 $ dip : num 0.04166666667 $ lo.hi : int [1:2] 3 4 $ ifault : int 0 $ gcm : int [1:2] 4 3 $ lcm : int [1:2] 3 4 $ mn : int [1:12] 1 1 2 3 3 3 3 3 3 3 3 3 $ mj : int [1:12] 8 5 4 5 6 7 8 9 10 11 12 12 $ min.is.0 : logi FALSE $ debug : int 2 $ xl : num 2898 $ xu : num 3184 $ full.result: logi TRUE - attr(*, "class")= chr "dip" > diptest/tests/ex1.Rout.save0000644000176200001440000002502513761214237015407 0ustar liggesusers R version 4.0.3 Patched (2020-11-18 r79442) -- "Bunny-Wunnies Freak Out" Copyright (C) 2020 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(diptest) > > stopifnot(dip(c(1,1,2,2)) == 1/4)# the maximal value possible: two point dist > > ## very first small "unimodal" example --- the 1/(2*n) result: > n <- length(u <- cumsum(0:3)) > d <- dip(u, debug=TRUE)# shows the final if() {added by MM} is really needed dip() in C: n = 4; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 4]; l_lcm/gcm = ( 4, 2) while(gcm[ix] != lcm[iv]) : .. calculating dip .. (dip_l, dip_u) = (0, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 3]; l_lcm/gcm = ( 3, 2) while(gcm[ix] != lcm[iv]) : . calculating dip .. (dip_l, dip_u) = (0, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 2]; l_lcm/gcm = ( 2, 2) ** (l_lcm,l_gcm) = (2,2) ==> d := 1 calculating dip .. (dip_l, dip_u) = (0, 0) No improvement in low = 1 nor high = 2 --> END > stopifnot(d == dip(-u), d == 1/(2*n))# exact "=" for n = 4 ! > ## Note that I believe this should *not* give 0 (as fmechler@.. did), > ## but rather 1/(2n) because that's (1/n) / 2 and > ## (1/n) is the correct distance between LCM and GCM > > ## Small example -- but MM sees difference (32-bit / 64-bit): > x <- c(0,2:3,5:6) > d1 <- dip(x, full=TRUE, debug=2) dip() in C: n = 5; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 5]; l_lcm/gcm = ( 2, 4) while(gcm[ix] != lcm[iv]) : G(3,2) --> ix = 2, iv = 2 --> ix = 1, iv = 2 calculating dip .. (dip_l, dip_u) = (1, 0) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 2, 5]; l_lcm/gcm = ( 3, 3) while(gcm[ix] != lcm[iv]) : L(3,2) --> ix = 2, iv = 3 G(2,3) --> ix = 1, iv = 3 calculating dip .. (dip_l, dip_u) = (1.33333, 0) -> new larger dip 1.33333 (j_best = 3) 'dip': LOOP-BEGIN: 2n*D= 1.3333 [low,high] = [ 4, 5]; l_lcm/gcm = ( 2, 2) ** (l_lcm,l_gcm) = (2,2) ==> d := 1 > d2 <- dip(6-x, full=TRUE, debug=2) dip() in C: n = 5; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 5]; l_lcm/gcm = ( 4, 2) while(gcm[ix] != lcm[iv]) : L(2,2) --> ix = 1, iv = 3 L(2,3) --> ix = 1, iv = 4 calculating dip .. (dip_l, dip_u) = (0, 1) 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 4]; l_lcm/gcm = ( 3, 3) while(gcm[ix] != lcm[iv]) : L(3,2) --> ix = 2, iv = 3 G(2,3) --> ix = 1, iv = 3 calculating dip .. (dip_l, dip_u) = (1.33333, 0) -> new larger dip 1.33333 (j_best = 2) 'dip': LOOP-BEGIN: 2n*D= 1.3333 [low,high] = [ 3, 4]; l_lcm/gcm = ( 2, 2) ** (l_lcm,l_gcm) = (2,2) ==> d := 1 > str(d1) List of 15 $ call : language dip(x = x, full.result = TRUE, debug = 2) $ x : num [1:5] 0 2 3 5 6 $ n : int 5 $ dip : num 0.133 $ lo.hi : int [1:2] 4 5 $ ifault : int 0 $ gcm : int [1:2] 5 4 $ lcm : int [1:2] 4 5 $ mn : int [1:5] 1 1 2 2 4 $ mj : int [1:5] 5 3 5 5 5 $ min.is.0 : logi FALSE $ debug : int 2 $ xl : num 5 $ xu : num 6 $ full.result: logi TRUE - attr(*, "class")= chr "dip" > str(d2) List of 15 $ call : language dip(x = 6 - x, full.result = TRUE, debug = 2) $ x : num [1:5] 0 1 3 4 6 $ n : int 5 $ dip : num 0.133 $ lo.hi : int [1:2] 3 4 $ ifault : int 0 $ gcm : int [1:2] 4 3 $ lcm : int [1:2] 3 4 $ mn : int [1:5] 1 1 1 3 1 $ mj : int [1:5] 2 4 4 5 5 $ min.is.0 : logi FALSE $ debug : int 2 $ xl : num 3 $ xu : num 4 $ full.result: logi TRUE - attr(*, "class")= chr "dip" > > if(!dev.interactive(orNone=TRUE)) pdf("ex1.pdf") > par(mfrow = 2:1, mar = .1+c(3,4,2,1), mgp=c(1.5,.6,0), oma = c(0,0,2.1,0)) > # > plot(d1) > abline(v=-1:7, h = seq(0,1,by=0.2), lty="83", col = "gray") > # > plot(d2) > abline(v=-1:7, h = seq(0,1,by=0.2), lty="83", col = "gray") > # > ## "title" only now > mtext("dip() problem with 'mirror x'", side=3, line = 0.8, + outer=TRUE, cex = 1.5, font = 2) > > > ## Yong Lu example -- a bit smaller > x2 <- c(1, rep(2, 9)) > stopifnot(dip(x2) == dip(3 - x2)) > str(dip(x2, full=TRUE)) List of 15 $ call : language dip(x = x2, full.result = TRUE) $ x : num [1:10] 1 2 2 2 2 2 2 2 2 2 $ n : int 10 $ dip : num 0.05 $ lo.hi : int [1:2] 2 10 $ ifault : int 0 $ gcm : int [1:2] 10 2 $ lcm : int [1:2] 2 10 $ mn : int [1:10] 1 1 2 2 2 2 2 2 2 2 $ mj : int [1:10] 10 10 10 10 10 10 10 10 10 10 $ min.is.0 : logi FALSE $ debug : int 0 $ xl : num 2 $ xu : num 2 $ full.result: logi TRUE - attr(*, "class")= chr "dip" > cat('Time elapsed: ', (.pt <- proc.time()),'\n') # "stats" Time elapsed: 0.184 0.023 0.252 0 0.003 > > ## Real data examples : > > data(statfaculty) > > str(dip(statfaculty, full = "all", debug = 3), vec.len = 8) dip() in C: n = 63; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 63] : gcm[1:6] = 63, 62, 7, 3, 2, 1 lcm[1:5] = 1, 44, 58, 59, 63 while(gcm[ix] != lcm[iv]) : G(5,2) --> ix = 4, iv = 2 G(4,2) --> ix = 3, iv = 2 G(3,2) --> ix = 2, iv = 2 L(3,2) --> ix = 2, iv = 3 L(3,3) --> ix = 2, iv = 4 --> ix = 2, iv = 5 --> ix = 1, iv = 5 calculating dip .. (dip_l, dip_u) = (2, 2.11111) -> new larger dip 2.11111 (j_best = 61) 'dip': LOOP-BEGIN: 2n*D= 2.1111 [low,high] = [ 7, 58] : gcm[1:5] = 58, 55, 51, 48, 7 lcm[1:6] = 7, 11, 15, 42, 44, 58 while(gcm[ix] != lcm[iv]) : L(5,2) --> ix = 4, iv = 3 L(5,3) --> ix = 4, iv = 4 L(5,4) --> ix = 4, iv = 5 L(5,5) --> ix = 4, iv = 6 --> ix = 3, iv = 6 --> ix = 2, iv = 6 --> ix = 1, iv = 6 calculating dip .. (dip_l, dip_u) = (0, 7.5) -> new larger dip 7.5 (j_best = 48) 'dip': LOOP-BEGIN: 2n*D= 7.5 [low,high] = [ 7, 44] : gcm[1:4] = 44, 43, 38, 7 lcm[1:5] = 7, 11, 15, 42, 44 while(gcm[ix] != lcm[iv]) : L(4,2) --> ix = 3, iv = 3 L(4,3) --> ix = 3, iv = 4 --> ix = 2, iv = 4 --> ix = 2, iv = 5 --> ix = 1, iv = 5 List of 17 $ call : language dip(x = statfaculty, full.result = "all", debug = 3) $ x : num [1:63] 30 33 35 36 37 37 39 39 39 39 39 40 40 40 40 41 42 43 43 43 ... $ n : int 63 $ dip : num 0.0595 $ lo.hi : int [1:2] 7 44 $ ifault : int 0 $ gcm : int [1:4] 44 43 38 7 $ lcm : int [1:5] 7 11 15 42 44 $ mn : int [1:63] 1 1 2 3 3 5 3 7 7 7 7 7 12 12 12 7 7 7 18 18 ... $ mj : int [1:63] 44 44 15 15 6 15 11 11 11 11 15 15 15 15 42 42 20 20 20 42 ... $ min.is.0 : logi FALSE $ debug : int 3 $ xl : num 39 $ xu : num 54 $ full.result: chr "all" $ GCM : int [1:6] 63 62 7 3 2 1 $ LCM : int [1:5] 1 44 58 59 63 - attr(*, "class")= chr "dip" > > data(faithful) > fE <- faithful$eruptions > str(dip(fE, full = "all", debug = 3), + vec.len= 8) dip() in C: n = 272; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1,272] : gcm[1:7] = 272, 135, 120, 119, 4, 2, 1 lcm[1:10] = 1, 40, 58, 60, 66, 79, 91, 261, 268, 272 while(gcm[ix] != lcm[iv]) : G(6,2) --> ix = 5, iv = 2 G(5,2) --> ix = 4, iv = 2 L(5,2) --> ix = 4, iv = 3 L(5,3) --> ix = 4, iv = 4 L(5,4) --> ix = 4, iv = 5 L(5,5) --> ix = 4, iv = 6 L(5,6) --> ix = 4, iv = 7 L(5,7) --> ix = 4, iv = 8 G(4,8) --> ix = 3, iv = 8 G(3,8) --> ix = 2, iv = 8 --> ix = 1, iv = 8 --> ix = 1, iv = 9 --> ix = 1, iv = 10 calculating dip .. (dip_l, dip_u) = (50.2553, 3) -> new larger dip 50.2553 (j_best = 91) 'dip': LOOP-BEGIN: 2n*D= 50.255 [low,high] = [120,261] : gcm[1:7] = 261, 260, 252, 181, 146, 135, 120 lcm[1:5] = 120, 124, 233, 246, 261 while(gcm[ix] != lcm[iv]) : L(7,2) --> ix = 6, iv = 3 G(6,3) --> ix = 5, iv = 3 G(5,3) --> ix = 4, iv = 3 G(4,3) --> ix = 3, iv = 3 --> ix = 3, iv = 4 --> ix = 3, iv = 5 --> ix = 2, iv = 5 --> ix = 1, iv = 5 List of 17 $ call : language dip(x = fE, full.result = "all", debug = 3) $ x : num [1:272] 1.6 1.67 1.7 1.73 1.75 1.75 1.75 1.75 1.75 1.75 ... $ n : int 272 $ dip : num 0.0924 $ lo.hi : int [1:2] 120 261 $ ifault : int 0 $ gcm : int [1:7] 261 260 252 181 146 135 120 $ lcm : int [1:5] 120 124 233 246 261 $ mn : int [1:272] 1 1 2 2 4 5 5 5 5 5 5 11 5 13 13 13 13 17 17 13 ... $ mj : int [1:272] 40 40 40 10 10 10 10 10 10 40 12 36 16 16 16 26 19 19 26 26 ... $ min.is.0 : logi FALSE $ debug : int 3 $ xl : num 3.83 $ xu : num 4.83 $ full.result: chr "all" $ GCM : int [1:7] 272 135 120 119 4 2 1 $ LCM : int [1:10] 1 40 58 60 66 79 91 261 268 272 - attr(*, "class")= chr "dip" > > data(precip) > str(dip(precip, full = TRUE, debug = TRUE)) dip() in C: n = 70; starting with 2N*dip = 1. 'dip': LOOP-BEGIN: 2n*D= 1 [low,high] = [ 1, 70]; l_lcm/gcm = ( 6, 4) while(gcm[ix] != lcm[iv]) : ...... calculating dip .. (dip_l, dip_u) = (5, 2.5) -> new larger dip 5 (j_best = 13) 'dip': LOOP-BEGIN: 2n*D= 5 [low,high] = [ 19, 64]; l_lcm/gcm = ( 6, 6) while(gcm[ix] != lcm[iv]) : ........ calculating dip .. (dip_l, dip_u) = (3.875, 3.44828) 'dip': LOOP-BEGIN: 2n*D= 5 [low,high] = [ 31, 55]; l_lcm/gcm = ( 4, 3) while(gcm[ix] != lcm[iv]) : ... List of 15 $ call : language dip(x = precip, full.result = TRUE, debug = TRUE) $ x : num [1:70] 7 7.2 7.8 7.8 11.5 13 14 14.6 15 15.2 ... $ n : int 70 $ dip : num 0.0357 $ lo.hi : int [1:2] 31 55 $ ifault : int 0 $ gcm : int [1:3] 55 49 31 $ lcm : int [1:4] 31 32 35 55 $ mn : int [1:70] 1 1 1 3 1 1 6 7 8 9 ... $ mj : int [1:70] 2 4 4 64 55 10 10 10 10 55 ... $ min.is.0 : logi FALSE $ debug : int 1 $ xl : Named num 35.9 ..- attr(*, "names")= chr "Dallas" $ xu : Named num 43.4 ..- attr(*, "names")= chr "Hartford" $ full.result: logi TRUE - attr(*, "class")= chr "dip" > > cat('Time elapsed: ', proc.time() - .pt,'\n') # "stats" Time elapsed: 0.034 0.005 0.052 0 0 > > if(!interactive()) warnings() > > proc.time() user system elapsed 0.218 0.031 0.304 diptest/tests/ex1.R0000644000176200001440000000310313761214237013713 0ustar liggesuserslibrary(diptest) stopifnot(dip(c(1,1,2,2)) == 1/4)# the maximal value possible: two point dist ## very first small "unimodal" example --- the 1/(2*n) result: n <- length(u <- cumsum(0:3)) d <- dip(u, debug=TRUE)# shows the final if() {added by MM} is really needed stopifnot(d == dip(-u), d == 1/(2*n))# exact "=" for n = 4 ! ## Note that I believe this should *not* give 0 (as fmechler@.. did), ## but rather 1/(2n) because that's (1/n) / 2 and ## (1/n) is the correct distance between LCM and GCM ## Small example -- but MM sees difference (32-bit / 64-bit): x <- c(0,2:3,5:6) d1 <- dip(x, full=TRUE, debug=2) d2 <- dip(6-x, full=TRUE, debug=2) str(d1) str(d2) if(!dev.interactive(orNone=TRUE)) pdf("ex1.pdf") par(mfrow = 2:1, mar = .1+c(3,4,2,1), mgp=c(1.5,.6,0), oma = c(0,0,2.1,0)) # plot(d1) abline(v=-1:7, h = seq(0,1,by=0.2), lty="83", col = "gray") # plot(d2) abline(v=-1:7, h = seq(0,1,by=0.2), lty="83", col = "gray") # ## "title" only now mtext("dip() problem with 'mirror x'", side=3, line = 0.8, outer=TRUE, cex = 1.5, font = 2) ## Yong Lu example -- a bit smaller x2 <- c(1, rep(2, 9)) stopifnot(dip(x2) == dip(3 - x2)) str(dip(x2, full=TRUE)) cat('Time elapsed: ', (.pt <- proc.time()),'\n') # "stats" ## Real data examples : data(statfaculty) str(dip(statfaculty, full = "all", debug = 3), vec.len = 8) data(faithful) fE <- faithful$eruptions str(dip(fE, full = "all", debug = 3), vec.len= 8) data(precip) str(dip(precip, full = TRUE, debug = TRUE)) cat('Time elapsed: ', proc.time() - .pt,'\n') # "stats" if(!interactive()) warnings() diptest/tests/sim1.R0000644000176200001440000000204013761214237014066 0ustar liggesusers#### Very small scale simulation to make the point #### --> See ../stuff/ for much more library(diptest) P.p <- c(1, 5, 10, 25)/100 (P.p <- c(P.p, 1/2, rev(1 - P.p))) N.sim <- 9999 set.seed(94) .p0 <- proc.time() dU100 <- replicate(N.sim, dip(runif(100))) cat('Time elapsed: ', (p1 <- proc.time()) - .p0,'\n'); .p0 <- p1 ## Lynne (2003: P IV, 1.6 GHz): ~7 s ## 2010 (AMD Phenom II X4 925): 1.3 s 100 * round(q100 <- quantile(dU100, p = P.p), 4) plot(density(sqrt(100) * dU100), lwd = 2, col=2, main = expression("Dip distribution" ~~ list(sqrt(n)* D[n], ~ n == 100))) abline(h=0, col="dark gray", lty=3) round(1e4 * quantile(dU100, p = seq(0,1, by = 0.01), names = FALSE)) ##--- an extreme unimodal case -- i.e. very small dip(): set.seed(60); x <- rexp(301,1)^3 hist(x) (dt.x <- dip.test(x)) (dt2 <- dip.test(x, simulate = TRUE)) (dt3 <- dip.test(x, simulate = TRUE, B = 10000)) stopifnot(dt.x$p.value == 1,## <- gave NA earlier dt2$p.value == 1, dt3$p.value == 1) cat('Time elapsed: ', proc.time() - .p0,'\n') # "stats" diptest/tests/mechler-ex.R0000644000176200001440000000107713761214237015257 0ustar liggesuserslibrary(diptest) ## These are from ## the 217-readme.doc file that explains the bug fixed by ## Ferenc Mechler (fmechler@med.cornell.edu). [5/Sep/2002] ## ex1 <- c(0.0198, 0.0198, 0.1961, 0.2898, 0.3184, 0.3687, 0.4336, 0.4987, 0.5661, 0.6530, 0.7476, 0.8555) ex2 <- c(0.0198, 0.1961, 0.2898, 0.3184, 0.3687, 0.4336, 0.4987, 0.5661, 0.6530, 0.7476, 0.8555, 0.9912) ## Multiply them by 10000 here: (D1 <- dip(10000*ex1, full=TRUE, debug=2)) str(D1, digits = 10, vec.len = 12) (D2 <- dip(10000*ex2, full=TRUE, debug=2)) str(D2, digits = 10, vec.len = 12) diptest/src/0000755000176200001440000000000014044171433012516 5ustar liggesusersdiptest/src/dip.c0000644000176200001440000002300513761214237013443 0ustar liggesusers/* ALGORITHM AS 217 APPL. STATIST. (1985) VOL.34, NO.3 @article{HarP85, author = {P. M. Hartigan}, title = {Computation of the Dip Statistic to Test for Unimodality}, year = 1985, journal = {Applied Statistics}, pages = {320--325}, volume = 34 } @article{HarJH85, author = {J. A. Hartigan and P. M. Hartigan}, title = {The Dip Test of Unimodality}, year = 1985, journal = {Ann. of Statistics}, pages = {70--84}, volume = 13 } Does the dip calculation for an ordered vector X using the greatest convex minorant and the least concave majorant, skipping through the data using the change points of these distributions. It returns the dip statistic 'DIP' and the modal interval (XL, XU). === ====== dip.f -- translated by f2c (version of 22 July 1992 22:54:52). Pretty-Edited and extended (debug argument) by Martin Maechler ETH Seminar fuer Statistik 8092 Zurich SWITZERLAND --------------- Two Bug Fixes: ========= 1) July 30 1994 : For unimodal data, gave "infinite loop" (end of code) 2) Oct 31 2003 : Yong Lu : ")" typo in Fortran gave wrong result (larger dip than possible) in some cases */ #include // for the "registration part": #include #include /* Subroutine */ void diptst(const double x[], const int *n_, double *dip, int *lo_hi, int *ifault, int *gcm, int *lcm, int *mn, int *mj, const int *min_is_0, const int *debug) { #define low lo_hi[0] #define high lo_hi[1] #define l_gcm lo_hi[2] #define l_lcm lo_hi[3] const int n = *n_; int mnj, mnmnj, mjk, mjmjk, ig, ih, iv, ix, i, j, k; double dip_l, dip_u, dipnew; /* Parameter adjustments, so I can do "as with index 1" : x[1]..x[n] */ --mj; --mn; --lcm; --gcm; --x; /*-------- Function Body ------------------------------ */ *ifault = 1; if (n <= 0) return; *ifault = 0; /* Check that X is sorted --- if not, return with ifault = 2*/ *ifault = 2; for (k = 2; k <= n; ++k) if (x[k] < x[k - 1]) return; *ifault = 0; /* Check for all values of X identical, */ /* and for 1 <= n < 4. */ /* LOW contains the index of the current estimate of the lower end of the modal interval, HIGH contains the index for the upper end. */ low = 1; high = n; /*-- IDEA: *xl = x[low]; *xu = x[high]; --*/ /* M.Maechler -- speedup: it saves many divisions by n when we just work with * (2n * dip) everywhere but the very end! */ *dip = (*min_is_0) ? 0. : 1.; if (n < 2 || x[n] == x[1]) goto L_END; if(*debug) Rprintf("dip() in C: n = %d; starting with 2N*dip = %g.\n", n, *dip); /* Establish the indices mn[1..n] over which combination is necessary for the convex MINORANT (GCM) fit. */ mn[1] = 1; for (j = 2; j <= n; ++j) { mn[j] = j - 1; while(1) { mnj = mn[j]; mnmnj = mn[mnj]; if (mnj == 1 || ( x[j] - x[mnj]) * (mnj - mnmnj) < (x[mnj] - x[mnmnj]) * (j - mnj)) break; mn[j] = mnmnj; } } /* Establish the indices mj[1..n] over which combination is necessary for the concave MAJORANT (LCM) fit. */ mj[n] = n; for (k = n - 1; k >= 1; k--) { mj[k] = k + 1; while(1) { mjk = mj[k]; mjmjk = mj[mjk]; if (mjk == n || ( x[k] - x[mjk]) * (mjk - mjmjk) < (x[mjk] - x[mjmjk]) * (k - mjk)) break; mj[k] = mjmjk; } } /* ----------------------- Start the cycling. ------------------------------- */ LOOP_Start: /* Collect the change points for the GCM from HIGH to LOW. */ gcm[1] = high; for(i = 1; gcm[i] > low; i++) gcm[i+1] = mn[gcm[i]]; ig = l_gcm = i; // l_gcm == relevant_length(GCM) ix = ig - 1; // ix, ig are counters for the convex minorant. /* Collect the change points for the LCM from LOW to HIGH. */ lcm[1] = low; for(i = 1; lcm[i] < high; i++) lcm[i+1] = mj[lcm[i]]; ih = l_lcm = i; // l_lcm == relevant_length(LCM) iv = 2; // iv, ih are counters for the concave majorant. if(*debug) { Rprintf("'dip': LOOP-BEGIN: 2n*D= %-8.5g [low,high] = [%3d,%3d]", *dip, low,high); if(*debug >= 3) { Rprintf(" :\n gcm[1:%d] = ", l_gcm); for(i = 1; i <= l_gcm; i++) Rprintf("%d%s", gcm[i], (i < l_gcm)? ", " : "\n"); Rprintf(" lcm[1:%d] = ", l_lcm); for(i = 1; i <= l_lcm; i++) Rprintf("%d%s", lcm[i], (i < l_lcm)? ", " : "\n"); } else { // debug <= 2 : Rprintf("; l_lcm/gcm = (%2d,%2d)\n", l_lcm,l_gcm); } } /* Find the largest distance greater than 'DIP' between the GCM and * the LCM from LOW to HIGH. */ // FIXME: should provide LDOUBLE or something like it long double d = 0.;// <<-- see if this makes 32-bit/64-bit difference go.. if (l_gcm != 2 || l_lcm != 2) { if(*debug) Rprintf(" while(gcm[ix] != lcm[iv]) :%s", (*debug >= 2) ? "\n" : " "); do { /* gcm[ix] != lcm[iv] (after first loop) */ long double dx; int gcmix = gcm[ix], lcmiv = lcm[iv]; if (gcmix > lcmiv) { /* If the next point of either the GCM or LCM is from the LCM, * calculate the distance here. */ int gcmi1 = gcm[ix + 1]; dx = (lcmiv - gcmi1 + 1) - ((long double) x[lcmiv] - x[gcmi1]) * (gcmix - gcmi1)/(x[gcmix] - x[gcmi1]); ++iv; if (dx >= d) { d = dx; ig = ix + 1; ih = iv - 1; if(*debug >= 2) Rprintf(" L(%d,%d)", ig,ih); } } else { /* If the next point of either the GCM or LCM is from the GCM, * calculate the distance here. */ int lcmiv1 = lcm[iv - 1]; /* Fix by Yong Lu {symmetric to above!}; original Fortran: only ")" misplaced! :*/ dx = ((long double)x[gcmix] - x[lcmiv1]) * (lcmiv - lcmiv1) / (x[lcmiv] - x[lcmiv1])- (gcmix - lcmiv1 - 1); --ix; if (dx >= d) { d = dx; ig = ix + 1; ih = iv; if(*debug >= 2) Rprintf(" G(%d,%d)", ig,ih); } } if (ix < 1) ix = 1; if (iv > l_lcm) iv = l_lcm; if(*debug) { if(*debug >= 2) Rprintf(" --> ix = %d, iv = %d\n", ix,iv); else Rprintf("."); } } while (gcm[ix] != lcm[iv]); if(*debug && *debug < 2) Rprintf("\n"); } else { /* l_gcm or l_lcm == 2 */ d = (*min_is_0) ? 0. : 1.; if(*debug) Rprintf(" ** (l_lcm,l_gcm) = (%d,%d) ==> d := %g\n", l_lcm, l_gcm, (double)d); } if (d < *dip) goto L_END; /* Calculate the DIPs for the current LOW and HIGH. */ if(*debug) Rprintf(" calculating dip .."); int j_best, j_l = -1, j_u = -1; /* The DIP for the convex minorant. */ dip_l = 0.; for (j = ig; j < l_gcm; ++j) { double max_t = 1.; int j_ = -1, jb = gcm[j + 1], je = gcm[j]; if (je - jb > 1 && x[je] != x[jb]) { double C = (je - jb) / (x[je] - x[jb]); for (int jj = jb; jj <= je; ++jj) { double t = (jj - jb + 1) - (x[jj] - x[jb]) * C; if (max_t < t) { max_t = t; j_ = jj; } } } if (dip_l < max_t) { dip_l = max_t; j_l = j_; } } /* The DIP for the concave majorant. */ dip_u = 0.; for (j = ih; j < l_lcm; ++j) { double max_t = 1.; int j_ = -1, jb = lcm[j], je = lcm[j + 1]; if (je - jb > 1 && x[je] != x[jb]) { double C = (je - jb) / (x[je] - x[jb]); for (int jj = jb; jj <= je; ++jj) { double t = (x[jj] - x[jb]) * C - (jj - jb - 1); if (max_t < t) { max_t = t; j_ = jj; } } } if (dip_u < max_t) { dip_u = max_t; j_u = j_; } } if(*debug) Rprintf(" (dip_l, dip_u) = (%g, %g)", dip_l, dip_u); /* Determine the current maximum. */ if(dip_u > dip_l) { dipnew = dip_u; j_best = j_u; } else { dipnew = dip_l; j_best = j_l; } if (*dip < dipnew) { *dip = dipnew; if(*debug) Rprintf(" -> new larger dip %g (j_best = %d)\n", dipnew, j_best); } else if(*debug) Rprintf("\n"); /*--- The following if-clause is NECESSARY (may loop infinitely otherwise)! --- Martin Maechler, Statistics, ETH Zurich, July 30 1994 ---------- */ if (low == gcm[ig] && high == lcm[ih]) { if(*debug) Rprintf("No improvement in low = %ld nor high = %ld --> END\n", low, high); } else { low = gcm[ig]; high = lcm[ih]; goto LOOP_Start; /* Recycle */ } /*---------------------------------------------------------------------------*/ L_END: /* do this in the caller : * *xl = x[low]; *xu = x[high]; * rather return the (low, high) indices -- automagically via lo_hi[] */ *dip /= (2*n); return; } /* diptst */ #undef low #undef high //----------------- Registration <==> ../NAMESPACE #define CDEF(name) {#name, (DL_FUNC) &name, sizeof(name ## _t)/sizeof(name ## _t[0]), name ##_t} #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} // void diptst(double *x, int *n_, // double *dip, int *lo_hi, int *ifault, // int *gcm, int *lcm, int *mn, int *mj, // int *min_is_0, int *debug) static R_NativePrimitiveArgType diptst_t[] = { REALSXP, INTSXP, /* dip: */ REALSXP, INTSXP, INTSXP, /* gcm: */ INTSXP, INTSXP, INTSXP, INTSXP, /* min_is_0:*/ LGLSXP, INTSXP }; static const R_CMethodDef CEntries[] = { CDEF(diptst), {NULL, NULL, 0} }; /* static R_CallMethodDef CallEntries[] = { */ /* CALLDEF(sinc_c, 1), */ /* {NULL, NULL, 0} */ /* }; */ /** * register routines * @param dll pointer * @return none * @author Martin Maechler */ void #ifdef HAVE_VISIBILITY_ATTRIBUTE __attribute__ ((visibility ("default"))) #endif R_init_diptest(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); /* R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL); */ R_useDynamicSymbols(dll, FALSE); } diptest/vignettes/0000755000176200001440000000000014044171433013737 5ustar liggesusersdiptest/vignettes/diptest-issues.Rnw0000644000176200001440000003351213761214237017425 0ustar liggesusers%\documentclass[article]{jss} %% -- $Id: diptest-issues.Rnw,v 1.9 2011/08/10 14:04:29 maechler Exp maechler $ \documentclass[nojss,article]{jss} % ----- for the package-vignette, don't use JSS logo, etc % % \author{Martin Maechler\\ Seminar f\"ur Statistik \\ ETH Zurich, \ Switzerland % \\\email{maechler@stat.math.ethz.ch}} \author{Martin M\"achler \\ ETH Zurich} \title{Dip Test Distributions, P-values, and other Explorations} % \def\mythanks{a version of this paper, for \pkg{nacopula} 0.4\_4, has been published % in JSS, \url{http://www.jstatsoft.org/v39/i09}.} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{Dip Test Distributions, P-values, and other Explorations} % \Shorttitle{} %\date{April 2009 ({\tiny typeset on \tiny\today})} %%\VignetteIndexEntry{Dip Test Distributions, P-values, and other Explorations} %%\VignetteDepends{diptest} \SweaveOpts{engine=R,keep.source=TRUE,strip.white=true} % ^^^^^^^^^^^^^^^^ \SweaveOpts{eps=FALSE,pdf=TRUE,width=7,height=4} %% an abstract and keywords \Abstract{ ... % FIXME ... % FIXME } % \Keywords{MPFR, Abitrary Precision, Multiple Precision Floating-Point, R} %% 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{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% 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): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} % \usepackage{myVignette} % \usepackage{fullpage}% save trees ;-) --- FIXME use {geometry} package % \usepackage[authoryear,round,longnamesfirst]{natbib} % \bibliographystyle{plainnat} % %% Marius' packages \usepackage[american]{babel}%for American English % \usepackage{microtype}%for character protrusion and font expansion (only with pdflatex) \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments % \usepackage{bm}%for bold math symbols: \bm (= bold math) % %NON-STANDARD:\RequirePackage{bbm}%only for indicator functions % \usepackage{enumitem}%for automatic numbering of new enumerate environments % \usepackage[ % format=hang, % % NOT for JSS: labelsep=space, % justification=justified, % singlelinecheck=false%, % % NOT for JSS: labelfont=bf % ]{caption}%for captions % \usepackage{tikz}%sophisticated graphics package % \usepackage{tabularx}%for special table environment (tabularx-table) % \usepackage{booktabs}%for table layout % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\Arg}[1]{\texttt{\itshape $\langle$#1$\rangle$}} \newcommand*{\file}[1]{{`\normalfont\texttt{#1}'}} \newcommand*{\eps}{\varepsilon} % %% Probability P[.], Expectation E[.] etc \makeatletter %% == subsection of our flexible-style "texab.sty" : \newcommand{\@pkl}{[} % Probability Klammer links \newcommand{\@pkr}{]} \newcommand{\@ekl}{[} % Erwartungswert Klammer links \newcommand{\@ekr}{]} % Erwartungswert Klammer rechts \DeclareMathOperator{\PRSymbol}{P} % Next line (\makeright): if #1 == \left then \right #2 else #1 #2 \newcommand{\makeright}[2]{\ifx#1\left\right#2\else#1#2\fi} %% the real commands \newcommand{\PR}[2][\left] {\PRSymbol #1\@pkl #2 \makeright{#1}{\@pkr}} \newcommand{\ERW}[2][\left] {\ERWSymbol #1\@ekl #2 \makeright{#1}{\@ekr}} \makeatother \newcommand{\isD}{\ {\stackrel{\mathcal{D}}{=}}\ \ } \newcommand*{\iid}{\mbox{ i.i.d. }} % \begin{document} \setkeys{Gin}{width=\textwidth} % Manuel has \setlength{\abovecaptionskip}{-5pt} % %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% Note: These are explained in '?RweaveLatex' : \begin{footnotesize} <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", # <- "yuck!" - required by JSS continue=" ") set.seed(47) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") ## In order to save() and load() expensive results thisDir <- system.file('doc', package='diptest') xtraDir <- if(Sys.getenv("USER") == "maechler") "~/R/Pkgs/diptest/stuff" else thisDir res1.file <- file.path(thisDir, "aggr_results.Rdata") <>= if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) @ \end{footnotesize} % \maketitle % \begin{abstract} % \end{abstract} \section[Introduction]{Introduction}% \small~\footnote{\mythanks}} \label{sec:Intro} %% MM FIXME: Need notation $D_n :=$\texttt{dip( runif(n) )}; but more generally, \begin{equation} \label{eq:Dn.F} D_n(F) := D(X_1, X_2, \dots, X_n), \mbox{ \ \ \texttt{where} } X_i \iid, X_i \sim F. \end{equation} \citet{HarJH85} in their ``seminal'' paper on the dip statistic $D_n$ already proved that $ \sqrt{n} \; D_n$ converges in distribution, i.e., \begin{equation} \label{eq:D.infty} \lim_{n\to\infty}\sqrt{n} \; D_n \isD D_\infty. \end{equation} A considerable part of this paper is devoted to explore the distribution of $D_\infty$. \bigskip \section[History of the diptest package]{History of the \texttt{diptest} \textsf{R} package} \citet{HarP85} published an implementation in Fortran of a concrete algorithm, % ALGORITHM AS 217 APPL. STATIST. (1985) VOL.34, NO.3 where the code was also made available on Statlib\footnote{Statlib is now a website, of course, \url{http://lib.stat.cmu.edu/}, but then was \emph{the} preferred way for distributing algorithms for statistical computing, available years before the existence of the WWW, and entailing e-mail and (anonymous) FTP} On July 28, 1994, Dario Ringach, then at NY University, asked on Snews (the mailing list for S and S-plus users) about distributions and was helped by me and then about \texttt{dyn.load} problems, again helped by me. Subsequently he provided me with S-plus code which interfaced to (a \texttt{f2c}ed version of) Hartigan's Fortran code, for computing the dip statistic. and ended the (then private) e-mail with \begin{quotation} I am not going to have time to set this up for submission to StatLib. If you want to do it, please go ahead. Regards, Dario \end{quotation} - several important bug fixes; last one Oct./Nov.~2003 However, the Fortran code file \url{http://lib.stat.cmu.edu/apstat/217}, was last changed {Thu 04 Aug 2005 03:43:28 PM CEST}. We have some results of the dip.dist of \emph{before} the bug fix; notably the ``dip of the dip'' probabilities have changed considerably!! - see rcs log of ../../src/dip.c \section{21st Century Improvement of Hartigan$^2$'s Table} (( Use listing package (or so to more or less ``cut \& paste'' the nice code in \texttt{../../stuff/new-simul.Rout-1e6} )) \section{The Dip in the Dip's Distribution} \label{sec:dip_dip} We have found empirically that the dip distribution itself starts with a ``dip''. Specifically, the minimal possible value of $D_n$ is $\frac{1}{2n}$ \emph{and} the probability of reaching that value, \begin{equation} \label{eq:P.Dn_min} \PR{D_n = \frac{1}{2n}}, \end{equation} is large for small $n$. E.g., consider an approximation of the dip distribution for $n=5$, <>= require("diptest") # after installing it .. D5 <- replicate(10000, dip(runif(5))) hist(D5, breaks=128, main = "Histogram of replicate(10'000, dip(runif(5))))") @ which looks as if there was a bug in the software --- but that look is misleading! Note how the phenomenon is still visible for $n=8$, <>= D8 <- replicate(10000, dip(runif(8))) hist(D8, breaks=128, main = "Histogram of replicate(10'000, dip(runif(8))))") @ Note that there is another phenomenon, in addition to the point mass at $1/(2n)$, particularly visible, if we use \emph{many} replicates, <>= set.seed(11) n <- 11 B.s11 <- 500000 D11 <- replicate(B.s11, dip(runif(n))) <<2nd-small-sample-phenomen--n-eq-11, echo=false>>= if(file.exists(ff <- file.path(thisDir, "hist-D11.rda"))) { load(ff) } else { ## takes a few minutes <> hD11 <- hist(D11, breaks=1e-6+(63:298)/(2*11*64), plot=FALSE) save(hD11, n, B.s11, file= ff) } <<2nd-small-sample-phenomen--n-eq-11, echo=false, fig=true>>= B.str <- format(B.s11, sci=FALSE, big.mark="'") plot(hD11, main = "", ## main = sprintf("Histogram of replicate(%s, dip(runif(%d)))", B.str, n), border=NA, col="dark gray", xlab = substitute("Dip" ~~ D[.N.](U(group("[",list(0,1),"]"))), list(.N. = n))) title(xlab= substitute(B == .B.SIM. ~ "replicates", list(.B.SIM. = B.str)), adj = .88) lcol <- adjustcolor("orange4", 0.4) abline(v = (1:3)/(2*n), col=lcol, lty=3, lwd=2) axis(1, pos=0, at = (1:3)/(2*n), labels = expression(1/22, 2/22, 3/22), col=lcol, col.axis=lcol) @ FIXME:\\ use \file{../../stuff/sim-minProb.R} \\ and \file{../../stuff/minProb-anal.R} Further, it can be seen that the \emph{maximal} dip statistic is $\frac 1 4 = 0.25$ and this upper bound can be reached simply (for even $n$) using the the data $(0,0,\dots,0, \; 1, 1,\dots,1)$, a bi-point mass with equal mass at both points. \section{P-values for the Dip Test} \label{sec:Pvals} Note that it is not obvious how to compute $p$-values for ``the dip test'', as that means determining the distribution of the test statistic, i.e., $D_n$ under the null hypothesis, but a natural null, $H_o: F \in \{F \mathrm{cadlag} \mid f := \frac d{dx} F is unimodal \}$ is too large. Hartigans'(1985) argued for using the uniform $U[0,1]$ i.e., $F'(x) = f(x)= \mathbf{1}_{[0,1]}(x) = [0 \le x \le 1]$ (Iverson bracket) instead, even though they showed that it is not quite the ``least favorable'' one. Following Hartigans', we will define the $p$-value of an observed $d_n$ as \begin{equation} \label{eq:Pval} P_{d_n} := \PR{D_n \ge d_n} := \PR{\mathrm{dip}(U_1,\dots,U_n) \ge d_n}, \ \ \mathrm{where} \ U_i \sim U[0,1], \ \, \iid \end{equation} \subsection{Interpolating the Dip Table} \label{sec:interpol} Because of the asymptotic distribution, $ \lim_{n\to\infty}\sqrt{n} \; D_n \isD D_\infty$, it is makes sense to consider the ``$\sqrt{n} D_n$''--scale, even for finite $n$ values: <>= data(qDiptab) dnqd <- dimnames(qDiptab) (nn. <- as.integer(dnqd[["n"]])) matplot(nn., qDiptab*sqrt(nn.), type ="o", pch=1, cex = 0.4, log="x", xlab="n [log scaled]", ylab = expression(sqrt(n) %*% q[D[n]])) ## Note that 1/2n is the first possible value (with finite mass),, ## clearly visible for (very) small n: lines(nn., sqrt(nn.)/(2*nn.), col=adjustcolor("yellow2",0.5), lwd=3) P.p <- as.numeric(print(noquote(dnqd[["Pr"]]))) ## Now look at one well known data set: D <- dip(x <- faithful$waiting) n <- length(x) points(n, sqrt(n)*D, pch=13, cex=2, col= adjustcolor("blue2",.5), lwd=2) ## a simulated (approximate) $p$-value for D is mean(D <= replicate(10000, dip(runif(n)))) ## ~ 0.002 @ but we can use our table to compute a deterministic (but still approximate, as the table is from simulation too) $p$-value: <>= ## We are in this interval: n0 <- nn.[i.n <- findInterval(n, nn.)] n1 <- nn.[i.n +1] ; c(n0, n1) f.n <- (n - n0)/(n1 - n0)# in [0, 1] ## Now "find" y-interval: y.0 <- sqrt(n0)* qDiptab[i.n ,] y.1 <- sqrt(n1)* qDiptab[i.n+1,] (Pval <- 1 - approx(y.0 + f.n*(y.1 - y.0), P.p, xout = sqrt(n) * D)[["y"]]) ## 0.018095 @ Finally, in May 2011, after several years of people asking for it, I have implemented a \code{dip.test} function which makes use of a --- somewhat more sophisticated --- interpolation scheme like the one above, to compute a $p$-value. As \code{qDiptab} has been based on $10^6$ samples, the interpolation yields accurate $p$-values, unless in very extreme cases. Here is the small ($n=63$) example from Hartigan$^2$, <>= data(statfaculty) dip.test(statfaculty) @ where, from a $p$-value of 8.7\%, we'd conclude that there is not enough evidence against unimodality. \subsection{Asymptotic Dip Distribution} \label{sec:asymp} We have conducted extensive simulations in order to explore the limit distribution of $D_\infty$, i.e., the limit of $\sqrt{n} \; D_n$, (\ref{eq:D.infty}). Our current \R\ code is in \file{ ../../stuff/asymp-distrib.R } but the simulation results (7 Megabytes for each $n$) cannot be assumed to be part of the package, nor maybe even to be simply accessible via the internet. %% is bandwidth a problem ? probably no longer in the near future? %% Maybe \section{Less Conservative Dip Testing} \section{Session Info} <>= toLatex(sessionInfo()) @ \bibliography{diptest} \end{document} diptest/vignettes/myVignette.sty0000644000176200001440000000520513761214237016642 0ustar liggesusers%% originates from ~/R/Pkgs/Matrix/inst/doc/myVignette.sty [April 2009] \RequirePackage{hyperref} \RequirePackage{url} \RequirePackage{amsmath} \RequirePackage{bm}%-> \bm (= bold math) \newcommand{\Slang}{\textsf{S} language} \newcommand{\RR}{\textsf{R}} \newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} %- R programming markup \newcommand\code{\bgroup\@codex} \def\@codex#1{{\normalfont\ttfamily\hyphenchar\font=-1 #1}\egroup} \let\env=\code \let\command=\code \newcommand*{\Rfun}[1]{\code{#1()}\index{\RR~function #1}} \newcommand*{\class}[1]{\code{#1}\index{class #1}}% \newcommand*{\pkg}[1]{\code{#1}\index{\RR~package #1}} % \newcommand{\kbd}[1]{{\normalfont\texttt{#1}}} \newcommand{\key}[1]{{\normalfont\texttt{\uppercase{#1}}}} \newcommand\samp{`\bgroup\@noligs\@sampx} \def\@sampx#1{{\normalfont\texttt{#1}}\egroup'} \let\option=\samp \newcommand{\var}[1]{{\normalfont\textsl{#1}}} \newcommand{\file}[1]{{`\normalfont\textsf{#1}'}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \newcommand{\acronym}[1]{{\normalfont\textsc{\lowercase{#1}}}} \newcommand{\strong}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\pkg=\strong % \RequirePackage{alltt} \newenvironment{example}{\begin{alltt}}{\end{alltt}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \newenvironment{display}{\list{}{}\item\relax}{\endlist} \newenvironment{smallverbatim}{\small\verbatim}{\endverbatim} % This is already in ``Sweave'' : %% \RequirePackage{fancyvrb} %% \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} %% \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} %% \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % \newcommand{\FIXME}[1]{\marginpar{ \dots FIXME \emph{#1} \dots}} \newcommand{\TODO}[1]{\par\noindent\textsc{Todo:} \textit{#1}\par} % \newcommand*{\myOp}[1]{{$\left\langle\ensuremath{#1}\right\rangle$}} \newcommand{\noFootnote}[1]{{\small (\textit{#1})}} % %% diptest stuff : % %% Probabily P[.], Expectation E[.] etc %% == subsection of our flexible-style "texab.sty" : \newcommand{\@pkl}{[} % Probability Klammer links \newcommand{\@pkr}{]} \newcommand{\@ekl}{[} % Erwartungswert Klammer links \newcommand{\@ekr}{]} % Erwartungswert Klammer rechts \DeclareMathOperator{\PRSymbol}{P} % Next line (\makeright): if #1 == \left then \right #2 else #1 #2 \newcommand{\makeright}[2]{\ifx#1\left\right#2\else#1#2\fi} %% the real commands \newcommand{\PR}[2][\left] {\PRSymbol #1\@pkl #2 \makeright{#1}{\@pkr}} \newcommand{\ERW}[2][\left] {\ERWSymbol #1\@ekl #2 \makeright{#1}{\@ekr}} \newcommand{\isD}{\ {\stackrel{\mathcal{D}}{=}}\ \ } \newcommand{\iid}{\mbox{ i.i.d. }} diptest/vignettes/diptest.bib0000644000176200001440000000417013761214237016100 0ustar liggesusers@string{AmStat = "The American Statistician"} @string{AnnStat = "Annals of Statistics"} % @string{JASA = "Journal of the American Statistical Association"} @string{AnInStMa = "Annals of the Inst.\ of Stat.\ Math."} @string{JASA = "JASA"} @string{JAppTh = "Journal of Approximation Theory"} @string{JMAA = "Journal of Analysis and Applications"} @string{JRSS = "Journal of the Royal Statistical Society"} %% ALWAYS #~A or #~B! @string{JRSSA = JRSS # "~A, General"} @string{JRSSB = JRSS # "~B"} @string{JRSSC-AS = "Applied Statistics --- " # JRSS # "~C"} @string{NuMath = "Numerische Mathematik"} @string{SIAM = "Society for Industrial and Applied Mathematics"} @string{SSci = "Statistical Science"} @string{StMed = "Statist.\ in Med."}% Statistics in Medicine @string{ScandS = "Scandinavian Journal of Statistics"} @string{JSS = "Journal of Statistical Software"} @string{JSSC = "SIAM Journal on Scientific and Statistical Computing"} % @string{JSSC = "SIAM J. Sci.\ Statist.\ Comput."} @string{JCGS = "Journal of Computational and Graphical Statistics"} % @string{CSDA = "Computational Statistics \& Data Analysis"} @string{CSDA = "Computat.\ Statist.\ Data Anal."} @string{IEEE-ASSP = "IEEE Trans.\ Acoust., Speech, Signal Processing"} % @string{TOMS = "ACM Transactions on Mathematical Software"} % @string{TOMS = "{ACM} Transactions on Mathematical Software (TOMS)"} @string{TOMS = "ACM Trans.\ Math.\ Software"} @string{ETH = "Swiss Federal Institute of Technology (ETH)"} @string{UWstat = "Department of Statistics, University of Washington"} @string{Wiley = "Wiley"} @string{NY = "N.~Y."} @article{HarJH85, Author = {J. A. Hartigan and P. M. Hartigan}, Title = {The Dip Test of Unimodality}, Year = 1985, Journal = AnnStat, Volume = 13, Pages = {70--84}, Keywords = {Multimodality; Isotonic regression; Empirical distribution} } @article{HarP85, author = {P. M. Hartigan}, title = {Computation of the Dip Statistic to Test for Unimodality}, year = 1985, journal = {Applied Statistics}, pages = {320--325}, volume = 34 } %% -- note that ~/bib/master.bib has quite a few more on "modality" testing diptest/R/0000755000176200001440000000000013761214237012135 5ustar liggesusersdiptest/R/dip.R0000644000176200001440000001133613761214237013040 0ustar liggesusers### S-interface to Hartigan's algorithm for "The dip test for unimodality" ### ### Beginning: Dario Ringach ### Rest: Martin Maechler dip <- function(x, full.result = FALSE, min.is.0 = FALSE, debug = FALSE) { allRes <- (!is.logical(rFull <- full.result)) if(allRes) { if(full.result %in% c("all")) rFull <- TRUE else stop(gettextf("'full.result' = \"%s\"' is not valid", full.result)) } if(rFull) cl <- match.call() if(is.unsorted(x)) x <- sort(x, method="quick") n <- as.integer(length(x)) r <- .C(diptst, x = as.double(x), n = n, dip = double(1), lo.hi = integer(4), ifault= integer(1), gcm = integer(n), lcm = integer(n), mn = integer(n), mj = integer(n), min.is.0 = as.logical(min.is.0), debug = as.integer(debug)# FALSE/TRUE or 2, 3, ... )[if(rFull) TRUE else "dip"] if(rFull) { l.GL <- r$lo.hi[3:4] length(r$gcm) <- l.GL[1] length(r$lcm) <- l.GL[2] length(r$lo.hi) <- 2L u <- x[r$lo.hi] structure(class = "dip", c(list(call = cl), r, list(xl = u[1], xu = u[2], full.result=full.result), if(allRes) getCM(r$mn, r$mj, n))) } else r[[1]] } getCM <- function(mn, mj, n = length(mn)) { stopifnot(length(mn) <= n, length(mj) <= n) # currently '=='... ## First recover "the full GCM / LCM" - by repeating what happened in C ## in the first "loop" : low <- 1L ; high <- n gcm <- lcm <- integer(n) # pre-allocate! {maybe smaller ?} ## Collect the change points for the GCM from HIGH to LOW. */ gcm[i <- 1L] <- high while(gcm[i] > low) gcm[(i <- i+1L)] <- mn[gcm[i]] length(gcm) <- i ## Collect the change points for the LCM from LOW to HIGH. */ lcm[i <- 1L] <- low while(lcm[i] < high) lcm[(i <- i+1L)] <- mj[lcm[i]] length(lcm) <- i list(GCM = gcm, LCM = lcm) } print.dip <- function(x, digits = getOption("digits"), ...) { stopifnot(is.integer(n <- x$n), is.numeric(D <- x$dip), length(lh <- x$lo.hi) == 2) cat("\nCall:\n", paste(deparse(x$call), sep = "\n", collapse = "\n"), "\n\n", sep = "") xLU.c <- sapply(x$x[lh], formatC, digits=digits, width=1) cat("n = ", n,". Dip statistic, D_n = ", format(D, digits=digits)," = ", format(2*n* D, digits=digits),"/(2n)\n", sprintf(" Modal interval [xL, xU] = [x[%d], x[%d]] = [%s, %s]\n", lh[1], lh[2], xLU.c[1], xLU.c[2]), sprintf(" GCM and LCM have %d and %d nodes inside [xL, xU], respectively", ## 3 5 7 9 1 3 5 7 length(x$gcm), length(x$lcm)), if(x$full.result == "all") sprintf(", and\n%17s %d and %d nodes in [x_1, x_n].\n", "", length(x$GCM), length(x$LCM)) else ".\n", sep="") invisible(x) } aLine <- function(r.dip, lType = c("gcm","lcm","GCM","LCM"), type = "b", col="red3", lwd=1.5, ...) { lType <- match.arg(lType) stopifnot(is.numeric(x <- r.dip$x), length(r.dip$n) == 1, r.dip$n == round(r.dip$n), is.integer(i <- r.dip[[lType]]) # 'gcm' or 'lcm' or component ) e <- if(lType %in% c("gcm","GCM")) .01*min(diff(unique(x))) else 0 i <- i[i != 0] lines(x[i], ecdf(x)(x[i] - e), type=type, col=col, lwd=lwd, ...) } plot.dip <- function(x, do.points=(n < 20), ## <- plot.stepfun() colG="red3", colL="blue3", colM="forest green", col.points=par("col"), col.hor=col.points, ## <- plot.stepfun(): doModal=TRUE, doLegend=TRUE, ...) { stopifnot(is.integer(n <- x$n), is.numeric(D <- x$dip), length(lh <- x$lo.hi) == 2) Fn <- ecdf(x$x) ## and now manipulate the call such that it's plotted nicely cl <- x$call[1:2] cl[[1]] <- as.name("ecdf") ; names(cl)[2] <- "" attr(Fn, "call") <- cl chD <- formatC(D, digits=pmax(3, getOption("digits")-2)) tit <- bquote("Dip" ~~ {D[n] == D[.(n)]} == .(chD)) plot(Fn, do.points=do.points, col.points=col.points, col.hor=col.hor, verticals=TRUE, col.vert = "sky blue", lwd=2, ...) title(tit, adj = 0, line = 1.25) aLine(x, "gcm", col=colG) aLine(x, "lcm", col=colL) if(doCM.2 <- (x$full.result == "all")) { aLine(x, "GCM", col=colG, lty=5) aLine(x, "LCM", col=colL, lty=5) } if(doModal) { x12 <- x$x[lh] abline(v= x12, col = colM, lty = 2) op <- par(mgp = c(3, 1/16, 0))# should not need on.exit(par(op)) here .. axis(3, at=x12, labels = expression(x[L], x[U]), tick=FALSE, col.axis = colM) par(op) } if(doLegend) { txt <- c("greatest convex minorant GCM", ### make sure have *no* [TAB] in next string ! "least concave majorant LCM") t1 <- paste(txt," in [xL, xU]") legend("topleft", bty = "n", if(doCM.2) c(t1, txt) else t1, lwd=1.5, col = c(colG, colL), lty= if(doCM.2) c(1,1,5,5) else 1) } invisible() } diptest/R/dipTest.R0000644000176200001440000000346313761214237013702 0ustar liggesusers##' also called from ../data/qDiptab.R : if(getRversion() < "2.13.0") { rdRDS <- function(..., package = "diptest") .readRDS(system.file(..., package=package)) } else rdRDS <- function(..., package = "diptest") readRDS(system.file(..., package=package, mustWork=TRUE)) dip.test <- function(x, simulate.p.value = FALSE, B = 2000) { DNAME <- deparse(substitute(x)) x <- sort(x[complete.cases(x)]) stopifnot(is.numeric(x)) n <- length(x) # *is* integer D <- dip(x) method <- "Hartigans' dip test for unimodality / multimodality" if(n <= 3) { P <- 1 } else if(simulate.p.value) { method <- paste(method, "with simulated p-value\n\t (based on", B, "replicates)") P <- mean(D <= replicate(B, dip(runif(n)))) } else { ## Long "codetools-compatible" way of data(qDiptab) : qDiptab <- rdRDS("extraData", "qDiptab.rds") dn <- dimnames(qDiptab) max.n <- max(nn <- as.integer(dn[["n"]])) P.s <- as.numeric(dn[["Pr"]]) if(n > max.n) { ## extrapolate, or rather just use the last n as == "asymptotic" message("n = ",n," > max_n{n in table} = ",max.n, " -- using that as asymptotic value.") n1 <- n0 <- max.n i2 <- i.n <- length(nn) f.n <- 0 } else { n0 <- nn[i.n <- findInterval(n, nn)] n1 <- nn[(i2 <- i.n +1)] f.n <- (n - n0)/(n1 - n0)# in [0, 1] } ## Now "find" y-interval: y.0 <- sqrt(n0)* qDiptab[i.n, ] y.1 <- sqrt(n1)* qDiptab[i2 , ] sD <- sqrt(n) * D P <- 1 - approx(y.0 + f.n*(y.1 - y.0), P.s, rule = 2,# <- [min, max] xout = sD)[["y"]] } structure(list(statistic = c(D = D), p.value = P, nobs = n, alternative = "non-unimodal, i.e., at least bimodal", method = method, data.name = DNAME), class = "htest") } diptest/MD50000644000176200001440000000324114044221052012230 0ustar liggesusers173bb33ee2a664b85ff6b68747b68ab3 *ChangeLog 351febd1b73c14ff7c6aedf51200b838 *DESCRIPTION 5484ca26095b4d91e9c46361fc347076 *NAMESPACE 89354fc59648ede8993e21ff9cebc1ba *R/dip.R d32eb217adaf6a7825f0c4f5bf356a2c *R/dipTest.R d5cd9e3ce86553197ee79a6ab33ff787 *README.md 4dc4ad828291e934066f8e7d0575b6e2 *TODO 4feb0821b4095ef5be9d068335457ec7 *build/vignette.rds c3674b717423e2c07d5b1c69fe49d7f0 *data/exHartigan.R 454c4a99c0a6f204c9e37926aca9d0aa *data/qDiptab.R 611947623a1a556b4d71062df0872d46 *data/statfaculty.R 909e7d4304608758a13bb07f2b365be0 *inst/NEWS.Rd 7652b6f9694ee9fcb91c95c683d72878 *inst/doc/diptest-issues.R f08b9057fe89204d8ba200d5e743c688 *inst/doc/diptest-issues.Rnw 25be713dffe8a545fa754daa479de166 *inst/doc/diptest-issues.pdf 5d29fc6a0de189f54eb7d029105a2416 *inst/doc/hist-D11.rda 04e348f7ca28fa7c5d6a3e60fe51c0f1 *inst/extraData/qDiptab.rds 9d139c9436c9a28146f56943268e4522 *man/dip.Rd 212f693484712c1e47c692a184c6e781 *man/dip.test.Rd ab0b9d226b6cfdae34f946333afd4a4a *man/exHartigan.Rd 138e68b2a4629238259c0672b84e7f99 *man/plot.dip.Rd 18ec7d2e14801719f833d26431a0ccc0 *man/qDiptab.Rd a500c43a3efa88aea2c2ae6ca716856b *man/statfaculty.Rd efe57b442003fa7fdbd2add3db77fc47 *src/dip.c de2612bbd44bff04c6cc3afb38281fe6 *tests/ex1.R e671062340e4db49592df9ac73acf18a *tests/ex1.Rout.save aed61c181a8fca1547c0b63234c06fbb *tests/mechler-ex.R ec7155d93fb477b8003491a4a9c05f55 *tests/mechler-ex.Rout.save 552400127794e45e18454ffdc84ecf43 *tests/sim1.R 6b96f05babbc4358103c1b6ccaec1bdf *tests/sim1.Rout.save f08b9057fe89204d8ba200d5e743c688 *vignettes/diptest-issues.Rnw a5f57ba90e25afe0cbcc74feffaadcd1 *vignettes/diptest.bib 6fb477b22fca2a12c156ae27aa81a7de *vignettes/myVignette.sty diptest/inst/0000755000176200001440000000000014044171400012676 5ustar liggesusersdiptest/inst/extraData/0000755000176200001440000000000013761214237014626 5ustar liggesusersdiptest/inst/extraData/qDiptab.rds0000644000176200001440000001032713761214237016727 0ustar liggesusers 8U[u E!L݄CJ* R2f&CdH2\d+@ Ӫ* HEߏ繴 |x##eg*F=Nzh3FE/fu\gȺA^V»ѝ$!G\iZRR2\u{5A'zv &E9NsOFVQ A5=%jCdkMU?DFszd. L#E;s ?v㹣-#.GvltzK"`tO(|QM6K^9{׺WAш6(*S|UZu7!GLy9dl iC'd-<7jr-ھ2Lw/Sk'xWrPRa]^,ߧ 59qleZTv098݋Az7c(Hߌl^ ,bH.g?PE; u%2)9u%e곇qB`٭YOpO)W [`YyGF8MBs)PUZYp}a\f#OΊ!npa!id #V#Awe`25_xzG~(ݨSmu7?GMޛ;VdTeZo~M@tW '+8{P8ߤ$c-&Luܼm;gG|^q$;jM\2. b2(|sl-8-Г8aSR[?!FLU:4 >YP>U2x߲}(9uTw~kIJZG |!^I7n~8m8 E!l5H4s59?D,.˹gyEO.|^l<9fFevhTOLG_CS)Tmz4wazy[+3_yPi|fuFuH8zkoLUPX?^ڵ2Q >*2_O֞ArCDeO3sr*7T׈4֩6o=Pb T1բ)vfvuޟhIi 9 M&qnG$*+>rzVfԓ ]oFlq{(0(JRО,6!/dێk!ŖmTY" sbA7 qU\W|<K d`6L$RZ/ZX8g}֬<˞{D/}Ihh,:#hj jmZi{3-b4"^D}" HyѬST,*FZ-#9˞mPp@.NDgҪ5[֦057{S.ұC4o]%&x ڨ9{촾;D.>~m5:\S=d'fG/ xnΛ6?5\-v*ށrU۰g# NH\EBɲ$nLGq=UJY:m>5\q;E{-禛LoVMΗzD%Ay1ƕ1RuhM|6H?S{R_%8K"Ըth=)i$PbƳeͬ.xHEho7/b"A`@P[wECy!=b'_Gqt"q>Bι k̋_ wwJd$RG:Za|ez\:~5ts+ TAgw361l.G Mb,Z4|8/6(q>YZm(~嫽cmP 9YMːX99͜W٥E<T8|q])ϑmKqZW~vYU@۔Xj$WK ::D"5{Zz}Myݛ ]SdO hݞ=:,hUc )((uRHR N!סwgU0tlt@3Z7w>,9,9 l,s`s*j.Q5 3qr]&C{ў)XAP^!Տ3zbl)FN/8PJC~+74g-[ I2PYaCʹ$+$w4|\IN匴lV%`뵺g 0BΟ5v$G5z;G&Сr` Pg-A=7խxA=}MΨlnFӭ:#)v]mQx$. +wyze\%+I33丹Ik@qBPt<$̈́q ':qy}5ڧUŸBJvкۄ|4e1%3*/Ձn>;kZ fQNCאoy [-"QR| xrME LpuУ)/M:{φsRStu5BwU.ޫ| >86k&h&)(]@е/ve5ny)eBHwY2"Ғkp~hނM.$uHZSLkw)o G E1ZXմL9"?AǤ \5):فN5c[]Z(h=x&@JC:70.?{;y;"l燵$Çs<.6_ pY1=e@L^B,JoiH۰넎nfq2srY8{_qAyTAu6}Q-#(ا(~d~/y~__wP^V +‹B//K ?Q'n4S*?Q'nyMJ/aJ _Ţ/\RT\4/!k,1~H+a ڦCt o#hdiptest/inst/doc/0000755000176200001440000000000014044171433013451 5ustar liggesusersdiptest/inst/doc/diptest-issues.R0000644000176200001440000001133114044171433016560 0ustar liggesusers### R code from vignette source 'diptest-issues.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", # <- "yuck!" - required by JSS continue=" ") set.seed(47) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") ## In order to save() and load() expensive results thisDir <- system.file('doc', package='diptest') xtraDir <- if(Sys.getenv("USER") == "maechler") "~/R/Pkgs/diptest/stuff" else thisDir res1.file <- file.path(thisDir, "aggr_results.Rdata") ################################################### ### code chunk number 2: diagnose-lib ################################################### if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) ################################################### ### code chunk number 3: dip_n-is-5 ################################################### getOption("SweaveHooks")[["fig"]]() require("diptest") # after installing it .. D5 <- replicate(10000, dip(runif(5))) hist(D5, breaks=128, main = "Histogram of replicate(10'000, dip(runif(5))))") ################################################### ### code chunk number 4: dip_n-is-8 ################################################### getOption("SweaveHooks")[["fig"]]() D8 <- replicate(10000, dip(runif(8))) hist(D8, breaks=128, main = "Histogram of replicate(10'000, dip(runif(8))))") ################################################### ### code chunk number 5: sim--n-eq-11 (eval = FALSE) ################################################### ## set.seed(11) ## n <- 11 ## B.s11 <- 500000 ## D11 <- replicate(B.s11, dip(runif(n))) ################################################### ### code chunk number 6: 2nd-small-sample-phenomen--n-eq-11 ################################################### if(file.exists(ff <- file.path(thisDir, "hist-D11.rda"))) { load(ff) } else { ## takes a few minutes set.seed(11) n <- 11 B.s11 <- 500000 D11 <- replicate(B.s11, dip(runif(n))) hD11 <- hist(D11, breaks=1e-6+(63:298)/(2*11*64), plot=FALSE) save(hD11, n, B.s11, file= ff) } ################################################### ### code chunk number 7: 2nd-small-sample-phenomen--n-eq-11 ################################################### getOption("SweaveHooks")[["fig"]]() B.str <- format(B.s11, sci=FALSE, big.mark="'") plot(hD11, main = "", ## main = sprintf("Histogram of replicate(%s, dip(runif(%d)))", B.str, n), border=NA, col="dark gray", xlab = substitute("Dip" ~~ D[.N.](U(group("[",list(0,1),"]"))), list(.N. = n))) title(xlab= substitute(B == .B.SIM. ~ "replicates", list(.B.SIM. = B.str)), adj = .88) lcol <- adjustcolor("orange4", 0.4) abline(v = (1:3)/(2*n), col=lcol, lty=3, lwd=2) axis(1, pos=0, at = (1:3)/(2*n), labels = expression(1/22, 2/22, 3/22), col=lcol, col.axis=lcol) ################################################### ### code chunk number 8: sqrt-n-qdip ################################################### getOption("SweaveHooks")[["fig"]]() data(qDiptab) dnqd <- dimnames(qDiptab) (nn. <- as.integer(dnqd[["n"]])) matplot(nn., qDiptab*sqrt(nn.), type ="o", pch=1, cex = 0.4, log="x", xlab="n [log scaled]", ylab = expression(sqrt(n) %*% q[D[n]])) ## Note that 1/2n is the first possible value (with finite mass),, ## clearly visible for (very) small n: lines(nn., sqrt(nn.)/(2*nn.), col=adjustcolor("yellow2",0.5), lwd=3) P.p <- as.numeric(print(noquote(dnqd[["Pr"]]))) ## Now look at one well known data set: D <- dip(x <- faithful$waiting) n <- length(x) points(n, sqrt(n)*D, pch=13, cex=2, col= adjustcolor("blue2",.5), lwd=2) ## a simulated (approximate) $p$-value for D is mean(D <= replicate(10000, dip(runif(n)))) ## ~ 0.002 ################################################### ### code chunk number 9: interpolate-dip-table ################################################### ## We are in this interval: n0 <- nn.[i.n <- findInterval(n, nn.)] n1 <- nn.[i.n +1] ; c(n0, n1) f.n <- (n - n0)/(n1 - n0)# in [0, 1] ## Now "find" y-interval: y.0 <- sqrt(n0)* qDiptab[i.n ,] y.1 <- sqrt(n1)* qDiptab[i.n+1,] (Pval <- 1 - approx(y.0 + f.n*(y.1 - y.0), P.p, xout = sqrt(n) * D)[["y"]]) ## 0.018095 ################################################### ### code chunk number 10: statfac-dip.test ################################################### data(statfaculty) dip.test(statfaculty) ################################################### ### code chunk number 11: sessionInfo ################################################### toLatex(sessionInfo()) diptest/inst/doc/diptest-issues.pdf0000644000176200001440000036242314044171433017143 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3681 /Filter /FlateDecode /N 57 /First 461 >> stream x[ms~m;Z$@;;&MRIڦ;@lskp?#!mf8qs#)#G8E .<#E$ m[‰؞ '868py.sA({|> WI(QB>'Cdp1_*:.PU8baPK@ c>$$4a3-h$׍&@mAHH Ǡ &Bd< Ä Hh"9 :Od@$3lL>dtt|h fHdna߁dn[~0&A@OЎ}( 3Uu? 뛫+%boOyv,(!Op- 0C7J-~_,%W'=ʧd %-Pv.&4< {Q?p zAΗqzFjܿQ #uNUjH'q:ixs" d\'{ F;B AGQ"(T]p&S{=X@(@/w'y8d5-~, ^e Z[zFZ$EJz9(~s+-ӎgL'ee;SȪ\xR`x&.|1pP2V)Vཏc+ | WzTe"5usppWD( e8F0Fi*RP+5R5: bhNyk:Za_-cQ gV"hNOE9wh?<=rσ|vES! hx I@Ձ:ze6bXWgvN.Ev,xR?e\hIlBlE>5破p+ dV%}e^[~MmC]OV &`̈́`bGùsLtP  $&}['RYA-Z߆\Q1=_bdn.޽;1x{&iL?V' 5{3U׶9]?M?- :'*ʯl6oVh0kK\aXtPysĚ("G6m#\pm7Q-8Σt:3GTx=z{u <,emw>|{ &"!h:t&|_YOLf5'dv0vahv]jcZ$ATRgL LpSR14뷂y]F65sVL({vX.Q1iR%XsX+ivZ*$"ڔlۮӍΫmځ o>Z89]d6Nmۭxi[jiQɃ#h {WUj]").Ljԍo59qQN @@fFeq`|.xWf(j:ZεfBʊ+O؇'\A'x FTffwA^}*mlX꘠VTZ:O ȳKD<WV 3xeLE|T/%F-Z[ߗ)udmOaB7tX͒IsmtfBvUudrӭ)]_}GroPDa9iXSZ۾V~5Dk_nwZl3Q]>)f]#lEyOBHrQuhkƀA=n= u~aU1XB';eV[ktuied>.[Ik]FטR7kW]_4zr 3]t{ f};.O5q8368kW-֔Ni`]kSII74QG,x% xK{zo׈<8LN3-~L~zt#ݶFM6žI;1]H,Q\ij&*y1p_1dv?E쌬ͻÛ_߄0AswF_۳C:L&| ƤrBYI3b}Yv_ʠoMeMjߝL[ĺJh2ơ-/a6Qkyh 6"ϯm+]c`x\mO%M҄/ zu(֓7jKVN6k(6jPnZ޼T|rreSd)աs4 m>}+J-EVgrl}ÝUsĈN}p-ߌ% c=b mߛBs/-򯠖'(j7iIxaF՛w0s UiH"iiH}}Yy,[05Owk-hҒlY.s޵'T- VTgKߵ@0 H5ң}6x.O\7noT?z%)v\7X?T[qЫ?>r8=՘!")'*lN=d}Ѵ SGOU4/C),endstream endobj 59 0 obj << /Subtype /XML /Type /Metadata /Length 1528 >> stream GPL Ghostscript 9.53.3 MPFR, Abitrary Precision, Multiple Precision Floating-Point, R 2021-05-04T09:09:15+02:00 2021-05-04T09:09:15+02:00 LaTeX with hyperref package Dip Test Distributions, P-values, and other ExplorationsMartin Mächler endstream endobj 60 0 obj << /Type /ObjStm /Length 2712 /Filter /FlateDecode /N 57 /First 465 >> stream xZYs8~_V"ɉl偖i5(O s'%IM4#Lz.0 #]K9Ԋp#p 5>  }"tqP.QD8a?#d.\K"QD~=AW1Dy DPw}ЙIEpZya_30C .T` 6(/4`Vdžip `PB Jha ` a ԃQ×L:k tȂUeWBUNGP;!q\בd+.,L಼GU!ys4{"=!9Y?oM٦#[j0ݕ-e{%3:A2KY= \񳺀9j"u-]`ђD ɢuI- ]PoyDhGWEJN(Y(4Jox}Uj+Т NW%f6Gʖ$eyAYlX͢}6t"P:hrJ#G1(`G/ C&Y, !0zW0]7t==MftEsϳrky У8x0 YHύ zxv!Y,N{M9E AVn6m8ϋV(@0b,fQdM|H]JzP3*Xϧ Oi&$oOlK4P^cBט1X%~L"6mA# 1wW'diasNie߅mD}D]fѢT 3pK3DeM}Ӌ?.P`n,- o;գUF{YxGC%&m+xC>}C7HR7cz9Hj7 Sg:aQiWl AdIkzJhJpvե`;# G/.//HK;`dv{Y~ac؅4[X7#LK͟&!D0A& J1;L1vn$c>@4 2Zu`/XqQֶxૄJhGUW& {2_9x!<q,Z;Xk9;?+Um5ǕrxW':&@AW̅t0ĄpNJ:*:f#e xG'amVespa8lxJIa֛y/Ki:<ȝbwk-$̚J,G EҖ`}=6N lfjK<+ *r<2U^W@Ѫ VJ{WA^ٖk˶xe]_awLx`~UVNZr(&W,=p枧VmO~`痪{u<ԡnOg"X1[=<;RMeM@ 3aVkxc36v%?Vk\D?r[`hϼكݏN>WX5#e : H= -1*t/7(lŦk9\4mYU1{_mwO7G\^f~_UMQO&-FmI= b/kk!S:ms/]d\mu|:HC~z6iT w+[/,zO+*mzeA@ff,_76W]gƿwr1vc.t+BH|Dнxګ16@k̍a#c ds\S@Qڃ/3#sPZ 7EUWe?!+7:k :;0!b:Σex11ft+lez^iD@~sOZgHqu*OXZ> stream xZKwsdW{BxEz7IԱӴv#C!GQC]CP~$ ⻯OӆiCI34quXMr6yRbq)]M#b*f:)4~zff7J78fA` [ 6izڡ5(ϺIb;ͺ\dxҰgVcv1ͳv}i5AIY'BrӒI m }v2~%흉<  _ h}BSltfM j=C = p QυQ\"q0lowϠ)\бMAZWm 6Ѫ:\\6 ဴ℈N !X`SWG n\yLt{ްY^C1INçnV!"jݻ1B@}.3OE PRPKU}A934&o(7ʪ5Zz>n4P[yin:(P,٘ڛ4!Gx8j<ĸ,+67CG%{s$^~lX6U)-^|g 4ܙabLRDѭt k!qx/}΂58mw6*kZ1AAG7B@$+”8n5EȋƦ%vMʠ@evV kj *]rT%W?TBְGxT2H`4Q]6ȆGy} Бws'Hn5kKhL ő9vdDKӝЯ9{X2B}}I = ϢB9 %B69~QG:i47%\" &0P)&nS`).JIT 0C>"1וvJӊw  esЏ TW'8NkF ²[\qXFu60]C;p?c_! E %.!Qw">A8!kN6\*lk@T<2J<khOǼ\؆;;$7Lr^AM7N[>ˇ~emUV9mglToMn7|?E^B~3t~AڢKXmG2|U}Sw9~Ns!EU|Ⱥ>FV8Ɖ J&Y,ًZVt|Tlҵ]9i]n4DOz9A7- h<"׋YA>hJihuD4H1 "RGE`[m; ="+QJ߯G;I+/ kf%6~JFMƱ>RD*/5ۣC '\^o]BVLN3iA3t:T\$#"Xa}09k71ɡ[Kt4ާiwa*d٪{W= Onٞ.2Q̢hMy$R (?2 G_l%u1m7*@l*XC`esK(<,ɄnȬ1: -/0CĽTq>z!ϯUa HxE !.CJ*qEV sW]Lt m*FITEo[w9B#ҁ'=pyVc}C֞TdF~7FT3@Egk Ъ5\iHq;tCHⰣn( ?0>VXEܻ.B4D#:E#njrG2#D8M\v'g I%^G&߈rwTV/>pd'xTEZ֕b4dlo"a}ۂU -ߠЎ9.T7foh2"Pd %eb ?톟-qق|:jF@Y Uo{Y: V73(PHLԃc<qlHf$uX;.x 5*xl '^c`䁓I_h9z"Zf9Hq} ^qj"úۯ<6=~J-WqCP\`zMd{4 BH\qA{\yFtqR t(qTAF!kcHwqhObs->)RZbkd!np'}7O<8y#X>)*ޗ aD> stream xYKsdU97JUϾ)v>1M殙1AtmTUQg$0 o8ڑ4w# 8sЩi}iumqP̒ ߕ!?Lm`- 䪔F^ *r>iRjx T BqG3.ԑq>;?_tpW{?9ﯮYRH @N,PE,P? T%*F3i57]C1u%۰7vp 2B+3 crQ͈l0u-x&3n.k_|/ Qo9=HY"VZF}nʦa*fސ!GJ_lUo5zG&=zuZIQzw0:3˩ )ڐ *SxA,NnJ5yc?oQ*_!C)9*])e9Ig7U#3Nď=a*V*}[aSC:'G*w1C%O)Ng) U:Y4#0i_;xyk Cw9dQ6sίK+n`WG)(E*TH=J%q%Uz ψ!vA^[HwS##iD z6SuZ<6vxƜW0K+*+x^htFQ"ێH<|˛t"O /T!~[rbw/] o~ &E*0蟻e^^{vd y YWiۥ֐/*WT^N~D`eD >RŃ#qSflz5_V7D՞^$,ժcC7!M"7oHp\#ctwקLDgԣ,5T$KP -+@p JS7 qξ{늫Big:QLw`6YU$P)`/]+|(cy ƦSku-DG ؑA|= URzO! / ̔P=ZX R2xj)QƳ+c+~{ TZ "Vn1,]<2heO FԸXԶ(.+մo[IP:dƑ0sh܂/M]ߔ9d/}P< JdW6fuOӵ'TX C1P qM 59F9Zx! ENu=۴骓Eȳ(Ҵvg3=iK9,]G7,1moD~f\ 4dcY56wtJohʝ_wRFZ;˛= wQB̖o lpNX^sm<ӍS7x+H,׋|:+>V0yƔ}:Ak6Q>MG )7endstream endobj 120 0 obj << /Filter /FlateDecode /Length 6470 >> stream x\ߏu~ߧH>6/-t'ߤSHh U^kWu|we}3C^I6;{-}_I'c=}u1"v^qcPfbЗOlFmTӫgo.JId^Ӥp}5?<O 3M!,p_=գrfЫSiiT2Hgm-iFZ| QV<^ФM\la'qO53(<~qk!;ؾٽtw?bbfBɐ\G+L(#SVP~RH) PhUH4cڎtP0K {g5?71 SS.Gk ĺ?gfZ)iU('n򤔲pu[I%%2e˃Jfu!TqmY,>#L cIﻗοi2Ȯ9gFn%e )xP yO|6ֶo0dI0ͭ%8^n+dG8ۣ֝wEgە]%w,Ť qU /t.:j)XXSχ̒e4G@NAsC@@tb\;G &)@Džc@RrwvcRQ)Mh;(VQ&ADž0KB]$ >It "B F=6~08MChr\: i Z@trR-mh["9x0Ҭh іֆ a8yj [pJ*A,eӋ4G+DZxK(wiB@L"D0tWYkdHoҔX<۔ն@th3tBb i[BSҮI3݇ e`C4%Ky{-~펔S8p WHBxCHf%!"Љy`UnBJ7 PΚ,V S!FN<ԝAf-p7Օ ,647:NB7BAr]暀fu~knG cfqݑ n hIy(ǽQ)d/BC譊հd*i8;E`Tɧ5Gjzla]fqZ3UH1fQj|$o+eP:erx<Tp rp}RusMl;T=!}ګom;t;D2 n; Ϫo[ΊGb"Imo!gm吳&sjO?pq{j>;+y*¡pP&D&Clg_tQ؟)١GLIybz& ZYyWm$2~6,4k6s U`]X`G"pκXòXY|=x?׿4C>π΀-NE)zg?3߾zۇxAm~B=X<)^Nkn+'9JIu4Z7TVAMãFY/.=Ի0__8I G^e. %^JsxlǠ5χb ‡q6U0kt(:{?aFQ c0&=p=ܬ ,TДt镫x#gyx{2 z8M's,OK]<fg܌im񞞼oV}ja]^rQ~% Աj^+K0YqOhe{dcZ( Ac{7I\a"MwY.a}7++| w0+*e׵crPnF[iD;!aӌ{_jr%9Ƌ~ ,o>`1#5Xi!Zwsgnܜ 6Zq-!rONqtT{]uO5/T+؞8y|6gAgq3}TzgDð2Z~s&)`MrVT~|SµOSÓe&3rk*yWm) IC)2)4Q)?̀MK̘u3ƓĜ^ &{Ǻߕq%NV`HVKЫ>emg"W%j)W]0}|{f`fW}c⁉%FxK)-\;N%Y Jpz{<M2mߓ{#`K)x{In⇳.z<âe\;u@;ß|TZx8eM_-=iIJ%枖U@OAv-c>$UPyUr na՗᛼Zӳ82u&JT=E71Os Һ4JlL__k͎ M,᳾Bo;b2X&J8h ɓl@7ɂ*íu8+~fBmO*.v]l/7Uׅ8hIuΈSjVsQ+aG<͒Xa. 2H.&6\8PM+y(%m兵m8sji A~LE0{?g!IRW]}̏4Z;F"dUAgPV%z٘5a)+_L=MCl ~qS2K2:\`}ӡ뺡_.]OTSD>lϢ͌Gn[EmJ9&x >yn0V'fŽ zC)žL;yC> ?'h2~<<޼:v_vz1j2]>ch,%z%@6_HKjI#f( LDm;X$\iXp1rz*QM%fAvb7*Że[4Ami,QYĺGAH/SշaW2̵K},=.i w}CD1SWQDmߝMhPLgӌW@f6*Xtb Ǻ_,GK{ޱRCrYnAtN]/oQ?*7bH;^xflU}I4MhwKGʛGH2{2nu9Š3~Mg?Eoz;d&^{[?zH*1B;ƻκ_8f6]7{0q;洤[+6lYVV'tWj))%N67 7^PODɻ0g-eTjM=INTlP sYu.+d),ɇݯۉIJ"?h>]zux<<Clx<|OwW7PE ԫaضo0__ǎ=o^$B_.GCendstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4847 >> stream xXy\WDDC,!VdL\q(*ƵAe_QYlC첈l"K#t㒇g75&F I4fywPUw2Ƣ#-_:,;t ‚K&N2~P9s<,2~eB X:[k2 f2׎a;w;Oqs:a  豟>hf?Ʉ*򩻚-3|݃;ir$]T$֋e5hyh-+1LNdƴĎطO8cur&(`{g?ҦSG!, ;^Z>>5cP$Fh0,]T+E!N/$D5#. Cg.^$,]M!200-=œgGrL$#/d,YA+3Hșm;)hm% 'Aۄs,Aij;\Vi 8+"vd3f' ^ *MbY#7]MH2{iwZ58a&͋'G\tULX=NBtS8K ;MPnEeJ(q'yg]Uzwr-oS.SRcĩ_ ќqoEYmcz5Z-k17XT).c9rWYC(Aypz KbE a!s_ )qڤB ?B+a8xOM2ɘM Mͽ ;„ģԽi elh 2 PxT8V|< Z:ҠL=9Ú3Gyp C6o/vIHhJ^&`0l3& y(\V[ Sf+wB[ qFӃvfbAkaftGB'P#IژBjđJi|M,MxOr,/u a'*E_{ݶQ2p,,CQt,HϺ þ\Y)5VH?%6*K`< `}'œX%𮍮*i(ٛ+ˡ;fd ݐL-GUz_PChUdAxaA|  QNOy!Kf9t=8IPPCQS'%tic@KtE!>?cэR=:vV; U:(͡LCf Z8Yz4;>k 4V+isF )'ó2[T\T\xu݅&8*#հ-:7x XgrD8{/ԯ_4.{ v1pΔ:fQP;)Gl/dQjLG] Y8Os j00J\aqEȤI-A !b!.ÐZ 1$$8B{o0@OϺ6b zYJ.pA|^$hv.DpKhtI [Qp=f% iyeO8LJq^4Iy'$@$hъ'(5(P+`^+9ZnZQfkOQfw"BPʉRY~v(.# #P.VwsH@WT:N|)$%R2-y)%"˛_! )ZN!6j*q&OG g*/̂|{?'2F Fi⥌2hhV)e+gc˨vh"}ʁDa%tzt |Fm6GUUX^dHI6ɏ:v,D ;\}g1pp߬%cqqbÕPBOxztF#nDڰ D-?(~ED{ -_5f|x&b_"i@_УǸiS zCxT;o߯:uL+u[㤢%.WFRъHoiRd,ko8C 4qwXz#kF6ǽ(>8،K̸Q]'E6Wj` DB\䴸|6;y97K ,^CJc+]_{I־iQPe0Vh6r=mkm.,3r7)G$s5G+!lݯLՑtA4sBm"5I\B^|uF ey&ǫ@N&}o>W6lc nl4Hm$4HGKIP.[ a2".R+N@[Fa,3XF+fEtD" D QF/v6UkuVΟbl:󾲚Ӧtt[z p-s^7G"!$2>VhǽLwئF}b~Хѿ81)ɤo+ |ݞ,o9VutY|ݦL|2{!!ɛ|Tvvbd]b h!ۛG  a4K65P5Vvwh'kiST(3|-oM0cg-21 y8J ݶ`Z,o'^ΔÇp)9XI-f8Oհ1wS֐bH.H 9Ԝ,!/k&0 ]awf76~WoH`i_<'v<Gb+Yo;ᠶsۣ2 [#@Z"OO2P!<]Zm8\@L&nq+dUNpB>Z\!; `^&LO}~6?Yi8TLcZW"+K\%^O+iEQU;r=!vD.ibgck,y;‹'V՝>!`﮽Tm|H_vǞ/{H\H$K~e\2UNSn=DV "`qu#x–F@Zw*=$dj/B9n/d+2*rw! 4dEqH;EJ&6OƭGsf+ ,քYUiiiԬ֦y ٙit rA~endstream endobj 122 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7933 >> stream xywXT2 j`oш%hX*EzG@`(ì:0c7&jLbX17$&f|o}g׻z׻PF@ 0]65rd[p?SK~nĿ'}H4y`+CC_!5>=||)z;9FEAQ!;,M:}d=-zJWwP-VNY3bm`$yb|`E& %vlmM#}@QU&͋,^4tY+#]Wt[&zZu^޶;}7d.S-L>cg=gGcƎ8~Bg;El9(j5M>PXʎGS)jHm&Q(k}j3LmSSj)5ZFYR˩tj%5I>Pkٔ?ՏOR52(15PCHʌRF95F DM1՛z@]QTJ`4ϨL8ZXb<8]J%:ϸ`+mߌ~=o\8iAU BwWx 9lRyйCmz U=70Þ w{X36Wf!KXmdňvzѭclJQ}Df)pE6%~&Ҕ"%w A?k4!j:WFf&DduFvэ<Hp&h7:Sdt y\3uC8z#jhx_clOzG5̯!7g'o I.D Z.C2r+lY[&]w8AUgla/ֵ9 ܵ~~. !--YExKC6%!_Wr@p<J3P\VcNgHmc&8J6un(mzVo +H2쫫-x$uZ"#MEpeh -, 4RL`.]>%/ =¡ÄiѣQz3qUu>H6܆a-]WbATs1+g;e+BAoWYV*4e2hQ3lԉK|ٮvy PeXiXub0Q&+AS >U&$*=j`qMvŁeu5/bM]꽘EC7yϟuNVYJO&dXJGCr^Z]Vj4)-;zHUA>$.RA?W>lv?):):ucSXoi"~+g_|N'!aWf{eɁ"3>%>$KHġՑ\#J<=@%gCi+] 84ã vFH5bB*NV|x[^\?It…5y*N䭴"񫢻(D /I_A=P:nQZj]ZdIR1B{,gl]f=+IV=-ݿ4HχO\e-io(nx==kü.˪;˔ylwșNϩ Fp2>VgI`46`'$l)6FuH0nRR@j $!]QFc$͌դy3'=ҜʒWՆ-R:@8\Gp-x2fޣ:c Fy:6m`# 1'T7ċw:`uæ׿c٤eutK!\fk/1Tq+a]pb0QP@ZJT#RUʉmhe(v)QyJ>1ͻ)㐯E7iF6ɀ&3'(7 @k@FZz+h (MP:Ӻ[MMIoR.Q_#d#83bܧ![v=2b72 XN[imCs2 ^ 0Ǡh9>u VBiD!a1 I*>)E7F 2B+pEfbNěo'jp(vLLyX#9@&EV=[Twp*a&NM-HˎJX3_:D04r5#. 2uP< 9n].-JN] ?(d䂢uTXIj& ͪ=ioXb+:ChCݎh ϱhcT ҭZ:ӍZ7 o4Zi6N~>=*5-2ȍ2P7r& AcpG܈6!PFFzJ2j$)KxH<[4Bl='WzMaa~7JE=rUWzt3gZv##NUMںUZJXb!ҥ榥̫n?QbP7) \ ŷRHKA1S8,2<ߩ喳gX_P} ǂ ISDOG}$ $Hcfh&uTeWM8&4d ?ƃ>?ObwhkHMRYԠ// P%G RϟM)%x[)qAvҢ^>j)(#.įyh󐪣TyC&њw0A2,=?e|/!?O'Θ!:q|ߜ.+H($R}&?5!#PD"\/QibE܃DWO8tDXhˮ=7؏htv0l=r`Ht:lI*$1(HG3N.HpW nQh\=T? кsʋ&z5^ϩ!R^~ A4~'; Պ\UTU,7)jU4'^d1z7yɾ 0 d'^퉰$MJb")m 5Ƞ:N c>M: !al2Q&p_xvY7WwdKaz"A.xWex2݈h%#'vtf}0 |4Ghbc8e͸ O QGIg%nbz|o:ýC{Am$Qq„G-*b?eδ%<ԾDv/Ŀu ɳX-޿) h>"CdtVYTt0nܡJhWdĴKJG:+\Y1׻jÇMYcg>B+uwfs{j 5a-!5HVGpPGUeIys` ]R)kۘQJxLZ<5ELtA|qnYV%cJA*]!IàuEzrFg{52O, dz䋠u\M-1>BwJ"+%̦G@[,ㅴ,0`i0FhH۫2K$êwDU[^g}C%Z]'W>V_h^7k&otxS&V"AEۺZd*>ukFM8k٧oRO_ޝ'Ƴ"8|ś XqlQ7}cWeS܎+^ ɺ8em (eV&NCGD;&=hfQ=P i 0xpĎdD-ڟ0?wz$5IѪ0eFke\9Adl<ѱ#p)F:Zd6_WjQ;Sw]"jUDu$s%Hw_;% V>o~A?z#[h<1#Q -Ϡt=>Ios! `_0Kۄ<Z9aE:N-MD{>szg8?הҊq!\#gZ:L鵢 f4??LUC^2)M'vI >NI=砺k0ox]<,T@n:L^Ғ2˗O})ȱCM&@!h >Cvfv?4~ʈg#;~`M7FqhU >;ӥ}&ib*ME4U2;?iOcBX9떦Ƨ:xyV)&,`_KP{ MgŹpF!JVY-\XTjuvT(T*He3R3A!8P  Q-pz]Df˖:S鞀}%xJOIjCBCBkkjYCx+R o&m:$y9Ԅ%O8H!s ss,k BХ< 9D vv^ J3@Zaz]/ JIO^{T9h(]m8EC46!nJn]/8l:mҔ,LlYp`cp8Cݵp/!LjN~_'peW9zQes`6 H4qW"(K!?kK[*d9 4aUВuNV3E$D-Y_PzQh.__gL)p-ן8>35 Rv%' W/T^8 /̑.M>fw% -QIiRn:wΑ?6ϳ_TnhBAѕO4 4c [}{TŽMd6 |t;kr]qGrǮ4r&2>m}e*I Id$0,(a5-/ pvYXr[֐`T<Hlh(LJO0[͑p̘Dav/t0Ce3 bԊ0Dd©#ы9 Vee+2z6 m!%k"tH#?|$f $ϜŢP' CWH{Q@jt22qKr"(wؖXM5 '@R  0KLgN'A-;S`3xmS…*V7D_UN&WHg^HL0RXC I>%B!L"K4!4ɋV+8"kԛEoօ$?zqc3q' O ynVD llsV.uR>6C]4ɝ5Ǒ!IQ~ȣugEL_4; W'N7jJƩՑ͋o Gi?/,[mm{RB s7l\VtJ$V 7ΙR۹+hGay9ܯ'R༊h qދSP$Hϧorraݜ\a!};_li=W8nԶA.( ,o9X)3P+w סbik۾_21߮Dfu_wUJDe.⊈}ѧ/|51mXُp\0:i[p8ϸk6c/<$Y ` }O jaAwck#̗]찧xLX`MY`&ϞDgtkn4PE[BHuzDsBt'KH./Zh2 } @ zI*,a:v6B` xÕdkd:!˷"nQ?{db4EjB ieQg选^40Ezjfϑ<{#!0t2OyH: yΏM.dSRQR+Wh?={ ~0Nδ([ k x,E5E%( /S'z_6w ѩ5hշh35Z6#3o?w&endstream endobj 123 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2922 >> stream xV PwRm]:[azG<3DC!B$ABH#A ˪h{:V{mεí3EjosI&>6{`0z0X`ڠ9GyIa-gĩoc wl[.?̲P(k!}c2i|/-='`ڵ/џ;$&3DAryA^@` x45 35 2p@TD]âDoa{ S(K+'%"ðXv "H, ;`1N,{ ^va{ X({3gg)fޙ=5cƷMs57ojemE ~( <({-q~1ԫulHbiZ8R(S7&1,\]j7 pmJPH.M4VU־-Ez//8A^ *0tN MUPGR/R6B ?M r2|]d>BϲJPAya W.:]Vl8݇f~3HP r$IEi +:H]\Imr4\o&zhtrcmn|πljC$)1ߒ6 H,òѬkgBn j7C?B#6Z#Bzؐ&< xrQ7bz .>.uȃ̐6gF=&DD\W RU&I)*5ZN Xjnl!pBCDYa0YMfwE ىV \q jZH.%<\qb t pBj`=U>᯾| {lJ _)Wբ' 0- KkPUJuiq✻'GiϢE瘾hJ8yKl#eJ!(p]50M+5qR1(/ܲ278&%ƌp^_ddH{=ߍ M{=Gs<(:&[J"HҶ Ucs ͪBBՠ#)t6 t*Ijʤ Ĵ'clƕY\h̩P?#U&єe+ |H+uMd?i Mr %QejG7 o$Ft*P=xfde+d2ZY fjj 1Gj<\w&{P0WLZmEHς'!*^ kSLjZq(Γ#-K]rx꺫.JR$l%?H_Souh]DЪմtN1 *fs* K5֑h%"ќ;Tt)"ڛrs]DWZ*ӁS͇h8} ґ.Q i)!mLr"yª&ۀy-o>s 8pA,I)4:^%̈( EQKr9t5F^[scKRɜ=-a@6TY*]bSH$Hnn%݀;n 3МsHH7i&M<j TV!Z$*F#".(]?h.z.{QʎV"Mw4vh4E_KЙF0 1Jv8q%'/$-G \VHv7L4D y{| GdF:cjQj'}3w׮QxK6*m2V$/+EˮYZUY.Mt8JUL(UQK_ѶZH1h !i8ՎB6&Bvsmsl |h*\ 6:Bت^+r8hb"Z}PߧT B%*$fWz.m<(Lnhvىڎ`0s݅Cxz>Bbʫq[G&> *Ay /'~l}wv>1ovdd\4Ў_=&ZY_3ð$endstream endobj 124 0 obj << /Filter /FlateDecode /Length 272 >> stream x]1n0 EwB7X\%C> stream xV{te4md&*3`auQDDA+ JJ6)MHMӼ3/&ͳowSD|\ϺeqC/e8~Zݳ9{rNo;.#x<''K9k]ߐ][Z8vkQ^^쾸 ~.^K5% X>|M$!1}IMG=w T;x[ʟVk 9j/.|x|$C+Y@V+W)ʕKL $/4\2WddHw$*$5+Mi %7۔?sU 4U3-fRvzxH!9D* XAl%VEZb1L@L%ӈ0/DOnJYl6V=h,IQ 7 ѣE[Wd HBHf J4usٜjs:6/1z lwe!J>3 ASɵ PW[ Ͼ3gT,.68MN(#+PEl+:tҷKn19j~E=79@bt/lj>!djffY*臯!U@zqk6GѼ-~ӣ^ gbv2߹GvMZ\=s1h.zaIqJz/0@z4BVG[鰲#U @-WF ѯZqo7Ax!$((*np:CtˀN#2f:Ko>H P&ڊ~_4c8lT A82͈{ &͜C3'aHpM) hXMxaҜzM8pBHĢ?͸boq+Y ૪=ܢ/ʕ @vocV 贕۩'@.A^WA#MmV,Sɧz ic-67U8)a"Oc !V;toW5 -o|zԒYKb(&+H~ΗDYORnj J+vA\*)+ٱĮO}hX <|Qԃ:I4AL ^н~;|Xi`hN fMa8 z,_1"w?Аք3D{@>I*Ә[L߭ہM ci`@{#þ^lm`Vi l r3;Z[Cw:I9ۿueilwj@:gnAiѲ%ɰN}Cz*[pz/&;-t ~6lZmJL[S #!IuVe2PV+.f(m}vDn7=560B#7$hp+fӂCW&NO(W}GSC@U:mc.cKHz)u^Fo_,vRHVY݃gFڃfxۚ/Z`^eBY,mt7 K٬ n (|`',#Ǻn {Mw=+$tyr4%VOd{{OWXپ^ 2G $lNnrd3-zq~k7(gQ"\vBڵvѧX5guТ2*4ʜVBlט`#VG>jY0JD<ʳ7H9f3m*y>G΢Hl)limCk"|-ܗ Uź.$OS(hFxGD*)pڒk: /2oX+Cq{M ~S0V>ŵerzŤH`0"ȤԤĉ89r]Wu%&z0 /&NB.Waendstream endobj 126 0 obj << /Filter /FlateDecode /Length 189 >> stream x]M Mm51lڍ6M HP}Qqim34`L zXq֛y#r3cz,ʊBZdF S=FJ8T2OGEV$:#("dt͛sHRY{<6͒+>#sG/i`endstream endobj 127 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1098 >> stream xm_L[uFDS]3f-B>؋AGƟ@`X-;mW`Bo ?ȦS1s8%dn̒s=7="#0_:)cΰZe B[+N#8J'>g<Jy'NB#7~jE!xิVʨuHJz3!!Oe::%ΐ05JZ33,1,*㌊.Wj+iΓi\=Iv~N|F0,J4U(OcX6biXv^nG=ch2ID4fqT^pI֟Uȁh6;ut:5YZ$W \[_lݖ>ۥnҽj.Vgn2VS ɕIKI17nw7r?f^` NN./bz8OG5Qm`6B?Etm{ ;hqGѐQڝx(O>(!du˳+%yB r|g[Zvw [Ta[=y'@<pgi|_`WsBq v ~l h o,WWvC/dzXf7+vPoQ4K5kW΃uYpAGVպkM@o.٧ ">Wɻ,zդ1yM vuQ6lvzKm%s-Z"ĭpd67E}@5b>\QnXLKD*Qavn}yuչ% -:'rm\t8RhgT+cN.++BwwƩA8 ?/ZpRmO CFǀ̌bNW:Mln1#hFp^ ph~Q3~ڰ Li0ݿ1 C\Byp?Gvmtvمq+hۜ)> stream x T'2# *cӢU֥.UQw6%1AȰ(@ [i[+rJjUZK[Xm=9g?wf@ ];V:ywXD$8~`(063:v[!y(k!Xw5@ۇ @&2n^y|TDV)'Mȟg8m;y8- %DG9DŽ:-uY"V/F998m ;ņ;uYo8?I|@[[*a+#"$RɮSܦ~8}lqbC%<b!J,&K b1%hb$1#G!,‘0'83w3pp9manfhSt '36DeI[X^bR¨fp^m@t&C޶MeH"F|vp`"xBB^Wd3sBea +f{~=@bv(Ic[#Arv r]<4}PO c(? f? P5:gm| 7ܤ?p apJtY`Ȉ,&A"j侅Cq U!jv$FĵGQwڍ7cU5G["ogMԑʒJ_M*Lr4.TXQ%:,\8'PLoHd^IAB{lcWSaV׬Auêr~ladrˀ HSK +<bآNOKQzTiq oeYoq-_kx!$M)`z툠w$ ^YpH\F>p\7S >S3Г"A/f#7_̚$}; q~͸FhjP;[Q-q5z}W FgkQX„~oh0 h Жoi ѤȚNU, ZT~2BDLMhᏛ蚚*.nRū Y鐦NW.J̧E1A# QM[1 )^Ν'+M=h,x[MlnC$eG{/FV3abCЎ!iBOsDþSMg! 2Tey!"ri;XF!m_a K kByGWBpBhx?/NSԅ$t=#=DbzN޶6{ێ ?Ek7Ș*MǪZQ:&9$Uɺ{~>Ď.k5g>Yl1luIR/ gG*QW. pX WRH>gIq$u{Ŏ[nlSNN~\к)L5VLg'#_{^01xnïlR ;c*b53T]G4lvRX](WpW|M6ڄڪZ_1ϭ!gЂ\Z'& #v;0D)A&+rвx9-E> stream xYXWמ̮Ƒ%&KFD@EA( ARAz|Ų_\cbԘhg3%e]|a;3{{JGNN0;]|CʋS4-5]8?kD[פW'L@@okuF'I@/Y! D/\8>'{G$628;l$\ 4% 3 3n2|˺ ζGE؄I6_Jj:jM}Lwcξ>p tu :o| -YE[j[(j:ޤSoQ. ʕIQ lj#5r6Qfj5VRj6eGYRw5=rޥQbʉrSP552(Lʘ2L)3j*Q(=ujeK"AP/X*КUv:tt~A/O - DtmC`A}OxstभB##P?LdYM~Ċ1%8gpS;>͖e]<5L?rX~XiY,ڗ780%!<3I?$Aa(C&2rSP(Us/&ōхt($ Ո_-]&OuWG)|i;!E$?o:lg`\(:QΖNZP8R`!]AfW~ShC*$8S8~s\p^ mBX0xu,lh8ݬ_z+y\qlG$t4&t*;mKMPG%Gn7*q= E]V*te39I,4̄ה;N{ HeHrV>HdW:x6 qaBAb;u:1U94>;-3݅rA6!fɱͰ^ To*@`NBd')׷xƇr̳ Wb3_cCxMD"0b)sW9Z1x rx8»`6!YzD`xz<kssySt)i0dM>,]P/Bykf's@ډz1ЈcR]Wܽ}{) Z^7VWl%BR1h0Į{ݰzdAPS`XL# 5P#El}prcQKg_WFr  #N]\Ϋ őP dތh/rk)],&"i{iU~w9ߗJؼOTI pL.8rLd hWyN:[7"Շ@4;]0U-.H(Iiy5gcSdo;#uh QLj]#Dblc5> (/&srIBЙf1x=zKU g3CϽWGGX#Oy fu$5܌=qxz71rd!T=zUc H?ˤnJrA X)˜IK;8OGwR4 D)=Wygok7l ίG5SoU*\5d߅z8/J#?!4ƇSTMls7UqꣶXocmnvqy`G!<1ihpZ.-O`6_̿ŶGx HL#қiTD Y)ƫrhI{`wIi$Vb%Jx/eLu9qwVјB}1c_#嘣 w>?&eEbxߢۮJ󸩀AmlkJLˍ䲒 ׿Q8?VքDMm7@z~^W75CL?qѢuMؑI9TLWkҡFj/ɧq(g_@U^ 2m//<$KjK_r#&9BL.zӆt F֧iu'<ϝ'n<ɇJZs4 -}S4+`?Z\`HL+vN1(>RNذpv,rB+S7F,@ >TitCZى};ۨ+ҭ|+ٙh`HQ}mޞ?^z%w3ex`5=q lp)jvkj)*3u(Q5!r8UGRD6n˽9OmK`s%R% q QD\إXD% ױ!#/pQeۦ_ix{uPePѡf(BZBTg'Zj3L/sj *:%$R*DԊd *EG7?3 Q{z[Bk}ySѾ̽HTX&k6d\->ؙGn˜>sc5u\sU)DQq#} %{0"U[QG\1I:WRq~ t2ړȥEDw{̾_tԮS"b~oAfW&DM>D4\oɭhfѱ)߭Fܖ׈O"t f<^:O$:Z"inmmh&p81‡Is8|r.tRtW9?+.˪LTmKvBhӵܓHkN)a.Sٚuf?Z&(ڿ޿H^M^u^MHM[Rp< D=TW*|F6U%j!F;lǑfM%$DH`kpE:tgFB.ZBڠbZ3@z+]_Oz rwO*'*8dxQdMlKs]u{9fx)ܔu0OŦm?ދ΋-{ˬ\Nl2cnXǬl`F-ì-u:/.vK8e}B~;:ytHtg c%* YX[1kXB,3g{sixYsQ:Ϗ**..AբilBhpJRJ^ m޺Q$D;KV UESDc0$ GL%ǩe2X^VTF`2?TU)+*10/(ڝ_쁽)Ùendstream endobj 130 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 913 >> stream xeoL[e+thSNnJ E% !¶#16SjA1 VpXJW⨰C64 a Egt]I,s ]]/zNr|8r ʼnEQ/wreWM{NXO d1$-Ovi ,nfYشWCbn[Vetk4Wdr[L5]V %${V.UZLu+/se[=B6貲x%P"R %R!5EL šGI5SgDVQ'+TZ "2jnR |EG5B;W_޳9ϼ_Dm\Бa?us$\N/Y&_ѻ.j\KYXi8c!8 Zu?ˁ>$Iji:VT4gcp >3wz:'ؤ0+0[ Y*f\IʰЄUR{Ϟn׀!ER'|5i iI",%\]co}(m;9͡>#I> stream xWr69LNʑ+4$ʁQcbrlA>4C G4JJ5$n~cA0-Ռ3W\OR-X\̂-YhXfu?BZLa+@W%DrME]/)I9cS+%8!].~- X)]T\b0?\ǚ1 mh@5ڢd? ìE˲r/i8[3&2(.i1N]1Fo7aÒJ`&`~.RFί竺Y^uM???նoJT]\aw{nV.O L1eFDPk1:"lZ4@P̻\B-UpXh`p?45}^6ʾWQð桵Ihze;,WĹM׻mgZ#JR-nm%@]3_LD(6VޭrRYWEpїg.)&wg FRR_1+XFnk| ťv9;,+<54S!f!j>-\.CPB}14óx!S.ђ'$)YIH6;4xTYr#\(:M+Zh*O"&E,.k,i6wi,rIʼnK(xdFH174⠛.= uz5mcmZQFUJM^R ;!qFs&qR}i4ǐ7$W}z=fj*xHHfsqQ1H0CA.d>j& 7K/G/c' $UC"gѴY_Ioܖ_`&X6V{$ݠ)Kqю_bqb JsrpjO./3zQp[ݠWx+^^9::ym C eڟF75eujaϷf5ෳ oendstream endobj 132 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2980 >> stream x͗iTWǫi,Ql AcFe\M0 A@YAfJ7- HQcIGGyes&<^׻o w7B x"8%):9D1cx,:ݵ4p/qcj~{Ec Ƥ&!xS.F#j8: aI SR2|fN>k4='&gح)Y۶&D'oYgeJ~3)%'&.!Z'eϚu>!C| |)ALrJ2cbWl[F6uZ?AD"XCk0bXH,"|bXN&VON;(Vo&D6 5~,|~Ƚ%COyxxL&Eݦ `9p E۹f6 ̴,lz;SX\@M+j~*٧PVZDH!҈3 d;"zO5ߜ8} |*yrp&EbG?A )%קD_6B}{o3.qpk7VQo˯eTǰN A޾\GpǑ MqwX! =A%eICkJ\݈DZvCЛ!5K`P0VB>:7b!.k_ƺMy9΋\1{VoeL_҂yԀK ez2^6s΍DoCXzet6/L ߖz"PЕYZ:Vc!ng#yעUfȏsYDYN/,qmT!I' x;: l EpP(̟+{d7*5?8AM5('iCrg/ڀK}Az'uz y>\7RbnI۳eD|c-rҁRD"K0/okA1L:ހ|nF'/TSjP.P8 ܸZpBn$%Ko.LmXC+Wmw P˨ *8Z_eZ+T*͖B )Mi ׹ KE'WuU:ST-RM̠5uv@Ǖb.N(,T¢w |tNbF57m&v}g>X)z9_"9LRkҫ~O&?v`.BŊKPYJlGX%yZ?0O t@ɛɤMGS9G͐⣆&3?k\v.ߋ^}M m.FCWh5jJusCjf&6 }U%;FUG| *h%JZ۹OOtʑâ]vTN/))Zh܊"e=-]ޅ90/BLTM`37*uuъ8G7ͤ45KaQC9>8xb5uчpnǎ?먄VLOlZA+jNErU^ 9{ƣҎ#M v|ie4H0C+3Shs5JetrAoa ;muzY^Ʉ Tカu1xIphALhJ`h7O+Lʰg"(suJ]qa^n$06BY<3=C#@W+r=&Ob^=TIMA${Vf99K #SeB$ll4ִU8aВVWS\j#ij) %{/㖢Cyh4j27p377MȯnO0㳅67M\ ]Du^ji7U\AiloഔT94/<hԒ xQ272\HOq3ˁR~7L' \|(ԌK;@0]1kф,sNْ+`ݤm'K,x^qr&/˓ h[sb H"d9M.q6tf+;YQy`#8ݑjLx>XbP(*5%k'̀"X ͹}v 0^}3`P2_‹<<k(H";ޥlg:A^C0N)u~ Ի/N+aJQ[Ԅ%<KD=OY=$z21<.AxJGBEg '<{}C ]qg_]/ډ 4. 'UYDg {Mۦchq/w[bjnHDHOQRkӚ M&_w2eHDz' ľqOϭԺDr l{+=lZZPgPQ%j b.2x00Qtg4!#UNLmRU^fʰRNjmYmJZ4ȊPފjtIO>VZ!hˍ7OMS}T<]-WWg4bWt8M)dyj\aqcY1< `<`XFbFmendstream endobj 133 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 353 >> stream xcd`ab`ddM,p(I+34 JM/I,f!C[S72;9aa9g"^8qs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+kt+DR2ӡ40ITE'L'<$CW2g|O;%]]!SAN|O9{̷|SL!?m3n9.|n{'L4sɓ`)߿20jendstream endobj 134 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6277 >> stream xX \SWy> mVZVRJUXdI$$$leu)Fm53uHN[ߴu}M@:Ow}{=+^¨ 4j# 6SOS[YVjDm^R+*j5zZKS Uj P>#Jj5@M|)z$ʟFRBGMhq Ij45K-^$ ^A^/^gx'WQSFgvm3jwc|rxv|+}}/xVlI~~gS'K&_{=D7cWNtم]~l+W7g(V݋zs9m9 :`2TM& ʁyފt94m`6ǶPS`M-x-{k<61:ts|\wRow~Rsk;nao`A:h5IP L360"-D#|]Jw<4f/& FD-";A$'hvPTmډ>qzquhHpfDf4:ˬ)K/Ač_ Bݛ 'zƉ.qٕzår\wy "s&1T1 oh0j7s( >< :2'Al !+@|rqMNT]ȋnlav\n_qҥ$f[.W|Uq#n`fP]H;;ʍj5\`mn:sulBHG}<@yCV>*75~ m.pSD ?oa=m|_ u_ PՁ_m|\1: +rӈ3!5uEm`3 &;#u8( $֨'TbFGt5EfoSm`Ľ,>l:[8|P^Z颭xtI5 JK=bPX~8}]\Ѡ4 o$ʞT@I'ovXڒr}IߏhJ%VZq2n8_za [#ڬ"Qt.Yw' C\n48P"L,^бCOä85Ð֓a<'ݭoECpg9m2F@I3/ǧB6Y GYםGIoo lY|߬ ƾ:Jf vTUVU}XI'ǏWx_k5yHW ړZ=4 (VA·tSVs7E:}o8|kBoȐuV*'V+OrFSWTð-HEh}) ;3a}d 1OȚNӷ/`y1R@j4J3i -JWE79?E$0ۑ$yRӥHz /%Ċb0?mK^\Q4 IfRW%O8=;R|= ~gKn^u6 t'Ι֘]Xq+Zx=p@+S?$^̢l&eؒW JEo巟~x.Mcrxs_q<^~?tNW 4zK{q&o2 qH>=J* #ڂmtWsw #Ó%Ι!6H"a5tӵK]p&p$\\Bccwsieeu"abb=5aiЂ6fמDxh04Ѳ {+M-s"g"<+}Gzj'44)t;ZbKpKAZOоZœV9Ⓒm lpxz+oloD3ŽvYb¹|lj#/$l;k E3\n;EgYEB>J$rC=oyQzlcmqIgq*p0S[QXקիlP8{5j+lS фm':)< ;MaWE-5f7K2TWm5r(53H')P늵buEVDt.x뇅|PZO!Ո" xE;gШv'zc mW D=vvf@H5O=J&1 EYL&[gt)Bd^xyR[r3yoWBRW*wLDUÉ^w^s\H#GٍMgW}|[/t->0k7rQPX~dͅ=}ەca~QAcAmkcpu36s(C+Q0/_*ʔc =(sL-"Rv[z]핈Vc=/, [ Bapێ7,',;|tߏܶuG "ߵpp_2פC9yjTz4Sϡ)z/ĺ9Yoe7Sz"!"7Wn: _a3 G%/u@]Tڜ2I ɷ;Vmsm/vv;la/_j{ޅgl,¨THrX2ih+M} K3ҷ,o54;* <.oQX J  e(j y V'Q{ji68߬ #(S謤9 l|Ȓ/ɜX(=-X;<n̦9dQGdBYI?M$>))SەȭZH^ͱTȆ2eU+I54+lrr%jāG|IL~p'_W-ƒ EG$ vamy7 }}IAEcJ{wL ĺbUeҢKSx ?g+Pjq#0DH&z63~T)PP볫wd1ge奆Ժ&GVܑv[NI).NLDŽdj_WI9 hUP˃5)::j'>|~I X$6T\ ;skcF+z?SSb;Jf#:endstream endobj 135 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 339 >> stream xcd`ab`ddI+14 JM/I,f!CO&VY~'٢Ӻ|<<,^#{ #cxNes~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+kau%`ai~Ijqf^zN^I!:c##5|?~X}W97E{+hc+*j-ij(nLԽ{S%~h}S{&s5L> stream x[[o%~?? '0C_oR" b)l̮mM7?$_el$Zy}OMUuuݫQA9pyzssїceN*Ż>O"w .ɺ۳sk ޜ?'J4}{fl*M+<$㝶?/>cZ2:Ro=/d{fCG"͛0?_q}v3!S݌n:ѳO73˛ݻ#P~sxzCԫ_O?^{=g?f/8Lb@114DyK:eE2%{f2)s~}sٽԎ?|w93G9PFT*+bcPF[;C8PQ9f 4PBcPe"MiV~[iv;j@=uNݺ9+jUa:;'rMHchTV|NB=0;fe,p-'2Boە*8;B+TJjZWZ(o*u!|Ze J5@JW0{B+-& ꗝl1' 9)Αm=ٹ֤g'pvnK3I/O&jd'O\IhxM ꛗLv=hWc7>9*;(p6[A90``fAb)t_7,b\I(ޠg#E[$@Qj+{ P{7' !{>Fx(hy[1Pb=@|(P ' +AdCwq![Wq( (i#X%*PhN=L9I@oDɧYʽwK "lp0+P؃QiJ(!P#EH [M#$q)#rq#2E/= Hz#rf57H~'+Ps+ت)2ÕR~I5NZG{\ |%O(+qq/XUd_V=toj5'Hw@"~YȽ+ DyfdJ9A+Mm"E<9ZW"D~TƥZG?#qE{۠]ķ`ᅨ MK[ #]Rc(FjQ kU"F hfcT;H(p}m}IW/R%b8ϫi eIq\1߫pAQj(&d?p#T.' .;hEqb=6}O%q(!{(E{]nq9%JCAg>*A(@ŴQށ JW(%0ZTu Ľb-{[MB "Lx([y[:"iR4)MoءsODE=PYF{XHnl>_[?S2wazMFkd~bJJvM7+Sq1 w0yޑ'?ny|Q!mKv~>tRR.vg6`q6خ{7Pqa_jt9dF% ?$@-/w7Ous)qzx>G_?\ݨ ;SP/О]iMNkgviNӌ$cI`)nh j^-(:&:!M3,\CFp>Fӧ~y5o~6ھ[oGR5he,n1>֦,Bn.Dh~PRh* X y]%L#*A9`Wo^X6uxA/ B}B|B hz13sd*(L超<Ô}6q|0eP7*5`4Ύ\ \i[D'^nA\PJ|TZWZ(ko+yX@+Ժl#E1K Cʎ;#Ì@#wg'~O]휌^jhFYS졐jvt M6e@EQ!xHu {\ysWv2 l?P47^gE fąڡ9\:k7BTjΤq5#5gpP84w#fDey]Iq?axf *dq\f4٠Hkٮ65ػAugAwF5W=s([Dj9PyVK'ǣ |Bm(R\ J\B( paBa'Z8i|+IOԂqQ+AZf-ߠbqE^ ܁pM! dW#g(rX7}M 7dHK` `oY>7(Ă K|!`Yp{{D]r̘jh:8 )(BmEd}0@0}Uud}3%gMH} 9V ^2}.9ܠRl,. Z֦("3jڡb"(9SkȤϸA|C#dme';, 5qjMR2ή4bA ŔE,Uð@UQ\ &Zntx l Bo"v\f*=~.(fewcaV(߶za@@BTjZBMcuXGpOPdrja!rN,fV_!ǰ|[k,\yf1Sr:aAi5A܀JsUP/VXx ; a`gNUs"?sAesf`K0_+" _ q`oY!&1QJ$Y>Q " xRsS2a#=j%H2[ J ~]%\ /ǵ򭑟[÷7nFE;dȾ 1ɶҿUoxIZ/vO"7g5AXMZeZ>wvlpOpE\JJ }gk\*|yݟW0Пw|';^I\228׽9,쑯:8`J}G=!TIBkt/I\*,IxWWd= ߖdm&ĕ97aa|E=aHfjHLĕB+Qpɼ 0&u~2?|y7"T\ .Qu/|$ՄNr`Y~#].]T鯞ZT0r/q8]!_n<ިJ}uk7?W&+H;oqZ]y6j9CX.opuW02vu;/> stream x{XgݙQy (j"E,J%`e1ꅨBYQA"AжѶ֦1h}]0|3s=9Д܊i.4%cCJ.9qz1CkY\hJ$C0tkHk Yː^;OizzY{̲^^޿2fץg~;Oz JҥTncCJ1SbȎrTQ,?LSl0fIL֦2޾3?ROsHj)k*b(j9HQTB0j APHD*C\H(9QKzjlZ./B3=L1+l.  &.PA-]R#?H~nZ.Gd,X`.p'ɂ,1 x (Jyu4!0`k +!V/ {b=ʂ1!\#GU~7Yi`#ی-˹.*c/ևQA)X#U{:8(޻D3:) *~჻wV 0^@(:1#S#Avd FD "Ɋ̬><qx,K+ɨ Vn(毘А_rڍa}e֒%;j6g/rsu;-AGp mQTBU-<~TSC|?-||ĥJ 4L ^uM-غ@ܴ mT+'y+ō%-x32AsGMJOuezK*1 & |(%vtN,?U[nFWщ n$=c$_ɡfJ" UR&sq5άoҋW5tr ;"c3y=E^RsʌDC)#asj-AཋPrGyC+a;fpC]e36~䯉 ^ia2RWo n3_`d$]-ezo>)DqqT;H&%y&M⒃5'*yd^_a'ΐlNIF,֜|KTمՋ kjM˝?5%pHknAK-ؑ1c^q9Jm;$XYGf AxFv"s/$wA40rB`"A0#\1i N:ɿ;tX1ǤZ0ǂ8% ZPM^dendstream endobj 138 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2543 >> stream xU{\aٙpF$((D bL”")A\8Q=sW}|{{y_!H;&5^9uHX7!*z!="cЪY!b!"ɕ.Y[[ZZ߾#=9>6.Uf<*]5&%>6In&IܾCڕ" $;\w&LWD'Z/Yn [ 0% "DIf…%\ 7$G8 }€`G# X@kS1BW0h$)RA𢕢;sttkijşk<%@JAP=qf*k3I>7vN,*msJ-ګL8e 3LKH*ث2@WcȾ*啪zԌ KrCBԘMCϺ!R{G>,S)"S3-yO҇[<ِF/TakCVɄSyn\ j65m X^˟a+1'q8Y/ n+'=E@Ԇl[#NM@  tLڸhf( 2XfY`̆}#2vRwT䈆7ֈFe A RHXG/SFѰG }ZEMD 5A!3mvߎnK`A=+i"e46:p#k0l}$=I`H`|O|{Bw~>M@aixcQTVGBKx@ЦL9F`B' &3_*5?2M 5dE/>8XU s=fFsptߙ`ll<#^`?6ub×g Qł;~(O :.@YޢI/rǤ .Oj+KG@L쁜 !z !SCv.Cv{_`hFnCջR46KʺvisަR~U-at1I)wƣsNc);(? P'ЃmƦ3N31y0V~75H? .ImD_ώdxphĨCSptl$7/4#Tڹ$?_1iVeM%gnKόC 2ӳut^VBt]8Ux3g S+weq 0RڅZ .{&6XW3Q9~o͑2W.=?uVGLnP>Nto-P9*aSa;`!Lm52vCgܨо2IJv$8ͽW >"쌝GM;*LuDQĹi?x9o; oM:A Aq_nC֘7 ]Kw#K7akl 6l] KnDwQMiu;-J[JWPZtŗ֞iC0yl"N̾l< 8[ W| }^LBxɂ~*uW PPIUi䠆Ů~xF;㤱6ßZ"|Z3`&OѯhɎX +_*IBN/|+@X£#%V'_T83]e墩[T?眩sjZ+c=QA6ۀB7Z"G0V`0amu<~G[.^Odv "samlEi{q:qJdž&;VjnruJuӦܾ֔+[DK0̓cG|,4D'rUs1}xʬw=e Djz4wQQC!3VMPEXɄiPv/n\hfe`Kuœ]uoSǪ?+̿V}6bzn9!K9p(x%Osx0k{Ѹkrx N _e Vm7Cm'~D]ׄ'-^&oX:]-$`}BҦOȗCQRi ?J!+.frDn1^{l6DXt}cDa  ,}Ycd t]W|ԁl۰zϽ;jAe!<QQ8*< qވ(^lm`{Q܃p)lua!?n-s )ZV]㘁RaD^F'Qa8Eg$/8 Sfj^9ן7 b7endstream endobj 139 0 obj << /Filter /FlateDecode /Length 3231 >> stream xZmo8p]F*D搴a=vR_J7({h9≮_4gCj?tx52`tc2x~9< 5l8-lٰ,܈b8Y MkBX? .z a"9R(9-&.oŇ}+JF >׋:e,ro #&(rc$&zL+8wJS*>zS"پ k24d9-lM N,Fqe}'f5]yQVp qrS@-k_l)YKn>\,5xp<'{hx0y==y{쐟ޕ8%2),<$k?V4ljsxe~64[ڷk:svRkYcl@N= NA /Zy(Eg޽ZAw] e}=l?%iΩhEȓHCR]XqLFNW`$7WHuI!cK^܎ z0v'ڳm%k-"1!o/\HHХXss%r*EW6zUKCC[0cqdoKn0dU})SJa(D۸,8PYέ\F6'/YmA0· %7NCZ|L1Y,QcoPnPaeyO,y$odN0!{ DJ{Z18W,027 ŤX%nƇ~XǧP AaE^PO: {ȥ.uK96_MDse[h^(Dz JjʐT!yA$vLɇ~ sdab*ļېU.K# :"%u~Cah\,sAK*+/ȮC7[;#ނ6N Qf3am:`*IL39# /.gQeX $$06i ,re(8UĢ_8ڇ'~c-@'iJi *;4emg2r)w cF˚TxsodS xD6Z[z3\#΄[ܳ:x •}Ч$7->(A%9YYnE5}g)!ʰK^&^#rQD } e$-oEǓo@Z|J{Erp\%OV2f8 v1.wD;f8WG /€۳X{p XG67%U㻌AfI1Z&aa!La#Ɠ B׌jCKg}^.h sNm,+6i1+DNa'y~u\:nD't [b˅OLCM;L¨ ҜsdiA֔YuơM1J$pU 44>{)Wݽ[f-kД[#dZ(R?+; nؔ@ą\?%Avԧdt&art8DzRӑ#쨐K: O6A"|\]%T"MiImj6&Q/\t3`آ;-mܤK 2'ϷxOVF3*JKu~]1kb%wȕTkkkO%32Cuf) ^n$@epjgzB%Pnz T*uQv F c rmzd j0 B9ݔpg5L!]c9:Mۋ'xBmsvY eOn5d2β8^|YdnYF6ZB+u+%v(v{%rˮ7aƑ8 @Kq&} 43I#F=>x0tb6*;y,!= )SZkX$ۓ^\בt+nrt2~1_{PH! imT o'?kbɛTX0O|yc=?"y ''7M?<<j&6Wpa5~C<=_OU ~#`C=N=8zyt?9z:(߅ 3gpȝ_PMO jma ZEDy9mU;8Nbx _m?`endstream endobj 140 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1375 >> stream xU{LSwhEb/cʽ9TYͷ<"Ϊ-/iQ ADPDD,U{iS\̶хŜk~&d%'?972χ0 3lTӔXV2QF(`{}BU(s#"OwqP1u&_Y4ۜUnmf45*jZDΐ Hinjl5RMB\'MRk$)iu(',J^!C>KMK2m:!DDI,M- &:HHXk>>|gEfwuJ yKk^laam셎p"0=p 8$NBf=[8nEYt䢜^$8ߧ1w)]d_5`0aR1W!e&KY72aFu'#1o(4x );Ôf8ȸXJL%Pth ցQ^ʰ)8\?Sr_WJ *ʋʄ˭)Qpˀ#Ppԉ|RrUKFYѐ0?:\Q1W)!SIcl[9l+f%|Y M}p]# z+up9n w1ӭ}b00T 1J ~Ktl+}3}uGTNp~qŴ򊲊s|`7xU#);&{iњV8)cǪ̬)P'OU,JվJ7-'(3ضbKSX,x6 *5~j5ywZa_9\NJguuU];j]C 1endstream endobj 141 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1097 >> stream x}mL[U樓^IQhdal1/Sa(P)Z +}BRV]t0m8&%`si ۲D$9I$I*}5C]Z~OA^_mh{I>'jº%zPn%ϘHR?IlGמDhjAd] ʴ=C:u{G]XPP'/C|\ҩ5;մ.ϯʧOh BQMvֶͪ'UtmXk<iUnש}*_QiT]>J|딭FRo`npG FE&C #"Rql$oLЇY @"7"J!4o5% |D,:C#+εr("|1 *;?;557-u,(nL ˜r\!<==vjle R\u2(|J ozjף~EN 2"Tk0L 0h083aCxĀ<> stream x]= wN IZRĒ.ZUm/@D DHҡga?L:80yD^NGX&X[vUe@y̦rds}bIy K tR#8j7hI΅ 5Xഩ2w 3ȲmE\cM$>b.ճj:]|(.A_?\endstream endobj 143 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 743 >> stream xm[HSaǿN4)9҂(9n̥]6/'̝3kAXAPH{APD Cty0|()?/h}6w*OV:mtZ#3iK!V8~t/ǽk!vBdYX,&SR5m|/6 >o7ͥf~KB'Qhk./8uC+*C*7__jxߟhgli;q]-d>@.yOjc& oO*z똲ύeldAP =u3ܫ|xgh:~6+r{:O L9qwac1i$5$JhCC5?aK?5nb >8Ӛ(Q߀Ef$4^ܧr7b.Q -n _3Gi[UqH%^nkF) 1hR ?v0mIݐU+C8#zP8)UBމ/> stream x]mL[eǟ[Vyt AUF223^6A3l[bͥ}`Q4l*o-h,,\ib1&s,Q?x74K<'9|89V 46.9wv>BBڮ vJQ m*{jEy X5;[m>yBgg q\;gtur \vwq&pk1rܾ Knle  @)sl %iP]ʑ&SD"ZDϙ{f6$riP7tO#ᨵ ֙K&d,}t%"ZMjdB3XJB@ YfP1ƢأWcFzt$> stream xcd`ab`dd N+64uIf!CO/VY~'٢ӺL|=<<<,%={3#cxJs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k꡸a``` b`0f`bdd?Ӿ ʾг*URmf]@{8-l_bOVAn7Ʃ33u/<6NJ?DjC^];ǂXOy҅?|\v s=g7y'Ly7}:Me`Pendstream endobj 146 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 329 >> stream xcd`ab`dd M̳ JM/I, f!CGO]VY~'٢Ӻ|<<,o+={3#cxzs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k꡻g```4d`b`bdd ?Cל.g^Gؚ vg_S V͑ž`euedm{ؽuo+[y-ý&L|gy߬e}'N0Oxendstream endobj 147 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 334 >> stream xcd`ab`dd M3 JM/I, f!CGO]VY~'٢Ӻ,|=<<<,o ={3#cxzs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k;g```4d`b`bdd ?SC7.g!^M *3ž;W[;#}i9guש%}ovj+[ym-ýwRO<<z7O;(=z!endstream endobj 148 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3667 >> stream xW XTGkV{{%b\^ƐI$!1AqE[dfhO \E1 ܈Yf&f/3YĺN1߼j0˛L]U_NjH$_]FL ]Rfy.KGG~Q*p f] 7ydrhцIDWgf$%(-X84)*WD*S٩) eEUub{BRP'*b+F/_XzmTSŧ3Vd+ HHJJNQ 3VSQT48CQzj 6R/Q˩TZILERA=E^  9|(BW44>K}1t*\b9?abDVk 8-; x#ՈGh6f=dA`P nwBVRwj+7ޢ9}j<'pZQ$~ߧ.oܸû~vl߼$PtBoy(Eg|1;[Ak=U+Dx=kz˖|%l#~i>vz~Hj[JҸ 90^'y4nAn[q?RPܯ 4{ﺭj?/F;3{w `4b3q \IA4Vٶ_X)>@MMPݻ~l8A$ۗZ\_~&ϧM!@N.t}< ԣǑ3zîRf2ڋ:;=In D;.A!)F`Qn4޽Odj;SzӤIG[Df)3_"= ဎR $fG_ԧwךn!J{M59$EnURHiH@I*h r;S'ռؔi]̾ۈy:K&i{TN//Ҫ:T`|M|PPP^]GQ]ųxVgJ9]V L1Tx ] 6:A/pݫ<ٰS^}D}>Gd􋪤Y^Uӆ%3CtL; brNsWqyQ,$ ?8á?&8HP&w< dg ˩h3jA-yNczclXIhB@}C Rs`}2S`N/xn^dP-r] ={]nX:$8̡pGoܑY\jmsYw9Ov34Iտ] "u7q2;i`C/;%c!/mݼͷ ڸq ;/ =E)xH\7F+kI_#v]4IeT$@x ]m+ɟVo"CC}Cg|>Ge>eu{`do=f[sAU)+6M]yxCW?:(_r:rSs39tֱM]>SPO 6WˌMݮZqЕWFnIy{O68T: #V:Q#}\q0-T J~dŠ4eq {^hNkHHfA!-YQ#"aj5L {O4gAsNVᮌS9.,>[l9r4hKDSnI-3o7hA: 苪љy%|xB}VW_ Lf[پWb< eE~߇2կ:ЏOW!nt=UXž5Gfc~N= T2vCpC/{—gi;{g8<u7;RFbЫ?tJWP%#7{S(Z|\Z,ħiMJ`G<'y7׫a 4' f^r |摂]\aT0 \fѱK=IuoIqhB Ñ@B:\޽]ew3!9<edkƅrlf6׽}_>hxޥ5wFuՕ1Y);Si>UfT)9l'/z0yڍG䤎aW쮴촴잞sjqB7Q;hwWТ+l0%֡U2;ݳl\}}qٶ+pz8sQ0fyn=Ci%WRX׸3-P`T dojc[[hZ$DEl|aRL&7V2y\PPc46p-e%O]ZAIb>?nH Axߏ+-ǹni kF!D̻ ZeX )1nJzЌ8H~ 콼AXf3mM8XKjė ҇~WO`^I w,ǃ[Q?So?OaLJ16o cu[$ ٖY8GBD[r v4+H3TR~flLxh?- EWc& c:NtU1D:b}QmI[Ǜ4=srDMg2?{C4& Zlj=`ZMmE&V ?ۏ@/䡵H77ɮeH.h87pZ ZFk&#Z-Y@U$]®Uyٕ/7#.Ug2~Y,&3Xta86==Dҳ<l!_RQ)Y}YdRPȽL_Ӛt5[ ?xuՠetw wN]@L@n:D'&fe4\rjw{j j!!8endstream endobj 149 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1544 >> stream x}T PW%q*fGL=(UUxU,ZĄlpDZ!B$BT<1mfNǎSh;[ٙnb;3?$~IAGGsnb5f}B#! %_TyTD`d 𗀿3HV@}&-"$$Dv:gHծјTcdž Ud**!IYtZUa**,:LYKjgP%&kjV-JBp悅 .ALĤ~m؇b>#tb1E!h"$`83!%!$/$RrB:HZ.w(?j B=NQZyW/yW^?L)10Slt)Nfz}B*4`eWxq GGoLg3V":{#o/M*x*PB1:Ԓms*Yu~lc 9'V5ejpL7$-Lpnؽ]ڽf, 1IZ-L}K%r5,l ƦRWsRsbd;Ao#!)An@)Xdւ|xX^)ޢf"ݙkV–D{QK <ɎI> ,`j3C.U/"ԈTs[3f|wO5 ŬՖWunnw8 <<ѐ'կdl͠۹< wBŌJF}X:cGv/ .84AIVN{gO.IyQEDX5Vvos!Ärt$ +q@0 1ENECp(5ϛXћqPO"3%As?_i}--Ui Nɲ bW5U0g y6UH̉> stream x][HSqq`gT`&]t0Ԧn:/;b^r2m鼌FyÚ+%ŠžG z H)4ҜFE|;&#A|ޅXq6aSJ%J'>qQG"A4l}k9"2)ke2\Ey rF(4LnR^sm j(aʔUZê#//`/˯K'BHШBHΣ.H:Ob/&aHqa M4_R,XӒYrXIEq Ÿtz}HWOzhaBQtο }K_> vI!=5|C`-6|8f>0z iM@fw_Mɬ<ܾ; fȇJ_vԟW^)K?§~X@> }DVK疀_qQ;ͽtW%&[ݹ=0Loʗd *z/Y3X8Ct Z2Zn@1v 1gn]ݷiޑꚫ7!IgI}L;D7Ln&"OV("J@z8enrnU)endstream endobj 151 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 326 >> stream xcd`ab`dd M34uI f!CGOeVY~'٢Ӻ|<<,%={3#cxjs~AeQfzF.THTpSJL//THKQS/ f*h)$f$))F(+k꡺c```4d`b`bdd]?Zw.g^Gخ ?/Z$g]Q3mvc8-þk ڽaڏ)Lƶ;KH>g7I5q댉&Ne`ygendstream endobj 152 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 450 >> stream xcd`ab`ddM,,IL6 JM/I,f!Cg_VY~'٢ӺF|=<<<,~}=S1<9(3=DXWHZ*$U*8)x%&ggg*$(x)34R3sBR#B]܃C5E1e5|W14!Dz?#vwͬjhK h`9Sڴ;kak#mڮKN.,.Jnh>evϤ^zu7|RrV9 sΙ>k 97e6HΟmn qU-U;}]b_قSM^m5n9.|n==}Lóa֢){20Cendstream endobj 153 0 obj << /Filter /FlateDecode /Length 33994 >> stream xmǑwϧdy>4,_2 n] R6X&ER%OG8#bHCE Gȵ̙_.Dzz_#wϫyӈt~3O=J{{5=&_u_γUafdmM5]L;Bݰڗ}nҜn*rtO񵟓|NoO~,?|o>~|_~ۿ&>gtZ|WOQA|5SǛwT9Ec\_ï>ӧO>Xgæ3}EG'uFʼ̇>o:5R>*S{g;?~[4{N]l~=k|Y\r==u"J{)la*ڪ(h(^s|MEr#R4!-pl뾋^@tZP&Dz1Ѐ1AE_;J1/yWdhWg{c }u\Ex~pp] mCZdpk58x=4ew<_˸Q=G;xk9H%Xl["B[A HVek<r4~qc\=S~4X,?iCj/r0K9ܢE  z-fhn3{M9ICb#dHuMBiOղ-&R}Vʸnw #"B[A H^u5LMGetlaTv\R 9=OAj+3 atJG$200D:huj~'_gR1):P  k_^C5 [^-Jכ=Dž|g364EXLɃ*' *pT :Cny?\}F4.]^g`l񐸴ЖA"V jCDV,AGw6 _E,v ~{̻f-^~-`!)hv^ESƖ];rΆEƋ-~1Dk.?f>x1УT{vnb1zQ$L>."&+`j\wW|)8tb1n]=2,Ss|q0*0ڵ*#``au3v͓uVo}4`lRЍCaU){n]ʧ@ZUJYYqeX=ŪїՏ61~i|{>F17^lqrtTV+5{ĢύGθhXIQ:Z1Y,&&mG &B/+}hkou hoI%W~'.o_iNyȸOɛ///mi|HxVnP |^>9`)v\}6am)k`zQ`tG?7NQ}r,e__೗#}oܽ^㛘ƃceW &}+{ M7y_~a5 &_0>G9c7 #eMa)Wˎj a)az0R6{;O% O~zӻ5Iw ݈v{W5sva걨j,F[Qo/E|_ xcRn)/{\DvY/s=r}@g[6HHzP{;Wgild>=[g WԹEynic ~BgY4Cƕz-FWgkVtc:Pt6z;q-ZDh%gȰS-:8Th}M\)83ulr%le1 2j8, Ϯ rnkAR>&ckE܅נ̥3|G،ϵ,f6'jnZ-3_~6ۭ/huq`pk،燤'̞Jhh !рT J{ƵF`R 2F8xEfVn6OJbu~g=r3Zul,=5(GEAz=:7bu 6м ،bz U\dqGEvbwHŀH* [ފDZ I![RFYѣش hqCGhy0 ~F1:H=7zvĴo>GThB]Xdpwzv古Xک셗?hAƍS1^ S>n~)Sfݲ1[SFڸ~eG`sF6;&=bۺɍV}6S=,^j?a-a3oUvZLF`ArFڼj형żk]ണahݾhKWhkHx k鱖8='eVF;<,9u[>+QD6Q_QUfTFz-!Д#H` K=VB'b+ h i\]t`#,-!ta`tkA[<EcUk;|b>C+h1=PG ڢTw.iKz=:jǶmPۈe>C+jA=PGV[Rl!e.V7"%@Zz2Yd%mDI hqCGж1YO ccw+m6,el[;t䫺Κ0656/XwYϷbjV6Ķ^1CQ}iwƶ?aCS6k.^]|,9dKP6z%xe VF 4zP! =Za_ ]t--Cj/_[M^Y$ZYdעhTqS6SZHek4 9(B6x< "ܸ1 ^lmH5TJ.I͐2+VcGEf!ݥB5|"w3igIƘ0h;KR+R١;K%j1mgIj%j{YY23)Sl8PSB Wf̝zh\>ɸКO>&Znj{֢Wh $[6N@h@FQ@yFhhQQZtcTlU.6!-B6Zum5xX.1---2>-PmlmtZS([l٩lfΤWR"#F^ق(g|l]9[hl ERFY:1@kߖe(g6Ymw&Qdǂl Bs#lVF4 XBCUi*sJHEi4`IZ<YQ(3.iiXϢi#?8Z-2j8D-sJٳEl[YpZ  <!cbpW1"cZtvO[ͣ;ŝ7ykЊhAFק];^\-"6Z0H8-F ƨ&5%EֈB'`gN}qB_Ԅul,{ :` m~R hA|FQ06;cn2B+`K Qf*c7Q hAFQb,`eVFz=b"foJWm6'CI{ţۭyO)Z89^]m ٔ. d=~2tvSgh;`Sڴetk2a"6=- pY̵֘ uFzB+tK 5x(=J-E]B+sE  f~hrOeqbЂ4xH'4bnBJhAFYIl'ۯQ w=2ٌ?rm%f ZQ" ,C[Ben6p) R H'Io/*dpkј[t YS*^ЂhT[?.vUt|Иq[th-SMe\Y* )- ڽ?-箸:t(ⶫFOh sm1e(Օ---u!*R>|qaЊhqCGmb<4ߦ%} ܖi!iL,6K\eܖz=nw. C]ⰵWт0R/])wC|UF-2nxh >m6dD5 `Z:"-stb`<-!6ZT ~hˎbaЂ0-=;,ކ---%=z4CSN߰k} Bbn1pZfO=cLmC oK =ۀV%VNXi!ˋ+%!*#඲@pCS.q-. A nK *>> -v0Zp[Z0JzSBrnJm@['węLF0:\"Wu2/]m>jmYn|^WO͇g6?1G۾V mm?bk]\8Ua!R1oacтp oG/o {-2nxh7CSnߪka{W7Kx(śJ!ʢ K YFhap(mΎ(yo>yo hAF'Lj6/ZFhpi(ףCIMݏ & BE"6x(Ε2j;ælz>cp~o;z݅B_^ RI֘;LĔϯ.ۂSJ  z:{7;@M۸Pt4hao4 ZC~(@۸pZ?jsQ-`ZȘס÷x)|'Nf| Dkz{b"-T;D-%=ztmo$\*zj̞zL9bb:8*!7Z0Dz-JFMlTk<т\ %oϻ+KJhqCG#oI=4hLJHUj t|}z|}r|(7A7tYCWrdg8Zf lx١O#XZ[Z0Zo7ZEoXUDopKf`.t0YŒ+Tס+xv 9lηKjo V(C ohoiqCGo1Pf]>s5K]Lܫ)k yƊ=bxm߀F0 !uz -#6Zda[  6;=AfA lQJ 6q\%lx\1"cZt旑×:.B6IXelxXQ"ㆇ^,xQߧm߈8Ysnӷ >&;@l^viV9n6 =Yzi܂Ճhvrm==Q7ۇmӶ wڨvij&ɻl-3ޠZzH=,עnwy)owvt7fw76C06 sxn(bg~ i#a "CJt1]u۵`jJhq,UEJ'fSz=:iVII#%bRcWm"'Er4xHe(ieHYFhmȸS=:rVyoAo!рLRo3ގۗ0یJhעSxP(u;נd^ࠞ,.c"5 !<5,2d8U-vl*m@hx>B tK @e(tЭڭ'V hףA7<r$^nٺ Z[ZKY,v۸hn g^f8糸7}T-=PG9zˮe7pݯ"__҉c @kO9"N7LЊh[tkff< |6>TF58(bJFyնRDHo0E\JhAF7`L984p,#7Z0Jz-J߮[~^ MB+!=2Ý<1¬eVG FIŐIIuwgVlPz{&qeùwZI-%=zt?%qI,8u$W: $u8xE'q>U7w+^l\ mzz"q޶qJh բ+_!`M1{3e\a wq[8{ : <O/W2hqiA)x[)i7{Ѹ˗e4.-#=Zt`Dia*gq)!sr6N!Pb1 u  z$UgZI9Џ_=ns]u7+Vwj1"ujWq>np\>V8m^}[p:޺Q//S?v;&a]]'%R6#eK mzL/622B K FI͠ .n`vsL[q2hAqeR}S,K[T"z4)WKaB90[fOr .Aܨ..Y(]т zCДӾ`6?e'6hp dKlPn<&chAO.Ypdv99G2`4dKn3BR&k:1狤9 AF B1]`[/ ĥ9|LJ]޻GIhע8<ĭ3Vuĭz=(Wl^$$q@e f n-#ȸףx+ۼ-zoy(I-H:g+&g2 * ZdI\tEč* Ԫrmh fwS6^l~NVZ9-#=Zt}*pA ;р,䗔OH"v,hQAEp5w`MGp6 FPv{[/tZ9-𬻽p>4e3j). @ rFOhś.+-=!fjlThBr(h(ףqoM4If9@ -.-|a\&x?L>.NcȨբA8qHׅB =^NS{~Y 1,cF^0g.w(/nj ¥[:^p(LA`a0yY1"a$+nz w0bmOPт %mcxN$4E ކtٲMA oK д@e(o8)']m _^p+<4cmsZy[ZMs|߼h"zt76f6aJhAFWLYRK!n!2{D'n6)q?q7[*A+qE6xHeq}(E[Qdq?XdUfuZS[3Jh@FQ7;wYnʻ31 ^Ffk Rx>L_pQ?QZp[ZdpЫq[<}P3˧dhm LRk/=rc劂z=:n񜜅].6 !7eW6Cvy/b]ޠ"C^Nڼ m et:gҖiڊPfeBƸPWB+iVڢ/%m}gD'1{<1, @te xY cVleye!$NJBeKh2eaz$edV3h)[i2mvw)jpPzALEfov_UDHl4E\)~cPcáxXdhz ,])&y.тQCGl1P6K197qIhl E3);/`KV)#r6Z0Jz-K Fpђ\*eE^eݶ*.{8;Rb4Wp$kx9i- 9i-S62KJ u8xEl1rUv5%˥5|Nt)cPKzp,?c\#PĬIcNj]k^JT1{jLG', {7-RO ťTOk5VF B3z2RB2q`IDEq n jbmbnܬ籴 n/ٞm]G۶ɇu6dV޶-۲c6%6;_ߺ_I?0L /ΘBg,YZj$)*=KUc(hqCGnq!)vE>}נт RNOL}Ͷ(->ch؃-emu=̒r`5$ J{ڢHH .!^fVvp-xЊhAFxuU)cyl5heтQCG'm 2`8-Jl~-m|),06uYt`-Z!-2j8h O:l:)s-*͠Zz29uN X Y7F WR^*[9ClсRv8/uq:qcA2A)J]fYhעq6 f`,P.{nnЂh뢔[VF }lёȶMpmIÞ/@4BDj7N٣ '#f:B6T C.mcb>6ѓمy8%YZ(C 6myj{&LpEAz=dB -n@Շ#Zz2m6 zE  aˇ?r(p6ZCRdҶ٥e֖z=lpO`Ezlmmr`[(B`۶O`9l6hmS-lðU`6ziVm[Y<-=P/X*)f_ [eX.[Q"ㆇ^0f?&G55dMev(@۶&}Bz---2bd5h- C'ڶM6j!.+ =B x+ I<4h)X: Z[Z^p74at"'-#p`)葥9>9u4/l3=ۑ{jl[ ݪ-g qBivi>6Xe~TAvecѧg؎G{#lOGW(m5ۄ}}T׳uϻO_oIlgJ,QH {qCⱴ>K\ )x):7&h)ûp"2Q3ٶMc|Oqwqkյ^M-x--!5WuƏkA+^^b\ЄÆjɵlT2NhkivRǸڽwvϱpи-բ5YFHl36hak 9Q5 ĺ ndkȸף5kk?dlXxVDFZ-2F8xEck>4崧\Rʔe,=92YS^&W h ע5r[dk$b_$k1YfOņ2:koPc^FւYm9}ٱr!8Ks,Yi:PĄDZ0jxhhd DȚ]V2m,͠PF QvWJ-\--2jx NJmV 7^O>vmixeٖnۤmA٭C݈]CI' ;j=9VwJlvhыum^w?q/>SUfԞgOK;^H*(J26l(hqCG'n~ )q;bD®x[_0=*a?c2:]״Jh բmkIeȖjJNsi61ݶmV;<<գ-)ue ]p[тȍRtL9=dQ2 Z0Jz-'an'F 5zHe(s}T ̍wxxGcnhi$^ۼ2OHniRgn_"fnwpFFR6:h O nwWZn4-Rgmkuxj|am.tn Jӿ6{=Tmb6\"v -= Z2* 0` 5h Ollw f[A+b=PGضׂl}*cF,-2nx܅ݾsuVnl\h:,ǔn!xiтACElщf}CZ-PO8f6]LU6dp꠨ =$@YAmŠ:.Ԗ2?/Զ=Q۾Y~-jά6N)ؖitKڶ؋5W0ACn um *Շ?DhnR̕L1 lRZ[ZdkљۉnF\XJfZ-ٮeu+_&ZFhniqCGn1HRvIFkԠʥ2gto CS8&G!0hleqK(vMbl<141,S=f-~C0_  Zz޸̰R|0FfZ0[Zd0&lk YsZ1,C(C0^NHY Z([Zdy#mk.V~1h@F6~d0F>B bKHԬRF4:H=2VZBhmiע6<]:rUD-=peeh:Vٮ͸Ŭez=v)'vG e,#W~F@ P-=fCp`o =[Aorz;UfA zK5:HE{;۴."EFzn۸eCv>) 1dzXHaod-SGގ}*vl"] v{Cn_r;ιxaXM]`Uw cRP?pHHM9Q`TXv2ZCf̣p/-1-%=z4↡yI+JCqKt@Eq;N?7PB qEEjшB GN1݊A qK @eq;N[[e7-4 y Њh any;JZ[Y Jzh (D-vOnl]Ѝ@j¶֒_7Ʈ2Nl]Q"ㆇ^#'ptoxNZK.5ZKl C^}jbP6Z$Q^NVP6:8Hl,V– j:¶ter6ZTMmJ7QVF 3z2]XI'uJhqCG'l<)aSHFgPzRL ;aVF j [O ޲)w-–hOvHk]w 2f8uh O'0/+wC!Ktz*:UBhAliע#x)b;|,Upk5eYHlSOx)'FDRR>gxh-ۊ֬O.SvmЊhApF،RNΒ'MтQCGCk<4ŏ^KeegYpL8Kh*eI`UDh!ki ע5tv_MRZ1?e `cdaǠI !A EPǭغ|@F3Mpĩ}AJJ-;Y.5{\W=tGRZArIY/[ds}h"k0S-YC\ڹd[r47"1~n٩!kZlnZZZdW6/p-vg>$ CHW`*sAz-gq`spێXm'$!=^cN$LIW`]WAZ-dx){l6S]- A 7`dFj ƭM9}m#iZzHL1.R҂QCGl1fr6¹h2-SoqІ$̾|6r#tZ[Zdo A9]&{,EMZ[Z(Cuuo-#`hCSU%: 6XZؼR6޵6vo~5k¡ T\2k:b9j^tcU|ؖ~l̥7|NQCFyԍuÖ uQxQ7ӋulqL>knn"ㆇ^Fp<4ϗIe 체Z[Y=o# RR7X$ez4;)G޵sl56 PSKgnFǔY~0E---%=z4ꆶ)W|n3ؚ\ djPz%a|v^01#e+1 Z0JxxGnhfV쫀s h@FQ7[5$ eQBHoiAG^nX)_Mɼ0/'7G$6ވ_h т1AEnx w~"S۬_)B`-=PGS؛ԣ-7ZCGox|?4ewDܤXHoh-*LYv&,,3dboil-Cbomx*] y[ Ke [Ho4 xQ7.ƈR *pTޢkNfɤ3h%o X(Aɛu zЊhע7b(zW тh2an(pp~vYDheoȨբ*){c-v] A {E5x(LݠevmX s тQCGo=4Iu>3^Z:Hj.m|4boy6~BCo>4ŭz(u՞Ђ`-=y j2тz=zCެ[bodC@k: 0$-7Zdk87cBVPhoi'P),uŵEZ0nxh D)1d5hoiR LI]S16?zMXFƷ8͍3"mUmYmsmm ѶĤ6v+'mxgm7ִp ˫ѶktKiuXHhu\OH8#RiyĄok]:Yg!R.k`т4RM䵬 ^hoHbNvoo&xLmܲ oqK(x!m\_Z[ZC2e\žc>=3U(`QS=:x[۸.foG%@+x=PG X7 y~JV5liaSmrQPz0GL뢇Oɪ2QЂQS=:xWf$/lC v`j$ei|n+XU gGߐMW ]2 [1ʉ?S=s@i z, `tЁ[<N#p;.g' тwlZ&)?'҃2B pKz=:p'7~i=omZȌ$j@}TIӃ.$=*Cf~m<4岇}.{=o^Ӳr*iYZkb+Ū"vZx[Z0Jzh )mWmm!рR{oWRx[0F:hƶL.^yHmi<-خ|?m6cIт#!7k]vf Tjt:v[&gg3W 0S-rC\۵G]=bH-=PG.[t/g u"ㆇ^bЄ=8lֲ@7hniR[ݮ}HpO8HE8V0bvWAlJHRӺVȺkںRhniqm]i-~ .gM.Rh@FQ@k4בCK-؍u8xEn1UvneZ Gw9=P8>UR&9---2nxGݬ)S.IB'vDŽj̞z}]u;}m>}rZ[Z0 u1Rт8 nK"Ϧ ֛f:=47Jeàт8J/<-?칮-7ZS=p˹ErmC*c^Q6|LYSLRlZ]-f sL*1bymPf.mAX!0"-a@}3Nm׮%VF HNpimgxܖip-PfS/lj)Zq-2nxh mmF9\w0hmiX)><̾RʘE ED([;^];5=PGY۷]܍7Bjծ?nqۮn nn[܍?SlsSx>`؋R|/G!oq`f7Y 7dcfp.Χ,dSwoc\-Ыfukt:v/K0hPQZtcKI#tcˢoScJٶWY\zoeb*3d-%=ztc>oIK`Abho4 ZC+˔#fdB+{EFOu-Fޮ#z~X77ZC9:'r+9vcтQCGgo>Wf$>b6oL=;kN<NroR'6Bi"{ n?k&D܁[YCꙻ1er@w--%=zt9&R-d--C홬AmVFdiZN.̆#պRYhekHr ekoa[lwxxGgk\W)V,˖+рNRp=iBY)G$d|CjxN<4eo' ޒY:H==JjTRuI ЊhAFN29R V Z-;2E08xNFAz=RÓ)5fنY ZZZ$Ȕlߦez=:R>"XRH-T%"5ZCjt+esn*cG^НzhHjuԼ3HjilRNL.&Ez-WX`/r|M7.2?M0skrbT@ -٢c e_vC*eZO(d|u9|R! *pTl?4%uV~AO,+ʔqچ|rWP[Y0JzPƁCRlmCouVm#eWz*c)-2nxP!CS Gr)XH\@2eZ-"t`kCX=9s<4`ee(AXs5潱"cZ(l)O|Uo zCl+@i!*e-+J ^m?$eN5oQ[u8/Uv {hHQd_}IEy_ʧEFp;L61.-6ZL+J@ҡw"6\AV m#Mm㍂m֜]B+lEzfzb`6|26,ת(h(QKW>A>m\s[[Yq?ܨv)5Zu7_s!Φm[PAU߽sGpvqjO?]lD K,(,ϺRV_̱X\ 1]X,!YyKJbqZXa E =Ms[|/8EqQAPܿvnm{'qSX;f=OrBAܶ#P  RG 춖%\ZFh%qS=:[[IM)'Zm[тRǞ5,/lA"8 -2e(B4b*L8W )_\a)z-~@|1ۻՑOF@6ܰj ? 2h.&p1_!M@|L'",WؘTr\8:CJY. 2B8xCpAWgs/p~B+=Me$C >au+z=:Bs7~EKopMTkeoboao'QÞ g.t|"{()xcvˡE  !u椭lZ-2nxh C>Aoh>m*N됰.th vj7NQ Y Y=f5d%kԠ4P{Qɚꔬٸ$kN%K)d%k Iކ5GO QpYZh߰PQxi+X/`wh8Fx˻h$g@y4hmǭ͝v[ ;g{a"6|(bá@lxndr!C 6jBȓ:YbS]SyFYj?*by"]fAl} I.v}EaSo2C꽠5NY#VGϜ7. 8 e}ܓ}QAjDkAQ_њdYvKؚe<|l Dg0rQ9F:v4iEkPa\-WkYZh4oC!eka5-ZrW$\s+d!lB^?gFr6f`j? h*%3q}0Z`QRs,J0Plo5%-~T=mԤm6㞔Q({ ږ1 @g . hFz $aEmX hٱA[E@ ڨ({u O m,^P#ڏڰ6y!0.RaWdvRѢ:eo@@}#¨޿y. h k*hs?MI>>vLF 4ZyE(Y}OaXXWfC+w%/ib qdn{EbQP(o7EXuĽ6փP5oXR'|6fR'J&K:=cŪl=WjSBpTr) ؕ OU.ώcwTYƱiap}Mlw28( /*XT|ax⚥ٜeojO ᮑL09w8hoejoa 7 T~B;pQ\[+3JH䆆x rgD΢)NJ䆆a9"iJ,2ȅx,$g.%rBGZ3.rë;֞ lbc \V$G`rG7(HΩ^mڄJJ/*1J\_`mlb4BV%}i^O % jKXxGs>*9EsT vބuq&h{]< fdd%r ogՄ,8)ڏJ|ͤDӰO,A#x,#ڧpigL_^P#ڏJ|'D9uڦUPN" ma͛P"w +FzzQVBZLi+JZY\hކǙDMuF. j? z%kHĚ$rq- |Zt7 /Р^{P]KA<~M 1wiBoIZ.m@V" pPQ9N|<$Mo !rͣ#m,D.4oXlaj7Am}: w"unVeSfYqQsumJ޶OmƌފmQQWh34Ube 9\[NM[.Oc o̦qamWϒ1/m[+xjBjx9x: 앂}m/ BC۰P2,ټ Ç(Yhpm#yn4l^m̺YpI֊\. A`!3&ugP dP!nPzQƠhQқ?;(ƴ=A#,ET(z w+rOC?*ux\=Jv"# ̨@FAxZ=KV??z@j/ u@7;Kip 쬥ẋ f @jatY):Nl>@CAnx s%{<_ ],4eoCַC͋t/ ݨ~BGnWڧ}\VF R5Zy[%K1e-pY5%-~(xt.%v ;diRcmԤfT- PNm) 1]\VFj/*vyb}dLNiQLvl]HrF5M({ƙ` Q! oޥ`ȿl/ΞM)' lQS((Q?2wY\h?/W3\pvk{cJcu4*@VHɂ0o`]H~9]^4\i7| KAka! `-meo~BGoXpܵdO7q}Z!L-6ಐРP{Pɛ/]#Br0>'kS7NCŔg%xپNf7j9ZU}nHCiiQ(o|#%x]menHC/*pի7Gm#,K2\'Kcu_Jf?Femav6_+mɲxk׈n Ѯx,C^5J1kZ?@`}j?V=AҶ>CYtm.+m-(Kژ]EhKZ͑Ҷm\~.,!JۨAF !O>˒uӜ ] Q^BTL͏~UqVvzX.v>Y`~Ke{۵\F˥p֎t~ goSa5n2ٖ4\vluT>g[,R9dlXob: 1 T!>,ٟt_[^rY5gvNk5hHض|؋揂ҵkÆ1'[KI*QBR R|Xʒs4Fd !x3*%sN%yECW-X'a-a;=b,f[vLĆS[ؠ~BGalZrg5Ζ 06jB%c9Ov+بA GZel ȷ,2P!)ae3֦YyAt6 J!P B qb鹓6*@ȍXMavk . b HkO6^{I&QبAF !7%.>]pY[hIP]J`q.c]N–eo# :y0saƌc5oX( !lSب֖q!. NFb @5WXUJ9[j߰PQTw-!re HQ[(*Kl֒͞)` j/ajxm$$V-E}SI0SX&V,-4 cV[GC. 'c(-@h doB[$HQ!]n/ sl6ڲy9',-4eoC)ӂ- F a!m5-mƞ 0D ц`66s`a`6lo[0ۨAF !{l@8m6 a6ZryC9^t9y[(Wt-Ju%h0Ћ۰޶,Dص,c“^ZXmr[HYlm,-4oX( qAn}A$m/;O#dXƓYfN1wY[h_]K6 Vk)Oq"pYh'7K+h$]ƨm,-5%-~6" wt.f5pZXmp[iNS6B#W_?~zӦ??4]vt[)P6YfrF?"N!yiN7H>ڹO^[ë,O[4[LlEfokZC9<,Sc<4,mX y-G/fm>/^C?đesv2B=~6O9^[? aͮc oۿ[1uӋiuEio[8n߾xi.^,<]|D|>U޳n>Rsn%mh{r{.Mvj_{^z<җ\C9xA,ӻoi츽Mnz9]֫[R ;\zV?l|{m>A_o^=[s=g>޻bO/Ny߳}#v/o^6vmwz_/E;GWy}{va^? Z;GG6?[}*///>~h6-DžO蟝_ʧ޸ڶaʿxz}›ۇ/ٮz/̆z&{P<%/nmօ_f!}[ݝ^7/zz<~m,ӗo}szǟ/n{Y|߯>t?Gendstream endobj 154 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 345 >> stream xcd`ab`dd74 JM/I, f!CL NEuu0w~H{, ,uE% Fƺ@R!RIO+19;8;S!1/EKWO/(@4$83/='UؐQ% ,gŅqSsa弒n6 >S{6us,]@~*BCL=aimOc;u[%${= 0a~Du z'zpT^oendstream endobj 155 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 335 >> stream xcd`ab`dd N+64 JM/I, f!Cß^ NEu0v0wS{XQ ̌E% Fƺ@R!RIO+19;8;S!1/EKWO/(D1%LW}xÌ~u_Qo}ZyRwVߍؾZcwo.*g|Waq6EtᏀ9^v&KHH<g7Y=@DSyx\^.⅟endstream endobj 156 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 294 >> stream xcd`ab`dd M34 JM/I,f!Cܬ NEu/u0w'=A{,(fFBʢ#c]] iTध_^竧_TSHJHISOSIP v Vp p \E̜}+W:ccecs֭3gn.<{޴ Vq]b ^3ϒ-}{'Mjendstream endobj 157 0 obj << /Type /XRef /Length 181 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 158 /ID [<0eb082453d5351780ffcadf959f136af><15576cbaced896fb89a14d8456495bef>] >> stream xcb&F~0 $8JRw ң!LVx a_@9cLʤ-wzTJ$f֕a{3֤ vᇪ~-N1{, Qޚ"V<|xϣ~N 8 O?~`~8(׹?)=ܣp= 7n p3f=,lݓdzv\tgEhanۆg>ʳ dz,&gr=ڠ<;a x}&S} ́7npsͅ 7n|p-[nBp -[n"Ep-[ n1b%pK-[W W W W W W n)RpK᪘c7pUf}UΟ": 窄Dޓ\r$_-:*|gA[:UUa\ W W W W W W W W W W WWWWWWWWWWWW W W W W W W W W W W WWWWWWWWWWWWWWWWWWWWWW  nYK},uƬ13%MNCJE=%rn%-(TO9/]((ԧL]|_N1;N3f{*s\F>5wd)?ǁ'99Cs=17羅t˘#Ga΅ XJw<)](>gڈY9[5Gn: ىI;UW|#\3vTFiD;NUheo+=M.$f>2;9s@8;~dZl>?}qE+|P#s*7ɻJ~|7"zrpћ20X ݰø9[6f_>m^&mZ眣xkH:^ņubz_Mq'\C{צX#91x=z=C=ӽ_5\DAmfC>bAqE/\?ZO]5_?>z MG?Rxu~&Jt6^OeNnֿwBa«q!y946Kt}Jt2K 5e!;xM#梫6+lW'MDIZ{pۙ]I%4ez;?vД.^ &|_[ܦ)7uWl_+쏋֯]m>k9ui2⮶?#v*?NUncNeӯiՇWhKC7n7ZvZ۞l,Q~p0q-~scv{痜lNzSsoR6g5<q[W.n,oXSrެ ##voXo9`} o~kys@־mwkܯտб5_Ψ_oװ}߬~ᄇm}ۿ_oUjSYS1jSls*;xTls*cy:Tms*aXa{G{n p3f=cplc'xг01,<cٶ<c|mlg.++++7n9psͅ 7n.\9\9\9\9\9\9|p -[nBp -[n"Ep-[ n1%pK-[W W W W W n)RpKU9Yǎ*/ռg;vQY?vZ9m:&.auLjjjjjjjjjjjjjjjjjjjjjjZZZZZZZZZZZջԷ:|k9kB~kvqs㱏 X߰5wa\BÚSL\Bt\|LBLtCt[b63aV+LOxfGǿqfRŹ3DΡ7)B"|*^'CmVieU׍"diptest/inst/doc/diptest-issues.Rnw0000644000176200001440000003351213761214237017137 0ustar liggesusers%\documentclass[article]{jss} %% -- $Id: diptest-issues.Rnw,v 1.9 2011/08/10 14:04:29 maechler Exp maechler $ \documentclass[nojss,article]{jss} % ----- for the package-vignette, don't use JSS logo, etc % % \author{Martin Maechler\\ Seminar f\"ur Statistik \\ ETH Zurich, \ Switzerland % \\\email{maechler@stat.math.ethz.ch}} \author{Martin M\"achler \\ ETH Zurich} \title{Dip Test Distributions, P-values, and other Explorations} % \def\mythanks{a version of this paper, for \pkg{nacopula} 0.4\_4, has been published % in JSS, \url{http://www.jstatsoft.org/v39/i09}.} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{Dip Test Distributions, P-values, and other Explorations} % \Shorttitle{} %\date{April 2009 ({\tiny typeset on \tiny\today})} %%\VignetteIndexEntry{Dip Test Distributions, P-values, and other Explorations} %%\VignetteDepends{diptest} \SweaveOpts{engine=R,keep.source=TRUE,strip.white=true} % ^^^^^^^^^^^^^^^^ \SweaveOpts{eps=FALSE,pdf=TRUE,width=7,height=4} %% an abstract and keywords \Abstract{ ... % FIXME ... % FIXME } % \Keywords{MPFR, Abitrary Precision, Multiple Precision Floating-Point, R} %% 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{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% 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): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} % \usepackage{myVignette} % \usepackage{fullpage}% save trees ;-) --- FIXME use {geometry} package % \usepackage[authoryear,round,longnamesfirst]{natbib} % \bibliographystyle{plainnat} % %% Marius' packages \usepackage[american]{babel}%for American English % \usepackage{microtype}%for character protrusion and font expansion (only with pdflatex) \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments % \usepackage{bm}%for bold math symbols: \bm (= bold math) % %NON-STANDARD:\RequirePackage{bbm}%only for indicator functions % \usepackage{enumitem}%for automatic numbering of new enumerate environments % \usepackage[ % format=hang, % % NOT for JSS: labelsep=space, % justification=justified, % singlelinecheck=false%, % % NOT for JSS: labelfont=bf % ]{caption}%for captions % \usepackage{tikz}%sophisticated graphics package % \usepackage{tabularx}%for special table environment (tabularx-table) % \usepackage{booktabs}%for table layout % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\Arg}[1]{\texttt{\itshape $\langle$#1$\rangle$}} \newcommand*{\file}[1]{{`\normalfont\texttt{#1}'}} \newcommand*{\eps}{\varepsilon} % %% Probability P[.], Expectation E[.] etc \makeatletter %% == subsection of our flexible-style "texab.sty" : \newcommand{\@pkl}{[} % Probability Klammer links \newcommand{\@pkr}{]} \newcommand{\@ekl}{[} % Erwartungswert Klammer links \newcommand{\@ekr}{]} % Erwartungswert Klammer rechts \DeclareMathOperator{\PRSymbol}{P} % Next line (\makeright): if #1 == \left then \right #2 else #1 #2 \newcommand{\makeright}[2]{\ifx#1\left\right#2\else#1#2\fi} %% the real commands \newcommand{\PR}[2][\left] {\PRSymbol #1\@pkl #2 \makeright{#1}{\@pkr}} \newcommand{\ERW}[2][\left] {\ERWSymbol #1\@ekl #2 \makeright{#1}{\@ekr}} \makeatother \newcommand{\isD}{\ {\stackrel{\mathcal{D}}{=}}\ \ } \newcommand*{\iid}{\mbox{ i.i.d. }} % \begin{document} \setkeys{Gin}{width=\textwidth} % Manuel has \setlength{\abovecaptionskip}{-5pt} % %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% Note: These are explained in '?RweaveLatex' : \begin{footnotesize} <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", # <- "yuck!" - required by JSS continue=" ") set.seed(47) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") ## In order to save() and load() expensive results thisDir <- system.file('doc', package='diptest') xtraDir <- if(Sys.getenv("USER") == "maechler") "~/R/Pkgs/diptest/stuff" else thisDir res1.file <- file.path(thisDir, "aggr_results.Rdata") <>= if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) @ \end{footnotesize} % \maketitle % \begin{abstract} % \end{abstract} \section[Introduction]{Introduction}% \small~\footnote{\mythanks}} \label{sec:Intro} %% MM FIXME: Need notation $D_n :=$\texttt{dip( runif(n) )}; but more generally, \begin{equation} \label{eq:Dn.F} D_n(F) := D(X_1, X_2, \dots, X_n), \mbox{ \ \ \texttt{where} } X_i \iid, X_i \sim F. \end{equation} \citet{HarJH85} in their ``seminal'' paper on the dip statistic $D_n$ already proved that $ \sqrt{n} \; D_n$ converges in distribution, i.e., \begin{equation} \label{eq:D.infty} \lim_{n\to\infty}\sqrt{n} \; D_n \isD D_\infty. \end{equation} A considerable part of this paper is devoted to explore the distribution of $D_\infty$. \bigskip \section[History of the diptest package]{History of the \texttt{diptest} \textsf{R} package} \citet{HarP85} published an implementation in Fortran of a concrete algorithm, % ALGORITHM AS 217 APPL. STATIST. (1985) VOL.34, NO.3 where the code was also made available on Statlib\footnote{Statlib is now a website, of course, \url{http://lib.stat.cmu.edu/}, but then was \emph{the} preferred way for distributing algorithms for statistical computing, available years before the existence of the WWW, and entailing e-mail and (anonymous) FTP} On July 28, 1994, Dario Ringach, then at NY University, asked on Snews (the mailing list for S and S-plus users) about distributions and was helped by me and then about \texttt{dyn.load} problems, again helped by me. Subsequently he provided me with S-plus code which interfaced to (a \texttt{f2c}ed version of) Hartigan's Fortran code, for computing the dip statistic. and ended the (then private) e-mail with \begin{quotation} I am not going to have time to set this up for submission to StatLib. If you want to do it, please go ahead. Regards, Dario \end{quotation} - several important bug fixes; last one Oct./Nov.~2003 However, the Fortran code file \url{http://lib.stat.cmu.edu/apstat/217}, was last changed {Thu 04 Aug 2005 03:43:28 PM CEST}. We have some results of the dip.dist of \emph{before} the bug fix; notably the ``dip of the dip'' probabilities have changed considerably!! - see rcs log of ../../src/dip.c \section{21st Century Improvement of Hartigan$^2$'s Table} (( Use listing package (or so to more or less ``cut \& paste'' the nice code in \texttt{../../stuff/new-simul.Rout-1e6} )) \section{The Dip in the Dip's Distribution} \label{sec:dip_dip} We have found empirically that the dip distribution itself starts with a ``dip''. Specifically, the minimal possible value of $D_n$ is $\frac{1}{2n}$ \emph{and} the probability of reaching that value, \begin{equation} \label{eq:P.Dn_min} \PR{D_n = \frac{1}{2n}}, \end{equation} is large for small $n$. E.g., consider an approximation of the dip distribution for $n=5$, <>= require("diptest") # after installing it .. D5 <- replicate(10000, dip(runif(5))) hist(D5, breaks=128, main = "Histogram of replicate(10'000, dip(runif(5))))") @ which looks as if there was a bug in the software --- but that look is misleading! Note how the phenomenon is still visible for $n=8$, <>= D8 <- replicate(10000, dip(runif(8))) hist(D8, breaks=128, main = "Histogram of replicate(10'000, dip(runif(8))))") @ Note that there is another phenomenon, in addition to the point mass at $1/(2n)$, particularly visible, if we use \emph{many} replicates, <>= set.seed(11) n <- 11 B.s11 <- 500000 D11 <- replicate(B.s11, dip(runif(n))) <<2nd-small-sample-phenomen--n-eq-11, echo=false>>= if(file.exists(ff <- file.path(thisDir, "hist-D11.rda"))) { load(ff) } else { ## takes a few minutes <> hD11 <- hist(D11, breaks=1e-6+(63:298)/(2*11*64), plot=FALSE) save(hD11, n, B.s11, file= ff) } <<2nd-small-sample-phenomen--n-eq-11, echo=false, fig=true>>= B.str <- format(B.s11, sci=FALSE, big.mark="'") plot(hD11, main = "", ## main = sprintf("Histogram of replicate(%s, dip(runif(%d)))", B.str, n), border=NA, col="dark gray", xlab = substitute("Dip" ~~ D[.N.](U(group("[",list(0,1),"]"))), list(.N. = n))) title(xlab= substitute(B == .B.SIM. ~ "replicates", list(.B.SIM. = B.str)), adj = .88) lcol <- adjustcolor("orange4", 0.4) abline(v = (1:3)/(2*n), col=lcol, lty=3, lwd=2) axis(1, pos=0, at = (1:3)/(2*n), labels = expression(1/22, 2/22, 3/22), col=lcol, col.axis=lcol) @ FIXME:\\ use \file{../../stuff/sim-minProb.R} \\ and \file{../../stuff/minProb-anal.R} Further, it can be seen that the \emph{maximal} dip statistic is $\frac 1 4 = 0.25$ and this upper bound can be reached simply (for even $n$) using the the data $(0,0,\dots,0, \; 1, 1,\dots,1)$, a bi-point mass with equal mass at both points. \section{P-values for the Dip Test} \label{sec:Pvals} Note that it is not obvious how to compute $p$-values for ``the dip test'', as that means determining the distribution of the test statistic, i.e., $D_n$ under the null hypothesis, but a natural null, $H_o: F \in \{F \mathrm{cadlag} \mid f := \frac d{dx} F is unimodal \}$ is too large. Hartigans'(1985) argued for using the uniform $U[0,1]$ i.e., $F'(x) = f(x)= \mathbf{1}_{[0,1]}(x) = [0 \le x \le 1]$ (Iverson bracket) instead, even though they showed that it is not quite the ``least favorable'' one. Following Hartigans', we will define the $p$-value of an observed $d_n$ as \begin{equation} \label{eq:Pval} P_{d_n} := \PR{D_n \ge d_n} := \PR{\mathrm{dip}(U_1,\dots,U_n) \ge d_n}, \ \ \mathrm{where} \ U_i \sim U[0,1], \ \, \iid \end{equation} \subsection{Interpolating the Dip Table} \label{sec:interpol} Because of the asymptotic distribution, $ \lim_{n\to\infty}\sqrt{n} \; D_n \isD D_\infty$, it is makes sense to consider the ``$\sqrt{n} D_n$''--scale, even for finite $n$ values: <>= data(qDiptab) dnqd <- dimnames(qDiptab) (nn. <- as.integer(dnqd[["n"]])) matplot(nn., qDiptab*sqrt(nn.), type ="o", pch=1, cex = 0.4, log="x", xlab="n [log scaled]", ylab = expression(sqrt(n) %*% q[D[n]])) ## Note that 1/2n is the first possible value (with finite mass),, ## clearly visible for (very) small n: lines(nn., sqrt(nn.)/(2*nn.), col=adjustcolor("yellow2",0.5), lwd=3) P.p <- as.numeric(print(noquote(dnqd[["Pr"]]))) ## Now look at one well known data set: D <- dip(x <- faithful$waiting) n <- length(x) points(n, sqrt(n)*D, pch=13, cex=2, col= adjustcolor("blue2",.5), lwd=2) ## a simulated (approximate) $p$-value for D is mean(D <= replicate(10000, dip(runif(n)))) ## ~ 0.002 @ but we can use our table to compute a deterministic (but still approximate, as the table is from simulation too) $p$-value: <>= ## We are in this interval: n0 <- nn.[i.n <- findInterval(n, nn.)] n1 <- nn.[i.n +1] ; c(n0, n1) f.n <- (n - n0)/(n1 - n0)# in [0, 1] ## Now "find" y-interval: y.0 <- sqrt(n0)* qDiptab[i.n ,] y.1 <- sqrt(n1)* qDiptab[i.n+1,] (Pval <- 1 - approx(y.0 + f.n*(y.1 - y.0), P.p, xout = sqrt(n) * D)[["y"]]) ## 0.018095 @ Finally, in May 2011, after several years of people asking for it, I have implemented a \code{dip.test} function which makes use of a --- somewhat more sophisticated --- interpolation scheme like the one above, to compute a $p$-value. As \code{qDiptab} has been based on $10^6$ samples, the interpolation yields accurate $p$-values, unless in very extreme cases. Here is the small ($n=63$) example from Hartigan$^2$, <>= data(statfaculty) dip.test(statfaculty) @ where, from a $p$-value of 8.7\%, we'd conclude that there is not enough evidence against unimodality. \subsection{Asymptotic Dip Distribution} \label{sec:asymp} We have conducted extensive simulations in order to explore the limit distribution of $D_\infty$, i.e., the limit of $\sqrt{n} \; D_n$, (\ref{eq:D.infty}). Our current \R\ code is in \file{ ../../stuff/asymp-distrib.R } but the simulation results (7 Megabytes for each $n$) cannot be assumed to be part of the package, nor maybe even to be simply accessible via the internet. %% is bandwidth a problem ? probably no longer in the near future? %% Maybe \section{Less Conservative Dip Testing} \section{Session Info} <>= toLatex(sessionInfo()) @ \bibliography{diptest} \end{document} diptest/inst/NEWS.Rd0000644000176200001440000000671514044171400013752 0ustar liggesusers% Check from R: % news(db = tools:::.build_news_db_from_package_NEWS_Rd("~/R/Pkgs/diptest/inst/NEWS.Rd")) \name{NEWS} \title{News for \R Package \pkg{diptest}} \encoding{UTF-8} \section{CHANGES in diptest VERSION 0.76-0 (2021-03-23)}{ \subsection{NEW FEATURES}{ \itemize{ \item add \file{README.Rd} mostly for github readers } } \subsection{BUG FIXES}{ \itemize{ \item Added Imports (to "base" packages where they were not checked previously) to \file{NAMESPACE}. \item Using \file{NEWS.Rd} file more. } } } \section{CHANGES in diptest VERSION 0.75-7 (2015-06-07)}{% CRAN release \subsection{NEW FEATURES}{ \itemize{ \item Started this \file{NEWS.Rd} file, to eventually replace the \file{ChangeLog} } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.75-6 (2014-11-25)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.75-5 (2013-07-23)}{ \subsection{NEW FEATURES}{ \itemize{ \item add \file{NEWS.Rd} (albeit mostly empty) } } \subsection{BUG FIXES}{ \itemize{ \item \code{rdRDS()} wrapper corrrectly tests for R 2.13.0 } } } %% this is the *latest* entry in ../ChangeLog \section{CHANGES in diptest VERSION 0.75-4 (2012-08-13)}{ \subsection{NEW FEATURES}{ \itemize{ \item Enable package for pre-R-2.13.x via \code{rdRDS()} wrapper \item \code{dip.test()} now also returns an \code{alternative} component, e.g. for printing. } } } \section{CHANGES in diptest VERSION 0.75-3 (2012-04-18)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.75-1 (2011-08-10)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.25-3 (2010-08-11)}{ \subsection{NEW FEATURES}{ \itemize{ \item First version of the \dQuote{"diptest issues"} vignette. } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.25-2 (2009-02-09)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.25-1 (2004-08-12)}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{CHANGES in diptest VERSION 0.25-0 (2004-02-13)}{ \subsection{NEW FEATURES}{ \itemize{ \item More output in the \R object, allows \code{debug} information. } } \subsection{BUG FIXES}{ \itemize{ \item Previously, the \code{dip()} had not been \dQuote{symmetric} with respect to \dQuote{mirroring} such as a sign flip in the data. Thanks to Yong Lu, who was able to track the bug to a misplaced \code{(} in the original Fortran code, the bug has been fixed on Oct.10, 2003. } } } \section{CHANGES in diptest VERSION 0.9-1 (2003-07-15)}{ \subsection{NEW FEATURES}{ \itemize{ \item First(?) CRAN release } } \subsection{BUG FIXES}{ \itemize{ \item on 1994-07-30, added code to prevent an infinite loop in rare cases, but e.g., for \code{dip(1:n)}. } } }