quantreg/0000755000176200001440000000000014470144215012102 5ustar liggesusersquantreg/NAMESPACE0000644000176200001440000001273014413563704013331 0ustar liggesusersuseDynLib("quantreg", .registration = TRUE) import(Matrix) importFrom('SparseM', t, chol, backsolve, as.matrix.csr) importFrom('MatrixModels', model.Matrix) importFrom('stats', approxfun, contrasts) importFrom("grDevices", "dev.new") importClassesFrom('MatrixModels', dsparseModelMatrix) importClassesFrom('SparseM', matrix.csr) # Export export( "AIC.nlrq", "AIC.rq", "AIC.rqs", "AIC.rqss", "akj", "anova.rq", "anova.rqlist", "anova.rqs", "bandwidth.rq", "boot.crq", "boot.rq", "boot.rq.mcmb", "boot.rq.pwy", "boot.rq.spwy", "boot.rq.wxy", "boot.rq.xy", "boot.rq.pxy","rq.fit.ppro","ChangeLog", "coef.crq", "coef.nlrq", "combos", "critval", "crq", "crq.fit.pen", "crq.fit.por", "crq.fit.por2", "crq.fit.pow", "Curv", "deviance.nlrq", "dither", "dynrq", "end.dynrq", "extractAIC.nlrq", "extractAIC.rq", "FAQ", "fitted.nlrq", "fitted.rqss", "formula.nlrq", "formula.rq", "index.dynrq", "KhmaladzeTest", "kselect", "kuantile", "kunique", "latex", "latex.summary.rqs", "latex.table", "latex.table.rq", "lm.fit.recursive", "logLik.nlrq", "logLik.rq", "logLik.rqs", "logLik.rqss", "lprq", "nlrq", "nlrq.control", "nlrqModel", "plot.qss1", "plot.qss2", "plot.rq.process", "plot.rqs", "plot.rqss", "plot.summary.crqs", "plot.summary.rqs", "plot.summary.rqss", "plot.table.rq", "predict.crq", "predict.crqs", "predict.nlrq", "predict.qss1", "predict.qss2", "predict.rq", "predict.rq.process", "predict.rqs", "predict.rqss", "print.anova.rq", "print.crq", "print.dynrq", "print.dynrqs", "print.nlrq", "print.rq", "print.rqs", "print.rqss", "print.summary.crq", "print.summary.crqs", "print.summary.dynrq", "print.summary.dynrqs", "print.summary.nlrq", "print.summary.rq", "print.summary.rqs", "print.summary.rqss", "qrisk", "qss", "qts1", "qss1", "qss2", "QTECox", "ranks", "rearrange", "resid.rqss", "residuals.nlrq", "rq", "rq.fit", "rq.fit.br", "rq.fit.fnb", "rq.fit.fnc", "rq.fit.hogg", "rq.fit.lasso", "rq.fit.pfn", "rq.fit.scad", "rq.fit.sfn", "rq.fit.sfnc", "rq.fit.conquer","rq.test.anowar", "rq.test.rank", "rq.wfit", "rqProcess", "rqs.fit", "rqss", "rqss.fit", "sfn.control", "sfnMessage", "srisk", "start.dynrq", "summary.crq", "summary.crqs", "summary.dynrqs", "summary.nlrq", "summary.rq", "summary.rqs", "summary.rqss", "table.rq", "tau.nlrq", "triogram.fidelity", "triogram.penalty", "untangle.specials", "ParetoTest", "Hill", "Hill.fit", "print.Hill", "summary.Hill", "print.summary.Hill", "Pickands.fit", "Pickands", "print.Pickands", "summary.Pickands", "print.summary.Pickands", "Pickands.fit", "Munge", "rq.fit.qfnb", "rq.fit.pfnb", "boot.rq.pwxy", "q489", "LassoLambdaHat") importFrom("grDevices", "dev.interactive", "devAskNewPage", "gray", "n2mfrow", "terrain.colors") importFrom("graphics", "abline", "contour", "lines", "matlines", "matplot", "par", "persp", "plot", "points", "polygon", "title") importFrom("MASS", "Null") importFrom("survival", "Surv") importFrom("methods", "as", "hasArg", "new") importFrom("utils", "flush.console", "modifyList") importFrom("stats", ".checkMFClasses", ".getXlevels", "AIC", "approx", "as.formula", "as.ts", "coef", "coefficients", "cycle", "model.matrix", "model.response", "rmultinom", "delete.response", "dnorm", "end", "fitted", "formula", "frequency", "getInitial", "hat", "is.empty.model", "is.stepfun", "knots", "lag", "lm", "lm.fit", "lm.wfit", "logLik", "lsfit", "median", "model.extract", "model.frame", "model.weights", "na.omit", "na.pass", "numericDeriv", "optim", "pchisq", "pf", "pnorm", "predict", "printCoefmat", "pt", "qnorm", "qt", "quantile", "reformulate", "relevel", "resid", "residuals", "rexp", "runif", "setNames", "start", "stepfun", "supsmu", "terms", "uniroot", "var", "napredict") S3method(AIC, nlrq) S3method(AIC, rq) S3method(AIC, rqs) S3method(AIC, rqss) S3method(anova, rq) S3method(anova, rqlist) S3method(anova, rqs) S3method(coef, crq) S3method(coef, nlrq) S3method(deviance, nlrq) S3method(extractAIC, nlrq) S3method(extractAIC, rq) S3method(fitted, nlrq) S3method(fitted, rqss) S3method(formula, nlrq) S3method(formula, rq) S3method(latex, summary.rqs) S3method(latex, table) S3method(latex, table.rq) S3method(logLik, nlrq) S3method(logLik, rq) S3method(logLik, rqs) S3method(logLik, rqss) S3method(plot, qss1) S3method(plot, qss2) S3method(plot, rq.process) S3method(plot, rqs) S3method(plot, rqss) S3method(plot, summary.crqs) S3method(plot, summary.rqs) S3method(plot, summary.rqss) S3method(plot, table.rq) S3method(predict, crq) S3method(predict, crqs) S3method(predict, nlrq) S3method(predict, qss1) S3method(predict, qss2) S3method(predict, rq) S3method(predict, rq.process) S3method(predict, rqs) S3method(predict, rqss) S3method(print, anova.rq) S3method(print, crq) S3method(print, dynrq) S3method(print, dynrqs) S3method(print, nlrq) S3method(print, rq) S3method(print, rqs) S3method(print, rqss) S3method(print, summary.crq) S3method(print, summary.crqs) S3method(print, summary.dynrq) S3method(print, summary.dynrqs) S3method(print, summary.nlrq) S3method(print, summary.rq) S3method(print, summary.rqs) S3method(print, summary.rqss) S3method(print, KhmaladzeTest) S3method(plot, KhmaladzeTest) S3method(residuals, nlrq) S3method(end, dynrq) S3method(start, dynrq) S3method(summary, crq) S3method(summary, crqs) S3method(summary, dynrqs) S3method(summary, nlrq) S3method(summary, rq) S3method(summary, rqs) S3method(summary, rqss) S3method(print, Hill) S3method(summary, Hill) S3method(print, summary.Hill) S3method(print, Pickands) S3method(summary, Pickands) S3method(print, summary.Pickands) S3method(plot, qts1) quantreg/demo/0000755000176200001440000000000014247334660013035 5ustar liggesusersquantreg/demo/cpoint.R0000644000176200001440000000135511555564235014462 0ustar liggesusers## Demo for a simple change point (broken-stick) problem x <- runif(200,0,10) u <- rnorm(200)/5 y <- 1 + x - .5 * (x-3) * (x > 3) + u plot(y ~ x, cex= .5, col = "grey") z <- rqss(y ~ qss(x,lambda = 10), tau= .50) plot(z, col = "dark blue") #Now plot the fitted points and jump points in derivative eps <- 0.00001 # Zero Tolerance Nz <- abs(z$resid[1:200]) < eps Nj <- abs(z$resid[201:398]) > eps xx <- z$qss[[1]]$xyz[,1] yy <- z$coef[1] + z$qss[[1]]$xyz[,2] xj <- xx[3:200] yj <- yy[3:200] points(xx[Nz],yy[Nz],col="green") points(xj[Nj],yj[Nj],col="red") print(paste("Number of zero residuals: ",sum(Nz))) print(paste("Number of jumps in slope: ",sum(Nj))) legend(6,3,c("Derivative Jumps", "Zero residuals"),pch = "o", col=c("red","green")) quantreg/demo/panelfig.R0000644000176200001440000000547413124226706014751 0ustar liggesuserslibrary(quantreg) rq.fit.panel <- function(X,y,s,w=c(1/3,1/3,1/3),taus=c(0.25,0.5,0.75),lambda = 0){ # prototype function for fixed effect panel data fitting of QR models # the vector s is a strata indicator assumed (so far) to be a one-way layout # NB: # 1. The value of the shrinkage parameter lambda is an open research problem in # the simplest homogeneous settings it should be the ratio of the scale parameters # of the fixed effects and the idiosyncratic errors # 2. On return the coefficient vector has m*p + n elements where m is the number # quantiles being estimated, p is the number of columns of X, and n is the # number of distinct values of s. The first m*p coefficients are the # slope estimates, and the last n are the "fixed effects" # 3. Like all shrinkage (regularization) estimators, asymptotic inference is somewhat # problematic... so the bootstrap is the natural first resort. require(SparseM) require(quantreg) m <- length(w) if(m != length(taus)) stop("length of w and taus must match") X <- as.matrix(X) p <- ncol(X) n <- length(levels(as.factor(s))) N <- length(y) if(N != length(s) || N != nrow(X)) stop("dimensions of y,X,s must match") Z <- as.matrix.csr(model.matrix(~as.factor(s)-1)) Fidelity <- cbind(as(w,"matrix.diag.csr") %x% X, cbind(w) %x% Z) Penalty <- cbind(as.matrix.csr(0,n,m*p),lambda*as(n,"matrix.diag.csr")) D <- rbind(Fidelity,Penalty) y <- c(w %x% y,rep(0,n)) a <- c((w*(1-taus)) %x% (t(X)%*%rep(1,N)), sum(w*(1-taus)) * (t(Z) %*% rep(1,N)) + lambda * rep(1,n)) rq.fit.sfn(D,y,rhs=a) } n<-3 T<-50 nT<-n*T u1<-rnorm(T) u2<-rnorm(T) u3<-rnorm(T) x1<-rnorm(T,1,0.85) x2<-rnorm(T,4,1) x3<-rnorm(T,7,1) beta1<-1 beta2<-0.5 y1<- 0+beta1*x1+(beta2*x1)*u1 y2<- 4+beta1*x2+(beta2*x2)*u2 y3<- 8+beta1*x3+(beta2*x3)*u3 plot(c(0,9), c(0,25), type='n', xlab=expression(x[it]), ylab=expression(y[it])) points(x1,y1,pch=15) points(x2,y2,pch=15,col="blue") points(x3,y3,pch=15,col="red") legend(1,17,paste("i = ",1:3,sep = ""),pch = 15, col = c("black","blue","red")) ya<-c(y1,y2,y3) xa<-c(x1,x2,x3) # Naive cross-section QR taus <- c(.25,0.5,.75) xx <- seq(min(xa),max(xa),0.25) f <- coef(rq(ya~xa,tau=taus)) yy <- cbind(1,xx)%*%f for(i in 1:3) lines(xx,yy[,i],col = "grey") # Fixed effect QR s <- rep(1:n,rep(T,n)) fp<-rq.fit.panel(xa,ya,s)$coef bhat <- fp[1:3] fehat <- fp[4:6] xx1 <- seq(min(x1),max(x1),0.25) for(i in 1:3){ yy1 <- fehat[1] + bhat[i] * xx1 lines(xx1,yy1,col = "black") } xx2 <- seq(min(x2),max(x2),0.25) for(i in 1:3){ yy2 <- fehat[2] + bhat[i] * xx2 lines(xx2,yy2,col = "blue") } xx3 <- seq(min(x3),max(x3),0.25) for(i in 1:3){ yy3 <- fehat[3] + bhat[i] * xx3 lines(xx3,yy3,col = "red") } quantreg/demo/subset.R0000644000176200001440000000074513733130504014461 0ustar liggesusers# Test case for the new subset argument require(quantreg) n <- 200 x <- sort(rchisq(n,4)) z <- rnorm(n) s <- sample(1:n, n/2) y <- log(x) + rnorm(n)/5 D = data.frame(y = y, x = x, z = z, s = (1:n) %in% s) plot(x, y, cex = .5, col = "grey") points(x[s], y[s],col = "pink", cex = .5) lam = 0.2 f0 <- rqss(y ~ qss(x,lambda = lam) + z, subset = s) f1 <- rqss(y ~ qss(x, lambda = lam) + z, subset = s, data = D) plot(f0, add = TRUE, col = 2, lwd = 3) plot(f1, add = TRUE, col = 4, lwd = 3) quantreg/demo/engel2.R0000644000176200001440000000244613124026717014334 0ustar liggesusers #### Demo for a plot of two quantile functions of food expenditure ###-- short version of the rq *VIGNETTE* --- use that! data(engel) ## do *NOT* attach() ## Poor is defined as at the .1 quantile of the sample distn ## Rich is defined as at the .9 quantile of the sample distn x.poor <- quantile(engel[,"income"], .10) x.rich <- quantile(engel[,"income"], .90) z <- rq(foodexp ~ income, tau= -1, data = engel) ps <- z$sol["tau",] coefs <- z$sol[4:5,] qs.poor <- c(c(1,x.poor) %*% coefs) qs.rich <- c(c(1,x.rich) %*% coefs) ## now plot the two quantile functions to compare par(mfrow = c(1,2)) plot(c(ps,ps),c(qs.poor,qs.rich),type="n",xlab=expression(tau),ylab="quantile") plot(stepfun(ps,c(qs.poor[1],qs.poor)),do.points=FALSE,add=TRUE) plot(stepfun(ps,c(qs.poor[1],qs.rich)),do.points=FALSE,add=TRUE, col.hor = "gray", col.vert = "gray") ## now plot associated conditional density estimates ## weights from ps (process) ps.wts <- (c(0,diff(ps)) + c(diff(ps),0)) / 2 ap <- akj(qs.poor, z=qs.poor, p = ps.wts) ar <- akj(qs.rich, z=qs.rich, p = ps.wts) plot(c(qs.poor,qs.rich), c(ap$dens,ar$dens), type="n", xlab= "Food Expenditure", ylab= "Density") lines(qs.rich, ar$dens, col="gray") lines(qs.poor, ap$dens, col="black") legend("topright", c("poor","rich"), lty = c(1,1), col=c("black","gray")) quantreg/demo/Polson.R0000644000176200001440000000077612723036475014444 0ustar liggesusers# Toy rqss example based on Figure 2 of Polson and Scott (2016, JRSSB) # NB: Solutions are piecewise linear, unlike those of Polson and Scott # whose ADMM procedure does only 30 iterations. dgp <- function(n) { x <- 0:n/n y <- rnorm(n+1, 5 * sin(2 * pi * x), 0.5 + exp(1.5 * sin(4 * pi * x))) data.frame(x = x, y = y) } D <- dgp(1000) plot(D$x, D$y, cex = .5) taus <- 1:9/10 for(i in 1:length(taus)) plot(rqss(y ~ qss(x, lambda = 1/10), tau = taus[i], data = D), rug = FALSE, add = TRUE) quantreg/demo/engel1.R0000644000176200001440000000133611555564235014340 0ustar liggesusers## Demo for a Plot of Engel curve in sample space data(engel) plot(foodexp ~ income, data = engel, cex= .5, col = "blue", xlab = "Household Income", ylab = "Food Expenditure") z <- rq(foodexp ~ income, tau= .50, data = engel)# "median line": L1 - regression abline(z, col = "dark blue") abline(lm(foodexp ~ income, data = engel), lty=2, col="red") #the dreaded ols line taus <- c(.05,.1,.25,.75,.90,.95) nt <- length(taus) for( i in 1:length(taus)) { abline(rq(foodexp~income, tau=taus[i], data = engel), col="gray") } legend("bottomright", c("L1 (tau = .50)", "OLS", paste("tau= ", formatC(rev(taus)))), col = c("dark blue", "red", rep("gray", nt)), lty = c(1,2, rep(1, nt)), inset = 0.03) quantreg/demo/MCV.R0000644000176200001440000000244513746024036013606 0ustar liggesusers MCV <- function(lambdas, formula, data, tau = 0.5, k = 10){ F <- Munge(formula, lambdas = lambdas) f <- rqss(F, data, tau = tau) n <- f$n m <- length(f$qss) y <- f$y[1:n] folds = sample(rep(1:k, length = n)) U = NULL for(i in 1:k){ s = which(folds != i) M = rqss(F, data = data[s,], tau = tau) nd = data[-s,] G = matrix(0,nrow(nd),m) for(j in 1:m){ #remove extrapolates, if any g = f$qss[[j]]$xyz[,1] G[,j] = (min(g[s]) < g[-s]) & (g[-s] < max(g[s])) } h = as.logical(apply(G,1,prod)) u = predict(M, newdata = nd[h,]) - (y[-s])[h] U = c(U,(u * (tau - (u < 0)))) } mean(U) } set.seed(1729) n <- 200 x <- sort(runif(n, 0, 20)) g0 <- function(x, tau) log(x) + 0.2*(log(x))^3 + log(x) * qnorm(tau)/4 y <- g0(x, runif(n)) D <- data.frame(y = y, x = x) lams <- mcvs <- seq(.02, 5, by = 0.2) for(i in 1:length(mcvs)) mcvs[i] <- MCV(lams[i], y ~ qss(x, lambda = lambdas[1]), D) par(mfrow = c(1,2)) plot(lams, mcvs, cex = .5, lwd = 2, type = 'l', xlab = expression(lambda), ylab = expression(MCV( lambda ))) lambdastar <- lams[which.min(mcvs)] plot(x, y, cex = .5, col = "grey") f <- rqss(y ~ qss(x, lambda = lambdastar), data = D) plot(f, add = TRUE, lwd = 2) lines(x,g0(x, 0.5), col = "red", lwd = 2) text(10, 1,bquote(lambda == ~ .(lambdastar))) quantreg/demo/Panel.R0000644000176200001440000000547413124226225014217 0ustar liggesuserslibrary(quantreg) rq.fit.panel <- function(X,y,s,w=c(1/3,1/3,1/3),taus=c(0.25,0.5,0.75),lambda = 0){ # prototype function for fixed effect panel data fitting of QR models # the vector s is a strata indicator assumed (so far) to be a one-way layout # NB: # 1. The value of the shrinkage parameter lambda is an open research problem in # the simplest homogeneous settings it should be the ratio of the scale parameters # of the fixed effects and the idiosyncratic errors # 2. On return the coefficient vector has m*p + n elements where m is the number # quantiles being estimated, p is the number of columns of X, and n is the # number of distinct values of s. The first m*p coefficients are the # slope estimates, and the last n are the "fixed effects" # 3. Like all shrinkage (regularization) estimators, asymptotic inference is somewhat # problematic... so the bootstrap is the natural first resort. require(SparseM) require(quantreg) m <- length(w) if(m != length(taus)) stop("length of w and taus must match") X <- as.matrix(X) p <- ncol(X) n <- length(levels(as.factor(s))) N <- length(y) if(N != length(s) || N != nrow(X)) stop("dimensions of y,X,s must match") Z <- as.matrix.csr(model.matrix(~as.factor(s)-1)) Fidelity <- cbind(as(w,"matrix.diag.csr") %x% X, cbind(w) %x% Z) Penalty <- cbind(as.matrix.csr(0,n,m*p),lambda*as(n,"matrix.diag.csr")) D <- rbind(Fidelity,Penalty) y <- c(w %x% y,rep(0,n)) a <- c((w*(1-taus)) %x% (t(X)%*%rep(1,N)), sum(w*(1-taus)) * (t(Z) %*% rep(1,N)) + lambda * rep(1,n)) rq.fit.sfn(D,y,rhs=a) } n<-3 T<-50 nT<-n*T u1<-rnorm(T) u2<-rnorm(T) u3<-rnorm(T) x1<-rnorm(T,1,0.85) x2<-rnorm(T,4,1) x3<-rnorm(T,7,1) beta1<-1 beta2<-0.5 y1<- 0+beta1*x1+(beta2*x1)*u1 y2<- 4+beta1*x2+(beta2*x2)*u2 y3<- 8+beta1*x3+(beta2*x3)*u3 plot(c(0,9), c(0,25), type='n', xlab=expression(x[it]), ylab=expression(y[it])) points(x1,y1,pch=15) points(x2,y2,pch=15,col="blue") points(x3,y3,pch=15,col="red") legend(1,17,paste("i = ",1:3,sep = ""),pch = 15, col = c("black","blue","red")) ya<-c(y1,y2,y3) xa<-c(x1,x2,x3) # Naive cross-section QR taus <- c(.25,0.5,.75) xx <- seq(min(xa),max(xa),0.25) f <- coef(rq(ya~xa,tau=taus)) yy <- cbind(1,xx)%*%f for(i in 1:3) lines(xx,yy[,i],col = "grey") # Fixed effect QR s <- rep(1:n,rep(T,n)) fp<-rq.fit.panel(xa,ya,s)$coef bhat <- fp[1:3] fehat <- fp[4:6] xx1 <- seq(min(x1),max(x1),0.25) for(i in 1:3){ yy1 <- fehat[1] + bhat[i] * xx1 lines(xx1,yy1,col = "black") } xx2 <- seq(min(x2),max(x2),0.25) for(i in 1:3){ yy2 <- fehat[2] + bhat[i] * xx2 lines(xx2,yy2,col = "blue") } xx3 <- seq(min(x3),max(x3),0.25) for(i in 1:3){ yy3 <- fehat[3] + bhat[i] * xx3 lines(xx3,yy3,col = "red") } quantreg/demo/hinged.R0000644000176200001440000000201414414306746014413 0ustar liggesusers# A Demo of simple bivariate rqss fitting of a hinge function require(quantreg) if(requireNamespace("interp")){ ## Make sure the demo does not ``die'' when rgl is not available: do.rgl <- interactive() && require(rgl) #generate the data n <- 1000 x <- runif(n) y <- runif(n) z <- -abs(x-y) ### Make an initial quite rough fit of the data fit <- rqss(z ~ qss(cbind(x,y),lambda = .005)) print(summary(fit)$penalty) if(do.rgl) { plot(fit, render = "rgl") cat("Now orient the plot as desired:", "Resize window,", "mouse button 1 to change viewpoint,", "mouse button 2 to zoom,", "and hit return when ready",sep="\n") scan() rgl.bg(color="8") cat("To try another value of lambda:", "Type a positive number", "To quit hit return", sep="\n") repeat{ cat("lambda: ") lam <- scan(what = double(1)) if(length(lam)>0){ fit <- rqss(z ~ qss(cbind(x,y),lambda = lam)) rgl.clear() plot(fit, render = "rgl") } else break } } else { if(!interactive()) pdf(file = "hinge-demo.pdf") plot(fit) } } quantreg/demo/RB-r.R0000644000176200001440000000077514223036035013720 0ustar liggesusers# Convert H_0: R beta = r to an exclusion restriction a la Section 3.7.3 of QR book # Note the typo in the definition of yt in that source! if(require(MASS)){ # For Null require(quantreg) # For Null X <- cbind(1, matrix(rnorm(500),100,5)) y <- rnorm(100) R <- matrix(rnorm(18),3,6) r <- rep(1,3) R <- t(R) P <- MASS::Null(R) Xt <- t(lsfit(P,t(X),intercept = FALSE)$coef) Zt <- t(lsfit(R,t(X),intercept = FALSE)$coef) yt <- y - Zt %*% r f0 <- rq(yt ~ Xt - 1) f1 <- rq(yt ~ Xt + Zt - 1) T <- anova(f0,f1) } quantreg/demo/Mel.R0000644000176200001440000000213014223044413013655 0ustar liggesusers#Analysis of the QAR(1) Melbourne Temperature Example require(splines) if(interactive()){ oldpar <- par(ask = TRUE) data(MelTemp) x <- MelTemp[-3650] y <- MelTemp[-1] s <- (x<40) #Delete a few (influential, ridiculously hot) days x <- x[s] y <- y[s] z <- seq(10,36,length=100) fit <- rq(y~ bs(x,knots=quantile(x,c(.05,.25,.5,.75,.95))), tau = 1:19/20) par(cex=1,pty="s") xlab <- "yesterday's max temperature" ylab <- "today's max temperature" plot(x,y,pch=".",xlab=xlab,ylab=ylab) matlines(z,predict(fit, newdata = data.frame(x = z)), lty = 1) abline(c(0,1),lty=3) title("Melbourne QAR Model") taus <- 1:199/200 xs <- c(11,16,21,25,30,35) fit <- rq(y~ bs(x,knots=quantile(x,c(.05,.25,.5,.75,.95))), tau = taus) Qy <- predict(fit,newdata = data.frame(x = xs)) par(mfrow = c(2,3)) for(i in 1:length(xs)){ Qyi <- Qy[i,-1] fhat <- akj(Qyi,Qyi,diff(taus), h = 1)$dens xlab <- "today's max temperature" plot(Qyi,fhat,type="l",xlab=xlab,ylab="density") abline(v=xs[i], col="red") title(paste("Yesterday's Temp", format(round(xs[i])))) } par(oldpar) } quantreg/demo/crquis.R0000644000176200001440000000205113235122725014455 0ustar liggesusers# UIS example for the crq Peng-Hwang method. #estimate the Peng and Huang model using log(TIME) AFT specification if(requireNamespace("survival", quietly = TRUE)) { data(uis) Surv <- survival::Surv fit <- crq(Surv(log(TIME), CENSOR) ~ ND1 + ND2 + IV3 + TREAT + FRAC + RACE + AGE * SITE, method = "Portnoy", data = uis) Sfit <- summary(fit,1:19/20) PHit <- survival::coxph(Surv(TIME, CENSOR) ~ ND1 + ND2 + IV3 + TREAT + FRAC + RACE + AGE * SITE, data = uis) plot(Sfit, CoxPHit = PHit) formula <- ~ ND1 + ND2 + IV3 + TREAT + FRAC + RACE + AGE * SITE -1 X <- data.frame(model.matrix(formula,data=uis)) newd <- as.list(apply(X,2,median)) pred <- predict(fit, newdata=newd, stepfun = TRUE) plot(pred,do.points=FALSE,xlab = expression(tau), ylab = expression(Q(tau)), lwd = 1.5, main= "Quantiles at Median Covariate Values") plot(rearrange(pred),add=TRUE,do.points=FALSE,col.vert ="red", col.hor="red") legend(.10,10,c("Raw","Rearranged"),lty = rep(1,2),col=c("black","red")) } quantreg/demo/predemo.R0000644000176200001440000000775711555564235014635 0ustar liggesusers# Demo for prediction and confidence intervals par(ask = TRUE) # Classical Gaussian Version sub <- "Classical Gaussian Version" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") ss = seq(0,27,len=100) flm <- lm(dist ~ speed + I(speed^2),data = cars) cflm <- predict(flm,list(speed=ss), data = cars, interval = "confidence") pflm <- predict(flm,list(speed=ss), data = cars, interval = "prediction") matlines(ss, pflm,lty = c(1,2,2),col=c("black","red","red")) matlines(ss, cflm,lty = c(1,2,2),col=c("black","blue","blue")) # Now try several different ways to compute alternative bands based on QR fl=rq(dist~speed+I(speed^2),data=cars,tau= 0.25) fu=rq(dist~speed+I(speed^2),data=cars,tau= 0.75) # 1. Covariance matrix estimation using "nid" sub <- "Covariance matrix estimation using nid" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", se = "nid") pu <- predict(fu,list(speed=ss),interval = "confidence", se = "nid") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) # 2. Covariance matrix estimation using xy-bootstrap sub <- "Covariance matrix estimation using xy-bootstrap" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", se = "boot",bsmethod = "xy") pu <- predict(fu,list(speed=ss),interval = "confidence", se = "boot",bsmethod = "xy") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) # 3. Covariance matrix estimation using weighted xy-bootstrap sub <- "Covariance matrix estimation using weighted xy-bootstrap" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", se = "boot",bsmethod = "wxy") pu <- predict(fu,list(speed=ss),interval = "confidence", se = "boot",bsmethod = "wxy") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) # 4. Percentile method using xy-bootstrap sub <- "Percentile method using xy-bootstrap" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", type="percentile", se = "boot", bsmethod = "xy") pu <- predict(fu,list(speed=ss),interval = "confidence", type="percentile", se = "boot", bsmethod = "xy") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) # 5. Direct method using "iid" covariance matrix sub <- "Direct method using iid covariance matrix" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", type="direct", se = "iid") pu <- predict(fu,list(speed=ss),interval = "confidence", type="direct", se = "iid") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) # 6. Direct method using "nid" covariance matrix sub <- "Direct method using nid covariance matrix" plot(cars$speed,cars$dist,xlim=c(0,27),ylim=c(-10,130), main = "Ezekiel Data", sub = sub, xlab = "speed (mph)",ylab = "stopping distance (ft)") pl <- predict(fl,list(speed=ss),interval = "confidence", type="direct", se = "nid") pu <- predict(fu,list(speed=ss),interval = "confidence", type="direct", se = "nid") matlines(ss,pl,lty = c(1,2,0), col=c("black","red","red")) matlines(ss,pu,lty = c(1,0,2), col=c("black","red","red")) par(ask = FALSE) quantreg/demo/arqss.R0000644000176200001440000000105113732374340014303 0ustar liggesusers# A toy example to illustrate univariate smoothing with automatic lambda selection n <- 2000 x <- 1:n/n noise <- rgamma(n,3,1) g0 <- function(x) sin(10*x) y <- g0(x)+noise arqss <- function(x,y,tau,g0 = NULL){ g <- function(lam,y,x,tau) AIC(rqss(y ~ qss(x, lambda = lam),tau = tau),k = -1) lamstar <- optimize(g, interval = c(0.01, .5), x = x, y = y, tau = tau) f <- rqss(y ~ qss(x, lambda = lamstar$min)) plot(f) lines(x,g0(x)+qgamma(tau,3,1),col = "red") text(.7,2,paste("lambda = ", round(lamstar$min,3))) } arqss(x,y,.5,g0) quantreg/demo/rqsslasso.R0000644000176200001440000000070113732602044015200 0ustar liggesusers#Toy rqss example with lasso shrinkage of linear covariate effects n <- 100 p <- 9 q <- 3 beta <- c( rep(1,q), rep(0,p-q)) w <- matrix(rnorm(n*p),n,p) x <- runif(n,0,10) z <- runif(n,0,10) y <- w %*% beta + sin(x) + (z^2)/50 + rnorm(n)/5 d <- data.frame(w,x,y,z) f <- rqss(y ~ w + qss(x,lambda = 3) + qss(z,lambda = 2), method = "lasso", lambda = 3, data = d) plot(f, bands = "both", bcol = c("lightsteelblue", "lightsteelblue4")) quantreg/demo/combos.R0000644000176200001440000000041011555564235014437 0ustar liggesusers# Demo of combos functions H <- combos(20,3) if(!require("rgl",quietly=TRUE)){ warning("The package rgl is needed for plotting") } else{ if(interactive()){ plot3d(t(H)) lines3d(t(H),col=rep(topo.colors(57),20)) } } quantreg/demo/Mammals.R0000644000176200001440000000216312504616046014544 0ustar liggesusersrequire(quantreg) data(Mammals) attach(Mammals) x <- log(weight) xx <- unique(x[order(x)]) y <- log(speed) plot(x,y, xlab="Weight in log(Kg)", ylab="Speed in log(Km/hour)",type="n") points(x[hoppers],y[hoppers],pch = "h", col="red") points(x[specials],y[specials],pch = "s", col="blue") others <- (!hoppers & !specials) points(x[others],y[others], col="black",cex = .75) taus <- c(.5, .9) for(i in 1:length(taus)){ fit <- rqss(y ~ qss(x, lambda = 1, constraint = "C"),tau = taus[i]) plot(fit,title = "Running Speed of Mammals", add = TRUE, col = i, lwd = 1.5) } legend(4,2,c("Median", "0.9 Quantile"), lty = 1, col = 1:2, lwd = 1.5) #Now plot confidence bands for the tau = .9 fit plot(fit,title = "Running Speed of Mammals", band = "both", col = i, lwd = 1.5) #Now plot slope of the tau = .9 line xy <- fit$qss[[1]]$xyz xx <- xy[,1] yhat <- fit$coef[1] + xy[,2] g <- diff(yhat)/diff(xx) plot(xx[-1], g, main = "Fitted Slopes of Running Speed", xlab="Weight in log(Kg)", ylab="dlog(Speed) /dlog(Weight)") quantreg/demo/00Index0000644000176200001440000000250513746004547014172 0ustar liggesuserscobar Demo of the triogram fitting and rgl perspective plot for Cobar Ore data Frank Demo of nonlinear in parameters fitting of Frank copula model cobar Demo of contour plot of triogram fit of cobar model combos Demo of combos function: ordered combinations cpoint Demo for a simple change point (broken-stick) problem hinged Demo for a simple rqss bivariate fitting of hinge function engel1 Demo of QR fitting of Engel curves engel2 Demo of estimated conditional quantile functions for Engel data. Mel Demo of conditional density estimation using Melbourne daily temperature. Mel2 Demo of Melbourne daily temperature. KMvCRQ Demo to compare Kaplan Meier and Portnoy's crq estimation in one-sample case. predemo Demo for prediction and confidence intervals rqsslasso Demo for lasso penalized rqss panelfig Demo for panel data example stack Demo with Stackloss data from Brownlee arqss Demo for automatic lambda selection Mammals Demo for rqss with running speed of mammals data crquis Demo for crq method using UIS data and Peng Huang method. RB-r Demo for testing R beta = r using anova[.rq] Polson Demo to compare rqss fit with Polson-Scott ADMM fit Panel Demo to illustrate fixed effect estimation for panel data subset Demo to test subset option for rqss MCV Demo to illustrate multifold cross validation lambda selection for rqss quantreg/demo/KMvCRQ.R0000644000176200001440000000103613235121404014205 0ustar liggesusers# Example Comparison of Kaplan-Meier vs crq fitting # The red crq estimate should overplot the black KM Survival Curve. if (requireNamespace("survival", quietly = TRUE)){ n <- 100 y <- rchisq(n,3) c <- rchisq(n,5) Y <- pmin(y,c) d <- (y < c) Surv <- survival::Surv plot(survival::survfit(Surv(Y,d)~1)) f <- crq(Surv(Y,d)~1, method = "Portnoy", grid = "pivot") x <- f$sol[2,] p <- 1-f$sol[1,] p <- c(p,p[length(p)]) par(col = "red") fs <- plot(stepfun(x, p),do.points = FALSE, add = TRUE) } quantreg/demo/Mel2.R0000644000176200001440000000222714223044477013760 0ustar liggesusers# Analysis of the QAR(1) Melbourne Temperature Example # Using new type = "fhat" option in predict.rqs require(splines) if(interactive()){ oldpar <- par(ask = TRUE) data(MelTemp) x <- MelTemp[-3650] y <- MelTemp[-1] s <- (x<40) #Delete a few (influential, ridiculously hot) days x <- x[s] y <- y[s] z <- seq(10,36,length=100) fit <- rq(y~ bs(x,knots=quantile(x,c(.05,.25,.5,.75,.95))), tau = 1:19/20) par(cex=1,pty="s") xlab <- "yesterday's max temperature" ylab <- "today's max temperature" plot(x,y,pch=".",xlab=xlab,ylab=ylab) matlines(z,predict(fit, newdata = data.frame(x = z)), lty = 1) abline(c(0,1),lty=3) title("Melbourne QAR Model") taus <- 1:199/200 xs <- c(11,16,21,25,30,35) fit <- rq(y~ bs(x,knots=quantile(x,c(.05,.25,.5,.75,.95))), tau = taus) fhats <- predict(fit,newdata = data.frame(x = xs), type = "fhat", h = 1) par(mfrow = c(2,3)) for(i in 1:length(xs)){ fhat <- fhats[[i]] x <- environment(fhat)$x xlab <- "today's max temperature" plot(x,fhat(x),type="l",xlab=xlab,ylab="density") abline(v=xs[i], col="red") title(paste("Yesterday's Temp", format(round(xs[i])))) } par(oldpar) } quantreg/demo/stack.R0000644000176200001440000000105513033233736014260 0ustar liggesusers# log likelihood for stackloss fit require(quantreg) data(stackloss) logLik.rq.process <- function(fit){ y <- model.response(model.frame(fit)) fhat <- predict(fit, type = "fhat") fy <- mapply(function(f,y) f(y), fhat, y) sum(log(fy)) } # First try with full process estimates f0 <- rq(stack.loss ~ 1, tau=-1) f1 <- rq(stack.loss ~ stack.x, tau=-1) l0 <- logLik(f0) l1 <- logLik(f1) # Now try with discrete process estimates f0 <- rq(stack.loss ~ 1, tau=1:19/20) f1 <- rq(stack.loss ~ stack.x, tau=1:19/20) l0 <- logLik(f0) l1 <- logLik(f1) quantreg/demo/cobar.R0000644000176200001440000000207614414306746014253 0ustar liggesusers#### Demo for an rgl Animation of Cobar Ore fitting require(quantreg) if(requireNamespace("interp")){ ## Make sure the demo does not ``die'' when rgl is not available: do.rgl <- interactive() && require(rgl) data(CobarOre) ### Make an initial quite rough fit of the data fit <- rqss(z ~ qss(cbind(x,y), lambda = .01, ndum = 100), data = CobarOre) dummies <- fit$qss[[1]]$dummies zcol <- CobarOre$z if(do.rgl) { plot(fit, render = "rgl") cat("Now orient the plot as needed:", "Resize window,", "mouse button 1 to change viewpoint,", "mouse button 2 to zoom,", "and hit return when ready",sep="\n") scan() rgl.bg(color="8") } else { if(!interactive()) pdf(file = "cobar-demo.pdf") plot(fit) } for(i in 1:20) { fname <- paste("cobar",i,".png",sep="") lam <- 2*i/100 fit <- rqss(z ~ qss(cbind(x,y), lambda = lam, dummies = dummies), data = CobarOre) if(do.rgl) { rgl.clear() plot(fit, render = "rgl", zcol = zcol) rgl.snapshot(fname) } else { plot(fit, zcol = zcol) } } } quantreg/demo/Frank.R0000644000176200001440000000212111555564235014217 0ustar liggesusers## Demo of nonlinear quantile regression model based on Frank copula vFrank <- function(x, df, delta, u) -log(1-(1-exp(-delta))/(1+exp(-delta*pt(x,df))*((1/u)-1)))/delta FrankModel <- function(x, delta, mu,sigma, df, tau) { z <- qt(vFrank(x, df, delta, u = tau), df) mu + sigma*z } n <- 200 df <- 8 delta <- 8 set.seed(1989) x <- sort(rt(n,df)) v <- vFrank(x, df, delta, u = runif(n)) y <- qt(v, df) plot(x, y, pch="o", col="blue", cex = .25) Dat <- data.frame(x = x, y = y) us <- c(.25,.5,.75) for(i in 1:length(us)){ v <- vFrank(x, df, delta, u = us[i]) lines(x, qt(v,df)) } cfMat <- matrix(0, 3, length(us)) trace <- TRUE # a bit noisy ... trace <- FALSE for(i in 1:length(us)) { tau <- us[i] cat("tau = ", format(tau), ".. ") fit <- nlrq(y ~ FrankModel(x, delta,mu,sigma, df = 8, tau = tau), data = Dat, tau = tau, start= list(delta=5, mu = 0, sigma = 1), trace = trace) lines(x, predict(fit, newdata=x), lty=2, col="red") cfMat[i,] <- coef(fit) cat("\n") } colnames(cfMat) <- names(coef(fit)) cfMat quantreg/README0000644000176200001440000000224411730155434012765 0ustar liggesusersVersions of quantreg between 3.70 and 4.75 were removed from the CRAN archive due to uncertainties over the licensing status of the fortran code in src/cholesky.f. As of 9 March 2012, original authors of cholesky.f, Esmond Ng and Barry Peyton, have now, very kindly, given permission to use cholesky.f under an open source license. They have requested that their code be credited via the following two publications: Esmond G. Ng and Barry W. Peyton, "Block sparse Cholesky algorithms on advanced uniprocessor computers". SIAM J. Sci. Stat. Comput. 14 (1993), pp. 1034-1056. John R. Gilbert, Esmond G. Ng, and Barry W. Peyton, "An efficient algorithm to compute row and column counts for sparse Cholesky factorization". SIAM J. Matrix Anal. Appl. 15 (1994), pp. 1075-1091. Use of the sparse Cholesky code in cholesky.f in quantreg is limited to calls to rqss() or to rq with method = "sfn". In the event that readers wish to access the intermediate versions of quantreg that have been removed from CRAN, they will be available at: http://www.econ.uiuc.edu/~roger/research/rq/quantreg Current versions are best accessed from CRAN and its many mirrors. quantreg/.Rinstignore0000644000176200001440000000001511730162776014412 0ustar liggesusersdoc/Makefile quantreg/data/0000755000176200001440000000000014223041040012777 5ustar liggesusersquantreg/data/MelTemp.rda0000644000176200001440000001462014223041040015035 0ustar liggesusersuOn]GvpvFFTHXDH>Ez$匔I h:@jdx yހz܀3M{Ju_Ꞻ^njkk듭O'}gۿ{/?T~_~(_[[_~׫?/?Z}?ԟy/fe۴<ٔ ˭_4?Mԏo6*JIiGyƭ:93ŏxnSgxG7%xOS?gN<=,xo5{$הOSA{:e^?AwU=/Г:7T0gwj\Ì;Wrr?yqiǗ~͓y,<)=Oǩx茶7Kaʯ~fv=4?I7C>= tS^ʯ2n'~g?GnӾ~qOÏ0/38o>9(C?ƼR'UAˏ~~0")rmz_y}PQdKsey/ß§1yU^_GzwSZ?1/ \v? _v>SvԟdK)zڏVK|+~Xw188vb1z?'ԍ;t“09'|B4,_>o}<%<%֕uڭwgIg۸=qx~|6ދ? >Y-N~s={7O˴]+75:ӯ0A/ƣMϕ~+=o'bzO|':_}?{4ťg?;)^>x_x?xnVOSǯƳ쎟~'C_<o?r蘭u>a5 б<ǣ ݍR:(8dNXG#v=ucȧt /]{)ŏ'.C:xy[5NMv+~|,_;7uܣ|*w͟77%ÏN=ec|/ocw*>sQe}!.E7nEGzo\| ?'1=_~Kq>._^gҷAnyo,導]Y'īg?+;<7sn?зosv8//nƋ_o# {/Zx|vr?p~*%:۸<2[#'x:_;OP_ 9wş->=1C)k\H/ λ%?įwn=/$q|>aG__ot\7%~?Ro6?q=7O?q =y3;X-=;vs~Cv^/mnAӮy^o_n]%/g,p[=/.x><,C^3O^Oϴ}}'z1a .vG1uHY';/ϕ ~iGy\Ӿ8j0p/|O|~SϯG.ȋ}n~Z'Wn-]]~gݳ}!O~~7_f7pDO;Jrr&le)~Od<~:n/g0aw3XIqJJ2ơzyss2śRBŽ;ޡuɻ?&urx䷸qnWnI}7KW1G7-;lq'[rc\<:?Yۍ[IP?=v;UMi4o ~"{q'ߢН%zzgfyʅ~ȣ;Ƴ7|8_[FAV||AOh3[?89ɛ'>'~3u%~J)GO=O?y_g~uw.y/=^z{mN/zq}tkCOaً}Q?Q;,ž2Nނ_G|7uG7e~п40>3?Cބ¿3zL~{|gi\A|Oc?r4Rg~q'>{mSo@q^ʃ_\^=1~};݇/\qhڭƑ鷛q7]~"{b͗1_t |k vx]3/?|;K7_}{H)8ԛ> 6Nؗ˧X|_ ~GC^ÞvkN~S47R5~Nڻy!)Ag}<2^x2x(_G|ĭ\,!ϮcFdk]K yx\vH!\zRʹ3}qSˌڎMfo;G\ؼ[޳K_ f~:go#|/!}~?_zl~hڙ9<{CKz=GI3J:sv?3wog|HNlo=ʾ'5{}=]Oڝg5#zH>FGͼ鯟\pg{R9%|3n{.~3ΛOHݽCGS4piji[yH>WoƝͣM7{_|ָOly2Cj׸*W=zݗί+` ;z<~?{}{;f?o~Vӟ/7$C?˟/g6ܛ7.SYR_~wMSܺuO U}IrW' =V''>?ao> ;{| \zм>rW,XdqdW>Iω}O%~㜽_,{޻K<|~^<cu߲>:p ģ[/ݗԛ =Gg^qN2ܽQ ͯL=oGRg5wBu_.}O;tqeS<|ݏxۓV{ygx}tg r;rWwJyߏ1ϹRҗH?f'k7fy)|ƺz_џ}o?\S潧ygG9O9ϏG<@C?v).̓xaqK~Ked\ŝ_?|Zrq8-A֍|79T91}v3V}ŌW6#;0r]vzOfr{!3đ=E8zD}1~y/xaGߛRz?KyOƞ7ߟtkAW_?^SO7 S?|>oQ^ykc 5/{qٰ瞏d߸^un?|R&ȅ<_#ׯX'qewynl>jʙm~7Ϳͼ}y~ xF^7!擃;>7FwlāO"@ϝӿyVeyϣ ޞރ^ K^jwv >"??~(>͔szrgz=~~??6ɭrquantreg/data/Bosco.rda0000644000176200001440000000033611555564235014563 0ustar liggesusers r0b```b``d`b2Y#'fu/Ng``+b` 2@egQzu_]=zzR]X t%0F%r΢r=d- w ,,ɇr8 R3 R|\5 (aI,IKAwTrNb1 WJbI^ZQ"ب O \quantreg/data/Mammals.rda0000644000176200001440000000170711555564235015110 0ustar liggesusersKHQjXc@-";)l&^Uij^!MDPE-hQ \\ZD-UFM"oQ-}7944樢(yJ2oo"U_K==~E_=N+=O@@Pܗ 4M{I< t%aDu.R4lI.k"mSzd8CqM7&h\(ob_בםO=Oݤ5wDJrͤHב!]-x&>[)_FZNkзv۝生*tw /m~?Q|?Z*paD#D"렣4WpԽ4 Y)lkފ H`;C~}:8_O3!4.|*Z{Jy~>sT+%y~{haq^6\F?Gp8//y♟'lqk|E|zb>)}:HB! ~ ΫWFK).ʶgɧ"ꏋh>.i]~ bfu)۟h# ."ȺFGs?DgɞGd6d0ycS6MS}}s}?HFc1ؘl,66L^.ip:gYp6**********::::::::::&&&&&&&&&&66666666663c9Y5gsY3g-jN󛄓Ѷ@lFOX6quantreg/data/CobarOre.rda0000644000176200001440000000070611555564235015213 0ustar liggesusersuJ@-(]p!.J6mE1"Z!t]Tʣ|q|999d2lenBEzS3Z-GV>zD̶[zW,,{ɳ,zk`<bbK/m"'LAnxDq0`_xNA4_M)Cl _DE|e}ؘGrk 7fp*c]o΃yO[ě.zNJ<,_lb{hKdף+L*\Oq:[}x%|̵'^$S$>H|=<@r{LeI!DYӯW6[}h9b|{">R;/RfomΊwB\=D<j:\峯JH] ptB#bm9ӖCjQP~D=?"|'̐ Jũ;\^"?ΫΔGXz(($:xߌx׷s^@lRa`1+n@\Ⱦ'@Ya/AVYأT45g-r_﵀.GB`,2.~ ڗwc=lUYr,3ofm#,7D"iP#(mo ezG}_L7=1H؟?oKykȺy ^lErSصoٽ9|]. ʆmK!KOyHmm- EwvgE;E!yߊEoC"gBmVmd*!j eVJQD&5$8g!ǵֵaϰŷwMvRBW ]0Y O30x}ZF{F=3|lu4^l5d"z*ˠYw*q+ m8貃Wz,HuOl5Ο VyRiȯ뽬?]cL?߅[t9ET7Q Y-.\z`-㦖 5PnyУ\ 73 8uԕ"G;3D,y:oz)du3 ycPK|ƻzWz#r.ן*&tDr.O^\ O_##D”[kvf24i(.a_ȢmmH}?BώE3ݑS8Cl/7*KbR=7mx]}bʋn ⎫y1Ï|H2R7\(ϝ:yq,W򂴑% #_D̳Ca]8H1`V)R-xb`=U,5Ӏ/?3i/!Qzq6dUu-y_5R]R[XY)k iݝ+ /gsz/e~phhBԩF|ÇUAV5ITF]}-!UW?H# )VLZI \WЋsci> Z>Cn{` W:s w Tdvx^uR>eZZ9xtev#sNi#L8Mݙ&s;Zu*/ʶ_Q#C߬A9L[lXÚoSXhTN ;mCEђ:d;v49B…[_(ޣJ`;"\RWCfh־? "r'W/=eib6K2f)F̧O]/Azݭ0HO {"@s`ѥUPD-}4 BxuvC.b(AR_nW~ >׮Dyڈ7$?V@\y1oBڜJqg:RLP!EUnOD٭3>e*O@ uǵ`",H8)wws.0d#<9C#;k(,3a|UY+@hMgij zHwjx^ynݩ]4).Ԡ9<&oo<j[ɣ6GgچM5EWL )GM⏎Y2"nuQ}CdJ$nc}mrF{ܚ!G| "+(E cP$'*}~WoOWBlVx~5R|7MZZ*ڎFѻ#펐Ph7z7E ӆXH[? U3ǚ-R;}xG"k; g![t}r#HT*f{+jIt`@1F͡jVsZAV,J3/kFw﹠4B ^.B4,`]q!wkA2!{'/haUe?tem Ɛ;rw'|:DbȨ-LlCꏮ&H2.iO.c`}M5}p>߇=TeNC,Y\xdE  1b0`!C  1`M 61`M 61`C 18C 18C 1K .1K .1G 1xG 1xG 1O >1O >1C@ 1C@ 1C@ 1CH !1CH !1~7̡ӜNN6:t)jT39̩fN5sS͜jT3C5j 1TcPC5jlƦjlƦjlơjqơjqơj\qƥj\qƥj\qƣj<ƣj<ƣj|Ƨj|Ƨj|&j &j &jB &jB &jBі0% m C[Ж0% m C[Ж0% m C[Ж0% m C[Ж0% m C[Ж0% m C[Ж0% m C[Ж0% m C[Ж0% m C[ՒJڞn!ns-o*j/quantreg/data/uis.rda0000644000176200001440000003761411555564235014327 0ustar liggesusers}|TA,!ٔEԼ1"-i[ J&6 ޻X{O(EAE EDO6swBy~ɽwfsMӏ;FӴZž[6fEٌ}cԾhР6Zж6DhM# mhSա55M6 th3̈́+ݠZ͂, =:\΁\΅pu }\볡=?\p= $`?Cze];CPx> 8Gp3#Hy<σ(?GCp X78x>x7O<ˡq_ `|/00~"'0~"&AI'AI7 M0n2 &ø0n2?OS`7MqSaT7Mܩ0ni0nt7Mӡt? 70~f0n& f¸0n& fAYgAY6̆qal7 g90n90nw. 0~. 0~y0~y0FB v+-[X-_xA 8"+"+"+"+"+"pp.b/b/b/b/b/b/b/b///-----KaRpJpJpJpJpJ+@2/2/2/2/2/2/2/2>;p|xo>7-r-r-rppp+p+p+p+p+ p] w.p] o!-B[x o!-.܅ p+****JE\w.Ep"]@E"_ 1/ŀb_ 1/ŀb_K /%_K /%R] Kw).RY 8Kg),9珇p?ZZX?ZX:N^ЂC r<~ ;hQ=um D@ @y o 7@y o 7@9A VA r@ w@* @* @* @* @* @* @* @*AjAjAjAjyApSw#7oyKv-x.'Es⼦s<NQ< ?ɛ֋I=Y.ίr=<> ;dd{CۗCwٝ뇍W7C;e6ۃMe:`z9ӵqo_/4-:yf<>~.Ck\9y.;>&w/-{1{s̿xټ8O&] 2ټYL8o1o"λ+-Pةy›= <GY>37z|W8/*ާglks9(#KCz2<ٓ;C+YOy3fre*x!C ]gtW-Cx9 _9-t&{rr':oKR!?ֿ?t>T蛿okBoݙxXW E={[O{(nay6OE]ӝq=Ts8e*%߸~>/%f)֓QR׋]g+kKTΛ^w"_f(ۉs/&W>?TשOW*bwE}x8CG=wU s*Bۏz)Xܩ/9$>@Rׯ }.#?7a_g6? Bw]W6;亻=uger1MTO`F:8`_/~,v? zE"2Y~u0~|~;3}?~ ^7Jf߁Ǯn<#ә?O7SӘwqo +??Kl=]:;ۃt+b=Ll^"wpo<[Sn 0|&cg]0eDE] '093$xՙ&Wg?ɃZog}MK#t^փM};0;:T+M2v`yQ> ^q1]㼑4񰩨w1RzME~5Y?s?LQ䙎L_~3:I]G~RW;`;nSuowf4%ue"u[8s<鹣NTcbh*Qc 9R7u(\8E.RWDx~~75"\*#\ojO=.zP>]vܿ\*0qyD?\RɧhaSKܺqD~X|j2h.1UR.vG#Ô33zF6p&ɋEdv]Yp{Dx~W>/kaBm>=oG6Oaơ+_Ƀ]Oظ 7뛇¶s}nv_m=߮mD5о7'k=k s\a%󔈆zZ6V?pP5N"7]~Şa۾rΣ/\Eߺ+> #aP>nuT}P vDĵ.W?~vt0׍\hsIecy[7NZ-}$%(گ+&oI ~g򅶓x+|}\_IT|G;ӳWdJP+15EESq' hbW s_W3< ;`r$)G*D[ p"r""uQ[{(/UG+pY*c|鈣.Q7E;/#C2~tq}:}h^79PSSJ%{ PȯsަT~wǹ|\ߠp절HEW0uE|i{>/yBʞ/qV/F*Cԏ~}##B 4M=x]~c w|S顩on]?hjyÕM?Mp ]oC㺡PC%צ^7v= g}yp?M*n]g}`U:`*_}сσ?:.O8Co9Tw O_/U{`pGK**{N=onu:\?T~zo`ٱPyWX9::::::::::::\1G#H[ E ];ey]_# v= SZwolkA}Gá#Y?9NQ(7G2G0p>d/oÿkv=QEyQt60/g:ɍ^ ifc dvBA}a x_k.[Okr{0?e,k:ڡ,ǰ8ߟ1i=\OSvhkeL(z >a`=9~!Ձ-jy\Y~XWN?~eC}g~{}8C;5E>F?@y139c NLw,.0y77+wg-`q3;G89 c&mF{xcv)dUпPcx +Ĺz~v=g$?Bbfqz4Patvޝ~>1o~1C\g2ۇ B}y Ⲻ,J#%yy꾺zd6 @.n&/|̞Q.犍v~Au5X#{:aޱ\ v@Uv*ɷ_4 ~WiBܗ)HCd7,hWsm ;_0/ bq~̾C @ޚEWdv΀rV}>y}]>ѹ8S`<?c~r~{ &`_`R>s3Ϋ2gT&y*0ݞ19ʿ4߾:O1>rٹȻd`>8<΅/{(Q˺,?GfB_gCa?O5{j>7=4t}gC}Ÿ7Uz֟ @Oj=Xk_慦ZKi(/h?;ԸMœ*T=u{|C.p߄gX9ԿPZo;55.<|և?³ Hy5VaOuY"}qݭח6}k^~nU?j~xkD̤7Y?m?ky=ὺuicElSyvֻ1aŃR[|L?5yZϹn=»۟Y=ID? Nx=yzb{E"^$&M׈WO}W$/m3wG>$q2~RoL5Fx;oRimrǕ6LyӳK7[k^Uw"YO@'l-,-/&sUFrC_-Y.5O>a)~Ǟg(ҵ"hK爘';>7j}_MDe뇊ckb=ێǿ+j^^\nu Ou0YĿ|OւűE%{8m{粏.ޢM{}'k"eEnX iMO!z(n˄wd|M",O`i2>^{Qx8ar^ 1˞xsϿ軽yMrދ .[اܱ|ɇq>C^ư';{H=Es-ͽ7*u?<]'-rާW0?gc nK1GSqhYsE̷[Nx:-4[+dcsX%-*~Q4|/k+#Kмqڼ6$zW~xŒ/_hGב??5Vux"w(o/ڮ3WDLƞt'Kckי\`tOc_ūtr6Ec=w8 ꀨ>mTxE~53{J(7ۥ%>yOdBf,ϼ愓Px:ߑO϶{_|i o^훹yY_>'ߜ%b:y{Zxg}M.> ;Ƕ;Pn;/|űk}ʣ7VO3+eq3X1Swn+X#o7&J?9ev 'ƻێNzH{]2=EL~ڡmΉ7qX9;d}wJe+/TFc$C~+ԉ2cq>j]W8F9pm+$[(%x~U"n3 :t?*|tR'y_-/̓>EM\zY%;)Z=wU+km<{^_y#b9Ϸl3Enh .T}g &okc6 MD|MqgD}}/H9yW_Oz:MpisE5܇4kduCIC}({\{xdYgy;~N#-QN~|/^S'(YA}"P7~<˟}䲚dWqik{c[i/NÔ qἸŸ6"eG}8!D_x>qnV>_,N8{o?7kƈyqĭlkE V.}3\hn?G Ծ^k&]7:qL߷̓ߟ~8nstKr \γ`׃~YS:.V3:x_ʝcrZG,FٯeQbr09~I׳AŞK=m >GI?OcQA5f>Z*b}[|{îN =?37}qK9^|9ibݻB1xo9s)%ן_\Q>qRc~"|㗯sqE^/\BI[l}9ђ] W]s¸%E+ʧ'ng&#%)0/#_5+._9xV5 ;mf|&x=_󀃗b^fx+Q냻7ۤ.hGίZxU[[8|r#oRKR(:z~ƅW[*\.GSg7ˣO0K<2\̥^t؇|u~}'CGlʄ32wU^yineC_{%zTڷo?py]?bW|ˇy?sqr^?("inx+4 l=LψL>6r:|L_+p^Jw~h6?ʁ;;!x·)|s6){.n'p~x~yT2q1|~ܮrLxb~/u{5>|(C'L|?9>g->w#>Wğ#cU8y3THzazJ>{l\//E^/um~s;I^C~Db^|[:Zf8/3tOrS3)ʟ|xfsK~T p_+iV:Jyy~|תѪ:ǥ߹*xAU韪q.<8I<7.g^}_'nWߒy wy>bQRp/91`]*{*PřK'?a?ž!G{osxeD{-8~Rxwn_C> }evImp.lЋBr~7QW|>\|>aWXC|~gG9ZX+F?au fyv3}fvdq!j]8ǟb9c.i>͋ͱ ~g<&?.~-A8|a'# [_n;8[w^[X\w|)ۙ.yfя+^Tı\?ڏI~/[u'Vvqfe_1zu˛xm^g0zūނ+9CgT'ˋ{]~xП߸r>EhP_*3Z{_U|-V'#O9_q~yK1G|%s?nuҏ>qxQVn!?y_)/oqOOɹ졡:%w[\["gbk=>Ne-Om{zA}ەd.G,9_<׵;O+zl?SS;q;X|yS߫y;zkk}ߖ׾J}?:;vgm絋O_8Rpn}ww-mivԫs}5U|?_;|5~߇91gQ7*}{m(߻A3b#7ԾnoytE_pYom oۿk_VʉsM}}|@5@CۃH >48Hߛ=7v;Q9 Io,}E׵9 X'rݵGߵ{#A7{9S ڭo+G_M4uvG;:sY5A@y9UEr=(NsYW`_U^o~]'H=,߿wm0~#}5A#˱-ۃv:q~nX=N\[ǸUOC'x]PO|;w߂yG` A> q_Mjzվ >1V\+N\X# ;:J~%[z TNvF|]MAJ8C?_9'zQ~M7A/>Oc/\柵AJFm/ݠϓ}"[kvkqr \//|u10^Юx<si/sE~~xCba:'?>_||2|$rz0<vv3UAE!^y3X'W$?\v׸>WnO;TC#Pn98v>=0/~x@?CD^>`sA>z-$~1ov}+ogPOd&GE_Dq\6'ʉ~=Cd| qEu\('/A._y/2ohG Ccc<*ZP+3 xo}A?_A·3ȷ0nyghvzR XoLԧTh|+cO~ owЏmbv='h>SqMqۃq#|A>Ǻ zZЮz郺@-͂ExYio'6ނ:A;Q= OwE3+eb38(΋F\G9/pBh ,Ǎ]_B jѬ~NjY\2{FXO^=A]!ú:_O%G?~QO{Xn~[`ۂfy g+|o׻?|WܵE]A_* ą/]P>8y~A?r?~v@]u{ #ܿK/u49п&7Tp_d п~x@wcS߿u;TT4;_SaC~S߸j,h;64555(i?غ}eS[SՓM 걡`'M ݗ5mho'Z6f塀sG}{O-z-{ddˮ#^ð됬lv԰!9YоsrtZe :p\5EЏ:<.}GL;qm63T! H2P))]O)']dȟL%J?ɟOC%.1tK ]bC0$!1 aH CbÐ0$!1LaJ SbÔ0%)1LaJ KbXÒİ$%1,aI KbX#UbJT*1R%FH#UbJ4&1$FHi#MbI4&1%FH#]bKt.1%FȐ#CbdH !12$FȐ"K1~G~4G~LtR-R-R-R-R-tB M'4tB M'4tB 4 B3 4 B3 4LB3 $4LB3 $4LB3 "4,B"4,B"4R -R -R -R -R ------ - - - - -2-2-2-2-2D'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKtD'.щKt .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K  .1K $.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL$.1KL".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,".K,KoL]Poc&tZ\0gʾ?k?YW]quantreg/data/barro.rda0000644000176200001440000003221711555564235014626 0ustar liggesusersw\?RZHx+ zgPZ%%Ej/!Q4DP8׳|u\Ǹ?\{RAA...n.naoƟ1 0Stk..ɌS G(C;aRO!*Gn|Pt)[vQtbw6.+"J˃ዿσW^B{$+r]o)5 @&ܽ&piI*N[%D 'Tyowsঐv$%W/! V ^7¦,/7\ӟ;*"n̅sKsQ'q\)O% YoHjU˓KyTh|]6#z D*?v V&7L= gO < v/|DIAHV0Y5>?pJ).εK%©aUxJx$Ͻ*P?n '|߱ &n]=ď̺W űÍr׉P)w/ODY[6u"HsY \b'\%vBpXBIJSa~5#nT-xN\+tN5[|H[JK{ 7d'"t`7xn r#'xx=h Ѱg|RnyC[S_גj獎}ULMKӂ `dz_ .?K^Jx~( _KR[ԯÃp_=bl>[{rQ"P&h%]@_Vx kOKuvhQޅD9~>nU!W:| >+l0 UOz'M%4z TEp4UKUjʠ.iK[U/5\E&B}~8)[xBw}-`$:9\[;Znz ȼh]X^uϋBgswxqHnl˥HThznDEΩ/Bbw\=ӳtWxa#r hZҎՋYi[kD2+E~AbH~$d)1%?NH)F$vT!iubhjjT$s4(jGɥ[ ^_^MFJ^/"P>S-ʠHJ#$QR/!iƶHƪ:S$))Ru!9rB_ #^w7+|$kү2$?6!!A7Ґbym#hzRS+5?oA_UyZ:RZWm=LMGGtF髳"Y‰EHZ0vT$cѸl9`$Y( =G ~p\1q1vH)*\w%cj7J _>BrH)iڐn8dQR75 B&Eh5 Zײsb[k' oҖ@c7RJh>+oY-ዔ}Yv)J FM{]$SߴzW 쎤ƛ^#{2ȕOiHJ>O$-PZI3+I[ϻ|I6eE rf7F}[y{(j7F 锚,cv$97>93_]쏦lFu/~H&D-!h޴xԘ'.;_1y|slXa`%sRwu_({A|kmB+S_َQj Zx~ ]Yf4 ֝PqT07 ,C''4bTbv-`}u UN 1nr_/@9;T[$dQ o/XzlLC9@s}& e?:qy,~`w'>/}3Y C2fq۱_]|ۿ08ʶ~ X^T,q1- ؿ?\ uDBz!n!C++L@'{~n08Ɋ0x"Ö૏-eS~N»YR?{00q!c;=ҿW _H|a?c'_YL(obxcqC,o%,BX<&#q92 v,#:3=+Gcs91_c?0f]ώ#ϧ˰"qz `+Y-ۯPuxy;V;wwEQ̌Momx]/1|L oqbN#7R?3y@;7< {H¼OAWy;/YQCmy1?g^OBޏzl3LOr!2|/o~j|hj uZl*~Gnȼ #|E|Љy(wd~(el'a x|m/M+R8Jq>zz _Xao8` ^0Oa : ټ ؼp|}ż[yhKċls ;9^_#y9iO_ɸMcN|D̷$ނp=7rTA,7|0~\ׅXRyR.>q[p<8%3c||FC}1[|$ߐEځ?Grhyo_>qA'N>GG"n9HIE;{1$:o$^}H><ߎ2I`;Jdy*|YROx 'xOus|$K?pW /$#'r]_9\'@S>_^aX/RJzk%6#6\gGX.$_9}7QXod]AYWb>؝S839Nu6<-OH{?}_·d}CbAI;YW6"2O!Xs:H?$9un~{qJ# M7:ۛ1|>/I%ϓ#?OHqKond}J' 9cd>$!G\7zf>'ޤ|Y2&b}T$|S2 p!qIگ?^ 7/Ew[OdEd]@dG A88~"_<d݋쯧ϩפ8._zu{bSdb\I8SDV--Zyb|$|u re0@"1_v@">J?}B½y4eiHxhF~UF"f؞E.3Zv! Cv5IE̺ nR׿˙_|Rf2$NRXI{v*5R H"t$2@QΠ#sqLئ%xʴ\^$vՑ)mtK}QpQi{ރĦn{5[LKp){ĸ4^b&;սD疩4K>Gbǝ'Y!Ĩp'H\%dm89Kk߳ }N #=? I??O؛WSzs0=K78riT7"}чl]܍G ?J#«FH\P$6t̾Ӑ؀a$>j4Ks^\jҢH|_lâTs ES|lk C3Urbmg>Cm2_ j%cl EfmwDl"pnͫopY]Q ݏN3HCIm$B|ZfN¯HR褷?NؑđHؕY#SO(<2d^6ru:+B-9߶VoxTPK3%|}s;$vj9p\VXWݝHlx܈R-.IMT\edz8Msĭ$rGĹՁgdOƅq%>;'$00زu7G摴/2#3Ƽũ%Yvu 'c!׿uV*mk }%|.q׿&xJ`|\z# ri8/՞%?1; 'eY⽗ho^}%D)O⟰t U)gk %Ku$qf?l_mz7CT9@)X}(_1VJTO@Poww{1ѐ9 ;+aHe+ك/EQ's-_xxj#ė3q'~ B|S~>kT5-Mk>E_. D~DznBW!W:A2=P77y}lB$Ľ]xش#ʈ6OU *ǗD$`蠧mY]lP|V/rNo>|"M_sI==gfehޝklכAfBvDSDUSX@4%DjpsDZOdQ::/-k](/ɦF[՛=cu6Zo̅ݺkbiZ4C i2CLG›x%SVvvS7|=l"{g /0Vc9M Y_9!W ~eN oԬ)˿Snë1Uon aK}:|̈Ui7A*OC}򣓪k˷Җ"Ѥ=ct!}ŗ q_oBV[8oz?imO)!3# @L0 ^7 UmٟRVOD2Cfb.!.nDHd4ux7-ٲJb䨑Ühwv?򩓑VKs>?ІoH^kMzx#Ӿ*)p$&fqۊwu u.*v}g=Va:!a@̣WSZum?Kqyӆ {I΃;:8:R惇h^k7*9P~~CnrPkNw;PΙ)tg k>m%iC C 퉺>? Oֲrߜj! ĵp%k.'Yj+ŗHphWvfYc7RP\G;jL3x q3Ts{ v5Ztswlp; %A!sieHHɼpo vܫ|3D55ɇX>%,!SA爭!Apkgl>Csǐu;gvbߙGyo3C1Vj<_ f Xޠ w᫜8!m^R[ <*mV]ʻu-isbį6pX>qAzk!S192a⽿;>o3W`>bq&w _\\n))~{fރ#U&5J"BaV@-7Q< OD!Ğ$xj9~%㜌_ص7y㻖0`ňws݆su+mCHH^ ,,8~DJܭ'&݅{Y A*ϑZ21O~OW 8Ha!8OS{Ȁ$}9|XCr2Ր.֪$17zkѲC %*񑻇 -v[ 侐; yޖ}K" im{H,x269FO'@|q*Nf)WC{!P'ĚP!Ъ2;uֈEAzŤ  bZK# Oݺr6; m駡ZdO!㽲Q~Pn4 ' =m傢w CբM*NnZh+&ޭ3]{1SEs*8B~[wB=Z;YH.ȫzB݆%˵ղ3? kGëO!o#,+]h`f02N>@iDs$/j tׁ|EUdԛ| -2~<~3fD1z4n`{ ШkspsZfZPojPi{ΞP{Y6P'wkԹY7$`8Dp 7&cӻʓ!տCgCL=J"fƘK\7YK[{}G5B4O/*?Ew-!9™LAUܹϡpWj$b>KL/{bO52s|:PܼhmC(i|a&Wly=2 R!VyK7̉ZbSN܄B?￀"./&AVFDކe3PtQCJ앁2C&PJN,Oϯ;o^  .?; lgPGSdTอ&bAɾɧ6@F ewFOkB;6&n/y 2`+d81^j○g9;S4BH(ef}f{6'wj>15ʏ*-{n6(R"ۥ@MAbOK/y_u̲a9٤w|[T鞠y*/w4HQN>5~B>P1kxo>TTb{ #ĠTi›P5}h ~4ŐÇnx 9x߱&xj~γo"2\Z rY{!aH3T<%aWMwL;@zW}8JP=$`e9.?ay P IoǦY8 $WNCh)eܠB! -Zgǽ љ9a%y^Knj@Щd qwgLNBMvYK&ƕn?O2B-on,Dbb~D\<>ʜ~BR4pcԫxȼ:Gת'8 a‹Λ ]f} .jBdHd11YyB !v9OkfIRO *rʊ>Sfb$6@b\("N;pϒ Aˮ3"91ê*אMsvzEMhÇ \e8x(8p#do.ט i7^? qۻך}fCf3'L. ,{2nyyM\wDrXr:$2ӱ ۻ{XⲙO|o3ȍҧY,]'?3Bgo&f/#(2_9r*>kvVϱNPGF1c!9P,{9=c9Ƈ3dEKY &~rWW ҟXm)`qVrV{ӷW^fm%tPjsLew~#cLU#f'Owy+v1`{SG?\?@Ǯ1۶IP(O6qc/ ,q}f#NP eFԏ|#7 eLY-7x3~K^O`9ZѹzЃlc.'/OB*$Us*3~3]eŬfV&tK68RJ%eEk=/3Ɉ) q,B'~3*!ȭb%vdmT@I 6Vxq1޺mywwY%8{mg*s{IJmYgJǜO_)G0pUS kzG4(bsc%} /[8s[{/*ẹQte*#P(_*̮wS$g|fmt|%gj|J[.F nW9as>K_b}woþ̨V W)w;O%j>Ky vegL_e:yZyY }BXےu)HXy8ck'B[-/Yo; J8@~rZxUC\txdVC}YfE62?)7sg˶̄$v/{s^'$fZv?D+?|oyqAl>LcyDaE@ԊnW|"u=@z;B{ ϯq C /e*W!w$/d臝.Hcۆ mEk N|`B.Cږ8&>q"«?Dyd"~y?n39m%:i o`Ԭ},bˣ2g*&6& γݶ rwey*O7K)5ܙ'ę '7 '-aܰo5Miob1mYw.z${Ee&e,Ĝ .7T?FU7vD @hpuQ}k2=w`2Gxk:rF9FiR2{Bjp ܮ~}W0kڂDoX? !ӧptݐe,h>_l@*m"LјE]ֶ7ܶmZNIB$ټV\}yϖXlQm=!30{.J=cjӹ.!Dĭ4 c|Kw7u[ĕ%R s;07Xz Ro_ms&nIۗ.@ˁ]O> Yvb[{2FhßjD腪ID0?ڨV_fU8pṲ[Bpo4frD:ЊfG,LMlxK[#6ro^ )|Vvt%S9gzڊ3`alA=6F;;:d'V*”F7ZOndE✙ja0p7f!ꄍV#-fT&lY9 Z qF.>I2͊fJVjuj5jF>]Q[ێ^PQ-GҘj|6rFB֎ja 9M֖VGxzD)-T;%CUZ[ө#kR-A;e~xD3!-U:~- I-GƢzVv4C;z#S 2M-O6:(/[F/ l>llF÷i2AdBm;4TFGtаSitФڌ_Ӛn2j^%m)c92)c92)c8?92)c97Ǐ s4SP(S[G; P$JjO?FuLR(+)pNNҦS 3|κՖ,ɓ&T;#tF~`~30pASquantreg/data/gasprice.rda0000644000176200001440000000310412505055730015276 0ustar liggesusersu_]WODD(҇PJPB.y*ý>}Lߍkϸ;|<0?[|os^n-Q/8_|)Oca}5)aukxw$JWXU?r^~W_>YCs#KuF|w|E>U>dN,ʟm`sQ'_8ڼxOU>@8 {Qu5<jUã!i?qUb8g[uV`<"o=|K_}_fuUPߒ -6r/R^L򐽕8+ϑWyЗv֕$}XMH:.6O]~6|sQ0_|rj}B^Z/  z_xSϊrN/}VIOe{:ոV_o]5[i+G|ռx(?%a jcޡcx8;;uߞ_7pLK6g~Q7OTWI݄t!O~Ҟs3=Gj9:5¯Z<[g . j8ு'f#/G7'Ը!NY;Ӈv?ސG-xǓ{s^sߔFo SOXW,cO8'uB&7>sEh{)y OstV`ZK_WuRz -k^c~&z1@\x>w @©y@O/s~8\~tX;t_O XxWQ#ƟpA<<'xt$_O?ك.8=4+8oox:>'@s<ꈯ3Yp腃(5xLt?}ӎ\usNVD=[6ƫOYufɘ|=}Cϼx<'/= ?OM|O#v=R?}/M~ַCuO-eL_ol֩O^:C=q 3;<47'?ç;y7od|<_\{e/.jMquantreg/data/Peirce.rda0000644000176200001440000001372211555564235014730 0ustar liggesusersK\uK0D . [^ddԋzz!C9#ddU] rYz,2+Ce꣺=s@:UUԩW_~J~?rԭX'l~rg =̥.\"tWe"2@_ _$tPtWUW+(zVUg1}z15ag ;kk ;kYvְ5_G:zѻuƱus_ֱucg0 m0 l`g;v6 l`gMmboqn2Mob&v7Ml [Bп-Ƶ-l1-m3mncw6v6mocw`;w`;.w]bw.v]{c|{CCvxz靃bwE[PٻGoʸ{ ?{_@Po(53>ܿ>3>xPg<}g<}>};{=~{>~{P>~>>k>v}s}?>!!Dg}} _\]M'Ԭ=~ #;?r_rڮCF#>iZ~[>^@.\t 37C?~O }f|}8Y,|.܏s([|KMS[k99̮/nNimj߈=tߓŸ}Ff[?, ]kҺc|'YH\WOj F '+(> ESO Úބc(-n?M4F4io#w߆6|3ؙ;3 7g ;Aw]"E.wE~YgE~Yg=!{C}#G> s!?s!?<#?<#= z_B;٭E/bص"vE.bw]vп%Xr K_Bvxe-co 2zM/k}+b3Eo=yyl2>dzvO?IW}1kj`FE7 o ?|⑛BΖ5#w7M#M>)@M٤s?y@8iO>)@oqE.ws ~V`ȭb-EӴRDi(PPA zôԪLFV{F+VWAkiVrN2Hl:hңwLoiyHi$,=GSާ&q;Ε6y@I(퓇5uJQC r>N(c EN3 `3 *g*L-\Iڧ6SMgЮ]n|!8i&2M6>կZ`WoM7O§ uWe>f{S~EvJ'p#t-ȿ?w\jk;G,e"q r7Ea/ Bu7e3[߄Ndyh1?׋ܰg;Mlv|Y5kFggؙ ٪sײַQbq$oW^+Q?EdQjJF1Fvץ{ hceEΛ5_g>S:Ru!-=~=liknzzrrksk\+z^A(nPrgnrY >G[%yC]ر}~2!zVHgnOig4zZJ̋4S]KjJHFh*ܓ~E1?kiTaR}S}B]-} @#T?"8kT> E-բ?ʝlErJ3 O//\Czo hoKg6jܡ •7O]_Xްf>7.ڀ?;=RM\smaĹJFGs࠼rJ$U_*ˉNH5Ez\HNQ!kH*PЕN٨:DbhG׳F#KCQOA)wj m1󜄯OE12Q]Y\_TbT;ŵŢh.®5jCjAs(3>QYQڑ\Py`ȯU\IAX?l=YscAM}%v9}jӮ0ds}(/ @u4pZ^nz@~rz䖰?B\_N {GnݞxqŨ[?Q4] ըc9~?]ht6BZQ,4sA䒌/Z?E{ ~r Q|GOCQNK{6}#UZ=]8 ?;>GPڧ oQ9c;ٹs4ٹe瞣9Gq͆u9Qn&4,J(WhEB Y&_GUmeD՞m\CTT}) sZ?C!rZ]x^+i*< Ht~WB-$ѣ LO4V%IT-=çQ(FDՕz@XubUr ͥ=ҟekegܡȏ7tmm]^[EcDu;eooEMcER4-dќ(̼c_I%QwQuwZ}C05㷹Տ(GvjWd!̜(.{cj;gFFZՎ^M g>_ÚZާ^GiGg(L4<595v(C/cҌs-wjSKfċ; =!UOר4!VEurӧQUͣf_~hE~E#] {P_UA~Ci3;4%T wjwpNX~A >EQޮԤȎ~;Zw КJhG?,̒_j{{ԳNh۹mi(jԥzk)ִC8Ÿ) ?FOP :*z2tlz x >1t?wIN\i^+|lEJ%bQڋЪ7KGt\-W+ WkӀt#zm'AO ('Z*Db]гr-3w(,wn4˨s=WG7Q mj- ڭ΢~BQbί~wwf;'](fP]f5hz:^vmүz^dOQƄ ^fI3t9iri'_|Ϻj|vj;_3\,n|+CG[EQ,vhQ{e-?̨#rgo;ufG/m=JaFt~ֳj4ĮtǘF +2c~HWBuUE\})_id Jd9ynzƙVZۿ}zWԫhMg~{P{T?5/\G8CGuh)7ѫ:~[_b;owQ@.(\KFQ0Z4jiF4F(չɟv"_j 5Q9Z0'|Tm]iECmT}:o ڴ;Fe & bW!WOBoj-@csٶ2hkJKsoO"rYΙ4:*b<':SRt5VvU^3f7:EIkT:ɵܷs\Ng.T-y?܊5%=((ukwvp=]pϚ0S`HVhˋ,|25-|>"7tIiZ+7= r. } \usage{ rq.fit.fnc(x, y, R, r, tau=0.5, beta=0.9995, eps=1e-06) } \arguments{ \item{x}{ The design matrix } \item{y}{ The response vector } \item{R}{ The matrix describing the inequality constraints } \item{r}{ The right hand side vector of inequality constraints } \item{tau}{ The quantile of interest, must lie in (0,1) } \item{beta}{ technical step length parameter -- alter at your own risk! } \item{eps}{ tolerance parameter for convergence. In cases of multiple optimal solutions there may be some discrepancy between solutions produced by method \code{"fn"} and method \code{"br"}. This is due to the fact that \code{"fn"} tends to converge to a point near the centroid of the solution set, while \code{"br"} stops at a vertex of the set. } } \value{ returns an object of class \code{"rq"}, which can be passed to \code{\link{summary.rq}} to obtain standard errors, etc. } \details{ The details of the algorithm are explained in Koenker and Ng (2002). The basic idea can be traced back to the log-barrier methods proposed by Frisch in the 1950's for constrained optimization. But the current implementation is based on proposals by Mehrotra and others in the recent (explosive) literature on interior point methods for solving linear programming problems. See \code{"rq"} helpfile for an example. It is an open research problem to provide an inference apparatus for inequality constrained quantile regression. } \references{ Koenker, R. and S. Portnoy (1997). The Gaussian Hare and the Laplacian Tortoise: Computability of squared-error vs. absolute-error estimators, with discussion, \emph{Statistical Science}, \bold{12}, 279-300. Koenker, R. and P. Ng(2005). Inequality Constrained Quantile Regression, \emph{Sankya}, 418-440. } \seealso{ \code{\link{rq}}, \code{\link{rq.fit.br}}, \code{\link{rq.fit.pfn}} } \keyword{regression} quantreg/man/latex.summary.rqs.Rd0000644000176200001440000000161211555564235016572 0ustar liggesusers\name{latex.summary.rqs} \alias{latex.summary.rqs} \title{ Make a latex table from a table of rq results} \description{ Produces a file with latex commands for a table of rq results. } \usage{\method{latex}{summary.rqs}(x, transpose = FALSE, caption = "caption goes here.", digits = 3, file = as.character(substitute(x)), ...) } \arguments{ \item{x}{\code{x} is an object of class \code{summary.rqs}} \item{transpose}{if \code{TRUE} transpose table so that rows are quantiles and columns are covariates. } \item{caption}{ caption for the table} \item{digits}{ decimal precision of table entries.} \item{file}{ name of file } \item{\dots}{ optional arguments for \code{latex.table} } } \details{ Calls \code{latex.table}. } \value{ Returns invisibly after writing the file. } \author{ R. Koenker} \seealso{ \code{\link{summary.rqs}}, \code{\link{latex.table}}} \keyword{IO} quantreg/man/Mammals.Rd0000644000176200001440000000342512504615734014544 0ustar liggesusers\name{Mammals} \alias{Mammals} \docType{data} \title{Garland(1983) Data on Running Speed of Mammals} \description{ Observations on the maximal running speed of mammal species and their body mass. } \usage{data(Mammals)} \format{ A data frame with 107 observations on the following 4 variables. \describe{ \item{weight}{Body mass in Kg for "typical adult sizes"} \item{speed}{Maximal running speed (fastest sprint velocity on record)} \item{hoppers}{logical variable indicating animals that ambulate by hopping, e.g. kangaroos} \item{specials}{logical variable indicating special animals with "lifestyles in which speed does not figure as an important factor": Hippopotamus, raccoon (Procyon), badger (Meles), coati (Nasua), skunk (Mephitis), man (Homo), porcupine (Erithizon), oppossum (didelphis), and sloth (Bradypus) } } } \examples{ data(Mammals) attach(Mammals) x <- log(weight) y <- log(speed) plot(x,y, xlab="Weight in log(Kg)", ylab="Speed in log(Km/hour)",type="n") points(x[hoppers],y[hoppers],pch = "h", col="red") points(x[specials],y[specials],pch = "s", col="blue") others <- (!hoppers & !specials) points(x[others],y[others], col="black",cex = .75) fit <- rqss(y ~ qss(x, lambda = 1),tau = .9) plot(fit) } \details{ Used by Chappell (1989) and Koenker, Ng and Portnoy (1994) to illustrate the fitting of piecewise linear curves. } \source{ Garland, T. (1983) The relation between maximal running speed and body mass in terrestrial mammals, \emph{J. Zoology}, 199, 1557-1570. } \references{ Koenker, R., P. Ng and S. Portnoy, (1994) Quantile Smoothing Splines'' \emph{Biometrika}, 81, 673-680. Chappell, R. (1989) Fitting Bent Lines to Data, with Applications ot Allometry, \emph{J. Theo. Biology}, 138, 235-256. } \seealso{\code{\link{rqss}}} \keyword{datasets} quantreg/man/rq.fit.ppro.Rd0000644000176200001440000000255613757415072015347 0ustar liggesusers\name{rq.fit.ppro} \alias{rq.fit.ppro} \title{ Preprocessing fitting method for QR } \description{ Preprocessing method for fitting quantile regression models that exploits the fact that adjacent tau's should have nearly the same sign vectors for residuals. } \usage{ rq.fit.ppro(x, y, tau, weights = NULL, Mm.factor = 0.8, eps = 1e-06, ...) } \arguments{ \item{x}{ Design matrix } \item{y}{ Response vector } \item{tau}{ quantile vector of interest } \item{weights}{ case weights } \item{Mm.factor}{ constant determining initial sample size } \item{eps}{ Convergence tolerance } \item{\dots}{ Other arguments } } \details{ See references for further details. } \value{ Returns a list with components: \item{coefficients}{Matrix of coefficient estimates} \item{residuals}{Matrix of residual estimates} \item{rho}{vector of objective function values} \item{weights}{vector of case weights} } \references{ Chernozhukov, V. I. Fernandez-Val and B. Melly, Fast Algorithms for the Quantile Regression Process, 2020, Empirical Economics., Portnoy, S. and R. Koenker, The Gaussian Hare and the Laplacian Tortoise, Statistical Science, (1997) 279-300 } \author{ Blaise Melly and Roger Koenker } \seealso{ \code{\link{rq.fit.pfn}}, \code{\link{boot.rq.pxy}} } \keyword{regression} quantreg/man/uis.Rd0000644000176200001440000000643711555564235013767 0ustar liggesusers\name{uis} \alias{uis} \title{UIS Drug Treatment study data} \description{There are 628 data points in the original data, 575 of which have no missing values. Variable descriptions: \tabular{lll}{ Variable \tab Description \tab Codes/Values \cr ID \tab Identification Code \tab 1 - 628 \cr AGE \tab Age at Enrollment \tab Years \cr BECK \tab Beck DepressionScore \tab 0.000 - 54.000 \cr HC \tab Heroin/Cocaine Use During \tab 1 = Heroin & Cocaine \cr \tab 3 Months Prior to Admission \tab 2 = Heroin Only \cr \tab \tab 3 = Cocaine Only \cr \tab \tab 4 = Neither Heroin nor Cocaine \cr IV \tab History of IV Drug Use \tab 1 = Never \cr \tab \tab 2 = Previous \cr \tab \tab 3 = Recent \cr NDT \tab Number of Prior Drug Treatments \tab 0 - 40 \cr RACE \tab Subject's Race \tab 0 = White \cr \tab \tab 1 = Non-White \cr TREAT \tab Treatment Randomization \tab 0 = Short \cr \tab Assignment \tab 1 = Long \cr SITE \tab Treatment Site \tab 0 = A \cr \tab \tab 1 = B \cr LEN.T \tab Length of Stay in Treatment \tab Days \cr \tab (Admission Date to Exit Date) \tab \cr TIME \tab Time to Drug Relapse \tab Days \cr \tab (Measured from Admission Date) \tab \cr CENSOR \tab Event for Treating Lost to \tab 1 = Returned to Drugs \cr \tab Follow-Up as Returned to Drugs \tab or Lost to Follow-Up \cr \tab \tab 0 = Otherwise \cr Y \tab log of TIME \tab \cr ND1 \tab Component of NDT \tab \cr ND2 \tab Component of NDT \tab \cr LNDT \tab \tab \cr FRAC \tab Compliance fraction \tab LEN.T/90 for short trt \cr \tab \tab LEN.T/180 for long trt \cr IV3 \tab Recent IV use \tab 1 = Yes \cr \tab \tab 0 = No } } \usage{data(uis)} \format{A data frame with dimension 575 by 18.} \source{Table 1.3 of Hosmer,D.W. and Lemeshow, S. (1998) } \references{Hosmer,D.W. and Lemeshow, S. (1998) Applied Survival Analysis: Regression Modeling of Time to Event Data, John Wiley and Sons Inc., New York, NY} \keyword{datasets} quantreg/man/plot.summary.rqs.Rd0000644000176200001440000000633413735337057016443 0ustar liggesusers\name{plot.summary.rqs} \alias{plot.summary.rqs} \alias{plot.summary.rq} \title{Visualizing sequences of quantile regression summaries} \description{A sequence of coefficient estimates for quantile regressions with varying \code{tau} parameters is visualized along with associated confidence bands.} \usage{ \method{plot}{summary.rqs}(x, parm = NULL, level = 0.9, ols = TRUE, mfrow = NULL, mar = NULL, ylim = NULL, main = NULL, col = gray(c(0, 0.75)), border = NULL, lcol = 2, lty = 1:2, cex = 0.5, pch = 20, type = "b", xlab = "", ylab = "", \dots) } \arguments{ \item{x}{an object of class \code{"summary.rqs"} as produce by applying the \code{summary} method to a \code{\link{rq}} object (with a vector of \code{tau} values).} \item{parm}{a specification of which parameters are to be plotted, either a vector of numbers or a vector of names. By default, all parameters are considered.} \item{level}{Confidence level of bands. When using the rank based confidence intervals in summary, which is the default method for sample sizes under 1000, you will need to control the level of the intervals by passing the parameter alpha to \code{\link{summary.rq}}, prior to calling \code{\link{plot.summary.rqs}}. Note also that alpha = 1 - level.} \item{ols}{logical. Should a line for the OLS coefficient and their confidence bands (as estimated by \code{\link[stats]{lm}}) be added?} \item{mfrow, mar, ylim, main}{graphical parameters. Suitable defaults are chosen based on the coefficients to be visualized. It can be useful to use a common vertical scale when plotting as a way of comparing confidence bands constructed by different methods. For this purpose one can specify a \code{ylim} as a 2 by \code{length(parm)} matrix.} \item{col}{vector of color specification for \code{rq} coefficients and the associated confidence polygon.} \item{border}{color specification for the confidence polygon. By default, the second element of \code{col} is used.} \item{lcol, lty}{color and line type specification for OLS coefficients and their confidence bounds.} \item{cex, pch, type, xlab, ylab, \dots}{further graphical parameters passed to \code{\link[graphics]{points}}.} } \details{The \code{plot} method for \code{"summary.rqs"} objects visualizes the coefficients along with their confidence bands. The bands can be omitted by using the \code{plot} method for \code{"rqs"} objects directly.} \seealso{\code{\link{rq}}, \code{\link{plot.rqs}}} \value{A list with components \code{z}, an array with all coefficients visualized (and associated confidence bands), and \code{Ylim}, a 2 by p matrix containing the y plotting limits. The latter component may be useful for establishing a common scale for two or more similar plots. The list is returned invisibly.} \examples{ ## fit Engel models (in levels) for tau = 0.1, ..., 0.9 data("engel") fm <- rq(foodexp ~ income, data = engel, tau = 1:9/10) sfm <- summary(fm) ## visualizations plot(sfm) plot(sfm, parm = 2, mar = c(5.1, 4.1, 2.1, 2.1), main = "", xlab = "tau", ylab = "income coefficient", cex = 1, pch = 19) } \keyword{hplot} quantreg/man/kuantile.Rd0000644000176200001440000000554711555564235015004 0ustar liggesusers\name{kuantile} \alias{kuantile} \alias{kselect} \alias{kunique} \title{Quicker Sample Quantiles } \description{ The function 'kuantile' computes sample quantiles corresponding to the specified probabilities. The intent is to mimic the generic (base) function 'quantile' but using a variant of the Floyd and Rivest (1975) algorithm which is somewhat quicker, especially for large sample sizes. } \usage{ kuantile(x, probs = seq(0, 1, .25), na.rm = FALSE, names = TRUE, type = 7, ...) } \arguments{ \item{x}{numeric vector whose sample quantiles are wanted.} \item{probs}{numeric vector of probabilities with values in [0,1].} \item{type}{ an integer between 1 and 9 selecting one of the nine quantile algorithms detailed below to be used.} \item{na.rm}{logical: if true, any 'NA' and 'NaN''s are removed from 'x' before the quantiles are computed.} \item{names}{logical: if true, the result has a 'names' attribute. } \item{...}{further arguments passed to or from other methods.} } \details{ A vector of length 'length(p)' is returned. See the documentation for 'quantile' for further details on the types. The algorithm was written by K.C. Kiwiel. It is a modified version of the (algol 68) SELECT procedure of Floyd and Rivest (1975), incorporating modifications of Brown(1976). The algorithm has linear growth in the number of comparisons required as sample size grows. For the median, average case behavior requires \eqn{1.5 n + O((n log n)^{1/2})} comparisons. See Kiwiel (2005) and Knuth (1998) for further details. When the number of required elements of p is large, it may be preferable to revert to a full sort.} \value{ A vector of quantiles of the same length as the vector p. } \references{ R.W. Floyd and R.L. Rivest: "Algorithm 489: The Algorithm SELECT---for Finding the $i$th Smallest of $n$ Elements", Comm. ACM 18, 3 (1975) 173, T. Brown: "Remark on Algorithm 489", ACM Trans. Math. Software 3, 2 (1976), 301-304. K.C. Kiwiel: On Floyd and Rivest's SELECT Algorithm, Theoretical Computer Sci. 347 (2005) 214-238. D. Knuth, The Art of Computer Programming, Volume 3, Sorting and Searching, 2nd Ed., (1998), Addison-Wesley. } \author{ K.C. Kiwiel, R interface: Roger Koenker } \seealso{\code{\link{quantile}}} \examples{ kuantile(x <- rnorm(1001))# Extremes & Quartiles by default ### Compare different types p <- c(0.1,0.5,1,2,5,10,50)/100 res <- matrix(as.numeric(NA), 9, 7) for(type in 1:9) res[type, ] <- y <- kuantile(x, p, type=type) dimnames(res) <- list(1:9, names(y)) ktiles <- res ### Compare different types p <- c(0.1,0.5,1,2,5,10,50)/100 res <- matrix(as.numeric(NA), 9, 7) for(type in 1:9) res[type, ] <- y <- quantile(x, p, type=type) dimnames(res) <- list(1:9, names(y)) qtiles <- res max(abs(ktiles - qtiles)) } \keyword{univar} quantreg/man/akj.Rd0000644000176200001440000000442111555564235013723 0ustar liggesusers\name{akj} \alias{akj} \title{Density Estimation using Adaptive Kernel method} \description{ Univariate \emph{adaptive} kernel density estimation a la Silverman. As used by Portnoy and Koenker (1989). } \usage{ akj(x, z =, p =, h = -1, alpha = 0.5, kappa = 0.9, iker1 = 0) } \arguments{ \item{x}{points used for centers of kernel assumed to be sorted.} \item{z}{points at which density is calculated; defaults to an equispaced sequence covering the range of x.} \item{p}{vector of probabilities associated with \code{x}s; defaults to 1/n for each x.} \item{h}{initial window size (overall); defaults to Silverman's normal reference.} \item{alpha}{a sensitivity parameter that determines the sensitivity of the local bandwidth to variations in the pilot density; defaults to .5.} \item{kappa}{constant multiplier for initial (default) window width} \item{iker1}{integer kernel indicator: 0 for normal kernel (default) while 1 for Cauchy kernel (\code{\link{dcauchy}}).} } \value{ a \code{\link{list}} structure is with components \item{dens}{the vector of estimated density values \eqn{f(z)}} \item{psi}{a vector of \eqn{\psi=-f'/f} function values.} \item{score}{a vector of score \eqn{\psi' = (f'/f)^2 - f''/f} function values.} \item{h}{same as the input argument h} } \note{ if the \code{score} function values are of interest, the Cauchy kernel may be preferable. } \references{ Portnoy, S and R Koenker, (1989) Adaptive L Estimation of Linear Models; \emph{Annals of Statistics} \bold{17}, 362--81. Silverman, B. (1986) \emph{Density Estimation}, pp 100--104. } \examples{ set.seed(1) x <- c(rnorm(600), 2 + 2*rnorm(400)) xx <- seq(-5, 8, length=200) z <- akj(x, xx) plot(xx, z$dens, ylim=range(0,z$dens), type ="l", col=2) abline(h=0, col="gray", lty=3) plot(xx, z$psi, type ="l", col=2, main = expression(hat(psi(x)))) plot(xx, z$score, type ="l", col=2, main = expression("score " * hat(psi) * "'" * (x))) if(require("nor1mix")) { m3 <- norMix(mu= c(-4, 0, 3), sig2 = c(1/3^2, 1, 2^2), w = c(.1,.5,.4)) plot(m3, p.norm = FALSE) set.seed(11) x <- rnorMix(1000, m3) z2 <- akj(x, xx) lines(xx, z2$dens, col=2) z3 <- akj(x, xx, kappa = 0.5, alpha = 0.88) lines(xx, z3$dens, col=3) } } \keyword{smooth} quantreg/man/dither.Rd0000644000176200001440000000375311555564235014444 0ustar liggesusers \name{dither} \alias{dither} \title{ Function to randomly perturb a vector} \description{ With malice aforethought, dither adds a specified random perturbation to each element of the input vector, usually employed as a device to mitigate the effect of ties. } \usage{ dither(x, type = "symmetric", value = NULL) } \arguments{ \item{x}{\code{x} a numeric vector } \item{type}{\code{type} is either 'symmetric' or 'right' } \item{value}{\code{value} scale of dequantization } } \details{ The function \code{dither} operates slightly differently than the function \code{jitter} in base R, permitting strictly positive perturbations with the option \code{type = "right"} and using somewhat different default schemes for the scale of the perturbation. Dithering the response variable is frequently a useful option in quantile regression fitting to avoid deleterious effects of degenerate solutions. See, e.g. Machado and Santos Silva (2005). For a general introduction and some etymology see the Wikipedia article on "dither". For integer data it is usually advisable to use \code{value = 1}. When 'x' is a matrix or array dither treats all elements as a vector but returns an object of the original class. } \value{ A dithered version of the input vector 'x'. } \references{ Machado, J.A.F. and Santos Silva, J.M.C. (2005), Quantiles for Counts, Journal of the American Statistical Association, vol. 100, no. 472, pp. 1226-1237. } \author{ R. Koenker } \note{ Some further generality might be nice, for example something other than uniform noise would be desirable in some circumstances. Note that when dithering you are entering into the "state of sin" that John von Neumann famously attributed to anyone considering "arithmetical methods of producing random digits." If you need to preserve reproducibility, then \code{set.seed} is your friend. } \seealso{ \code{\link{jitter}} } \examples{ x <- rlnorm(40) y <- rpois(40, exp(.5 + log(x))) f <- rq(dither(y, type = "right", value = 1) ~ x) } \keyword{ manip } quantreg/man/print.rq.Rd0000644000176200001440000000056211555564235014735 0ustar liggesusers\name{print.rq} \alias{print.rq} \alias{print.rqs} \title{ Print an rq object} \description{ Print an object generated by rq } \usage{ \method{print}{rq}(x, ...) \method{print}{rqs}(x, ...) } \arguments{ \item{x}{ Object returned from rq representing the fit of the model. } \item{...}{ Optional arguments. } } \seealso{ \code{\link{rq}}} \keyword{ regression} quantreg/man/srisk.Rd0000644000176200001440000000163412453540230014277 0ustar liggesusers\name{srisk} \alias{srisk} \title{ Markowitz (Mean-Variance) Portfolio Optimization} \description{ This function estimates optimal mean-variance portfolio weights from a matrix of historical or simulated asset returns. } \usage{ srisk(x, mu = 0.07, lambda = 1e+08, alpha = 0.1, eps = 1e-04) } \arguments{ \item{x}{ Matrix of asset returns } \item{mu}{Required mean rate of return for the portfolio } \item{lambda}{Lagrange multiplier associated with mean return constraint} \item{alpha}{Choquet risk parameter, unimplemented } \item{eps}{ tolerance parameter for mean return constraint} } \details{ The portfolio weights are estimated by solving a constrained least squares problem. } \value{ \item{pihat}{Optimal portfolio weights} \item{muhat }{Mean return in sample} \item{sighat }{Standard deviation of returns in sample} } \author{ R. Koenker } \seealso{ \code{\link{qrisk}}} \keyword{ regression } quantreg/man/predict.rqss.Rd0000644000176200001440000000662414414306664015603 0ustar liggesusers\name{predict.rqss} \alias{predict.rqss} \alias{predict.qss1} \alias{predict.qss2} \title{Predict from fitted nonparametric quantile regression smoothing spline models} \description{ Additive models for nonparametric quantile regression using total variation penalty methods can be fit with the \code{\link{rqss}} function. Univarariate and bivariate components can be predicted using these functions. } \usage{ \method{predict}{rqss}(object, newdata, interval = "none", level = 0.95, ...) \method{predict}{qss1}(object, newdata, ...) \method{predict}{qss2}(object, newdata, ...) } \arguments{ \item{object}{ is a fitted object produced by \code{\link{rqss}} } \item{newdata}{ a data frame describing the observations at which prediction is to be made. For qss components, newdata should lie in strictly within the convex hull of the fitting data. Newdata corresponding to the partially linear component of the model may require caution concerning the treatment of factor levels, if any.} \item{interval}{If set to \code{confidence} then a \code{level} confidence interval for the predictions is returned.} \item{level}{intended coverage probability for the confidence intervals} \item{\dots}{ optional arguments } } \details{ For both univariate and bivariate prediction linear interpolation is done. In the bivariate case, this involves computing barycentric coordinates of the new points relative to their enclosing triangles. It may be of interest to plot individual components of fitted rqss models: this is usually best done by fixing the values of other covariates at reference values typical of the sample data and predicting the response at varying values of one qss term at a time. Direct use of the \code{predict.qss1} and \code{predict.qss2} functions is discouraged since it usually corresponds to predicted values at absurd reference values of the other covariates, i.e. zero. } \value{ A vector of predictions, or in the case that \code{interval = "confidence")} a matrix whose first column is the vector of predictions and whose second and third columns are the lower and upper confidence limits for each prediction. } \author{ R. Koenker } \seealso{ \code{\link{rqss}} } \examples{ n <- 200 lam <- 2 x <- sort(rchisq(n,4)) z <- exp(rnorm(n)) + x y <- log(x)+ .1*(log(x))^2 + z/4 + log(x)*rnorm(n)/4 plot(x,y - z/4 + mean(z)/4) Ifit <- rqss(y ~ qss(x,constraint="I") + z) sfit <- rqss(y ~ qss(x,lambda = lam) + z) xz <- data.frame(z = mean(z), x = seq(min(x)+.01,max(x)-.01,by=.25)) lines(xz[["x"]], predict(Ifit, xz), col=2) lines(xz[["x"]], predict(sfit, xz), col=3) legend(10,2,c("Increasing","Smooth"),lty = 1, col = c(2,3)) title("Predicted Median Response at Mean Value of z") %%keep objects for inspection : do not rm(x,y,z,xz,fit) ## Bivariate example -- loads pkg "interp" if(requireNamespace("interp")){ if(requireNamespace("interp")){ data(CobarOre) fit <- rqss(z ~ qss(cbind(x,y), lambda=.08), data= CobarOre) plot(fit, col="grey", main = "CobarOre data -- rqss(z ~ qss(cbind(x,y)))") T <- with(CobarOre, interp::tri.mesh(x, y)) set.seed(77) ndum <- 100 xd <- with(CobarOre, runif(ndum, min(x), max(x))) yd <- with(CobarOre, runif(ndum, min(y), max(y))) table(s <- interp::in.convex.hull(T, xd, yd)) pred <- predict(fit, data.frame(x = xd[s], y = yd[s])) contour(interp::interp(xd[s],yd[s], pred), col="red", add = TRUE) }}} \keyword{regression} \keyword{smooth} \keyword{robust} quantreg/man/boot.crq.Rd0000644000176200001440000000523012653160036014673 0ustar liggesusers\name{boot.crq} \alias{boot.crq} \title{ Bootstrapping Censored Quantile Regression} \description{ Functions used to estimated standard errors, confidence intervals and tests of hypotheses for censored quantile regression models using the Portnoy and Peng-Huang methods. } \usage{ boot.crq(x, y, c, taus, method, ctype = "right", R = 100, mboot, bmethod = "jack", ...) } \arguments{ \item{x}{ The regression design matrix} \item{y}{ The regression response vector} \item{c}{ The censoring indicator} \item{taus}{ The quantiles of interest} \item{method}{ The fitting method: either "P" for Portnoy or "PH" for Peng and Huang.} \item{ctype}{ Either "right" or "left"} \item{R}{ The number of bootstrap replications} \item{bmethod}{ The bootstrap method to be employed. There are (as yet) three options: method = "jack" uses the delete-d jackknife method described by Portnoy (2013), method = "xy-pair" uses the xy-pair method, that is the usual multinomial resampling of xy-pairs, while method = "Bose" uses the Bose and Chatterjee (2003) weighted resampling method with exponential weights. The "jack" method is now the default.} \item{mboot}{ optional argument for the bootstrap method: for bmethod = "jack" it specifies the number, d, of the delete-d jackknife, for method = "xy-pair" it specifies the size of the bootstrap samples, that permits subsampling (m out of n) bootstrap. By default in the former case it is set to 2 [sqrt(n)], for the latter the default is n. Obviously mboot should be substantially larger than the column dimension of x, and should be less than the sample size in both cases.} \item{...}{ Optional further arguments to control bootstrapping} } \details{ There are several refinements that are still unimplemented. Percentile methods should be incorporated, and extensions of the methods to be used in anova.rq should be made. Note that bootstrapping for the Powell method "Powell" is done via \code{\link{boot.rq}}. For problems with \code{n > 3000} a message is printed indicated progress in the resampling. } \value{ A matrix of dimension R by p is returned with the R resampled estimates of the vector of quantile regression parameters. When mofn < n for the "xy" method this matrix has been deflated by the factor sqrt(m/n) } \references{ Bose, A. and S. Chatterjee, (2003) Generalized bootstrap for estimators of minimizers of convex functions, \emph{J. Stat. Planning and Inf}, 117, 225-239. Portnoy, S. (2013) The Jackknife's Edge: Inference for Censored Quantile Regression, \emph{CSDA}, forthcoming. } \author{ Roger Koenker } \seealso{ \code{\link{summary.crq}}} \keyword{ regression} quantreg/man/summary.crq.Rd0000644000176200001440000001070114265213041015420 0ustar liggesusers\name{summary.crq} \alias{summary.crqs} \alias{summary.crq} \alias{print.summary.crq} \alias{print.summary.crqs} \alias{plot.summary.crqs} \title{ Summary methods for Censored Quantile Regression } \description{ Returns a summary object for a censored quantile regression fit. A null value will be returned if printing is invoked. } \usage{ \method{summary}{crq}(object, taus = 1:4/5, alpha = .05, se="boot", covariance=TRUE, ...) \method{print}{summary.crq}(x, digits = max(5, .Options$digits - 2), ...) \method{print}{summary.crqs}(x, ...) \method{plot}{summary.crqs}(x, nrow = 3, ncol = 3, CoxPHit = NULL, ...) } \arguments{ \item{object}{ An object of class \code{"crq"} produced by a call to \code{crq()}. } \item{taus}{Quantiles to be summarized. This should be a vector of length greater than one.} \item{x}{ An object of class \code{"crq"} produced by a call to \code{crq()}. } \item{se}{ specifies the method used to compute standard standard errors. but the only available method (so far) is "boot". Further arguments to \code{\link{boot.crq}} and \code{\link{boot.rq}} can be passed with the \dots argument. } \item{covariance}{ logical flag to indicate whether the full covariance matrix of the estimated parameters should be returned. } \item{nrow}{Number of rows of the plot layout.} \item{ncol}{Number of columns of the plot layout.} \item{alpha}{Confidence level for summary intervals.} \item{digits}{Number of digits to be printed in summary display.} \item{CoxPHit}{An object of class coxph produced by \code{coxph}.} \item{...}{ Optional arguments to summary, e.g. to specify bootstrap methods sample sizes, etc. see \code{\link{boot.rq}} and \code{\link{boot.crq}} } } \value{ For method "Powell" an object of class \code{summary.crq} is returned with the following components: \item{coefficients}{ a p by 4 matrix consisting of the coefficients, their estimated standard errors, their t-statistics, and their associated p-values. } \item{cov}{ the estimated covariance matrix for the coefficients in the model, provided that \code{covariance = TRUE} appears in the calling sequence. } \item{rdf}{ the residual degrees of freedom } \item{tau}{ the quantile estimated } For the other methods an object of class \code{summary.crq} is returned with the following components: \item{coefficients}{ a list of p by 6 matrix consisting of the coefficients, upper and lower bounds for a (1-alpha) level confidence interval, their estimated standard errors, their t-statistics, and their associated p-values, one component for each element of the specified \code{taus} vector. } \item{cov}{ the estimated covariance matrix for the coefficients in the model, provided that \code{covariance = TRUE} in the called sequence. } } \details{ For the Powell method the resampling strategy used by the \code{se = "boot"} method is based on the Bilias, Chen and Ying (2000) proposal. For the Portnoy and Peng-Huang methods the bootstrapping is by default actually based on a delete-d jackknife, as described in Portnoy (2013), but resampling xy pairs using either conventional multinomial resampling or using exponential weighting as in Bose and Chatterjee (2003) can be used by specifying the \code{bmethod} argument. Note that the default number of replications is set at \eqn{R = 100} a value that is obviously too small for most applications. This is done merely to speed up the examples in the documentation and facilitate testing. Larger, more appropriate values of \eqn{R} can be passed to the bootstrapping functions via the \code{\ldots} argument of the \code{summary} method. It is important to recognize that when some of the bootstrap replications are NA they are simply ignored in the computation of the confidence bands and standard errors as currently reported. The number of these NAs is returned as part of the \code{summary.crq} object, and when printed is also reported. } \references{ Bose, A. and S. Chatterjee, (2003) Generalized bootstrap for estimators of minimizers of convex functions, \emph{J. Stat. Planning and Inf}, 117, 225-239. Bilias, Y. Chen, S. and Z. Ying, (2000) Simple resampling methods for censored quantile regression, \emph{J. of Econometrics}, 99, 373-386. Portnoy, S. (2013) The Jackknife's Edge: Inference for Censored Quantile Regression, \emph{CSDA}, forthcoming. } \seealso{ \code{\link{crq}}, \code{\link{QTECox}} } \keyword{regression} quantreg/man/lm.fit.recursive.Rd0000644000176200001440000000120413505344117016341 0ustar liggesusers\name{lm.fit.recursive} \alias{lm.fit.recursive} \title{ Recursive Least Squares } \description{ This function fits a linear model by recursive least squares. It is a utility routine for the \code{\link{KhmaladzeTest}} function of the quantile regression package. } \usage{ lm.fit.recursive(X, y, int=TRUE) } \arguments{ \item{X}{ Design Matrix } \item{y}{ Response Variable} \item{int}{ if TRUE then append intercept to X} } \value{ return p by n matrix of fitted parameters, where p. The ith column gives the solution up to "time" i. } \references{ A. Harvey, (1993) Time Series Models, MIT } \author{ R. Koenker } \keyword{methods} quantreg/man/rq.fit.hogg.Rd0000644000176200001440000000530612674070036015301 0ustar liggesusers\name{rq.fit.hogg} \alias{rq.fit.hogg} \title{weighted quantile regression fitting} \description{ Function to estimate a regression mmodel by minimizing the weighted sum of several quantile regression functions. See Koenker(1984) for an asymptotic look at these estimators. This is a slightly generalized version of what Zou and Yuan (2008) call composite quantile regression in that it permits weighting of the components of the objective function and also allows further linear inequality constraints on the coefficients. } \usage{ rq.fit.hogg(x, y, taus = c(0.1, 0.3, 0.5), weights = c(0.7, 0.2, 0.1), R = NULL, r = NULL, beta = 0.99995, eps = 1e-06) } \arguments{ \item{x}{design matrix} \item{y}{response vector } \item{taus}{quantiles getting positive weight} \item{weights}{weights assigned to the quantiles } \item{R}{optional matrix describing linear inequality constraints} \item{r}{optional vector describing linear inequality constraints} \item{beta}{step length parameter of the Frisch Newton Algorithm} \item{eps}{tolerance parameter for the Frisch Newton Algorithm} } \details{ Mimimizes a weighted sum of quantile regression objective functions using the specified taus. The model permits distinct intercept parameters at each of the specified taus, but the slope parameters are constrained to be the same for all taus. This estimator was originally suggested to the author by Bob Hogg in one of his famous blue notes of 1979. The algorithm used to solve the resulting linear programming problems is either the Frisch Newton algorithm described in Portnoy and Koenker (1997), or the closely related algorithm described in Koenker and Ng(2002) that handles linear inequality constraints. See \code{\link{qrisk}} for illustration of its use in portfolio allocation. Linear inequality constraints of the form \eqn{Rb \geq r} can be imposed with the convention that \eqn{b} is a \eqn{m+p} where \eqn{m} is the \code{length(taus)} and \eqn{p} is the column dimension of \code{x} without the intercept. } \value{ \item{coefficients}{estimated coefficients of the model} } \references{ Zou, Hui and and Ming Yuan (2008) Composite quantile regression and the Oracle model selection theory, Annals of Statistics, 36, 1108--11120. Koenker, R. (1984) A note on L-estimates for linear models, Stat. and Prob Letters, 2, 323-5. Portnoy, S. and Koenker, R. (1997) The Gaussian Hare and the Laplacean Tortoise: Computability of Squared-error vs Absolute Error Estimators, (with discussion). Statistical Science, (1997) 12, 279-300. Koenker, R. and Ng, P (2003) Inequality Constrained Quantile Regression, preprint. } \author{ Roger Koenker } \seealso{ \code{\link{qrisk}}} \keyword{regression} \keyword{ robust } quantreg/man/rq.fit.pfn.Rd0000644000176200001440000000222313652035114015126 0ustar liggesusers\name{rq.fit.pfn} \alias{rq.fit.pfn} \title{ Preprocessing Algorithm for Quantile Regression} \description{ A preprocessing algorithm for the Frisch Newton algorithm for quantile regression. This is one possible method for rq().} \usage{ rq.fit.pfn(x, y, tau=0.5, Mm.factor=0.8, max.bad.fixups=3, eps=1e-06) } \arguments{ \item{x}{design matrix usually supplied via rq() } \item{y}{ response vector usually supplied via rq() } \item{tau}{ quantile of interest } \item{Mm.factor}{ constant to determine sub sample size m} \item{max.bad.fixups}{ number of allowed mispredicted signs of residuals } \item{eps}{ convergence tolerance } } \details{ Preprocessing algorithm to reduce the effective sample size for QR problems with (plausibly) iid samples. The preprocessing relies on subsampling of the original data, so situations in which the observations are not plausibly iid, are likely to cause problems. The tolerance eps may be relaxed somewhat. } \value{ Returns an object of type rq } \references{ Portnoy and Koenker, Statistical Science, (1997) 279-300} \author{ Roger Koenker } \seealso{ \code{\link{rq}}} \keyword{ regression } quantreg/man/print.summary.rq.Rd0000644000176200001440000000117411555564235016431 0ustar liggesusers\name{print.summary.rq} \alias{print.summary.rq} \alias{print.summary.rqs} \title{ Print Quantile Regression Summary Object } \usage{ \method{print}{summary.rq}(x, digits=max(5, .Options$digits - 2), ...) \method{print}{summary.rqs}(x, ...) } \arguments{ \item{x}{ This is an object of class \code{"summary.rq"} produced by a call to \code{summary.rq()}. } \item{digits}{ Significant digits reported in the printed table. } \item{...}{ Optional arguments passed to printing function } } \description{Print summary of quantile regression object} \seealso{ \code{\link{summary.rq}} } \keyword{ regression } quantreg/man/FAQ.Rd0000644000176200001440000000067311555564235013572 0ustar liggesusers\name{FAQ} \alias{FAQ} \alias{ChangeLog} \title{FAQ and ChangeLog of a package} \description{ Show the FAQ or ChangeLog of a specified package } \usage{ FAQ(pkg = "quantreg") ChangeLog(pkg = "quantreg") } \arguments{ \item{pkg}{ Package Name } } \details{ Assumes that the FAQ and/or ChangeLog files exist in the proper "inst" directory. } \value{ Has only the side effect of showing the files on the screen. } \keyword{ documentation } quantreg/man/summary.rq.Rd0000644000176200001440000002074613757431323015301 0ustar liggesusers\name{summary.rq} \alias{summary.rq} \alias{summary.rqs} \alias{summary.rcrqs} \title{ Summary methods for Quantile Regression } \description{ Returns a summary list for a quantile regression fit. A null value will be returned if printing is invoked. } \usage{ \method{summary}{rq}(object, se = NULL, covariance=FALSE, hs = TRUE, U = NULL, gamma = 0.7, ...) \method{summary}{rqs}(object, ...) } \arguments{ \item{object}{ This is an object of class \code{"rq"} or \code{"rqs"} produced by a call to \code{rq()}, depending on whether one or more taus are specified. } \item{se}{ specifies the method used to compute standard standard errors. There are currently seven available methods: \enumerate{ \item \code{"rank"} which produces confidence intervals for the estimated parameters by inverting a rank test as described in Koenker (1994). This method involves solving a parametric linear programming problem, and for large sample sizes can be extremely slow, so by default it is only used when the sample size is less than 1000, see below. The default option assumes that the errors are iid, while the option iid = FALSE implements a proposal of Koenker Machado (1999). See the documentation for \code{rq.fit.br} for additional arguments. \item \code{"iid"} which presumes that the errors are iid and computes an estimate of the asymptotic covariance matrix as in KB(1978). \item \code{"nid"} which presumes local (in \code{tau}) linearity (in \code{x}) of the the conditional quantile functions and computes a Huber sandwich estimate using a local estimate of the sparsity. If the initial fitting was done with method "sfn" then use of \code{se = "nid"} is recommended. However, if the cluster option is also desired then \code{se = "boot"} can be used and bootstrapping will also employ the "sfn" method. \item \code{"ker"} which uses a kernel estimate of the sandwich as proposed by Powell(1991). \item \code{"boot"} which implements one of several possible bootstrapping alternatives for estimating standard errors including a variate of the wild bootstrap for clustered response. See \code{\link{boot.rq}} for further details. \item \code{"BLB"} which implements the bag of little bootstraps method proposed in Kleiner, et al (2014). The sample size of the little bootstraps is controlled by the parameter \code{gamma}, see below. At present only \code{bsmethod = "xy"} is sanction, and even that is experimental. This option is intended for applications with very large n where other flavors of the bootstrap can be slow. \item \code{"conquer"} which is invoked automatically if the fitted object was created with \code{method = "conquer"}, and returns the multiplier bootstrap percentile confidence intervals described in He et al (2020). \item \code{"extreme"} which uses the subsampling method of Chernozhukov Fernandez-Val, and Kaji (2018) designed for inference on extreme quantiles. } If \code{se = NULL} (the default) and \code{covariance = FALSE}, and the sample size is less than 1001, then the "rank" method is used, otherwise the "nid" method is used. } \item{covariance}{ logical flag to indicate whether the full covariance matrix of the estimated parameters should be returned. } \item{hs}{ Use Hall Sheather bandwidth for sparsity estimation If false revert to Bofinger bandwidth. } \item{U}{Resampling indices or gradient evaluations used for bootstrap, see \code{\link{boot.rq}}.} \item{gamma}{parameter controlling the effective sample size of the'bag of little bootstrap samples that will be \code{b = n^gamma} where \code{n} is the sample size of the original model.} \item{...}{ Optional arguments to summary, e.g. bsmethod to use bootstrapping. see \code{\link{boot.rq}}. When using the "rank" method for confidence intervals, which is the default method for sample sizes less than 1000, the type I error probability of the intervals can be controlled with the alpha parameter passed via "...", thereby controlling the width of the intervals plotted by \code{plot.summary.rqs}. Similarly, the arguments alpha, mofn and kex can be passed when invoking the \code{"extreme"} option for "se" to control the percentile interval reported, given by estimated quantiles [alpha/2, 1 - alpha/2]; \code{kex} is a tuning parameter for the extreme value confidence interval construction. The size of the bootstrap subsamples for the "extreme" option can also be controlled by passing the argument \code{mofm} via "...". Default values for kex, mofn and alpha are 20, \code{floor(n/5)} and 0.1, respectively. } } \value{ a list is returned with the following components, when \code{object} is of class \code{"rqs"} then there is a list of such lists. \item{coefficients}{ a p by 4 matrix consisting of the coefficients, their estimated standard errors, their t-statistics, and their associated p-values, in the case of most "se" methods. For methods "rank" and "extreme" potentially asymetric confidence intervals are return in lieu of standard errors and p-values. } \item{cov}{ the estimated covariance matrix for the coefficients in the model, provided that \code{cov=TRUE} in the called sequence. This option is not available when se = "rank". } \item{Hinv}{ inverse of the estimated Hessian matrix returned if \code{cov=TRUE} and \code{se \%in\% c("nid","ker") }, note that for \code{se = "boot"} there is no way to split the estimated covariance matrix into its sandwich constituent parts. } \item{J}{ Unscaled Outer product of gradient matrix returned if \code{cov=TRUE} and \code{se != "iid"}. The Huber sandwich is \code{cov = tau (1-tau) Hinv \%*\% J \%*\% Hinv}. as for the \code{Hinv} component, there is no \code{J} component when \code{se == "boot"}. (Note that to make the Huber sandwich you need to add the tau (1-tau) mayonnaise yourself.) } \item{B}{Matrix of bootstrap realizations.} \item{U}{Matrix of bootstrap randomization draws.} } \details{ When the default summary method is used, it tries to estimate a sandwich form of the asymptotic covariance matrix and this involves estimating the conditional density at each of the sample observations, negative estimates can occur if there is crossing of the neighboring quantile surfaces used to compute the difference quotient estimate. A warning message is issued when such negative estimates exist indicating the number of occurrences -- if this number constitutes a large proportion of the sample size, then it would be prudent to consider an alternative inference method like the bootstrap. If the number of these is large relative to the sample size it is sometimes an indication that some additional nonlinearity in the covariates would be helpful, for instance quadratic effects. Note that the default \code{se} method is rank, unless the sample size exceeds 1001, in which case the \code{rank} method is used. There are several options for alternative resampling methods. When \code{summary.rqs} is invoked, that is when \code{summary} is called for a \code{rqs} object consisting of several \code{taus}, the \code{B} components of the returned object can be used to construct a joint covariance matrix for the full object.} \references{ Chernozhukov, Victor, Ivan Fernandez-Val, and Tetsuya Kaji, (2018) Extremal Quantile Regression, in Handbook of Quantile Regression, Eds. Roger Koenker, Victor Chernozhukov, Xuming He, Limin Peng, CRC Press. Koenker, R. (2004) \emph{Quantile Regression}. Bilias, Y. Chen, S. and Z. Ying, Simple resampling methods for censored quantile regression, \emph{J. of Econometrics}, 99, 373-386. Kleiner, A., Talwalkar, A., Sarkar, P. and Jordan, M.I. (2014) A Scalable bootstrap for massive data, \emph{JRSS(B)}, 76, 795-816. Powell, J. (1991) Estimation of Monotonic Regression Models under Quantile Restrictions, in Nonparametric and Semiparametric Methods in Econometrics, W. Barnett, J. Powell, and G Tauchen (eds.), Cambridge U. Press. } \seealso{ \code{\link{rq}} \code{\link{bandwidth.rq}} } \examples{ data(stackloss) y <- stack.loss x <- stack.x summary(rq(y ~ x, method="fn")) # Compute se's for fit using "nid" method. summary(rq(y ~ x, ci=FALSE),se="ker") # default "br" alg, and compute kernel method se's } \keyword{regression} quantreg/man/LassoLambdaHat.Rd0000644000176200001440000000276714057167442016007 0ustar liggesusers\name{LassoLambdaHat} \alias{LassoLambdaHat} \title{Lambda selection for QR lasso problems} \description{ Default procedure for selection of lambda in lasso constrained quantile regression as proposed by Belloni and Chernozhukov (2011) } \usage{ LassoLambdaHat(X, R = 1000, tau = 0.5, C = 1, alpha = 0.95) } \arguments{ \item{X}{Design matrix} \item{R}{Number of replications} \item{tau}{quantile of interest} \item{C}{Cosmological constant} \item{alpha}{Interval threshold} } \value{ vector of default lambda values of length p, the column dimension of X. } \details{ As proposed by Belloni and Chernozhukov, a reasonable default lambda would be the upper quantile of the simulated values. The procedure is based on idea that a simulated gradient can be used as a pivotal statistic. Elements of the default vector are standardized by the respective standard deviations of the covariates. Note that the sqrt(tau(1-tau)) factor cancels in their (2.4) (2.6). In this formulation even the intercept is penalized. If the lower limit of the simulated interval is desired one can specify \code{alpha = 0.05}. } \references{ Belloni, A. and V. Chernozhukov. (2011) l1-penalized quantile regression in high-dimensional sparse models. \emph{Annals of Statistics}, 39 82 - 130. } \examples{ n <- 200 p <- 10 x <- matrix(rnorm(n*p), n, p) b <- c(1,1, rep(0, p-2)) y <- x \%*\% b + rnorm(n) f <- rq(y ~ x, tau = 0.8, method = "lasso") # See f$lambda to see the default lambda selection } quantreg/man/crq.Rd0000644000176200001440000002571213574656101013746 0ustar liggesusers\name{crq} \alias{crq} \alias{crq.fit.por} \alias{crq.fit.por2} \alias{crq.fit.pow} \alias{crq.fit.pen} \alias{print.crq} \alias{print.crq} \alias{coef.crq} \alias{predict.crq} \alias{predict.crqs} \alias{Curv} \title{Functions to fit censored quantile regression models} \description{Fits a conditional quantile regression model for censored data. There are three distinct methods: the first is the fixed censoring method of Powell (1986) as implemented by Fitzenberger (1996), the second is the random censoring method of Portnoy (2003). The third method is based on Peng and Huang (2008).} \usage{ crq(formula, taus, data, subset, weights, na.action, method = c("Powell", "Portnoy", "Portnoy2", "PengHuang"), contrasts = NULL, ...) crq.fit.pow(x, y, yc, tau=0.5, weights=NULL, start, left=TRUE, maxit = 500) crq.fit.pen(x, y, cen, weights=NULL, grid, ctype = "right") crq.fit.por(x, y, cen, weights=NULL, grid, ctype = "right") crq.fit.por2(x, y, cen, weights=NULL, grid, ctype = "right") Curv(y, yc, ctype=c("left","right")) \method{print}{crq}(x, ...) \method{print}{crq}(x, ...) \method{predict}{crq}(object, newdata, ...) \method{predict}{crqs}(object, newdata, type = NULL, ...) \method{coef}{crq}(object,taus = 1:4/5,...) } \arguments{ \item{formula}{A formula object, with the response on the left of the `~' operator, and the terms on the right. The response must be a \code{Surv} object as returned by either the \code{Curv} or \code{Surv} function. For the Powell method, the Surv object should be created by \code{Curv} and have arguments (event time, censoring time,type), where "type" can take values either "left" or "right". The default (for historical reasons) for type in this case is "left". For the Portnoy and Peng and Huang methods the \code{Surv} should be created with the usual \code{Surv} function and have (event time, censoring indicator).} \item{y}{The event time.} \item{newdata}{An optional data frame in which to look for variables with which to predict. If omitted, the fitted values are used.} \item{grid}{A vector of taus on which the quantile process should be evaluated. This should be monotonic, and take values in (0,1). For the "Portnoy" method, grid = "pivot" computes the full solution for all distinct taus. The "Portnoy" method also enforces an equally spaced grid, see the code for details.} \item{x}{An object of class \code{crq} or \code{crq}.} \item{object}{An object of class \code{crq} or \code{crq}.} \item{yc}{The censoring times for the "Powell" method.} \item{ctype}{Censoring type: for the "Powell" method, used in \code{Curv}, by default "left". If you don't like "left", maybe you will like "right". Note that for fixed censoring assumed in the "Powell" method, censoring times \code{yc} must be provided for all observations and the event times \code{y} must satisfy the (respective) inequality constraints. For the Portnoy and Peng-Huang methods ctype is determined by the specification of the response as specified in \code{Surv}. } \item{type}{specifies either "left" or "right" as the form of censoring in the \code{Surv} function for the "Portnoy" and "PengHuang" methods.} \item{cen}{The censoring indicator for the "Portnoy" and "PengHuang" methods.} \item{maxit}{Maximum number of iterations allowed for the "Powell" methods.} \item{start}{The starting value for the coefs for the "Powell" method. Because the Fitzenberger algorithm stops when it achieves a local minimum of the Powell objective function, the starting value acts as an a priori "preferred point". This is advantageous in some instances since the global Powell solution can be quite extreme. By default the starting value is the "naive rq" solution that treats all the censored observations as uncensored. If \code{start} is equal to "global" then an attempt is made to compute to global optimum of the Powell objective. This entails an exhaustive evaluation of all n choose p distinct basic solution so is rather impractical for moderately large problems. Otherwise, the starting value can specify a set of p indices from 1:n defining an initial basic solution, or it may specify a p-vector of initial regression coefficients. In the latter case the initial basic solution is the one closest to the specified parameter vector.} \item{left}{A logical indicator for left censoring for the "Powell" method.} \item{taus}{The quantile(s) at which the model is to be estimated.} \item{tau}{The quantile at which the model is to be estimated.} \item{data}{A data.frame in which to interpret the variables named in the `formula', in the `subset', and the `weights' argument.} \item{subset}{an optional vector specifying a subset of observations to be used in the fitting process.} \item{weights}{vector of observation weights; if supplied, the algorithm fits to minimize the sum of the weights multiplied into the absolute residuals. The length of weights vector must be the same as the number of observations. The weights must be nonnegative and it is strongly recommended that they be strictly positive, since zero weights are ambiguous.} \item{na.action}{a function to filter missing data. This is applied to the model.frame after any subset argument has been used. The default (with 'na.fail') is to create an error if any missing values are found. A possible alternative is 'na.omit', which deletes observations that contain one or more missing values. } \item{method}{The method used for fitting. There are currently two options: method "Powell" computes the Powell estimator using the algorithm of Fitzenberger (1996), method "Portnoy" computes the Portnoy (2003) estimator. The method is "PengHuang" uses the method of Peng and Huang (2007), in this case the variable "grid" can be passed to specify the vector of quantiles at which the solution is desired.} \item{contrasts}{a list giving contrasts for some or all of the factors default = 'NULL' appearing in the model formula. The elements of the list should have the same name as the variable and should be either a contrast matrix (specifically, any full-rank matrix with as many rows as there are levels in the factor), or else a function to compute such a matrix given the number of levels.} \item{...}{additional arguments for the fitting routine, for method "Powell" it may be useful to pass starting values of the regression parameter via the argument "start", while for methods "Portnoy" or "PengHuang" one may wish to specify an alternative to the default grid for evaluating the fit.} } \details{The Fitzenberger algorithm uses a variant of the Barrodale and Roberts simplex method. Exploiting the fact that the solution must be characterized by an exact fit to p points when there are p parameters to be estimated, at any trial basic solution it computes the directional derivatives in the 2p distinct directions and choses the direction that (locally) gives steepest descent. It then performs a one-dimensional line search to choose the new basic observation and continues until it reaches a local mimumum. By default it starts at the naive \code{rq} solution ignoring the censoring; this has the (slight) advantage that the estimator is consequently equivariant to canonical transformations of the data. Since the objective function is no longer convex there can be no guarantee that this produces a global minimum estimate. In small problems exhaustive search over solutions defined by p-element subsets of the n observations can be used, but this quickly becomes impractical for large p and n. This global version of the Powell estimator can be invoked by specifying \code{start = "global"}. Users interested in this option would be well advised to compute \code{choose(n,p)} for their problems before trying it. The method operates by pivoting through this many distinct solutions and choosing the one that gives the minimal Powell objective. The algorithm used for the Portnoy method is described in considerable detail in Portnoy (2003). There is a somewhat simplified version of the Portnoy method that is written in R and iterates over a discrete grid. This version should be considered somewhat experimental at this stage, but it is known to avoid some difficulties with the more complicated fortran version of the algorithm that can occur in degenerate problems. Both the Portnoy and Peng-Huang estimators may be unable to compute estimates of the conditional quantile parameters in the upper tail of distribution. Like the Kaplan-Meier estimator, when censoring is heavy in the upper tail the estimated distribution is defective and quantiles are only estimable on a sub-interval of (0,1). The Peng and Huang estimator can be viewed as a generalization of the Nelson Aalen estimator of the cumulative hazard function, and can be formulated as a variant of the conventional quantile regression dual problem. See Koenker (2008) for further details. This paper is available from the package with \code{vignette("crq")}.} \value{An object of class \code{crq}.} \references{ Fitzenberger, B. (1996): ``A Guide to Censored Quantile Regressions,'' in \emph{Handbook of Statistics}, ed. by C.~Rao, and G.~Maddala. North-Holland: New York. Fitzenberger, B. and P. Winker (2007): ``Improving the Computation of Censored Quantile Regression Estimators,'' CSDA, 52, 88-108. Koenker, R. (2008): ``Censored Quantile Regression Redux,'' \emph{J. Statistical Software}, 27, \url{https://www.jstatsoft.org/v27/i06}. Peng, L and Y Huang, (2008) Survival Analysis with Quantile Regression Models, \emph{J. Am. Stat. Assoc.}, 103, 637-649. Portnoy, S. (2003) ``Censored Quantile Regression,'' \emph{JASA}, 98,1001-1012. Powell, J. (1986) ``Censored Regression Quantiles,'' \emph{J. Econometrics}, 32, 143--155. } \author{Steve Portnoy and Roger Koenker} \seealso{\code{\link{summary.crq}}} \examples{ # An artificial Powell example set.seed(2345) x <- sqrt(rnorm(100)^2) y <- -0.5 + x +(.25 + .25*x)*rnorm(100) plot(x,y, type="n") s <- (y > 0) points(x[s],y[s],cex=.9,pch=16) points(x[!s],y[!s],cex=.9,pch=1) yLatent <- y y <- pmax(0,y) yc <- rep(0,100) for(tau in (1:4)/5){ f <- crq(Curv(y,yc) ~ x, tau = tau, method = "Pow") xs <- sort(x) lines(xs,pmax(0,cbind(1,xs)\%*\%f$coef),col="red") abline(rq(y ~ x, tau = tau), col="blue") abline(rq(yLatent ~ x, tau = tau), col="green") } legend(.15,2.5,c("Naive QR","Censored QR","Omniscient QR"), lty=rep(1,3),col=c("blue","red","green")) # crq example with left censoring set.seed(1968) n <- 200 x <-rnorm(n) y <- 5 + x + rnorm(n) plot(x,y,cex = .5) c <- 4 + x + rnorm(n) d <- (y > c) points(x[!d],y[!d],cex = .5, col = 2) f <- crq(survival::Surv(pmax(y,c), d, type = "left") ~ x, method = "Portnoy") g <- summary(f) for(i in 1:4) abline(coef(g[[i]])[,1]) } \keyword{survival} \keyword{regression} quantreg/man/residuals.nlrq.Rd0000644000176200001440000000152211555564235016123 0ustar liggesusers\name{residuals.nlrq} \alias{residuals.nlrq} \title{ Return residuals of an nlrq object } \description{ Set algorithmic parameters for nlrq (nonlinear quantile regression function) } \usage{ \method{residuals}{nlrq}(object, type = c("response", "rho"), ...) } \arguments{ \item{object}{an `nlrq' object as returned by function `nlrq'} \item{type}{the type of residuals to return: "response" is the distance between observed and predicted values; "rho" is the weighted distance used to calculate the objective function in the minimisation algorithm as tau * pmax(resid, 0) + (1 - tau) * pmin(resid, 0), where resid are the simple residuals as above (with type="response"). } \item{...}{further arguments passed to or from other methods.} } \seealso{ \code{\link{nlrq}} } \keyword{models} \keyword{regression} \keyword{nonlinear} quantreg/man/boot.rq.pwxy.Rd0000644000176200001440000000352013767157312015550 0ustar liggesusers\name{boot.rq.pwxy} \alias{boot.rq.pwxy} \title{ Preprocessing weighted bootstrap method } \description{ Bootstrap method exploiting preprocessing strategy to reduce computation time for large problem. In contrast to \code{\link{boot.rq.pxy}} which uses the classical multinomial sampling scheme and is coded in R, this uses the exponentially weighted bootstrap scheme and is coded in fortran and consequently is considerably faster in larger problems. } \usage{ boot.rq.pwxy(x, y, tau, coef, R = 200, m0 = NULL, eps = 1e-06, ...) } \arguments{ \item{x}{ Design matrix } \item{y}{ response vector } \item{tau}{ quantile of interest } \item{coef}{ point estimate of fitted object } \item{R}{ the number of bootstrap replications desired. } \item{m0}{ constant to determine initial sample size, defaults to sqrt(n*p) but could use some further tuning... } \item{eps}{ tolerance for convergence of fitting algorithm } \item{...}{ other parameters not yet envisaged. } } \details{ The fortran implementation is quite similar to the R code for \code{\link{boot.rq.pxy}} except that there is no multinomial sampling. Instead \code{rexp(n)} weights are used. } \value{ returns a list with elements: \enumerate{ \item{coefficients}{a matrix of dimension ncol(x) by R} \item{nit} {a 5 by m matrix of iteration counts} \item{info} {an m-vector of convergence flags} } } \references{ Chernozhukov, V. I. Fernandez-Val and B. Melly, Fast Algorithms for the Quantile Regression Process, 2019, arXiv, 1909.05782, Portnoy, S. and R. Koenker, The Gaussian Hare and the Laplacian Tortoise, Statistical Science, (1997) 279-300 } \author{ Blaise Melly and Roger Koenker } \seealso{ \code{\link{boot.rq.pxy}} } \keyword{bootstrap} quantreg/man/qss.Rd0000644000176200001440000001046514414306664013766 0ustar liggesusers\name{qss} \alias{qss} \alias{qss1} \alias{qts1} \alias{qss2} \alias{triogram.fidelity} \alias{triogram.penalty} \title{Additive Nonparametric Terms for rqss Fitting} \description{ In the formula specification of \code{rqss} nonparametric terms are specified with \code{qss}. Both univariate and bivariate specifications are possible, and qualitative constraints may also be specified for the qss terms. } \usage{ qss(x, constraint = "N", lambda = 1, ndum = 0, dummies = NULL, Dorder = 1, w = rep(1, length(x))) } \arguments{ \item{x}{The covariate determining the nonparametric component, if x is a matrix with two columns then the qss function will construct a penalized triogram term.} \item{lambda}{The smoothing parameter governing the tradeoff between fidelity and the penalty component for this term. Larger lambdas produce smoother fits. In future versions there should be an automatic mechanism for default choice of the lambdas. For now, this is the responsibility of the user.} \item{constraint}{Optional specification of qualitative constraints on the fitted univariate qss functions, take the values: "N","I","D","V","C" "VI","VD","CI","CD" for none, increasing, decreasing, convex, concave, convex and increasing, etc. And for bivariate qss components can take the values "N","V","C" for none, convex, and concave. Note that confidence bands for constrained fits of this sort, while available from \code{plot.rqss} as of yet lack a formal justification.} \item{ndum}{number of dummy vertices: this is only relevant for qss2 terms. In addition to vertices at the observed (x,y) points ndum dummy vertices are generated -- distributed uniformly over the rectangle given by the Cartesian product of the ranges of x and y -- observations that fall in the convex hull of the observations are retained. So the actual number of dummy vertices used is smaller than ndum. The values of these vertices are returned in the list dummies, so that they can be reused.} \item{Dorder}{Order of the total variation penalty, the default of 1 implies a penalty on the first derivative of the fitted function, a value of 0 implies total variation of the fitted function itself will be penalized. Note that only monotonicity constraints, "I" and "D" are allowed when \code{Dorder = 0}, and result in estimates that are equivalent to a form of isotonic regression when lambda is sufficiently near zero. Results in this case from the package \pkg{isotone} may differ slightly when plotted due to multiple solutions so it is prudent to evaluate the objective function for both solutions.} \item{dummies}{list of dummy vertices as generated, for example by triogram.fidelity when ndum > 0. Should be a list with x and y components. These points should lie inside the convex hull of the real xy points, but no explicit checking of this assertion is currently done.} \item{w}{ weights not yet unimplemented } } \details{ The various pieces returned are stored in sparse matrix.csr form. See \code{\link{rqss}} for details on how they are assembled. To preserve the sparsity of the design matrix the first column of each qss term is dropped. This differs from the usual convention that would have forced qss terms to have mean zero. This convention has implications for prediction that need to be recognized. The penalty components for qss terms are based on total variation penalization of the first derivative (and gradient, for bivariate x) as described in the references appearing in the help for \code{rqss}. When Dorder = 0, fitting is like the taut string methods of Davies (2014), except for the fact that fidelity is quantilesque rather than quadratic, and that no provision is made for automatic selection of the smoothing parameter. For the bivariate case, package \pkg{interp} (and for plotting also \pkg{interp}) are required (automatically, by the \R code). } \value{ \item{F}{Fidelity component of the design matrix} \item{dummies}{List of dummy vertices} \item{A}{Penalty component of the design matrix} \item{R}{Constraint component of the design matrix} \item{r}{Constraint component of the rhs} } \author{Roger Koenker} \references{ Davies, Laurie (2014) \emph{Data Analysis and Approximate Models}, CRC Press. } \seealso{ \code{\link{rqss}}} \keyword{smooth} \keyword{robust} quantreg/man/barro.Rd0000644000176200001440000000247414014712473014261 0ustar liggesusers\name{barro} \alias{barro} \title{Barro Data} \description{ Version of the Barro Growth Data used in Koenker and Machado(1999). This is a regression data set consisting of 161 observations on determinants of cross country GDP growth rates. There are 13 covariates with dimnames corresponding to the original Barro and Lee source. See https://www.nber.org/pub/barro.lee/. The first 71 observations are on the period 1965-75, remainder on 1987-85. } \usage{data(barro)} \format{A data frame containing 161 observations on 14 variables: \tabular{rl}{ [,1] \tab "Annual Change Per Capita GDP"\cr [,2] \tab "Initial Per Capita GDP"\cr [,3] \tab "Male Secondary Education"\cr [,4] \tab "Female Secondary Education"\cr [,5] \tab "Female Higher Education"\cr [,6] \tab "Male Higher Education"\cr [,7] \tab "Life Expectancy"\cr [,8] \tab "Human Capital"\cr [,9] \tab "Education/GDP"\cr [,10] \tab "Investment/GDP"\cr [,11] \tab "Public Consumption/GDP"\cr [,12] \tab "Black Market Premium"\cr [,13] \tab "Political Instability"\cr [,14] \tab "Growth Rate Terms Trade"} } \references{ Koenker, R. and J.A.F. Machado (1999) Goodness of Fit and Related Inference Processes for Quantile Regression, JASA, 1296-1310.} \keyword{datasets} quantreg/man/nlrq.control.Rd0000644000176200001440000000175411555564235015617 0ustar liggesusers\name{nlrq.control} \alias{nlrq.control} \title{ Set control parameters for nlrq } \description{ Set algorithmic parameters for nlrq (nonlinear quantile regression function) } \usage{ nlrq.control(maxiter=100, k=2, InitialStepSize = 1, big=1e+20, eps=1e-07, beta=0.97) } \arguments{ \item{maxiter}{maximum number of allowed iterations} \item{k}{the number of iterations of the Meketon algorithm to be calculated in each step, usually 2 is reasonable, occasionally it may be helpful to set k=1 } \item{InitialStepSize}{ Starting value in \code{optim} to determine the step length of iterations. The default value of 1 is sometimes too optimistic. In such cases, the value 0 forces optim to just barely stick its toe in the water.} \item{big}{ a large scalar} \item{eps}{ tolerance for convergence of the algorithm } \item{beta}{ a shrinkage parameter which controls the recentering process in the interior point algorithm. } } \seealso{ \code{\link{nlrq}} } \keyword{ environment} quantreg/man/rq.fit.fnb.Rd0000644000176200001440000000425613034720250015114 0ustar liggesusers\name{rq.fit.fnb} \alias{rq.fit.fnb} \title{ Quantile Regression Fitting via Interior Point Methods } \description{ This is a lower level routine called by \code{rq()} to compute quantile regression methods using the Frisch-Newton algorithm. } \usage{ rq.fit.fnb(x, y, tau=0.5, rhs = (1-tau)*apply(x,2,sum), beta=0.99995, eps=1e-06) } \arguments{ \item{x}{ The design matrix } \item{y}{ The response vector } \item{tau}{ The quantile of interest, must lie in (0,1) } \item{rhs}{ The right hand size of the dual equality constraint, modify at your own risk. } \item{beta}{ technical step length parameter -- alter at your own risk! } \item{eps}{ tolerance parameter for convergence. In cases of multiple optimal solutions there may be some discrepancy between solutions produced by method \code{"fn"} and method \code{"br"}. This is due to the fact that \code{"fn"} tends to converge to a point near the centroid of the solution set, while \code{"br"} stops at a vertex of the set. } } \value{ returns an object of class \code{"rq"}, which can be passed to \code{\link{summary.rq}} to obtain standard errors, etc. } \details{ The details of the algorithm are explained in Koenker and Portnoy (1997). The basic idea can be traced back to the log-barrier methods proposed by Frisch in the 1950's for constrained optimization. But the current implementation is based on proposals by Mehrotra and others in the recent (explosive) literature on interior point methods for solving linear programming problems. This function replaces an earlier one \code{rq.fit.fn}, which required the initial dual values to be feasible. This version allows the user to specify an infeasible starting point for the dual problem, that is one that may not satisfy the dual equality constraints. It still assumes that the starting value satisfies the upper and lower bounds. } \references{ Koenker, R. and S. Portnoy (1997). The Gaussian Hare and the Laplacian Tortoise: Computability of squared-error vs. absolute-error estimators, with discussion, \emph{Statistical Science}, \bold{12}, 279-300. } \seealso{ \code{\link{rq}}, \code{\link{rq.fit.br}}, \code{\link{rq.fit.pfn}} } \keyword{regression} quantreg/man/rq.wfit.Rd0000644000176200001440000000142511555564235014551 0ustar liggesusers\name{rq.wfit} \alias{rq.wfit} \title{Function to choose method for Weighted Quantile Regression } \description{ Weight the data and then call the chosen fitting algorithm. } \usage{ rq.wfit(x, y, tau=0.5, weights, method="br", ...) } \arguments{ \item{x}{ the design matrix } \item{y}{ the response variable } \item{tau}{ the quantile desired, if tau lies outside (0,1) the whole process is estimated. } \item{weights}{ weights used in the fitting } \item{method}{ method of computation: "br" is Barrodale and Roberts exterior point "fn" is the Frisch-Newton interior point method. } \item{...}{ Optional arguments passed to fitting routine. } } \seealso{ \code{\link{rq}} \code{\link{rq.fit.br}} \code{\link{rq.fit.fnb}}} \keyword{ regression } quantreg/man/predict.rq.Rd0000644000176200001440000001074113034721464015224 0ustar liggesusers\name{predict.rq} \alias{predict.rq} \alias{predict.rqs} \alias{predict.rq.process} \title{Quantile Regression Prediction} \description{ Prediction based on fitted quantile regression model } \usage{ \method{predict}{rq}(object, newdata, type = "none", interval = c("none", "confidence"), level = .95, na.action = na.pass, ...) \method{predict}{rqs}(object, newdata, type = "Qhat", stepfun = FALSE, na.action = na.pass, ...) \method{predict}{rq.process}(object, newdata, type = "Qhat", stepfun = FALSE, na.action = na.pass, ...) } \arguments{ \item{object}{ object of class rq or rqs or rq.process produced by \code{rq} } \item{newdata}{An optional data frame in which to look for variables with which to predict. If omitted, the fitted values are used.} \item{interval}{type of interval desired: default is 'none', when set to 'confidence' the function returns a matrix predictions with point predictions for each of the 'newdata' points as well as lower and upper confidence limits.} \item{level}{converage probability for the 'confidence' intervals.} \item{type}{For \code{predict.rq}, the method for 'confidence' intervals, if desired. If 'percentile' then one of the bootstrap methods is used to generate percentile intervals for each prediction, if 'direct' then a version of the Portnoy and Zhou (1998) method is used, and otherwise an estimated covariance matrix for the parameter estimates is used. Further arguments to determine the choice of bootstrap method or covariance matrix estimate can be passed via the \dots argument. For \code{predict.rqs} and \code{predict.rq.process} when \code{stepfun = TRUE}, \code{type} is "Qhat", "Fhat" or "fhat" depending on whether the user would like to have estimates of the conditional quantile, distribution or density functions respectively. As noted below the two former estimates can be monotonized with the function \code{rearrange}. When the "fhat" option is invoked, a list of conditional density functions is returned based on Silverman's adaptive kernel method as implemented in \code{akj} and \code{approxfun}.} \item{stepfun}{If 'TRUE' return stepfunctions otherwise return matrix of predictions. these functions can be estimates of either the conditional quantile or distribution functions depending upon the \code{type} argument. When \code{stepfun = FALSE} a matrix of point estimates of the conditional quantile function at the points specified by the \code{newdata} argument. } \item{na.action}{ function determining what should be done with missing values in 'newdata'. The default is to predict 'NA'.} \item{\dots}{ Further arguments passed to or from other methods.} } \details{ Produces predicted values, obtained by evaluating the quantile regression function in the frame 'newdata' (which defaults to 'model.frame(object)'. These predictions purport to estimate the conditional quantile function of the response variable of the fitted model evaluated at the covariate values specified in "newdata" and the quantile(s) specified by the "tau" argument. Several methods are provided to compute confidence intervals for these predictions. } \value{ A vector or matrix of predictions, depending upon the setting of 'interval'. In the case that there are multiple taus in \code{object} when object is of class 'rqs' setting 'stepfun = TRUE' will produce a \code{stepfun} object or a list of \code{stepfun} objects. The function \code{rearrange} can be used to monotonize these step-functions, if desired. } \references{ Zhou, Kenneth Q. and Portnoy, Stephen L. (1998) Statistical inference on heteroscedastic models based on regression quantiles Journal of Nonparametric Statistics, 9, 239-260 } \author{R. Koenker} \seealso{ \code{\link{rq}} \code{\link{rearrange}}} \examples{ data(airquality) airq <- airquality[143:145,] f <- rq(Ozone ~ ., data=airquality) predict(f,newdata=airq) f <- rq(Ozone ~ ., data=airquality, tau=1:19/20) fp <- predict(f, newdata=airq, stepfun = TRUE) fpr <- rearrange(fp) plot(fp[[2]],main = "Conditional Ozone Quantile Prediction") lines(fpr[[2]], col="red") legend(.2,20,c("raw","cooked"),lty = c(1,1),col=c("black","red")) fp <- predict(f, newdata=airq, type = "Fhat", stepfun = TRUE) fpr <- rearrange(fp) plot(fp[[2]],main = "Conditional Ozone Distribution Prediction") lines(fpr[[2]], col="red") legend(20,.4,c("raw","cooked"),lty = c(1,1),col=c("black","red")) } \keyword{regression} quantreg/man/Bosco.Rd0000644000176200001440000000227611555564235014231 0ustar liggesusers\name{Bosco} \alias{Bosco} \title{Boscovich Data} \description{ Boscovich data used to estimate the ellipticity of the earth. There are five measurements of the arc length of one degree of latitude taken at 5 different latitudes. See Koenker (2005) for further details and references. } \usage{data(Bosco)} \format{A data frame containing 5 observations on 2 variables \describe{ \item{x}{sine squared of latitude measured in degrees} \item{y}{arc length of one degree of latitude measured in toise - 56,700, one toise approximately equals 1.95 meters. } } } \references{ Koenker, R. (2005), "Quantile Regression", Cambridge. } \examples{ data(Bosco) plot(0:10/10,0:10*100,xlab="sin^2(latitude)", ylab="arc-length of 1 degree of latitude",type="n") points(Bosco) text(Bosco, pos = 3, rownames(Bosco)) z <- rq(y ~ x, tau = -1, data = Bosco) title("Boscovitch Ellipticity of the Earth Example") xb <- c(.85,.9,.6,.6) yb <- c(400,600,450,600) for(i in 1:4){ abline(c(z$sol[4:5,i])) interval <- paste("t=(",format(round(z$sol[1,i],2)),",", format(round(z$sol[1,i+1],2)),")",delim="") text(xb[i],yb[i],interval) } } \keyword{datasets} quantreg/man/rqs.fit.Rd0000644000176200001440000000113511612373423014532 0ustar liggesusers\name{rqs.fit} \alias{rqs.fit} \title{Function to fit multiple response quantile regression models} \usage{ rqs.fit(x, y, tau=0.5, tol = 0.0001) } \arguments{ \item{x}{ the design matrix an n by p matrix. } \item{y}{ the response variable as a n by m matrix } \item{tau}{ the quantile desired, if tau lies outside (0,1) } \item{tol}{ tolerance parameter for Barrodale and Roberts exterior point method. } } \description{Function intended for multiple response quantile regression called from \code{boot.rq} for wild bootstrap option.} \seealso{ \code{\link{boot.rq}} } \keyword{ regression } quantreg/man/print.KhmaladzeTest.Rd0000644000176200001440000000062013505172007017033 0ustar liggesusers\name{print.KhmaladzeTest} \alias{print.KhmaladzeTest} \title{ Print a KhmaladzeTest object} \description{ Print an object generated by KhmaladzeTest } \usage{ \method{print}{KhmaladzeTest}(x, ...) } \arguments{ \item{x}{ Object returned from KhmaladzeTest representing the fit of the model. } \item{...}{ Optional arguments. } } \seealso{ \code{\link{KhmaladzeTest}}} \keyword{ regression} quantreg/man/rq.fit.sfn.Rd0000644000176200001440000000601411555564235015146 0ustar liggesusers\name{rq.fit.sfn} \alias{rq.fit.sfn} \alias{sfnMessage} \title{Sparse Regression Quantile Fitting} \description{ Fit a quantile regression model using a sparse implementation of the Frisch-Newton interior-point algorithm. } \usage{ rq.fit.sfn(a, y, tau = 0.5, rhs = (1-tau)*c(t(a) \%*\% rep(1,length(y))), control) } \arguments{ \item{a}{structure of the design matrix X stored in csr format} \item{y}{response vector} \item{tau}{desired quantile} \item{rhs}{the right-hand-side of the dual problem; regular users shouldn't need to specify this, but in special cases can be quite usefully altered to meet special needs. See e.g. Section 6.8 of Koenker (2005).} \item{control}{control parameters for fitting routines: see \code{sfn.control}} } \details{ This is a sparse implementation of the Frisch-Newton algorithm for quantile regression described in Portnoy and Koenker (1997). The sparse matrix linear algebra is implemented through the functions available in the R package \pkg{SparseM}. } \value{ \item{coef}{Regression quantile coefficients} \item{ierr}{Error code for the internal Fortran routine \code{srqfnc}: \describe{ \item{1:}{ insufficient work space in call to \code{extract}} \item{2:}{ nnzd > nnzdmax} \item{3:}{ insufficient storage in iwork when calling ordmmd} \item{4:}{ insufficient storage in iwork when calling sfinit} \item{5:}{ nnzl > nnzlmax when calling sfinit} \item{6:}{ nsub > nsubmax when calling sfinit} \item{7:}{ insufficient work space in iwork when calling symfct} \item{8:}{ inconsistancy in input when calling symfct} \item{9:}{ tmpsiz > tmpmax when calling bfinit; increase tmpmax} \item{10:}{ nonpositive diagonal encountered, not positive definite} \item{11:}{ insufficient work storage in tmpvec when calling blkfct} \item{12:}{ insufficient work storage in iwork when calling blkfct} \item{17:}{ tiny diagonals replaced with Inf when calling blkfct} } } \item{it}{Iteration count} \item{time}{Amount of time used in the computation} } \references{ Portnoy, S. and R. Koenker (1997) The Gaussian Hare and the Laplacean Tortoise: Computability of Squared-error vs Absolute Error Estimators, (with discussion). \emph{Statistical Science}, 12, 279-300. Koenker, R and Ng, P. (2003). SparseM: A Sparse Matrix Package for \R, \emph{J. of Stat. Software}, 8, 1--9. Koenker, R. (2005) \emph{Quantile Regression}, Cambridge U. Press. } \author{Pin Ng} \seealso{\code{rq.fit.sfnc} for the constrained version, \code{SparseM} for a sparse matrix package for \R } \examples{ ## An artificial example : n <- 200 p <- 50 set.seed(101) X <- rnorm(n*p) X[abs(X) < 2.0] <- 0 X <- cbind(1, matrix(X, n, p)) y <- 0.5 * apply(X,1,sum) + rnorm(n) ## true beta = (0.5, 0.5, ...) sX <- as.matrix.csr(X) try(rq.o <- rq.fit.sfn(sX, y)) #-> not enough tmp memory (tmpmax <- floor(1e5 + exp(-12.1)*(sX@ia[p+1]-1)^2.35)) ## now ok: rq.o <- rq.fit.sfn(sX, y, control = list(tmpmax= tmpmax)) } \keyword{regression} quantreg/man/sfn.control.Rd0000644000176200001440000000234112200022521015371 0ustar liggesusers\name{sfn.control} \alias{sfn.control} \title{Set Control Parameters for Sparse Fitting } \description{ Auxiliary function for setting storage dimensions and other parameters rq.fit.sfn[c] } \usage{ sfn.control(nsubmax = NULL, tmpmax = NULL, nnzlmax = NULL, cachsz = 64, small = 1e-06, maxiter = 100, warn.mesg = TRUE) } \arguments{ \item{nsubmax}{ upper bound for dimension of lindx } \item{tmpmax}{ upper bound for dimension of tmpvec } \item{nnzlmax}{ upper bound for non-zero entries of L stored in lnz, including diagonal } \item{cachsz}{ size of cache in kbytes on target machine } \item{small}{ convergence tolerance for interior point algorithm } \item{maxiter}{ maximal number of interior point iterations. } \item{warn.mesg}{ logical flag controlling printing of warnings. } } \details{ Sparse fitting requires a number of temporary storage arrays whose size depends on problem specific features in somewhat mysterious ways, parameters controlling these sizes and some other fitting aspects can be controlled by specifying elements of this control object. } \value{ List with components named as the arguments given above. } \author{ Roger Koenker } \seealso{ See Also \code{\link{rq.fit.sfn}} } \keyword{ utilities } quantreg/man/rqss.object.Rd0000644000176200001440000000713314414306664015413 0ustar liggesusers\name{rqss.object} \alias{rqss.object} \alias{logLik.rqss} \alias{AIC.rqss} \alias{fitted.rqss} \alias{resid.rqss} \alias{print.rqss} \title{RQSS Objects and Summarization Thereof} \description{ Functions to reveal the inner meaning of objects created by \code{rqss} fitting. } \usage{ \method{logLik}{rqss}(object, ...) \method{AIC}{rqss}(object, ..., k=2) \method{print}{rqss}(x, ...) \method{resid}{rqss}(object, ...) \method{fitted}{rqss}(object, ...) } \arguments{ \item{object}{an object returned from \code{rqss} fitting, describing an additive model estimating a conditional quantile function. See \code{\link{qss}} for details on how to specify these terms.} \item{x}{an rqss object, as above.} \item{k}{a constant factor governing the weight attached to the penalty term on effective degrees of freedom of the fit. By default k =2 corresponding to the Akaike version of the penalty, negative values indicate that the k should be set to log(n) as proposed by Schwarz (1978).} \item{...}{additional arguments} } \details{ Total variation regularization for univariate and bivariate nonparametric quantile smoothing is described in Koenker, Ng and Portnoy (1994) and Koenker and Mizera(2003) respectively. The additive model extension of this approach depends crucially on the sparse linear algebra implementation for R described in Koenker and Ng (2003). Eventually, these functions should be expanded to provide an automated lambda selection procedure.} \value{ The function \code{summary.rqss} returns a list consisting of the following components: \item{fidelity}{Value of the quantile regression objective function.} \item{penalty}{A list consisting of the values of the total variation smoothing penalty for each of additive components.} \item{edf}{Effective degrees of freedom of the fitted model, defined as the number of zero residuals of the fitted model, Koenker Mizera (2003) for details.} \item{qssedfs}{A list of effective degrees of freedom for each of the additive components of the fitted model, defined as the number of non-zero elements of each penalty component of the residual vector.} \item{lamdas}{A list of the lambdas specified for each of the additive components of the model.} } \references{ [1] Koenker, R. and S. Portnoy (1997) The Gaussian Hare and the Laplacean Tortoise: Computability of Squared-error vs Absolute Error Estimators, (with discussion). \emph{Statistical Science} \bold{12}, 279--300. [2] Koenker, R., P. Ng and S. Portnoy, (1994) Quantile Smoothing Splines; \emph{Biometrika} \bold{81}, 673--680. [3] Koenker, R. and I. Mizera, (2003) Penalized Triograms: Total Variation Regularization for Bivariate Smoothing; \emph{JRSS(B)} \bold{66}, 145--163. [4] Koenker, R. and P. Ng (2003) SparseM: A Sparse Linear Algebra Package for R, \emph{J. Stat. Software}. } \author{ Roger Koenker } \seealso{ \code{\link{plot.rqss}} } \examples{ require(MatrixModels) n <- 200 x <- sort(rchisq(n,4)) z <- x + rnorm(n) y <- log(x)+ .1*(log(x))^2 + log(x)*rnorm(n)/4 + z plot(x, y-z) f.N <- rqss(y ~ qss(x, constraint= "N") + z) f.I <- rqss(y ~ qss(x, constraint= "I") + z) f.CI <- rqss(y ~ qss(x, constraint= "CI") + z) lines(x[-1], f.N $coef[1] + f.N $coef[-(1:2)]) lines(x[-1], f.I $coef[1] + f.I $coef[-(1:2)], col="blue") lines(x[-1], f.CI$coef[1] + f.CI$coef[-(1:2)], col="red") ## A bivariate example if(requireNamespace("interp")){ if(requireNamespace("interp")){ data(CobarOre) fCO <- rqss(z ~ qss(cbind(x,y), lambda= .08), data=CobarOre) plot(fCO) }}} \keyword{regression} \keyword{smooth} \keyword{robust} quantreg/man/rq.fit.pfnb.Rd0000644000176200001440000000523313767706302015307 0ustar liggesusers\name{rq.fit.pfnb} \alias{rq.fit.pfnb} \title{ Quantile Regression Fitting via Interior Point Methods } \description{ This is a lower level routine called by \code{rq()} to compute quantile regression parameters using the Frisch-Newton algorithm. It uses a form of preprocessing to accelerate the computations for situations in which several taus are required for the same model specification. } \usage{ rq.fit.pfnb(x, y, tau, m0 = NULL, eps = 1e-06) } \arguments{ \item{x}{ The design matrix } \item{y}{ The response vector } \item{tau}{ The quantiles of interest, must lie in (0,1), be sorted and preferably equally spaced. } \item{m0}{ An initial reduced sample size by default is set to be \code{round((n * (log(p) + 1) )^(2/3)} this could be explored further to aid performance in extreme cases. } \item{eps}{A tolerance parameter intended to bound the confidence band entries away from zero.} } \value{ returns a list with elements consisting of \enumerate{ \item{coefficients}{a matrix of dimension ncol(x) by length(taus) } \item{nit} {a 5 by m matrix of iteration counts: first two coordinates of each column are the number of interior point iterations, the third is the number of observations in the final globbed sample size, and the last two are the number of fixups and bad-fixups respectively. This is intended to aid fine tuning of the initial sample size, m0.} \item{info} {an m-vector of convergence flags} } } \details{ The details of the Frisch-Newton algorithm are explained in Koenker and Portnoy (1997), as is the preprocessing idea which is related to partial sorting and the algorithms such as \code{kuantile} for univariate quantiles that operate in time O(n). The preprocessing idea of exploiting nearby quantile solutions to accelerate estimation of adjacent quantiles is proposed in Chernozhukov et al (2020). This version calls a fortran version of the preprocessing algorithm that accepts multiple taus. The preprocessing approach is also implemented for a single tau in \code{rq.fit.pfn} which may be regarded as a prototype for this function since it is written entirely in R and therefore is easier to experiment with. } \references{ Koenker, R. and S. Portnoy (1997). The Gaussian Hare and the Laplacian Tortoise: Computability of squared-error vs. absolute-error estimators, with discussion, \emph{Statistical Science}, \bold{12}, 279-300. Chernozhukov, V., I., Fernandez-Val, and Melly, B. (2020), `Fast algorithms for the quantile regression process', Empirical Economics, forthcoming. } \seealso{ \code{\link{rq}}, \code{\link{rq.fit.br}}, \code{\link{rq.fit.pfn}} } \keyword{regression} quantreg/man/nlrq.Rd0000644000176200001440000001165411742021462014124 0ustar liggesusers\name{nlrq} \alias{nlrq} \alias{nlrqModel} \alias{print.nlrq} \alias{summary.nlrq} \alias{deviance.nlrq} \alias{formula.nlrq} \alias{coef.nlrq} \alias{fitted.nlrq} \alias{logLik.nlrq} \alias{AIC.nlrq} \alias{extractAIC.nlrq} \alias{predict.nlrq} \alias{print.summary.nlrq} \alias{tau.nlrq} \title{ Function to compute nonlinear quantile regression estimates} \description{ This function implements an R version of an interior point method for computing the solution to quantile regression problems which are nonlinear in the parameters. The algorithm is based on interior point ideas described in Koenker and Park (1994). } \usage{ nlrq(formula, data=parent.frame(), start, tau=0.5, control, trace=FALSE,method="L-BFGS-B") \method{summary}{nlrq}(object, ...) \method{print}{summary.nlrq}(x, digits = max(5, .Options$digits - 2), ...) } \arguments{ \item{formula}{ formula for model in nls format; accept self-starting models } \item{data}{ an optional data frame in which to evaluate the variables in `formula' } \item{start}{a named list or named numeric vector of starting estimates } \item{tau}{ a vector of quantiles to be estimated} \item{control}{ an optional list of control settings. See `nlrq.control' for the names of the settable control values and their effect.} \item{trace}{ logical value indicating if a trace of the iteration progress should be printed. Default is `FALSE'. If `TRUE' intermediary results are printed at the end of each iteration. } \item{method}{ method passed to optim for line search, default is "L-BFGS-B" but for some problems "BFGS" may be preferable. See \code{\link{optim}} for further details. Note that the algorithm wants to pass upper and lower bounds for the line search to optim, which is fine for the L-BFGS-B method. Use of other methods will produce warnings about these arguments -- so users should proceed at their own risk.} \item{object}{an object of class nlrq needing summary.} \item{x}{an object of class summary.nlrq needing printing.} \item{digits}{Significant digits reported in the printed table.} \item{...}{Optional arguments passed to printing function.} } \details{An `nlrq' object is a type of fitted model object. It has methods for the generic functions `coef' (parameters estimation at best solution), `formula' (model used), `deviance' (value of the objective function at best solution), `print', `summary', `fitted' (vector of fitted variable according to the model), `predict' (vector of data points predicted by the model, using a different matrix for the independent variables) and also for the function `tau' (quantile used for fitting the model, as the tau argument of the function). Further help is also available for the method `residuals'. The summary method for nlrq uses a bootstrap approach based on the final linearization of the model evaluated at the estimated parameters. } \value{ A list consisting of: \item{m}{an `nlrqModel' object similar to an `nlsModel' in package nls} \item{data }{the expression that was passed to `nlrq' as the data argument. The actual data values are present in the environment of the `m' component. } } \author{Based on S code by Roger Koenker modified for R and to accept models as specified by nls by Philippe Grosjean.} \references{ Koenker, R. and Park, B.J. (1994). An Interior Point Algorithm for Nonlinear Quantile Regression, Journal of Econometrics, 71(1-2): 265-283. } \seealso{ \code{\link{nlrq.control}} , \code{\link{residuals.nlrq}} } \examples{ # build artificial data with multiplicative error Dat <- NULL; Dat$x <- rep(1:25, 20) set.seed(1) Dat$y <- SSlogis(Dat$x, 10, 12, 2)*rnorm(500, 1, 0.1) plot(Dat) # fit first a nonlinear least-square regression Dat.nls <- nls(y ~ SSlogis(x, Asym, mid, scal), data=Dat); Dat.nls lines(1:25, predict(Dat.nls, newdata=list(x=1:25)), col=1) # then fit the median using nlrq Dat.nlrq <- nlrq(y ~ SSlogis(x, Asym, mid, scal), data=Dat, tau=0.5, trace=TRUE) lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=2) # the 1st and 3rd quartiles regressions Dat.nlrq <- nlrq(y ~ SSlogis(x, Asym, mid, scal), data=Dat, tau=0.25, trace=TRUE) lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=3) Dat.nlrq <- nlrq(y ~ SSlogis(x, Asym, mid, scal), data=Dat, tau=0.75, trace=TRUE) lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=3) # and finally "external envelopes" holding 95 percent of the data Dat.nlrq <- nlrq(y ~ SSlogis(x, Asym, mid, scal), data=Dat, tau=0.025, trace=TRUE) lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=4) Dat.nlrq <- nlrq(y ~ SSlogis(x, Asym, mid, scal), data=Dat, tau=0.975, trace=TRUE) lines(1:25, predict(Dat.nlrq, newdata=list(x=1:25)), col=4) leg <- c("least squares","median (0.5)","quartiles (0.25/0.75)",".95 band (0.025/0.975)") legend(1, 12.5, legend=leg, lty=1, col=1:4) } \keyword{models} \keyword{regression} \keyword{nonlinear} \keyword{robust} quantreg/man/bandwidth.rq.Rd0000644000176200001440000000137411555564235015547 0ustar liggesusers\name{bandwidth.rq} \alias{bandwidth.rq} \title{ bandwidth selection for rq functions } \description{ function to compute bandwidth for sparsity estimation } \usage{ bandwidth.rq(p, n, hs=TRUE, alpha=0.05) } \arguments{ \item{p}{ quantile(s) of interest } \item{n}{ sample size } \item{hs}{ flag for hall-sheather method } \item{alpha}{ alpha level for intended confidence intervals } } \details{ If hs=TRUE (default) then the Hall-Sheather(1988) rule \eqn{O(n^{-1/3})} is used, if hs=FALSE then the Bofinger \eqn{O(n^{-1/5})} is used. } \value{ returns a vector of bandwidths corresponding to the argument p. } \references{ Hall and Sheather(1988, JRSS(B)),Bofinger (1975, Aus. J. Stat)} \author{ Roger Koenker rkoenker@uiuc.edu} \keyword{ regression } quantreg/man/Peirce.Rd0000644000176200001440000001121413726077726014371 0ustar liggesusers\name{Peirce} \alias{Peirce} \docType{data} \title{C.S. Peirce's Auditory Response Data} \description{ Data from sequence experiments conducted by C.S. Pierce in 1872 to determine the distribution of response times to an auditory stimulus. } \usage{data(Peirce)} \format{ A \code{link{list}} of 24 objects each representing one day of the experiment. Each element of the list consists of three components: the date the measurements were made, an \code{x} component recording the response time in milliseconds, and an associated \code{y} component recording a count of the number of times that the response was recorded to be equal to be equal to the corresponding \code{x} entry. There are roughly 500 observations (counts) on each of the 24 days. } \details{ A detailed description of the experiment can be found in Peirce (1873). A young man of about 18 with no prior experience was employed to respond to a signal ``consisting of a sharp sound like a rap, the answer being made upon a telegraph-operator's key nicely adjusted.'' The response times, made with the aid of a Hipp cronoscope were recorded to the nearest millisecond. The data was analyzed by Peirce who concluded that after the first day, when the the observer was entirely inexperienced, the curves representing the densities of the response times ``differed very little from that derived from the theory of least squares,'' i.e. from the Gaussian density. The data was subsequently analysed by Samama, in a diploma thesis supervised by Maurice Frechet, who reported briefly the findings in Frechet (1924), and by Wilson and Hilferty (1929). In both instances the reanalysis showed that Laplace's first law of error, the double exponential distribution, was a better representation for the data than was the Gaussian law. Koenker (2009) constains further discussion and an attempt to reproduce the Wilson and Hilferty analysis. The data is available in two formats: The first in a "raw" form as 24 text files as scanned from the reprinted Peirce source, the second as an R dataset \code{Peirce.rda} containing the list. Only the latter is provided here, for the raw data and how to read see the more complete archive at: \url{ http://www.econ.uiuc.edu/~roger/research/frechet/frechet.html} See the examples section below for some details on provisional attempt to reproduce part of the Wilson and Hilferty analysis. An open question regarding the dataset is: How did Wilson and Hilferty compute standard deviations for the median as they appear in their table? The standard textbook suggestion of Yule (1917) yields far too small a bandwidth. The methods employed in the example section below, which rely on relatively recent proposals, are somewhat closer, but still deviate somewhat from the results reported by Wilson and Hilferty. } \source{ Peirce, C.~S. (1873): ``On the Theory of Errors of Observation,'' \emph{Report of the Superintendent of the U.S. Coast Survey}, pp. 200--224, Reprinted in \emph{The New Elements of Mathematics}, (1976) collected papers of C.S. Peirce, ed. by C. Eisele, Humanities Press: Atlantic Highlands, N.J., vol. 3, part 1, 639--676. } \references{ Fr\'echet, M. (1924): ``Sur la loi des erreurs d'observation,'' \emph{Matematichiskii Sbornik}, 32, 5--8. Koenker, R. (2009): ``The Median is the Message: Wilson and Hilferty's Reanalysis of C.S. Peirce's Experiments on the Law of Errors,'' \emph{American Statistician}, 63, 20-25. Wilson, E.~B., and M.~M. Hilferty (1929): ``Note on C.S. Peirces Experimental Discussion of the Law of Errors,'' \emph{Proceedings of the National Academy of Sciences of the U.S.A.}, 15, 120--125. Yule, G.~U. (1917): \emph{An Introduction to the Theory of Statistics}. Charles Griffen: London, 4 edn. } \examples{ # Make table like Wilson and Hilferty data("Peirce") set.seed(10) #Dither the counts tab <- matrix(0,24,11) for(i in 1:24){ y <- rep(Peirce[[i]]$x, Peirce[[i]]$y) + runif(sum(Peirce[[i]]$y), -.5, .5) f1 <- summary(rq(y~1),se="iid")$coef[1:2] n <- length(y) f0 <- 1/(2 * sum(abs(y-f1[1])/n)) #Laplace proposal f0 <- (1/(2 * f0))/ sqrt(n) f2 <- summary(lm(y~1))$coef[1:2] outm <- sum(y < (f1[1] - 3.1 * sqrt(n) * f2[2])) outp <- sum(y > (f1[1] + 3.1 * sqrt(n) * f2[2])) outt <- outm + outp inm <- y > (f1[1] - 0.25 * sqrt(n) * f2[2]) inp <- y < (f1[1] + 0.25 * sqrt(n) * f2[2]) int <- sum(inm * inp) Eint <- round(n * (pnorm(.25) - pnorm(-.25))) excess <- round(100*(int - Eint)/Eint) tab[i,] <- c(f1, f0, f2, outm, outp, outt,int,Eint,excess) cnames <- c("med","sdmed1","sdmed0","mean","sdmean","below","above","outliers", "inliers","Einliers","ExcessIns") dimnames(tab) <- list(paste("Day",1:24),cnames) } } \keyword{datasets} quantreg/man/plot.KhmaladzeTest.Rd0000644000176200001440000000061413505172155016664 0ustar liggesusers \name{plot.KhmaladzeTest} \alias{plot.KhmaladzeTest} \title{ Plot a KhmaladzeTest object} \description{ Plot an object generated by KhmaladzeTest } \usage{ \method{plot}{KhmaladzeTest}(x, ...) } \arguments{ \item{x}{ Object returned from KhmaladzeTest representing the fit of the model. } \item{...}{ Optional arguments. } } \seealso{ \code{\link{KhmaladzeTest}}} \keyword{ regression} quantreg/man/boot.rq.Rd0000644000176200001440000001256514222025324014533 0ustar liggesusers\name{boot.rq} \alias{boot.rq} \alias{boot.rq.xy} \alias{boot.rq.wxy} \alias{boot.rq.pwy} \alias{boot.rq.spwy} \alias{boot.rq.mcmb} \title{ Bootstrapping Quantile Regression} \description{ These functions can be used to construct standard errors, confidence intervals and tests of hypotheses regarding quantile regression models. } \usage{ boot.rq(x, y, tau = 0.5, R = 200, bsmethod = "xy", mofn = length(y), coef = NULL, blbn = NULL, cluster = NULL, U = NULL, ...) } \arguments{ \item{x}{ The regression design matrix} \item{y}{ The regression response vector} \item{tau}{ The quantile of interest} \item{R}{ The number of bootstrap replications} \item{bsmethod}{ The method to be employed. There are (as yet) five options: method = "xy" uses the xy-pair method, and method = "pwy" uses the method of Parzen, Wei and Ying (1994) method = "mcmb" uses the Markov chain marginal bootstrap of He and Hu (2002) and Kocherginsky, He and Mu (2003). The "mcmb" method isn't compatible with sparse X matrices. The fourth method = "wxy" uses the generalized bootstrap of Bose and Chatterjee (2003) with unit exponential weights, see also Chamberlain and Imbens (2003). The fifth method "wild" uses the wild bootstrap method proposed by Feng, He and Hu (2011). } \item{mofn}{ optional argument for the bootstrap method "xy" that permits subsampling (m out of n) bootstrap. Obviously mofn should be substantially larger than the column dimension of x, and should be less than the sample size.} \item{coef}{coefficients from initial fitted object} \item{blbn}{orginal sample size for the BLB model} \item{cluster}{If non-NULL this argument should specify cluster id numbers for each observation, in which case the clustered version of the bootstrap based on the proposal of Hagemann (2017). If present \code{bsmethod} is set to set to "cluster". If this option is used and the fitting method for the original call was "sfn" then the bootstrapping will be carried out with the "sfn" as well. This is usually substantially quicker than the older version which employed the "br" variant of the simplex method. Use of "sfn" also applies to the "pwy" method when the original fitting was done with "sfn". Finally, if \code{na.action = "omit"} and \code{length(object$na.action) > 0} then these elements are also removed from the \code{cluster} variable. Consequently, the length of the \code{cluster} variable should always be the same as the length of the original response variable before any \code{na.action} takes place. } \item{U}{If non-NULL this argument should specify an array of indices or gradient evaluations to be used by the corresponding bootstrap method as specified by \code{bsmethod}. This is NOT intended as a user specified input, instead it is specified in \code{summary.rqs} to ensure that bootstrap samples for multiple taus use the same realizations of the random sampling.} \item{...}{ Optional arguments to control bootstrapping} } \details{ Their are several refinements that are still unimplemented. Percentile methods should be incorporated, and extensions of the methods to be used in anova.rq should be made. And more flexibility about what algorithm is used would also be good. } \value{ A list consisting of two elements: A matrix \code{B} of dimension R by p is returned with the R resampled estimates of the vector of quantile regression parameters. When mofn < n for the "xy" method this matrix has been deflated by the factor sqrt(m/n). A matrix \code{U} of sampled indices (for \code{bsmethod in c("xy", "wxy")}) or gradient evaluations (for \code{bsmethod in c("pwy", "cluster")}) used to generate the bootstrapped realization, and potentially reused for other \code{taus} when invoked from \code{summary.rqs}. } \references{ [1] Koenker, R. W. (1994). Confidence Intervals for regression quantiles, in P. Mandl and M. Huskova (eds.), \emph{Asymptotic Statistics}, 349--359, Springer-Verlag, New York. [2] Kocherginsky, M., He, X. and Mu, Y. (2005). Practical Confidence Intervals for Regression Quantiles, Journal of Computational and Graphical Statistics, 14, 41-55. [3] Hagemann, A. (2017) Cluster Robust Bootstrap inference in quantile regression models, Journal of the American Statistical Association , 112, 446--456. [4] He, X. and Hu, F. (2002). Markov Chain Marginal Bootstrap. Journal of the American Statistical Association , Vol. 97, no. 459, 783-795. [5] Parzen, M. I., L. Wei, and Z. Ying (1994): A resampling method based on pivotal estimating functions,'' Biometrika, 81, 341--350. [6] Bose, A. and S. Chatterjee, (2003) Generalized bootstrap for estimators of minimizers of convex functions, \emph{J. Stat. Planning and Inf}, 117, 225-239. [7] Chamberlain G. and Imbens G.W. (2003) Nonparametric Applications of Bayesian Inference, Journal of Business & Economic Statistics, 21, pp. 12-18. [8] Feng, Xingdong, Xuming He, and Jianhua Hu (2011) Wild Bootstrap for Quantile Regression, Biometrika, 98, 995--999. } \author{ Roger Koenker (and Xuming He and M. Kocherginsky for the mcmb code)} \seealso{ \code{\link{summary.rq}}} \examples{ y <- rnorm(50) x <- matrix(rnorm(100),50) fit <- rq(y~x,tau = .4) summary(fit,se = "boot", bsmethod= "xy") summary(fit,se = "boot", bsmethod= "pwy") #summary(fit,se = "boot", bsmethod= "mcmb") } \keyword{ regression} quantreg/man/rqProcess.Rd0000644000176200001440000000324611555564235015143 0ustar liggesusers\name{rqProcess} \alias{rqProcess} \title{ Compute Standardized Quantile Regression Process } \description{ Computes a standardize quantile regression process for the model specified by the formula, on the partition of [0,1] specified by the taus argument, and standardized according to the argument nullH. Intended for use in \code{\link{KhmaladzeTest}}.} \usage{ rqProcess(formula, data, taus, nullH = "location", ...) } \arguments{ \item{formula}{model formula } \item{data}{data frame to be used to interpret formula } \item{taus}{ quantiles at which the process is to be evaluated, if any of the taus lie outside (0,1) then the full process is computed for all distinct solutions.} \item{nullH}{Null hypothesis to be used for standardization} \item{...}{optional arguments passed to \code{\link{summary.rq}}} } \details{ The process computes standardized estimates based on the hypothesis specified in the \code{nullH} argument. The Vhat component is rescaled by the Cholesky decomposition of the tau specific covariance matrix, the vhat component is rescaled by the marginal standard errors. The nature of the covariance matrix used for the standardization is controlled arguments passed via the \code{...} argument to \code{\link{summary.rq}}. If the full process is estimated then these covariance options aren't available and only a simple iid-error form of the covariance matrix is used. } \value{ \item{taus}{The points of evaluation of the process} \item{qtaus}{Values of xbar'betahat(taus)} \item{Vhat}{Joint parametric QR process} \item{vhat}{Marginal parametric QR processes} } \author{R. Koenker} \seealso{\code{\link{KhmaladzeTest}}} \keyword{regression} quantreg/man/rq.Rd0000644000176200001440000002644214230205024013564 0ustar liggesusers\name{rq} \alias{rq} \title{ Quantile Regression } \description{ Returns an object of class \code{"rq"} \code{"rqs"} or \code{"rq.process"} that represents a quantile regression fit. } \usage{ rq(formula, tau=.5, data, subset, weights, na.action, method="br", model = TRUE, contrasts, \dots) } \arguments{ \item{formula}{ a formula object, with the response on the left of a \code{~} operator, and the terms, separated by \code{+} operators, on the right. } \item{tau}{ the quantile(s) to be estimated, this is generally a number strictly between 0 and 1, but if specified strictly outside this range, it is presumed that the solutions for all values of \code{tau} in (0,1) are desired. In the former case an object of class \code{"rq"} is returned, in the latter, an object of class \code{"rq.process"} is returned. As of version 3.50, tau can also be a vector of values between 0 and 1; in this case an object of class \code{"rqs"} is returned containing among other things a matrix of coefficient estimates at the specified quantiles. } \item{data}{ a data.frame in which to interpret the variables named in the formula, or in the subset and the weights argument. If this is missing, then the variables in the formula should be on the search list. This may also be a single number to handle some special cases -- see below for details. } \item{subset}{ an optional vector specifying a subset of observations to be used in the fitting process.} \item{weights}{ vector of observation weights; if supplied, the algorithm fits to minimize the sum of the weights multiplied into the absolute residuals. The length of weights must be the same as the number of observations. The weights must be nonnegative and it is strongly recommended that they be strictly positive, since zero weights are ambiguous. } \item{na.action}{ a function to filter missing data. This is applied to the model.frame after any subset argument has been used. The default (with \code{na.fail}) is to create an error if any missing values are found. A possible alternative is \code{na.omit}, which deletes observations that contain one or more missing values. } \item{model}{if TRUE then the model frame is returned. This is essential if one wants to call summary subsequently. } \item{method}{ the algorithmic method used to compute the fit. There are several options: \enumerate{ \item \code{"br"} The default method is the modified version of the Barrodale and Roberts algorithm for \eqn{l_1}{l1}-regression, used by \code{l1fit} in S, and is described in detail in Koenker and d'Orey(1987, 1994), default = \code{"br"}. This is quite efficient for problems up to several thousand observations, and may be used to compute the full quantile regression process. It also implements a scheme for computing confidence intervals for the estimated parameters, based on inversion of a rank test described in Koenker(1994). \item \code{"fn"} For larger problems it is advantageous to use the Frisch--Newton interior point method \code{"fn"}. This is described in detail in Portnoy and Koenker(1997). \item \code{"pfn"} For even larger problems one can use the Frisch--Newton approach after preprocessing \code{"pfn"}. Also described in detail in Portnoy and Koenker(1997), this method is primarily well-suited for large n, small p problems, that is when the parametric dimension of the model is modest. \item \code{"sfn"} For large problems with large parametric dimension it is often advantageous to use method \code{"sfn"} which also uses the Frisch-Newton algorithm, but exploits sparse algebra to compute iterates. This is especially helpful when the model includes factor variables that, when expanded, generate design matrices that are very sparse. At present options for inference, i.e. summary methods are somewhat limited when using the \code{"sfn"} method. Only the option \code{se = "nid"} is currently available, but I hope to implement some bootstrap options in the near future. \item \code{"fnc"} Another option enables the user to specify linear inequality constraints on the fitted coefficients; in this case one needs to specify the matrix \code{R} and the vector \code{r} representing the constraints in the form \eqn{Rb \geq r}. See the examples below. \item \code{"conquer"} For very large problems especially those with large parametric dimension, this option provides a link to the \pkg{conquer} of He, Pan, Tan, and Zhou (2020). Calls to \code{summary} when the fitted object is computed with this option invoke the multiplier bootstrap percentile method of the \pkg{conquer} package and can be considerably quicker than other options when the problem size is large. Further options for this fitting method are described in the \pkg{conquer} package. Note that this option employs a smoothing form of the usual QR objective function so solutions may be expected to differ somewhat from those produced with the other options. \item \code{"pfnb"} This option is intended for applications with large sample sizes and/or moderately fine tau grids. It uses a form of preprocessing to accelerate the solution process. The loop over taus occurs inside the Fortran call and there should be more efficient than other methods in large problems. \item \code{"qfnb"} This option is like the preceeding one except that it doesn't use the preprocessing option. \item \code{"ppro"} This option is an R prototype of the \code{pfnb} and is offered for historical/interpretative purposes, but probably should be considered deprecated. \item \code{"lasso"} There are two penalized methods: \code{"lasso"} and \code{"scad"} that implement the lasso penalty and Fan and Li smoothly clipped absolute deviation penalty, respectively. These methods should probably be regarded as experimental. Note: weights are ignored when the method is penalized. } } \item{contrasts}{ a list giving contrasts for some or all of the factors default = \code{NULL} appearing in the model formula. The elements of the list should have the same name as the variable and should be either a contrast matrix (specifically, any full-rank matrix with as many rows as there are levels in the factor), or else a function to compute such a matrix given the number of levels. } \item{...}{ additional arguments for the fitting routines (see \code{\link{rq.fit.br}} and \code{\link{rq.fit.fnb}}, etc. and the functions they call). } } \value{ See \code{\link{rq.object}} and \code{\link{rq.process.object}} for details. Inferential matters are handled with \code{\link{summary}}. There are extractor methods \code{logLik} and \code{AIC} that are potentially relevant for model selection. } \details{For further details see the vignette available from \R with \code{ vignette("rq",package="quantreg")} and/or the Koenker (2005). For estimation of nonlinear (in parameters) quantile regression models there is the function \code{nlrq} and for nonparametric additive quantile regression there is the function \code{rqss}. Fitting of quantile regression models with censored data is handled by the \code{crq} function.} \examples{ data(stackloss) rq(stack.loss ~ stack.x,.5) #median (l1) regression fit for the stackloss data. rq(stack.loss ~ stack.x,.25) #the 1st quartile, #note that 8 of the 21 points lie exactly on this plane in 4-space! rq(stack.loss ~ stack.x, tau=-1) #this returns the full rq process rq(rnorm(50) ~ 1, ci=FALSE) #ordinary sample median --no rank inversion ci rq(rnorm(50) ~ 1, weights=runif(50),ci=FALSE) #weighted sample median #plot of engel data and some rq lines see KB(1982) for references to data data(engel) attach(engel) plot(income,foodexp,xlab="Household Income",ylab="Food Expenditure",type = "n", cex=.5) points(income,foodexp,cex=.5,col="blue") taus <- c(.05,.1,.25,.75,.9,.95) xx <- seq(min(income),max(income),100) f <- coef(rq((foodexp)~(income),tau=taus)) yy <- cbind(1,xx)\%*\%f for(i in 1:length(taus)){ lines(xx,yy[,i],col = "gray") } abline(lm(foodexp ~ income),col="red",lty = 2) abline(rq(foodexp ~ income), col="blue") legend(3000,500,c("mean (LSE) fit", "median (LAE) fit"), col = c("red","blue"),lty = c(2,1)) #Example of plotting of coefficients and their confidence bands plot(summary(rq(foodexp~income,tau = 1:49/50,data=engel))) #Example to illustrate inequality constrained fitting n <- 100 p <- 5 X <- matrix(rnorm(n*p),n,p) y <- .95*apply(X,1,sum)+rnorm(n) #constrain slope coefficients to lie between zero and one R <- cbind(0,rbind(diag(p),-diag(p))) r <- c(rep(0,p),-rep(1,p)) rq(y~X,R=R,r=r,method="fnc") } \section{Method}{ The function computes an estimate on the tau-th conditional quantile function of the response, given the covariates, as specified by the formula argument. Like \code{lm()}, the function presumes a linear specification for the quantile regression model, i.e. that the formula defines a model that is linear in parameters. For non-linear (in parameters) quantile regression see the package \code{nlrq()}. The function minimizes a weighted sum of absolute residuals that can be formulated as a linear programming problem. As noted above, there are several different algorithms that can be chosen depending on problem size and other characteristics. For moderate sized problems (\eqn{n \ll 5,000, p \ll 20}{n << 5,000, p << 20}) it is recommended that the default \code{"br"} method be used. There are several choices of methods for computing confidence intervals and associated test statistics. See the documentation for \code{\link{summary.rq}} for further details and options. } \keyword{regression} \references{ [1] Koenker, R. W. and Bassett, G. W. (1978). Regression quantiles, \emph{Econometrica}, \bold{46}, 33--50. [2] Koenker, R.W. and d'Orey (1987, 1994). Computing regression quantiles. \emph{Applied Statistics}, \bold{36}, 383--393, and \bold{43}, 410--414. [3] Gutenbrunner, C. Jureckova, J. (1991). Regression quantile and regression rank score process in the linear model and derived statistics, \emph{Annals of Statistics}, \bold{20}, 305--330. [4] Xuming He and Xiaoou Pan and Kean Ming Tan and Wen-Xin Zhou, (2020) conquer: Convolution-Type Smoothed Quantile Regression, \url{https://CRAN.R-project.org/package=conquer} [4] Koenker, R. W. (1994). Confidence Intervals for regression quantiles, in P. Mandl and M. Huskova (eds.), \emph{Asymptotic Statistics}, 349--359, Springer-Verlag, New York. [5] Koenker, R. and S. Portnoy (1997) The Gaussian Hare and the Laplacean Tortoise: Computability of Squared-error vs Absolute Error Estimators, (with discussion). \emph{Statistical Science,} \bold{12}, 279-300. [6] Koenker, R. W. (2005). \emph{Quantile Regression}, Cambridge U. Press. There is also recent information available at the URL: \url{http://www.econ.uiuc.edu/~roger/}. } \seealso{ \code{\link{FAQ}}, \code{\link{summary.rq}}, \code{\link{nlrq}}, \code{\link{rq.fit}}, \code{\link{rq.wfit}}, \code{\link{rqss}}, \code{\link{rq.object}}, \code{\link{rq.process.object}} } quantreg/man/Munge.Rd0000644000176200001440000000117713745760073014237 0ustar liggesusers\name{Munge} \alias{Munge} \title{ Munge rqss formula } \description{ function to recursively substitute arguments into rqss formula } \usage{ Munge(formula, ...) } \arguments{ \item{formula}{ A rqss formula } \item{\dots}{ Arguments to be substituted into formula } } \details{ Intended (originally) for use with \code{demo(MCV)}. Based on an R-help suggestion of Gabor Grothendieck. } \value{ A new formula after substitution } \seealso{ \code{demo(MCV)} } \examples{ lams <- c(1.3, 3.3) f <- y ~ qss(x, lambda = lams[1]) + qss(z, lambda = lams[2]) + s ff <- Munge(f, lams = lams) } \keyword{~manip} quantreg/man/KhmaladzeTest.Rd0000644000176200001440000000424713726077750015727 0ustar liggesusers\name{KhmaladzeTest} \alias{KhmaladzeTest} \title{ Tests of Location and Location Scale Shift Hypotheses for Linear Models} \description{Tests of the hypothesis that a linear model specification is of the location shift or location-scale shift form. The tests are based on the Doob-Meyer Martingale transformation approach proposed by Khmaladze(1981) for general goodness of fit problems as adapted to quantile regression by Koenker and Xiao (2002).} \usage{ KhmaladzeTest(formula, data = NULL, taus = 1:99/100, nullH = "location" , trim = c(0.05, 0.95), h = 1, ...) } \arguments{ \item{formula}{a formula specifying the model to fit by \code{\link{rqProcess}}} \item{data}{a data frame within which to interpret the formula} \item{taus}{An equally spaced grid of points on which to evaluate the quantile regression process, if any taus fall outside (0,1) then the full process is computed.} \item{nullH}{a character vector indicating whether the "location" shift hypothesis (default) or the "location-scale" shift hypothesis should be tested. } \item{trim}{ a vector indicating the lower and upper bound of the quantiles to included in the computation of the test statistics (only, not estimates). } \item{h}{an initial bandwidth for the call to \code{\link{akj}}.} \item{...}{other arguments to be passed to \code{\link{summary.rq}.}} } \value{ an object of class KhmaladzeTest is returned containing: \item{nullH}{ The form of the null hypothesis.} \item{Tn}{ Joint test statistic of the hypothesis that all the slope parameters of the model satisfy the hypothesis. } \item{THn}{ Vector of test statistics testing whether individual slope parameters satisfy the null hypothesis. } } \examples{ data(barro) T = KhmaladzeTest( y.net ~ lgdp2 + fse2 + gedy2 + Iy2 + gcony2, data = barro, taus = seq(.05,.95,by = .01)) plot(T) } \keyword{htest} \references{ Khmaladze, E. (1981) ``Martingale Approach in the Theory of Goodness-of-fit Tests,'' \emph{Theory of Prob. and its Apps}, 26, 240--257. Koenker, Roger and Zhijie Xiao (2002), ``Inference on the Quantile Regression Process'', \emph{Econometrica}, 81, 1583--1612. \url{http://www.econ.uiuc.edu/~roger/research/inference/inference.html} } quantreg/man/summary.rqss.Rd0000644000176200001440000000664513734105743015650 0ustar liggesusers\name{summary.rqss} \alias{summary.rqss} \alias{print.summary.rqss} \title{Summary of rqss fit} \description{ Summary Method for a fitted rqss model. } \usage{\method{summary}{rqss}(object, cov = FALSE, ztol = 1e-5, ...) } \arguments{ \item{object}{an object returned from \code{rqss} fitting, describing an additive model estimating a conditional quantile function. See \code{\link{qss}} for details on how to specify these terms.} \item{cov}{if TRUE return covariance matrix for the parametric components as \code{Vcov} and a list of covariance matrices for the nonparametric components as \code{Vqss}} \item{ztol}{Zero tolerance parameter used to determine the number of zero residuals indicating the estimated parametric dimension of the model, the so-called effective degrees of freedom.} \item{...}{additional arguments} } \details{ This function is intended to explore inferential methods for rqss fitting. The function is modeled after \code{summary.gam} in Simon Wood's (2006) \pkg{mgcv} package. (Of course, Simon should not be blamed for any deficiencies in the current implementation. The basic idea is to condition on the lambda selection and construct quasi-Bayesian credibility intervals based on normal approximation of the "posterior," as computed using the Powell kernel estimate of the usual quantile regression sandwich. See \code{\link{summary.rq}} for further details and references. The function produces a conventional coefficient table with standard errors t-statistics and p-values for the coefficients on the parametric part of the model, and another table for additive nonparametric effects. The latter reports F statistics intended to evaluate the significance of these components individually. In addition the fidelity (value of the QR objective function evaluated at the fitted model), the effective degrees of freedom, and the sample size are reported. } \value{ \item{coef}{Table of estimated coefficients and their standard errors, t-statistics, and p-values for the parametric components of the model} \item{qsstab}{Table of approximate F statistics, effective degrees of freedom and values of the penalty terms for each of the additive nonparametric components of the model, and the lambda values assigned to each.} \item{fidelity}{Value of the quantile regression objective function.} \item{tau}{Quantile of the estimated model} \item{formula}{formula of the estimated model} \item{edf}{Effective degrees of freedom of the fitted model, defined as the number of zero residuals of the fitted model, see Koenker Mizera (2003) for details.} \item{n}{The sample size used to fit the model.} \item{Vcov}{Estimated covariance matrix of the fitted parametric component} \item{Vqss}{List of estimated covariance matrices of the fitted nonparametric component} } \references{ [1] Koenker, R., P. Ng and S. Portnoy, (1994) Quantile Smoothing Splines; \emph{Biometrika} \bold{81}, 673--680. [2] Koenker, R. and I. Mizera, (2003) Penalized Triograms: Total Variation Regularization for Bivariate Smoothing; \emph{JRSS(B)} \bold{66}, 145--163. [3] Wood, S. (2006) \emph{Generalized Additive Models}, Chapman-Hall. } \author{ Roger Koenker } \seealso{ \code{\link{plot.rqss}} } \examples{ n <- 200 x <- sort(rchisq(n,4)) z <- x + rnorm(n) y <- log(x)+ .1*(log(x))^2 + log(x)*rnorm(n)/4 + z f <- rqss(y ~ qss(x) + z) summary(f) } \keyword{regression} \keyword{smooth} \keyword{robust} quantreg/man/lprq.Rd0000644000176200001440000000323011555564235014131 0ustar liggesusers\name{lprq} \alias{lprq} \title{ locally polynomial quantile regression } \description{ This is a toy function to illustrate how to do locally polynomial quantile regression univariate smoothing. } \usage{ lprq(x, y, h, tau = .5, m = 50) } \arguments{ \item{x}{ The conditioning covariate} \item{y}{ The response variable } \item{h}{ The bandwidth parameter } \item{tau}{ The quantile to be estimated } \item{m}{ The number of points at which the function is to be estimated } } \details{ The function obviously only does locally linear fitting but can be easily adapted to locally polynomial fitting of higher order. The author doesn't really approve of this sort of smoothing, being more of a spline person, so the code is left is its (almost) most trivial form. } \value{ The function compute a locally weighted linear quantile regression fit at each of the m design points, and returns: \item{xx}{The design points at which the evaluation occurs} \item{fv}{The estimated function values at these design points} \item{dev}{The estimated first derivative values at the design points} } \references{ Koenker, R. (2004) Quantile Regression } \author{R. Koenker } \note{One can also consider using B-spline expansions see \code{bs}.} \seealso{ \code{rqss} for a general approach to oonparametric QR fitting. } \examples{ require(MASS) data(mcycle) attach(mcycle) plot(times,accel,xlab = "milliseconds", ylab = "acceleration (in g)") hs <- c(1,2,3,4) for(i in hs){ h = hs[i] fit <- lprq(times,accel,h=h,tau=.5) lines(fit$xx,fit$fv,lty=i) } legend(50,-70,c("h=1","h=2","h=3","h=4"),lty=1:length(hs)) } \keyword{smooth} \keyword{robust} quantreg/man/q489.Rd0000644000176200001440000000322313776620427013665 0ustar liggesusers\name{q489} \alias{q489} \title{Even Quicker Sample Quantiles } \description{ The function \code{q489} computes a single sample quantile using a fortran implementation of the Floyd and Rivest (1975) algorithm. In contrast to the more elaborate function \code{kuantile} that uses the Kiweil (2005) implementation it does not attempt to replicate the nine varieties of quantiles as documented in the base function. \code{quantile} } \usage{ q489(x, tau = .5) } \arguments{ \item{x}{numeric vector} \item{tau}{the quantile of intereste.} } \details{ This is a direct translation of the Algol 68 implementation of Floyd and Rivest (1975), implemented in Ratfor. For the median, average case behavior requires \eqn{1.5 n + O((n log n)^{1/2})} comparisons. In preliminary experiments it seems to be somewhat faster in large samples than the implementation \code{kuantile} of Kiwiel (2005). See Knuth (1998) for further details. No provision is made for non-uniqueness of the quantile. so, when \eqn{\tau n} is an integer there may be some discrepancy.} \value{ A scalar quantile of the same length as the vector p. } \references{ R.W. Floyd and R.L. Rivest: "Algorithm 489: The Algorithm SELECT---for Finding the $i$th Smallest of $n$ Elements", Comm. ACM 18, 3 (1975) 173, K.C. Kiwiel: On Floyd and Rivest's SELECT Algorithm, Theoretical Computer Sci. 347 (2005) 214-238. D. Knuth, The Art of Computer Programming, Volume 3, Sorting and Searching, 2nd Ed., (1998), Addison-Wesley. } \author{ R.W.Floyd and R.L.Rivest, R implementation: Roger Koenker } \seealso{\code{\link{quantile}}} \examples{ medx <- q489(rnorm(1001)) } \keyword{univar} quantreg/man/rq.process.object.Rd0000644000176200001440000000631411555564235016525 0ustar liggesusers\name{rq.process.object} \alias{rq.process.object} \title{ Linear Quantile Regression Process Object } \description{ These are objects of class \code{rq.process.} They represent the fit of a linear conditional quantile function model. } \section{Generation}{ This class of objects is returned from the \code{rq} function to represent a fitted linear quantile regression model. } \section{Methods}{ The \code{"rq.process"} class of objects has methods for the following generic functions: \code{effects}, \code{formula} , \code{labels} , \code{model.frame} , \code{model.matrix} , \code{plot} , \code{predict} , \code{print} , \code{print.summary} , \code{summary} } \section{Structure}{ The following components must be included in a legitimate \code{rq.process} object. \describe{ \item{\code{sol}}{ The primal solution array. This is a (p+3) by J matrix whose first row contains the 'breakpoints' \eqn{tau_1, tau_2, \dots, tau_J}, of the quantile function, i.e. the values in [0,1] at which the solution changes, row two contains the corresponding quantiles evaluated at the mean design point, i.e. the inner product of xbar and \eqn{b(tau_i)}, the third row contains the value of the objective function evaluated at the corresponding \eqn{tau_j}, and the last p rows of the matrix give \eqn{b(tau_i)}. The solution \eqn{b(tau_i)} prevails from \eqn{tau_i} to \eqn{tau_i+1}. Portnoy (1991) shows that \eqn{J=O_p(n \log n)}{J=O_p(n log n)}. } \item{\code{dsol}}{ The dual solution array. This is a n by J matrix containing the dual solution corresponding to sol, the ij-th entry is 1 if \eqn{y_i > x_i b(tau_j)}, is 0 if \eqn{y_i < x_i b(tau_j)}, and is between 0 and 1 otherwise, i.e. if the residual is zero. See Gutenbrunner and Jureckova(1991) for a detailed discussion of the statistical interpretation of dsol. The use of dsol in inference is described in Gutenbrunner, Jureckova, Koenker, and Portnoy (1994). } } } \details{ These arrays are computed by parametric linear programming methods using using the exterior point (simplex-type) methods of the Koenker--d'Orey algorithm based on Barrodale and Roberts median regression algorithm. } \references{ [1] Koenker, R. W. and Bassett, G. W. (1978). Regression quantiles, \emph{Econometrica}, \bold{46}, 33--50. [2] Koenker, R. W. and d'Orey (1987, 1994). Computing Regression Quantiles. \emph{Applied Statistics}, \bold{36}, 383--393, and \bold{43}, 410--414. [3] Gutenbrunner, C. Jureckova, J. (1991). Regression quantile and regression rank score process in the linear model and derived statistics, \emph{Annals of Statistics}, \bold{20}, 305--330. [4] Gutenbrunner, C., Jureckova, J., Koenker, R. and Portnoy, S. (1994) Tests of linear hypotheses based on regression rank scores. \emph{Journal of Nonparametric Statistics}, (2), 307--331. [5] Portnoy, S. (1991). Asymptotic behavior of the number of regression quantile breakpoints, \emph{SIAM Journal of Scientific and Statistical Computing}, \bold{12}, 867--883. } \seealso{ \code{\link{rq}}. } \keyword{regression} quantreg/man/latex.Rd0000644000176200001440000000055711555564235014301 0ustar liggesusers\name{latex} \alias{latex} \title{ Make a latex version of an R object } \description{ Generic function for converting an \R object into a latex file. } \usage{ latex(x, ...) } \arguments{ \item{x}{ \code{x} is an \R object } \item{\dots}{ \code{\dots} optional arguments } } \seealso{ \code{\link{latex.table}}, \code{\link{latex.summary.rqs}} } \keyword{IO} quantreg/man/qrisk.Rd0000644000176200001440000000653113726077774014324 0ustar liggesusers\name{qrisk} \alias{qrisk} \title{ Function to compute Choquet portfolio weights} \description{ This function solves a weighted quantile regression problem to find the optimal portfolio weights minimizing a Choquet risk criterion described in Bassett, Koenker, and Kordas (2002). } \usage{ qrisk(x, alpha = c(0.1, 0.3), w = c(0.7, 0.3), mu = 0.07, R = NULL, r = NULL, lambda = 10000) } \arguments{ \item{x}{n by q matrix of historical or simulated asset returns } \item{alpha}{vector of alphas receiving positive weights in the Choquet criterion} \item{w}{weights associated with alpha in the Choquet criterion } \item{mu}{targeted rate of return for the portfolio} \item{R}{matrix of constraints on the parameters of the quantile regression, see below} \item{r}{rhs vector of the constraints described by R} \item{lambda}{Lagrange multiplier associated with the constraints} } \details{ The function calls \code{rq.fit.hogg} which in turn calls the constrained Frisch Newton algorithm. The constraints Rb=r are intended to apply only to the slope parameters, not the intercept parameters. The user is completely responsible to specify constraints that are consistent, ie that have at least one feasible point. See examples for imposing non-negative portfolio weights. } \value{ \item{pihat}{the optimal portfolio weights} \item{muhat }{the in-sample mean return of the optimal portfolio} \item{qrisk}{the in-sample Choquet risk of the optimal portfolio} } \references{ \url{http://www.econ.uiuc.edu/~roger/research/risk/risk.html} Bassett, G., R. Koenker, G Kordas, (2004) Pessimistic Portfolio Allocation and Choquet Expected Utility, J. of Financial Econometrics, 2, 477-492. } \author{ R. Koenker } \examples{ #Fig 1: ... of Choquet paper mu1 <- .05; sig1 <- .02; mu2 <- .09; sig2 <- .07 x <- -10:40/100 u <- seq(min(c(x)),max(c(x)),length=100) f1 <- dnorm(u,mu1,sig1) F1 <- pnorm(u,mu1,sig1) f2 <- dchisq(3-sqrt(6)*(u-mu1)/sig1,3)*(sqrt(6)/sig1) F2 <- pchisq(3-sqrt(6)*(u-mu1)/sig1,3) f3 <- dnorm(u,mu2,sig2) F3 <- pnorm(u,mu2,sig2) f4 <- dchisq(3+sqrt(6)*(u-mu2)/sig2,3)*(sqrt(6)/sig2) F4 <- pchisq(3+sqrt(6)*(u-mu2)/sig2,3) plot(rep(u,4),c(f1,f2,f3,f4),type="n",xlab="return",ylab="density") lines(u,f1,lty=1,col="blue") lines(u,f2,lty=2,col="red") lines(u,f3,lty=3,col="green") lines(u,f4,lty=4,col="brown") legend(.25,25,paste("Asset ",1:4),lty=1:4,col=c("blue","red","green","brown")) #Now generate random sample of returns from these four densities. n <- 1000 if(TRUE){ #generate a new returns sample if TRUE x1 <- rnorm(n) x1 <- (x1-mean(x1))/sqrt(var(x1)) x1 <- x1*sig1 + mu1 x2 <- -rchisq(n,3) x2 <- (x2-mean(x2))/sqrt(var(x2)) x2 <- x2*sig1 +mu1 x3 <- rnorm(n) x3 <- (x3-mean(x3))/sqrt(var(x3)) x3 <- x3*sig2 +mu2 x4 <- rchisq(n,3) x4 <- (x4-mean(x4))/sqrt(var(x4)) x4 <- x4*sig2 +mu2 } library(quantreg) x <- cbind(x1,x2,x3,x4) qfit <- qrisk(x) sfit <- srisk(x) # Try new distortion function qfit1 <- qrisk(x,alpha = c(.05,.1), w = c(.9,.1),mu = 0.09) # Constrain portfolio weights to be non-negative qfit2 <- qrisk(x,alpha = c(.05,.1), w = c(.9,.1),mu = 0.09, R = rbind(rep(-1,3), diag(3)), r = c(-1, rep(0,3))) } \keyword{regression} \keyword{robust} \seealso{\code{\link{rq.fit.hogg}}, \code{\link{srisk}}} quantreg/man/combos.Rd0000644000176200001440000000173211555564235014442 0ustar liggesusers\name{combos} \alias{combos} \title{Ordered Combinations} \description{ All m combinations of the first n integers taken p at a time are computed and return as an p by m matrix. The columns of the matrix are ordered so that adjacent columns differ by only one element. This is just a reordered version of \code{combn} in base R, but the ordering is useful for some applications. } \usage{ combos(n,p) } \arguments{ \item{n}{The n in n choose p} \item{p}{The p in n choose p} } \value{ a \code{matrix} of dimension p by \code{choose(n,p)} } \note{ Implementation based on a Pascal algorithm of Limin Xiang and Kazuo Ushijima (2001) translated to ratfor for R. If you have \pkg{rgl} installed you might try \code{demo("combos")} for a visual impression of how this works. } \references{ Limin Xiang and Kazuo Ushijima (2001) "On O(1) Time Algorithms for Combinatorial Generation," \emph{Computer Journal}, 44(4), 292-302. } \examples{ H <- combos(20,3) } \keyword{utilities} quantreg/man/gasprice.Rd0000644000176200001440000000035712505061172014743 0ustar liggesusers\name{gasprice} \alias{gasprice} \docType{data} \title{Time Series of US Gasoline Prices } \description{ Time Series of Weekly US Gasoline Prices: 1990:8 -- 2003:26 } \usage{data("gasprice")} \examples{ data(gasprice) } \keyword{datasets} quantreg/man/rq.fit.conquer.Rd0000644000176200001440000000420013766147412016027 0ustar liggesusers\name{rq.fit.conquer} \alias{rq.fit.conquer} \title{Optional Fitting Method for Quantile Regression} \description{ This fitting method provides a link to the gradient descent for convolution smoothed quantile regression problem implemented in the \pkg{conquer} package of He et al (2020).} \usage{ rq.fit.conquer (x, y, tau=0.5, kernel = c("Gaussian", "uniform", "parabolic", "triangular"), h = 0, tol = 1e-04, iteMax = 5000, ci = FALSE, alpha = 0.05, B = 200) } \arguments{ \item{x}{design matrix usually supplied via rq(), expected to have a intercept as the first column } \item{y}{ response vector usually supplied via rq() } \item{tau}{ quantile of interest } \item{kernel}{A character string specifying the choice of kernel function. Default is "Gaussian". Other choices are "uniform", "parabolic" or "triangular".} \item{h}{The bandwidth parameter for kernel smoothing of the QR objective function. Default is max{((log(n) + p) / n)^0.4, 0.05}. The default is used if the input value is less than 0.05.} \item{tol}{Tolerance level of the gradient descent algorithm. The gradient descent algorithm terminates when the maximal entry of the gradient is less than "tol". Default is 1e-05.} \item{iteMax}{Maximum number of iterations. Default is 5000.} \item{ci}{A logical flag. Default is FALSE. If "ci = TRUE", then three types of confidence intervals (percentile, pivotal and normal) will be constructed via multiplier bootstrap. This option is subsumed in normal use by the \code{summary.rq} functionality.} \item{alpha}{Nominal level for confidence intervals, may be passed via the call to \code{summary}} \item{B}{Number of bootstrap replications. May be passed via summary.} } \details{ See documentation in the \pkg{conquer} package. } \value{ Returns an object of class "rq". } \references{ Xuming He and Xiaoou Pan and Kean Ming Tan and Wen-Xin Zhou, (2020) conquer: Convolution-Type Smoothed Quantile Regression, \url{https://CRAN.R-project.org/package=conquer}} \seealso{\code{\link{rq}}} \keyword{regression} quantreg/man/boot.rq.pxy.Rd0000644000176200001440000000215313734321500015344 0ustar liggesusers\name{boot.rq.pxy} \alias{boot.rq.pxy} \title{ Preprocessing bootstrap method } \description{ Bootstrap method exploiting preprocessing strategy to reduce computation time for large problem. } \usage{ boot.rq.pxy(x, y, s, tau = 0.5, coef, method = "fn", Mm.factor = 3) } \arguments{ \item{x}{ Design matrix } \item{y}{ response vector } \item{s}{ matrix of multinomial draws for xy bootstrap } \item{tau}{ quantile of interest } \item{coef}{ point estimate of fitted object } \item{method}{ fitting method for bootstrap } \item{Mm.factor}{ constant to determine initial sample size } } \details{ See references for further details. } \value{ Returns matrix of bootstrap estimates. } \references{ Chernozhukov, V. I. Fernandez-Val and B. Melly, Fast Algorithms for the Quantile Regression Process, 2019, arXiv, 1909.05782, Portnoy, S. and R. Koenker, The Gaussian Hare and the Laplacian Tortoise, Statistical Science, (1997) 279-300 } \author{ Blaise Melly and Roger Koenker } \seealso{ \code{\link{rq.fit.ppro}} } \keyword{bootstrap} quantreg/man/rq.fit.lasso.Rd0000644000176200001440000000474114052721633015476 0ustar liggesusers\name{rq.fit.lasso} \alias{rq.fit.lasso} \title{ Lasso Penalized Quantile Regression } \description{ The fitting method implements the lasso penalty for fitting quantile regression models. When the argument \code{lambda} is a scalar the penalty function is the l1 norm of the last (p-1) coefficients, under the presumption that the first coefficient is an intercept parameter that should not be subject to the penalty. When \code{lambda} is a vector it should have length equal the column dimension of the matrix \code{x} and then defines a coordinatewise specific vector of lasso penalty parameters. In this case \code{lambda} entries of zero indicate covariates that are not penalized. If \code{lambda} is not specified, a default value is selected according to the proposal of Belloni and Chernozhukov (2011). See \code{LassoLambdaHat} for further details. There should be a sparse version of this, but isn't (yet). There should also be a preprocessing version, but isn't (yet). } \usage{ rq.fit.lasso(x, y, tau = 0.5, lambda = NULL, beta = .99995, eps = 1e-06) } \arguments{ \item{x}{ the design matrix } \item{y}{ the response variable } \item{tau}{ the quantile desired, defaults to 0.5. } \item{lambda}{ the value of the penalty parameter(s) that determine how much shrinkage is done. This should be either a scalar, or a vector of length equal to the column dimension of the \code{x} matrix. If unspecified, a default value is chosen according to the proposal of Belloni and Chernozhukov (2011). } \item{beta}{ step length parameter for Frisch-Newton method. } \item{eps}{ tolerance parameter for convergence. } } \value{ Returns a list with a coefficient, residual, tau and lambda components. When called from \code{"rq"} (as intended) the returned object has class "lassorqs". } \references{ Koenker, R. (2005) \emph{Quantile Regression}, CUP. Belloni, A. and V. Chernozhukov. (2011) l1-penalized quantile regression in high-dimensional sparse models. \emph{Annals of Statistics}, 39 82 - 130. } \author{R. Koenker} \seealso{ \code{\link{rq}}} \examples{ n <- 60 p <- 7 rho <- .5 beta <- c(3,1.5,0,2,0,0,0) R <- matrix(0,p,p) for(i in 1:p){ for(j in 1:p){ R[i,j] <- rho^abs(i-j) } } set.seed(1234) x <- matrix(rnorm(n*p),n,p) \%*\% t(chol(R)) y <- x \%*\% beta + rnorm(n) f <- rq(y ~ x, method="lasso",lambda = 30) g <- rq(y ~ x, method="lasso",lambda = c(rep(0,4),rep(30,4))) } \keyword{regression} quantreg/man/rq.fit.qfnb.Rd0000644000176200001440000000371713755706672015324 0ustar liggesusers\name{rq.fit.qfnb} \alias{rq.fit.qfnb} \title{ Quantile Regression Fitting via Interior Point Methods } \description{ This is a lower level routine called by \code{rq()} to compute quantile regression parameters using the Frisch-Newton algorithm. In contrast to method "fn" it computes solutions for all the specified taus inside a fortran loop. See \code{\link{rq.fit.pfnb}} for further details on a more efficient preprocessing method. } \usage{ rq.fit.qfnb(x, y, tau) } \arguments{ \item{x}{ The design matrix } \item{y}{ The response vector } \item{tau}{ The quantiles of interest, must lie in (0,1), be sorted and preferably equally spaced. } } \value{ returns a list with elements consisting of \enumerate{ \item{coefficients}{a matrix of dimension ncol(x) by length(taus) } \item{nit} {a 3-vector of iteration counts} \item{info} {a convergence flag} } } \details{ The details of the Frisch-Newton algorithm are explained in Koenker and Portnoy (1997). The basic idea can be traced back to the log-barrier methods proposed by Frisch in the 1950's for linear programming. But the current implementation is based on proposals by Mehrotra and others in the recent (explosive) literature on interior point methods for solving linear programming problems. This function replaces an earlier one \code{rq.fit.fn}, which required the initial dual values to be feasible. The current version allows the user to specify an infeasible starting point for the dual problem, that is one that may not satisfy the dual equality constraints. It still assumes that the starting value satisfies the upper and lower bounds. } \references{ Koenker, R. and S. Portnoy (1997). The Gaussian Hare and the Laplacian Tortoise: Computability of squared-error vs. absolute-error estimators, with discussion, \emph{Statistical Science}, \bold{12}, 279-300. } \seealso{ \code{\link{rq}}, \code{\link{rq.fit.br}}, \code{\link{rq.fit.pfn}} } \keyword{regression} quantreg/man/QTECox.Rd0000644000176200001440000000466411555564235014272 0ustar liggesusers\name{QTECox} \alias{QTECox} \title{Function to obtain QTE from a Cox model} \description{Computes quantile treatment effects comparable to those of crq model from a coxph object.} \usage{ QTECox(x, smooth = TRUE) } \arguments{ \item{x}{An object of class coxph produced by \code{coxph}.} \item{smooth}{Logical indicator if TRUE (default) then Cox survival function is smoothed.} } \details{ Estimates of the Cox QTE, \eqn{\frac{dQ(t|x)}{dx_{j}}}{(d/dx_j) Q( t | x ) } at \eqn{x=\bar{x}}{x=xbar}, can be expressed as a function of t as follows: \deqn{\frac{dQ(t|x)}{dx_{j}}=\frac{dt}{dx_{j}}\frac{dQ(t|x)}{dt}}{ (d/dx_j) Q( t | x ) = (d/dx_j)t * (d/dt) Q(t | x)} The Cox survival function, \eqn{S(y|x)=\exp \{-H_{0}(y)\exp (b^{\prime }x)\}}{S( y | x ) = exp{ - H_o(y) exp(b'x) }} \deqn{\frac{dS(y|x)}{dx_{j}}=S(y|x)log \{S(y|x)\}b_{j}}{(d/dx_j) S( y | x ) = S( y | x ) log(S( y | x )) b_j} where \eqn{\frac{dQ(t|x)}{dx_{j}}}{ (d/dt) Q(t | x) } can be estimated by \eqn{\frac{\Delta (t)}{\Delta (S)} (1-t)}{- (diff(t)/diff(S) (1-t)} where $S$ and $t$ denote the \code{surv} and \code{time} components of the \code{survfit} object. Note that since \eqn{t=1-S(y|x)}{t = 1 - S( y | x )}, the above is the value corresponding to the argument $(1-t)$; and furthermore \deqn{\frac{dt}{dx_{j}}=-\frac{dS(y|x)}{dx_{j}}=-(1-t) log (1-t)b_{j}}{ (d/dx_j)t = - (d/dx_j) S( y | x ) = - (1-t) log(1-t) b_j} Thus the QTE at the mean of x's is: \deqn{(1-S)= \frac{\Delta (t)}{\Delta (S)}S ~log (S)b_{j}}{(1 - S) = (diff(t)/diff(S) S log(S) b_j} Since \eqn{\Delta S}{diff(S)} is negative and $log (S)$ is also negative this has the same sign as \eqn{b_{j}} The crq model fits the usual AFT form Surv(log(Time),Status), then \deqn{\frac{d log (Q(t|x))}{dx_{j}}=\frac{dQ(t|x)}{dx_{j}}/ Q(t|x)}{(d/dx_j) log(Q( t | x )) = (d/dx_j) Q( t | x ) / Q( t | x )} This is the matrix form returned. } \value{ \item{taus }{points of evaluation of the QTE.} \item{QTE}{matrix of QTEs, the ith column contains the QTE for the ith covariate effect. Note that there is no intercept effect. see \code{plot.summary.crqs} for usage.} } \references{Koenker, R. and Geling, O. (2001). Reappraising Medfly longevity: a quantile regression survival analysis, J. Amer. Statist. Assoc., 96, 458-468} \author{Roger Koenker Stephen Portnoy & Tereza Neocleous} \seealso{\code{\link{crq}}} \keyword{survival} quantreg/man/MelTemp.Rd0000644000176200001440000000103714223047042014504 0ustar liggesusers\name{MelTemp} \alias{MelTemp} \docType{data} \title{Daily maximum temperatures in Melbourne, Australia} \description{ Daily maximum temperatures in Melbourne, Australia, from 1981-1990. Leap days have been omitted. } \usage{data(MelTemp)} \format{Time series of frequency 365} \source{ Hyndman, R.J., Bashtannyk, D.M. and Grunwald, G.K. (1996) "Estimating and visualizing conditional densities". _Journal of Computational and Graphical Statistics_, *5*, 315-336. } \examples{ data(MelTemp) demo(Mel) } \keyword{datasets} quantreg/man/critval.Rd0000644000176200001440000000310711555564235014622 0ustar liggesusers \name{critval} \alias{critval} \title{ Hotelling Critical Values } \description{ Critical values for uniform confidence bands for rqss fitting } \usage{ critval(kappa, alpha = 0.05, rdf = 0) } \arguments{ \item{kappa}{ length of the tube } \item{alpha}{ desired non-coverage of the band, intended coverage is 1 - alpha } \item{rdf}{ "residual" degrees of freedom of the fitted object. If \code{rdf=0} then the Gaussian version of the critical value is computed, otherwise the value is based on standard Student t theory. } } \value{ A scalar critical value that acts as a multiplier for the uniform confidence band construction. } \details{ The Hotelling tube approach to inference has a long and illustrious history. See Johansen and Johnstone (1989) for an overview. The implementation here is based on Sun and Loader (1994) and Loader's \pkg{locfit} package, although a simpler root finding approach is substituted for the iterative method used there. At this stage, only univariate bands may be constructed. } \references{ Hotelling, H. (1939): ``Tubes and Spheres in $n$-spaces, and a class of statistical problems,'' \emph{Am J. Math}, 61, 440--460. Johansen, S., I.M. Johnstone (1990): ``Hotelling's Theorem on the Volume of Tubes: Some Illustrations in Simultaneous Inference and Data Analysis,'' \emph{The Annals of Statistics}, 18, 652--684. Sun, J. and C.V. Loader: (1994) ``Simultaneous Confidence Bands for Linear Regression and smoothing,'' \emph{The Annals of Statistics}, 22, 1328--1345. } \seealso{ \code{\link{plot.rqss}} } \keyword{regression} quantreg/man/rq.fit.br.Rd0000644000176200001440000000644312712137556014767 0ustar liggesusers\name{rq.fit.br} \alias{rq.fit.br} \title{ Quantile Regression Fitting by Exterior Point Methods } \description{ This function controls the details of QR fitting by the simplex approach embodied in the algorithm of Koenker and d'Orey based on the median regression algorithm of Barrodale and Roberts. Typically, options controlling the construction of the confidence intervals would be passed via the \code{\dots{}} argument of \code{rq()}. } \usage{ rq.fit.br(x, y, tau=0.5, alpha=0.1, ci=FALSE, iid=TRUE, interp=TRUE, tcrit=TRUE) } \arguments{ \item{x}{ the design matrix } \item{y}{ the response variable } \item{tau}{ the quantile desired, if tau lies outside (0,1) the whole process is estimated. } \item{alpha}{ the nominal noncoverage probability for the confidence intervals, i.e. 1-alpha is the nominal coverage probability of the intervals. } \item{ci}{ logical flag if T then compute confidence intervals for the parameters using the rank inversion method of Koenker (1994). See \code{rq()} for more details. If F then return only the estimated coefficients. Note that for large problems the default option ci = TRUE can be rather slow. Note also that rank inversion only works for p>1, an error message is printed in the case that ci=T and p=1. } \item{iid}{ logical flag if T then the rank inversion is based on an assumption of iid error model, if F then it is based on an nid error assumption. See Koenker and Machado (1999) for further details on this distinction. } \item{interp}{ As with typical order statistic type confidence intervals the test statistic is discrete, so it is reasonable to consider intervals that interpolate between values of the parameter just below the specified cutoff and values just above the specified cutoff. If \code{interp = F} then the 2 ``exact'' values above and below on which the interpolation would be based are returned. } \item{tcrit}{ Logical flag if T - Student t critical values are used, if F then normal values are used. } } \value{ Returns an object of class \code{"rq"} for tau in (0,1), or else of class \code{"rq.process"}. Note that \code{rq.fit.br} when called for a single tau value will return the vector of optimal dual variables. See \code{\link{rq.object}} and \code{\link{rq.process.object}} for further details. } \details{ If tau lies in (0,1) then an object of class \code{"rq"} is returned with various related inference apparatus. If tau lies outside [0,1] then an object of class \code{rq.process} is returned. In this case parametric programming methods are used to find all of the solutions to the QR problem for tau in (0,1), the p-variate resulting process is then returned as the array sol containing the primal solution and dsol containing the dual solution. There are roughly \eqn{O(n \log n))}{O(n log n)} distinct solutions, so users should be aware that these arrays may be large and somewhat time consuming to compute for large problems. } \references{ Koenker, R. and J.A.F. Machado, (1999) Goodness of fit and related inference processes for quantile regression, \emph{J. of Am Stat. Assoc.}, 94, 1296-1310. } \seealso{ \code{\link{rq}}, \code{\link{rq.fit.fnb}} } \examples{ data(stackloss) rq.fit.br(stack.x, stack.loss, tau=.73 ,interp=FALSE) } \keyword{regression} quantreg/man/CobarOre.Rd0000644000176200001440000000130611555564235014651 0ustar liggesusers\name{CobarOre} \alias{CobarOre} \docType{data} \title{ Cobar Ore data } \description{ Cobar Ore data from Green and Silverman (1994). The data consists of measurements on the "true width" of an ore-bearing rock layer from a mine in Cobar, Australia. } \usage{data(CobarOre)} \format{ A data frame with 38 observations on the following 3 variables. \describe{ \item{x}{x-coordinate of location of mine site} \item{y}{y-coordinate of location of mine site} \item{z}{ore thickness} } } \source{ Green, P.J. and B.W. Silverman (1994) Nonparametric Regression Generalized Linear Models: A roughness penalty approach, Chapman Hall. } \examples{ data(CobarOre) plot(CobarOre) } \keyword{datasets} quantreg/man/rq.fit.sfnc.Rd0000644000176200001440000000615214014713315015300 0ustar liggesusers\name{rq.fit.sfnc} \alias{rq.fit.sfnc} \title{Sparse Constrained Regression Quantile Fitting} \description{ Fit constrained regression quantiles using a sparse implementation of the Frisch-Newton Interior-point algorithm. } \usage{ rq.fit.sfnc(x, y, R, r, tau = 0.5, rhs = (1-tau)*c(t(x) \%*\% rep(1,length(y))),control) } \arguments{ \item{x}{structure of the design matrix X stored in csr format} \item{y}{response vector} \item{R}{constraint matrix stored in csr format} \item{r}{right-hand-side of the constraint} \item{tau}{desired quantile} \item{rhs}{the right-hand-side of the dual problem; regular users shouldn't need to specify this.} \item{control}{control paramters for fitting see \code{sfn.control}} } \details{ This is a sparse implementation of the Frisch-Newton algorithm for constrained quantile regression described in Koenker and Portnoy (1996). The sparse matrix linear algebra is implemented through the functions available in the R package \pkg{SparseM}. } \value{ \item{coef}{Regression quantile coefficients} \item{ierr}{Error code for the internal Fortran routine \code{srqfn}: \describe{ \item{1:}{ insufficient work space in call to \code{extract}} \item{3:}{ insufficient storage in iwork when calling ordmmd} \item{4:}{ insufficient storage in iwork when calling sfinit} \item{5:}{ nnzl > nnzlmax when calling sfinit} \item{6:}{ nsub > nsubmax when calling sfinit} \item{7:}{ insufficient work space in iwork when calling symfct} \item{8:}{ inconsistancy in input when calling symfct} \item{9:}{ tmpsiz > tmpmax when calling symfct; increase tmpmax} \item{10:}{ nonpositive diagonal encountered when calling blkfct} \item{11:}{ insufficient work storage in tmpvec when calling blkfct} \item{12:}{ insufficient work storage in iwork when calling blkfct} \item{13:}{ nnzd > nnzdmax in e,je when calling amub} \item{14:}{ nnzd > nnzdmax in g,jg when calling amub} \item{15:}{ nnzd > nnzdmax in h,jh when calling aplb} \item{15:}{ tiny diagonals replaced with Inf when calling blkfct} } } \item{it}{Iteration count} \item{time}{Amount of time used in the computation} } \references{ Koenker, R and Ng, P. (2002). SparseM: A Sparse Matrix Package for \R; \url{https://CRAN.R-project.org/package=SparseM} Koenker, R. and P. Ng(2005). Inequality Constrained Quantile Regression, \emph{Sankya}, 418-440. } \author{Pin Ng} \seealso{ \code{\link{rq.fit.sfn}} for the unconstrained version, \pkg{SparseM} for the underlying sparse matrix \R package. } \examples{ ## An artificial example : n <- 200 p <- 50 set.seed(17) X <- rnorm(n*p) X[abs(X) < 2.0] <- 0 X <- cbind(1,matrix(X,n,p)) y <- 0.5 * apply(X,1,sum) + rnorm(n) ## true beta = (0.5, 0.5, ...) R <- rbind(diag(p+1), -diag(p+1)) r <- c(rep( 0, p+1), rep(-1, p+1)) sX <- as.matrix.csr(X) sR <- as.matrix.csr(R) try(rq.o <- rq.fit.sfnc(sX, y, sR, r)) #-> not enough tmp memory (tmpmax <- floor(1e5 + exp(-12.1)*(sX@ia[p+1]-1)^2.35)) ## now ok: rq.o <- rq.fit.sfnc(sX, y, sR, r, control = list(tmpmax = tmpmax)) } \keyword{regression} quantreg/man/ranks.Rd0000644000176200001440000000427111555564235014277 0ustar liggesusers\name{ranks} \alias{ranks} \title{ Quantile Regression Ranks } \description{ Function to compute ranks from the dual (regression rankscore) process. } \usage{ ranks(v, score="wilcoxon", tau=0.5, trim = NULL) } \arguments{ \item{v}{ object of class \code{"rq.process"} generated by \code{rq()} } \item{score}{ The score function desired. Currently implemented score functions are \code{"wilcoxon"}, \code{"normal"}, and \code{"sign"} which are asymptotically optimal for the logistic, Gaussian and Laplace location shift models respectively. The "normal" score function is also sometimes called van der Waerden scores. Also implemented are the \code{"tau"} which generalizes sign scores to an arbitrary quantile, \code{"interquartile"} which is appropriate for tests of scale shift, \code{normalscale} for Gaussian scale shift, \code{halfnormalscale} for Gaussian scale shift only to the right of the median, and \code{lehmann} for Lehmann local alternatives. See Koenker (2010) for further details on the last three of these scores. } \item{tau}{ the optional value of \code{tau} if the \code{"tau"} score function is used. } \item{trim}{optional trimming proportion parameter(s) -- only applicable for the Wilcoxon score function -- when one value is provided there is symmetric trimming of the score integral to the interval \code{(trim, 1-trim)}, when there are two values provided, then the trimming restricts the integration to \code{(trim[1], trim[2])}.} } \value{ The function returns two components. One is the ranks, the other is a scale factor which is the \eqn{L_2} norm of the score function. All score functions should be normalized to have mean zero. } \details{ See GJKP(1993) for further details. } \references{ Gutenbrunner, C., J. Jureckova, Koenker, R. and Portnoy, S. (1993) Tests of linear hypotheses based on regression rank scores, \emph{Journal of Nonparametric Statistics}, (2), 307--331. Koenker, R. Rank Tests for Heterogeneous Treatment Effects with Covariates, preprint. } \seealso{ \code{\link{rq}}, \code{\link{rq.test.rank}} \code{\link{anova}} } \examples{ data(stackloss) ranks(rq(stack.loss ~ stack.x, tau=-1)) } \keyword{regression} quantreg/man/engel.Rd0000644000176200001440000000236111653563530014245 0ustar liggesusers\name{engel} \alias{engel} \title{Engel Data} \description{ Engel food expenditure data used in Koenker and Bassett(1982). This is a regression data set consisting of 235 observations on income and expenditure on food for Belgian working class households. } \usage{data(engel)} \format{A data frame containing 235 observations on 2 variables \describe{ \item{income}{annual household income in Belgian francs} \item{foodexp}{annual household food expenditure in Belgian francs} } } \references{ Koenker, R. and Bassett, G (1982) Robust Tests of Heteroscedasticity based on Regression Quantiles; \emph{Econometrica} \bold{50}, 43--61. } \examples{ ## See also demo("engel1") ## -------------- data(engel) plot(engel, log = "xy", main = "'engel' data (log - log scale)") plot(log10(foodexp) ~ log10(income), data = engel, main = "'engel' data (log10 - transformed)") taus <- c(.15, .25, .50, .75, .95, .99) rqs <- as.list(taus) for(i in seq(along = taus)) { rqs[[i]] <- rq(log10(foodexp) ~ log10(income), tau = taus[i], data = engel) lines(log10(engel$income), fitted(rqs[[i]]), col = i+1) } legend("bottomright", paste("tau = ", taus), inset = .04, col = 2:(length(taus)+1), lty=1) } \keyword{datasets} quantreg/man/rqss.Rd0000644000176200001440000001716014414307175014145 0ustar liggesusers\name{rqss} \alias{rqss} \alias{rqss.fit} \alias{[.terms} \alias{untangle.specials} \title{Additive Quantile Regression Smoothing} \description{ Fitting function for additive quantile regression models with possible univariate and/or bivariate nonparametric terms estimated by total variation regularization. See \code{summary.rqss} and \code{plot.rqss} for further details on inference and confidence bands. } \usage{ rqss(formula, tau = 0.5, data = parent.frame(), weights, subset, na.action, method = "sfn", lambda = NULL, contrasts = NULL, ztol = 1e-5, control, ...) } \arguments{ \item{formula}{ a formula object, with the response on the left of a `~' operator, and terms, separated by `+' operators, on the right. The terms may include \code{qss} terms that represent additive nonparametric components. These terms can be univariate or bivariate. See \code{\link{qss}} for details on how to specify these terms.} \item{tau}{ the quantile to be estimated, this must be a number between 0 and 1, } \item{data}{ a data.frame in which to interpret the variables named in the formula, or in the subset and the weights argument. } \item{weights}{ vector of observation weights; if supplied, the algorithm fits to minimize the sum of the weights multiplied into the absolute residuals. The length of weights must be the same as the number of observations. The weights must be nonnegative and it is strongly recommended that they be strictly positive, since zero weights are ambiguous. } \item{subset}{an optional vector specifying a subset of observations to be used in the fitting. This can be a vector of indices of observations to be included, or a logical vector.} \item{na.action}{ a function to filter missing data. This is applied to the model.frame after any subset argument has been used. The default (with \code{na.fail}) is to create an error if any missing values are found. A possible alternative is \code{na.omit}, which deletes observations that contain one or more missing values. } \item{method}{ the algorithmic method used to compute the fit. There are currently two options. Both are implementations of the Frisch--Newton interior point method described in detail in Portnoy and Koenker(1997). Both are implemented using sparse Cholesky decomposition as described in Koenker and Ng (2003). Option \code{"sfnc"} is used if the user specifies inequality constraints. Option \code{"sfn"} is used if there are no inequality constraints. Linear inequality constraints on the fitted coefficients are specified by a matrix \code{R} and a vector \code{r}, specified inside the \code{qss} terms, representing the constraints in the form \eqn{Rb \ge r}{Rb >= r}. The option \code{method = "lasso"} allows one to penalize the coefficients of the covariates that have been entered linearly as in \code{\link{rq.fit.lasso}}; when this is specified then there should be an additional \code{lambda} argument specified that determines the amount of shrinkage. } \item{lambda}{ can be either a scalar, in which case all the slope coefficients are assigned this value, or alternatively, the user can specify a vector of length equal to the number of linear covariates plus one (for the intercept) and these values will be used as coordinate dependent shrinkage factors. } \item{contrasts}{ a list giving contrasts for some or all of the factors default = \code{NULL} appearing in the model formula. The elements of the list should have the same name as the variable and should be either a contrast matrix (specifically, any full-rank matrix with as many rows as there are levels in the factor), or else a function to compute such a matrix given the number of levels. } \item{ztol}{A zero tolerance parameter used to determine the number of zero residuals in the fitted object which in turn determines the effective dimensionality of the fit.} \item{control}{ control argument for the fitting routines (see \code{\link{sfn.control}}} \item{...}{Other arguments passed to fitting routines} } \details{ Total variation regularization for univariate and bivariate nonparametric quantile smoothing is described in Koenker, Ng and Portnoy (1994) and Koenker and Mizera(2003) respectively. The additive model extension of this approach depends crucially on the sparse linear algebra implementation for R described in Koenker and Ng (2003). There are extractor methods \code{\link{logLik}} and \code{\link{AIC}} that is relevant to lambda selection. A more detailed description of some recent developments of these methods is available from within the package with \code{vignette("rq")}. Since this function uses sparse versions of the interior point algorithm it may also prove to be useful for fitting linear models without \code{\link{qss}} terms when the design has a sparse structure, as for example when there is a complicated factor structure. If the \pkg{MatrixModels} and \pkg{Matrix} packages are both loadable then the linear-in-parameters portion of the design matrix is made in sparse matrix form; this is helpful in large applications with many factor variables for which dense formation of the design matrix would take too much space. Although modeling with \code{rqss} typically imposes smoothing penalties on the total variation of the first derivative, or gradient, of the fitted functions, for univariate smoothing, it is also possible to penalize total variation of the function itself using the option \code{Dorder = 0} inside \code{qss} terms. In such cases, estimated functions are piecewise constant rather than piecewise linear. See the documentation for \code{qss} for further details. } \value{ The function returns a fitted object representing the estimated model specified in the formula. See \code{\link{rqss.object}} for further details on this object, and references to methods to look at it. } \note{ If you intend to embed calls to \code{rqss} inside another function, then it is advisable to pass a data frame explicitly as the \code{data} argument of the \code{rqss} call, rather than relying on the magic of R scoping rules. } \references{ [1] Koenker, R. and S. Portnoy (1997) The Gaussian Hare and the Laplacean Tortoise: Computability of Squared-error vs Absolute Error Estimators, (with discussion). \emph{Statistical Science} \bold{12}, 279--300. [2] Koenker, R., P. Ng and S. Portnoy, (1994) Quantile Smoothing Splines; \emph{Biometrika} \bold{81}, 673--680. [3] Koenker, R. and I. Mizera, (2003) Penalized Triograms: Total Variation Regularization for Bivariate Smoothing; \emph{JRSS(B)} \bold{66}, 145--163. [4] Koenker, R. and P. Ng (2003) SparseM: A Sparse Linear Algebra Package for R, \emph{J. Stat. Software}. } \author{ Roger Koenker } \seealso{ \code{\link{qss}} } \examples{ n <- 200 x <- sort(rchisq(n,4)) z <- x + rnorm(n) y <- log(x)+ .1*(log(x))^2 + log(x)*rnorm(n)/4 + z plot(x, y-z) f.N <- rqss(y ~ qss(x, constraint= "N") + z) f.I <- rqss(y ~ qss(x, constraint= "I") + z) f.CI <- rqss(y ~ qss(x, constraint= "CI") + z) lines(x[-1], f.N $coef[1] + f.N $coef[-(1:2)]) lines(x[-1], f.I $coef[1] + f.I $coef[-(1:2)], col="blue") lines(x[-1], f.CI$coef[1] + f.CI$coef[-(1:2)], col="red") ## A bivariate example if(requireNamespace("interp")){ if(requireNamespace("interp")){ data(CobarOre) fCO <- rqss(z ~ qss(cbind(x,y), lambda= .08), data=CobarOre) plot(fCO) }}} \keyword{regression} \keyword{smooth} \keyword{robust} quantreg/man/ParetoTest.Rd0000644000176200001440000000431613733407766015260 0ustar liggesusers\name{ParetoTest} \alias{ParetoTest} \alias{Hill} \alias{Hill.fit} \alias{print.Hill} \alias{summary.Hill} \alias{print.summary.Hill} \alias{Pickands.fit} \alias{Pickands} \alias{print.Pickands} \alias{summary.Pickands} \alias{print.summary.Pickands} \alias{Pickands.fit} \title{Estimation and Inference on the Pareto Tail Exponent for Linear Models} \description{Estimation and inference about the tail behavior of the response in linear models are based on the adaptation of the univariate Hill (1975) and Pickands (1975) estimators for quantile regression by Chernozhukov, Fernandez-Val and Kaji (2018).} \usage{ ParetoTest(formula, tau = 0.1, data = NULL, flavor = "Hill", m = 2, cicov = .9, ...) } \arguments{ \item{formula}{a formula specifying the model to fit by \code{\link{rq}}} \item{tau}{A threshold on which to base the estimation} \item{data}{a data frame within which to interpret the formula} \item{flavor}{Currently limited to either "Hill" or "Pickands"} \item{m}{a tuning parameter for the Pickands method .} \item{cicov}{Desired coverage probability of confidence interval.} \item{...}{other arguments to be passed to \code{\link{summary.rq}}. by default the summary method is the usual xy bootstrap, with \code{B = 200} replications.} } \value{ an object of class ParetoTest is returned containing: \item{z}{ A named vector with components: the estimate, a bias corrected estimate, a lower bound of the confidence interval, an upper bound of the confidence interval, and a Bootstrap Standard Error estimate.} \item{tau}{ The tau threshold used to compute the estimate } } \examples{ n = 500 x = rnorm(n) y = x + rt(n,2) Z = ParetoTest(y ~ x, .9, flavor = "Pickands") } \keyword{htest} \references{ Chernozhukov, Victor, Ivan Fernandez-Val, and Tetsuya Kaji, (2018) Extremal Quantile Regression, in Handbook of Quantile Regression, Eds. Roger Koenker, Victor Chernozhukov, Xuming He, Limin Peng, CRC Press. Hill, B. M. (1975). A simple general approach to inference about the tail of a distribution. The Annals of Statistics 3(5), 1163-1174. Pickands, J. (1975). Statistical inference using extreme order statistics. The Annals of Statistics 3(1), 119-131. } quantreg/man/rq.fit.scad.Rd0000644000176200001440000000504711555564235015277 0ustar liggesusers\name{rq.fit.scad} \alias{rq.fit.scad} \title{ SCADPenalized Quantile Regression } \description{ The fitting method implements the smoothly clipped absolute deviation penalty of Fan and Li for fitting quantile regression models. When the argument \code{lambda} is a scalar the penalty function is the scad modified l1 norm of the last (p-1) coefficients, under the presumption that the first coefficient is an intercept parameter that should not be subject to the penalty. When \code{lambda} is a vector it should have length equal the column dimension of the matrix \code{x} and then defines a coordinatewise specific vector of scad penalty parameters. In this case \code{lambda} entries of zero indicate covariates that are not penalized. There should be a sparse version of this, but isn't (yet). } \usage{ rq.fit.scad(x, y, tau = 0.5, alpha = 3.2, lambda = 1, start="rq", beta = .9995, eps = 1e-06) } \arguments{ \item{x}{ the design matrix } \item{y}{ the response variable } \item{tau}{ the quantile desired, defaults to 0.5. } \item{alpha}{ tuning parameter of the scad penalty. } \item{lambda}{ the value of the penalty parameter that determines how much shrinkage is done. This should be either a scalar, or a vector of length equal to the column dimension of the \code{x} matrix. } \item{start}{ starting method, default method 'rq' uses the unconstrained rq estimate, while method 'lasso' uses the corresponding lasso estimate with the specified lambda. } \item{beta}{ step length parameter for Frisch-Newton method. } \item{eps}{ tolerance parameter for convergence. } } \value{ Returns a list with a coefficient, residual, tau and lambda components. When called from \code{"rq"} as intended the returned object has class "scadrqs". } \details{The algorithm is an adaptation of the "difference convex algorithm" described in Wu and Liu (2008). It solves a sequence of (convex) QR problems to approximate solutions of the (non-convex) scad problem.} \references{ Wu, Y. and Y. Liu (2008) Variable Selection in Quantile Regression, \emph{Statistica Sinica}, to appear. } \author{R. Koenker} \seealso{ \code{\link{rq}}} \examples{ n <- 60 p <- 7 rho <- .5 beta <- c(3,1.5,0,2,0,0,0) R <- matrix(0,p,p) for(i in 1:p){ for(j in 1:p){ R[i,j] <- rho^abs(i-j) } } set.seed(1234) x <- matrix(rnorm(n*p),n,p) \%*\% t(chol(R)) y <- x \%*\% beta + rnorm(n) f <- rq(y ~ x, method="scad",lambda = 30) g <- rq(y ~ x, method="scad", start = "lasso", lambda = 30) } \keyword{regression} quantreg/man/rq.object.Rd0000644000176200001440000000721511555564235015051 0ustar liggesusers\name{rq.object} \alias{rq.object} \alias{formula.rq} \alias{logLik.rq} \alias{logLik.rqs} \alias{AIC.rq} \alias{AIC.rqs} \alias{extractAIC.rq} \title{ Linear Quantile Regression Object } \description{ These are objects of class \code{"rq"}. They represent the fit of a linear conditional quantile function model. } \section{Generation}{ This class of objects is returned from the \code{rq} function to represent a fitted linear quantile regression model. } \section{Methods}{ The \code{"rq"} class of objects has methods for the following generic functions: \code{coef}, \code{effects} , \code{formula} , \code{labels} , \code{model.frame} , \code{model.matrix} , \code{plot} , \code{logLik} , \code{AIC} , \code{extractAIC} , \code{predict} , \code{print} , \code{print.summary} , \code{residuals} , \code{summary} } \section{Structure}{ The following components must be included in a legitimate \code{rq} object. \describe{ \item{\code{coefficients}}{ the coefficients of the quantile regression fit. The names of the coefficients are the names of the single-degree-of-freedom effects (the columns of the model matrix). If the model was fitted by method \code{"br"} with \code{ci=TRUE}, then the coefficient component consists of a matrix whose first column consists of the vector of estimated coefficients and the second and third columns are the lower and upper limits of a confidence interval for the respective coefficients. } \item{\code{residuals}}{ the residuals from the fit. } \item{\code{dual}}{ the vector dual variables from the fit. } \item{\code{rho}}{ The value(s) of objective function at the solution. } \item{\code{contrasts}}{ a list containing sufficient information to construct the contrasts used to fit any factors occurring in the model. The list contains entries that are either matrices or character vectors. When a factor is coded by contrasts, the corresponding contrast matrix is stored in this list. Factors that appear only as dummy variables and variables in the model that are matrices correspond to character vectors in the list. The character vector has the level names for a factor or the column labels for a matrix. } \item{\code{model}}{ optionally the model frame, if \code{model=TRUE}. } \item{\code{x}}{ optionally the model matrix, if \code{x=TRUE}. } \item{\code{y}}{ optionally the response, if \code{y=TRUE}. } } } \details{ The coefficients, residuals, and effects may be extracted by the generic functions of the same name, rather than by the \code{$} operator. For pure \code{rq} objects this is less critical than for some of the inheritor classes. In particular, for fitted rq objects using "lasso" and "scad" penalties, \code{logLik} and \code{AIC} functions compute degrees of freedom of the fitted model as the number of estimated parameters whose absolute value exceeds a threshold \code{edfThresh}. By default this threshold is 0.0001, but this can be passed via the \code{AIC} function if this value is deemed unsatisfactory. The function \code{AIC} is a generic function in R, with parameter \code{k} that controls the form of the penalty: the default value of \code{k} is 2 which yields the classical Akaike form of the penalty, while \code{k <= 0} yields the Schwarz (BIC) form of the penalty. Note that the extractor function \code{coef} returns a vector with missing values omitted. } \seealso{ \code{\link{rq}}, \code{\link{coefficients}}. } \keyword{regression} quantreg/man/plot.rqs.Rd0000644000176200001440000000360613676374446014755 0ustar liggesusers\name{plot.rqs} \alias{plot.rqs} \title{Visualizing sequences of quantile regressions} \description{A sequence of coefficient estimates for quantile regressions with varying \code{tau} parameters is visualized.} \usage{ \method{plot}{rqs}(x, parm = NULL, ols = TRUE, mfrow = NULL, mar = NULL, ylim = NULL, main = NULL, col = 1:2, lty = 1:2, cex = 0.5, pch = 20, type = "b", xlab = "", ylab = "", \dots) } \arguments{ \item{x}{an object of class \code{"rqs"} as produce by \code{\link{rq}} (with a vector of \code{tau} values).} \item{parm}{a specification of which parameters are to be plotted, either a vector of numbers or a vector of names. By default, all parameters are considered.} \item{ols}{logical. Should a line for the OLS coefficient (as estimated by \code{\link[stats]{lm}}) be added?} \item{mfrow, mar, ylim, main}{graphical parameters. Suitable defaults are chosen based on the coefficients to be visualized.} \item{col, lty}{graphical parameters. For each parameter, the first element corresponds to the \code{rq} coefficients and the second to the \code{lm} coefficients.} \item{cex, pch, type, xlab, ylab, \dots}{further graphical parameters passed.} } \details{The \code{plot} method for \code{"rqs"} objects visualizes the coefficients only, confidence bands can be added by using the \code{plot} method for the associated \code{"summary.rqs"} object.} \seealso{\code{\link{rq}}, \code{\link{plot.summary.rqs}}} \value{A matrix with all coefficients visualized is returned invisibly.} \examples{ ## fit Engel models (in levels) for tau = 0.1, ..., 0.9 data("engel") fm <- rq(foodexp ~ income, data = engel, tau = 1:9/10) ## visualizations plot(fm) plot(fm, parm = 2, mar = c(5.1, 4.1, 2.1, 2.1), main = "", xlab = "tau", ylab = "income coefficient", cex = 1, pch = 19) } \keyword{hplot} quantreg/DESCRIPTION0000644000176200001440000000644414470144215013620 0ustar liggesusersPackage: quantreg Title: Quantile Regression Description: Estimation and inference methods for models for conditional quantile functions: Linear and nonlinear parametric and non-parametric (total variation penalized) models for conditional quantiles of a univariate response and several methods for handling censored survival data. Portfolio selection methods based on expected shortfall risk are also now included. See Koenker, R. (2005) Quantile Regression, Cambridge U. Press, and Koenker, R. et al. (2017) Handbook of Quantile Regression, CRC Press, . Version: 5.97 Authors@R: c( person("Roger", "Koenker", role = c("cre","aut"), email = "rkoenker@illinois.edu"), person("Stephen", "Portnoy", role = c("ctb"), comment = "Contributions to Censored QR code", email = "sportnoy@illinois.edu"), person(c("Pin", "Tian"), "Ng", role = c("ctb"), comment = "Contributions to Sparse QR code", email = "pin.ng@nau.edu"), person("Blaise", "Melly", role = c("ctb"), comment = "Contributions to preprocessing code", email = "mellyblaise@gmail.com"), person("Achim", "Zeileis", role = c("ctb"), comment = "Contributions to dynrq code essentially identical to his dynlm code", email = "Achim.Zeileis@uibk.ac.at"), person("Philip", "Grosjean", role = c("ctb"), comment = "Contributions to nlrq code", email = "phgrosjean@sciviews.org"), person("Cleve", "Moler", role = c("ctb"), comment = "author of several linpack routines"), person("Yousef", "Saad", role = c("ctb"), comment = "author of sparskit2"), person("Victor", "Chernozhukov", role = c("ctb"), comment = "contributions to extreme value inference code"), person("Ivan", "Fernandez-Val", role = c("ctb"), comment = "contributions to extreme value inference code"), person(c("Brian", "D"), "Ripley", role = c("trl","ctb"), comment = "Initial (2001) R port from S (to my everlasting shame -- how could I have been so slow to adopt R!) and for numerous other suggestions and useful advice", email = "ripley@stats.ox.ac.uk")) Maintainer: Roger Koenker Repository: CRAN Depends: R (>= 3.5), stats, SparseM Imports: methods, graphics, Matrix, MatrixModels, survival, MASS Suggests: interp, rgl, logspline, nor1mix, Formula, zoo, R.rsp, conquer License: GPL (>= 2) URL: https://www.r-project.org NeedsCompilation: yes VignetteBuilder: R.rsp Packaged: 2023-08-19 12:48:42 UTC; roger Author: Roger Koenker [cre, aut], Stephen Portnoy [ctb] (Contributions to Censored QR code), Pin Tian Ng [ctb] (Contributions to Sparse QR code), Blaise Melly [ctb] (Contributions to preprocessing code), Achim Zeileis [ctb] (Contributions to dynrq code essentially identical to his dynlm code), Philip Grosjean [ctb] (Contributions to nlrq code), Cleve Moler [ctb] (author of several linpack routines), Yousef Saad [ctb] (author of sparskit2), Victor Chernozhukov [ctb] (contributions to extreme value inference code), Ivan Fernandez-Val [ctb] (contributions to extreme value inference code), Brian D Ripley [trl, ctb] (Initial (2001) R port from S (to my everlasting shame -- how could I have been so slow to adopt R!) and for numerous other suggestions and useful advice) Date/Publication: 2023-08-19 13:50:05 UTC quantreg/build/0000755000176200001440000000000014470135051013177 5ustar liggesusersquantreg/build/vignette.rds0000644000176200001440000000032114470135051015532 0ustar liggesusersuK0(( =kƍ1.6P (ΓthgӋ&ؖN\X֬JRƛQl=Gz_yJqﰑf|!2a+('o>, տ(MeGA;rAF*5Nd7(A= 600, c nstack = 5 suffices for n up to 2**31-1 (maximum integer*4). integer nstack parameter (nstack=10) integer stack(2,nstack) c c Parameters cutoff, cs and csd are as originally proposed. integer cutoff parameter (cutoff=600) double precision cs, csd parameter (cs=0.5d0, csd=0.5d0) c Brown's version c parameter (cs=0.5d0, csd=0.1d0) c c Subprograms called: intrinsic dble, exp, log, max, min, sign c c Written by K.C. Kiwiel, 8 March 2006, kiwiel@ibspan.waw.pl c c Local variables: integer i, j, jstack, l, m, r, s, sd double precision dm, swap, v, z l=1 r=n jstack=0 c entry to SELECT( x, n, l, r, k) c SELECT will rearrange the values of the array segment x[l:r] so c that x(k) (for some given k; l <= k <= r) will contain the c (k-l+1)-th smallest value, l <= i <= k will imply x(i) <= x(k), c and k <= i <= r will imply x(k) <= x(i). c while r > l do 1 continue if (l.ge.r) goto 6 c The additional test below prevents stack overflow. if (r-l.gt.cutoff .and. jstack.lt.nstack) then c Use SELECT recursively on a sample of size s to get an c estimate for the (k-l+1)-th smallest element into x(k), c biased slightly so that the (k-l+1)-th element is c expected to lie in the smaller set after partitioning. m=r-l+1 i=k-l+1 dm=m z=log(dm) s=cs*exp(2*z/3)+0.5d0 sd=csd*sqrt(z*s*(1-s/dm))*sign(1d0,i-dm/2)+0.5d0 if (i.eq.m/2) sd=0 c Brown's modification c sd=csd*sqrt(z*s*(1-s/dm))*(2*i/dm-1)+0.5d0 c Push the current l and r on the stack. jstack=jstack+1 stack(1,jstack)=l stack(2,jstack)=r c Find new l and r for the next recursion. l=max(dble(l),k-i*(s/dm)+sd)+0.5d0 r=min(dble(r),k-i*(s/dm)+sd+s)+0.5d0 c call SELECT( x, n, l, r, k) goto 1 endif 2 continue c Partition x[l:r] about the pivot v := x(k). v=x(k) c Initialize pointers for partitioning. i=l j=r c Swap x(l) and x(k). x(k)=x(l) x(l)=v if (v.lt.x(r)) then c Swap x(l) and x(r). x(l)=x(r) x(r)=v endif c while i < j do 3 continue if (i.lt.j) then c Swap x(i) and x(j). swap=x(j) x(j)=x(i) x(i)=swap i=i+1 j=j-1 c Scan up to find element >= v. 4 continue if (x(i).lt.v) then i=i+1 goto 4 endif c Scan down to find element <= v. 5 continue if (x(j).gt.v) then j=j-1 goto 5 endif goto 3 c end of while i < j do endif if (x(l).eq.v) then c Swap x(l) and x(j). swap=x(j) x(j)=v x(l)=swap else j=j+1 c Swap x(j) and x(r). swap=x(j) x(j)=x(r) x(r)=swap endif c Now adjust l, r so that they surround the subset containing c the (k-l+1)-th smallest element. if (j.le.k) l=j+1 if (k.le.j) r=j-1 goto 1 c end of while r > l do 6 continue c Exit if the stack is empty. if (jstack.eq.0) return c Pop l and r from the stack. l=stack(1,jstack) r=stack(2,jstack) jstack=jstack-1 c Continue as if after a return from a recursive call. goto 2 end quantreg/src/rq0.f0000644000176200001440000001404313522271353013545 0ustar liggesusers SUBROUTINE RQ0(M,N,M5,N2,A,B,T,TOLER,IFT,X,E,S,WA,WB) C C Modified to remove SOL and related vars -- only good for single tau C M Number of Observations C N Number of Parameters C M5 = M+5 row dimension for WA C N2 = N+2 col dimension for WA C A is the X matrix C B is the y vector C T, the desired quantile C TOLER, smallest detectable |x-y|/x machine precision to the 2/3 C IFT exit code: C 0-ok C else dimensions inconsistent or T not in (0,1) C X the parameter estimate betahat C E is the residual vector C S is an integer work array (M) C WA is a real work array (M5,N2) C WB is another real work array (M) C Utilization: If you just want a solution at a single quantile you C The algorithm is a slightly modified version of Algorithm AS 229 C described in Koenker and D'Orey, "Computing Regression Quantiles, C Applied Statistics, pp. 383-393. C IMPLICIT DOUBLE PRECISION(A-H,O-Z) INTEGER I,J,K,KL,KOUNT,KR,M,M1,M2,M3,M4,M5,IFT INTEGER N,N1,N2,OUT,S(M) LOGICAL STAGE,TEST,INIT,IEND DOUBLE PRECISION MIN,MAX DOUBLE PRECISION B(M),A(M,N),X(N),WA(M5,N2),WB(M),E(M) DATA BIG/1.D37/ DATA ZERO/0.00D0/ DATA HALF/0.50D0/ DATA ONE/1.00D0/ DATA TWO/2.00D0/ C C CHECK DIMENSION PARAMETERS C IFT=0 IF(N2 .NE. N+2)IFT = 4 IF(M.LE.ZERO.OR.N.LE.ZERO)IFT = 5 IF(IFT .GT. TWO)RETURN C C INITIALIZATION C M1 = M+1 N1 = N+1 M2 = M+2 M3 = M+3 M4 = M+4 M5 = M+5 DO 2 I=1,M WB(I)=B(I) DO 1 J=1,N WA(I,J)=A(I,J) 1 CONTINUE 2 CONTINUE WA(M2,N1)=ZERO DIF = ZERO IEND = .TRUE. IF(T .GE. ZERO .AND. T .LE. ONE)GOTO 3 IFT = 6 RETURN 3 CONTINUE INIT = .FALSE. KOUNT = 0 DO 9 K=1,N WA(M5,K) = ZERO DO 8 I=1,M WA(M5,K) = WA(M5,K) + WA(I,K) 8 CONTINUE WA(M5,K) = WA(M5,K)/FLOAT(M) 9 CONTINUE DO 10 J=1,N WA(M4,J) = J X(J) = ZERO 10 CONTINUE DO 40 I=1,M WA(I,N2) = N+I WA(I,N1) = WB(I) IF(WB(I).GE.ZERO)GOTO 30 DO 20 J=1,N2 WA(I,J) = -WA(I,J) 20 CONTINUE 30 E(I) = ZERO 40 CONTINUE DO 42 J=1,N WA(M2,J) = ZERO WA(M3,J) = ZERO DO 41 I=1,M AUX = SIGN(ONE,WA(M4,J)) * WA(I,J) WA(M2,J) = WA(M2,J) + AUX * (ONE - SIGN(ONE,WA(I,N2))) WA(M3,J) = WA(M3,J) + AUX * SIGN(ONE,WA(I,N2)) 41 CONTINUE WA(M3,J) = TWO * WA(M3,J) 42 CONTINUE GOTO 48 43 CONTINUE DO 44 I=1,M S(I) = ZERO 44 CONTINUE DO 45 J=1,N X(J) = ZERO 45 CONTINUE C C COMPUTE NEXT T C SMAX = TWO DO 47 J=1,N B1 = WA(M3,J) A1 = (-TWO - WA(M2,J))/B1 B1 = -WA(M2,J)/B1 IF(A1 .LT. T)GOTO 46 IF(A1 .GE. SMAX) GOTO 46 SMAX = A1 DIF = (B1 - A1 )/TWO 46 IF(B1 .LE. T) GOTO 47 IF(B1 .GE. SMAX)GOTO 47 SMAX = B1 DIF = (B1 - A1)/TWO 47 CONTINUE TNT = SMAX + TOLER * (ONE + ABS(DIF)) IF(TNT .GE. T1 + TOLER)IEND = .TRUE. T = TNT IF(IEND)T = T1 48 CONTINUE C C COMPUTE NEW MARGINAL COSTS C DO 49 J=1,N WA(M1,J) = WA(M2,J) + WA(M3,J) * T 49 CONTINUE IF(INIT) GOTO 265 C C STAGE 1 C C DETERMINE THE VECTOR TO ENTER THE BASIS C STAGE=.TRUE. KR=1 KL=1 70 MAX=-ONE DO 80 J=KR,N IF(ABS(WA(M4,J)).GT.N)GOTO 80 D=ABS(WA(M1,J)) IF(D.LE.MAX)GOTO 80 MAX=D IN=J 80 CONTINUE IF(WA(M1,IN).GE.ZERO)GOTO 100 DO 90 I=1,M4 WA(I,IN)=-WA(I,IN) 90 CONTINUE C C DETERMINE THE VECTOR TO LEAVE THE BASIS C 100 K=0 DO 110 I=KL,M D=WA(I,IN) IF(D.LE.TOLER)GOTO 110 K=K+1 WB(K)=WA(I,N1)/D S(K)=I TEST=.TRUE. 110 CONTINUE 120 IF(K.GT.0)GOTO 130 TEST=.FALSE. GOTO 150 130 MIN=BIG DO 140 I=1,K IF(WB(I).GE.MIN)GOTO 140 J=I MIN=WB(I) OUT=S(I) 140 CONTINUE WB(J)=WB(K) S(J)=S(K) K=K-1 C C CHECK FOR LINEAR DEPENDENCE IN STAGE 1 C 150 IF(TEST.OR..NOT.STAGE)GOTO 170 DO 160 I=1,M4 D=WA(I,KR) WA(I,KR)=WA(I,IN) WA(I,IN)=D 160 CONTINUE KR=KR+1 GOTO 260 170 IF(TEST)GOTO 180 WA(M2,N1)=TWO GOTO 390 180 PIVOT=WA(OUT,IN) IF(WA(M1,IN)-PIVOT-PIVOT.LE.TOLER)GOTO 200 DO 190 J=KR,N1 D=WA(OUT,J) WA(M1,J)=WA(M1,J)-D-D WA(M2,J)=WA(M2,J)-D-D WA(OUT,J)=-D 190 CONTINUE WA(OUT,N2)=-WA(OUT,N2) GOTO 120 C C PIVOT ON WA(OUT,IN) C 200 DO 210 J=KR,N1 IF(J.EQ.IN)GOTO 210 WA(OUT,J)=WA(OUT,J)/PIVOT 210 CONTINUE DO 230 I=1,M3 IF(I.EQ.OUT)GOTO 230 D=WA(I,IN) DO 220 J=KR,N1 IF(J.EQ.IN)GOTO 220 WA(I,J)=WA(I,J)-D*WA(OUT,J) 220 CONTINUE 230 CONTINUE DO 240 I=1,M3 IF(I.EQ.OUT)GOTO 240 WA(I,IN)=-WA(I,IN)/PIVOT 240 CONTINUE WA(OUT,IN)=ONE/PIVOT D=WA(OUT,N2) WA(OUT,N2)=WA(M4,IN) WA(M4,IN)=D KOUNT=KOUNT+1 IF(.NOT.STAGE)GOTO 270 C C INTERCHANGE ROWS IN STAGE 1 C KL=KL+1 DO 250 J=KR,N2 D=WA(OUT,J) WA(OUT,J)=WA(KOUNT,J) WA(KOUNT,J)=D 250 CONTINUE 260 IF(KOUNT+KR.NE.N1)GOTO 70 C C STAGE 2 C 265 STAGE=.FALSE. C C DETERMINE THE VECTOR TO ENTER THE BASIS C 270 MAX=-BIG DO 290 J=KR,N D=WA(M1,J) IF(D.GE.ZERO)GOTO 280 IF(D.GT.(-TWO))GOTO 290 D=-D-TWO 280 IF(D.LE.MAX)GOTO 290 MAX=D IN=J 290 CONTINUE IF(MAX.LE.TOLER)GOTO 310 IF(WA(M1,IN).GT.ZERO)GOTO 100 DO 300 I=1,M4 WA(I,IN)=-WA(I,IN) 300 CONTINUE WA(M1,IN)=WA(M1,IN)-TWO WA(M2,IN)=WA(M2,IN)-TWO GOTO 100 C C COMPUTE QUANTILES C 310 CONTINUE DO 320 I=1,KL-1 K=WA(I,N2)*SIGN(ONE,WA(I,N2)) X(K) = WA(I,N1) * SIGN(ONE,WA(I,N2)) 320 CONTINUE 390 SUM = ZERO DO 400 I=KL,M K = WA(I,N2) * SIGN(ONE,WA(I,N2)) D = WA(I,N1) * SIGN(ONE,WA(I,N2)) SUM = SUM + D * SIGN(ONE,D) * (HALF + SIGN(ONE,D)*(T-HALF)) K=K-N E(K)=D 400 CONTINUE RETURN END quantreg/src/rls.f0000644000176200001440000000114313752023347013643 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine rls(n,p,x,y,b,a,ax) integer n,p double precision x(p,n),y(n),b(p,n),a(p,p),ax(p) double precision zero,one,mone,f,r,ddot data one/1.d0/ data mone/-1.d0/ data zero/0.d0/ do23000 i = (p+1),n call dgemv('N',p,p,one,a,p,x(1,i),1,zero,ax,1) f = one + ddot(p,x(1,i),1,ax,1) r = (y(i)-ddot(p,x(1,i),1,b(1,i-1),1))/f call daxpy(p,one,b(1,i-1),1,b(1,i),1) call daxpy(p,r,ax,1,b(1,i),1) call dger(p,p,mone/f,ax,1,ax,1,a,p) 23000 continue 23001 continue return end quantreg/src/sparskit2.f0000644000176200001440000003035013777261365015002 0ustar liggesusersc----------------------------------------------------------------------c subroutine amub (nrow,ncol,job,a,ja,ia,b,jb,ib, * c,jc,ic,nzmax,iw,ierr) double precision a(*), b(*), c(*) integer ja(*),jb(*),jc(*),ia(nrow+1),ib(*),ic(*),iw(ncol) c----------------------------------------------------------------------- c performs the matrix by matrix product C = A B c----------------------------------------------------------------------- c on entry: c --------- c nrow = integer. The row dimension of A = row dimension of C c ncol = integer. The column dimension of B = column dimension of C c job = integer. Job indicator. When job = 0, only the structure c (i.e. the arrays jc, ic) is computed and the c real values are ignored. c c a, c ja, c ia = Matrix A in compressed sparse row format. c c b, c jb, c ib = Matrix B in compressed sparse row format. c c nzmax = integer. The length of the arrays c and jc. c amub will stop if the result matrix C has a number c of elements that exceeds exceeds nzmax. See ierr. c c on return: c---------- c c, c jc, c ic = resulting matrix C in compressed sparse row sparse format. c c ierr = integer. serving as error message. c ierr = 0 means normal return, c ierr .gt. 0 means that amub stopped while computing the c i-th row of C with i=ierr, because the number c of elements in C exceeds nzmax. c c work arrays: c------------ c iw = integer work array of length equal to the number of c columns in B. c Note: c------- c The row dimension of B is not needed. However there is no checking c on the condition that ncol(A) = nrow(B). c c----------------------------------------------------------------------- double precision scal logical values values = (job .ne. 0) len = 0 ic(1) = 1 ierr = 0 c initialize array iw. do 1 j=1, ncol iw(j) = 0 1 continue c do 500 ii=1, nrow c row i do 200 ka=ia(ii), ia(ii+1)-1 if (values) scal = a(ka) jj = ja(ka) do 100 kb=ib(jj),ib(jj+1)-1 jcol = jb(kb) jpos = iw(jcol) if (jpos .eq. 0) then len = len+1 if (len .gt. nzmax) then ierr = ii return endif jc(len) = jcol iw(jcol)= len if (values) c(len) = scal*b(kb) else if (values) c(jpos) = c(jpos) + scal*b(kb) endif 100 continue 200 continue do 201 k=ic(ii), len iw(jc(k)) = 0 201 continue ic(ii+1) = len+1 500 continue return c-------------end-of-amub----------------------------------------------- c----------------------------------------------------------------------- end c----------------------------------------------------------------------- subroutine amudia (nrow,job, a, ja, ia, diag, b, jb, ib) double precision a(*), b(*), diag(*) integer ja(*),jb(*), ia(nrow+1),ib(nrow+1) c----------------------------------------------------------------------- c performs the matrix by matrix product B = A * Diag (in place) c----------------------------------------------------------------------- c on entry: c --------- c nrow = integer. The row dimension of A c c job = integer. job indicator. Job=0 means get array b only c job = 1 means get b, and the integer arrays ib, jb. c c a, c ja, c ia = Matrix A in compressed sparse row format. c c diag = diagonal matrix stored as a vector dig(1:n) c c on return: c---------- c c b, c jb, c ib = resulting matrix B in compressed sparse row sparse format. c c Notes: c------- c 1) The column dimension of A is not needed. c 2) algorithm in place (B can take the place of A). c----------------------------------------------------------------- do 1 ii=1,nrow c c scale each element c k1 = ia(ii) k2 = ia(ii+1)-1 do 2 k=k1, k2 b(k) = a(k)*diag(ja(k)) 2 continue 1 continue c if (job .eq. 0) return c do 3 ii=1, nrow+1 ib(ii) = ia(ii) 3 continue do 31 k=ia(1), ia(nrow+1) -1 jb(k) = ja(k) 31 continue return c----------------------------------------------------------------------- c-----------end-of-amudiag---------------------------------------------- end c----------------------------------------------------------------------c subroutine amux (n, x, y, a,ja,ia) double precision x(*), y(*), a(*) integer n, ja(*), ia(*) c----------------------------------------------------------------------- c A times a vector c----------------------------------------------------------------------- c multiplies a matrix by a vector using the dot product form c Matrix A is stored in compressed sparse row storage. c c on entry: c---------- c n = row dimension of A c x = real array of length equal to the column dimension of c the A matrix. c a, ja, c ia = input matrix in compressed sparse row format. c c on return: c----------- c y = real array of length n, containing the product y=Ax c c----------------------------------------------------------------------- c local variables c double precision t integer i, k c----------------------------------------------------------------------- do 100 i = 1,n c c compute the inner product of row i with vector x c t = 0.0d0 do 99 k=ia(i), ia(i+1)-1 t = t + a(k)*x(ja(k)) 99 continue c c store result in y(i) c y(i) = t 100 continue c return end c----------------------------------------------------------------------- subroutine aplb (nrow,ncol,job,a,ja,ia,b,jb,ib, * c,jc,ic,nzmax,iw,ierr) double precision a(*), b(*), c(*) integer ja(*),jb(*),jc(*),ia(nrow+1),ib(nrow+1),ic(nrow+1), * iw(ncol) c----------------------------------------------------------------------- c performs the matrix sum C = A+B. c----------------------------------------------------------------------- c on entry: c --------- c nrow = integer. The row dimension of A and B c ncol = integer. The column dimension of A and B. c job = integer. Job indicator. When job = 0, only the structure c (i.e. the arrays jc, ic) is computed and the c real values are ignored. c c a, c ja, c ia = Matrix A in compressed sparse row format. c c b, c jb, c ib = Matrix B in compressed sparse row format. c c nzmax = integer. The length of the arrays c and jc. c amub will stop if the result matrix C has a number c of elements that exceeds exceeds nzmax. See ierr. c c on return: c---------- c c, c jc, c ic = resulting matrix C in compressed sparse row sparse format. c c ierr = integer. serving as error message. c ierr = 0 means normal return, c ierr .gt. 0 means that amub stopped while computing the c i-th row of C with i=ierr, because the number c of elements in C exceeds nzmax. c c work arrays: c------------ c iw = integer work array of length equal to the number of c columns in A. c c----------------------------------------------------------------------- logical values values = (job .ne. 0) ierr = 0 len = 0 ic(1) = 1 do 1 j=1, ncol iw(j) = 0 1 continue c do 500 ii=1, nrow c row i do 200 ka=ia(ii), ia(ii+1)-1 len = len+1 jcol = ja(ka) if (len .gt. nzmax) goto 999 jc(len) = jcol if (values) c(len) = a(ka) iw(jcol)= len 200 continue c do 300 kb=ib(ii),ib(ii+1)-1 jcol = jb(kb) jpos = iw(jcol) if (jpos .eq. 0) then len = len+1 if (len .gt. nzmax) goto 999 jc(len) = jcol if (values) c(len) = b(kb) iw(jcol)= len else if (values) c(jpos) = c(jpos) + b(kb) endif 300 continue do 301 k=ic(ii), len iw(jc(k)) = 0 301 continue ic(ii+1) = len+1 500 continue return 999 ierr = ii return c------------end of aplb ----------------------------------------------- c----------------------------------------------------------------------- end subroutine csrmsr (n,a,ja,ia,ao,jao,wk,iwk,nnzao,ierr) double precision a(*),ao(*),wk(n) integer ia(n+1),ja(*),jao(*),iwk(n+1),nnzao,ierr c----------------------------------------------------------------------- c Compressed Sparse Row to Modified - Sparse Row c Sparse row with separate main diagonal c----------------------------------------------------------------------- c converts a general sparse matrix a, ja, ia into c a compressed matrix using a separated diagonal (referred to as c the bell-labs format as it is used by bell labs semi conductor c group. We refer to it here as the modified sparse row format. c Note: this has been coded in such a way that one can overwrite c the output matrix onto the input matrix if desired by a call of c the form c c call csrmsr (n, a, ja, ia, a, ja, wk,iwk) c c In case ao, jao, are different from a, ja, then one can c use ao, jao as the work arrays in the calling sequence: c c call csrmsr (n, a, ja, ia, ao, jao, ao,jao) c c----------------------------------------------------------------------- c c on entry : c--------- c a, ja, ia = matrix in csr format. note that the c algorithm is in place: ao, jao can be the same c as a, ja, in which case it will be overwritten on it c upon return. c nnzao = the number of non-zero entries in ao, jao c c on return : c----------- c c ao, jao = sparse matrix in modified sparse row storage format: c + ao(1:n) contains the diagonal of the matrix. c + ao(n+2:nnz) contains the nondiagonal elements of the c matrix, stored rowwise. c + jao(n+2:nnz) : their column indices c + jao(1:n+1) contains the pointer array for the nondiagonal c elements in ao(n+2:nnz) and jao(n+2:nnz). c i.e., for i .le. n+1 jao(i) points to beginning of row i c in arrays ao, jao. c here nnz = number of nonzero elements+1 c ierr: c = -1 : length of ao, jao < itpr c c work arrays: c------------ c wk = real work array of length n c iwk = integer work array of length n+1 c c notes: c------- c Algorithm is in place. i.e. both: c c call csrmsr (n, a, ja, ia, ao, jao, ao,jao) c (in which ao, jao, are different from a, ja) c and c call csrmsr (n, a, ja, ia, a, ja, wk,iwk) c (in which wk, jwk, are different from a, ja) c are OK. c-------- c coded by Y. Saad Sep. 1989. Rechecked Feb 27, 1990. c Modified by Pin Ng on June 11, 2002 to provide warning when c iptr > nnzao+1 c----------------------------------------------------------------------- icount = 0 c c store away diagonal elements and count nonzero diagonal elements. c do 1 i=1,n wk(i) = 0.0d0 iwk(i+1) = ia(i+1)-ia(i) do 2 k=ia(i),ia(i+1)-1 if (ja(k) .eq. i) then wk(i) = a(k) icount = icount + 1 iwk(i+1) = iwk(i+1)-1 endif 2 continue 1 continue c c compute total length c iptr = n + ia(n+1) - icount if (iptr .gt. nnzao+1) then ierr = -1 return endif c c copy backwards (to avoid collisions) c do 500 ii=n,1,-1 do 100 k=ia(ii+1)-1,ia(ii),-1 j = ja(k) if (j .ne. ii) then ao(iptr) = a(k) jao(iptr) = j iptr = iptr-1 endif 100 continue 500 continue c c compute pointer values and copy wk(*) c jao(1) = n+2 do 600 i=1,n ao(i) = wk(i) jao(i+1) = jao(i)+iwk(i+1) 600 continue return c------------ end of subroutine csrmsr --------------------------------- c----------------------------------------------------------------------- end quantreg/src/linpack.f0000644000176200001440000003005114001520742014451 0ustar liggesusersC The following routines are from LINPACK and do not seem to be part of C the standard R distro. subroutine dgedi(a,lda,n,ipvt,det,work,job) integer lda,n,ipvt(*),job double precision a(lda,*),det(2),work(*) c c dgedi computes the determinant and inverse of a matrix c using the factors computed by dgeco or dgefa. c c on entry c c a double precision(lda, n) c the output from dgeco or dgefa. c c lda integer c the leading dimension of the array a . c c n integer c the order of the matrix a . c c ipvt integer(n) c the pivot vector from dgeco or dgefa. c c work double precision(n) c work vector. contents destroyed. c c job integer c = 11 both determinant and inverse. c = 01 inverse only. c = 10 determinant only. c c on return c c a inverse of original matrix if requested. c otherwise unchanged. c c det double precision(2) c determinant of original matrix if requested. c otherwise not referenced. c determinant = det(1) * 10.0**det(2) c with 1.0 .le. dabs(det(1)) .lt. 10.0 c or det(1) .eq. 0.0 . c c error condition c c a division by zero will occur if the input factor contains c a zero on the diagonal and the inverse is requested. c it will not occur if the subroutines are called correctly c and if dgeco has set rcond .gt. 0.0 or dgefa has set c info .eq. 0 . c c linpack. this version dated 08/14/78 . c cleve moler, university of new mexico, argonne national lab. c c subroutines and functions c c blas daxpy,dscal,dswap c fortran dabs,mod c c internal variables c double precision t double precision ten integer i,j,k,kb,kp1,l,nm1 c c c compute determinant c if (job/10 .eq. 0) go to 70 det(1) = 1.0d0 det(2) = 0.0d0 ten = 10.0d0 do 50 i = 1, n if (ipvt(i) .ne. i) det(1) = -det(1) det(1) = a(i,i)*det(1) c ...exit if (det(1) .eq. 0.0d0) go to 60 10 if (dabs(det(1)) .ge. 1.0d0) go to 20 det(1) = ten*det(1) det(2) = det(2) - 1.0d0 go to 10 20 continue 30 if (dabs(det(1)) .lt. ten) go to 40 det(1) = det(1)/ten det(2) = det(2) + 1.0d0 go to 30 40 continue 50 continue 60 continue 70 continue c c compute inverse(u) c if (mod(job,10) .eq. 0) go to 150 do 100 k = 1, n a(k,k) = 1.0d0/a(k,k) t = -a(k,k) call dscal(k-1,t,a(1,k),1) kp1 = k + 1 if (n .lt. kp1) go to 90 do 80 j = kp1, n t = a(k,j) a(k,j) = 0.0d0 call daxpy(k,t,a(1,k),1,a(1,j),1) 80 continue 90 continue 100 continue c c form inverse(u)*inverse(l) c nm1 = n - 1 if (nm1 .lt. 1) go to 140 do 130 kb = 1, nm1 k = n - kb kp1 = k + 1 do 110 i = kp1, n work(i) = a(i,k) a(i,k) = 0.0d0 110 continue do 120 j = kp1, n t = work(j) call daxpy(n,t,a(1,j),1,a(1,k),1) 120 continue l = ipvt(k) if (l .ne. k) call dswap(n,a(1,k),1,a(1,l),1) 130 continue 140 continue 150 continue return end subroutine dgeco(a,lda,n,ipvt,rcond,z) integer lda,n,ipvt(*) double precision a(lda,*),z(*) double precision rcond c c dgeco factors a double precision matrix by gaussian elimination c and estimates the condition of the matrix. c c c if rcond is not needed, dgefa is slightly faster. c to solve a*x = b , follow dgeco by dgesl. c to compute inverse(a)*c , follow dgeco by dgesl. c to compute determinant(a) , follow dgeco by dgedi. c to compute inverse(a) , follow dgeco by dgedi. c c on entry c c a double precision(lda, n) c the matrix to be factored. c c lda integer c the leading dimension of the array a . c c n integer c the order of the matrix a . c c on return c c a an upper triangular matrix and the multipliers c which were used to obtain it. c the factorization can be written a = l*u where c l is a product of permutation and unit lower c triangular matrices and u is upper triangular. c c ipvt integer(n) c an integer vector of pivot indices. c c rcond double precision c an estimate of the reciprocal condition of a . c for the system a*x = b , relative perturbations c in a and b of size epsilon may cause c relative perturbations in x of size epsilon/rcond . c if rcond is so small that the logical expression c 1.0 + rcond .eq. 1.0 c is true, then a may be singular to working c precision. in particular, rcond is zero if c exact singularity is detected or the estimate c underflows. c c z double precision(n) c a work vector whose contents are usually unimportant. c if a is close to a singular matrix, then z is c an approximate null vector in the sense that c norm(a*z) = rcond*norm(a)*norm(z) . c c linpack. this version dated 08/14/78 . c cleve moler, university of new mexico, argonne national lab. c c subroutines and functions c c linpack dgefa c blas daxpy,ddot,dscal,dasum c fortran dabs,dmax1,dsign c c internal variables c double precision ddot,ek,t,wk,wkm double precision anorm,s,dasum,sm,ynorm integer info,j,k,kb,kp1,l c c c compute 1-norm of a c anorm = 0.0d0 do 10 j = 1, n anorm = dmax1(anorm,dasum(n,a(1,j),1)) 10 continue c c factor c call dgefa(a,lda,n,ipvt,info) c c rcond = 1/(norm(a)*(estimate of norm(inverse(a)))) . c estimate = norm(z)/norm(y) where a*z = y and trans(a)*y = e . c trans(a) is the transpose of a . the components of e are c chosen to cause maximum local growth in the elements of w where c trans(u)*w = e . the vectors are frequently rescaled to avoid c overflow. c c solve trans(u)*w = e c ek = 1.0d0 do 20 j = 1, n z(j) = 0.0d0 20 continue do 100 k = 1, n if (z(k) .ne. 0.0d0) ek = dsign(ek,-z(k)) if (dabs(ek-z(k)) .le. dabs(a(k,k))) go to 30 s = dabs(a(k,k))/dabs(ek-z(k)) call dscal(n,s,z,1) ek = s*ek 30 continue wk = ek - z(k) wkm = -ek - z(k) s = dabs(wk) sm = dabs(wkm) if (a(k,k) .eq. 0.0d0) go to 40 wk = wk/a(k,k) wkm = wkm/a(k,k) go to 50 40 continue wk = 1.0d0 wkm = 1.0d0 50 continue kp1 = k + 1 if (kp1 .gt. n) go to 90 do 60 j = kp1, n sm = sm + dabs(z(j)+wkm*a(k,j)) z(j) = z(j) + wk*a(k,j) s = s + dabs(z(j)) 60 continue if (s .ge. sm) go to 80 t = wkm - wk wk = wkm do 70 j = kp1, n z(j) = z(j) + t*a(k,j) 70 continue 80 continue 90 continue z(k) = wk 100 continue s = 1.0d0/dasum(n,z,1) call dscal(n,s,z,1) c c solve trans(l)*y = w c do 120 kb = 1, n k = n + 1 - kb if (k .lt. n) z(k) = z(k) + ddot(n-k,a(k+1,k),1,z(k+1),1) if (dabs(z(k)) .le. 1.0d0) go to 110 s = 1.0d0/dabs(z(k)) call dscal(n,s,z,1) 110 continue l = ipvt(k) t = z(l) z(l) = z(k) z(k) = t 120 continue s = 1.0d0/dasum(n,z,1) call dscal(n,s,z,1) c ynorm = 1.0d0 c c solve l*v = y c do 140 k = 1, n l = ipvt(k) t = z(l) z(l) = z(k) z(k) = t if (k .lt. n) call daxpy(n-k,t,a(k+1,k),1,z(k+1),1) if (dabs(z(k)) .le. 1.0d0) go to 130 s = 1.0d0/dabs(z(k)) call dscal(n,s,z,1) ynorm = s*ynorm 130 continue 140 continue s = 1.0d0/dasum(n,z,1) call dscal(n,s,z,1) ynorm = s*ynorm c c solve u*z = v c do 160 kb = 1, n k = n + 1 - kb if (dabs(z(k)) .le. dabs(a(k,k))) go to 150 s = dabs(a(k,k))/dabs(z(k)) call dscal(n,s,z,1) ynorm = s*ynorm 150 continue if (a(k,k) .ne. 0.0d0) z(k) = z(k)/a(k,k) if (a(k,k) .eq. 0.0d0) z(k) = 1.0d0 t = -z(k) call daxpy(k-1,t,a(1,k),1,z(1),1) 160 continue c make znorm = 1.0 s = 1.0d0/dasum(n,z,1) call dscal(n,s,z,1) ynorm = s*ynorm c if (anorm .ne. 0.0d0) rcond = ynorm/anorm if (anorm .eq. 0.0d0) rcond = 0.0d0 return end subroutine dgefa(a,lda,n,ipvt,info) c use numerical_libraries integer lda,n,ipvt(*),info double precision a(lda,*) c c dgefa factors a double precision matrix by gaussian elimination. c c dgefa is usually called by dgeco, but it can be called c directly with a saving in time if rcond is not needed. c (time for dgeco) = (1 + 9/n)*(time for dgefa) . c c on entry c c a double precision(lda, n) c the matrix to be factored. c c lda integer c the leading dimension of the array a . c c n integer c the order of the matrix a . c c on return c c a an upper triangular matrix and the multipliers c which were used to obtain it. c the factorization can be written a = l*u where c l is a product of permutation and unit lower c triangular matrices and u is upper triangular. c c ipvt integer(n) c an integer vector of pivot indices. c c info integer c = 0 normal value. c = k if u(k,k) .eq. 0.0 . this is not an error c condition for this subroutine, but it does c indicate that dgesl or dgedi will divide by zero c if called. use rcond in dgeco for a reliable c indication of singularity. c c linpack. this version dated 08/14/78 . c cleve moler, university of new mexico, argonne national lab. c c subroutines and functions c c blas daxpy,dscal,idamax c c internal variables c double precision t c integer idamax,j,k,kp1,l,nm1 integer j,k,kp1,l,nm1 c c c gaussian elimination with partial pivoting c info = 0 nm1 = n - 1 if (nm1 .lt. 1) go to 70 do 60 k = 1, nm1 kp1 = k + 1 c c find l = pivot index c l = idamax(n-k+1,a(k,k),1) + k - 1 ipvt(k) = l c c zero pivot implies this column already triangularized c if (a(l,k) .eq. 0.0d0) go to 40 c c interchange if necessary c if (l .eq. k) go to 10 t = a(l,k) a(l,k) = a(k,k) a(k,k) = t 10 continue c c compute multipliers c t = -1.0d0/a(k,k) call dscal(n-k,t,a(k+1,k),1) c c row elimination with column indexing c do 30 j = kp1, n t = a(l,j) if (l .eq. k) go to 20 a(l,j) = a(k,j) a(k,j) = t 20 continue call daxpy(n-k,t,a(k+1,k),1,a(k+1,j),1) 30 continue go to 50 40 continue info = k 50 continue 60 continue 70 continue ipvt(n) = n if (a(n,n) .eq. 0.0d0) info = n return end quantreg/src/combos.f0000644000176200001440000000306213752023347014327 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine combin(r,n,m,a,c,e,last) integer r,n,m,t,k,j,m0,mj,s integer a(n,m),c(r),e(r),last(r) logical odd m0 = r-n t = n+1 k = 1 j = 0 c(1) = 0 23000 continue j = j + 1 c(j) = j e(j) = j - 1 if(odd(j))then last(j) = m0 + j else last(j) = j + 1 endif if(j .eq. n)then goto 23002 endif 23001 goto 23000 23002 continue do23007 i = 1,n a(i,1) = c(i) 23007 continue 23008 continue if(n .lt. r)then 23011 continue k = k + 1 s = c(j) mj = m0 + j e(n+1) = n if(odd(j))then if(c(j) .eq. mj)then c(j) = c(j-1) + 1 last(j+1) = c(j) + 1 else c(j) = c(j) + 1 endif else if(c(j) .eq. c(j-1) + 1)then c(j) = mj else last(j+1) = c(j) c(j) = c(j) - 1 endif endif if(c(j) .eq. last(j))then last(j) = s e(j+1) = e(j) e(j) = j-1 endif if( (j .lt. n) .and. (c(j) .eq. mj))then t = j j = e(t+1) e(t+1) = t else if(t .eq. j)then t = t + 1 endif if(t .lt. e(n+1))then j = t else j = e(n+1) endif endif do23028 i = 1,n a(i,k) = c(i) 23028 continue 23029 continue if(j .eq. 0)then goto 23013 endif 23012 goto 23011 23013 continue endif return end logical function odd(j) integer j odd = (mod(j,2) .eq. 1) return end quantreg/src/ratfor/0000755000176200001440000000000014470134455014173 5ustar liggesusersquantreg/src/ratfor/qfnb.r0000644000176200001440000000204113755220472015301 0ustar liggesusers# Toy fnb routine for multiple taus subroutine qfnb(n,p,m,a,y,t,r,d,u,wn,wp,B,nit, info) # Input: # n = sample size # p = parametric dimension of model # m = dimension of tau vector # a = p by n design matrix (transposed) # y = n dimensional response vector # t = m dimensional tau vector # r = p dimensional rhs vector # d = n dimensional vector of ones # u = n dimensional vector of ones # wn = n by 9 work array # wp = p by p+3 work array # # Output: # B = p by m matrix of coefficients integer n,p,m,nit(3),info double precision a(p,n), y(n), t(m), B(p,m), r(p) double precision d(n), u(n), wn(n,9), wp(p,p+3) double precision zero, one, eps, beta parameter( zero = 0.0d0) parameter( one = 1.0d0) parameter( beta = 0.99995d0) parameter( eps = 1.0d-6) do i = 1,m{ call dgemv('N',p,n,one-t(i),a,p,d,1,zero,r,1) call dscal(n,zero,wn,1) call daxpy(n,one-t(i),u,1,wn,1) call rqfnb(n,p,a,y,r,d,u,beta,eps,wn,wp,nit,info) if(info != 0) break do j = 1,n{ u(j) = one d(j) = one } call dcopy(p,wp,1,B(1,i),1) } return end quantreg/src/ratfor/pfnb.r0000644000176200001440000000711413767155411015311 0ustar liggesusers# multiple tau estimation with fnb algorithm and globbing # Input: # n = full sample size # p = parametric dimension of model # m = number of quantiles to be estimated # a = p by n (transposed) design matrix # y = n-vector of responses # q = m-vector of quantiles to be estimated # r = residual vector from fit for q[1] # b = coefficient matrix # band = confidence band (see rq.fit.pfnb) # m0 = initial sample size default is n^(2/3) * p^(1/2) # d = n-vector of ones # u = n-vector of ones # wn = 9*n work array # wp = p(p+3) work array # aa = n by p array for globbed design matrix # yy = n vector for globbed response matrix # slo = n-vector of boolean integers # shi = n-vector of boolean integers # rhs = p-vector for right hand side # glob = p-vector for glob # ghib = p-vector for ghib # nit = 3-vector of iteration counts # info = flag for convergence # Maybe there should be a control object # Possible control parameter m0 # and/or work storage could be better rationalized. subroutine pfnb(n,p,m,a,y,q,r,b,band,m0,d,u,wn,wp, aa,yy,slo,shi,rhs,glob,ghib,nit,info) integer n,p,m,kk(2),mm,m0,nit(5,m),info,sumbad integer i,j,k,slo(n),shi(n),ifix,ibad logical notopt double precision a(p,n),y(n),r(n),q(m),d(n),u(n),b(p,m) double precision wn(n,9), wp(p,(p+3)),band(n),qk(2) double precision glob(p),ghib(p),aa(p,n),yy(n),rhs(p) double precision zero,one,tau,beta,eps,big,fm,fn parameter(zero = 0.0d0) parameter(one = 1.0d0) parameter(beta = 0.99995d0) parameter(big = 1.0d+10) parameter(eps = 1.0d-06) do iq = 1,m { notopt = .true. tau = q(iq) mm = m0 ifix = 0 ibad = 0 while (notopt) { ibad = ibad + 1 fm = mm fn = dble(n) kk(1) = int(n * dmax1(1./fn, tau - fm/(2 * fn))) + 1 kk(2) = int(n * dmin1(tau + fm/(2. * fn), (fn - 1)/fn)) do i = 1,n u(i) = r(i)/band(i) call kuantiles(kk,2,n,u) qk(1) = u(kk(1)) qk(2) = u(kk(2)) call iphil(n,0,slo) call iphil(n,0,shi) do i = 1,n{ if(r(i) < (band(i) * qk(1))) slo(i) = 1 else if(r(i) > (band(i) * qk(2))) shi(i) = 1 } while (notopt) { ifix = ifix + 1 call dphil(p,zero,glob) call dphil(p,zero,ghib) call dphil(n,one,d) call dphil(n,one,u) k = 0 do i = 1,n{ if(slo(i) == 0 & shi(i) == 0){ k = k + 1 call dcopy(p,a(1,i),1,aa(1,k),1) yy(k) = -y(i) } else if (slo(i) == 1) { do j = 1,p glob(j) = glob(j) + a(j,i) } else if (shi(i) == 1) { do j = 1,p ghib(j) = ghib(j) + a(j,i) } } call dcopy(p,glob,1,aa(1,k+1),1) call dcopy(p,ghib,1,aa(1,k+2),1) yy(k+1) = big yy(k+2) = -big call dgemv('N',p,k+2,one-tau,aa,p,d,1,zero,rhs,1) call dscal(k+2,zero,wn,1) call daxpy(k+2,one-tau,u,1,wn,1) call rqfnb(k+2,p,aa,yy,rhs,d,u,beta,eps,wn,wp,nit(1,iq),info) call dcopy(p,wp,1,b(1,iq),1) call dcopy(n,y,1,r,1) call dgemv('T',p,n,one,a,p,b(1,iq),1,one,r,1) # Check predicted signs of residuals (in r) sumbad = 0 do i = 1,n { if((r(i) > 0) & slo(i) == 1){ slo(i) = 0 sumbad = sumbad + 1 } if((r(i) < 0) & shi(i) == 1){ shi(i) = 0 sumbad = sumbad + 1 } } if(sumbad > 0) { if (sumbad > 0.1 * mm) { mm = min(2 * mm, n) break } } else notopt = .false. } nit(4,iq) = ifix nit(5,iq) = ibad } } return end subroutine iphil(n,a,v) integer n,i,a,v(n) do i = 1,n v(i) = a return end subroutine dphil(n,a,v) integer i,n double precision a,v(n) do i = 1,n v(i) = a return end quantreg/src/ratfor/README0000644000176200001440000000744613777256027015077 0ustar liggesusersThis directory contains ratfor source for the several routines of the rq library. These are not strictly necessary, but they may prove useful to anyone wanting to look at the source in detail, since the fortran translation of them by the ratfor compiler is far from readable. Note added September 17, 2004 Apparently g77 v3.4 doesn't like double precision data statements so these have been changed to parameter() declarations. This turned out to be a bug in g77, but the deed is done so I've left the parameter statements in place of the original data statements. However, this entailed the dangerous step of installing the SEP ratfor77 translator. (See http://sepwww.stanford.edu/software/ratfor.html for details.) Past experience, and now a bug file in the SEP distro, suggests that the ratfor switch statement is unlikely to be correctly handled. Fortunately, none of the included routines in the directory use switch but caution is undoubtedly indicated. The fortran produced for rqbr.r is somewhat different than that produced by my older sun version, and generates two warnings from g77, but these appear to be harmless. Note added March 16, 2005 g77 has been issuing warnings for the code generated from the SEP distro of ratfor version of rqbr.r for a while now, but yesterday Jan deLeeuw reported that it now generates an error in his gfortran 4.0 on osx. After some comparisons with old version of the ratfor translation, in particular the rq.f in rq/statlib.95 on ysidro, I determined that what the compiler didn't like was the way that if-endifs were generated by the SEP translation. So.... I hand edited these last few if-endifs in the .f file, and move that back into the src directory. This is TOTALLY unsatisfactory, since it means that this needs to be done yet again if any changes are made to the ratfor code, but seems to be the cost of using the SEP translator. A more clever guy with more time could probably find a way to change the ratfor, but given other constraints that ain't going to happen anytime soon. Note that I've for future reference put a version of the old rq.f file generated by my old BTL ratfor translator into this directory. as well as the new rqbr.f. Note added Oct 22, 2007 As part of the development of the crqfnb function I downloaded the SEP version of ratfor77, which seems to work ok on this function. It is installed in my $HOME/bin directory and the build is in the Rinstall directory. Note that now on yzzy ratfor is called ratfor77. Note added May 14, 2016 Contrary to the last note, it appears that my $HOME/bin/ratfor command works and $HOME/bin/ratfor77 does not. Note added Jan 22, 2020 Contrary to the last note there is no $HOME/bin/ratfor* but I've installed ratfor90 in /usr/local/bin and this might produce something workable. Not yet really tested seriously, but those ugly line numbers are gone, at least. Note added November 8 2020 I've installed a new ratfor executable in my mac mini bin directory. It is generated from Brian Gaeke's C distribution ratfor-1.05. And seems to work well; i.e. produces .f files that compile with gfortran -c with only a couple of warnings about legacy syntax. The good news is that these warnings are emitted only for the rqbr.f code produced from rqbr.r, for which my handedited rqbr.f version still passes R CMD check. This was reported to Brian and he suggested flags that could be used to quell the emissions, but this didn't seem a.) very practical, or b.) very necessary. I've put links to Brian G's code for ratfor and to Brian K's BTL memo describing ratfor on my reproducibility webpage. So for the foreseeable, we are ok on the ratfor front, including for the new subroutines pfnb.r and qfnb.r. To reiterate, all the ratfor in this directory, with the exception of rqbr.r is used to generate the fortran in the src directory above. quantreg/src/ratfor/rls.r0000644000176200001440000000115513777107521015163 0ustar liggesusers#This is a simple recursive least squares routine Reference: Harvey TSM p. 100 # subroutine rls(n,p,x,y,b,A,Ax) integer n,p double precision x(p,n),y(n),b(p,n),A(p,p),Ax(p) double precision zero,one,mone,f,r,ddot data one/1.d0/ data mone/-1.d0/ data zero/0.d0/ # #On input: # # A = crossprod(x[1:p,1:p))^{-1} # b(,p) = A crossprod(x[1:p,1:p],y[1:p]) # do i = (p+1),n { call dgemv('N',p,p,one,A,p,x(1,i),1,zero,Ax,1) f = one + ddot(p,x(1,i),1,Ax,1) r = (y(i)-ddot(p,x(1,i),1,b(1,i-1),1))/f call daxpy(p,one,b(1,i-1),1,b(1,i),1) call daxpy(p,r,Ax,1,b(1,i),1) call dger(p,p,mone/f,Ax,1,Ax,1,A,p) } return end quantreg/src/ratfor/powell.r0000644000176200001440000000564213777105403015667 0ustar liggesusers# Revised Version of Fitzenberger's Steepest Descent Algorithm for the Powell Estimator # # Roger Koenker: last revision: 6 February 2008 # # Problem: || min{Ax,c} - b ||_tau = min! # subroutine powell(n,p,p2,A,b,c,x,tau,h,f,U,s,g,d,xh,maxit,nflag) integer n,p,p2 double precision x(p),A(n,p),b(n),c(n) double precision f(n),U(p,p),s(n),g(p2),d(p),xh(p) double precision zero, one, mone, step, tau,pow integer h(p),hin,hout,k,it,inset,maxit,nflag PARAMETER(zero = 0.0d0, one = 1.d0, mone = -1.d0) it = 0 repeat { it = it + 1 if(it > 1) # Otherwise, assume U is A(h)^{-1} call pivot(n,p,h,hin,hout,A,U,d,xh,nflag) if(nflag > 0) {nflag = nflag + 2; return} do i = 1,p{ xh(i) = b(h(i)) } call dgemv('N',p,p,one,U,p,xh,1,zero,x,1) call dgemv('N',n,p,one,A,n,x,1,zero,f,1) do i = 1,n{ if(inset(p,i,h) > 0 | f(i) > c(i)) s(i) = zero else if(b(i) < f(i)) s(i) = one - tau else s(i) = - tau } call dgemv('T',n,p,one,A,n,s,1,zero,xh,1) call dgemv('T',p,p,one,U,p,xh,1,zero,g,1) do i = 1,p { if(f(h(i)) < c(h(i))) if(b(h(i)) < c(h(i))) g(i + p) = - g(i) + one - tau else g(i + p) = - g(i) - tau else g(i + p) = - g(i) + tau g(i) = g(i) + one - tau } k = idmin(p2,g,1) if(g(k) >= 0 | it > maxit) break call dscal(p,zero,d,1) if(k <= p) call daxpy(p,one,U(1,k),1,d,1) else{ k = k - p call daxpy(p,mone,U(1,k),1,d,1) } call dgemv('N',n,p,one,A,n,d,1,zero,s,1) do i = 1,n { call dcopy(p,x,1,xh,1) step = (b(i) - f(i))/s(i) call daxpy(p,step,d,1,xh,1) s(i) = pow(n,p,xh,A,b,c,tau) } hin = idmin(n,s,1) if(inset(p,hin,h) > 0) {nflag = 2; break} hout = h(k) } if(it > maxit) nflag = 1 return end ##################################################### subroutine pivot(n,p,h,hin,hout,A,B,u,v,eflag) integer n,p,h(p),hin,hout,inset,k,eflag double precision A(n,p),B(p,p),u(p),v(p) double precision zero,one PARAMETER(zero = 0.d0, one = 1.d0) eflag = 0 k = inset(p,hout,h) if(k == 0) {eflag = 1; return} if(inset(p,hin,h) > 0) {eflag = 2; return} if(hin < 1 | hin > n) {eflag = 3; return} call dcopy(p,A(hin,1),n,v,1) call dgemv('T',p,p,one,B,p,v,1,zero,u,1) call dcopy(p,B(1,k),1,v,1) do j = 1,p{ do i = 1,p{ if(j == k) B(i,j) = B(i,j)/u(k) else B(i,j) = B(i,j) - (u(j)/u(k)) * v(i) } } h(k) = hin return end ##################################################### integer function inset(p,k,h) integer p,k,h(p) do inset = 1,p{ if(h(inset) == k) return } inset = 0 return end ##################################################### double precision function pow(n,p,x,A,b,c,tau) integer n,p double precision x(p),A(n,p),b(n),c(n) double precision tau,u,zero,rho,fit,ddot PARAMETER(zero= 0.d0) pow = zero do i = 1,n{ fit = ddot(p,A(i,1),n,x,1) u = b(i) - min(fit,c(i)) pow = pow + rho(u, tau) } return end ##################################################### double precision function rho(u,tau) double precision u,tau,one PARAMETER(one = 1.d0) if(u < 0) rho = u * (tau - one) else rho = u * tau return end quantreg/src/ratfor/qselect.r0000644000176200001440000000222114470134306016006 0ustar liggesusers#function to compute qth quantile of a sample of n observations subroutine qselect(n,x,q) integer n,k,l,r double precision x(n),q k=nint(q*n) l=1 r=n call select(n,x,l,r,k) q=x(k) return end #This is a ratfor implementation of the floyd-rivest algorithm--SELECT #Reference: CACM 1975, alg #489, p173, algol-68 version #Translation by Roger Koenker August, 1996. #As originally proposed mmax=600, and cs=cd=.5 #Calls blas routine dswap recursive subroutine select(n,x,l,r,k) integer n,m,l,r,k,ll,rr,i,j,mmax double precision x(n),z,s,d,t,fm,cs,cd parameter(cs = 0.5d0) parameter(cd = 0.5d0) parameter(mmax = 600) while(r>l){ if(r-l>mmax){ m=r-l+1 i=k-l+1 fm = dble(m) z=log(fm) s=cs*exp(2*z/3) d=cd*sqrt(z*s*(m-s)/fm)*sign(1,i-m/2) ll=max(l,nint(k-i*s/fm + d)) rr=min(r,nint(k+(m-i)*s/fm + d)) call select(n,x,ll,rr,k) } t=x(k) i=l j=r call dswap(1,x(l),1,x(k),1) if(x(r)>t)call dswap(1,x(r),1,x(l),1) while(it)j=j-1 } if(x(l)==t) call dswap(1,x(l),1,x(j),1) else{ j=j+1 call dswap(1,x(j),1,x(r),1) } if(j<=k)l=j+1 if(k<=j)r=j-1 } return end quantreg/src/ratfor/sakj.r0000644000176200001440000000676414001520444015306 0ustar liggesuserssubroutine sakj(x,z,p,iker,dens,psi,score,nx,nz,h,alpha,kappa,xlam) # univariate kernel density-score estimator # the algorithm is basically from Silverman as adapted for Portnoy and Koenker # Annals paper on adaptive L-estimation in regression. # x--pts used for centers of kernel assumed to be sorted!!!! # z--pts at which density is calculated # p--probability associated with x's # dens--f(z), the densities at z # psi--f'(z)/f(z) the score at z # score--(log(f(z)))'', the J fn at z # nx--number of pts in x # nz--number of pts in z # iker--kernel # 0=gaussian # 1=cauchy # h--initial window size (overall)--choose zero for default # kappa--constant determining initial (default) window width # xlam--Silverman's lambda, window adjustment for each x double precision dens(nz),score(nz),psi(nz),h,kappa,con1 double precision z(nz),x(nx),xlam(nx),p(nx),qrange,pi,four double precision con1,sum,sqsum,xsd,a,fifth,hinv,half,g,ginv double precision xn,xker,dxker,ddxker,fact,xponen,alpha,glog,zero,one,two parameter( zero = 0.d0) parameter( one = 1.d0) parameter( two = 2.d0) parameter( four = 4.d0) parameter( half = 0.5d0) parameter( fifth = 0.2d0) parameter( pi = 3.141593d0) xn=nx # call srtad(x,1,nx) # port sort routine now done in S interface. if(iker==0) con1=one/sqrt(2.0*pi) else if(iker==1) con1=one/pi # if no h is provided, calculate a default if(h<=0.) { sum=0. sqsum=0. do i=1,nx { sqsum=sqsum+x(i)*x(i)*p(i) sum=sum+x(i)*p(i) } xsd=dsqrt(sqsum-sum*sum) sum=zero for(i=1;i0;i=i-1) { sum=sum-p(i) if(sum>.75) next else { qrange=x(i)-qrange;break } } a=min(xsd,qrange/1.34) h=kappa*a/(xn**fifth) # see Silverman p 48 } hinv=one/h # Stage one: compute pilot estimate of density do j=1,nx { xker=0. if(iker==0) { do i=1,nx { xponen=(x(j)-x(i))*hinv xponen=half*xponen**2 xker=xker+p(i)*exp(-xponen)*hinv } } else if(iker==1) { do i=1,nx { xponen=(x(j)-x(i))*hinv xker=xker+p(i)*hinv/(1+xponen**2) } } xlam(j)=con1*xker } # Stage two: Automatic window widths (Silverman p101) glog=zero do i=1,nx { glog=glog+p(i)*log(xlam(i))} g=exp(glog) ginv=one/g do i=1,nx { xlam(i)=hinv/((xlam(i)*ginv)**(-alpha)) } # notice xlam no longer its own self at this pt! xlam is 1/(h*lambda(i)) # substitution of * for / thus achieved speeds things up # Stage two: new density-score estimates do j=1,nz { xker=zero dxker=zero ddxker=zero if(iker==0) { # gaussian kernel do i=1,nx { xponen=(z(j)-x(i))*xlam(i) fact=exp(-half*xponen*xponen)*xlam(i) xker=xker+p(i)*fact dxker=dxker-p(i)*fact*xponen*xlam(i) ddxker=ddxker- p(i)*fact*(one - xponen**2)*xlam(i)**2 } } else if(iker==1) { # cauchy kernel do i=1,nx { xponen=(z(j)-x(i))*xlam(i) fact=xlam(i)/(one+xponen**2) xker=xker+p(i)*fact dxker=dxker-p(i)*two*xponen*fact**2 ddxker=ddxker- p(i)*two*(fact**2)*(xlam(i)- four*(xponen**2)*fact) } } dens(j)=con1*xker psi(j)=-(dxker/xker) score(j)=(dxker/xker)**2-ddxker/xker } return end quantreg/src/ratfor/rqbr.r0000644000176200001440000003364313522271236015331 0ustar liggesusers# This is a special version of K-dO rq modified to compute the LR process # Note that the sol array is now p+3 by J and the third row contains the # value of the objective function at the tau specified in row one. # # This software is in the public domain and may be freely # used and redistributed for non-commercial purposes. No guarantees # are offered or implied. comments, bug reports, etc are welcome # and should be sent to roger@ysidro.econ.uiuc.edu or to # # roger koenker # department of economics # university of illinois # champaign, illinois, 61820 # # subroutine rqbr(m,nn,m5,n3,n4,a,b,t,toler,ift,x,e,s,wa,wb,nsol,ndsol,sol,dsol,lsol,h,qn,cutoff,ci,tnmat,big,lci1) # # m = number of observations # n = number of parameters # m5 = m+5 # n3 = n+3 # n4 = n+4 # a is the x matrix # b is the y vector # t, the desired quantile # toler, smallest detectable |x-y|/x machine precision to the 2/3 # ift exit code: # 0-ok # else dimensions inconsistent see below # x the parameter estimate betahat # e is the residual vector # s is an integer work array # wa is a real work array # wb is another real work array # nsol is an estimated (row) dimension of the primal solution array say 3*m; minimum value = 2 # ndsol is an estimated (row) dimension of the dual solution array say 3*m; minimum value = 2 # sol is the primal solution array # dsol is the dual solution arry # lsol is the actual dimension of the solution arrays # h is the matrix of basic observations indices # qn is the vector of residuals variances from the projection of each column of the x matrix on the remaining columns # cutoff, the critical point for N(0,1) # ci is the matrix of confidence intervals # tnmat is the matrix of the JGPK rank test statistics # big, large positive finite floating-point number # utilization: if you just want a solution at a single quantile you # neednt bother with sol, nsol, etc, if you want all the solutions # then set theta to something <0 and sol and dsol will return all the # estimated quantile solutions. # the algorithm is a slightly modified version of algorithm as 229 # described in koenker and dorey, computing regression quantiles, # applied statistics, pp. 383-393. # integer i,j,k,kl,kount,kr,l,lsol,m,m1,m2,m3,m4,m5,ift integer n,n1,n2,n3,nsol,ndsol,out,s(m),h(nn,nsol) integer nn,n4,idxcf logical stage,test,init,iend,lup logical lci1,lci2,skip double precision a1,aux,b1,big,d,dif,pivot,smax,t,t0,t1,tnt,dk double precision min,max,toler,zero,half,one,two double precision b(m),sol(n3,nsol),a(m,nn),x(nn),wa(m5,n4),wb(m) double precision sum,e(m),dsol(m,ndsol) double precision qn(nn),cutoff,ci(4,nn),tnmat(4,nn),tnew,told,tn parameter( zero = 0.d0) parameter( one = 1.d0) parameter( two = 2.d0) # # check dimension parameters # n=nn ift = 0 wa(m+2,nn+1) = one if (m5!=m+5) ift = 3 if (n3!=n+3) ift = 4 if (n4!=n+4) ift = 5 if (m<=zero||n<=zero) ift = 6 if (ift<=two) { # # initialization # half = one/two iend = .true. lci2 = .false. lup = .true. skip = .false. idxcf = 0 tnew = zero tn = zero m1 = m+1 n1 = n+1 n2 = n+2 m2 = m+2 m3 = m+3 m4 = m+4 do j = 1,n{ x(j) = zero } do i = 1,m e(i) = zero if (tone) { t0 = one/(two*float(m)) t1 = one-t0 t = t0 iend = .false. lci1 = .false. } repeat { #0 do i = 1,m { k = 1 do j = 1,nn if (k<=nn){ if(j==idxcf) skip = .true. else skip = .false. if(!skip){ wa(i,k) = a(i,j) k = k+1 } } wa(i,n4) = n+i wa(i,n2) = b(i) if (idxcf != 0) wa(i,n3) = tnew*a(i,idxcf) else wa(i,n3) = zero wa(i,n1) = wa(i,n2)-wa(i,n3) if (wa(i,n1)(-two)) next 1 d = -d-two } if (d>max) { max = d in = j } } if (max<=toler) break 2 if (wa(m1,in)<=zero) { do i = 1,m4 wa(i,in) = -wa(i,in) wa(m1,in) = wa(m1,in)-two wa(m2,in) = wa(m2,in)-two } repeat { #4 # # determine the vector to leave the basis # k = 0 do i = kl,m { d = wa(i,in) if (d>toler) { k = k+1 wb(k) = wa(i,n1)/d s(k) = i test = .true. } } repeat { #5 if (k<=0) test = .false. else { min = big do i = 1,k if (wb(i)max) { max = d in = j } } if (wa(m1,in)zero) dsol(kd,lsol) = one } if (!lci2){ sol(1,lsol) = smax sol(2,lsol) = sum sum = zero do j=kl,m{ d = wa(j,n1)*sign(one,wa(j,n4)) sum = sum + d*(smax + half*(sign(one,d) - one)) } sol(3,lsol) = sum do i=1,m dsol(i,lsol+1) = dsol(i,lsol) } if (lci2){ # compute next theta a1 = zero do i = 1,m { a1 = a1+a(i,idxcf)*(dsol(i,lsol)+t-one) } tn = a1/sqrt(qn(idxcf)*t*(one-t)) if (abs(tn)tnew) if (tntsmax){ smax = tnt out = i } } } if (lup){ told = tnew tnew = smax + toler ci(3,idxcf) = told - toler tnmat(3,idxcf) = tn if (!(tnew < big-toler)){ ci(3,idxcf) = big ci(4,idxcf) = big tnmat(3,idxcf) = tn tnmat(4,idxcf) = tn lup = .false. go to 70 } } else{ told = tnew tnew = smax - toler ci(2,idxcf) = told + toler tnmat(2,idxcf) = tn if (!(tnew > -big+toler)){ ci(2,idxcf) = -big ci(1,idxcf) = -big tnmat(2,idxcf) = tn tnmat(1,idxcf) = tn lup = .true. go to 60 } } #update the new marginal cost do i = 1,m{ wa(i,n3) = wa(i,n3)/told*tnew wa(i,n1) = wa(i,n2) - wa(i,n3) } do j = kr,n3{ d = wa(out,j) wa(m1,j) = wa(m1,j) -d -d wa(m2,j) = wa(m2,j) -d -d wa(out,j) = -d } wa(out,n4) = -wa(out,n4) init = .true. } else{ if (lup){ ci(4,idxcf) = tnew - toler tnmat(4,idxcf) = tn lup = .false. go to 70 } else{ ci(1,idxcf) = tnew + toler tnmat(1,idxcf) = tn lup = .true. go to 60 } } } if ((iend)&&(!lci2)) go to 40 if (!lci2){ init = .true. lsol = lsol+1 do i = 1,m s(i) = zero do j = 1,n x(j) = zero # # compute next t # smax = two do j = 1,n { b1 = wa(m3,j) a1 = (-two-wa(m2,j))/b1 b1 = -wa(m2,j)/b1 if (a1>=t) if (a1t) if (b1=t1+toler) iend = .true. t = tnt if (iend) t = t1 } } #1 wa(m2,nn+1) = two ift = 2 go to 50 40 if (lsol>2) { sol(1,1) = zero #sol(2,1) = zero sol(3,1) = zero sol(1,lsol) = one #sol(2,lsol) = zero sol(3,lsol) = zero do i = 1,m { dsol(i,1) = one dsol(i,lsol) = zero dsol(i,lsol+1) = zero } } l = kl-1 do i = 1,l if (wa(i,n1)nn){ break 1 } 70 if (lup){ tnew = x(idxcf)+toler told = tnew ci(3,idxcf) = x(idxcf) tnmat(3,idxcf) = zero } else{ tnew = x(idxcf)-toler told = tnew ci(2,idxcf) = x(idxcf) tnmat(2,idxcf) = zero } } } #0 # restore the original value of dual when ci is true do i=1,m dsol(i,lsol) = dsol(i,lsol+1) } return end quantreg/src/ratfor/rqs.r0000644000176200001440000000046211612366270015162 0ustar liggesusers# Wrapper for rq solutions with multiple y's subroutine rqs(m,n,k,m5,n2,a,b,tau,toler,ift,x,e,s,wa,wb) double precision b(m,k),a(m,n),x(n,k),e(m),wa(m5,n2),wb(m) double precision tau,toler integer s(m),m,n,k,m5,n2,ift(k) do i=1,k call rq0(m,n,m5,n2,a,b(1,i),tau,toler,ift(i),x(1,i),e,s,wa,wb) return end quantreg/src/ratfor/grexp.r0000644000176200001440000000021713761210370015474 0ustar liggesusers subroutine grexp(n, x, a) integer i,n double precision x(n),a call fseedi() do i = 1,n call frexp(x(i), a) call fseedo() return end quantreg/src/ratfor/kuantiles.r0000644000176200001440000000051613752203127016352 0ustar liggesusers# Wrapper to compute several quantiles of a sample of n observations # Calls K.C. Kiwiel's version of Floyd and Rivest's select algorithm # Caveat Emptor!! The ks need to be sorted. subroutine kuantiles(k,m,n,x) integer i,j,k(m),m,n double precision x(n) j = 0 do i = 1,m{ call dsel05(k(i)-j,n-j,x(j+1)) j = k(i) } return end quantreg/src/ratfor/combos.r0000644000176200001440000000260112762350710015633 0ustar liggesusers# Subroutine to list the r choose n subsets of {1,2,...,r} in an order such that # adjacent subsets have only one element swapped. Algorithm modeled on the pascal # algorithm of Limin Xiang and Kazuo Ushijima (2001) "On O(1) Time Algorithms for # Combinatorial Generation," Computer Journal, 44(4), 292-302. # http://comjnl.oxfordjournals.org/cgi/reprint/44/4/292 # Translated into ratfor: 12 February, 2008 R. Koenker. subroutine combin(r,n,m,a,c,e,Last) integer r,n,m,t,k,j,M0,Mj,s integer A(n,m),c(r),e(r),Last(r) logical odd M0 = r-n t = n+1 k = 1 j = 0 c(1) = 0 repeat{ j = j + 1 c(j) = j e(j) = j - 1 if(odd(j)) Last(j) = M0 + j else Last(j) = j + 1 if(j == n) break } do i = 1,n A(i,1) = c(i) if(n < r) { repeat { k = k + 1 S = c(j) Mj = M0 + j e(n+1) = n if(odd(j)){ if(c(j) == Mj) { c(j) = c(j-1) + 1 Last(j+1) = c(j) + 1 } else c(j) = c(j) + 1 } else { if(c(j) == c(j-1) + 1) c(j) = Mj else { Last(j+1) = c(j) c(j) = c(j) - 1 } } if(c(j) == Last(j)) { Last(j) = S e(j+1) = e(j) e(j) = j-1 } if( (j < n) & (c(j) == Mj)) { t = j j = e(t+1) e(t+1) = t } else { if(t == j) t = t + 1 if(t < e(n+1)) j = t else j = e(n+1) } do i = 1,n A(i,k) = c(i) if(j == 0) break } } return end logical function odd(j) integer j odd = (mod(j,2) == 1) return end quantreg/src/ratfor/brute.r0000644000176200001440000000215111555564235015502 0ustar liggesusers# New Version of Brute Force Algorithm for the Powell Estimator # # Roger Koenker: last revision: 12 February 2008 # # Problem: || min{Ax,c} - b ||_tau = min! # # The matrix H is p by m matrix of the n choose p basis indices h on input. # When called it is assumed (!!) that U = A[H[,1],]^{-1} and xh = U b[H[,1]]. subroutine brutpow(n,p,m,H,A,b,c,x,tau,U,xh,d,jminz,nflag) integer n,p,m double precision x(p),A(n,p),b(n),c(n) double precision U(p,p),d(p),xh(p) double precision zero, one,tau,pow,minz,z integer H(p,m),k,findk,jminz,nflag PARAMETER(zero = 0.0d0, one = 1.d0) jminz = 1 minz = pow(n,p,x,A,b,c,tau) do j = 2,m { k = findk(p,H(1,j),H(1,j-1)) if(k == 0) {nflag = 4; return} call pivot(n,p,H(1,j-1),H(k,j),H(k,j-1),A,U,d,xh,nflag) if(nflag > 0) return do i = 1,p{ xh(i) = b(H(i,j)) } call dgemv('N',p,p,one,U,p,xh,1,zero,x,1) z = pow(n,p,x,A,b,c,tau) if(z < minz) { minz = z jminz = j } } return end ##################################################### integer function findk(p,h,g) integer p,k,h(p),g(p) findk = 0 do k = 1,p{ if(h(k) != g(k)) {findk = k; break} } return end quantreg/src/ratfor/rqfnc.r0000644000176200001440000001573214470134447015500 0ustar liggesuserssubroutine rqfnc(n1,n2,p,a1,y,a2,r,rhs,d1,d2,u,beta,eps,wn1,wn2,wp,nit,info) integer n1,n2,p,info,nit(3) double precision a1(p,n1),a2(p,n2),y(n1),r(n2),rhs(p),d1(n1),d2(n2),u(n1) double precision wn1(n1,9),wn2(n2,6),wp(p,p+3) double precision one,beta,eps parameter(one = 1.0d0) call lpfnc(n1,n2,p,a1,y,a2,r,rhs,d1,d2,u,beta,eps,wn1(1,1),wn2(1,1),wn1(1,2), wp(1,1),wn1(1,3),wn2(1,2),wn1(1,4),wn1(1,5),wn2(1,3),wn1(1,6), wp(1,2),wn1(1,7),wn2(1,4),wn1(1,8),wn1(1,9),wn2(1,5),wn2(1,6), wp(1,3),wp(1,4),nit,info) return end # This is a revised form of the primal-dual log barrier form of the # interior point LP solver based on Lustig, Marsten and Shanno ORSA J Opt 1992. # It generalizes rqfnb and lpfnb to accomodate inequality constraints # It is a projected Newton primal-dual logarithmic barrier method which uses # the predictor-corrector approach of Mehrotra for the mu steps. # For the sake of brevity we will call it a Frisch-Newton algorithm. # Problem: # min c1'x1 + c2'x2 s.t. A1x1 + A2x2 = b, 0<=x1<=u, 0<=x2 # # Denote dx1,dx2,dy,dw,ds,dz1,dz2 as the steps for x1,x2,y,w,s,z1,z2 # subroutine lpfnc(n1,n2,p,a1,c1,a2,c2,b,d1,d2,u,beta,eps,x1,x2,s, y,z1,z2,w,dx1,dx2,ds,dy,dz1,dz2,dw,dr1,dr2,r2, rhs,ada,nit,info) integer n1,p,i,info,nit(3),maxit double precision a1(p,n1),a2(p,n2),c1(n1),c2(n2),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dxdz1,dxdz2,dsdw double precision deltap,deltad,beta,eps,mu,gap,g double precision x1(n1),x2(n2),u(n1),s(n1),y(p),z1(n1),z2(n2),w(n1) double precision d1(n1),d2(n2),rhs(p),ada(p,p) double precision dx1(n1),dx2(n2),ds(n1),dy(p),dz1(n1),dz2(n2),dw(n1) double precision dr1(n1),dr2(n2),r2(n2) parameter(zero = 0.0d0) parameter(one = 1.0d0) parameter(mone = -1.0d0) parameter(big = 1.0d+20) parameter(maxit = 500) # Initialization: We try to follow the notation of LMS # On input we require: # # c1 = n1-vector of marginal costs (-y in the rq problem) # a1 = p by n1 matrix of equality constraints (x' in rq) # c2 = n2-vector of marginal costs (-r in the rq problem) # a2 = p by n2 matrix of inequality constraints (R' in rq) # b = p-vector of rhs ((1-tau)x'e in rq) # u = upper bound vector ( 1_p in rq) # beta = barrier parameter, LMS recommend .99995 # eps = convergence tolerance, LMS recommend 10d-8 # # the integer vector nit returns iteration counts # the integer info contains an error code from the Cholesky in stepy # info = 0 is fine # info < 0 invalid argument to dposv # info > 0 singular matrix nit(1)=0 nit(2)=0 nit(3)=n1 # Start at the OLS estimate for the dual vector y call dgemv('N',p,n1,one,a1,p,c1,1,zero,y,1) do i=1,n1 d1(i)=one do i=1,n2{ d2(i)=zero z2(i)=one } call stepy2(n1,n2,p,a1,d1,a2,d2,y,ada,info) if(info != 0) return # put current residual vector r1 in s (temporarily) call dcopy(n1,c1,1,s,1) call dgemv('T',p,n1,mone,a1,p,y,1,one,s,1) # Initialize remaining variables do i=1,n1{ if(dabs(s(i)) < eps){ z1(i)=dmax1(s(i),zero)+eps w(i)=dmax1(-s(i),zero)+eps } else { z1(i)=dmax1(s(i),zero) w(i)=dmax1(-s(i),zero) } s(i)=u(i)-x1(i) } gap = ddot(n1,z1,1,x1,1)+ddot(n2,z2,1,x2,1)+ddot(n1,w,1,s,1) # # Main Loop # while(gap > eps && nit(1) qk(2)) shi(i) = 1 } while (notopt) { ifix = ifix + 1 call dphil(p,zero,glob) call dphil(p,zero,ghib) call dphil(n,one,d) call dphil(n,one,u) k = 0 do i = 1,n{ if(slo(i) == 0 & shi(i) == 0){ k = k + 1 call dphil(p,zero,aa(1,k)) call daxpy(p,w(i),a(1,i),1,aa(1,k),1) yy(k) = -y(i)*w(i) } else if (slo(i) == 1) { do j = 1,p glob(j) = glob(j) + a(j,i) * w(i) } else if (shi(i) == 1) { do j = 1,p ghib(j) = ghib(j) + a(j,i) * w(i) } } call dcopy(p,glob,1,aa(1,k+1),1) call dcopy(p,ghib,1,aa(1,k+2),1) yy(k+1) = big yy(k+2) = -big call dgemv('N',p,k+2,one-tau,aa,p,d,1,zero,rhs,1) call dscal(k+2,zero,wn,1) call daxpy(k+2,one-tau,u,1,wn,1) call rqfnb(k+2,p,aa,yy,rhs,d,u,beta,eps,wn,wp,nit(1,ir),info(ir)) call dcopy(p,wp,1,b(1,ir),1) call dcopy(n,y,1,u,1) call dgemv('T',p,n,one,a,p,b(1,ir),1,one,u,1) # Check predicted signs of residuals (in u) sumbad = 0 do i = 1,n { if((u(i) > 0) & slo(i) == 1){ slo(i) = 0 sumbad = sumbad + 1 } if((u(i) < 0) & shi(i) == 1){ shi(i) = 0 sumbad = sumbad + 1 } } if(sumbad > 0) { if (sumbad > 0.1 * nn) { nn = min(2 * nn, n) break } } else notopt = .false. } nit(4,ir) = ifix nit(5,ir) = ibad } } return end quantreg/src/ratfor/crqfnb.r0000644000176200001440000000274211555564235015642 0ustar liggesusers# Peng-Huang Censored Quantile Regression subroutine crqfnb(n,p,a1,c1,n1,X,y,c,B,g,m,r,s,d,u,wn,wp,info) # Input # a1 = p by n1 design matrix (X[c,] transposed) # c1 = n1 response vector -y[c] # X = n by p design matrix # y = n response vector # c = n censoring indicator # g = m grid vector of taus # d = residual n-vector, initialized == 1 # s = initialized cumhaz vector (rep(0,n)) # u = upper bound n-vector, initalized == 1 # Workspace # r = rhs p-vector # wn = work array n1 by 9 # wp = work array p by p+3 # Output # B = p by m matrix of estimated coefficients # m = final column dimension of of B # Note # d is used both for residuals and as a work vector for rqfnb. # u needs to be reinitialized to ones at each iteration integer n,p,n1,m,info,nit(3) double precision a1(p,n1),c1(n),X(n,p),y(n),c(n),B(p,m),g(m) double precision wn(n1,9),wp(p,p+3),r(p),s(n),d(n),u(n) double precision zero,half,one,beta,eps,dH parameter( zero = 0.0d0) parameter( half = 0.5d0) parameter( one = 1.0d0) parameter( beta = 0.99995d0) parameter( eps = 1.0d-8) do k = 2,m { dH = -log(one - g(k)) + log(one - g(k-1)) do i = 1,n { u(i) = one wn(i,1) = half # initialize dual vector if(d(i) >= zero) s(i) = s(i) + dH d(i) = c(i) - s(i) } call dgemv('T',n,p,one,X,n,d,1,zero,r,1) call rqfnb(n1,p,a1,c1,r,d,u,beta,eps,wn,wp,nit,info) if(info != 0) break call dcopy(p,wp,1,B(1,k-1),1) call dcopy(n,y,1,d,1) call dgemv('N',n,p,one,X,n,B(1,k-1),1,one,d,1) } m = k-1 return end quantreg/src/ratfor/penalty.r0000644000176200001440000000740711555564235016046 0ustar liggesusers# Routines to compute the X contribution of the total variation penalty term # Given a Delaunay triangulation structure as provided by tripack # Written in the nearly extinct ratfor language of the lost tribe of Murray Hill # With luck it can be translated into the dreaded fortran understood by g77. # Roger Koenker: Last Modified October 29, 2002. # The subroutines employ the Renka tripack library and strongly rely on # the counterclockwise ordering of the elements in the adjacency list. # the vector bnd is used to identify and neglect edges on the boundary # In future versions one might want to have the option of making some other # provisions for these edges. subroutine penalty(n,m,q,x,y,bnd,tlist,tlptr,tlend,rax,jax,ned,eps,ierr) integer n,m,q,lp,lpl,ned,ierr integer bnd(n),tlist(q),tlptr(q),tlend(n),n4(4),p4(4),jax(m) double precision x(n),y(n),rax(m),eps double precision x4(4),y4(4),g4(4) logical orient #loop over the vertices: i is index of one end of the edge j is the other end ned = 0 do i=1,n{ lpl = tlend(i) lp = lpl repeat{ lp = tlptr(lp) j = iabs(tlist(lp)) if(j > i){ n4(1) = i n4(2) = j call fadjs(n4,n,q,tlist,tlptr,tlend) if(bnd(i)*bnd(j) == 0){ ned = ned + 1 do k = 1,4{ x4(k) = x(n4(k)) y4(k) = y(n4(k)) } if(orient(x4,y4)){ call iswap(1,n4(3),1,n4(4),1) call dswap(1,x4(3),1,x4(4),1) call dswap(1,y4(3),1,y4(4),1) } call ggap(x4,y4,g4,eps,ierr) if(ierr == 1) return call srtpai(n4,1,p4,1,4) do k = 1,4{ rax((ned - 1)*4 + k) = g4(p4(k)) jax((ned - 1)*4 + k) = n4(p4(k)) } if(ned*4 > m) return } } if(lp == lpl) break } } return end logical function orient(x,y) double precision x(4), y(4) orient = (y(2) -y(1))*(x(3)-x(4))+(x(1)-x(2))*(y(3)-y(4)) > 0 return end subroutine fadjs(n4,n,q,tlist,tlptr,tlend) # Subroutine to find matching adjacent vertices for the triogram edges # On input: # n4[1:2] contain the indices of the edge of interest # tlist,tlptr,tlendd is the (tripack) structure describing the triangulation # On output: # n4[3:4] contains indices of the two adjacent vertices # # Adjacency tlist is in counter-clockwise order so we want to find the two # vertices that are immediately above and below n1 in the n0 tlist # # Roger Koenker June 4, 2002 # integer n,q,vp,vpl,v,v0,match integer n4(4),tlist(q),tlptr(q),tlend(n) # Check whether edge is on the boundary match = 0 vpl = tlend(n4(1)) vp = vpl k = 0 repeat{ k = k+1 vp = tlptr(vp) v = tlist(vp) if(k>1 & iabs(v) == n4(2)){ n4(3) = iabs(v0) match = 1 next } if(match > 0){ n4(4) = iabs(v) break } v0 = v } return end subroutine ggap(x,y,g,eps,ierr) double precision x(4),y(4),g(4),w(2,4),h(2),D1,D2,eps # Triogram package: Roger Koenker June 4, 2002 # given four (x,y) pairs for an edge compute contribution to the penalty # ierr returns 1 if the edge is degenerate, ie either determinant is 0. D1 = -x(2) * y(1) + x(3) * y(1) + x(1) * y(2) - x(3) * y(2) - x(1) * y(3) + x(2) * y(3) D2 = -x(2) * y(1) + x(4) * y(1) + x(1) * y(2) - x(4) * y(2) - x(1) * y(4) + x(2) * y(4) if(dabs(D1) < eps | dabs(D2) < eps) { ierr = 1 return } h(1) = -(y(1) - y(2)) h(2) = (x(1) - x(2)) w(1, 1) = (y(2) - y(3))/D1 - (y(2) - y(4))/D2 w(2, 1) = (x(3) - x(2))/D1 - (x(4) - x(2))/D2 w(1, 2) = (y(3) - y(1))/D1 - (y(4) - y(1))/D2 w(2, 2) = (x(1) - x(3))/D1 - (x(1) - x(4))/D2 w(1, 3) = (y(1) - y(2))/D1 w(2, 3) = (x(2) - x(1))/D1 w(1, 4) = (y(2) - y(1))/D2 w(2, 4) = (x(1) - x(2))/D2 do i = 1,4{ g(i) = h(1)*w(1,i)+h(2)*w(2,i) } ierr = 0 return end quantreg/src/ratfor/rqfn.r0000644000176200001440000001501214470134353015320 0ustar liggesusers# This is a primal-dual log barrier form of the # interior point LP solver of Lustig, Marsten and Shanno ORSA J Opt 1992. # It is a projected Newton primal-dual logarithmic barrier method which uses # the predictor-corrector approach of Mehrotra for the mu steps. # For the sake of brevity we will call it a Frisch-Newton algorithm. # The primary difference between this code and the previous version fna.r is # that we assume a feasible starting point so p,d,b feasibility gaps = 0. # Problem: # min c'x s.t. Ax=b, 0<=x<=u # # The linear system we are trying to solve at each interation is: # Adx = 0 # dx + ds = 0 # A'dy -dw +dz = 0 # Xdz + Zdx = me - XZe - DXDZe # Sdw + Wds = me - SWe - DSDWe # But the algorithm proceeds in two steps the first of which is to solve: # Adx = 0 # dx + ds = 0 # A'dy -dw +dz = 0 # Xdz + Zdx = - XZe # Sdw + Wds = - SWe # and then to make some refinement of mu and modify the implied Newton step. # Denote dx,dy,dw,ds,dz as the steps for the respective variables x,y,w,s,z, and # the corresponding upper case letters are the diagonal matrices respectively. # # To illustrate the use of the function we include a calling routine to # compute solutions to the linear quantile regression estimation problem. # See the associated S function rqfn for details on the calling sequence. # On input: # a is the p by n matrix X' # y is the n-vector of responses # u is the n-vector of upper bounds # d is an n-vector of ones # wn is an n-vector of ones in the first n elements # beta is a scaling constant, conventionally .99995 # eps is a convergence tolerance, conventionally 1d-07 # On output: # a,y are unaltered # wp contains the solution coefficient vector in the first p elements # wn contains the residual vector in the first n elements # # subroutine rqfn(n,p,a,y,rhs,d,u,beta,eps,wn,wp,aa,nit,info) integer n,p,info,nit(3) double precision a(p,n),y(n),rhs(p),d(n),u(n),wn(n,10),wp(p,p+3),aa(p,p) double precision one,beta,eps parameter( one = 1.0d0) call fna(n,p,a,y,rhs,d,u,beta,eps,wn(1,1),wn(1,2), wp(1,1),wn(1,3),wn(1,4),wn(1,5), wn(1,6), wp(1,2),wn(1,7),wn(1,8),wn(1,9),wn(1,10),wp(1,3), wp(1,4),aa,nit,info) return end subroutine fna(n,p,a,c,b,d,u,beta,eps,x,s,y,z,w, dx,ds,dy,dz,dw,dsdw,dxdz,rhs,ada,aa,nit,info) integer n,p,pp,i,info,nit(3) double precision a(p,n),c(n),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dasum double precision deltap,deltad,beta,eps,cx,by,uw,uz,mu,mua,acomp,rdg,g double precision x(n),u(n),s(n),y(p),z(n),w(n),d(n),rhs(p),ada(p,p) double precision aa(p,p),dx(n),ds(n),dy(p),dz(n),dw(n),dxdz(n),dsdw(n) parameter( zero = 0.0d0) parameter( half = 0.5d0) parameter( one = 1.0d0) parameter( mone = -1.0d0) parameter( big = 1.0d+20) # Initialization: We try to follow the notation of LMS # On input we require: # # c = n-vector of marginal costs (-y in the rq problem) # a = p by n matrix of linear constraints (x' in rq) # b = p-vector of rhs ((1-tau)x'e in rq) # u = upper bound vector ( e in rq) # beta = barrier parameter, LMS recommend .99995 # eps = convergence tolerance, LMS recommend 10d-8 # # the integer vector nit returns iteration counts # the integer info contains an error code from the Cholesky in stepy # info = 0 is fine # info < 0 invalid argument to dposv # info > 0 singular matrix nit(1)=0 nit(2)=0 nit(3)=n pp=p*p # Start at the OLS estimate for the parameters call dgemv('N',p,n,one,a,p,c,1,zero,y,1) call stepy(n,p,a,d,y,aa,info) if(info != 0) return # Save sqrt of aa' for future use for confidence band do i=1,p{ do j=1,p ada(i,j)=zero ada(i,i)=one } call dtrtrs('U','T','N',p,p,aa,p,ada,p,info) call dcopy(pp,ada,1,aa,1) # put current residual vector in s (temporarily) call dcopy(n,c,1,s,1) call dgemv('T',p,n,mone,a,p,y,1,one,s,1) # Initialize remaining variables # N.B. x must be initialized on input: for rq as (one-tau) in call coordinates do i=1,n{ d(i)=one if(dabs(s(i)) < eps){ z(i) = dmax1( s(i),zero) + eps w(i) = dmax1(-s(i),zero) + eps } else { z(i) = dmax1( s(i),zero) w(i) = dmax1(-s(i),zero) } s(i)=u(i)-x(i) } cx = ddot(n,c,1,x,1) by = ddot(p,b,1,y,1) uw = dasum(n,w,1) uz = dasum(n,z,1) # rdg = (cx - by + uw)/(one + dabs( by - uw)) # rdg = (cx - by + uw)/(one + uz + uw) rdg = (cx - by + uw) while(rdg > eps) { nit(1)=nit(1)+1 do i =1,n{ d(i) = one/(z(i)/x(i) + w(i)/s(i)) ds(i)=z(i)-w(i) dx(i)=d(i)*ds(i) } call dgemv('N',p,n,one,a,p,dx,1,zero,dy,1)#rhs call dcopy(p,dy,1,rhs,1)#save rhs call stepy(n,p,a,d,dy,ada,info) if(info != 0) return call dgemv('T',p,n,one,a,p,dy,1,mone,ds,1) deltap=big deltad=big do i=1,n{ dx(i)=d(i)*ds(i) ds(i)=-dx(i) dz(i)=-z(i)*(dx(i)/x(i) + one) dw(i)=w(i)*(dx(i)/s(i) - one) dxdz(i)=dx(i)*dz(i) dsdw(i)=ds(i)*dw(i) if(dx(i)<0)deltap=dmin1(deltap,-x(i)/dx(i)) if(ds(i)<0)deltap=dmin1(deltap,-s(i)/ds(i)) if(dz(i)<0)deltad=dmin1(deltad,-z(i)/dz(i)) if(dw(i)<0)deltad=dmin1(deltad,-w(i)/dw(i)) } deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) if(deltap*deltad1) mu=(g/dble(n))*(g/acomp)**2 #else mu=acomp/(dble(n)**2) do i=1,n{ dz(i)=d(i)*(mu*(1/s(i)-1/x(i))+ dx(i)*dz(i)/x(i)-ds(i)*dw(i)/s(i)) } call dswap(p,rhs,1,dy,1) call dgemv('N',p,n,one,a,p,dz,1,one,dy,1)#new rhs call dpotrs('U',p,1,ada,p,dy,p,info) call daxpy(p,mone,dy,1,rhs,1)#rhs=ddy call dgemv('T',p,n,one,a,p,rhs,1,zero,dw,1)#dw=A'ddy deltap=big deltad=big do i=1,n{ dx(i)=dx(i)-dz(i)-d(i)*dw(i) ds(i)=-dx(i) dz(i)=mu/x(i) - z(i)*dx(i)/x(i) - z(i) - dxdz(i)/x(i) dw(i)=mu/s(i) - w(i)*ds(i)/s(i) - w(i) - dsdw(i)/s(i) if(dx(i)<0)deltap=dmin1(deltap,-x(i)/dx(i)) else deltap=dmin1(deltap,-s(i)/ds(i)) if(dz(i)<0)deltad=dmin1(deltad,-z(i)/dz(i)) if(dw(i)<0)deltad=dmin1(deltad,-w(i)/dw(i)) } deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) } call daxpy(n,deltap,dx,1,x,1) call daxpy(n,deltap,ds,1,s,1) call daxpy(p,deltad,dy,1,y,1) call daxpy(n,deltad,dz,1,z,1) call daxpy(n,deltad,dw,1,w,1) cx=ddot(n,c,1,x,1) by=ddot(p,b,1,y,1) uw = dasum(n,w,1) uz = dasum(n,z,1) #rdg=(cx-by+uw)/(one+dabs(by-uw)) #rdg=(cx-by+uw)/(one+uz+uw) rdg=(cx-by+uw) } # return residuals in the vector x call daxpy(n,mone,w,1,z,1) call dswap(n,z,1,x,1) return end quantreg/src/ratfor/boot.r0000644000176200001440000000330513777105346015330 0ustar liggesusers#parzen, wei and ying's bootstrap subroutine pwy(m,n,k,m5,n2,a,c,b,t,toler,ift,x,e,s, wa,wb) double precision b(m),a(k,n),x(n,k) double precision wa(m5,n2),wb(m),e(m),c(m,n) double precision t,toler integer m,n,k,m5,n2,ift integer s(m) do i=1,k{ call dcopy(n,a(i,1),k,c(m,1),m) call rq0(m,n,m5,n2,c,b,t,toler,ift,x(1,i),e,s,wa,wb) } return end #ratfor outer loop for xy-pairs rq bootstrap #notation is horrendous # ratfor R-function #______________________ # m -> n number of original obs # n -> p number of parameters # k -> R number of BS replications # mofn -> m number of BS observations # subroutine xys(mofn,m,n,k,mofn5,n2,a,b,tau,toler,ift,x,e,s, wa,wb,aa,bb,ss) double precision b(m),a(m,n),x(n,k) double precision wa(mofn5,n2),wb(mofn) double precision aa(mofn,n),bb(mofn),e(mofn) double precision tau,toler integer ss(mofn,k),s(mofn),mofn,m,n,k,mofn5,n2,ift(k) do i=1,k { do ii=1,mofn{ bb(ii)=b(ss(ii,i)) do jj=1,n{ aa(ii,jj)=a(ss(ii,i),jj) } } call rq0(mofn,n,mofn5,n2,aa,bb,tau,toler,ift(i),x(1,i),e,s,wa,wb) } return end # Weighted (Bose) Bootstrap version subroutine wxy(m,n,k,m5,n2,a,b,tau,toler,ift,x,e,s,wa,wb,aa,bb,w) double precision b(m),a(m,n),x(n,k) double precision w(m,k),wa(m5,n2),wb(m) double precision aa(m,n),bb(m),e(m) double precision tau,toler integer s(m),m,n,k,m5,n2,ift(k) do i=1,k { do ii=1,m{ bb(ii)=b(ii)*w(ii,i) do jj=1,n{ aa(ii,jj)=a(ii,jj)*w(ii,i) } } call rq0(m,n,m5,n2,aa,bb,tau,toler,ift(i),x(1,i),e,s,wa,wb) } return end #does a matrix multiply to make Y matrix for heqf bootstrap subroutine heqfy(n,p,r,x,b,y) integer n,p,r double precision x(n,p),b(p,n,r),y(n,r),ddot do i=1,r{ do j=1,n{ y(j,i)=ddot(p,x(j,1),n,b(1,j,i),1) } } return end quantreg/src/ratfor/rqfnb.r0000644000176200001440000001213614470134411015461 0ustar liggesuserssubroutine rqfnb(n,p,a,y,rhs,d,u,beta,eps,wn,wp,nit,info) integer n,p,info,nit(3) double precision a(p,n),y(n),rhs(p),d(n),u(n),wn(n,9),wp(p,p+3) double precision one,beta,eps parameter( one = 1.0d0) call lpfnb(n,p,a,y,rhs,d,u,beta,eps,wn(1,1),wn(1,2), wp(1,1),wn(1,3),wn(1,4),wn(1,5),wn(1,6), wp(1,2),wn(1,7),wn(1,8),wn(1,9),wp(1,3),wp(1,4),nit,info) return end # This is a revised form of my primal-dual log barrier form of the # interior point LP solver based on Lustig, Marsten and Shanno ORSA J Opt 1992. # It is a projected Newton primal-dual logarithmic barrier method which uses # the predictor-corrector approach of Mehrotra for the mu steps. # For the sake of brevity we will call it a Frisch-Newton algorithm. # Problem: # min c'x s.t. Ax=b, 0<=x<=u # # Denote dx,dy,dw,ds,dz as the steps for the respective variables x,y,w,s,z # subroutine lpfnb(n,p,a,c,b,d,u,beta,eps,x,s,y,z,w, dx,ds,dy,dz,dw,dr,rhs,ada,nit,info) integer n,p,pp,i,info,nit(3),maxit double precision a(p,n),c(n),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dxdz,dsdw double precision deltap,deltad,beta,eps,mu,gap,g double precision x(n),u(n),s(n),y(p),z(n),w(n),d(n),rhs(p),ada(p,p) double precision dx(n),ds(n),dy(p),dz(n),dw(n),dr(n) parameter( zero = 0.0d0) parameter( one = 1.0d0) parameter( mone = -1.0d0) parameter( big = 1.0d+20) parameter( maxit = 500) # Initialization: We follow the notation of LMS # On input we require: # # c = n-vector of marginal costs (-y in the rq problem) # a = p by n matrix of linear constraints (x' in rq) # b = p-vector of rhs ((1-tau)x'e in rq) # u = upper bound vector ( e in rq) # beta = barrier parameter, LMS recommend .99995 # eps = convergence tolerance, LMS recommend 10d-8 # # the integer vector nit returns iteration counts # the integer info contains an error code from the Cholesky in stepy # info = 0 is fine # info < 0 invalid argument to dposv # info > 0 singular matrix nit(1)=0 nit(2)=0 nit(3)=n pp=p*p # Start at the OLS estimate for the dual vector y call dgemv('N',p,n,one,a,p,c,1,zero,y,1) do i=1,n d(i)=one call stepy(n,p,a,d,y,ada,info) if(info != 0) return # put current residual vector in s (temporarily) call dcopy(n,c,1,s,1) call dgemv('T',p,n,mone,a,p,y,1,one,s,1) # Initialize remaining variables do i=1,n{ if(dabs(s(i)) eps && nit(1) A'dy - ds deltap=big deltad=big do i=1,n{ dx(i)=d(i)*ds(i) ds(i)=-dx(i) dz(i)=-z(i)*(dx(i)/x(i) + one) dw(i)=-w(i)*(ds(i)/s(i) + one) if(dx(i)<0)deltap=dmin1(deltap,-x(i)/dx(i)) if(ds(i)<0)deltap=dmin1(deltap,-s(i)/ds(i)) if(dz(i)<0)deltad=dmin1(deltad,-z(i)/dz(i)) if(dw(i)<0)deltad=dmin1(deltad,-w(i)/dw(i)) } deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) if(min(deltap,deltad) < one){ nit(2)=nit(2)+1 # Update mu mu = ddot(n,x,1,z,1)+ddot(n,s,1,w,1) g = mu + deltap*ddot(n,dx,1,z,1)+ deltad*ddot(n,dz,1,x,1) + deltap*deltad*ddot(n,dz,1,dx,1)+ deltap*ddot(n,ds,1,w,1)+ deltad*ddot(n,dw,1,s,1) + deltap*deltad*ddot(n,ds,1,dw,1) mu = mu * ((g/mu)**3) /dble(2*n) # Compute modified step do i=1,n{ dr(i)=d(i)*(mu*(1/s(i)-1/x(i))+ dx(i)*dz(i)/x(i)-ds(i)*dw(i)/s(i)) } call dswap(p,rhs,1,dy,1) call dgemv('N',p,n,one,a,p,dr,1,one,dy,1)# new rhs call dpotrs('U',p,1,ada,p,dy,p,info)# backsolve for dy call dgemv('T',p,n,one,a,p,dy,1,zero,u,1)#ds=A'ddy deltap=big deltad=big do i=1,n{ dxdz = dx(i)*dz(i) dsdw = ds(i)*dw(i) dx(i)= d(i)*(u(i)-z(i)+w(i))-dr(i) ds(i)= -dx(i) dz(i)= -z(i)+(mu - z(i)*dx(i) - dxdz)/x(i) dw(i)= -w(i)+(mu - w(i)*ds(i) - dsdw)/s(i) if(dx(i)<0)deltap=dmin1(deltap,-x(i)/dx(i)) if(ds(i)<0)deltap=dmin1(deltap,-s(i)/ds(i)) if(dz(i)<0)deltad=dmin1(deltad,-z(i)/dz(i)) if(dw(i)<0)deltad=dmin1(deltad,-w(i)/dw(i)) } deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) } call daxpy(n,deltap,dx,1,x,1) call daxpy(n,deltap,ds,1,s,1) call daxpy(p,deltad,dy,1,y,1) call daxpy(n,deltad,dz,1,z,1) call daxpy(n,deltad,dw,1,w,1) gap = ddot(n,z,1,x,1)+ddot(n,w,1,s,1) } # return residuals in the vector x call daxpy(n,mone,w,1,z,1) call dswap(n,z,1,x,1) return end subroutine stepy(n,p,a,d,b,ada,info) integer n,p,pp,i,info double precision a(p,n),b(p),d(n),ada(p,p),zero parameter( zero = 0.0d0) # Solve the linear system ada'x=b by Choleski -- d is diagonal # Note that a isn't altered, and on output ada returns the upper # triangle Choleski factor, which can be reused, eg with blas dtrtrs pp=p*p do j=1,p do k=1,p ada(j,k)=zero do i=1,n call dsyr('U',p,d(i),a(1,i),1,ada,p) call dposv('U',p,1,ada,p,b,p,info) return end quantreg/src/extract.f0000644000176200001440000000102613522271353014512 0ustar liggesusersc c Extract: Subroutine to extract the non-diagonal structure and c entries from A stored in CSR format c subroutine extract(d,jd,id,dsub,jdsub,m,nnzd,nnzds,ierr) integer jd(nnzd),jdsub(nnzds),id(*),m,mp1,ierr,nnzd,nnzds double precision d(nnzd),dsub(nnzds) c c Call csrmsr in SPARSKIT2 to transform the storage format in d c from csr to msr c call csrmsr(m,d,jd,id,dsub,jdsub,dsub,jdsub,nnzds,ierr) mp1 = m + 1 do i=1,mp1 jdsub(i) = jdsub(i) - mp1 enddo return end quantreg/src/rq1.f0000644000176200001440000001406013522271353013545 0ustar liggesusers SUBROUTINE RQ1(M,N,MDIM,N2,A,B,T,TOLER,IFT,X,E,S,WA,WB) C C Modified to remove SOL and related vars -- only good for single tau C Number of Observations C Number of Parameters C MDIM row dimension for arrays A and WA C N+2 C A is the X matrix C B is the y vector C T, the desired quantile C TOLER, smallest detectable |x-y|/x machine precision to the 2/3 C IFT exit code: C 0-ok C else dimensions inconsistent or T not in (0,1) C X the parameter estimate betahat C E is the residual vector C S is an integer work array (M) C WA is a real work array (M5,N2) C WB is another real work array (M) C Utilization: If you just want a solution at a single quantile you C The algorithm is a slightly modified version of Algorithm AS 229 C described in Koenker and D'Orey, "Computing Regression Quantiles, C Applied Statistics, pp. 383-393. C IMPLICIT DOUBLE PRECISION(A-H,O-Z) INTEGER I,J,K,KL,KOUNT,KR,M,M1,M2,M3,M4,M5,IFT INTEGER MDIM,N,N1,N2,OUT,S(MDIM) LOGICAL STAGE,TEST,INIT,IEND DOUBLE PRECISION MIN,MAX DIMENSION B(MDIM),A(MDIM,N),X(N),WA(MDIM,N2), * WB(MDIM),E(M) DATA BIG/1.D37/ DATA ZERO/0.00D0/ DATA HALF/0.50D0/ DATA ONE/1.00D0/ DATA TWO/2.00D0/ C C CHECK DIMENSION PARAMETERS C IFT=0 IF(N2 .NE. N+2)IFT = 4 IF(M.LE.ZERO.OR.N.LE.ZERO)IFT = 5 IF(IFT .GT. TWO)RETURN C C INITIALIZATION C M1 = M+1 N1 = N+1 M2 = M+2 M3 = M+3 M4 = M+4 M5 = M+5 DO 2 I=1,M WB(I)=B(I) DO 1 J=1,N WA(I,J)=A(I,J) 1 CONTINUE 2 CONTINUE WA(M2,N1)=ZERO DIF = ZERO IEND = .TRUE. IF(T .GE. ZERO .AND. T .LE. ONE)GOTO 3 IFT = 6 RETURN 3 CONTINUE INIT = .FALSE. KOUNT = 0 DO 9 K=1,N WA(M5,K) = ZERO DO 8 I=1,M WA(M5,K) = WA(M5,K) + WA(I,K) 8 CONTINUE WA(M5,K) = WA(M5,K)/FLOAT(M) 9 CONTINUE DO 10 J=1,N WA(M4,J) = J X(J) = ZERO 10 CONTINUE DO 40 I=1,M WA(I,N2) = N+I WA(I,N1) = WB(I) IF(WB(I).GE.ZERO)GOTO 30 DO 20 J=1,N2 WA(I,J) = -WA(I,J) 20 CONTINUE 30 E(I) = ZERO 40 CONTINUE DO 42 J=1,N WA(M2,J) = ZERO WA(M3,J) = ZERO DO 41 I=1,M AUX = SIGN(ONE,WA(M4,J)) * WA(I,J) WA(M2,J) = WA(M2,J) + AUX * (ONE - SIGN(ONE,WA(I,N2))) WA(M3,J) = WA(M3,J) + AUX * SIGN(ONE,WA(I,N2)) 41 CONTINUE WA(M3,J) = TWO * WA(M3,J) 42 CONTINUE GOTO 48 43 CONTINUE DO 44 I=1,M S(I) = ZERO 44 CONTINUE DO 45 J=1,N X(J) = ZERO 45 CONTINUE C C COMPUTE NEXT T C SMAX = TWO DO 47 J=1,N B1 = WA(M3,J) A1 = (-TWO - WA(M2,J))/B1 B1 = -WA(M2,J)/B1 IF(A1 .LT. T)GOTO 46 IF(A1 .GE. SMAX) GOTO 46 SMAX = A1 DIF = (B1 - A1 )/TWO 46 IF(B1 .LE. T) GOTO 47 IF(B1 .GE. SMAX)GOTO 47 SMAX = B1 DIF = (B1 - A1)/TWO 47 CONTINUE TNT = SMAX + TOLER * (ONE + ABS(DIF)) IF(TNT .GE. T1 + TOLER)IEND = .TRUE. T = TNT IF(IEND)T = T1 48 CONTINUE C C COMPUTE NEW MARGINAL COSTS C DO 49 J=1,N WA(M1,J) = WA(M2,J) + WA(M3,J) * T 49 CONTINUE IF(INIT) GOTO 265 C C STAGE 1 C C DETERMINE THE VECTOR TO ENTER THE BASIS C STAGE=.TRUE. KR=1 KL=1 70 MAX=-ONE DO 80 J=KR,N IF(ABS(WA(M4,J)).GT.N)GOTO 80 D=ABS(WA(M1,J)) IF(D.LE.MAX)GOTO 80 MAX=D IN=J 80 CONTINUE IF(WA(M1,IN).GE.ZERO)GOTO 100 DO 90 I=1,M4 WA(I,IN)=-WA(I,IN) 90 CONTINUE C C DETERMINE THE VECTOR TO LEAVE THE BASIS C 100 K=0 DO 110 I=KL,M D=WA(I,IN) IF(D.LE.TOLER)GOTO 110 K=K+1 WB(K)=WA(I,N1)/D S(K)=I TEST=.TRUE. 110 CONTINUE 120 IF(K.GT.0)GOTO 130 TEST=.FALSE. GOTO 150 130 MIN=BIG DO 140 I=1,K IF(WB(I).GE.MIN)GOTO 140 J=I MIN=WB(I) OUT=S(I) 140 CONTINUE WB(J)=WB(K) S(J)=S(K) K=K-1 C C CHECK FOR LINEAR DEPENDENCE IN STAGE 1 C 150 IF(TEST.OR..NOT.STAGE)GOTO 170 DO 160 I=1,M4 D=WA(I,KR) WA(I,KR)=WA(I,IN) WA(I,IN)=D 160 CONTINUE KR=KR+1 GOTO 260 170 IF(TEST)GOTO 180 WA(M2,N1)=TWO GOTO 390 180 PIVOT=WA(OUT,IN) IF(WA(M1,IN)-PIVOT-PIVOT.LE.TOLER)GOTO 200 DO 190 J=KR,N1 D=WA(OUT,J) WA(M1,J)=WA(M1,J)-D-D WA(M2,J)=WA(M2,J)-D-D WA(OUT,J)=-D 190 CONTINUE WA(OUT,N2)=-WA(OUT,N2) GOTO 120 C C PIVOT ON WA(OUT,IN) C 200 DO 210 J=KR,N1 IF(J.EQ.IN)GOTO 210 WA(OUT,J)=WA(OUT,J)/PIVOT 210 CONTINUE DO 230 I=1,M3 IF(I.EQ.OUT)GOTO 230 D=WA(I,IN) DO 220 J=KR,N1 IF(J.EQ.IN)GOTO 220 WA(I,J)=WA(I,J)-D*WA(OUT,J) 220 CONTINUE 230 CONTINUE DO 240 I=1,M3 IF(I.EQ.OUT)GOTO 240 WA(I,IN)=-WA(I,IN)/PIVOT 240 CONTINUE WA(OUT,IN)=ONE/PIVOT D=WA(OUT,N2) WA(OUT,N2)=WA(M4,IN) WA(M4,IN)=D KOUNT=KOUNT+1 IF(.NOT.STAGE)GOTO 270 C C INTERCHANGE ROWS IN STAGE 1 C KL=KL+1 DO 250 J=KR,N2 D=WA(OUT,J) WA(OUT,J)=WA(KOUNT,J) WA(KOUNT,J)=D 250 CONTINUE 260 IF(KOUNT+KR.NE.N1)GOTO 70 C C STAGE 2 C 265 STAGE=.FALSE. C C DETERMINE THE VECTOR TO ENTER THE BASIS C 270 MAX=-BIG DO 290 J=KR,N D=WA(M1,J) IF(D.GE.ZERO)GOTO 280 IF(D.GT.(-TWO))GOTO 290 D=-D-TWO 280 IF(D.LE.MAX)GOTO 290 MAX=D IN=J 290 CONTINUE IF(MAX.LE.TOLER)GOTO 310 IF(WA(M1,IN).GT.ZERO)GOTO 100 DO 300 I=1,M4 WA(I,IN)=-WA(I,IN) 300 CONTINUE WA(M1,IN)=WA(M1,IN)-TWO WA(M2,IN)=WA(M2,IN)-TWO GOTO 100 C C COMPUTE QUANTILES C 310 CONTINUE DO 320 I=1,KL-1 K=WA(I,N2)*SIGN(ONE,WA(I,N2)) X(K) = WA(I,N1) * SIGN(ONE,WA(I,N2)) 320 CONTINUE 390 SUM = ZERO DO 400 I=KL,M K = WA(I,N2) * SIGN(ONE,WA(I,N2)) D = WA(I,N1) * SIGN(ONE,WA(I,N2)) SUM = SUM + D * SIGN(ONE,D) * (HALF + SIGN(ONE,D)*(T-HALF)) K=K-N E(K)=D 400 CONTINUE RETURN END quantreg/src/quantreg_init.c0000644000176200001440000001351313776614275015731 0ustar liggesusers#include #include // for NULL #include /* .C calls */ extern void bootnp(double *x, double *y, double *tau, double *theta_tilda, double *A, double *zstar, double *sumxij, double *sumabsxij, int *n, int *p, int *success, double *theta, int *MAXK); /* .Fortran calls */ extern void F77_NAME(brutpow)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(combin)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(crqf)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(crqfnb)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(grexp)(void *, void *, void *); extern void F77_NAME(kuantiles)(void *, void *, void *, void *); extern void F77_NAME(penalty)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(pfnb)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(pwxy)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(powell)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(qfnb)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(qselect)(void *, void *, void *); extern void F77_NAME(pwy)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rls)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rqbr)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rqfnb)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rqfnc)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rqs)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(sakj)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(srqfn)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(srqfnc)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(wxy)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(xys)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"bootnp", (DL_FUNC) &bootnp, 13}, {NULL, NULL, 0} }; static const R_FortranMethodDef FortranEntries[] = { {"brutpow", (DL_FUNC) &F77_NAME(brutpow), 14}, {"combin", (DL_FUNC) &F77_NAME(combin), 7}, {"crqf", (DL_FUNC) &F77_NAME(crqf), 26}, {"crqfnb", (DL_FUNC) &F77_NAME(crqfnb), 18}, {"grexp", (DL_FUNC) &F77_NAME(grexp), 3}, {"kuantiles", (DL_FUNC) &F77_NAME(kuantiles), 4}, {"penalty", (DL_FUNC) &F77_NAME(penalty), 14}, {"pfnb", (DL_FUNC) &F77_NAME(pfnb), 23}, {"pwxy", (DL_FUNC) &F77_NAME(pwxy), 25}, {"powell", (DL_FUNC) &F77_NAME(powell), 17}, {"qfnb", (DL_FUNC) &F77_NAME(qfnb), 14}, {"qselect", (DL_FUNC) &F77_NAME(qselect), 3}, {"pwy", (DL_FUNC) &F77_NAME(pwy), 16}, {"rls", (DL_FUNC) &F77_NAME(rls), 7}, {"rqbr", (DL_FUNC) &F77_NAME(rqbr), 27}, {"rqfnb", (DL_FUNC) &F77_NAME(rqfnb), 13}, {"rqfnc", (DL_FUNC) &F77_NAME(rqfnc), 18}, {"rqs", (DL_FUNC) &F77_NAME(rqs), 15}, {"sakj", (DL_FUNC) &F77_NAME(sakj), 13}, {"srqfn", (DL_FUNC) &F77_NAME(srqfn), 45}, {"srqfnc", (DL_FUNC) &F77_NAME(srqfnc), 65}, {"wxy", (DL_FUNC) &F77_NAME(wxy), 18}, {"xys", (DL_FUNC) &F77_NAME(xys), 19}, {NULL, NULL, 0} }; void R_init_quantreg(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } quantreg/src/idmin.f0000644000176200001440000000076713522271353014153 0ustar liggesusers INTEGER FUNCTION IDMIN(N,X,INCX) INTEGER I,N,INCX DOUBLE PRECISION X(INCX,*),SMIN C C THIS FUNCTION RETURNS THE INDEX OF THE SMALLEST (ALGEBRAIC) C COMPONENT OF X. ADAPTED FROM PORT3 LIBRARY -- FEB 2008. C ONLY EVERY INCXTH COMPONENT OF X IS CONSIDERED. C IDMIN=0 IF(N.EQ.0) RETURN SMIN=X(1,1) IDMIN=1 DO 10 I=1,N IF(SMIN.LE.X(1,I)) GO TO 10 SMIN=X(1,I) IDMIN=I 10 CONTINUE RETURN END quantreg/src/mcmb.c0000644000176200001440000001630213522564222013756 0ustar liggesusers /****************************************************************/ /* Markov Chain Marginal Bootstrap Package for Quantile Regression */ /* Maria Kocherginsky ,Xuming He */ /* */ /* This code modified by R. Koenker (July 30, 2003, April 21 2010) */ /* to employ R random number generation conventions and to conform */ /* to the conventions of the quantreg package. See the function */ /* boot.rq.mcmb for details on the interface to summary.rq */ /**********************************************************************/ #include #include #include #include #include #include #define MAXN 200000 #define MAXP 100 #define XACCF .001 #define XACCD .001 #define MAXIT 100 #define BMAXIT 100 #define UNUSED (-1.11e30) #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp; #define M 7 #define NSTACK 50 int allZero; /****************************************************************/ /* Error Handling */ /****************************************************************/ void error(const char * format, ...); /****************************************************************/ /* Various Utilities off the Web (for use with sort2()) */ /****************************************************************/ unsigned int *lvector(int nl, int nh) /* allocate a int vector with subscript range v[nl..nh] */ { unsigned int *v = (unsigned int *)malloc((size_t)((nh-nl+2) * sizeof(int))); if (v == NULL) error("allocation failure in lvector()"); return (v-nl+1); } void free_lvector(unsigned int *v, int nl, int nh) /* free a int int vector allocated with lvector() */ { free(v+nl-1); } /****************************************************************/ /* Multiply two vectors */ /****************************************************************/ double mprodx(double *x, double *c, int pp){ int i; double sum; sum=0; for(i=0;i0.0) sign=1; else if (x<0.0) sign=-1; else sign=0; return sign; } /****************************************************************/ /* Sort Function */ /****************************************************************/ void sort2(unsigned int n, double arr[], double brr[]){ unsigned int i,ir=n,j,k,l=1,*istack; int jstack=0; double a,b,temp; istack=lvector(1,NSTACK); for (;;) { if (ir-l < M) { for (j=l+1;j<=ir;j++) { a=arr[j]; b=brr[j]; for (i=j-1;i>=l;i--) { if (arr[i] <= a) break; arr[i+1]=arr[i]; brr[i+1]=brr[i]; } arr[i+1]=a; brr[i+1]=b; } if (!jstack) { free_lvector(istack,1,NSTACK); return; } ir=istack[jstack]; l=istack[jstack-1]; jstack -= 2; } else { k=(l+ir) >> 1; SWAP(arr[k],arr[l+1]) SWAP(brr[k],brr[l+1]) if (arr[l] > arr[ir]) { SWAP(arr[l],arr[ir]) SWAP(brr[l],brr[ir]) } if (arr[l+1] > arr[ir]) { SWAP(arr[l+1],arr[ir]) SWAP(brr[l+1],brr[ir]) } if (arr[l] > arr[l+1]) { SWAP(arr[l],arr[l+1]) SWAP(brr[l],brr[l+1]) } i=l+1; j=ir; a=arr[l+1]; b=brr[l+1]; for (;;) { do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; SWAP(arr[i],arr[j]) SWAP(brr[i],brr[j]) } arr[l+1]=arr[j]; arr[j]=a; brr[l+1]=brr[j]; brr[j]=b; jstack += 2; if (jstack > NSTACK) error("NSTACK too small in sort2.\n"); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } } /****************************************************************/ /* This function finds a weighted taustar quantile, instead of */ /* using bisection to solve the MCMB equations. See new paper. */ /****************************************************************/ double func(double *x, double *y, double tau, double *tTilda, double *A, double sum_right, double sumxij, double sumabsxij, int j, int pp, int nn){ int i,m; double *xj, *yj, *z, *wt, wtsum; unsigned int mm; double taustar, pwtsum, ans, large; xj=(double *) calloc(nn+1, sizeof(double)); yj=(double *) calloc(nn+1, sizeof(double)); z=(double *) calloc(nn+2, sizeof(double)); wt=(double *) calloc(nn+2, sizeof(double)); for(i=0;i 10e-16){ z[m]=(y[i]-mprodx(&x[i*pp],tTilda,pp)+tTilda[j]*xj[i])/xj[i]; wt[m]=fabs(xj[i])/wtsum; m=m+1; } else{error("fabs(xj[i])<10e-16\n");} } z[m]=10e16*sign(xj[nn]); large=z[m]; wt[m]=fabs(xj[nn])/wtsum; /*calculate taustar*/ taustar=(tau-0.5)*(sumxij+xj[nn])/(wtsum)+0.5; if(m==0){ error("Error: one design variable contains all 0s.\n"); allZero=1;} mm=m; sort2(m, z, wt); pwtsum=0; i=1; ans=z[1]; while((pwtsum<=taustar) & (i 10e15){ error("Picked infinity; need to resample\n"); return 1.0; } free(xj); free(yj); free(z); free(wt); return ans; } /****************************************************************/ /* RQMCMB */ /****************************************************************/ void bootnp(double *x, double *y, double *tau, double *theta_tilda, double *A, double *zstar, double *sumxij, double *sumabsxij, int *n, int *p, int *success, double *theta, int *MAXK){ int i, j, jj, k, nn, pp; double sum, s[MAXP],tau2, tTilda[MAXP]; int rand_ind; extern int allZero; pp=(int) *p; nn=(int) *n; tau2=(double) *tau; allZero=0; for(i=0;i MPLUS C 4: less than N noncensored obs above the tau=0 soln C 5: possible degeneracy, rq called at tau + step, see IA C 6: LSOL becomes greater than NSOL C 7: MAXW exceeded C 8: weighted rq tries to include infinite basis element C H is an integer work vector (N) ( = basis indices ) C XH is a double precision work array (N by N) C WA is a double precision work array (MPLUS by N) C WB is a double precision work vector (MPLUS) C WC is a double precision work array (MPLUS by N+2) C WD is a double precision work vector (MPLUS) C WE is a double precision work vector (MPLUS) C WF is a double precision work vector (N) C IA is an integer work vector (MPLUS) C NSOL is an (estimated) row dimension of the solution array C if NSOL < M, solutions returned only at tau = i/(NSOL-1) C if all solutions are desired, NSOL = 3*M is a good choice C on output: C SOL is the coefficient solution array (N+2 by NSOL) C first and last rows give tau bkpts and quantile C rows 2:(N+1) give the beta coefficients C LSOL is the actual dimension of the solution arrays C LSOL = NSOL if NSOL < M, else LSOL .LE. NSOL C ICEN (M) indicates status of censored observations C = 0 if uncensored (or uncrossed censored while pivoting) C = 1 if crossed censored C = 2 if deleted as below tau = 0 solution C = 3 if above last (maximal tau) solution C TCEN (M) are the corresponding tau value where censored obs is C firstcrossed: weight = (tau - TCEN(I))/(1 - TCEN(I)) C TCEN = 1 if censored obs is never crossed (ICEN = 3) C TCEN = 0 if censored obs is deleted (ICEN = 2) C LCEN = number of censored observations C WD = list of first MPLUS tau values at which degeneracy C may have occurred (and weighted RQ was called) C H(1) = number of calls to weighted RQ (apparent degeneracy) C IMPLICIT DOUBLE PRECISION(A-H,O-Z) INTEGER H(N),ICEN(M),C(M),IA(MPLUS) LOGICAL APC, DEG DOUBLE PRECISION ONE DIMENSION X(M,N),Y(M),SOL(N2,NSOL),WC(MPLUS,N2),XH(N,N) DIMENSION WA(MPLUS,N),WB(MPLUS),WD(MPLUS),WE(MPLUS) DIMENSION F(2),WF(N),TCEN(M) DATA BIG/1.D17/ DATA ZERO/0.00D0/ DATA HALF/0.50D0/ DATA ONE/1.00D0/ DATA TWO/2.00D0/ C C CHECK DIMENSION PARAMETERS C DEG = .FALSE. IFT=0 N1 = NSOL-1 LCEN = 0 DO 2 I = 1,M IF(C(I) .EQ. 1) LCEN = LCEN + 1 2 CONTINUE IF(MPLUS .LT. M+1) IFT = 2 IF(N2 .NE. N+2) IFT = 2 IF(M .LE. ZERO .OR. N. LE. ZERO .OR. M .LT. N) IFT = 1 IF(MAXW .GT. MPLUS) IFT = 3 IF(IFT .NE. 0) RETURN C C INITIALIZATION C TOLER = 1.D-11 TOL1 = 10.0D0*TOLER IF(TZERO .LE. ZERO .OR. TZERO .GT. STEP) TZERO = STEP DO 5 I=1,M ICEN(I) = 0 TCEN(I) = ONE WB(I) = Y(I) DO 5 J=1,N 5 WA(I,J) = X(I,J) MA = M C C GET TAU = O SOLUTION C DELETE CENSORED OBS BELOW TAU = 0 SOLN C 10 IF(MA .LE. N) THEN IFT = 4 RETURN ENDIF CALL RQ1(MA,N,MPLUS,N2,WA,WB,TZERO,TOLER,IFT1, * WF,WE,IA,WC,WD) K = 0 KL = 0 C C CHECK FOR CENSORED OBS BELOW TAU = 0 SOLN C L = 0 DO 20 I=1,M IF(ICEN(I) .EQ. 2) GO TO 20 L = L + 1 IF( C(I) .EQ. 1 .AND. WE(L) .LE. TOL1 ) THEN K = K + 1 ICEN(I) = 2 GO TO 20 ENDIF IF( DABS(WE(L)) .GE. TOL1) GO TO 20 KL = KL + 1 IF(KL .LE. N) H(KL) = I 20 CONTINUE IF( K .EQ. 0) GO TO 40 MA = MA - K L = 0 C C DELETE CENSORED OBS BELOW TAU = 0 SOLN, AND RETRY C DO 30 I=1,M IF(ICEN(I) .EQ. 2) GO TO 30 L = L + 1 WB(L) = Y(I) DO 25 J=1,N 25 WA(L,J) = X(I,J) 30 CONTINUE GO TO 10 40 CONTINUE C C SAVE INITIAL SOLUTION, AND INITIALIZE PIVOTING LOOP C SOL(1,1) = ZERO DO 50 J = 1,N 50 SOL(J+1,1) = WF(J) NWRQ = 0 APC = .FALSE. LSOL = 2 TAU = TZERO C C COMPUTE NEXT TAU C FIRST CHECK FOR DEGENERACY AT TZERO C IF (KL .GT. N) GO TO 500 C C GET X(H,) C DO 70 K = 1,N I= H(K) DO 60 J = 1,N 60 XH(K,J) = X(I,J) 70 CONTINUE C C GET X(H,) INVERSE C CALL DGECO(XH,N,N,IA,V,WC) IF(V. LT. TOLER) GO TO 500 JOB = 01 CALL DGEDI(XH,N,N,IA,F,WC,JOB) C C GET RESIDUALS C DO 90 I=1,M S = Y(I) DO 80 J = 1,N 80 S = S - WF(J)*X(I,J) 90 WE(I) = S C C BEGIN PIVOTING; WD = GRAD UPPER BD, IA = SIGN(GRAD DENOM) C 200 CONTINUE CALL GRAD(X,M,N,H,ICEN,TCEN,XH,WE,TOLER,IA,WC,WD) KL = 0 KM = 1 S = WD(1) IF(N .EQ. 1) GO TO 230 DO 210 J=2,N 210 S = DMIN1(WD(J),S) DO 220 J=1,N IF(WD(J) .GE. S + TOLER) GO TO 220 KL = KL + 1 KM = J 220 CONTINUE 230 CONTINUE C C IF ALL POS RESIDS CENSORED, RETURN; ELSE CHECK FOR DEGEN. C IF(APC) THEN SOL(1,LSOL) = DMAX1(S, TAU) DO 240 J=1,N 240 SOL(J+1,LSOL) = WF(J) GO TO 600 ENDIF C C IF DEGENERACY, CALL WEIGHTED RQ C IF (KL .GT. 1) GO TO 500 C C CHECK FOR INFEASIBILITY CAUSED BY REWEIGHTING C IF(S .LT. TAU + TOL1) THEN LSOL = LSOL - 1 TAU = TAU - .8*STEP GO TO 500 ENDIF TAU = S C C GET NEW OBSERVATION TO ENTER BASIS C FIRST DEFINE WD = BASIS INDICATOR = 1 IF I IN H(J) C DO 250 I=1,M 250 WD(I) = ZERO DO 260 J=1,N 260 WD(H(J)) = ONE KN = 0 D = BIG KIN = 0 DO 300 I=1,M IF(ICEN(I) .EQ. 2) GO TO 300 S = ZERO DO 270 J=1,N 270 S = S + X(I,J)*XH(J,KM) S = IA(KM)*S IF(DABS(S).LT.TOL1 .OR. (C(I).EQ.1 .AND. ICEN(I).NE.1) * .OR. WD(I).EQ.ONE) GO TO 300 S = WE(I)/S IF(S .LT. TOL1) GO TO 300 IF(S .LE. D - TOL1) THEN D = S KIN = I KN = 0 ELSE IF(S .LE. D + TOL1) KN = 1 ENDIF 300 CONTINUE IF(KN .EQ. 1) GO TO 500 H(KM) = KIN C C UPDATE SOLUTION C GET NEW X(H,) C DO 310 K = 1,N I = H(K) DO 310 J = 1,N 310 XH(K,J) = X(I,J) C C GET X(H,) INVERSE C 315 CALL DGECO(XH,N,N,IA,V,WA) IF(V. LT. TOLER) GO TO 500 JOB = 01 CALL DGEDI(XH,N,N,IA,F,WA,JOB) C C GET BETA-HAT, RESIDS C DO 340 K = 1,N S = ZERO DO 330 J = 1,N 330 S = S + XH(K,J)*Y(H(J)) 340 WF(K) = S 345 DO 360 I=1,M S = Y(I) DO 350 J = 1,N 350 S = S - WF(J)*X(I,J) 360 WE(I) = S C C SAVE SOLUTION C 365 DO 380 I = (LSOL-1),N1 IF(NSOL.GE.M .OR. TAU .GT. DBLE(I)/DBLE(N1) - 10*TOL1) THEN SOL(1,LSOL) = TAU DO 370 J = 1,N 370 SOL(J+1,LSOL) = WF(J) LSOL = LSOL + 1 GO TO 390 ENDIF 380 CONTINUE 390 CONTINUE C C CHECK FOR DIM(SOL) EXCEEDED C IF(LSOL .GT. NSOL) THEN IFT = 6 GO TO 600 ENDIF IF(APC) THEN LSOL = LSOL - 1 GO TO 600 ENDIF C C SET WT FOR CROSSED CENSORED OBSERVATIONS C APC = .TRUE. IF ALL POS RESID ARE UNCROSSED CENSORED C APC = .TRUE. C if the following are left uncommented: still get zero column C TAUW = TAU - STEP/TWO C IF(MAXW.GT.ZERO)THEN C TAUW=TAU C ENDIF DO 400 I=1,M IF(ICEN(I) .EQ. 2) GO TO 400 IF(WE(I).GE.TOL1 .AND. (C(I).EQ.0 .OR. ICEN(I).EQ.1)) * APC = .FALSE. IF(WE(I).LE.-TOL1 .AND. C(I).EQ.1 .AND. ICEN(I).EQ.0) THEN C C at this point, Y(I) is a crossed censored obs (C_i) C for the grid method TAUW = TAU - STEP*(B2-Y(I))/(B2-B1) C where B1 = x_i' beta_j and B2 = x_i' beta_(j+1) C otherwise (for pivot), TAUW = TAU C IF(MAXW.LT.0) THEN B1 = ZERO B2 = ZERO DO 396 J=1,N B1 = B1 + X(I,J) * SOL(J+1,LSOL - 2) 396 B2 = B2 + X(I,J) * SOL(J+1,LSOL - 1) A1 = (B2 - Y(I))/(B2-B1) TAUW = TAU - A1*STEP ELSE TAUW = TAU ENDIF ICEN(I) = 1 TCEN(I) = TAUW ENDIF 400 CONTINUE IF(APC) THEN IF(DEG) THEN IFT = 5 LSOL = LSOL - 1 GO TO 600 ENDIF GO TO 200 ENDIF C C RETURN IF TAU > 1 C IF(TAU .GE. ONE - 10.0D0 * TOL1) GO TO 600 IF(DEG) GO TO 500 IF(MAXW .GT. 0) GO TO 200 C C POSSIBLE DEGENERACY -- USE WEIGHTED RQ1 TO RESOLVE C 500 NWRQ = NWRQ + 1 IF(MAXW .GT. 0 .AND. NWRQ .GT. MAXW) THEN IFT = 7 LSOL = LSOL - 1 GO TO 600 ENDIF IF(NWRQ .LE. NSOL) SOL(N+2,NWRQ) = TAU TAU = TAU + STEP IF(TAU .GE. ONE) TAU = ONE - TOL1 L = 0 L1 = 0 DO 506 J=1,N 506 WF(J) = ZERO DO 530 I = 1,M IF(ICEN(I) .EQ. 0) THEN IF (C(I) .EQ. 0) THEN L1 = L1 + 1 WB(L1) = Y(I) DO 510 J=1,N 510 WA(L1,J) = X(I,J) ELSE DO 514 J = 1,N 514 WF(J) = WF(J) + X(I,J) ENDIF ENDIF IF(ICEN(I) .EQ. 1) THEN L1 = L1 + 1 L = L+1 W = (TAU - TCEN(I))/(ONE - TCEN(I)) WB(L1) = W * Y(I) DO 520 J = 1,N WA(L1,J) = W * X(I,J) 520 WF(J) = WF(J) + (ONE - W) * X(I,J) ENDIF 530 CONTINUE MAL = L1+1 DO 534 J=1,N 534 WA(MAL,J) = WF(J) WB(MAL) = BIG CALL RQ1(MAL,N,MPLUS,N2,WA,WB,TAU,TOLER,IFT1,WF,WE,IA,WC,WD) DEG = .FALSE. IF(DABS(WE(MAL)) .LE. .0001) THEN IFT = 8 LSOL = LSOL - 1 GO TO 600 ENDIF L = 0 K = 0 DO 550 I=1,M IF(ICEN(I) .EQ. 2) GO TO 550 L = L+1 IF(DABS(WE(L)) .GE. TOL1) GO TO 550 K = K+1 IF(K .LE. N) THEN H(K) = I DO 540 J=1,N 540 XH(K,J) = X(I,J) ENDIF 550 CONTINUE IF(K .LT. N) THEN IFT = 8 LSOL = LSOL - 1 GO TO 600 ENDIF IF(K .GT. N) DEG = .TRUE. GO TO 345 C C DEFINE OUTPUT AND RETURN C 600 H(1) = NWRQ L = MIN0(NWRQ,MPLUS) DO 610 I=1,L 610 WD(I) = SOL(N+2,I) DO 620 I=1,M IF(ICEN(I) .EQ. 2) GO TO 620 IF(C(I) .EQ.1 .AND. TCEN(I) .EQ. ONE) ICEN(I) = 3 620 CONTINUE V = DBLE(MA) DO 650 J = 1,N S = ZERO DO 640 I = 1,M IF(ICEN(I) .EQ. 2) GO TO 640 S = S + X(I,J) 640 CONTINUE 650 WF(J) = S/V DO 670 I = 1,LSOL S = ZERO DO 660 J = 1,N 660 S = S + WF(J) * SOL(J+1,I) 670 SOL(N+2,I) = S RETURN END SUBROUTINE GRAD(X,M,N,H,ICEN,TCEN,XH, * R,TOL,IFLAG,WA,GUP) C C X matrix (M BY N) C M = Number of Observations C N = Number of Parameters C H = basis, integer(N) vector C ICEN (integer(M)) = 2 for deleted obs C = 1 for crossed non-censored obs C = 0 otherwise C TCEN(M) are the corresponding tau values where a censored obs is C first crossed (ICEN=1): weight = (tau - TCEN(I))/(1 - TCEN(I)) C TCEN = 1 if censored obs is never crossed C XH = (N by N) X(H,) inverse matrix C R(M) = residuals C TOL = zero tolerance (1.D-10 by default) C IFLAG (M) work vector C WA (M by N) work array C returns: C GUP(N) = upper bounds on tau C IFLAG(1:N) = sign(grad denom) C = +1 if bound from lower grad bound C = -1 if bound from upper grad bound C IMPLICIT DOUBLE PRECISION(A-H,O-Z) INTEGER H(N),ICEN(M),IFLAG(*) DOUBLE PRECISION ONE DIMENSION X(M,N),GUP(N),XH(N,N) DIMENSION R(M),TCEN(M),WA(M,N) DATA ZERO/0.00D0/, ONE/1.0d0/ C C GET X'(XH-INVERSE) C DO 80 I = 1,M IF(ICEN(I) .EQ. 2) GO TO 80 DO 70 J = 1,N A = ZERO DO 60 K = 1,N 60 A = A + X(I,K)*XH(K,J) 70 WA(I,J) = A 80 CONTINUE C C GET GRADIENT BOUNDS C FIRST SET IFLAG = 1 FOR BASIS INDICES (TEMPORARY) C T = ZERO DO 90 I = 1,M 90 IFLAG(I) = 0 DO 95 J = 1,N 95 IFLAG(H(J)) = 1 DO 120 J=1,N A = ZERO B = ZERO C = ZERO D = ZERO DO 100 I = 1,M IF(ICEN(I) .EQ. 2) GO TO 100 IF(ICEN(I) .EQ. 0) THEN IF(R(I) .GT. TOL) A = A + WA(I,J) IF(R(I) .LT. - TOL) B = B + WA(I,J) GO TO 100 ENDIF IF(IFLAG(I).EQ.1) GO TO 100 C C IFLAG = 0: NOT BASIS AND ICEN = 1: CROSSED CENSORED C IF(R(I) .LT. -TOL) THEN T = TCEN(I)/(ONE - TCEN(I)) C = C - T*WA(I,J) GO TO 100 ENDIF IF(R(I) .GT. TOL) THEN D = D - WA(I,J) ENDIF 100 CONTINUE D = D - C L = ICEN(H(J)) IF(L .NE. 0) T = TCEN(H(J))/( ONE - TCEN(H(J)) ) S = DBLE(L)*(T + ONE) - ONE E1 = A + B - D - S E2 = A + B - D + ONE IF(E1 .GT. ZERO) THEN GUP(J) = (B + C - S)/E1 IFLAG(J+M) = 1 GO TO 120 ENDIF IF(E2 .LT. ZERO) THEN GUP(J) = (B + C)/E2 IFLAG(J+M) = -1 GO TO 120 ENDIF GUP(J) = - ONE 120 CONTINUE DO 130 J = 1,N 130 IFLAG(J) = IFLAG(J+M) RETURN END quantreg/src/penalty.f0000644000176200001440000000560413752023347014525 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine penalty(n,m,q,x,y,bnd,tlist,tlptr,tlend,rax,jax,ned,eps *,ierr) integer n,m,q,lp,lpl,ned,ierr integer bnd(n),tlist(q),tlptr(q),tlend(n),n4(4),p4(4),jax(m) double precision x(n),y(n),rax(m),eps double precision x4(4),y4(4),g4(4) logical orient ned = 0 do23000 i=1,n lpl = tlend(i) lp = lpl 23002 continue lp = tlptr(lp) j = iabs(tlist(lp)) if(j .gt. i)then n4(1) = i n4(2) = j call fadjs(n4,n,q,tlist,tlptr,tlend) if(bnd(i)*bnd(j) .eq. 0)then ned = ned + 1 do23009 k = 1,4 x4(k) = x(n4(k)) y4(k) = y(n4(k)) 23009 continue 23010 continue if(orient(x4,y4))then call iswap(1,n4(3),1,n4(4),1) call dswap(1,x4(3),1,x4(4),1) call dswap(1,y4(3),1,y4(4),1) endif call ggap(x4,y4,g4,eps,ierr) if(ierr .eq. 1)then return endif call srtpai(n4,1,p4,1,4) do23015 k = 1,4 rax((ned - 1)*4 + k) = g4(p4(k)) jax((ned - 1)*4 + k) = n4(p4(k)) 23015 continue 23016 continue if(ned*4 .gt. m)then return endif endif endif if(lp .eq. lpl)then goto 23004 endif 23003 goto 23002 23004 continue 23000 continue 23001 continue return end logical function orient(x,y) double precision x(4), y(4) orient = (y(2) -y(1))*(x(3)-x(4))+(x(1)-x(2))*(y(3)-y(4)) .gt. 0 return end subroutine fadjs(n4,n,q,tlist,tlptr,tlend) integer n,q,vp,vpl,v,v0,match integer n4(4),tlist(q),tlptr(q),tlend(n) match = 0 vpl = tlend(n4(1)) vp = vpl k = 0 23021 continue k = k+1 vp = tlptr(vp) v = tlist(vp) if(k.gt.1 .and. iabs(v) .eq. n4(2))then n4(3) = iabs(v0) match = 1 goto 23022 endif if(match .gt. 0)then n4(4) = iabs(v) goto 23023 endif v0 = v 23022 goto 23021 23023 continue return end subroutine ggap(x,y,g,eps,ierr) double precision x(4),y(4),g(4),w(2,4),h(2),d1,d2,eps d1 = -x(2) * y(1) + x(3) * y(1) + x(1) * y(2) - x(3) * y(2) - x(1) * * y(3) + x(2) * y(3) d2 = -x(2) * y(1) + x(4) * y(1) + x(1) * y(2) - x(4) * y(2) - x(1) * * y(4) + x(2) * y(4) if(dabs(d1) .lt. eps .or. dabs(d2) .lt. eps)then ierr = 1 return endif h(1) = -(y(1) - y(2)) h(2) = (x(1) - x(2)) w(1, 1) = (y(2) - y(3))/d1 - (y(2) - y(4))/d2 w(2, 1) = (x(3) - x(2))/d1 - (x(4) - x(2))/d2 w(1, 2) = (y(3) - y(1))/d1 - (y(4) - y(1))/d2 w(2, 2) = (x(1) - x(3))/d1 - (x(1) - x(4))/d2 w(1, 3) = (y(1) - y(2))/d1 w(2, 3) = (x(2) - x(1))/d1 w(1, 4) = (y(2) - y(1))/d2 w(2, 4) = (x(1) - x(2))/d2 do23030 i = 1,4 g(i) = h(1)*w(1,i)+h(2)*w(2,i) 23030 continue 23031 continue ierr = 0 return end quantreg/src/rqs.f0000644000176200001440000000060713752023347013654 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine rqs(m,n,k,m5,n2,a,b,tau,toler,ift,x,e,s,wa,wb) double precision b(m,k),a(m,n),x(n,k),e(m),wa(m5,n2),wb(m) double precision tau,toler integer s(m),m,n,k,m5,n2,ift(k) do23000 i=1,k call rq0(m,n,m5,n2,a,b(1,i),tau,toler,ift(i),x(1,i),e,s,wa,wb) 23000 continue 23001 continue return end quantreg/src/chlfct.f0000644000176200001440000001115513522271353014307 0ustar liggesusersc 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c c Subroutine to perform Cholesky factorization c c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 subroutine chlfct(m,xlindx,lindx,invp,perm,iwork,nnzdsub,jdsub, & colcnt,nsuper,snode,xsuper,nnzlmax,nsubmax, & xlnz,lnz,id,jd,d,cachsz,tmpmax,level, & tmpvec,split,ierr,it,timewd) integer m,ierr,nsub,iwsiz,nnzdsub,nnzl,nsuper,nnzlmax,nsubmax, & tmpsiz,cachsz,tmpmax,level,it, & xlindx(*),lindx(*),invp(*),perm(*),iwork(*),jdsub(*), & colcnt(*),snode(*),xsuper(*),xlnz(*),id(*),jd(*),split(*) double precision d(*),lnz(*),tmpvec(*),timewd(7) real gtimer,timbeg,timend external smxpy1,smxpy2,smxpy4,smxpy8 external mmpy1,mmpy2,mmpy4,mmpy8 c c Save the matrix structure from jdsub(m+2:nzzd+1),jdsub(1:m+1) c to lindx and xlindx because the matrix structure is destroyed by the c minimum degree ordering routine c do i = 1,m+1 xlindx(i) = jdsub(i) enddo do i = 1,nnzdsub lindx(i) = jdsub(m+1+i) enddo c c Reorder the matrix using minimum degree ordering routine c iwsiz = 4*m if(it .le. 1) then timbeg = gtimer() call ordmmd(m,xlindx,lindx,invp,perm,iwsiz,iwork,nsub,ierr) if (ierr .eq. -1) then ierr = 3 go to 100 endif timend = gtimer() timewd(1) = timewd(1) + timend - timbeg c c Call sfinit: Symbolic factorization initialization c to compute supernode partition and storage requirements c for symbolic factorization. New ordering is a postordering c of the nodal elimination tree c iwsiz = 7 * m + 3 timbeg = gtimer() call sfinit(m,nnzdsub,jdsub(1),jdsub(m+2),perm, & invp,colcnt,nnzl,nsub,nsuper,snode,xsuper,iwsiz, & iwork,ierr) if (ierr .eq. -1) then ierr = 4 go to 100 endif if (nnzl .gt. nnzlmax) then ierr = 5 go to 100 endif if (nsub .gt. nsubmax) then ierr = 6 go to 100 endif timend = gtimer() timewd(2) = timewd(2) + timend - timbeg endif c c Call symfct: Perform supernodal symbolic factorization c c iwsiz = nsuper + 2 * m + 1 timbeg = gtimer() call symfct(m,nnzdsub,jdsub(1),jdsub(m+2),perm,invp, & colcnt,nsuper,xsuper,snode,nsub,xlindx,lindx, & xlnz,iwsiz,iwork,ierr) if (ierr .eq. -1) then ierr = 7 go to 100 endif if (ierr .eq. -2) then ierr = 8 go to 100 endif timend = gtimer() timewd(3) = timewd(3) + timend - timbeg c c Call inpnv: Input numerical values into data structures of L c iwsiz = m timbeg = gtimer() call inpnv(m,id,jd,d,perm,invp,nsuper,xsuper,xlindx,lindx, & xlnz,lnz,iwork) timend = gtimer() timewd(4) = timewd(4) + timend - timbeg c c Call bfinit: Initialization for block factorization c timbeg = gtimer() call bfinit(m,nsuper,xsuper,snode,xlindx,lindx,cachsz,tmpsiz, & split) if (tmpsiz .gt. tmpmax) then ierr = 9 go to 100 endif timend = gtimer() timewd(5) = timewd(5) + timend - timbeg c c Call blkfct: Numerical factorization c iwsiz = 2 * m + 2 * nsuper timbeg = gtimer() if (level .eq. 1) then call blkfct(m,nsuper,xsuper,snode,split,xlindx,lindx,xlnz, & lnz,iwsiz,iwork,tmpsiz,tmpvec,ierr,mmpy1,smxpy1) elseif (level .eq. 2) then call blkfct(m,nsuper,xsuper,snode,split,xlindx,lindx,xlnz, & lnz,iwsiz,iwork,tmpsiz,tmpvec,ierr,mmpy2,smxpy2) elseif (level .eq. 4) then call blkfct(m,nsuper,xsuper,snode,split,xlindx,lindx,xlnz, & lnz,iwsiz,iwork,tmpsiz,tmpvec,ierr,mmpy4,smxpy4) elseif (level .eq. 8) then call blkfct(m,nsuper,xsuper,snode,split,xlindx,lindx,xlnz, & lnz,iwsiz,iwork,tmpsiz,tmpvec,ierr,mmpy8,smxpy8) endif if (ierr .eq. -1) then ierr = 10 go to 100 elseif (ierr .eq. -2) then ierr = 11 go to 100 elseif (ierr .eq. -3) then ierr = 12 go to 100 endif 100 continue timend = gtimer() timewd(6) = timewd(6) + timend - timbeg return end c quantreg/src/boot.f0000644000176200001440000000361213777105447014022 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine pwy(m,n,k,m5,n2,a,c,b,t,toler,ift,x,e,s, wa,wb) double precision b(m),a(k,n),x(n,k) double precision wa(m5,n2),wb(m),e(m),c(m,n) double precision t,toler integer m,n,k,m5,n2,ift integer s(m) do23000 i=1,k call dcopy(n,a(i,1),k,c(m,1),m) call rq0(m,n,m5,n2,c,b,t,toler,ift,x(1,i),e,s,wa,wb) 23000 continue 23001 continue return end subroutine xys(mofn,m,n,k,mofn5,n2,a,b,tau,toler,ift,x,e,s, wa,wb, *aa,bb,ss) double precision b(m),a(m,n),x(n,k) double precision wa(mofn5,n2),wb(mofn) double precision aa(mofn,n),bb(mofn),e(mofn) double precision tau,toler integer ss(mofn,k),s(mofn),mofn,m,n,k,mofn5,n2,ift(k) do23002 i=1,k do23004 ii=1,mofn bb(ii)=b(ss(ii,i)) do23006 jj=1,n aa(ii,jj)=a(ss(ii,i),jj) 23006 continue 23007 continue 23004 continue 23005 continue call rq0(mofn,n,mofn5,n2,aa,bb,tau,toler,ift(i),x(1,i),e,s,wa,wb) 23002 continue 23003 continue return end subroutine wxy(m,n,k,m5,n2,a,b,tau,toler,ift,x,e,s,wa,wb,aa,bb,w) double precision b(m),a(m,n),x(n,k) double precision w(m,k),wa(m5,n2),wb(m) double precision aa(m,n),bb(m),e(m) double precision tau,toler integer s(m),m,n,k,m5,n2,ift(k) do23008 i=1,k do23010 ii=1,m bb(ii)=b(ii)*w(ii,i) do23012 jj=1,n aa(ii,jj)=a(ii,jj)*w(ii,i) 23012 continue 23013 continue 23010 continue 23011 continue call rq0(m,n,m5,n2,aa,bb,tau,toler,ift(i),x(1,i),e,s,wa,wb) 23008 continue 23009 continue return end subroutine heqfy(n,p,r,x,b,y) integer n,p,r double precision x(n,p),b(p,n,r),y(n,r),ddot do23014 i=1,r do23016 j=1,n y(j,i)=ddot(p,x(j,1),n,b(1,j,i),1) 23016 continue 23017 continue 23014 continue 23015 continue return end quantreg/src/Makevars0000644000176200001440000000014313522271353014364 0ustar liggesusers## we use the BLAS and now also the LAPACK library: PKG_LIBS= $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) quantreg/src/frand.c0000644000176200001440000000033413761210555014132 0ustar liggesusers#include #include void F77_SUB(fseedi)(void) { GetRNGstate(); } void F77_SUB(fseedo)(void) { PutRNGstate(); } void F77_SUB(frexp)(double* px, double* pa) { *px = rexp(*pa); } quantreg/src/iswap.f0000644000176200001440000000522213522271353014165 0ustar liggesusers SUBROUTINE ISWAP (N, IX, INCX, IY, INCY) C***AUTHOR Vandevender, W. H., (SNLA) C***DESCRIPTION C C Extended B L A S Subprogram C Description of Parameters C C --Input-- C N number of elements in input vector(s) C IX integer vector with N elements C INCX storage spacing between elements of IX C IY integer vector with N elements C INCY storage spacing between elements of IY C C --Output-- C IX input vector IY (unchanged if N .LE. 0) C IY input vector IX (unchanged if N .LE. 0) C C Interchange integer IX and integer IY. C For I = 0 to N-1, interchange IX(LX+I*INCX) and IY(LY+I*INCY), C where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is C defined in a similar way using INCY. C C***REFERENCES C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T. C Krogh, Basic linear algebra subprograms for Fortran C usage, Algorithm No. 539, Transactions on Mathematical C Software 5, 3 (September 1979), pp. 308-323. C***ROUTINES CALLED (NONE) C***REVISION HISTORY (YYMMDD) C 850601 DATE WRITTEN C 861211 REVISION DATE from Version 3.2 C 891214 Prologue converted to Version 4.0 format. (BAB) C 920310 Corrected definition of LX in DESCRIPTION. (WRB) C 920501 Reformatted the REFERENCES section. (WRB) C***END PROLOGUE ISWAP INTEGER IX(*), IY(*), ITEMP1, ITEMP2, ITEMP3 C***FIRST EXECUTABLE STATEMENT ISWAP IF (N .LE. 0) RETURN IF (INCX .NE. INCY) GO TO 5 IF (INCX-1) 5,20,60 C C Code for unequal or nonpositive increments. C 5 IIX = 1 IIY = 1 IF (INCX .LT. 0) IIX = (1-N)*INCX + 1 IF (INCY .LT. 0) IIY = (1-N)*INCY + 1 DO 10 I = 1,N ITEMP1 = IX(IIX) IX(IIX) = IY(IIY) IY(IIY) = ITEMP1 IIX = IIX + INCX IIY = IIY + INCY 10 CONTINUE RETURN C C Code for both increments equal to 1. C C Clean-up loop so remaining vector length is a multiple of 3. C 20 M = MOD(N,3) IF (M .EQ. 0) GO TO 40 DO 30 I = 1,M ITEMP1 = IX(I) IX(I) = IY(I) IY(I) = ITEMP1 30 CONTINUE IF (N .LT. 3) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,3 ITEMP1 = IX(I) ITEMP2 = IX(I+1) ITEMP3 = IX(I+2) IX(I) = IY(I) IX(I+1) = IY(I+1) IX(I+2) = IY(I+2) IY(I) = ITEMP1 IY(I+1) = ITEMP2 IY(I+2) = ITEMP3 50 CONTINUE RETURN C C Code for equal, positive, non-unit increments. C 60 NS = N*INCX DO 70 I = 1,NS,INCX ITEMP1 = IX(I) IX(I) = IY(I) IY(I) = ITEMP1 70 CONTINUE RETURN END quantreg/src/qselect.f0000644000176200001440000000264614470134171014510 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine qselect(n,x,q) integer n,k,l,r double precision x(n),q k=nint(q*n) l=1 r=n call select(n,x,l,r,k) q=x(k) return end recursive subroutine select(n,x,l,r,k) integer n,m,l,r,k,ll,rr,i,j,mmax double precision x(n),z,s,d,t,fm,cs,cd parameter(cs = 0.5d0) parameter(cd = 0.5d0) parameter(mmax = 600) 23000 if(r.gt.l)then if(r-l.gt.mmax)then m=r-l+1 i=k-l+1 fm = dble(m) z=log(fm) s=cs*exp(2*z/3) d=cd*sqrt(z*s*(m-s)/fm)*sign(1,i-m/2) ll=max(l,nint(k-i*s/fm + d)) rr=min(r,nint(k+(m-i)*s/fm + d)) call select(n,x,ll,rr,k) endif t=x(k) i=l j=r call dswap(1,x(l),1,x(k),1) if(x(r).gt.t)then call dswap(1,x(r),1,x(l),1) endif 23006 if(i.lt.j)then call dswap(1,x(i),1,x(j),1) i=i+1 j=j-1 23008 if(x(i).lt.t)then i=i+1 goto 23008 endif 23009 continue 23010 if(x(j).gt.t)then j=j-1 goto 23010 endif 23011 continue goto 23006 endif 23007 continue if(x(l).eq.t)then call dswap(1,x(l),1,x(j),1) else j=j+1 call dswap(1,x(j),1,x(r),1) endif if(j.le.k)then l=j+1 endif if(k.le.j)then r=j-1 endif goto 23000 endif 23001 continue return end quantreg/src/crqfnb.f0000644000176200001440000000207513752023347014323 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine crqfnb(n,p,a1,c1,n1,x,y,c,b,g,m,r,s,d,u,wn,wp,info) integer n,p,n1,m,info,nit(3) double precision a1(p,n1),c1(n),x(n,p),y(n),c(n),b(p,m),g(m) double precision wn(n1,9),wp(p,p+3),r(p),s(n),d(n),u(n) double precision zero,half,one,beta,eps,dh parameter( zero = 0.0d0) parameter( half = 0.5d0) parameter( one = 1.0d0) parameter( beta = 0.99995d0) parameter( eps = 1.0d-8) do23000 k = 2,m dh = -log(one - g(k)) + log(one - g(k-1)) do23002 i = 1,n u(i) = one wn(i,1) = half if(d(i) .ge. zero)then s(i) = s(i) + dh endif d(i) = c(i) - s(i) 23002 continue 23003 continue call dgemv('T',n,p,one,x,n,d,1,zero,r,1) call rqfnb(n1,p,a1,c1,r,d,u,beta,eps,wn,wp,nit,info) if(info .ne. 0)then goto 23001 endif call dcopy(p,wp,1,b(1,k-1),1) call dcopy(n,y,1,d,1) call dgemv('N',n,p,one,x,n,b(1,k-1),1,one,d,1) 23000 continue 23001 continue m = k-1 return end quantreg/src/sakj.f0000644000176200001440000000564213752203204013773 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine sakj(x,z,p,iker,dens,psi,score,nx,nz,h,alpha,kappa,xlam *) double precision dens(nz),score(nz),psi(nz),h,kappa double precision z(nz),x(nx),xlam(nx),p(nx),qrange,pi double precision con1,sum,sqsum,xsd,a,fifth,hinv,half double precision xn,xker,dxker,ddxker,fact,xponen,alpha,glog,zero, *one,two parameter( zero = 0.d0) parameter( one = 1.d0) parameter( two = 2.d0) parameter( four = 4.d0) parameter( half = 0.5d0) parameter( fifth = 0.2d0) parameter( pi = 3.141593d0) xn=nx if(iker.eq.0)then con1=one/sqrt(2.0*pi) else if(iker.eq.1)then con1=one/pi endif endif if(h.le.0.)then sum=0. sqsum=0. do23006 i=1,nx sqsum=sqsum+x(i)*x(i)*p(i) sum=sum+x(i)*p(i) 23006 continue 23007 continue xsd=dsqrt(sqsum-sum*sum) sum=zero i=1 23008 if(.not.(i.lt.nx))goto 23010 sum=sum+p(i) if(sum.lt..25)then goto 23009 else qrange=x(i) goto 23010 endif 23009 i=i+1 goto 23008 23010 continue sum=one i=nx 23013 if(.not.(i.gt.0))goto 23015 sum=sum-p(i) if(sum.gt..75)then goto 23014 else qrange=x(i)-qrange goto 23015 endif 23014 i=i-1 goto 23013 23015 continue a=min(xsd,qrange/1.34) h=kappa*a/(xn**fifth) endif hinv=one/h do23018 j=1,nx xker=0. if(iker.eq.0)then do23022 i=1,nx xponen=(x(j)-x(i))*hinv xponen=half*xponen**2 xker=xker+p(i)*exp(-xponen)*hinv 23022 continue 23023 continue else if(iker.eq.1)then do23026 i=1,nx xponen=(x(j)-x(i))*hinv xker=xker+p(i)*hinv/(1+xponen**2) 23026 continue 23027 continue endif endif xlam(j)=con1*xker 23018 continue 23019 continue glog=zero do23028 i=1,nx glog=glog+p(i)*log(xlam(i)) 23028 continue 23029 continue g=exp(glog) ginv=one/g do23030 i=1,nx xlam(i)=hinv/((xlam(i)*ginv)**(-alpha)) 23030 continue 23031 continue do23032 j=1,nz xker=zero dxker=zero ddxker=zero if(iker.eq.0)then do23036 i=1,nx xponen=(z(j)-x(i))*xlam(i) fact=exp(-half*xponen*xponen)*xlam(i) xker=xker+p(i)*fact dxker=dxker-p(i)*fact*xponen*xlam(i) ddxker=ddxker- p(i)*fact*(one - xponen**2)*xlam(i)**2 23036 continue 23037 continue else if(iker.eq.1)then do23040 i=1,nx xponen=(z(j)-x(i))*xlam(i) fact=xlam(i)/(one+xponen**2) xker=xker+p(i)*fact dxker=dxker-p(i)*two*xponen*fact**2 ddxker=ddxker- p(i)*two*(fact**2)*(xlam(i)- four*(xponen**2)*fact) 23040 continue 23041 continue endif endif dens(j)=con1*xker psi(j)=-(dxker/xker) score(j)=(dxker/xker)**2-ddxker/xker 23032 continue 23033 continue return end quantreg/src/srqfn.f0000644000176200001440000003215014470133775014203 0ustar liggesusersc 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 subroutine srqfn(n,m,nnza,a,ja,ia,ao,jao,iao,nnzdmax,d,jd,id, & dsub,jdsub,nnzemax,e,je,ie,nsubmax,lindx,xlindx, & nnzlmax,lnz,xlnz,iw,iwmax,iwork,xsuper,tmpmax, & tmpvec,wwm,wwn,cachsz,level,x,s,u,c,y,b,small, & ierr,maxit,timewd) integer nnza,m,n,nnzdmax,nnzemax,iwmax, & nnzlmax,nsubmax,cachsz,level,tmpmax,ierr,maxit, & ja(nnza),jao(nnza),jdsub(nnzemax+1),jd(nnzdmax), & ia(n+1),iao(m+1),id(m+1),lindx(nsubmax),xlindx(m+1), & iw(m,5),xlnz(m+1),iwork(iwmax),xsuper(m+1),je(nnzemax), & ie(m+1) double precision small, & a(nnza),ao(nnza),dsub(nnzemax+1),d(nnzdmax), & lnz(nnzlmax),c(n),y(m),wwm(m,3),tmpvec(tmpmax), & wwn(n,14),x(n),s(n),u(n),e(nnzemax),b(m) double precision timewd(7) call slpfn(n,m,nnza,a,ja,ia,ao,jao,iao,nnzdmax,d,jd,id, & dsub,jdsub,nsubmax,lindx,xlindx,nnzlmax,lnz, & xlnz,iw(1,1),iw(1,2),iwmax,iwork,iw(1,3),iw(1,4), & xsuper,iw(1,5),tmpmax,tmpvec,wwm(1,2),cachsz, & level,x,s,u,c,y,b,wwn(1,1),wwn(1,2),wwn(1,3), & wwn(1,4),nnzemax,e,je,ie,wwm(1,3),wwn(1,5),wwn(1,6), & wwn(1,7),wwn(1,8),wwn(1,9),wwn(1,10),wwn(1,11), & wwn(1,12),wwn(1,13),wwn(1,14),wwm(1,1),small,ierr, & maxit,timewd) return end subroutine slpfn(n,m,nnza,a,ja,ia,ao,jao,iao,nnzdmax,d,jd,id, & dsub,jdsub,nsubmax,lindx,xlindx,nnzlmax,lnz, & xlnz,invp,perm,iwmax,iwork,colcnt,snode,xsuper, & split,tmpmax,tmpvec,newrhs,cachsz,level,x,s,u, & c,y,b,r,z,w,q,nnzemax,e,je,ie,dy,dx,ds,dz,dw,dxdz, & dsdw,xi,xinv,sinv,ww1,ww2,small,ierr,maxit,timewd) c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c Sparse implentation of LMS's interior point method via c Ng-Peyton's sparse Cholesky factorization for sparse c symmetric positive definite c INPUT: c n -- the number of row in the coefficient matrix A' c m -- the number of column in the coefficient matrix A' c nnza -- the number of non-zero elements in A' c a -- an nnza-vector of non-zero values of the design c matrix (A') stored in csr format c ja -- an nnza-vector of indices of the non-zero elements of c the coefficient matrix c ia -- an (n+1)-vector of pointers to the begining of each c row in a and ja c ao -- an nnza-vector of work space for the transpose of c the design matrix stored in csr format or the c design matrix stored in csc format c jao -- an nnza-vector of work space for the indices of the c transpose of the design matrix c iao -- an (n+1)-vector of pointers to the begining of each c column in ao and jao c nnzdmax -- upper bound of the non-zero elements in AA' c d -- an nnzdmax-vector of non-zero values of AQ^(-1) c jd -- an nnzdmax-vector of indices in d c id -- an (m+1)-vector of pointers to the begining of each c row in d and jd c dsub -- the values of e excluding the diagonal elements c jdsub -- the indices to dsub c nsubmax -- upper bound of the dimension of lindx c lindx -- an nsub-vector of interger which contains, in c column major order, the row subscripts of the nonzero c entries in L in a compressed storage format c xlindx -- an (m+1)-vector of integer of pointers for lindx c nnzlmax -- the upper bound of the non-zero entries in c L stored in lnz, including the diagonal entries c lnz -- First contains the non-zero entries of d; later c contains the entries of the Cholesky factor c xlnz -- column pointer for L stored in lnz c invp -- an n-vector of integer of inverse permutation c vector c perm -- an n-vector of integer of permutation vector c iw -- integer work array of length m c iwmax -- upper bound of the general purpose integer c working storage iwork; set at 7*m+3 c iwork -- an iwsiz-vector of integer as work space c colcnt -- array of length m, containing the number of c non-zeros in each column of the factor, including c the diagonal entries c snode -- array of length m for recording supernode c membership c xsuper -- array of length m+1 containing the supernode c partitioning c split -- an m-vector with splitting of supernodes so that c they fit into cache c tmpmax -- upper bound of the dimension of tmpvec c tmpvec -- a tmpmax-vector of temporary vector c newrhs -- extra work vector for right-hand side and c solution c cachsz -- size of the cache (in kilobytes) on the target c machine c level -- level of loop unrolling while performing numerical c factorization c x -- an n-vector, the initial feasible solution in the primal c that corresponds to the design matrix A' c s -- an n-vector c u -- an n-vector of upper bound for x c c -- an n-vector, usually the "negative" of c the pseudo response c y -- an m-vector, the initial dual solution c b -- an n-vector, the rhs of the equality constraint c usually X'a = (1-tau)X'e in the rq setting c r -- an n-vector of residuals c z -- an n-vector of the dual slack variable c w -- an n-vector c q -- an n-vector of work array containing the diagonal c elements of the Q^(-1) matrix c nnzemax -- upper bound of the non-zero elements in AA' c e -- an nnzdmax-vector containing the non-zero entries of c AQ^(-1)A' stored in csr format c je -- an nnzemax-vector of indices for e c ie -- an (m+1)-vector of pointers to the begining of each c row in e and je c dy -- work array c dx -- work array c ds -- work array c dz -- work array c dw -- work array c dxdz -- work array c dsdw -- work arry c xi -- work array c xinv -- work array c sinv -- work array c ww1 -- work array c ww2 -- work array c small -- convergence tolerance for inetrior algorithm c ierr -- error flag c 1 -- insufficient work space in call to extract c 2 -- nnzd > nnzdmax c 3 -- insufficient storage in iwork when calling ordmmd; c 4 -- insufficient storage in iwork when calling sfinit; c 5 -- nnzl > nnzlmax when calling sfinit c 6 -- nsub > nsubmax when calling sfinit c 7 -- insufficient work space in iwork when calling symfct c 8 -- inconsistancy in input when calling symfct c 9 -- tmpsiz > tmpmax when calling bfinit; increase tmpmax c 10 -- nonpositive diagonal encountered when calling c blkfct, the matrix is not positive definite c 11 -- insufficient work storage in tmpvec when calling c blkfct c 12 -- insufficient work storage in iwork when calling c blkfct c maxit -- upper limit of the iteration; on return holds the c number of iterations c timew -- amount of time to execute this subroutine c OUTPUT: c y -- an m-vector of primal solution c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 integer nnza,m,n,nsuper,nnzdmax,nnzemax,iwmax,nnzd, & nnzlmax,nsubmax,cachsz,level,tmpmax,ierr,maxit,it, & ja(nnza),jao(nnza),jdsub(nnzemax+1),jd(nnzdmax), & ia(n+1),iao(m+1),id(m+1),lindx(nsubmax),xlindx(m+1), & invp(m),perm(m),xlnz(m+1),iwork(iwmax), & colcnt(m),snode(m),xsuper(m+1),split(m),je(nnzemax), & ie(m+1) double precision ddot,gap,zero,one,beta,small,deltap,deltad,mu,g, & a(nnza),ao(nnza),dsub(nnzemax+1),d(nnzdmax), & lnz(nnzlmax),c(n),b(m),newrhs(m),y(m), & tmpvec(tmpmax),r(n),z(n),w(n),x(n),s(n), & u(n),q(n), & e(nnzemax),dy(m),dx(n),ds(n),dz(n),dw(n), & dxdz(n),dsdw(n),xinv(n),sinv(n),xi(n), & ww1(n),ww2(m) double precision timewd(7) real gtimer,timbeg,timend external smxpy1,smxpy2,smxpy4,smxpy8 external mmpy1,mmpy2,mmpy4,mmpy8 parameter (beta=9.995d-1, one=1.0d0, zero=0.0d0) do i = 1,7 timewd(i) = 0.0 enddo it = 0 nnzd = ie(m+1) - 1 nnzdsub = nnzd - m c c Compute the initial gap c gap = ddot(n,z,1,x,1) + ddot(n,w,1,s,1) c c Start iteration c 20 continue if(gap .lt. small .or. it .gt. maxit) goto 30 it = it + 1 c c Create the diagonal matrix Q^(-1) stored in q as an n-vector c and update the residuals in r c do i=1,n q(i) = one/(z(i)/x(i)+w(i)/s(i)) r(i) = z(i) - w(i) enddo c c Obtain AQ^(-1) and store in d,jd,id in csr format c call amudia(m,1,ao,jao,iao,q,d,jd,id) c c Obtain AQ^(-1)A' and store in e,je,ie in csr format c call amub(m,m,1,d,jd,id,a,ja,ia,e,je,ie,nnzemax,iwork,ierr) if (ierr .ne. 0) then ierr = 2 go to 100 endif c c Extract the non-diagonal structure of e,je,ie and store in dsub,jdsub c call extract(e,je,ie,dsub,jdsub,m,nnzemax,nnzemax+1,ierr) if (ierr .ne. 0) then ierr = 1 go to 100 endif c c Compute b - Ax + AQ^(-1)r and store it in c in two steps c First: store Ax in ww2 call amux(m,x,ww2,ao,jao,iao) c c Second: save AQ^(-1)r in c temporarily c call amux(m,r,c,d,jd,id) do i = 1,m c(i) = b(i) - ww2(i) + c(i) enddo c c Compute dy = (AQ^(-1)A')^(-1)(b-Ax+AQ^(-1)r); result returned via dy c c Call chlfct to perform Cholesky's decomposition of e,je,ie c call chlfct(m,xlindx,lindx,invp,perm,iwork,nnzdsub,jdsub, & colcnt,nsuper,snode,xsuper,nnzlmax,nsubmax,xlnz,lnz, & ie,je,e,cachsz,tmpmax,level,tmpvec,split,ierr,it, & timewd) if (ierr .ne. 0) go to 100 c c Call blkslv: Numerical solution for the new rhs stored in b c do i = 1,m newrhs(i) = c(perm(i)) enddo timbeg = gtimer() call blkslv(nsuper,xsuper,xlindx,lindx,xlnz,lnz,newrhs) timend = gtimer() timewd(7) = timewd(7) + timend - timbeg do i = 1,m dy(i) = newrhs(invp(i)) enddo c c Compute dx = Q^(-1)(A'dy - r), ds = -dx, dz and dw c call amux(n,dy,dx,a,ja,ia) do i=1,n dx(i) = q(i) * (dx(i) - r(i)) ds(i) = -dx(i) dz(i) = -z(i) * (one + dx(i) / x(i)) dw(i) = -w(i) * (one + ds(i) / s(i)) enddo c c Compute the maximum allowable step lengths c call bound(x,dx,s,ds,z,dz,w,dw,n,beta,deltap,deltad) if (deltap * deltad .lt. one) then c c Update mu c mu = ddot(n,z,1,x,1) + ddot(n,w,1,s,1) g = ddot(n,z,1,x,1) + deltap*ddot(n,z,1,dx,1) & + deltad*ddot(n,dz,1,x,1) + deltad*deltap*ddot(n,dz,1,dx,1) & + ddot(n,w,1,s,1) + deltap*ddot(n,w,1,ds,1) & + deltad*ddot(n,dw,1,s,1) + deltad*deltap*ddot(n,dw,1,ds,1) mu = mu*((g/mu)**3)/(2.d0*dble(n)) c c Compute dxdz and dsdw c do i = 1,n dxdz(i) = dx(i)*dz(i) dsdw(i) = ds(i)*dw(i) xinv(i) = one/x(i) sinv(i) = one/s(i) xi(i) = xinv(i) * dxdz(i) - sinv(i) * dsdw(i) & - mu * (xinv(i) - sinv(i)) ww1(i) = q(i) * xi(i) enddo c c Compute AQ^(-1)(dxdz - dsdw - mu(X^(-1) - S^(-1))) and c store it in ww2 temporarily c call amux(m,ww1,ww2,ao,jao,iao) do i = 1,m c(i) = c(i) + ww2(i) enddo c c c Compute dy and return the result in dy c c Call blkslv: Numerical solution for the new rhs stored in b c do i = 1,m newrhs(i) = c(perm(i)) enddo timbeg = gtimer() call blkslv(nsuper,xsuper,xlindx,lindx,xlnz,lnz,newrhs) timend = gtimer() timewd(7) = timewd(7) + timend - timbeg do i = 1,m dy(i) = newrhs(invp(i)) enddo c c Compute dx = Q^(-1)(A'dy - r + mu(X^(-1) - S^(-1)) -dxdz + dsdw), c ds = -dx, dz and dw c call amux(n,dy,dx,a,ja,ia) do i=1,n dx(i) = q(i) * (dx(i) - xi(i) - r(i)) ds(i) = -dx(i) dz(i) = -z(i) + xinv(i)*(mu - z(i)*dx(i) - dxdz(i)) dw(i) = -w(i) + sinv(i)*(mu - w(i)*ds(i) - dsdw(i)) enddo c c Compute the maximum allowable step lengths c call bound(x,dx,s,ds,z,dz,w,dw,n,beta,deltap,deltad) endif c c Take the step c call daxpy(n,deltap,dx,1,x,1) call daxpy(n,deltap,ds,1,s,1) call daxpy(n,deltad,dw,1,w,1) call daxpy(n,deltad,dz,1,z,1) call daxpy(m,deltad,dy,1,y,1) gap = ddot(n,z,1,x,1) + ddot(n,w,1,s,1) goto 20 30 continue 100 continue maxit = it return end quantreg/src/cholesky.f0000644000176200001440000066651714444254466014721 0ustar liggesusersC*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************ ASSMB .... INDEXED ASSEMBLY OPERATION ************ C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS ROUTINE PERFORMS AN INDEXED ASSEMBLY (I.E., SCATTER-ADD) C OPERATION, ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE C CHOLESKY CODES. C C INPUT PARAMETERS: C M - NUMBER OF ROWS IN Y. C Q - NUMBER OF COLUMNS IN Y. C Y - BLOCK UPDATE TO BE INCORPORATED INTO FACTOR C STORAGE. C RELIND - RELATIVE INDICES FOR MAPPING THE UPDATES C ONTO THE TARGET COLUMNS. C XLNZ - POINTERS TO THE START OF EACH COLUMN IN THE C TARGET MATRIX. C C OUTPUT PARAMETERS: C LNZ - CONTAINS COLUMNS MODIFIED BY THE UPDATE C MATRIX. C C*********************************************************************** C SUBROUTINE ASSMB ( M , Q , Y , RELIND, XLNZ , & LNZ , LDA ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER LDA , M , Q INTEGER XLNZ(*) INTEGER RELIND(*) DOUBLE PRECISION LNZ(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER ICOL , IL1 , IR , IY1 , LBOT1 , & YCOL , YOFF1 C C*********************************************************************** C C YOFF1 = 0 DO 200 ICOL = 1, Q YCOL = LDA - RELIND(ICOL) LBOT1 = XLNZ(YCOL+1) - 1 CDIR$ IVDEP DO 100 IR = ICOL, M IL1 = LBOT1 - RELIND(IR) IY1 = YOFF1 + IR LNZ(IL1) = LNZ(IL1) + Y(IY1) Y(IY1) = 0.0D0 100 CONTINUE YOFF1 = IY1 - ICOL 200 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** BETREE ..... BINARY TREE REPRESENTATION OF ETREE ******* C*********************************************************************** C*********************************************************************** C C WRITTEN BY JOSEPH LIU (JUL 17, 1985) C C PURPOSE: C TO DETERMINE THE BINARY TREE REPRESENTATION OF THE ELIMINATION C TREE GIVEN BY THE PARENT VECTOR. THE RETURNED REPRESENTATION C WILL BE GIVEN BY THE FIRST-SON AND BROTHER VECTORS. THE ROOT C OF THE BINARY TREE IS ALWAYS NEQNS. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE. C IT IS ASSUMED THAT PARENT(I) > I EXCEPT OF C THE ROOTS. C C OUTPUT PARAMETERS: C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHER VECTOR. C C*********************************************************************** C SUBROUTINE BETREE ( NEQNS , PARENT, FSON , BROTHR ) C C*********************************************************************** C INTEGER BROTHR(*) , FSON(*) , & PARENT(*) C INTEGER NEQNS C C*********************************************************************** C INTEGER LROOT , NODE , NDPAR C C*********************************************************************** C IF ( NEQNS .LE. 0 ) RETURN C DO 100 NODE = 1, NEQNS FSON(NODE) = 0 BROTHR(NODE) = 0 100 CONTINUE LROOT = NEQNS C ------------------------------------------------------------ C FOR EACH NODE := NEQNS-1 STEP -1 DOWNTO 1, DO THE FOLLOWING. C ------------------------------------------------------------ IF ( NEQNS .LE. 1 ) RETURN DO 300 NODE = NEQNS-1, 1, -1 NDPAR = PARENT(NODE) IF ( NDPAR .LE. 0 .OR. NDPAR .EQ. NODE ) THEN C ------------------------------------------------- C NODE HAS NO PARENT. GIVEN STRUCTURE IS A FOREST. C SET NODE TO BE ONE OF THE ROOTS OF THE TREES. C ------------------------------------------------- BROTHR(LROOT) = NODE LROOT = NODE ELSE C ------------------------------------------- C OTHERWISE, BECOMES FIRST SON OF ITS PARENT. C ------------------------------------------- BROTHR(NODE) = FSON(NDPAR) FSON(NDPAR) = NODE ENDIF 300 CONTINUE BROTHR(LROOT) = 0 C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** BFINIT ..... INITIALIZATION FOR BLOCK FACTORIZATION ****** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE COMPUTES ITEMS NEEDED BY THE LEFT-LOOKING C BLOCK-TO-BLOCK CHOLESKY FACTORITZATION ROUTINE BLKFCT. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C NSUPER - NUMBER OF SUPERNODES. C XSUPER - INTEGER ARRAY OF SIZE (NSUPER+1) CONTAINING C THE SUPERNODE PARTITIONING. C SNODE - SUPERNODE MEMBERSHIP. C (XLINDX,LINDX) - ARRAYS DESCRIBING THE SUPERNODAL STRUCTURE. C CACHSZ - CACHE SIZE (IN KBYTES). C C OUTPUT PARAMETERS: C TMPSIZ - SIZE OF WORKING STORAGE REQUIRED BY BLKFCT. C SPLIT - SPLITTING OF SUPERNODES SO THAT THEY FIT C INTO CACHE. C C*********************************************************************** C SUBROUTINE BFINIT ( NEQNS , NSUPER, XSUPER, SNODE , XLINDX, & LINDX , CACHSZ, TMPSIZ, SPLIT ) C C*********************************************************************** C INTEGER CACHSZ, NEQNS , NSUPER, TMPSIZ INTEGER XLINDX(*) , XSUPER(*) INTEGER LINDX (*) , SNODE (*) , & SPLIT(*) C C*********************************************************************** C C --------------------------------------------------- C DETERMINE FLOATING POINT WORKING SPACE REQUIREMENT. C --------------------------------------------------- CALL FNTSIZ ( NSUPER, XSUPER, SNODE , XLINDX, LINDX , & TMPSIZ ) C C ------------------------------- C PARTITION SUPERNODES FOR CACHE. C ------------------------------- CALL FNSPLT ( NEQNS , NSUPER, XSUPER, XLINDX, CACHSZ, & SPLIT ) C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.3 C Last modified: March 6, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratoy C C*********************************************************************** C*********************************************************************** C********* BLKFC2 ..... BLOCK GENERAL SPARSE CHOLESKY ********* C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE FACTORS A SPARSE POSITIVE DEFINITE MATRIX. C THE COMPUTATION IS ORGANIZED AROUND KERNELS THAT PERFORM C SUPERNODE-TO-SUPERNODE UPDATES, I.E., BLOCK-TO-BLOCK UPDATES. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - SUPERNODE PARTITION. C SNODE - MAPS EACH COLUMN TO THE SUPERNODE CONTAINING C IT. C SPLIT - SPLITTING OF SUPERNODES SO THAT THEY FIT C INTO CACHE. C (XLINDX,LINDX) - ROW INDICES FOR EACH SUPERNODE (INCLUDING C THE DIAGONAL ELEMENTS). C (XLNZ,LNZ) - ON INPUT, CONTAINS MATRIX TO BE FACTORED. C TMPSIZ - SIZE OF TEMPORARY WORKING STORAGE. C MMPYN - EXTERNAL ROUTINE: MATRIX-MATRIX MULTIPLY. C SMXPY - EXTERNAL ROUTINE: MATRIX-VECTOR MULTIPLY. C C OUTPUT PARAMETERS: C LNZ - ON OUTPUT, CONTAINS CHOLESKY FACTOR. C IFLAG - ERROR FLAG. C 0: SUCCESSFUL FACTORIZATION. C -1: NONPOSITIVE DIAGONAL ENCOUNTERED, C MATRIX IS NOT POSITIVE DEFINITE. C -2: INSUFFICIENT WORKING STORAGE C [TEMP(*)]. C C WORKING PARAMETERS: C LINK - LINKS TOGETHER THE SUPERNODES IN A SUPERNODE C ROW. C LENGTH - LENGTH OF THE ACTIVE PORTION OF EACH C SUPERNODE. C INDMAP - VECTOR OF SIZE NEQNS INTO WHICH THE GLOBAL C INDICES ARE SCATTERED. C RELIND - MAPS LOCATIONS IN THE UPDATING COLUMNS TO C THE CORRESPONDING LOCATIONS IN THE UPDATED C COLUMNS. (RELIND IS GATHERED FROM INDMAP). C TEMP - REAL VECTOR FOR ACCUMULATING UPDATES. MUST C ACCOMODATE ALL COLUMNS OF A SUPERNODE. C C*********************************************************************** C SUBROUTINE BLKFC2 ( NSUPER, XSUPER, SNODE , SPLIT , XLINDX, & LINDX , XLNZ , LNZ , LINK , LENGTH, & INDMAP, RELIND, TMPSIZ, TEMP , IFLAG , & MMPYN , SMXPY ) C C********************************************************************* C C ----------- C PARAMETERS. C ----------- C EXTERNAL MMPYN , SMXPY INTEGER XLINDX(*) , XLNZ(*) INTEGER INDMAP(*) , LENGTH(*) , & LINDX(*) , LINK(*) , & RELIND(*) , SNODE(*) , & SPLIT(*) , XSUPER(*) INTEGER IFLAG , NSUPER, TMPSIZ DOUBLE PRECISION LNZ(*) , TEMP(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER FJCOL , FKCOL , I , ILEN , ILPNT , & INDDIF, JLEN , JLPNT , JSUP , JXPNT , & KFIRST, KLAST , KLEN , KLPNT , KSUP , & KXPNT , LJCOL , NCOLUP, NJCOLS, NKCOLS, & NXKSUP, NXTCOL, NXTSUP, STORE CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC DOUBLE PRECISION MXDIAG INTEGER NTINY CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC C C********************************************************************* C IFLAG = 0 NTINY = 0 C C ----------------------------------------------------------- C INITIALIZE EMPTY ROW LISTS IN LINK(*) AND ZERO OUT TEMP(*). C ----------------------------------------------------------- DO 100 JSUP = 1, NSUPER LINK(JSUP) = 0 100 CONTINUE DO 200 I = 1, TMPSIZ TEMP(I) = 0.0D+00 200 CONTINUE CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC C COMPUTE MAXIMUM DIAGONAL ELEMENT IN INPUT MATRIX MXDIAG = 0.D0 DO 201 I = 1, XSUPER(NSUPER+1)-1 FJCOL = XLNZ(I) MXDIAG = MAX(MXDIAG, LNZ(FJCOL)) 201 CONTINUE CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC C C --------------------------- C FOR EACH SUPERNODE JSUP ... C --------------------------- DO 600 JSUP = 1, NSUPER C C ------------------------------------------------ C FJCOL ... FIRST COLUMN OF SUPERNODE JSUP. C LJCOL ... LAST COLUMN OF SUPERNODE JSUP. C NJCOLS ... NUMBER OF COLUMNS IN SUPERNODE JSUP. C JLEN ... LENGTH OF COLUMN FJCOL. C JXPNT ... POINTER TO INDEX OF FIRST C NONZERO IN COLUMN FJCOL. C ------------------------------------------------ FJCOL = XSUPER(JSUP) NJCOLS = XSUPER(JSUP+1) - FJCOL LJCOL = FJCOL + NJCOLS - 1 JLEN = XLNZ(FJCOL+1) - XLNZ(FJCOL) JXPNT = XLINDX(JSUP) C print *, 'Super Node: ', JSUP, ' first: ', FJCOL, C . ' last: ', LJCOL C C C ----------------------------------------------------- C SET UP INDMAP(*) TO MAP THE ENTRIES IN UPDATE COLUMNS C TO THEIR CORRESPONDING POSITIONS IN UPDATED COLUMNS, C RELATIVE THE THE BOTTOM OF EACH UPDATED COLUMN. C ----------------------------------------------------- CALL LDINDX ( JLEN, LINDX(JXPNT), INDMAP ) C C ----------------------------------------- C FOR EVERY SUPERNODE KSUP IN ROW(JSUP) ... C ----------------------------------------- KSUP = LINK(JSUP) 300 IF ( KSUP .GT. 0 ) THEN NXKSUP = LINK(KSUP) C C ------------------------------------------------------- C GET INFO ABOUT THE CMOD(JSUP,KSUP) UPDATE. C C FKCOL ... FIRST COLUMN OF SUPERNODE KSUP. C NKCOLS ... NUMBER OF COLUMNS IN SUPERNODE KSUP. C KLEN ... LENGTH OF ACTIVE PORTION OF COLUMN FKCOL. C KXPNT ... POINTER TO INDEX OF FIRST NONZERO IN ACTIVE C PORTION OF COLUMN FJCOL. C ------------------------------------------------------- FKCOL = XSUPER(KSUP) NKCOLS = XSUPER(KSUP+1) - FKCOL KLEN = LENGTH(KSUP) KXPNT = XLINDX(KSUP+1) - KLEN C C ------------------------------------------- C PERFORM CMOD(JSUP,KSUP), WITH SPECIAL CASES C HANDLED DIFFERENTLY. C ------------------------------------------- C IF ( KLEN .NE. JLEN ) THEN C C ------------------------------------------- C SPARSE CMOD(JSUP,KSUP). C C NCOLUP ... NUMBER OF COLUMNS TO BE UPDATED. C ------------------------------------------- C DO 400 I = 0, KLEN-1 NXTCOL = LINDX(KXPNT+I) IF ( NXTCOL .GT. LJCOL ) GO TO 500 400 CONTINUE I = KLEN 500 CONTINUE NCOLUP = I C IF ( NKCOLS .EQ. 1 ) THEN C C ---------------------------------------------- C UPDATING TARGET SUPERNODE BY TRIVIAL C SUPERNODE (WITH ONE COLUMN). C C KLPNT ... POINTER TO FIRST NONZERO IN ACTIVE C PORTION OF COLUMN FKCOL. C ---------------------------------------------- KLPNT = XLNZ(FKCOL+1) - KLEN CALL MMPYI ( KLEN, NCOLUP, LINDX(KXPNT), & LNZ(KLPNT), XLNZ, LNZ, INDMAP ) C ELSE C C -------------------------------------------- C KFIRST ... FIRST INDEX OF ACTIVE PORTION OF C SUPERNODE KSUP (FIRST COLUMN TO C BE UPDATED). C KLAST ... LAST INDEX OF ACTIVE PORTION OF C SUPERNODE KSUP. C -------------------------------------------- C KFIRST = LINDX(KXPNT) KLAST = LINDX(KXPNT+KLEN-1) INDDIF = INDMAP(KFIRST) - INDMAP(KLAST) C IF ( INDDIF .LT. KLEN ) THEN C C --------------------------------------- C DENSE CMOD(JSUP,KSUP). C C ILPNT ... POINTER TO FIRST NONZERO IN C COLUMN KFIRST. C ILEN ... LENGTH OF COLUMN KFIRST. C --------------------------------------- ILPNT = XLNZ(KFIRST) ILEN = XLNZ(KFIRST+1) - ILPNT CALL MMPY ( KLEN, NKCOLS, NCOLUP, & SPLIT(FKCOL), XLNZ(FKCOL), & LNZ, LNZ(ILPNT), ILEN, MMPYN ) C ELSE C C ------------------------------- C GENERAL SPARSE CMOD(JSUP,KSUP). C COMPUTE CMOD(JSUP,KSUP) UPDATE C IN WORK STORAGE. C ------------------------------- STORE = KLEN * NCOLUP - NCOLUP * & (NCOLUP-1) / 2 IF ( STORE .GT. TMPSIZ ) THEN IFLAG = -2 RETURN ENDIF CALL MMPY ( KLEN, NKCOLS, NCOLUP, & SPLIT(FKCOL), XLNZ(FKCOL), & LNZ, TEMP, KLEN, MMPYN ) C ---------------------------------------- C GATHER INDICES OF KSUP RELATIVE TO JSUP. C ---------------------------------------- CALL IGATHR ( KLEN, LINDX(KXPNT), & INDMAP, RELIND ) C -------------------------------------- C INCORPORATE THE CMOD(JSUP,KSUP) BLOCK C UPDATE INTO THE TO APPROPRIATE COLUMNS C OF L. C -------------------------------------- CALL ASSMB ( KLEN, NCOLUP, TEMP, RELIND, & XLNZ(FJCOL), LNZ, JLEN ) C ENDIF C ENDIF C ELSE C C ---------------------------------------------- C DENSE CMOD(JSUP,KSUP). C JSUP AND KSUP HAVE IDENTICAL STRUCTURE. C C JLPNT ... POINTER TO FIRST NONZERO IN COLUMN C FJCOL. C ---------------------------------------------- JLPNT = XLNZ(FJCOL) CALL MMPY ( KLEN, NKCOLS, NJCOLS, SPLIT(FKCOL), & XLNZ(FKCOL), LNZ, LNZ(JLPNT), JLEN, & MMPYN ) NCOLUP = NJCOLS IF ( KLEN .GT. NJCOLS ) THEN NXTCOL = LINDX(JXPNT+NJCOLS) ENDIF C ENDIF C C ------------------------------------------------ C LINK KSUP INTO LINKED LIST OF THE NEXT SUPERNODE C IT WILL UPDATE AND DECREMENT KSUP'S ACTIVE C LENGTH. C ------------------------------------------------ IF ( KLEN .GT. NCOLUP ) THEN NXTSUP = SNODE(NXTCOL) LINK(KSUP) = LINK(NXTSUP) LINK(NXTSUP) = KSUP LENGTH(KSUP) = KLEN - NCOLUP ELSE LENGTH(KSUP) = 0 ENDIF C C ------------------------------- C NEXT UPDATING SUPERNODE (KSUP). C ------------------------------- KSUP = NXKSUP GO TO 300 C ENDIF C C ---------------------------------------------- C APPLY PARTIAL CHOLESKY TO THE COLUMNS OF JSUP. C ---------------------------------------------- CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC CALL CHLSUP ( JLEN, NJCOLS, SPLIT(FJCOL), XLNZ(FJCOL), LNZ, & MXDIAG, NTINY, IFLAG, MMPYN, SMXPY ) IF ( IFLAG .NE. 0 ) THEN IFLAG = -1 RETURN ENDIF C C ----------------------------------------------- C INSERT JSUP INTO LINKED LIST OF FIRST SUPERNODE C IT WILL UPDATE. C ----------------------------------------------- IF ( JLEN .GT. NJCOLS ) THEN NXTCOL = LINDX(JXPNT+NJCOLS) NXTSUP = SNODE(NXTCOL) LINK(JSUP) = LINK(NXTSUP) LINK(NXTSUP) = JSUP LENGTH(JSUP) = JLEN - NJCOLS ELSE LENGTH(JSUP) = 0 ENDIF C 600 CONTINUE C CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC C IF(NTINY .NE. 0) WRITE(6,699) NTINY C 699 FORMAT(1X,' FOUND ',I6,' TINY DIAGONALS; REPLACED WITH INF') C C SET IFLAG TO -1 TO INDICATE PRESENCE OF TINY DIAGONALS C IF(NTINY .NE. 0) IFLAG = 17 C PN(4/16/09): IFLAG was -1 but set to 17 to be consistent with ierr CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: March 6, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C********* BLKFCT ..... BLOCK GENERAL SPARSE CHOLESKY ********* C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE CALLS THE BLOCK GENERAL SPARSE CHOLESKY ROUTINE, C BLKFC2. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - SUPERNODE PARTITION. C SNODE - MAPS EACH COLUMN TO THE SUPERNODE CONTAINING C IT. C SPLIT - SPLITTING OF SUPERNODES SO THAT THEY FIT C INTO CACHE. C (XLINDX,LINDX) - ROW INDICES FOR EACH SUPERNODE (INCLUDING C THE DIAGONAL ELEMENTS). C (XLNZ,LNZ) - ON INPUT, CONTAINS MATRIX TO BE FACTORED. C IWSIZ - SIZE OF INTEGER WORKING STORAGE C TMPSIZ - SIZE OF FLOATING POINT WORKING STORAGE. C MMPYN - EXTERNAL ROUTINE: MATRIX-MATRIX MULTIPLY. C SMXPY - EXTERNAL ROUTINE: MATRIX-VECTOR MULTIPLY. C C OUTPUT PARAMETERS: C LNZ - ON OUTPUT, CONTAINS CHOLESKY FACTOR. C IFLAG - ERROR FLAG. C 0: SUCCESSFUL FACTORIZATION. C -1: NONPOSITIVE DIAGONAL ENCOUNTERED, C MATRIX IS NOT POSITIVE DEFINITE. C -2: INSUFFICIENT WORKING STORAGE C [TEMP(*)]. C -3: INSUFFICIENT WORKING STORAGE C [IWORK(*)]. C C WORKING PARAMETERS: C IWORK - INTEGER WORKING STORAGE OF LENGTH C 2*NEQNS + 2*NSUPER. C TMPVEC - DOUBLE PRECISION WORKING STORAGE OF LENGTH C NEQNS. C C*********************************************************************** C SUBROUTINE BLKFCT ( NEQNS , NSUPER, XSUPER, SNODE , SPLIT , & XLINDX, LINDX , XLNZ , LNZ , IWSIZ , & IWORK , TMPSIZ, TMPVEC, IFLAG , MMPYN , & SMXPY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C EXTERNAL MMPYN , SMXPY INTEGER XLINDX(*) , XLNZ(*) INTEGER IWORK(*) , LINDX(*) , & SNODE(*) , SPLIT(*) , & XSUPER(*) INTEGER IFLAG , IWSIZ , NEQNS , NSUPER, TMPSIZ DOUBLE PRECISION LNZ(*) , TMPVEC(*) C C********************************************************************* C IFLAG = 0 IF ( IWSIZ .LT. 2*NEQNS+2*NSUPER ) THEN IFLAG = -3 RETURN ENDIF CALL BLKFC2 ( NSUPER, XSUPER, SNODE , SPLIT , XLINDX, & LINDX , XLNZ , LNZ , & IWORK(1) , & IWORK(NSUPER+1) , & IWORK(2*NSUPER+1) , & IWORK(2*NSUPER+NEQNS+1) , & TMPSIZ, TMPVEC, IFLAG , MMPYN , SMXPY ) RETURN END C*********************************************************************** C*********************************************************************** C C Written: October 6, 1996 by SJW. Based on routine BLKSLV of C Esmond G. Ng and Barry W. Peyton. C C Modified: Sept 30, 1999 to improve efficiency in the case C in which the right-hand side and solution are both C expected to be sparse. Happens a lot in "dense" C column handling. C C*********************************************************************** C*********************************************************************** C********* BLKSLB ... BACK TRIANGULAR SUBSTITUTION ********** C*********************************************************************** C*********************************************************************** C C PURPOSE: C GIVEN THE CHOLESKY FACTORIZATION OF A SPARSE SYMMETRIC C POSITIVE DEFINITE MATRIX, THIS SUBROUTINE PERFORMS THE C BACKWARD TRIANGULAR SUBSTITUTION. IT USES OUTPUT FROM BLKFCT. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - SUPERNODE PARTITION. C (XLINDX,LINDX) - ROW INDICES FOR EACH SUPERNODE. C (XLNZ,LNZ) - CHOLESKY FACTOR. C C UPDATED PARAMETERS: C RHS - ON INPUT, CONTAINS THE RIGHT HAND SIDE. ON C OUTPUT, CONTAINS THE SOLUTION. C C*********************************************************************** C SUBROUTINE BLKSLB ( NSUPER, XSUPER, XLINDX, LINDX , XLNZ , & LNZ , RHS ) C C*********************************************************************** C INTEGER NSUPER INTEGER LINDX(*) , XSUPER(*) INTEGER XLINDX(*) , XLNZ(*) DOUBLE PRECISION LNZ(*) , RHS(*) C C*********************************************************************** C INTEGER FJCOL , I , IPNT , IX , IXSTOP, & IXSTRT, JCOL , JPNT , JSUP , LJCOL DOUBLE PRECISION T C C*********************************************************************** C IF ( NSUPER .LE. 0 ) RETURN C ------------------------- C BACKWARD SUBSTITUTION ... C ------------------------- LJCOL = XSUPER(NSUPER+1) - 1 DO 600 JSUP = NSUPER, 1, -1 FJCOL = XSUPER(JSUP) IXSTOP = XLNZ(LJCOL+1) - 1 JPNT = XLINDX(JSUP) + (LJCOL - FJCOL) DO 500 JCOL = LJCOL, FJCOL, -1 IXSTRT = XLNZ(JCOL) IPNT = JPNT + 1 T = RHS(JCOL) CDIR$ IVDEP DO 400 IX = IXSTRT+1, IXSTOP I = LINDX(IPNT) IF(RHS(I) .NE. 0.D0) T = T - LNZ(IX)*RHS(I) IPNT = IPNT + 1 400 CONTINUE IF(T .NE. 0.D0) THEN RHS(JCOL) = T/LNZ(IXSTRT) ELSE RHS(JCOL) = 0.D0 ENDIF IXSTOP = IXSTRT - 1 JPNT = JPNT - 1 500 CONTINUE LJCOL = FJCOL - 1 600 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Written: October 6, 1996 by SJW. Based on routine BLKSLV of C Esmond G. Ng and Barry W. Peyton. C C Modified: Sept 30, 1999 to improve efficiency in the case C in which the right-hand side and solution are both C expected to be sparse. Happens a lot in "dense" C column handling. C C*********************************************************************** C*********************************************************************** C********* BLKSLF ... FORWARD TRIANGULAR SUBSTITUTION ********** C*********************************************************************** C*********************************************************************** C C PURPOSE: C GIVEN THE CHOLESKY FACTORIZATION OF A SPARSE SYMMETRIC C POSITIVE DEFINITE MATRIX, THIS SUBROUTINE PERFORMS THE C FORWARD TRIANGULAR SUBSTITUTIOn. IT USES OUTPUT FROM BLKFCT. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - SUPERNODE PARTITION. C (XLINDX,LINDX) - ROW INDICES FOR EACH SUPERNODE. C (XLNZ,LNZ) - CHOLESKY FACTOR. C C UPDATED PARAMETERS: C RHS - ON INPUT, CONTAINS THE RIGHT HAND SIDE. ON C OUTPUT, CONTAINS THE SOLUTION. C C*********************************************************************** C SUBROUTINE BLKSLF ( NSUPER, XSUPER, XLINDX, LINDX , XLNZ , & LNZ , RHS ) C C*********************************************************************** C INTEGER NSUPER INTEGER LINDX(*) , XSUPER(*) INTEGER XLINDX(*) , XLNZ(*) DOUBLE PRECISION LNZ(*) , RHS(*) C C*********************************************************************** C INTEGER FJCOL , I , IPNT , IX , IXSTOP, & IXSTRT, JCOL , JPNT , JSUP , LJCOL DOUBLE PRECISION T C C*********************************************************************** C IF ( NSUPER .LE. 0 ) RETURN C C ------------------------ C FORWARD SUBSTITUTION ... C ------------------------ FJCOL = XSUPER(1) DO 300 JSUP = 1, NSUPER LJCOL = XSUPER(JSUP+1) - 1 IXSTRT = XLNZ(FJCOL) JPNT = XLINDX(JSUP) DO 200 JCOL = FJCOL, LJCOL IXSTOP = XLNZ(JCOL+1) - 1 IF(RHS(JCOL) .NE. 0.D0) THEN T = RHS(JCOL)/LNZ(IXSTRT) RHS(JCOL) = T IPNT = JPNT + 1 CDIR$ IVDEP DO 100 IX = IXSTRT+1, IXSTOP I = LINDX(IPNT) RHS(I) = RHS(I) - T*LNZ(IX) IPNT = IPNT + 1 100 CONTINUE ENDIF IXSTRT = IXSTOP + 1 JPNT = JPNT + 1 200 CONTINUE FJCOL = LJCOL + 1 300 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C Modified: Sept 30, 1999 to improve efficiency in the case C in which the right-hand side and solution are both C expected to be sparse. Happens a lot in "dense" C column handling. C C*********************************************************************** C*********************************************************************** C********* BLKSLV ... BLOCK TRIANGULAR SOLUTIONS ********** C*********************************************************************** C*********************************************************************** C C PURPOSE: C GIVEN THE CHOLESKY FACTORIZATION OF A SPARSE SYMMETRIC C POSITIVE DEFINITE MATRIX, THIS SUBROUTINE PERFORMS THE C TRIANGULAR SOLUTION. IT USES OUTPUT FROM BLKFCT. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - SUPERNODE PARTITION. C (XLINDX,LINDX) - ROW INDICES FOR EACH SUPERNODE. C (XLNZ,LNZ) - CHOLESKY FACTOR. C C UPDATED PARAMETERS: C RHS - ON INPUT, CONTAINS THE RIGHT HAND SIDE. ON C OUTPUT, CONTAINS THE SOLUTION. C C*********************************************************************** C SUBROUTINE BLKSLV ( NSUPER, XSUPER, XLINDX, LINDX , XLNZ , & LNZ , RHS ) C C*********************************************************************** C INTEGER NSUPER INTEGER LINDX(*) , XSUPER(*) INTEGER XLINDX(*) , XLNZ(*) DOUBLE PRECISION LNZ(*) , RHS(*) C C*********************************************************************** C INTEGER FJCOL , I , IPNT , IX , IXSTOP, & IXSTRT, JCOL , JPNT , JSUP , LJCOL DOUBLE PRECISION T C C*********************************************************************** C IF ( NSUPER .LE. 0 ) RETURN C C ------------------------ C FORWARD SUBSTITUTION ... C ------------------------ FJCOL = XSUPER(1) DO 300 JSUP = 1, NSUPER LJCOL = XSUPER(JSUP+1) - 1 IXSTRT = XLNZ(FJCOL) JPNT = XLINDX(JSUP) DO 200 JCOL = FJCOL, LJCOL IXSTOP = XLNZ(JCOL+1) - 1 IF(RHS(JCOL) .NE. 0.D0) THEN T = RHS(JCOL)/LNZ(IXSTRT) RHS(JCOL) = T IPNT = JPNT + 1 CDIR$ IVDEP DO 100 IX = IXSTRT+1, IXSTOP I = LINDX(IPNT) RHS(I) = RHS(I) - T*LNZ(IX) IPNT = IPNT + 1 100 CONTINUE ENDIF IXSTRT = IXSTOP + 1 JPNT = JPNT + 1 200 CONTINUE FJCOL = LJCOL + 1 300 CONTINUE C C ------------------------- C BACKWARD SUBSTITUTION ... C ------------------------- LJCOL = XSUPER(NSUPER+1) - 1 DO 600 JSUP = NSUPER, 1, -1 FJCOL = XSUPER(JSUP) IXSTOP = XLNZ(LJCOL+1) - 1 JPNT = XLINDX(JSUP) + (LJCOL - FJCOL) DO 500 JCOL = LJCOL, FJCOL, -1 IXSTRT = XLNZ(JCOL) IPNT = JPNT + 1 T = RHS(JCOL) CDIR$ IVDEP DO 400 IX = IXSTRT+1, IXSTOP I = LINDX(IPNT) IF(RHS(I) .NE. 0.D0) T = T - LNZ(IX)*RHS(I) IPNT = IPNT + 1 400 CONTINUE IF(T .NE. 0.D0) THEN RHS(JCOL) = T/LNZ(IXSTRT) ELSE RHS(JCOL) = 0.D0 ENDIF IXSTOP = IXSTRT - 1 JPNT = JPNT - 1 500 CONTINUE LJCOL = FJCOL - 1 600 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: January 12, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** BTREE2 ..... BINARY TREE REPRESENTATION OF ETREE ******* C*********************************************************************** C*********************************************************************** C C PURPOSE: C TO DETERMINE A BINARY TREE REPRESENTATION OF THE ELIMINATION C TREE, FOR WHICH EVERY "LAST CHILD" HAS THE MAXIMUM POSSIBLE C COLUMN NONZERO COUNT IN THE FACTOR. THE RETURNED REPRESENTATION C WILL BE GIVEN BY THE FIRST-SON AND BROTHER VECTORS. THE ROOT OF C THE BINARY TREE IS ALWAYS NEQNS. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE. C IT IS ASSUMED THAT PARENT(I) > I EXCEPT OF C THE ROOTS. C COLCNT - COLUMN NONZERO COUNTS OF THE FACTOR. C C OUTPUT PARAMETERS: C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHER VECTOR. C C WORKING PARAMETERS: C LSON - LAST SON VECTOR. C C*********************************************************************** C SUBROUTINE BTREE2 ( NEQNS , PARENT, COLCNT, FSON , BROTHR, & LSON ) C C*********************************************************************** C INTEGER BROTHR(*) , COLCNT(*) , & FSON(*) , LSON(*) , & PARENT(*) C INTEGER NEQNS C C*********************************************************************** C INTEGER LROOT , NODE , NDLSON, NDPAR C C*********************************************************************** C IF ( NEQNS .LE. 0 ) RETURN C DO 100 NODE = 1, NEQNS FSON(NODE) = 0 BROTHR(NODE) = 0 LSON(NODE) = 0 100 CONTINUE LROOT = NEQNS C ------------------------------------------------------------ C FOR EACH NODE := NEQNS-1 STEP -1 DOWNTO 1, DO THE FOLLOWING. C ------------------------------------------------------------ IF ( NEQNS .LE. 1 ) RETURN DO 300 NODE = NEQNS-1, 1, -1 NDPAR = PARENT(NODE) IF ( NDPAR .LE. 0 .OR. NDPAR .EQ. NODE ) THEN C ------------------------------------------------- C NODE HAS NO PARENT. GIVEN STRUCTURE IS A FOREST. C SET NODE TO BE ONE OF THE ROOTS OF THE TREES. C ------------------------------------------------- BROTHR(LROOT) = NODE LROOT = NODE ELSE C ------------------------------------------- C OTHERWISE, BECOMES FIRST SON OF ITS PARENT. C ------------------------------------------- NDLSON = LSON(NDPAR) IF ( NDLSON .NE. 0 ) THEN IF ( COLCNT(NODE) .GE. COLCNT(NDLSON) ) THEN BROTHR(NODE) = FSON(NDPAR) FSON(NDPAR) = NODE ELSE BROTHR(NDLSON) = NODE LSON(NDPAR) = NODE ENDIF ELSE FSON(NDPAR) = NODE LSON(NDPAR) = NODE ENDIF ENDIF 300 CONTINUE BROTHR(LROOT) = 0 C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.3 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratoy C C*********************************************************************** C*********************************************************************** C****** CHLSUP .... DENSE CHOLESKY WITHIN SUPERNODE ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS CHOLESKY C FACTORIZATION ON THE COLUMNS OF A SUPERNODE C THAT HAVE RECEIVED ALL UPDATES FROM COLUMNS C EXTERNAL TO THE SUPERNODE. C C INPUT PARAMETERS - C M - NUMBER OF ROWS (LENGTH OF THE FIRST COLUMN). C N - NUMBER OF COLUMNS IN THE SUPERNODE. C XPNT - XPNT(J+1) POINTS ONE LOCATION BEYOND THE END C OF THE J-TH COLUMN OF THE SUPERNODE. C X(*) - CONTAINS THE COLUMNS OF OF THE SUPERNODE TO C BE FACTORED. C SMXPY - EXTERNAL ROUTINE: MATRIX-VECTOR MULTIPLY. C C OUTPUT PARAMETERS - C X(*) - ON OUTPUT, CONTAINS THE FACTORED COLUMNS OF C THE SUPERNODE. C IFLAG - UNCHANGED IF THERE IS NO ERROR. C =1 IF NONPOSITIVE DIAGONAL ENTRY IS ENCOUNTERED. C C*********************************************************************** C CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC SUBROUTINE CHLSUP ( M, N, SPLIT, XPNT, X, MXDIAG, NTINY, & IFLAG, MMPYN, SMXPY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C EXTERNAL MMPYN, SMXPY C INTEGER M, N, IFLAG C INTEGER XPNT(*), SPLIT(*) C CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC DOUBLE PRECISION X(*), MXDIAG INTEGER NTINY C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER FSTCOL, JBLK , JPNT , MM , NN , & NXTCOL, Q C C*********************************************************************** C JBLK = 0 FSTCOL = 1 MM = M JPNT = XPNT(FSTCOL) C C ---------------------------------------- C FOR EACH BLOCK JBLK IN THE SUPERNODE ... C ---------------------------------------- 100 CONTINUE IF ( FSTCOL .LE. N ) THEN JBLK = JBLK + 1 NN = SPLIT(JBLK) C ------------------------------------------ C ... PERFORM PARTIAL CHOLESKY FACTORIZATION C ON THE BLOCK. C ------------------------------------------ CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC CALL PCHOL ( MM, NN, XPNT(FSTCOL), X, MXDIAG, NTINY, & IFLAG, SMXPY ) IF ( IFLAG .EQ. 1 ) RETURN C ---------------------------------------------- C ... APPLY THE COLUMNS IN JBLK TO ANY COLUMNS C OF THE SUPERNODE REMAINING TO BE COMPUTED. C ---------------------------------------------- NXTCOL = FSTCOL + NN Q = N - NXTCOL + 1 MM = MM - NN JPNT = XPNT(NXTCOL) IF ( Q .GT. 0 ) THEN CALL MMPYN ( MM, NN, Q, XPNT(FSTCOL), X, X(JPNT), MM ) ENDIF FSTCOL = NXTCOL GO TO 100 ENDIF C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C********** CHORDR ..... CHILD REORDERING *********** C*********************************************************************** C*********************************************************************** C C PURPOSE: C REARRANGE THE CHILDREN OF EACH VERTEX SO THAT THE LAST ONE C MAXIMIZES (AMONG THE CHILDREN) THE NUMBER OF NONZEROS IN THE C CORRESPONDING COLUMN OF L. ALSO DETERMINE AN NEW POSTORDERING C BASED ON THE STRUCTURE OF THE MODIFIED ELIMINATION TREE. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. C C UPDATED PARAMETERS: C (PERM,INVP) - ON INPUT, THE GIVEN PERM AND INVERSE PERM C VECTORS. ON OUTPUT, THE NEW PERM AND C INVERSE PERM VECTORS OF THE NEW C POSTORDERING. C COLCNT - COLUMN COUNTS IN L UNDER INITIAL ORDERING; C MODIFIED TO REFLECT THE NEW ORDERING. C C OUTPUT PARAMETERS: C PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE C ASSOCIATED WITH THE NEW ORDERING. C C WORKING PARAMETERS: C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHER VECTOR. C INVPOS - THE INVERSE PERM VECTOR FOR THE C POSTORDERING. C C PROGRAM SUBROUTINES: C BTREE2, EPOST2, INVINV. C C*********************************************************************** C SUBROUTINE CHORDR ( NEQNS , XADJ , ADJNCY, PERM , INVP , & COLCNT, PARENT, FSON , BROTHR, INVPOS ) C C*********************************************************************** C INTEGER ADJNCY(*) , BROTHR(*) , & COLCNT(*) , FSON(*) , & INVP(*) , INVPOS(*) , & PARENT(*) , PERM(*) C INTEGER XADJ(*) INTEGER NEQNS C C*********************************************************************** C C ---------------------------------------------------------- C COMPUTE A BINARY REPRESENTATION OF THE ELIMINATION TREE, C SO THAT EACH "LAST CHILD" MAXIMIZES AMONG ITS SIBLINGS THE C NUMBER OF NONZEROS IN THE CORRESPONDING COLUMNS OF L. C ---------------------------------------------------------- CALL BTREE2 ( NEQNS , PARENT, COLCNT, FSON , BROTHR, & INVPOS ) C C ---------------------------------------------------- C POSTORDER THE ELIMINATION TREE (USING THE NEW BINARY C REPRESENTATION. C ---------------------------------------------------- CALL EPOST2 ( NEQNS , FSON , BROTHR, INVPOS, PARENT, & COLCNT, PERM ) C C -------------------------------------------------------- C COMPOSE THE ORIGINAL ORDERING WITH THE NEW POSTORDERING. C -------------------------------------------------------- CALL INVINV ( NEQNS , INVP , INVPOS, PERM ) C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** DSCAL1 .... SCALE A VECTOR ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE COMPUTES A <-- AX, WHERE A IS A C SCALAR AND X IS A VECTOR. C C INPUT PARAMETERS - C N - LENGTH OF THE VECTOR X. C A - SCALAR MULIPLIER. C X - VECTOR TO BE SCALED. C C OUTPUT PARAMETERS - C X - REPLACED BY THE SCALED VECTOR, AX. C C*********************************************************************** C SUBROUTINE DSCAL1 ( N, A, X ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER N DOUBLE PRECISION A, X(N) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER I C C*********************************************************************** C DO 100 I = 1, N X(I) = A * X(I) 100 CONTINUE RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C*************** EPOST2 ..... ETREE POSTORDERING #2 *************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C BASED ON THE BINARY REPRESENTATION (FIRST-SON,BROTHER) OF THE C ELIMINATION TREE, A POSTORDERING IS DETERMINED. THE C CORRESPONDING PARENT AND COLCNT VECTORS ARE ALSO MODIFIED TO C REFLECT THE REORDERING. C C INPUT PARAMETERS: C ROOT - ROOT OF THE ELIMINATION TREE (USUALLY IT C IS NEQNS). C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHR VECTOR. C C UPDATED PARAMETERS: C PARENT - THE PARENT VECTOR. C COLCNT - COLUMN NONZERO COUNTS OF THE FACTOR. C C OUTPUT PARAMETERS: C INVPOS - INVERSE PERMUTATION FOR THE POSTORDERING. C C WORKING PARAMETERS: C STACK - THE STACK FOR POSTORDER TRAVERSAL OF THE C TREE. C C*********************************************************************** C SUBROUTINE EPOST2 ( ROOT , FSON , BROTHR, INVPOS, PARENT, & COLCNT, STACK ) C C*********************************************************************** C INTEGER BROTHR(*) , COLCNT(*) , & FSON(*) , INVPOS(*) , & PARENT(*) , STACK(*) C INTEGER ROOT C C*********************************************************************** C INTEGER ITOP , NDPAR , NODE , NUM , NUNODE C C*********************************************************************** C NUM = 0 ITOP = 0 NODE = ROOT C ------------------------------------------------------------- C TRAVERSE ALONG THE FIRST SONS POINTER AND PUSH THE TREE NODES C ALONG THE TRAVERSAL INTO THE STACK. C ------------------------------------------------------------- 100 CONTINUE ITOP = ITOP + 1 STACK(ITOP) = NODE NODE = FSON(NODE) IF ( NODE .GT. 0 ) GO TO 100 C ---------------------------------------------------------- C IF POSSIBLE, POP A TREE NODE FROM THE STACK AND NUMBER IT. C ---------------------------------------------------------- 200 CONTINUE IF ( ITOP .LE. 0 ) GO TO 300 NODE = STACK(ITOP) ITOP = ITOP - 1 NUM = NUM + 1 INVPOS(NODE) = NUM C ---------------------------------------------------- C THEN, TRAVERSE TO ITS YOUNGER BROTHER IF IT HAS ONE. C ---------------------------------------------------- NODE = BROTHR(NODE) IF ( NODE .LE. 0 ) GO TO 200 GO TO 100 C 300 CONTINUE C ------------------------------------------------------------ C DETERMINE THE NEW PARENT VECTOR OF THE POSTORDERING. BROTHR C IS USED TEMPORARILY FOR THE NEW PARENT VECTOR. C ------------------------------------------------------------ DO 400 NODE = 1, NUM NUNODE = INVPOS(NODE) NDPAR = PARENT(NODE) IF ( NDPAR .GT. 0 ) NDPAR = INVPOS(NDPAR) BROTHR(NUNODE) = NDPAR 400 CONTINUE C DO 500 NUNODE = 1, NUM PARENT(NUNODE) = BROTHR(NUNODE) 500 CONTINUE C C ---------------------------------------------- C PERMUTE COLCNT(*) TO REFLECT THE NEW ORDERING. C ---------------------------------------------- DO 600 NODE = 1, NUM NUNODE = INVPOS(NODE) STACK(NUNODE) = COLCNT(NODE) 600 CONTINUE C DO 700 NODE = 1, NUM COLCNT(NODE) = STACK(NODE) 700 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C********** ETORDR ..... ELIMINATION TREE REORDERING *********** C*********************************************************************** C*********************************************************************** C C WRITTEN BY JOSEPH LIU (JUL 17, 1985) C C PURPOSE: C TO DETERMINE AN EQUIVALENT REORDERING BASED ON THE STRUCTURE OF C THE ELIMINATION TREE. A POSTORDERING OF THE GIVEN ELIMINATION C TREE IS RETURNED. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. C C UPDATED PARAMETERS: C (PERM,INVP) - ON INPUT, THE GIVEN PERM AND INVERSE PERM C VECTORS. ON OUTPUT, THE NEW PERM AND C INVERSE PERM VECTORS OF THE EQUIVALENT C ORDERING. C C OUTPUT PARAMETERS: C PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE C ASSOCIATED WITH THE NEW ORDERING. C C WORKING PARAMETERS: C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHER VECTOR. C INVPOS - THE INVERSE PERM VECTOR FOR THE C POSTORDERING. C C PROGRAM SUBROUTINES: C BETREE, ETPOST, ETREE , INVINV. C C*********************************************************************** C SUBROUTINE ETORDR ( NEQNS , XADJ , ADJNCY, PERM , INVP , & PARENT, FSON , BROTHR, INVPOS ) C C*********************************************************************** C INTEGER ADJNCY(*) , BROTHR(*) , & FSON(*) , INVP(*) , & INVPOS(*) , PARENT(*) , & PERM(*) C INTEGER XADJ(*) INTEGER NEQNS C C*********************************************************************** C C ----------------------------- C COMPUTE THE ELIMINATION TREE. C ----------------------------- CALL ETREE ( NEQNS, XADJ, ADJNCY, PERM, INVP, PARENT, INVPOS ) C C -------------------------------------------------------- C COMPUTE A BINARY REPRESENTATION OF THE ELIMINATION TREE. C -------------------------------------------------------- CALL BETREE ( NEQNS, PARENT, FSON, BROTHR ) C C ------------------------------- C POSTORDER THE ELIMINATION TREE. C ------------------------------- CALL ETPOST ( NEQNS, FSON, BROTHR, INVPOS, PARENT, PERM ) C C -------------------------------------------------------- C COMPOSE THE ORIGINAL ORDERING WITH THE NEW POSTORDERING. C -------------------------------------------------------- CALL INVINV ( NEQNS, INVP, INVPOS, PERM ) C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C*************** ETPOST ..... ETREE POSTORDERING *************** C*********************************************************************** C*********************************************************************** C C WRITTEN BY JOSEPH LIU (SEPT 17, 1986) C C PURPOSE: C BASED ON THE BINARY REPRESENTATION (FIRST-SON,BROTHER) OF C THE ELIMINATION TREE, A POSTORDERING IS DETERMINED. THE C CORRESPONDING PARENT VECTOR IS ALSO MODIFIED TO REFLECT C THE REORDERING. C C INPUT PARAMETERS: C ROOT - ROOT OF THE ELIMINATION TREE (USUALLY IT C IS NEQNS). C FSON - THE FIRST SON VECTOR. C BROTHR - THE BROTHR VECTOR. C C UPDATED PARAMETERS: C PARENT - THE PARENT VECTOR. C C OUTPUT PARAMETERS: C INVPOS - INVERSE PERMUTATION FOR THE POSTORDERING. C C WORKING PARAMETERS: C STACK - THE STACK FOR POSTORDER TRAVERSAL OF THE C TREE. C C*********************************************************************** C SUBROUTINE ETPOST ( ROOT , FSON , BROTHR, INVPOS, PARENT, & STACK ) C C*********************************************************************** C INTEGER BROTHR(*) , FSON(*) , & INVPOS(*) , PARENT(*) , & STACK(*) C INTEGER ROOT C C*********************************************************************** C INTEGER ITOP , NDPAR , NODE , NUM , NUNODE C C*********************************************************************** C NUM = 0 ITOP = 0 NODE = ROOT C ------------------------------------------------------------- C TRAVERSE ALONG THE FIRST SONS POINTER AND PUSH THE TREE NODES C ALONG THE TRAVERSAL INTO THE STACK. C ------------------------------------------------------------- 100 CONTINUE ITOP = ITOP + 1 STACK(ITOP) = NODE NODE = FSON(NODE) IF ( NODE .GT. 0 ) GO TO 100 C ---------------------------------------------------------- C IF POSSIBLE, POP A TREE NODE FROM THE STACK AND NUMBER IT. C ---------------------------------------------------------- 200 CONTINUE IF ( ITOP .LE. 0 ) GO TO 300 NODE = STACK(ITOP) ITOP = ITOP - 1 NUM = NUM + 1 INVPOS(NODE) = NUM C ---------------------------------------------------- C THEN, TRAVERSE TO ITS YOUNGER BROTHER IF IT HAS ONE. C ---------------------------------------------------- NODE = BROTHR(NODE) IF ( NODE .LE. 0 ) GO TO 200 GO TO 100 C 300 CONTINUE C ------------------------------------------------------------ C DETERMINE THE NEW PARENT VECTOR OF THE POSTORDERING. BROTHR C IS USED TEMPORARILY FOR THE NEW PARENT VECTOR. C ------------------------------------------------------------ DO 400 NODE = 1, NUM NUNODE = INVPOS(NODE) NDPAR = PARENT(NODE) IF ( NDPAR .GT. 0 ) NDPAR = INVPOS(NDPAR) BROTHR(NUNODE) = NDPAR 400 CONTINUE C DO 500 NUNODE = 1, NUM PARENT(NUNODE) = BROTHR(NUNODE) 500 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C**************** ETREE ..... ELIMINATION TREE ***************** C*********************************************************************** C*********************************************************************** C C WRITTEN BY JOSEPH LIU (JUL 17, 1985) C C PURPOSE: C TO DETERMINE THE ELIMINATION TREE FROM A GIVEN ORDERING AND C THE ADJACENCY STRUCTURE. THE PARENT VECTOR IS RETURNED. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. C (PERM,INVP) - PERMUTATION AND INVERSE PERMUTATION VECTORS C C OUTPUT PARAMETERS: C PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE. C C WORKING PARAMETERS: C ANCSTR - THE ANCESTOR VECTOR. C C*********************************************************************** C SUBROUTINE ETREE ( NEQNS , XADJ , ADJNCY, PERM , INVP , & PARENT, ANCSTR ) C C*********************************************************************** C INTEGER ADJNCY(*) , ANCSTR(*) , & INVP(*) , PARENT(*) , & PERM(*) C INTEGER NEQNS INTEGER XADJ(*) C C*********************************************************************** C INTEGER I , J , JSTOP , JSTRT , NBR , & NEXT , NODE C C*********************************************************************** C IF ( NEQNS .LE. 0 ) RETURN C DO 400 I = 1, NEQNS PARENT(I) = 0 ANCSTR(I) = 0 NODE = PERM(I) C JSTRT = XADJ(NODE) JSTOP = XADJ(NODE+1) - 1 IF ( JSTRT .LE. JSTOP ) THEN DO 300 J = JSTRT, JSTOP NBR = ADJNCY(J) NBR = INVP(NBR) IF ( NBR .LT. I ) THEN C ------------------------------------------- C FOR EACH NBR, FIND THE ROOT OF ITS CURRENT C ELIMINATION TREE. PERFORM PATH COMPRESSION C AS THE SUBTREE IS TRAVERSED. C ------------------------------------------- 100 CONTINUE IF ( ANCSTR(NBR) .EQ. I ) GO TO 300 IF ( ANCSTR(NBR) .GT. 0 ) THEN NEXT = ANCSTR(NBR) ANCSTR(NBR) = I NBR = NEXT GO TO 100 ENDIF C -------------------------------------------- C NOW, NBR IS THE ROOT OF THE SUBTREE. MAKE I C THE PARENT NODE OF THIS ROOT. C -------------------------------------------- PARENT(NBR) = I ANCSTR(NBR) = I ENDIF 300 CONTINUE ENDIF 400 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: January 12, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************** FCNTHN ..... FIND NONZERO COUNTS *************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE DETERMINES THE ROW COUNTS AND COLUMN COUNTS IN C THE CHOLESKY FACTOR. IT USES A DISJOINT SET UNION ALGORITHM. C C TECHNIQUES: C 1) SUPERNODE DETECTION. C 2) PATH HALVING. C 3) NO UNION BY RANK. C C NOTES: C 1) ASSUMES A POSTORDERING OF THE ELIMINATION TREE. C C INPUT PARAMETERS: C (I) NEQNS - NUMBER OF EQUATIONS. C (I) ADJLEN - LENGTH OF ADJACENCY STRUCTURE. C (I) XADJ(*) - ARRAY OF LENGTH NEQNS+1, CONTAINING POINTERS C TO THE ADJACENCY STRUCTURE. C (I) ADJNCY(*) - ARRAY OF LENGTH XADJ(NEQNS+1)-1, CONTAINING C THE ADJACENCY STRUCTURE. C (I) PERM(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C POSTORDERING. C (I) INVP(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C INVERSE OF THE POSTORDERING. C (I) ETPAR(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C ELIMINATION TREE OF THE POSTORDERED MATRIX. C C OUTPUT PARAMETERS: C (I) ROWCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER C OF NONZEROS IN EACH ROW OF THE FACTOR, C INCLUDING THE DIAGONAL ENTRY. C (I) COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER C OF NONZEROS IN EACH COLUMN OF THE FACTOR, C INCLUDING THE DIAGONAL ENTRY. C (I) NLNZ - NUMBER OF NONZEROS IN THE FACTOR, INCLUDING C THE DIAGONAL ENTRIES. C C WORK PARAMETERS: C (I) SET(*) - ARRAY OF LENGTH NEQNS USED TO MAINTAIN THE C DISJOINT SETS (I.E., SUBTREES). C (I) PRVLF(*) - ARRAY OF LENGTH NEQNS USED TO RECORD THE C PREVIOUS LEAF OF EACH ROW SUBTREE. C (I) LEVEL(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING THE LEVEL C (DISTANCE FROM THE ROOT). C (I) WEIGHT(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING WEIGHTS C USED TO COMPUTE COLUMN COUNTS. C (I) FDESC(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING THE C FIRST (I.E., LOWEST-NUMBERED) DESCENDANT. C (I) NCHILD(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING THE C NUMBER OF CHILDREN. C (I) PRVNBR(*) - ARRAY OF LENGTH NEQNS USED TO RECORD THE C PREVIOUS ``LOWER NEIGHBOR'' OF EACH NODE. C C FIRST CREATED ON APRIL 12, 1990. C LAST UPDATED ON JANUARY 12, 1995. C C*********************************************************************** C SUBROUTINE FCNTHN ( NEQNS , ADJLEN, XADJ , ADJNCY, PERM , & INVP , ETPAR , ROWCNT, COLCNT, NLNZ , & SET , PRVLF , LEVEL , WEIGHT, FDESC , & NCHILD, PRVNBR ) C C ----------- C PARAMETERS. C ----------- INTEGER ADJLEN, NEQNS , NLNZ INTEGER ADJNCY(ADJLEN) , COLCNT(NEQNS) , & ETPAR(NEQNS) , FDESC(0:NEQNS), & INVP(NEQNS) , LEVEL(0:NEQNS), & NCHILD(0:NEQNS) , PERM(NEQNS) , & PRVLF(NEQNS) , PRVNBR(NEQNS) , & ROWCNT(NEQNS) , SET(NEQNS) , & WEIGHT(0:NEQNS) INTEGER XADJ(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER HINBR , IFDESC, J , JSTOP , JSTRT , & K , LAST1 , LAST2 , LCA , LFLAG , & LOWNBR, OLDNBR, PARENT, PLEAF , TEMP , & XSUP C C*********************************************************************** C C -------------------------------------------------- C COMPUTE LEVEL(*), FDESC(*), NCHILD(*). C INITIALIZE XSUP, ROWCNT(*), COLCNT(*), C SET(*), PRVLF(*), WEIGHT(*), PRVNBR(*). C -------------------------------------------------- XSUP = 1 LEVEL(0) = 0 DO 100 K = NEQNS, 1, -1 ROWCNT(K) = 1 COLCNT(K) = 0 SET(K) = K PRVLF(K) = 0 LEVEL(K) = LEVEL(ETPAR(K)) + 1 WEIGHT(K) = 1 FDESC(K) = K NCHILD(K) = 0 PRVNBR(K) = 0 100 CONTINUE NCHILD(0) = 0 FDESC(0) = 0 DO 200 K = 1, NEQNS PARENT = ETPAR(K) WEIGHT(PARENT) = 0 NCHILD(PARENT) = NCHILD(PARENT) + 1 IFDESC = FDESC(K) IF ( IFDESC .LT. FDESC(PARENT) ) THEN FDESC(PARENT) = IFDESC ENDIF 200 CONTINUE C ------------------------------------ C FOR EACH ``LOW NEIGHBOR'' LOWNBR ... C ------------------------------------ DO 600 LOWNBR = 1, NEQNS LFLAG = 0 IFDESC = FDESC(LOWNBR) OLDNBR = PERM(LOWNBR) JSTRT = XADJ(OLDNBR) JSTOP = XADJ(OLDNBR+1) - 1 C ----------------------------------------------- C FOR EACH ``HIGH NEIGHBOR'', HINBR OF LOWNBR ... C ----------------------------------------------- DO 500 J = JSTRT, JSTOP HINBR = INVP(ADJNCY(J)) IF ( HINBR .GT. LOWNBR ) THEN IF ( IFDESC .GT. PRVNBR(HINBR) ) THEN C ------------------------- C INCREMENT WEIGHT(LOWNBR). C ------------------------- WEIGHT(LOWNBR) = WEIGHT(LOWNBR) + 1 PLEAF = PRVLF(HINBR) C ----------------------------------------- C IF HINBR HAS NO PREVIOUS ``LOW NEIGHBOR'' C THEN ... C ----------------------------------------- IF ( PLEAF .EQ. 0 ) THEN C ----------------------------------------- C ... ACCUMULATE LOWNBR-->HINBR PATH LENGTH C IN ROWCNT(HINBR). C ----------------------------------------- ROWCNT(HINBR) = ROWCNT(HINBR) + & LEVEL(LOWNBR) - LEVEL(HINBR) ELSE C ----------------------------------------- C ... OTHERWISE, LCA <-- FIND(PLEAF), WHICH C IS THE LEAST COMMON ANCESTOR OF PLEAF C AND LOWNBR. C (PATH HALVING.) C ----------------------------------------- LAST1 = PLEAF LAST2 = SET(LAST1) LCA = SET(LAST2) 300 CONTINUE IF ( LCA .NE. LAST2 ) THEN SET(LAST1) = LCA LAST1 = LCA LAST2 = SET(LAST1) LCA = SET(LAST2) GO TO 300 ENDIF C ------------------------------------- C ACCUMULATE PLEAF-->LCA PATH LENGTH IN C ROWCNT(HINBR). C DECREMENT WEIGHT(LCA). C ------------------------------------- ROWCNT(HINBR) = ROWCNT(HINBR) & + LEVEL(LOWNBR) - LEVEL(LCA) WEIGHT(LCA) = WEIGHT(LCA) - 1 ENDIF C ---------------------------------------------- C LOWNBR NOW BECOMES ``PREVIOUS LEAF'' OF HINBR. C ---------------------------------------------- PRVLF(HINBR) = LOWNBR LFLAG = 1 ENDIF C -------------------------------------------------- C LOWNBR NOW BECOMES ``PREVIOUS NEIGHBOR'' OF HINBR. C -------------------------------------------------- PRVNBR(HINBR) = LOWNBR ENDIF 500 CONTINUE C ---------------------------------------------------- C DECREMENT WEIGHT ( PARENT(LOWNBR) ). C SET ( P(LOWNBR) ) <-- SET ( P(LOWNBR) ) + SET(XSUP). C ---------------------------------------------------- PARENT = ETPAR(LOWNBR) WEIGHT(PARENT) = WEIGHT(PARENT) - 1 IF ( LFLAG .EQ. 1 .OR. & NCHILD(LOWNBR) .GE. 2 ) THEN XSUP = LOWNBR ENDIF SET(XSUP) = PARENT 600 CONTINUE C --------------------------------------------------------- C USE WEIGHTS TO COMPUTE COLUMN (AND TOTAL) NONZERO COUNTS. C --------------------------------------------------------- NLNZ = 0 DO 700 K = 1, NEQNS TEMP = COLCNT(K) + WEIGHT(K) COLCNT(K) = TEMP NLNZ = NLNZ + TEMP PARENT = ETPAR(K) IF ( PARENT .NE. 0 ) THEN COLCNT(PARENT) = COLCNT(PARENT) + TEMP ENDIF 700 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: May 26, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C**** FNSPLT ..... COMPUTE FINE PARTITIONING OF SUPERNODES ***** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE DETERMINES A FINE PARTITIONING OF SUPERNODES C WHEN THERE IS A CACHE AVAILABLE ON THE MACHINE. THE FINE C PARTITIONING IS CHOSEN SO THAT DATA RE-USE IS MAXIMIZED. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C NSUPER - NUMBER OF SUPERNODES. C XSUPER - INTEGER ARRAY OF SIZE (NSUPER+1) CONTAINING C THE SUPERNODE PARTITIONING. C XLINDX - INTEGER ARRAY OF SIZE (NSUPER+1) CONTAINING C POINTERS IN THE SUPERNODE INDICES. C CACHSZ - CACHE SIZE IN KILO BYTES. C IF THERE IS NO CACHE, SET CACHSZ = 0. C C OUTPUT PARAMETERS: C SPLIT - INTEGER ARRAY OF SIZE NEQNS CONTAINING THE C FINE PARTITIONING. C C*********************************************************************** C SUBROUTINE FNSPLT ( NEQNS , NSUPER, XSUPER, XLINDX, & CACHSZ, SPLIT ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER CACHSZ, NEQNS , NSUPER INTEGER XSUPER(*), SPLIT(*) INTEGER XLINDX(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER CACHE , CURCOL, FSTCOL, HEIGHT, KCOL , 1 KSUP , LSTCOL, NCOLS , NXTBLK, USED , 1 WIDTH C C ******************************************************************* C C -------------------------------------------- C COMPUTE THE NUMBER OF 8-BYTE WORDS IN CACHE. C -------------------------------------------- IF ( CACHSZ .LE. 0 ) THEN CACHE = 2 000 000 000 ELSE CACHE = ( FLOAT(CACHSZ) * 1024. / 8. ) * 0.9 ENDIF C C --------------- C INITIALIZATION. C --------------- DO 100 KCOL = 1, NEQNS SPLIT(KCOL) = 0 100 CONTINUE C C --------------------------- C FOR EACH SUPERNODE KSUP ... C --------------------------- DO 1000 KSUP = 1, NSUPER C ----------------------- C ... GET SUPERNODE INFO. C ----------------------- HEIGHT = XLINDX(KSUP+1) - XLINDX(KSUP) FSTCOL = XSUPER(KSUP) LSTCOL = XSUPER(KSUP+1) - 1 WIDTH = LSTCOL - FSTCOL + 1 NXTBLK = FSTCOL C -------------------------------------- C ... UNTIL ALL COLUMNS OF THE SUPERNODE C HAVE BEEN PROCESSED ... C -------------------------------------- CURCOL = FSTCOL - 1 200 CONTINUE C ------------------------------------------- C ... PLACE THE FIRST COLUMN(S) IN THE CACHE. C ------------------------------------------- CURCOL = CURCOL + 1 IF ( CURCOL .LT. LSTCOL ) THEN CURCOL = CURCOL + 1 NCOLS = 2 USED = 4 * HEIGHT - 1 HEIGHT = HEIGHT - 2 ELSE NCOLS = 1 USED = 3 * HEIGHT HEIGHT = HEIGHT - 1 ENDIF C C -------------------------------------- C ... WHILE THE CACHE IS NOT FILLED AND C THERE ARE COLUMNS OF THE SUPERNODE C REMAINING TO BE PROCESSED ... C -------------------------------------- 300 CONTINUE IF ( USED+HEIGHT .LT. CACHE .AND. & CURCOL .LT. LSTCOL ) THEN C -------------------------------- C ... ADD ANOTHER COLUMN TO CACHE. C -------------------------------- CURCOL = CURCOL + 1 NCOLS = NCOLS + 1 USED = USED + HEIGHT HEIGHT = HEIGHT - 1 GO TO 300 ENDIF C ------------------------------------- C ... RECORD THE NUMBER OF COLUMNS THAT C FILLED THE CACHE. C ------------------------------------- SPLIT(NXTBLK) = NCOLS NXTBLK = NXTBLK + 1 C -------------------------- C ... GO PROCESS NEXT BLOCK. C -------------------------- IF ( CURCOL .LT. LSTCOL ) GO TO 200 1000 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** FNTSIZ ..... COMPUTE WORK STORAGE SIZE FOR BLKFCT ****** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE DETERMINES THE SIZE OF THE WORKING STORAGE C REQUIRED BY BLKFCT. C C INPUT PARAMETERS: C NSUPER - NUMBER OF SUPERNODES. C XSUPER - INTEGER ARRAY OF SIZE (NSUPER+1) CONTAINING C THE SUPERNODE PARTITIONING. C SNODE - SUPERNODE MEMBERSHIP. C (XLINDX,LINDX) - ARRAYS DESCRIBING THE SUPERNODAL STRUCTURE. C C OUTPUT PARAMETERS: C TMPSIZ - SIZE OF WORKING STORAGE REQUIRED BY BLKFCT. C C*********************************************************************** C SUBROUTINE FNTSIZ ( NSUPER, XSUPER, SNODE , XLINDX, & LINDX , TMPSIZ ) C C*********************************************************************** C INTEGER NSUPER, TMPSIZ INTEGER XLINDX(*) , XSUPER(*) INTEGER LINDX (*) , SNODE (*) C INTEGER BOUND , CLEN , CURSUP, I , IBEGIN, IEND , & KSUP , LENGTH, NCOLS , NXTSUP, & TSIZE , WIDTH C C*********************************************************************** C C RETURNS SIZE OF TEMP ARRAY USED BY BLKFCT FACTORIZATION ROUTINE. C NOTE THAT THE VALUE RETURNED IS AN ESTIMATE, THOUGH IT IS USUALLY C TIGHT. C C ---------------------------------------- C COMPUTE SIZE OF TEMPORARY STORAGE VECTOR C NEEDED BY BLKFCT. C ---------------------------------------- TMPSIZ = 0 DO 500 KSUP = NSUPER, 1, -1 NCOLS = XSUPER(KSUP+1) - XSUPER(KSUP) IBEGIN = XLINDX(KSUP) + NCOLS IEND = XLINDX(KSUP+1) - 1 LENGTH = IEND - IBEGIN + 1 BOUND = LENGTH * (LENGTH + 1) / 2 IF ( BOUND .GT. TMPSIZ ) THEN CURSUP = SNODE(LINDX(IBEGIN)) CLEN = XLINDX(CURSUP+1) - XLINDX(CURSUP) WIDTH = 0 DO 400 I = IBEGIN, IEND NXTSUP = SNODE(LINDX(I)) IF ( NXTSUP .EQ. CURSUP ) THEN WIDTH = WIDTH + 1 IF ( I .EQ. IEND ) THEN IF ( CLEN .GT. LENGTH ) THEN TSIZE = LENGTH * WIDTH - & (WIDTH - 1) * WIDTH / 2 TMPSIZ = MAX ( TSIZE , TMPSIZ ) ENDIF ENDIF ELSE IF ( CLEN .GT. LENGTH ) THEN TSIZE = LENGTH * WIDTH - & (WIDTH - 1) * WIDTH / 2 TMPSIZ = MAX ( TSIZE , TMPSIZ ) ENDIF LENGTH = LENGTH - WIDTH BOUND = LENGTH * (LENGTH + 1) / 2 IF ( BOUND .LE. TMPSIZ ) GO TO 500 WIDTH = 1 CURSUP = NXTSUP CLEN = XLINDX(CURSUP+1) - XLINDX(CURSUP) ENDIF 400 CONTINUE ENDIF 500 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C**************** FSUP1 ..... FIND SUPERNODES #1 ***************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE IS THE FIRST OF TWO ROUTINES FOR FINDING A C MAXIMAL SUPERNODE PARTITION. IT RETURNS ONLY THE NUMBER OF C SUPERNODES NSUPER AND THE SUPERNODE MEMBERSHIP VECTOR SNODE(*), C WHICH IS OF LENGTH NEQNS. THE VECTORS OF LENGTH NSUPER ARE C COMPUTED SUBSEQUENTLY BY THE COMPANION ROUTINE FSUP2. C C METHOD AND ASSUMPTIONS: C THIS ROUTINE USES THE ELIMINATION TREE AND THE FACTOR COLUMN C COUNTS TO COMPUTE THE SUPERNODE PARTITION; IT ALSO ASSUMES A C POSTORDERING OF THE ELIMINATION TREE. C C INPUT PARAMETERS: C (I) NEQNS - NUMBER OF EQUATIONS. C (I) ETPAR(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C ELIMINATION TREE OF THE POSTORDERED MATRIX. C (I) COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C FACTOR COLUMN COUNTS: I.E., THE NUMBER OF C NONZERO ENTRIES IN EACH COLUMN OF L C (INCLUDING THE DIAGONAL ENTRY). C C OUTPUT PARAMETERS: C (I) NOFSUB - NUMBER OF SUBSCRIPTS. C (I) NSUPER - NUMBER OF SUPERNODES (<= NEQNS). C (I) SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING C SUPERNODE MEMBERSHIP. C C FIRST CREATED ON JANUARY 18, 1992. C LAST UPDATED ON NOVEMBER 11, 1994. C C*********************************************************************** C SUBROUTINE FSUP1 ( NEQNS , ETPAR , COLCNT, NOFSUB, NSUPER, & SNODE ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER NEQNS , NOFSUB, NSUPER INTEGER COLCNT(*) , ETPAR(*) , & SNODE(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER KCOL C C*********************************************************************** C C -------------------------------------------- C COMPUTE THE FUNDAMENTAL SUPERNODE PARTITION. C -------------------------------------------- NSUPER = 1 SNODE(1) = 1 NOFSUB = COLCNT(1) DO 300 KCOL = 2, NEQNS IF ( ETPAR(KCOL-1) .EQ. KCOL ) THEN IF ( COLCNT(KCOL-1) .EQ. COLCNT(KCOL)+1 ) THEN SNODE(KCOL) = NSUPER GO TO 300 ENDIF ENDIF NSUPER = NSUPER + 1 SNODE(KCOL) = NSUPER NOFSUB = NOFSUB + COLCNT(KCOL) 300 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C**************** FSUP2 ..... FIND SUPERNODES #2 ***************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE IS THE SECOND OF TWO ROUTINES FOR FINDING A C MAXIMAL SUPERNODE PARTITION. IT'S SOLE PURPOSE IS TO C CONSTRUCT THE NEEDED VECTOR OF LENGTH NSUPER: XSUPER(*). THE C FIRST ROUTINE FSUP1 COMPUTES THE NUMBER OF SUPERNODES AND THE C SUPERNODE MEMBERSHIP VECTOR SNODE(*), WHICH IS OF LENGTH NEQNS. C C C ASSUMPTIONS: C THIS ROUTINE ASSUMES A POSTORDERING OF THE ELIMINATION TREE. IT C ALSO ASSUMES THAT THE OUTPUT FROM FSUP1 IS AVAILABLE. C C INPUT PARAMETERS: C (I) NEQNS - NUMBER OF EQUATIONS. C (I) NSUPER - NUMBER OF SUPERNODES (<= NEQNS). C (I) ETPAR(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C ELIMINATION TREE OF THE POSTORDERED MATRIX. C (I) SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING C SUPERNODE MEMBERSHIP. C C OUTPUT PARAMETERS: C (I) XSUPER(*) - ARRAY OF LENGTH NSUPER+1, CONTAINING THE C SUPERNODE PARTITIONING. C C FIRST CREATED ON JANUARY 18, 1992. C LAST UPDATED ON NOVEMEBER 22, 1994. C C*********************************************************************** C SUBROUTINE FSUP2 ( NEQNS , NSUPER, ETPAR , SNODE , XSUPER ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER NEQNS , NSUPER INTEGER ETPAR(*) , SNODE(*) , & XSUPER(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER KCOL , KSUP , LSTSUP C C*********************************************************************** C C ------------------------------------------------- C COMPUTE THE SUPERNODE PARTITION VECTOR XSUPER(*). C ------------------------------------------------- LSTSUP = NSUPER + 1 DO 100 KCOL = NEQNS, 1, -1 KSUP = SNODE(KCOL) IF ( KSUP .NE. LSTSUP ) THEN XSUPER(LSTSUP) = KCOL + 1 ENDIF LSTSUP = KSUP 100 CONTINUE XSUPER(1) = 1 C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C--- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = GENMMD C (C) UNIVERSITY OF WATERLOO JANUARY 1984 C*********************************************************************** C*********************************************************************** C**** GENMMD ..... MULTIPLE MINIMUM EXTERNAL DEGREE ************ C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE IMPLEMENTS THE MINIMUM DEGREE C ALGORITHM. IT MAKES USE OF THE IMPLICIT REPRESENTATION C OF ELIMINATION GRAPHS BY QUOTIENT GRAPHS, AND THE C NOTION OF INDISTINGUISHABLE NODES. IT ALSO IMPLEMENTS C THE MODIFICATIONS BY MULTIPLE ELIMINATION AND MINIMUM C EXTERNAL DEGREE. C --------------------------------------------- C CAUTION - THE ADJACENCY VECTOR ADJNCY WILL BE C DESTROYED. C --------------------------------------------- C C INPUT PARAMETERS - C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. C DELTA - TOLERANCE VALUE FOR MULTIPLE ELIMINATION. C MAXINT - MAXIMUM MACHINE REPRESENTABLE (SHORT) INTEGER C (ANY SMALLER ESTIMATE WILL DO) FOR MARKING C NODES. C C OUTPUT PARAMETERS - C PERM - THE MINIMUM DEGREE ORDERING. C INVP - THE INVERSE OF PERM. C NOFSUB - AN UPPER BOUND ON THE NUMBER OF NONZERO C SUBSCRIPTS FOR THE COMPRESSED STORAGE SCHEME. C C WORKING PARAMETERS - C DHEAD - VECTOR FOR HEAD OF DEGREE LISTS. C INVP - USED TEMPORARILY FOR DEGREE FORWARD LINK. C PERM - USED TEMPORARILY FOR DEGREE BACKWARD LINK. C QSIZE - VECTOR FOR SIZE OF SUPERNODES. C LLIST - VECTOR FOR TEMPORARY LINKED LISTS. C MARKER - A TEMPORARY MARKER VECTOR. C C PROGRAM SUBROUTINES - C MMDELM, MMDINT, MMDNUM, MMDUPD. C C*********************************************************************** C SUBROUTINE GENMMD ( NEQNS, XADJ, ADJNCY, INVP, PERM, 1 DELTA, DHEAD, QSIZE, LLIST, MARKER, 1 MAXINT, NOFSUB ) C C*********************************************************************** C INTEGER ADJNCY(*), DHEAD(*) , INVP(*) , LLIST(*) , 1 MARKER(*), PERM(*) , QSIZE(*) INTEGER XADJ(*) INTEGER DELTA , EHEAD , I , MAXINT, MDEG , 1 MDLMT , MDNODE, NEQNS , NEXTMD, NOFSUB, 1 NUM, TAG C C*********************************************************************** C IF ( NEQNS .LE. 0 ) RETURN C C ------------------------------------------------ C INITIALIZATION FOR THE MINIMUM DEGREE ALGORITHM. C ------------------------------------------------ NOFSUB = 0 CALL MMDINT ( NEQNS, XADJ, ADJNCY, DHEAD, INVP, PERM, 1 QSIZE, LLIST, MARKER ) C C ---------------------------------------------- C NUM COUNTS THE NUMBER OF ORDERED NODES PLUS 1. C ---------------------------------------------- NUM = 1 C C ----------------------------- C ELIMINATE ALL ISOLATED NODES. C ----------------------------- NEXTMD = DHEAD(1) 100 CONTINUE IF ( NEXTMD .LE. 0 ) GO TO 200 MDNODE = NEXTMD NEXTMD = INVP(MDNODE) MARKER(MDNODE) = MAXINT INVP(MDNODE) = - NUM NUM = NUM + 1 GO TO 100 C 200 CONTINUE C ---------------------------------------- C SEARCH FOR NODE OF THE MINIMUM DEGREE. C MDEG IS THE CURRENT MINIMUM DEGREE; C TAG IS USED TO FACILITATE MARKING NODES. C ---------------------------------------- IF ( NUM .GT. NEQNS ) GO TO 1000 TAG = 1 DHEAD(1) = 0 MDEG = 2 300 CONTINUE IF ( DHEAD(MDEG) .GT. 0 ) GO TO 400 MDEG = MDEG + 1 GO TO 300 400 CONTINUE C ------------------------------------------------- C USE VALUE OF DELTA TO SET UP MDLMT, WHICH GOVERNS C WHEN A DEGREE UPDATE IS TO BE PERFORMED. C ------------------------------------------------- MDLMT = MDEG + DELTA EHEAD = 0 C 500 CONTINUE MDNODE = DHEAD(MDEG) IF ( MDNODE .GT. 0 ) GO TO 600 MDEG = MDEG + 1 IF ( MDEG .GT. MDLMT ) GO TO 900 GO TO 500 600 CONTINUE C ---------------------------------------- C REMOVE MDNODE FROM THE DEGREE STRUCTURE. C ---------------------------------------- NEXTMD = INVP(MDNODE) DHEAD(MDEG) = NEXTMD IF ( NEXTMD .GT. 0 ) PERM(NEXTMD) = - MDEG INVP(MDNODE) = - NUM NOFSUB = NOFSUB + MDEG + QSIZE(MDNODE) - 2 IF ( NUM+QSIZE(MDNODE) .GT. NEQNS ) GO TO 1000 C ---------------------------------------------- C ELIMINATE MDNODE AND PERFORM QUOTIENT GRAPH C TRANSFORMATION. RESET TAG VALUE IF NECESSARY. C ---------------------------------------------- TAG = TAG + 1 IF ( TAG .LT. MAXINT ) GO TO 800 TAG = 1 DO 700 I = 1, NEQNS IF ( MARKER(I) .LT. MAXINT ) MARKER(I) = 0 700 CONTINUE 800 CONTINUE CALL MMDELM ( MDNODE, XADJ, ADJNCY, DHEAD, INVP, 1 PERM, QSIZE, LLIST, MARKER, MAXINT, 1 TAG ) NUM = NUM + QSIZE(MDNODE) LLIST(MDNODE) = EHEAD EHEAD = MDNODE IF ( DELTA .GE. 0 ) GO TO 500 900 CONTINUE C ------------------------------------------- C UPDATE DEGREES OF THE NODES INVOLVED IN THE C MINIMUM DEGREE NODES ELIMINATION. C ------------------------------------------- IF ( NUM .GT. NEQNS ) GO TO 1000 CALL MMDUPD ( EHEAD, NEQNS, XADJ, ADJNCY, DELTA, MDEG, 1 DHEAD, INVP, PERM, QSIZE, LLIST, MARKER, 1 MAXINT, TAG ) GO TO 300 C 1000 CONTINUE CALL MMDNUM ( NEQNS, PERM, INVP, QSIZE ) RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C REAL FUNCTION GTIMER () C -------------------------- C FOR IBM RS/6000 ... C INTEGER MCLOCK C GTIMER = MCLOCK()/100.0 C -------------------------- C FOR MOST BERKELEY UNIX ... C REAL ETIME C REAL VEC(2) C GTIMER = ETIME(VEC) C -------------------------- C FOR CRAY ... C REAL SECOND C GTIMER = SECOND() C -------------------------- C AS RECOMMENDED BY BDR ... GTIMER = 0.0 RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** IGATHR .... INTEGER GATHER OPERATION ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS A STANDARD INTEGER GATHER C OPERATION. C C INPUT PARAMETERS - C KLEN - LENGTH OF THE LIST OF GLOBAL INDICES. C LINDX - LIST OF GLOBAL INDICES. C INDMAP - INDEXED BY GLOBAL INDICES, IT CONTAINS THE C REQUIRED RELATIVE INDICES. C C OUTPUT PARAMETERS - C RELIND - LIST RELATIVE INDICES. C C*********************************************************************** C SUBROUTINE IGATHR ( KLEN , LINDX, INDMAP, RELIND ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER KLEN INTEGER INDMAP(*), LINDX (*), RELIND(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER I C C*********************************************************************** C CDIR$ IVDEP DO 100 I = 1, KLEN RELIND(I) = INDMAP(LINDX(I)) 100 CONTINUE RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C C ------------------------------------------------------ C INPUT NUMERICAL VALUES INTO SPARSE DATA STRUCTURES ... C ------------------------------------------------------ C SUBROUTINE INPNV ( NEQNS, XADJF, ADJF, ANZF, PERM, INVP, & NSUPER, XSUPER, XLINDX, LINDX, & XLNZ, LNZ, OFFSET ) C INTEGER XADJF(*), ADJF(*) DOUBLE PRECISION ANZF(*) INTEGER PERM(*), INVP(*) INTEGER NEQNS, NSUPER INTEGER XSUPER(*), XLINDX(*), LINDX(*) INTEGER XLNZ(*) DOUBLE PRECISION LNZ(*) INTEGER OFFSET(*) C INTEGER I, II, J, JLEN, JSUPER, LAST, OLDJ C DO 500 JSUPER = 1, NSUPER C C ---------------------------------------- C FOR EACH SUPERNODE, DO THE FOLLOWING ... C ---------------------------------------- C C ----------------------------------------------- C FIRST GET OFFSET TO FACILITATE NUMERICAL INPUT. C ----------------------------------------------- JLEN = XLINDX(JSUPER+1) - XLINDX(JSUPER) DO 100 II = XLINDX(JSUPER), XLINDX(JSUPER+1)-1 I = LINDX(II) JLEN = JLEN - 1 OFFSET(I) = JLEN 100 CONTINUE C DO 400 J = XSUPER(JSUPER), XSUPER(JSUPER+1)-1 C ----------------------------------------- C FOR EACH COLUMN IN THE CURRENT SUPERNODE, C FIRST INITIALIZE THE DATA STRUCTURE. C ----------------------------------------- DO 200 II = XLNZ(J), XLNZ(J+1)-1 LNZ(II) = 0.0 200 CONTINUE C C ----------------------------------- C NEXT INPUT THE INDIVIDUAL NONZEROS. C ----------------------------------- OLDJ = PERM(J) LAST = XLNZ(J+1) - 1 DO 300 II = XADJF(OLDJ), XADJF(OLDJ+1)-1 I = INVP(ADJF(II)) IF ( I .GE. J ) THEN LNZ(LAST-OFFSET(I)) = ANZF(II) ENDIF 300 CONTINUE 400 CONTINUE C 500 CONTINUE RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C*********** INVINV ..... CONCATENATION OF TWO INVP ************ C*********************************************************************** C*********************************************************************** C C WRITTEN BY JOSEPH LIU (JUL 17, 1985) C C PURPOSE: C TO PERFORM THE MAPPING OF C ORIGINAL-INVP --> INTERMEDIATE-INVP --> NEW INVP C AND THE RESULTING ORDERING REPLACES INVP. THE NEW PERMUTATION C VECTOR PERM IS ALSO COMPUTED. C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C INVP2 - THE SECOND INVERSE PERMUTATION VECTOR. C C UPDATED PARAMETERS: C INVP - THE FIRST INVERSE PERMUTATION VECTOR. ON C OUTPUT, IT CONTAINS THE NEW INVERSE C PERMUTATION. C C OUTPUT PARAMETER: C PERM - NEW PERMUTATION VECTOR (CAN BE THE SAME AS C INVP2). C C*********************************************************************** C SUBROUTINE INVINV ( NEQNS , INVP , INVP2 , PERM ) C C*********************************************************************** C INTEGER INVP(*) , INVP2(*) , & PERM(*) C INTEGER NEQNS C C*********************************************************************** C INTEGER I , INTERM, NODE C C*********************************************************************** C DO 100 I = 1, NEQNS INTERM = INVP(I) INVP(I) = INVP2(INTERM) 100 CONTINUE C DO 200 I = 1, NEQNS NODE = INVP(I) PERM(NODE) = I 200 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** LDINDX .... LOAD INDEX VECTOR ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE COMPUTES THE SECOND INDEX VECTOR C USED TO IMPLEMENT THE DOUBLY-INDIRECT SAXPY-LIKE C LOOPS THAT ALLOW US TO ACCUMULATE UPDATE C COLUMNS DIRECTLY INTO FACTOR STORAGE. C C INPUT PARAMETERS - C JLEN - LENGTH OF THE FIRST COLUMN OF THE SUPERNODE, C INCLUDING THE DIAGONAL ENTRY. C LINDX - THE OFF-DIAGONAL ROW INDICES OF THE SUPERNODE, C I.E., THE ROW INDICES OF THE NONZERO ENTRIES C LYING BELOW THE DIAGONAL ENTRY OF THE FIRST C COLUMN OF THE SUPERNODE. C C OUTPUT PARAMETERS - C INDMAP - THIS INDEX VECTOR MAPS EVERY GLOBAL ROW INDEX C OF NONZERO ENTRIES IN THE FIRST COLUMN OF THE C SUPERNODE TO ITS POSITION IN THE INDEX LIST C RELATIVE TO THE LAST INDEX IN THE LIST. MORE C PRECISELY, IT GIVES THE DISTANCE OF EACH INDEX C FROM THE LAST INDEX IN THE LIST. C C*********************************************************************** C SUBROUTINE LDINDX ( JLEN, LINDX, INDMAP ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER JLEN INTEGER LINDX(*), INDMAP(*) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER CURLEN, J, JSUB C C*********************************************************************** C CURLEN = JLEN DO 200 J = 1, JLEN JSUB = LINDX(J) CURLEN = CURLEN - 1 INDMAP(JSUB) = CURLEN 200 CONTINUE RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C C ----------------------------------------- C GATHER STATISTICS ABOUT FACTORIZATION ... C ----------------------------------------- C SUBROUTINE LSTATS ( NSUPER, XSUPER, XLINDX, LINDX , XLNZ , & TMPSIZ, OUTUNT ) C INTEGER NSUPER, OUTUNT, TMPSIZ INTEGER XSUPER(*), XLINDX(*), LINDX(*), XLNZ(*) C INTEGER J , JLEN , JSIZE , JSUPER, MAXSUP, & N , NCOLS , NOFNZ , NOFSUB, SUPSZE DOUBLE PRECISION FCTOPS, SLVOPS C N = XSUPER(NSUPER+1) - 1 C C WRITE (OUTUNT,*) ' ' C ------------------------------------------------------- C DETERMINE THE NUMBER OF NONZEROS IN CHOLESKY FACTOR AND C THE NUMBER OF SUBSCRIPTS IN REPRESENTING THE SUPERNODAL C STRUCTURE. C ------------------------------------------------------- NOFNZ = XLNZ(N+1) - 1 NOFSUB = XLINDX(NSUPER+1) - 1 C WRITE (OUTUNT,1) C & ' NUMBER OF SUPERNODES = ', NSUPER C WRITE (OUTUNT,1) C & ' NUMBER OF NONZEROS IN L = ', NOFNZ C WRITE (OUTUNT,1) C & ' NUMBER OF SUBSCRIPTS IN L = ', NOFSUB C C ------------------------------------------------------- C DETERMINE THE LARGEST SUPERNODE IN THE CHOLESKY FACTOR. C ------------------------------------------------------- MAXSUP = 0 SUPSZE = 0 DO 100 JSUPER = 1, NSUPER C --------------------------------------------------- C NCOLS IS THE NUMBER OF COLUMNS IN SUPERNODE JSUPER. C --------------------------------------------------- NCOLS = XSUPER(JSUPER+1) - XSUPER(JSUPER) IF ( NCOLS .GT. MAXSUP ) MAXSUP = NCOLS C C ---------------------------------------------------- C JSIZE IS THE NUMBER OF NONZEROS IN SUPERNDOE JSUPER. C ---------------------------------------------------- JLEN = XLINDX(JSUPER+1) - XLINDX(JSUPER) JSIZE = ((2*JLEN - NCOLS + 1)*NCOLS)/2 IF ( JSIZE .GT. SUPSZE ) SUPSZE = JSIZE 100 CONTINUE C WRITE (OUTUNT,1) C & ' LARGEST SUPERNODE BY COLUMNS = ', MAXSUP C WRITE (OUTUNT,1) C & ' LARGEST SUPERNODE BY NONZEROS = ', SUPSZE C C WRITE (OUTUNT,1) C & ' SIZE OF TEMPORARY WORK STORAGE = ', TMPSIZ C C --------------------------- C DETERMINE OPERATION COUNTS. C --------------------------- SLVOPS = 0.0 FCTOPS = 0.0 DO 400 J = 1, N JLEN = XLNZ(J+1) - XLNZ(J) SLVOPS = SLVOPS + 2*JLEN - 1 FCTOPS = FCTOPS + JLEN**2 - 1 400 CONTINUE SLVOPS = 2*SLVOPS C WRITE (OUTUNT,2) C & ' FACTORIZATION OPERATION COUNT = ', FCTOPS C WRITE (OUTUNT,2) C & ' TRIANGULAR SOLN OPERATION COUNT = ', SLVOPS C C 1 FORMAT ( A40, I10 ) C 2 FORMAT ( A40, 1PD20.10 ) RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C--- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = MMDELM C (C) UNIVERSITY OF WATERLOO JANUARY 1984 C*********************************************************************** C*********************************************************************** C** MMDELM ..... MULTIPLE MINIMUM DEGREE ELIMINATION *********** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE ELIMINATES THE NODE MDNODE OF C MINIMUM DEGREE FROM THE ADJACENCY STRUCTURE, WHICH C IS STORED IN THE QUOTIENT GRAPH FORMAT. IT ALSO C TRANSFORMS THE QUOTIENT GRAPH REPRESENTATION OF THE C ELIMINATION GRAPH. C C INPUT PARAMETERS - C MDNODE - NODE OF MINIMUM DEGREE. C MAXINT - ESTIMATE OF MAXIMUM REPRESENTABLE (SHORT) C INTEGER. C TAG - TAG VALUE. C C UPDATED PARAMETERS - C (XADJ,ADJNCY) - UPDATED ADJACENCY STRUCTURE. C (DHEAD,DFORW,DBAKW) - DEGREE DOUBLY LINKED STRUCTURE. C QSIZE - SIZE OF SUPERNODE. C MARKER - MARKER VECTOR. C LLIST - TEMPORARY LINKED LIST OF ELIMINATED NABORS. C C*********************************************************************** C SUBROUTINE MMDELM ( MDNODE, XADJ, ADJNCY, DHEAD, DFORW, 1 DBAKW, QSIZE, LLIST, MARKER, MAXINT, 1 TAG ) C C*********************************************************************** C INTEGER ADJNCY(*), DBAKW(*) , DFORW(*) , DHEAD(*) , 1 LLIST(*) , MARKER(*), QSIZE(*) INTEGER XADJ(*) INTEGER ELMNT , I , ISTOP , ISTRT , J , 1 JSTOP , JSTRT , LINK , MAXINT, MDNODE, 1 NABOR , NODE , NPV , NQNBRS, NXNODE, 1 PVNODE, RLMT , RLOC , RNODE , TAG , 1 XQNBR C C*********************************************************************** C C ----------------------------------------------- C FIND REACHABLE SET AND PLACE IN DATA STRUCTURE. C ----------------------------------------------- MARKER(MDNODE) = TAG ISTRT = XADJ(MDNODE) ISTOP = XADJ(MDNODE+1) - 1 C ------------------------------------------------------- C ELMNT POINTS TO THE BEGINNING OF THE LIST OF ELIMINATED C NABORS OF MDNODE, AND RLOC GIVES THE STORAGE LOCATION C FOR THE NEXT REACHABLE NODE. C ------------------------------------------------------- ELMNT = 0 RLOC = ISTRT RLMT = ISTOP DO 200 I = ISTRT, ISTOP NABOR = ADJNCY(I) IF ( NABOR .EQ. 0 ) GO TO 300 IF ( MARKER(NABOR) .GE. TAG ) GO TO 200 MARKER(NABOR) = TAG IF ( DFORW(NABOR) .LT. 0 ) GO TO 100 ADJNCY(RLOC) = NABOR RLOC = RLOC + 1 GO TO 200 100 CONTINUE LLIST(NABOR) = ELMNT ELMNT = NABOR 200 CONTINUE 300 CONTINUE C ----------------------------------------------------- C MERGE WITH REACHABLE NODES FROM GENERALIZED ELEMENTS. C ----------------------------------------------------- IF ( ELMNT .LE. 0 ) GO TO 1000 ADJNCY(RLMT) = - ELMNT LINK = ELMNT 400 CONTINUE JSTRT = XADJ(LINK) JSTOP = XADJ(LINK+1) - 1 DO 800 J = JSTRT, JSTOP NODE = ADJNCY(J) LINK = - NODE IF ( NODE ) 400, 900, 500 500 CONTINUE IF ( MARKER(NODE) .GE. TAG .OR. 1 DFORW(NODE) .LT. 0 ) GO TO 800 MARKER(NODE) = TAG C --------------------------------- C USE STORAGE FROM ELIMINATED NODES C IF NECESSARY. C --------------------------------- 600 CONTINUE IF ( RLOC .LT. RLMT ) GO TO 700 LINK = - ADJNCY(RLMT) RLOC = XADJ(LINK) RLMT = XADJ(LINK+1) - 1 GO TO 600 700 CONTINUE ADJNCY(RLOC) = NODE RLOC = RLOC + 1 800 CONTINUE 900 CONTINUE ELMNT = LLIST(ELMNT) GO TO 300 1000 CONTINUE IF ( RLOC .LE. RLMT ) ADJNCY(RLOC) = 0 C -------------------------------------------------------- C FOR EACH NODE IN THE REACHABLE SET, DO THE FOLLOWING ... C -------------------------------------------------------- LINK = MDNODE 1100 CONTINUE ISTRT = XADJ(LINK) ISTOP = XADJ(LINK+1) - 1 DO 1700 I = ISTRT, ISTOP RNODE = ADJNCY(I) LINK = - RNODE IF ( RNODE ) 1100, 1800, 1200 1200 CONTINUE C -------------------------------------------- C IF RNODE IS IN THE DEGREE LIST STRUCTURE ... C -------------------------------------------- PVNODE = DBAKW(RNODE) IF ( PVNODE .EQ. 0 .OR. 1 PVNODE .EQ. (-MAXINT) ) GO TO 1300 C ------------------------------------- C THEN REMOVE RNODE FROM THE STRUCTURE. C ------------------------------------- NXNODE = DFORW(RNODE) IF ( NXNODE .GT. 0 ) DBAKW(NXNODE) = PVNODE IF ( PVNODE .GT. 0 ) DFORW(PVNODE) = NXNODE NPV = - PVNODE IF ( PVNODE .LT. 0 ) DHEAD(NPV) = NXNODE 1300 CONTINUE C ---------------------------------------- C PURGE INACTIVE QUOTIENT NABORS OF RNODE. C ---------------------------------------- JSTRT = XADJ(RNODE) JSTOP = XADJ(RNODE+1) - 1 XQNBR = JSTRT DO 1400 J = JSTRT, JSTOP NABOR = ADJNCY(J) IF ( NABOR .EQ. 0 ) GO TO 1500 IF ( MARKER(NABOR) .GE. TAG ) GO TO 1400 ADJNCY(XQNBR) = NABOR XQNBR = XQNBR + 1 1400 CONTINUE 1500 CONTINUE C ---------------------------------------- C IF NO ACTIVE NABOR AFTER THE PURGING ... C ---------------------------------------- NQNBRS = XQNBR - JSTRT IF ( NQNBRS .GT. 0 ) GO TO 1600 C ----------------------------- C THEN MERGE RNODE WITH MDNODE. C ----------------------------- QSIZE(MDNODE) = QSIZE(MDNODE) + QSIZE(RNODE) QSIZE(RNODE) = 0 MARKER(RNODE) = MAXINT DFORW(RNODE) = - MDNODE DBAKW(RNODE) = - MAXINT GO TO 1700 1600 CONTINUE C -------------------------------------- C ELSE FLAG RNODE FOR DEGREE UPDATE, AND C ADD MDNODE AS A NABOR OF RNODE. C -------------------------------------- DFORW(RNODE) = NQNBRS + 1 DBAKW(RNODE) = 0 ADJNCY(XQNBR) = MDNODE XQNBR = XQNBR + 1 IF ( XQNBR .LE. JSTOP ) ADJNCY(XQNBR) = 0 C 1700 CONTINUE 1800 CONTINUE RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C--- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = MMDINT C (C) UNIVERSITY OF WATERLOO JANUARY 1984 C*********************************************************************** C*********************************************************************** C*** MMDINT ..... MULT MINIMUM DEGREE INITIALIZATION *********** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS INITIALIZATION FOR THE C MULTIPLE ELIMINATION VERSION OF THE MINIMUM DEGREE C ALGORITHM. C C INPUT PARAMETERS - C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - ADJACENCY STRUCTURE. C C OUTPUT PARAMETERS - C (DHEAD,DFORW,DBAKW) - DEGREE DOUBLY LINKED STRUCTURE. C QSIZE - SIZE OF SUPERNODE (INITIALIZED TO ONE). C LLIST - LINKED LIST. C MARKER - MARKER VECTOR. C C*********************************************************************** C SUBROUTINE MMDINT ( NEQNS, XADJ, ADJNCY, DHEAD, DFORW, 1 DBAKW, QSIZE, LLIST, MARKER ) C C*********************************************************************** C INTEGER ADJNCY(*), DBAKW(*) , DFORW(*) , DHEAD(*) , 1 LLIST(*) , MARKER(*), QSIZE(*) INTEGER XADJ(*) INTEGER FNODE , NDEG , NEQNS , NODE C C*********************************************************************** C DO 100 NODE = 1, NEQNS DHEAD(NODE) = 0 QSIZE(NODE) = 1 MARKER(NODE) = 0 LLIST(NODE) = 0 100 CONTINUE C ------------------------------------------ C INITIALIZE THE DEGREE DOUBLY LINKED LISTS. C ------------------------------------------ DO 200 NODE = 1, NEQNS NDEG = XADJ(NODE+1) - XADJ(NODE) + 1 FNODE = DHEAD(NDEG) DFORW(NODE) = FNODE DHEAD(NDEG) = NODE IF ( FNODE .GT. 0 ) DBAKW(FNODE) = NODE DBAKW(NODE) = - NDEG 200 CONTINUE RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C--- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = MMDNUM C (C) UNIVERSITY OF WATERLOO JANUARY 1984 C*********************************************************************** C*********************************************************************** C***** MMDNUM ..... MULTI MINIMUM DEGREE NUMBERING ************* C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS THE FINAL STEP IN C PRODUCING THE PERMUTATION AND INVERSE PERMUTATION C VECTORS IN THE MULTIPLE ELIMINATION VERSION OF THE C MINIMUM DEGREE ORDERING ALGORITHM. C C INPUT PARAMETERS - C NEQNS - NUMBER OF EQUATIONS. C QSIZE - SIZE OF SUPERNODES AT ELIMINATION. C C UPDATED PARAMETERS - C INVP - INVERSE PERMUTATION VECTOR. ON INPUT, C IF QSIZE(NODE)=0, THEN NODE HAS BEEN MERGED C INTO THE NODE -INVP(NODE); OTHERWISE, C -INVP(NODE) IS ITS INVERSE LABELLING. C C OUTPUT PARAMETERS - C PERM - THE PERMUTATION VECTOR. C C*********************************************************************** C SUBROUTINE MMDNUM ( NEQNS, PERM, INVP, QSIZE ) C C*********************************************************************** C INTEGER INVP(*) , PERM(*) , QSIZE(*) INTEGER FATHER, NEQNS , NEXTF , NODE , NQSIZE, 1 NUM , ROOT C C*********************************************************************** C DO 100 NODE = 1, NEQNS NQSIZE = QSIZE(NODE) IF ( NQSIZE .LE. 0 ) PERM(NODE) = INVP(NODE) IF ( NQSIZE .GT. 0 ) PERM(NODE) = - INVP(NODE) 100 CONTINUE C ------------------------------------------------------ C FOR EACH NODE WHICH HAS BEEN MERGED, DO THE FOLLOWING. C ------------------------------------------------------ DO 500 NODE = 1, NEQNS IF ( PERM(NODE) .GT. 0 ) GO TO 500 C ----------------------------------------- C TRACE THE MERGED TREE UNTIL ONE WHICH HAS C NOT BEEN MERGED, CALL IT ROOT. C ----------------------------------------- FATHER = NODE 200 CONTINUE IF ( PERM(FATHER) .GT. 0 ) GO TO 300 FATHER = - PERM(FATHER) GO TO 200 300 CONTINUE C ----------------------- C NUMBER NODE AFTER ROOT. C ----------------------- ROOT = FATHER NUM = PERM(ROOT) + 1 INVP(NODE) = - NUM PERM(ROOT) = NUM C ------------------------ C SHORTEN THE MERGED TREE. C ------------------------ FATHER = NODE 400 CONTINUE NEXTF = - PERM(FATHER) IF ( NEXTF .LE. 0 ) GO TO 500 PERM(FATHER) = - ROOT FATHER = NEXTF GO TO 400 500 CONTINUE C ---------------------- C READY TO COMPUTE PERM. C ---------------------- DO 600 NODE = 1, NEQNS NUM = - INVP(NODE) INVP(NODE) = NUM PERM(NUM) = NODE 600 CONTINUE RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Joseph W.H. Liu C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C--- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = MMDUPD C (C) UNIVERSITY OF WATERLOO JANUARY 1984 C*********************************************************************** C*********************************************************************** C***** MMDUPD ..... MULTIPLE MINIMUM DEGREE UPDATE ************* C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE UPDATES THE DEGREES OF NODES C AFTER A MULTIPLE ELIMINATION STEP. C C INPUT PARAMETERS - C EHEAD - THE BEGINNING OF THE LIST OF ELIMINATED C NODES (I.E., NEWLY FORMED ELEMENTS). C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - ADJACENCY STRUCTURE. C DELTA - TOLERANCE VALUE FOR MULTIPLE ELIMINATION. C MAXINT - MAXIMUM MACHINE REPRESENTABLE (SHORT) C INTEGER. C C UPDATED PARAMETERS - C MDEG - NEW MINIMUM DEGREE AFTER DEGREE UPDATE. C (DHEAD,DFORW,DBAKW) - DEGREE DOUBLY LINKED STRUCTURE. C QSIZE - SIZE OF SUPERNODE. C LLIST - WORKING LINKED LIST. C MARKER - MARKER VECTOR FOR DEGREE UPDATE. C TAG - TAG VALUE. C C*********************************************************************** C SUBROUTINE MMDUPD ( EHEAD, NEQNS, XADJ, ADJNCY, DELTA, 1 MDEG, DHEAD, DFORW, DBAKW, QSIZE, 1 LLIST, MARKER, MAXINT, TAG ) C C*********************************************************************** C INTEGER ADJNCY(*), DBAKW(*) , DFORW(*) , DHEAD(*) , 1 LLIST(*) , MARKER(*), QSIZE(*) INTEGER XADJ(*) INTEGER DEG , DEG0 , DELTA , EHEAD , ELMNT , 1 ENODE , FNODE , I , IQ2 , ISTOP , 1 ISTRT , J , JSTOP , JSTRT , LINK , 1 MAXINT, MDEG , MDEG0 , MTAG , NABOR , 1 NEQNS , NODE , Q2HEAD, QXHEAD, TAG C C*********************************************************************** C MDEG0 = MDEG + DELTA ELMNT = EHEAD 100 CONTINUE C ------------------------------------------------------- C FOR EACH OF THE NEWLY FORMED ELEMENT, DO THE FOLLOWING. C (RESET TAG VALUE IF NECESSARY.) C ------------------------------------------------------- IF ( ELMNT .LE. 0 ) RETURN MTAG = TAG + MDEG0 IF ( MTAG .LT. MAXINT ) GO TO 300 TAG = 1 DO 200 I = 1, NEQNS IF ( MARKER(I) .LT. MAXINT ) MARKER(I) = 0 200 CONTINUE MTAG = TAG + MDEG0 300 CONTINUE C --------------------------------------------- C CREATE TWO LINKED LISTS FROM NODES ASSOCIATED C WITH ELMNT: ONE WITH TWO NABORS (Q2HEAD) IN C ADJACENCY STRUCTURE, AND THE OTHER WITH MORE C THAN TWO NABORS (QXHEAD). ALSO COMPUTE DEG0, C NUMBER OF NODES IN THIS ELEMENT. C --------------------------------------------- Q2HEAD = 0 QXHEAD = 0 DEG0 = 0 LINK = ELMNT 400 CONTINUE ISTRT = XADJ(LINK) ISTOP = XADJ(LINK+1) - 1 DO 700 I = ISTRT, ISTOP ENODE = ADJNCY(I) LINK = - ENODE IF ( ENODE ) 400, 800, 500 C 500 CONTINUE IF ( QSIZE(ENODE) .EQ. 0 ) GO TO 700 DEG0 = DEG0 + QSIZE(ENODE) MARKER(ENODE) = MTAG C ---------------------------------- C IF ENODE REQUIRES A DEGREE UPDATE, C THEN DO THE FOLLOWING. C ---------------------------------- IF ( DBAKW(ENODE) .NE. 0 ) GO TO 700 C --------------------------------------- C PLACE EITHER IN QXHEAD OR Q2HEAD LISTS. C --------------------------------------- IF ( DFORW(ENODE) .EQ. 2 ) GO TO 600 LLIST(ENODE) = QXHEAD QXHEAD = ENODE GO TO 700 600 CONTINUE LLIST(ENODE) = Q2HEAD Q2HEAD = ENODE 700 CONTINUE 800 CONTINUE C -------------------------------------------- C FOR EACH ENODE IN Q2 LIST, DO THE FOLLOWING. C -------------------------------------------- ENODE = Q2HEAD IQ2 = 1 900 CONTINUE IF ( ENODE .LE. 0 ) GO TO 1500 IF ( DBAKW(ENODE) .NE. 0 ) GO TO 2200 TAG = TAG + 1 DEG = DEG0 C ------------------------------------------ C IDENTIFY THE OTHER ADJACENT ELEMENT NABOR. C ------------------------------------------ ISTRT = XADJ(ENODE) NABOR = ADJNCY(ISTRT) IF ( NABOR .EQ. ELMNT ) NABOR = ADJNCY(ISTRT+1) C ------------------------------------------------ C IF NABOR IS UNELIMINATED, INCREASE DEGREE COUNT. C ------------------------------------------------ LINK = NABOR IF ( DFORW(NABOR) .LT. 0 ) GO TO 1000 DEG = DEG + QSIZE(NABOR) GO TO 2100 1000 CONTINUE C -------------------------------------------- C OTHERWISE, FOR EACH NODE IN THE 2ND ELEMENT, C DO THE FOLLOWING. C -------------------------------------------- ISTRT = XADJ(LINK) ISTOP = XADJ(LINK+1) - 1 DO 1400 I = ISTRT, ISTOP NODE = ADJNCY(I) LINK = - NODE IF ( NODE .EQ. ENODE ) GO TO 1400 IF ( NODE ) 1000, 2100, 1100 C 1100 CONTINUE IF ( QSIZE(NODE) .EQ. 0 ) GO TO 1400 IF ( MARKER(NODE) .GE. TAG ) GO TO 1200 C ------------------------------------- C CASE WHEN NODE IS NOT YET CONSIDERED. C ------------------------------------- MARKER(NODE) = TAG DEG = DEG + QSIZE(NODE) GO TO 1400 1200 CONTINUE C ---------------------------------------- C CASE WHEN NODE IS INDISTINGUISHABLE FROM C ENODE. MERGE THEM INTO A NEW SUPERNODE. C ---------------------------------------- IF ( DBAKW(NODE) .NE. 0 ) GO TO 1400 IF ( DFORW(NODE) .NE. 2 ) GO TO 1300 QSIZE(ENODE) = QSIZE(ENODE) + 1 QSIZE(NODE) QSIZE(NODE) = 0 MARKER(NODE) = MAXINT DFORW(NODE) = - ENODE DBAKW(NODE) = - MAXINT GO TO 1400 1300 CONTINUE C -------------------------------------- C CASE WHEN NODE IS OUTMATCHED BY ENODE. C -------------------------------------- IF ( DBAKW(NODE) .EQ.0 ) 1 DBAKW(NODE) = - MAXINT 1400 CONTINUE GO TO 2100 1500 CONTINUE C ------------------------------------------------ C FOR EACH ENODE IN THE QX LIST, DO THE FOLLOWING. C ------------------------------------------------ ENODE = QXHEAD IQ2 = 0 1600 CONTINUE IF ( ENODE .LE. 0 ) GO TO 2300 IF ( DBAKW(ENODE) .NE. 0 ) GO TO 2200 TAG = TAG + 1 DEG = DEG0 C --------------------------------- C FOR EACH UNMARKED NABOR OF ENODE, C DO THE FOLLOWING. C --------------------------------- ISTRT = XADJ(ENODE) ISTOP = XADJ(ENODE+1) - 1 DO 2000 I = ISTRT, ISTOP NABOR = ADJNCY(I) IF ( NABOR .EQ. 0 ) GO TO 2100 IF ( MARKER(NABOR) .GE. TAG ) GO TO 2000 MARKER(NABOR) = TAG LINK = NABOR C ------------------------------ C IF UNELIMINATED, INCLUDE IT IN C DEG COUNT. C ------------------------------ IF ( DFORW(NABOR) .LT. 0 ) GO TO 1700 DEG = DEG + QSIZE(NABOR) GO TO 2000 1700 CONTINUE C ------------------------------- C IF ELIMINATED, INCLUDE UNMARKED C NODES IN THIS ELEMENT INTO THE C DEGREE COUNT. C ------------------------------- JSTRT = XADJ(LINK) JSTOP = XADJ(LINK+1) - 1 DO 1900 J = JSTRT, JSTOP NODE = ADJNCY(J) LINK = - NODE IF ( NODE ) 1700, 2000, 1800 C 1800 CONTINUE IF ( MARKER(NODE) .GE. TAG ) 1 GO TO 1900 MARKER(NODE) = TAG DEG = DEG + QSIZE(NODE) 1900 CONTINUE 2000 CONTINUE 2100 CONTINUE C ------------------------------------------- C UPDATE EXTERNAL DEGREE OF ENODE IN DEGREE C STRUCTURE, AND MDEG (MIN DEG) IF NECESSARY. C ------------------------------------------- DEG = DEG - QSIZE(ENODE) + 1 FNODE = DHEAD(DEG) DFORW(ENODE) = FNODE DBAKW(ENODE) = - DEG IF ( FNODE .GT. 0 ) DBAKW(FNODE) = ENODE DHEAD(DEG) = ENODE IF ( DEG .LT. MDEG ) MDEG = DEG 2200 CONTINUE C ---------------------------------- C GET NEXT ENODE IN CURRENT ELEMENT. C ---------------------------------- ENODE = LLIST(ENODE) IF ( IQ2 .EQ. 1 ) GO TO 900 GO TO 1600 2300 CONTINUE C ----------------------------- C GET NEXT ELEMENT IN THE LIST. C ----------------------------- TAG = MTAG ELMNT = LLIST(ELMNT) GO TO 100 C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************** MMPY .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C N - NUMBER OF COLUMNS IN X AND NUMBER OF ROWS C IN A. C Q - NUMBER OF COLUMNS IN A AND Y. C SPLIT(*) - BLOCK PARTITIONING OF X. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C LDY - LENGTH OF FIRST COLUMN OF Y. C MMPYN - EXTERNAL ROUTINE: MATRIX-MATRIX MULTIPLY, C WITH LEVEL N LOOP UNROLLING. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPY ( M , N , Q , SPLIT , XPNT , & X , Y , LDY , MMPYN ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C EXTERNAL MMPYN INTEGER LDY , M , N , Q INTEGER SPLIT(*) , XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER BLK , FSTCOL, NN C C*********************************************************************** C BLK = 1 FSTCOL = 1 100 CONTINUE IF ( FSTCOL .LE. N ) THEN NN = SPLIT(BLK) CALL MMPYN ( M, NN, Q, XPNT(FSTCOL), X, Y, LDY ) FSTCOL = FSTCOL + NN BLK = BLK + 1 GO TO 100 ENDIF RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* MMPY1 .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C LOOP UNROLLING: LEVEL 1 C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C N - NUMBER OF COLUMNS IN X AND NUMBER OF ROWS C IN A. C Q - NUMBER OF COLUMNS IN A AND Y. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C LDY - LENGTH OF FIRST COLUMN OF Y. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPY1 ( M , N , Q , XPNT , X , & Y , LDY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER LDY , M , N , Q INTEGER XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I1 INTEGER IY , IYLAST, IYSTRT, IYSTOP, LENY , & MM , XCOL , YCOL DOUBLE PRECISION A1 C C*********************************************************************** C MM = M IYLAST = 0 LENY = LDY C ------------------------------------ C TO COMPUTE EACH COLUMN YCOL OF Y ... C ------------------------------------ DO 300 YCOL = 1, Q IYSTRT = IYLAST + 1 IYSTOP = IYSTRT + MM - 1 IYLAST = IYLAST + LENY C -------------------------------------------------- C ... PERFORM THE APPROPRATE MATRIX VECTOR MULTIPLY: C X * A(*,YCOL). C -------------------------------------------------- DO 200 XCOL = 1, N I1 = XPNT(XCOL+1) - MM A1 = - X(I1) DO 100 IY = IYSTRT, IYSTOP Y(IY) = Y(IY) + A1 * X(I1) I1 = I1 + 1 100 CONTINUE 200 CONTINUE MM = MM - 1 LENY = LENY - 1 300 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: May 26, 1995 C Authors: Esmond G. Ng, Barry W. Peyton, and Guodong Zhang C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* MMPY2 .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C LOOP UNROLLING: LEVEL 2 UPDATING TWO COLUMNS AT A TIME C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C N - NUMBER OF COLUMNS IN X AND NUMBER OF ROWS C IN A. C Q - NUMBER OF COLUMNS IN A AND Y. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C LDY - LENGTH OF FIRST COLUMN OF Y. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPY2 ( M , N , Q , XPNT , X , & Y , LDY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER LDY , M , N , Q INTEGER XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I , J , K , QQ INTEGER I1 , I2 INTEGER IYBEG , IYBEG1, IYBEG2, LENY , MM DOUBLE PRECISION A1 , A2 , A9 , A10 DOUBLE PRECISION B1 , B2 , Y1 , Y2 C C*********************************************************************** C C ---------------------------------------------------- C COMPUTE EACH DIAGONAL ENTRY OF THE ODD COLUMNS OF Y. C ---------------------------------------------------- C MM = M QQ = MIN(M,Q) IYBEG = 1 LENY = LDY - 1 DO 200 J = 1, QQ-1 , 2 CDIR$ IVDEP DO 100 I = 1, N I1 = XPNT(I+1) - MM A1 = X(I1) Y(IYBEG) = Y(IYBEG) - A1*A1 100 CONTINUE IYBEG = IYBEG + 2*LENY + 1 LENY = LENY - 2 MM = MM - 2 200 CONTINUE C C ------------------------------------------------------- C UPDATE TWO COLUMNS OF Y AT A TIME, EXCEPT THE DIAGONAL C ELEMENT. C NOTE: THE DIAGONAL ELEMENT OF THE ODD COLUMN HAS C BEEN COMPUTED, SO WE COMPUTE THE SAME NUMBER OF C ELEMENTS FOR THE TWO COLUMNS. C ------------------------------------------------------- C MM = M IYBEG = 1 LENY = LDY - 1 C DO 600 J = 1, QQ-1, 2 C IYBEG1 = IYBEG IYBEG2 = IYBEG + LENY C DO 400 K = 1, N-1, 2 C C --------------------------------- C TWO COLUMNS UPDATING TWO COLUMNS. C --------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM A1 = X(I1) A2 = X(I2) A9 = X(I1+1) A10 = X(I2+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 C DO 300 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 Y(IYBEG1+I) = Y1 Y2 = Y2 - B2 * A10 Y(IYBEG2+I) = Y2 300 CONTINUE C 400 CONTINUE C C ----------------------------- C BOUNDARY CODE FOR THE K LOOP. C ----------------------------- C IF ( K .EQ. N ) THEN C C -------------------------------- C ONE COLUMN UPDATING TWO COLUMNS. C -------------------------------- C I1 = XPNT(K+1) - MM A1 = X(I1) A9 = X(I1+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 C DO 500 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) Y(IYBEG1+I) = Y1 Y2 = Y2 - B1 * A9 Y(IYBEG2+I) = Y2 500 CONTINUE C ENDIF C C ----------------------------------------------- C PREPARE FOR NEXT PAIR OF COLUMNS TO BE UPDATED. C ----------------------------------------------- C MM = MM - 2 IYBEG = IYBEG2 + LENY + 1 LENY = LENY - 2 C 600 CONTINUE C C ------------------------------------------------------ C BOUNDARY CODE FOR J LOOP: EXECUTED WHENEVER Q IS ODD. C ------------------------------------------------------ C IF ( J .EQ. QQ ) THEN CALL SMXPY2 ( MM, N, Y(IYBEG), XPNT, X ) ENDIF C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: May 26, 1995 C Authors: Esmond G. Ng, Barry W. Peyton, and Guodong Zhang C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* MMPY4 .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C LOOP UNROLLING: LEVEL 4 UPDATING TWO COLUMNS AT A TIME C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C N - NUMBER OF COLUMNS IN X AND NUMBER OF ROWS C IN A. C Q - NUMBER OF COLUMNS IN A AND Y. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C LDY - LENGTH OF FIRST COLUMN OF Y. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPY4 ( M , N , Q , XPNT , X , & Y , LDY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER LDY , M , N , Q INTEGER XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I , J , K , QQ INTEGER I1 , I2 , I3 , I4 INTEGER IYBEG , IYBEG1, IYBEG2, LENY , MM DOUBLE PRECISION A1 , A2 , A3 , A4 , A9 , & A10 , A11 , A12 DOUBLE PRECISION B1 , B2 , B3 , B4 , Y1 , & Y2 C C*********************************************************************** C C ---------------------------------------------------- C COMPUTE EACH DIAGONAL ENTRY OF THE ODD COLUMNS OF Y. C ---------------------------------------------------- C MM = M QQ = MIN(M,Q) IYBEG = 1 LENY = LDY - 1 DO 200 J = 1, QQ-1, 2 CDIR$ IVDEP DO 100 I = 1, N I1 = XPNT(I+1) - MM A1 = X(I1) Y(IYBEG) = Y(IYBEG) - A1*A1 100 CONTINUE IYBEG = IYBEG + 2*LENY + 1 LENY = LENY - 2 MM = MM - 2 200 CONTINUE C C ------------------------------------------------------- C UPDATE TWO COLUMNS OF Y AT A TIME, EXCEPT THE DIAGONAL C ELEMENT. C NOTE: THE DIAGONAL ELEMENT OF THE ODD COLUMN HAS C BEEN COMPUTED, SO WE COMPUTE THE SAME NUMBER OF C ELEMENTS FOR THE TWO COLUMNS. C ------------------------------------------------------- C MM = M IYBEG = 1 LENY = LDY - 1 C DO 2000 J = 1, QQ-1, 2 C IYBEG1 = IYBEG IYBEG2 = IYBEG + LENY C DO 400 K = 1, N-3, 4 C C ---------------------------------- C FOUR COLUMNS UPDATING TWO COLUMNS. C ---------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 C DO 300 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 Y(IYBEG1+I) = Y1 Y2 = Y2 - B4 * A12 Y(IYBEG2+I) = Y2 300 CONTINUE C 400 CONTINUE C C ----------------------------- C BOUNDARY CODE FOR THE K LOOP. C ----------------------------- C GO TO ( 1100, 900, 700, 500 ), N-K+2 C 500 CONTINUE C C ----------------------------------- C THREE COLUMNS UPDATING TWO COLUMNS. C ----------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 C DO 600 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 Y(IYBEG1+I) = Y1 Y2 = Y2 - B3 * A11 Y(IYBEG2+I) = Y2 600 CONTINUE C GO TO 1100 C 700 CONTINUE C C --------------------------------- C TWO COLUMNS UPDATING TWO COLUMNS. C --------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM A1 = X(I1) A2 = X(I2) A9 = X(I1+1) A10 = X(I2+1) Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 DO 800 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 Y(IYBEG1+I) = Y1 Y2 = Y2 - B2 * A10 Y(IYBEG2+I) = Y2 800 CONTINUE C GO TO 1100 C 900 CONTINUE C C -------------------------------- C ONE COLUMN UPDATING TWO COLUMNS. C -------------------------------- C I1 = XPNT(K+1) - MM A1 = X(I1) A9 = X(I1+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 C DO 1000 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) Y(IYBEG1+I) = Y1 Y2 = Y2 - B1 * A9 Y(IYBEG2+I) = Y2 1000 CONTINUE C GO TO 1100 C C ----------------------------------------------- C PREPARE FOR NEXT PAIR OF COLUMNS TO BE UPDATED. C ----------------------------------------------- C 1100 CONTINUE MM = MM - 2 IYBEG = IYBEG2 + LENY + 1 LENY = LENY - 2 C 2000 CONTINUE C C ------------------------------------------------------ C BOUNDARY CODE FOR J LOOP: EXECUTED WHENEVER Q IS ODD. C ------------------------------------------------------ C IF ( J .EQ. QQ ) THEN CALL SMXPY4 ( MM, N, Y(IYBEG), XPNT, X ) ENDIF C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: May 26, 1995 C Authors: Esmond G. Ng, Barry W. Peyton, and Guodong Zhang C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* MMPY8 .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C LOOP UNROLLING: LEVEL 8 UPDATING TWO COLUMNS AT A TIME C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C N - NUMBER OF COLUMNS IN X AND NUMBER OF ROWS C IN A. C Q - NUMBER OF COLUMNS IN A AND Y. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C LDY - LENGTH OF FIRST COLUMN OF Y. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPY8 ( M , N , Q , XPNT , X , & Y , LDY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER LDY , M , N , Q INTEGER XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I , J , K , QQ INTEGER I1 , I2 , I3 , I4 , I5 , & I6 , I7 , I8 INTEGER IYBEG , IYBEG1, IYBEG2, LENY , MM DOUBLE PRECISION A1 , A2 , A3 , A4 , A5 , & A6 , A7 , A8 , A9 , A10 , & A11 , A12 , A13 , A14 , A15 , & A16 DOUBLE PRECISION B1 , B2 , B3 , B4 , B5 , & B6 , B7 , B8 , Y1 , Y2 C C*********************************************************************** C C ---------------------------------------------------- C COMPUTE EACH DIAGONAL ENTRY OF THE ODD COLUMNS OF Y. C ---------------------------------------------------- C MM = M QQ = MIN(M,Q) IYBEG = 1 LENY = LDY - 1 DO 200 J = 1, QQ-1 , 2 CDIR$ IVDEP DO 100 I = 1, N I1 = XPNT(I+1) - MM A1 = X(I1) Y(IYBEG) = Y(IYBEG) - A1*A1 100 CONTINUE IYBEG = IYBEG + 2*LENY + 1 LENY = LENY - 2 MM = MM - 2 200 CONTINUE C C ------------------------------------------------------- C UPDATE TWO COLUMNS OF Y AT A TIME, EXCEPT THE DIAGONAL C ELEMENT. C NOTE: THE DIAGONAL ELEMENT OF THE ODD COLUMN HAS C BEEN COMPUTED, SO WE COMPUTE THE SAME NUMBER OF C ELEMENTS FOR THE TWO COLUMNS. C ------------------------------------------------------- C MM = M IYBEG = 1 LENY = LDY - 1 C DO 3000 J = 1, QQ-1, 2 C IYBEG1 = IYBEG IYBEG2 = IYBEG + LENY C DO 400 K = 1, N-7, 8 C C ----------------------------------- C EIGHT COLUMNS UPDATING TWO COLUMNS. C ----------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM I5 = XPNT(K+5) - MM I6 = XPNT(K+6) - MM I7 = XPNT(K+7) - MM I8 = XPNT(K+8) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A5 = X(I5) A6 = X(I6) A7 = X(I7) A8 = X(I8) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) A13 = X(I5+1) A14 = X(I6+1) A15 = X(I7+1) A16 = X(I8+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 - A5*A13 - & A6*A14 - A7*A15 - A8*A16 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 - A13*A13 - & A14*A14 - A15*A15 - A16*A16 C DO 300 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 B5 = X(I5+I) Y2 = Y2 - B4 * A12 Y1 = Y1 - B5 * A5 B6 = X(I6+I) Y2 = Y2 - B5 * A13 Y1 = Y1 - B6 * A6 B7 = X(I7+I) Y2 = Y2 - B6 * A14 Y1 = Y1 - B7 * A7 B8 = X(I8+I) Y2 = Y2 - B7 * A15 Y1 = Y1 - B8 * A8 Y(IYBEG1+I) = Y1 Y2 = Y2 - B8 * A16 Y(IYBEG2+I) = Y2 300 CONTINUE C 400 CONTINUE C C ----------------------------- C BOUNDARY CODE FOR THE K LOOP. C ----------------------------- C GO TO ( 2000, 1700, 1500, 1300, & 1100, 900, 700, 500 ), N-K+2 C 500 CONTINUE C C ----------------------------------- C SEVEN COLUMNS UPDATING TWO COLUMNS. C ----------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM I5 = XPNT(K+5) - MM I6 = XPNT(K+6) - MM I7 = XPNT(K+7) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A5 = X(I5) A6 = X(I6) A7 = X(I7) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) A13 = X(I5+1) A14 = X(I6+1) A15 = X(I7+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 - A5*A13 - & A6*A14 - A7*A15 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 - A13*A13 - & A14*A14 - A15*A15 C DO 600 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 B5 = X(I5+I) Y2 = Y2 - B4 * A12 Y1 = Y1 - B5 * A5 B6 = X(I6+I) Y2 = Y2 - B5 * A13 Y1 = Y1 - B6 * A6 B7 = X(I7+I) Y2 = Y2 - B6 * A14 Y1 = Y1 - B7 * A7 Y(IYBEG1+I) = Y1 Y2 = Y2 - B7 * A15 Y(IYBEG2+I) = Y2 600 CONTINUE C GO TO 2000 C 700 CONTINUE C C --------------------------------- C SIX COLUMNS UPDATING TWO COLUMNS. C --------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM I5 = XPNT(K+5) - MM I6 = XPNT(K+6) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A5 = X(I5) A6 = X(I6) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) A13 = X(I5+1) A14 = X(I6+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 - A5*A13 - & A6*A14 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 - A13*A13 - & A14*A14 C DO 800 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 B5 = X(I5+I) Y2 = Y2 - B4 * A12 Y1 = Y1 - B5 * A5 B6 = X(I6+I) Y2 = Y2 - B5 * A13 Y1 = Y1 - B6 * A6 Y(IYBEG1+I) = Y1 Y2 = Y2 - B6 * A14 Y(IYBEG2+I) = Y2 800 CONTINUE C GO TO 2000 C 900 CONTINUE C C ---------------------------------- C FIVE COLUMNS UPDATING TWO COLUMNS. C ---------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM I5 = XPNT(K+5) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A5 = X(I5) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) A13 = X(I5+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 - A5*A13 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 - A13*A13 C DO 1000 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 B5 = X(I5+I) Y2 = Y2 - B4 * A12 Y1 = Y1 - B5 * A5 Y(IYBEG1+I) = Y1 Y2 = Y2 - B5 * A13 Y(IYBEG2+I) = Y2 1000 CONTINUE C GO TO 2000 C 1100 CONTINUE C C ---------------------------------- C FOUR COLUMNS UPDATING TWO COLUMNS. C ---------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM I4 = XPNT(K+4) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A4 = X(I4) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) A12 = X(I4+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 - A4*A12 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 - A12*A12 C DO 1200 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 B4 = X(I4+I) Y2 = Y2 - B3 * A11 Y1 = Y1 - B4 * A4 Y(IYBEG1+I) = Y1 Y2 = Y2 - B4 * A12 Y(IYBEG2+I) = Y2 1200 CONTINUE C GO TO 2000 C 1300 CONTINUE C C ----------------------------------- C THREE COLUMNS UPDATING TWO COLUMNS. C ----------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM I3 = XPNT(K+3) - MM A1 = X(I1) A2 = X(I2) A3 = X(I3) A9 = X(I1+1) A10 = X(I2+1) A11 = X(I3+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 - A3*A11 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 - A11*A11 C DO 1400 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 B3 = X(I3+I) Y2 = Y2 - B2 * A10 Y1 = Y1 - B3 * A3 Y(IYBEG1+I) = Y1 Y2 = Y2 - B3 * A11 Y(IYBEG2+I) = Y2 1400 CONTINUE C GO TO 2000 C 1500 CONTINUE C C --------------------------------- C TWO COLUMNS UPDATING TWO COLUMNS. C --------------------------------- C I1 = XPNT(K+1) - MM I2 = XPNT(K+2) - MM A1 = X(I1) A2 = X(I2) A9 = X(I1+1) A10 = X(I2+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 - A2*A10 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 - A10*A10 C DO 1600 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) B2 = X(I2+I) Y2 = Y2 - B1 * A9 Y1 = Y1 - B2 * A2 Y(IYBEG1+I) = Y1 Y2 = Y2 - B2 * A10 Y(IYBEG2+I) = Y2 1600 CONTINUE C GO TO 2000 C 1700 CONTINUE C C -------------------------------- C ONE COLUMN UPDATING TWO COLUMNS. C -------------------------------- C I1 = XPNT(K+1) - MM A1 = X(I1) A9 = X(I1+1) C Y(IYBEG1+1) = Y(IYBEG1+1) - & A1*A9 C Y(IYBEG2+1) = Y(IYBEG2+1) - & A9*A9 C DO 1800 I = 2, MM-1 Y1 = Y(IYBEG1+I) B1 = X(I1+I) Y1 = Y1 - B1 * A1 Y2 = Y(IYBEG2+I) Y(IYBEG1+I) = Y1 Y2 = Y2 - B1 * A9 Y(IYBEG2+I) = Y2 1800 CONTINUE C GO TO 2000 C C ----------------------------------------------- C PREPARE FOR NEXT PAIR OF COLUMNS TO BE UPDATED. C ----------------------------------------------- C 2000 CONTINUE MM = MM - 2 IYBEG = IYBEG2 + LENY + 1 LENY = LENY - 2 C 3000 CONTINUE C C ----------------------------------------------------- C BOUNDARY CODE FOR J LOOP: EXECUTED WHENVER Q IS ODD. C ----------------------------------------------------- C IF ( J .EQ. QQ ) THEN CALL SMXPY8 ( MM, N, Y(IYBEG), XPNT, X ) ENDIF C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* MMPYI .... MATRIX-MATRIX MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - C THIS ROUTINE PERFORMS A MATRIX-MATRIX MULTIPLY, Y = Y + XA, C ASSUMING DATA STRUCTURES USED IN SOME OF OUR SPARSE CHOLESKY C CODES. C C MATRIX X HAS ONLY 1 COLUMN. C C INPUT PARAMETERS - C M - NUMBER OF ROWS IN X AND IN Y. C Q - NUMBER OF COLUMNS IN A AND Y. C XPNT(*) - XPNT(J+1) POINTS ONE LOCATION BEYOND THE C END OF THE J-TH COLUMN OF X. XPNT IS ALSO C USED TO ACCESS THE ROWS OF A. C X(*) - CONTAINS THE COLUMNS OF X AND THE ROWS OF A. C IY(*) - IY(COL) POINTS TO THE BEGINNING OF COLUMN C RELIND(*) - RELATIVE INDICES. C C UPDATED PARAMETERS - C Y(*) - ON OUTPUT, Y = Y + AX. C C*********************************************************************** C SUBROUTINE MMPYI ( M , Q , XPNT , X , IY , & Y , RELIND ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER M , Q INTEGER IY(*) , RELIND(*) , & XPNT(*) DOUBLE PRECISION X(*) , Y(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER COL , I , ISUB , K , YLAST DOUBLE PRECISION A C C*********************************************************************** C DO 200 K = 1, Q COL = XPNT(K) YLAST = IY(COL+1) - 1 A = - X(K) CDIR$ IVDEP DO 100 I = K, M ISUB = XPNT(I) ISUB = YLAST - RELIND(ISUB) Y(ISUB) = Y(ISUB) + A*X(I) 100 CONTINUE 200 CONTINUE RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C**** ORDMMD ..... MULTIPLE MINIMUM EXTERNAL DEGREE ************ C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE CALLS LIU'S MULTIPLE MINIMUM DEGREE C ROUTINE. C C INPUT PARAMETERS - C NEQNS - NUMBER OF EQUATIONS. C (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. C IWSIZ - SIZE OF INTEGER WORKING STORAGE. C C OUTPUT PARAMETERS - C PERM - THE MINIMUM DEGREE ORDERING. C INVP - THE INVERSE OF PERM. C NOFSUB - AN UPPER BOUND ON THE NUMBER OF NONZERO C SUBSCRIPTS FOR THE COMPRESSED STORAGE SCHEME. C IFLAG - ERROR FLAG. C 0: SUCCESSFUL ORDERING C -1: INSUFFICIENT WORKING STORAGE C [IWORK(*)]. C C WORKING PARAMETERS - C IWORK - INTEGER WORKSPACE OF LENGTH 4*NEQNS. C C*********************************************************************** C SUBROUTINE ORDMMD ( NEQNS , XADJ , ADJNCY, INVP , PERM , 1 IWSIZ , IWORK , NOFSUB, IFLAG ) C C*********************************************************************** C INTEGER ADJNCY(*), INVP(*) , IWORK(*) , PERM(*) INTEGER XADJ(*) INTEGER DELTA , IFLAG , IWSIZ , MAXINT, NEQNS , & NOFSUB C C********************************************************************* C IFLAG = 0 IF ( IWSIZ .LT. 4*NEQNS ) THEN IFLAG = -1 RETURN ENDIF C C DELTA - TOLERANCE VALUE FOR MULTIPLE ELIMINATION. C MAXINT - MAXIMUM MACHINE REPRESENTABLE (SHORT) INTEGER C (ANY SMALLER ESTIMATE WILL DO) FOR MARKING C NODES. C DELTA = 0 MAXINT = 32767 CALL GENMMD ( NEQNS , XADJ , ADJNCY, INVP , PERM , 1 DELTA , 1 IWORK(1) , 1 IWORK(NEQNS+1) , 1 IWORK(2*NEQNS+1) , 1 IWORK(3*NEQNS+1) , 1 MAXINT, NOFSUB ) RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.3 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratoy C C*********************************************************************** C*********************************************************************** C****** PCHOL .... DENSE PARTIAL CHOLESKY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS CHOLESKY C FACTORIZATION ON THE COLUMNS OF A SUPERNODE C THAT HAVE RECEIVED ALL UPDATES FROM COLUMNS C EXTERNAL TO THE SUPERNODE. C C INPUT PARAMETERS - C M - NUMBER OF ROWS (LENGTH OF THE FIRST COLUMN). C N - NUMBER OF COLUMNS IN THE SUPERNODE. C XPNT - XPNT(J+1) POINTS ONE LOCATION BEYOND THE END C OF THE J-TH COLUMN OF THE SUPERNODE. C X(*) - CONTAINS THE COLUMNS OF OF THE SUPERNODE TO C BE FACTORED. C SMXPY - EXTERNAL ROUTINE: MATRIX-VECTOR MULTIPLY. C C OUTPUT PARAMETERS - C X(*) - ON OUTPUT, CONTAINS THE FACTORED COLUMNS OF C THE SUPERNODE. C IFLAG - UNCHANGED IF THERE IS NO ERROR. C =1 IF NONPOSITIVE DIAGONAL ENTRY IS ENCOUNTERED. C C*********************************************************************** C CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC SUBROUTINE PCHOL ( M, N, XPNT, X, MXDIAG, NTINY, IFLAG, SMXPY ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C EXTERNAL SMXPY C INTEGER M, N, IFLAG C INTEGER XPNT(*) C CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC DOUBLE PRECISION X(*), MXDIAG INTEGER NTINY C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER JPNT , JCOL , MM C DOUBLE PRECISION DIAG C C*********************************************************************** C C ------------------------------------------ C FOR EVERY COLUMN JCOL IN THE SUPERNODE ... C ------------------------------------------ MM = M JPNT = XPNT(1) DO 100 JCOL = 1, N C C ---------------------------------- C UPDATE JCOL WITH PREVIOUS COLUMNS. C ---------------------------------- IF ( JCOL .GT. 1 ) THEN CALL SMXPY ( MM, JCOL-1, X(JPNT), XPNT, X ) ENDIF C C --------------------------- C COMPUTE THE DIAGONAL ENTRY. C --------------------------- DIAG = X(JPNT) CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC IF (DIAG .LE. 1.0D-30*MXDIAG) THEN DIAG = 1.0D+128 NTINY = NTINY+1 ENDIF CxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPCxPC DIAG = SQRT ( DIAG ) X(JPNT) = DIAG DIAG = 1.0D+00 / DIAG C C ---------------------------------------------------- C SCALE COLUMN JCOL WITH RECIPROCAL OF DIAGONAL ENTRY. C ---------------------------------------------------- MM = MM - 1 JPNT = JPNT + 1 CALL DSCAL1 ( MM, DIAG, X(JPNT) ) JPNT = JPNT + MM C 100 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: January 12, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************** SFINIT ..... SET UP FOR SYMB. FACT. ************ C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS SUBROUTINE COMPUTES THE STORAGE REQUIREMENTS AND SETS UP C PRELIMINARY DATA STRUCTURES FOR THE SYMBOLIC FACTORIZATION. C C NOTE: C THIS VERSION PRODUCES THE MAXIMAL SUPERNODE PARTITION (I.E., C THE ONE WITH THE FEWEST POSSIBLE SUPERNODES). C C INPUT PARAMETERS: C NEQNS - NUMBER OF EQUATIONS. C NNZA - LENGTH OF ADJACENCY STRUCTURE. C XADJ(*) - ARRAY OF LENGTH NEQNS+1, CONTAINING POINTERS C TO THE ADJACENCY STRUCTURE. C ADJNCY(*) - ARRAY OF LENGTH XADJ(NEQNS+1)-1, CONTAINING C THE ADJACENCY STRUCTURE. C PERM(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C POSTORDERING. C INVP(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE C INVERSE OF THE POSTORDERING. C IWSIZ - SIZE OF INTEGER WORKING STORAGE. C C OUTPUT PARAMETERS: C COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER C OF NONZEROS IN EACH COLUMN OF THE FACTOR, C INCLUDING THE DIAGONAL ENTRY. C NNZL - NUMBER OF NONZEROS IN THE FACTOR, INCLUDING C THE DIAGONAL ENTRIES. C NSUB - NUMBER OF SUBSCRIPTS. C NSUPER - NUMBER OF SUPERNODES (<= NEQNS). C SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING C SUPERNODE MEMBERSHIP. C XSUPER(*) - ARRAY OF LENGTH NEQNS+1, CONTAINING THE C SUPERNODE PARTITIONING. C IFLAG(*) - ERROR FLAG. C 0: SUCCESSFUL SF INITIALIZATION. C -1: INSUFFICENT WORKING STORAGE C [IWORK(*)]. C C WORK PARAMETERS: C IWORK(*) - INTEGER WORK ARRAY OF LENGTH 7*NEQNS+3. C C FIRST CREATED ON NOVEMEBER 14, 1994. C LAST UPDATED ON January 12, 1995. C C*********************************************************************** C SUBROUTINE SFINIT ( NEQNS , NNZA , XADJ , ADJNCY, PERM , & INVP , COLCNT, NNZL , NSUB , NSUPER, & SNODE , XSUPER, IWSIZ , IWORK , IFLAG ) C C ----------- C PARAMETERS. C ----------- INTEGER IFLAG , IWSIZ , NNZA , NEQNS , NNZL , & NSUB , NSUPER INTEGER ADJNCY(NNZA) , COLCNT(NEQNS) , & INVP(NEQNS) , IWORK(7*NEQNS+3), & PERM(NEQNS) , SNODE(NEQNS) , & XADJ(NEQNS+1) , XSUPER(NEQNS+1) C C*********************************************************************** C C -------------------------------------------------------- C RETURN IF THERE IS INSUFFICIENT INTEGER WORKING STORAGE. C -------------------------------------------------------- IFLAG = 0 IF ( IWSIZ .LT. 7*NEQNS+3 ) THEN IFLAG = -1 RETURN ENDIF C C ------------------------------------------ C COMPUTE ELIMINATION TREE AND POSTORDERING. C ------------------------------------------ CALL ETORDR ( NEQNS , XADJ , ADJNCY, PERM , INVP , & IWORK(1) , & IWORK(NEQNS+1) , & IWORK(2*NEQNS+1) , & IWORK(3*NEQNS+1) ) C C --------------------------------------------- C COMPUTE ROW AND COLUMN FACTOR NONZERO COUNTS. C --------------------------------------------- CALL FCNTHN ( NEQNS , NNZA , XADJ , ADJNCY, PERM , & INVP , IWORK(1) , SNODE , COLCNT, & NNZL , & IWORK(NEQNS+1) , & IWORK(2*NEQNS+1) , & XSUPER , & IWORK(3*NEQNS+1) , & IWORK(4*NEQNS+2) , & IWORK(5*NEQNS+3) , & IWORK(6*NEQNS+4) ) C C --------------------------------------------------------- C REARRANGE CHILDREN SO THAT THE LAST CHILD HAS THE MAXIMUM C NUMBER OF NONZEROS IN ITS COLUMN OF L. C --------------------------------------------------------- CALL CHORDR ( NEQNS , XADJ , ADJNCY, PERM , INVP , & COLCNT, & IWORK(1) , & IWORK(NEQNS+1) , & IWORK(2*NEQNS+1) , & IWORK(3*NEQNS+1) ) C C ---------------- C FIND SUPERNODES. C ---------------- CALL FSUP1 ( NEQNS , IWORK(1) , COLCNT, NSUB , & NSUPER, SNODE ) CALL FSUP2 ( NEQNS , NSUPER, IWORK(1) , SNODE , & XSUPER ) C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** SMXPY1 .... MATRIX-VECTOR MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS A MATRIX-VECTOR MULTIPLY, C Y = Y + AX, ASSUMING DATA STRUCTURES USED IN C RECENTLY DEVELOPED SPARSE CHOLESKY CODES. THE C '1' SIGNIFIES NO LOOP UNROLLING, I.E., C LOOP-UNROLLING TO LEVEL 1. C C INPUT PARAMETERS - C M - NUMBER OF ROWS. C N - NUMBER OF COLUMNS. C Y - M-VECTOR TO WHICH AX WILL BE ADDED. C APNT - INDEX VECTOR FOR A. XA(I) POINTS TO THE C FIRST NONZERO IN COLUMN I OF A. C Y - ON OUTPUT, CONTAINS Y = Y + AX. C C*********************************************************************** C SUBROUTINE SMXPY1 ( M, N, Y, APNT, A ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER M, N C INTEGER APNT(N) C DOUBLE PRECISION Y(M), A(*) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I, II, J C DOUBLE PRECISION AMULT C C*********************************************************************** C DO 200 J = 1, N II = APNT(J+1) - M AMULT = - A(II) DO 100 I = 1, M Y(I) = Y(I) + AMULT * A(II) II = II + 1 100 CONTINUE 200 CONTINUE RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** SMXPY2 .... MATRIX-VECTOR MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS A MATRIX-VECTOR MULTIPLY, C Y = Y + AX, ASSUMING DATA STRUCTURES USED IN C RECENTLY DEVELOPED SPARSE CHOLESKY CODES. THE C '2' SIGNIFIES LEVEL 2 LOOP UNROLLING. C C INPUT PARAMETERS - C M - NUMBER OF ROWS. C N - NUMBER OF COLUMNS. C Y - M-VECTOR TO WHICH AX WILL BE ADDED. C APNT - INDEX VECTOR FOR A. XA(I) POINTS TO THE C FIRST NONZERO IN COLUMN I OF A. C Y - ON OUTPUT, CONTAINS Y = Y + AX. C C*********************************************************************** C SUBROUTINE SMXPY2 ( M, N, Y, APNT, A ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER M, N, LEVEL C INTEGER APNT(*) C DOUBLE PRECISION Y(*), A(*) C PARAMETER ( LEVEL = 2 ) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I, I1, I2, & J, REMAIN C DOUBLE PRECISION A1, A2 C C*********************************************************************** C REMAIN = MOD ( N, LEVEL ) C GO TO ( 2000, 100 ), REMAIN+1 C 100 CONTINUE I1 = APNT(1+1) - M A1 = - A(I1) DO 150 I = 1, M Y(I) = Y(I) + A1*A(I1) I1 = I1 + 1 150 CONTINUE GO TO 2000 C 2000 CONTINUE DO 4000 J = REMAIN+1, N, LEVEL I1 = APNT(J+1) - M I2 = APNT(J+2) - M A1 = - A(I1) A2 = - A(I2) DO 3000 I = 1, M Y(I) = ( (Y(I)) + & A1*A(I1)) + A2*A(I2) I1 = I1 + 1 I2 = I2 + 1 3000 CONTINUE 4000 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** SMXPY4 .... MATRIX-VECTOR MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS A MATRIX-VECTOR MULTIPLY, C Y = Y + AX, ASSUMING DATA STRUCTURES USED IN C RECENTLY DEVELOPED SPARSE CHOLESKY CODES. THE C '4' SIGNIFIES LEVEL 4 LOOP UNROLLING. C C INPUT PARAMETERS - C M - NUMBER OF ROWS. C N - NUMBER OF COLUMNS. C Y - M-VECTOR TO WHICH AX WILL BE ADDED. C APNT - INDEX VECTOR FOR A. XA(I) POINTS TO THE C FIRST NONZERO IN COLUMN I OF A. C Y - ON OUTPUT, CONTAINS Y = Y + AX. C C*********************************************************************** C SUBROUTINE SMXPY4 ( M, N, Y, APNT, A ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER M, N, LEVEL C INTEGER APNT(*) C DOUBLE PRECISION Y(*), A(*) C PARAMETER ( LEVEL = 4 ) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I, I1, I2, I3, I4, & J, REMAIN C DOUBLE PRECISION A1, A2, A3, A4 C C*********************************************************************** C REMAIN = MOD ( N, LEVEL ) C GO TO ( 2000, 100, 200, 300 ), REMAIN+1 C 100 CONTINUE I1 = APNT(1+1) - M A1 = - A(I1) DO 150 I = 1, M Y(I) = Y(I) + A1*A(I1) I1 = I1 + 1 150 CONTINUE GO TO 2000 C 200 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M A1 = - A(I1) A2 = - A(I2) DO 250 I = 1, M Y(I) = ( (Y(I)) & + A1*A(I1)) + A2*A(I2) I1 = I1 + 1 I2 = I2 + 1 250 CONTINUE GO TO 2000 C 300 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) DO 350 I = 1, M Y(I) = (( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 350 CONTINUE GO TO 2000 C 2000 CONTINUE DO 4000 J = REMAIN+1, N, LEVEL I1 = APNT(J+1) - M I2 = APNT(J+2) - M I3 = APNT(J+3) - M I4 = APNT(J+4) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) DO 3000 I = 1, M Y(I) = ((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 3000 CONTINUE 4000 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: December 27, 1994 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C****** SMXPY8 .... MATRIX-VECTOR MULTIPLY ************** C*********************************************************************** C*********************************************************************** C C PURPOSE - THIS ROUTINE PERFORMS A MATRIX-VECTOR MULTIPLY, C Y = Y + AX, ASSUMING DATA STRUCTURES USED IN C RECENTLY DEVELOPED SPARSE CHOLESKY CODES. THE C '8' SIGNIFIES LEVEL 8 LOOP UNROLLING. C C INPUT PARAMETERS - C M - NUMBER OF ROWS. C N - NUMBER OF COLUMNS. C Y - M-VECTOR TO WHICH AX WILL BE ADDED. C APNT - INDEX VECTOR FOR A. APNT(I) POINTS TO THE C FIRST NONZERO IN COLUMN I OF A. C Y - ON OUTPUT, CONTAINS Y = Y + AX. C C*********************************************************************** C SUBROUTINE SMXPY8 ( M, N, Y, APNT, A ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- C INTEGER M, N, LEVEL C INTEGER APNT(*) C DOUBLE PRECISION Y(*), A(*) C PARAMETER ( LEVEL = 8 ) C C ---------------- C LOCAL VARIABLES. C ---------------- C INTEGER I, I1, I2, I3, I4, I5, I6, I7, I8, & J, REMAIN C DOUBLE PRECISION A1, A2, A3, A4, A5, A6, A7, A8 C C*********************************************************************** C REMAIN = MOD ( N, LEVEL ) C GO TO ( 2000, 100, 200, 300, & 400, 500, 600, 700 ), REMAIN+1 C 100 CONTINUE I1 = APNT(1+1) - M A1 = - A(I1) DO 150 I = 1, M Y(I) = Y(I) + A1*A(I1) I1 = I1 + 1 150 CONTINUE GO TO 2000 C 200 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M A1 = - A(I1) A2 = - A(I2) DO 250 I = 1, M Y(I) = ( (Y(I)) & + A1*A(I1)) + A2*A(I2) I1 = I1 + 1 I2 = I2 + 1 250 CONTINUE GO TO 2000 C 300 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) DO 350 I = 1, M Y(I) = (( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 350 CONTINUE GO TO 2000 C 400 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M I4 = APNT(1+4) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) DO 450 I = 1, M Y(I) = ((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 450 CONTINUE GO TO 2000 C 500 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M I4 = APNT(1+4) - M I5 = APNT(1+5) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) A5 = - A(I5) DO 550 I = 1, M Y(I) = (((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4)) & + A5*A(I5) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 I5 = I5 + 1 550 CONTINUE GO TO 2000 C 600 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M I4 = APNT(1+4) - M I5 = APNT(1+5) - M I6 = APNT(1+6) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) A5 = - A(I5) A6 = - A(I6) DO 650 I = 1, M Y(I) = ((((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4)) & + A5*A(I5)) + A6*A(I6) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 I5 = I5 + 1 I6 = I6 + 1 650 CONTINUE GO TO 2000 C 700 CONTINUE I1 = APNT(1+1) - M I2 = APNT(1+2) - M I3 = APNT(1+3) - M I4 = APNT(1+4) - M I5 = APNT(1+5) - M I6 = APNT(1+6) - M I7 = APNT(1+7) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) A5 = - A(I5) A6 = - A(I6) A7 = - A(I7) DO 750 I = 1, M Y(I) = (((((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4)) & + A5*A(I5)) + A6*A(I6)) & + A7*A(I7) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 I5 = I5 + 1 I6 = I6 + 1 I7 = I7 + 1 750 CONTINUE GO TO 2000 C 2000 CONTINUE DO 4000 J = REMAIN+1, N, LEVEL I1 = APNT(J+1) - M I2 = APNT(J+2) - M I3 = APNT(J+3) - M I4 = APNT(J+4) - M I5 = APNT(J+5) - M I6 = APNT(J+6) - M I7 = APNT(J+7) - M I8 = APNT(J+8) - M A1 = - A(I1) A2 = - A(I2) A3 = - A(I3) A4 = - A(I4) A5 = - A(I5) A6 = - A(I6) A7 = - A(I7) A8 = - A(I8) DO 3000 I = 1, M Y(I) = ((((((( (Y(I)) & + A1*A(I1)) + A2*A(I2)) & + A3*A(I3)) + A4*A(I4)) & + A5*A(I5)) + A6*A(I6)) & + A7*A(I7)) + A8*A(I8) I1 = I1 + 1 I2 = I2 + 1 I3 = I3 + 1 I4 = I4 + 1 I5 = I5 + 1 I6 = I6 + 1 I7 = I7 + 1 I8 = I8 + 1 3000 CONTINUE 4000 CONTINUE C RETURN END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: February 13, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* SYMFC2 ..... SYMBOLIC FACTORIZATION ************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS ROUTINE PERFORMS SUPERNODAL SYMBOLIC FACTORIZATION ON A C REORDERED LINEAR SYSTEM. IT ASSUMES ACCESS TO THE COLUMNS C COUNTS, SUPERNODE PARTITION, AND SUPERNODAL ELIMINATION TREE C ASSOCIATED WITH THE FACTOR MATRIX L. C C INPUT PARAMETERS: C (I) NEQNS - NUMBER OF EQUATIONS C (I) ADJLEN - LENGTH OF THE ADJACENCY LIST. C (I) XADJ(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING POINTERS C TO THE ADJACENCY STRUCTURE. C (I) ADJNCY(*) - ARRAY OF LENGTH XADJ(NEQNS+1)-1 CONTAINING C THE ADJACENCY STRUCTURE. C (I) PERM(*) - ARRAY OF LENGTH NEQNS CONTAINING THE C POSTORDERING. C (I) INVP(*) - ARRAY OF LENGTH NEQNS CONTAINING THE C INVERSE OF THE POSTORDERING. C (I) COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER C OF NONZEROS IN EACH COLUMN OF THE FACTOR, C INCLUDING THE DIAGONAL ENTRY. C (I) NSUPER - NUMBER OF SUPERNODES. C (I) XSUPER(*) - ARRAY OF LENGTH NSUPER+1, CONTAINING THE C FIRST COLUMN OF EACH SUPERNODE. C (I) SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING C SUPERNODE MEMBERSHIP. C (I) NOFSUB - NUMBER OF SUBSCRIPTS TO BE STORED IN C LINDX(*). C C OUTPUT PARAMETERS: C (I) XLINDX - ARRAY OF LENGTH NEQNS+1, CONTAINING POINTERS C INTO THE SUBSCRIPT VECTOR. C (I) LINDX - ARRAY OF LENGTH MAXSUB, CONTAINING THE C COMPRESSED SUBSCRIPTS. C (I) XLNZ - COLUMN POINTERS FOR L. C (I) FLAG - ERROR FLAG: C 0 - NO ERROR. C 1 - INCONSISTANCY IN THE INPUT. C C WORKING PARAMETERS: C (I) MRGLNK - ARRAY OF LENGTH NSUPER, CONTAINING THE C CHILDREN OF EACH SUPERNODE AS A LINKED LIST. C (I) RCHLNK - ARRAY OF LENGTH NEQNS+1, CONTAINING THE C CURRENT LINKED LIST OF MERGED INDICES (THE C "REACH" SET). C (I) MARKER - ARRAY OF LENGTH NEQNS USED TO MARK INDICES C AS THEY ARE INTRODUCED INTO EACH SUPERNODE'S C INDEX SET. C C*********************************************************************** C SUBROUTINE SYMFC2 ( NEQNS , ADJLEN, XADJ , ADJNCY, PERM , & INVP , COLCNT, NSUPER, XSUPER, SNODE , & NOFSUB, XLINDX, LINDX , XLNZ , MRGLNK, & RCHLNK, MARKER, FLAG ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER ADJLEN, FLAG , NEQNS , NOFSUB, NSUPER INTEGER ADJNCY(ADJLEN), COLCNT(NEQNS) , & INVP(NEQNS) , MARKER(NEQNS) , & MRGLNK(NSUPER), LINDX(*) , & PERM(NEQNS) , RCHLNK(0:NEQNS), & SNODE(NEQNS) , XSUPER(NSUPER+1) INTEGER XADJ(NEQNS+1) , XLINDX(NSUPER+1), & XLNZ(NEQNS+1) C C ---------------- C LOCAL VARIABLES. C ---------------- INTEGER FSTCOL, HEAD , I , JNZBEG, JNZEND, & JPTR , JSUP , JWIDTH, KNZ , KNZBEG, & KNZEND, KPTR , KSUP , LENGTH, LSTCOL, & NEWI , NEXTI , NODE , NZBEG , NZEND , & PCOL , PSUP , POINT , TAIL , WIDTH C C*********************************************************************** C FLAG = 0 IF ( NEQNS .LE. 0 ) RETURN C C --------------------------------------------------- C INITIALIZATIONS ... C NZEND : POINTS TO THE LAST USED SLOT IN LINDX. C TAIL : END OF LIST INDICATOR C (IN RCHLNK(*), NOT MRGLNK(*)). C MRGLNK : CREATE EMPTY LISTS. C MARKER : "UNMARK" THE INDICES. C --------------------------------------------------- NZEND = 0 HEAD = 0 TAIL = NEQNS + 1 POINT = 1 DO 50 I = 1, NEQNS MARKER(I) = 0 XLNZ(I) = POINT POINT = POINT + COLCNT(I) 50 CONTINUE XLNZ(NEQNS+1) = POINT POINT = 1 DO 100 KSUP = 1, NSUPER MRGLNK(KSUP) = 0 FSTCOL = XSUPER(KSUP) XLINDX(KSUP) = POINT POINT = POINT + COLCNT(FSTCOL) 100 CONTINUE XLINDX(NSUPER+1) = POINT C C --------------------------- C FOR EACH SUPERNODE KSUP ... C --------------------------- DO 1000 KSUP = 1, NSUPER C C --------------------------------------------------------- C INITIALIZATIONS ... C FSTCOL : FIRST COLUMN OF SUPERNODE KSUP. C LSTCOL : LAST COLUMN OF SUPERNODE KSUP. C KNZ : WILL COUNT THE NONZEROS OF L IN COLUMN KCOL. C RCHLNK : INITIALIZE EMPTY INDEX LIST FOR KCOL. C --------------------------------------------------------- FSTCOL = XSUPER(KSUP) LSTCOL = XSUPER(KSUP+1) - 1 WIDTH = LSTCOL - FSTCOL + 1 LENGTH = COLCNT(FSTCOL) KNZ = 0 RCHLNK(HEAD) = TAIL JSUP = MRGLNK(KSUP) C C ------------------------------------------------- C IF KSUP HAS CHILDREN IN THE SUPERNODAL E-TREE ... C ------------------------------------------------- IF ( JSUP .GT. 0 ) THEN C --------------------------------------------- C COPY THE INDICES OF THE FIRST CHILD JSUP INTO C THE LINKED LIST, AND MARK EACH WITH THE VALUE C KSUP. C --------------------------------------------- JWIDTH = XSUPER(JSUP+1) - XSUPER(JSUP) JNZBEG = XLINDX(JSUP) + JWIDTH JNZEND = XLINDX(JSUP+1) - 1 DO 200 JPTR = JNZEND, JNZBEG, -1 NEWI = LINDX(JPTR) KNZ = KNZ+1 MARKER(NEWI) = KSUP RCHLNK(NEWI) = RCHLNK(HEAD) RCHLNK(HEAD) = NEWI 200 CONTINUE C ------------------------------------------ C FOR EACH SUBSEQUENT CHILD JSUP OF KSUP ... C ------------------------------------------ JSUP = MRGLNK(JSUP) 300 CONTINUE IF ( JSUP .NE. 0 .AND. KNZ .LT. LENGTH ) THEN C ---------------------------------------- C MERGE THE INDICES OF JSUP INTO THE LIST, C AND MARK NEW INDICES WITH VALUE KSUP. C ---------------------------------------- JWIDTH = XSUPER(JSUP+1) - XSUPER(JSUP) JNZBEG = XLINDX(JSUP) + JWIDTH JNZEND = XLINDX(JSUP+1) - 1 NEXTI = HEAD DO 500 JPTR = JNZBEG, JNZEND NEWI = LINDX(JPTR) 400 CONTINUE I = NEXTI NEXTI = RCHLNK(I) IF ( NEWI .GT. NEXTI ) GO TO 400 IF ( NEWI .LT. NEXTI ) THEN KNZ = KNZ+1 RCHLNK(I) = NEWI RCHLNK(NEWI) = NEXTI MARKER(NEWI) = KSUP NEXTI = NEWI ENDIF 500 CONTINUE JSUP = MRGLNK(JSUP) GO TO 300 ENDIF ENDIF C --------------------------------------------------- C STRUCTURE OF A(*,FSTCOL) HAS NOT BEEN EXAMINED YET. C "SORT" ITS STRUCTURE INTO THE LINKED LIST, C INSERTING ONLY THOSE INDICES NOT ALREADY IN THE C LIST. C --------------------------------------------------- IF ( KNZ .LT. LENGTH ) THEN NODE = PERM(FSTCOL) KNZBEG = XADJ(NODE) KNZEND = XADJ(NODE+1) - 1 DO 700 KPTR = KNZBEG, KNZEND NEWI = ADJNCY(KPTR) NEWI = INVP(NEWI) IF ( NEWI .GT. FSTCOL .AND. & MARKER(NEWI) .NE. KSUP ) THEN C -------------------------------- C POSITION AND INSERT NEWI IN LIST C AND MARK IT WITH KCOL. C -------------------------------- NEXTI = HEAD 600 CONTINUE I = NEXTI NEXTI = RCHLNK(I) IF ( NEWI .GT. NEXTI ) GO TO 600 KNZ = KNZ + 1 RCHLNK(I) = NEWI RCHLNK(NEWI) = NEXTI MARKER(NEWI) = KSUP ENDIF 700 CONTINUE ENDIF C ------------------------------------------------------------ C IF KSUP HAS NO CHILDREN, INSERT FSTCOL INTO THE LINKED LIST. C ------------------------------------------------------------ IF ( RCHLNK(HEAD) .NE. FSTCOL ) THEN RCHLNK(FSTCOL) = RCHLNK(HEAD) RCHLNK(HEAD) = FSTCOL KNZ = KNZ + 1 ENDIF C C -------------------------------------------- C COPY INDICES FROM LINKED LIST INTO LINDX(*). C -------------------------------------------- NZBEG = NZEND + 1 NZEND = NZEND + KNZ IF ( NZEND+1 .NE. XLINDX(KSUP+1) ) GO TO 8000 I = HEAD DO 800 KPTR = NZBEG, NZEND I = RCHLNK(I) LINDX(KPTR) = I 800 CONTINUE C C --------------------------------------------------- C IF KSUP HAS A PARENT, INSERT KSUP INTO ITS PARENT'S C "MERGE" LIST. C --------------------------------------------------- IF ( LENGTH .GT. WIDTH ) THEN PCOL = LINDX ( XLINDX(KSUP) + WIDTH ) PSUP = SNODE(PCOL) MRGLNK(KSUP) = MRGLNK(PSUP) MRGLNK(PSUP) = KSUP ENDIF C 1000 CONTINUE C RETURN C C ----------------------------------------------- C INCONSISTENCY IN DATA STRUCTURE WAS DISCOVERED. C ----------------------------------------------- 8000 CONTINUE FLAG = -2 RETURN C END C*********************************************************************** C*********************************************************************** C C Version: 0.4 C Last modified: February 13, 1995 C Authors: Esmond G. Ng and Barry W. Peyton C C Mathematical Sciences Section, Oak Ridge National Laboratory C C*********************************************************************** C*********************************************************************** C************* SYMFCT ..... SYMBOLIC FACTORIZATION ************** C*********************************************************************** C*********************************************************************** C C PURPOSE: C THIS ROUTINE CALLS SYMFC2 WHICH PERFORMS SUPERNODAL SYMBOLIC C FACTORIZATION ON A REORDERED LINEAR SYSTEM. C C INPUT PARAMETERS: C (I) NEQNS - NUMBER OF EQUATIONS C (I) ADJLEN - LENGTH OF THE ADJACENCY LIST. C (I) XADJ(*) - ARRAY OF LENGTH NEQNS+1 CONTAINING POINTERS C TO THE ADJACENCY STRUCTURE. C (I) ADJNCY(*) - ARRAY OF LENGTH XADJ(NEQNS+1)-1 CONTAINING C THE ADJACENCY STRUCTURE. C (I) PERM(*) - ARRAY OF LENGTH NEQNS CONTAINING THE C POSTORDERING. C (I) INVP(*) - ARRAY OF LENGTH NEQNS CONTAINING THE C INVERSE OF THE POSTORDERING. C (I) COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER C OF NONZEROS IN EACH COLUMN OF THE FACTOR, C INCLUDING THE DIAGONAL ENTRY. C (I) NSUPER - NUMBER OF SUPERNODES. C (I) XSUPER(*) - ARRAY OF LENGTH NSUPER+1, CONTAINING THE C FIRST COLUMN OF EACH SUPERNODE. C (I) SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING C SUPERNODE MEMBERSHIP. C (I) NOFSUB - NUMBER OF SUBSCRIPTS TO BE STORED IN C LINDX(*). C (I) IWSIZ - SIZE OF INTEGER WORKING STORAGE. C C OUTPUT PARAMETERS: C (I) XLINDX - ARRAY OF LENGTH NEQNS+1, CONTAINING POINTERS C INTO THE SUBSCRIPT VECTOR. C (I) LINDX - ARRAY OF LENGTH MAXSUB, CONTAINING THE C COMPRESSED SUBSCRIPTS. C (I) XLNZ - COLUMN POINTERS FOR L. C (I) FLAG - ERROR FLAG: C 0 - NO ERROR. C -1 - INSUFFICIENT INTEGER WORKING SPACE. C -2 - INCONSISTANCY IN THE INPUT. C C WORKING PARAMETERS: C (I) IWORK - WORKING ARRAY OF LENGTH NSUPER+2*NEQNS. C C*********************************************************************** C SUBROUTINE SYMFCT ( NEQNS , ADJLEN, XADJ , ADJNCY, PERM , & INVP , COLCNT, NSUPER, XSUPER, SNODE , & NOFSUB, XLINDX, LINDX , XLNZ , IWSIZ , & IWORK , & FLAG ) C C*********************************************************************** C C ----------- C PARAMETERS. C ----------- INTEGER ADJLEN, FLAG , IWSIZ , NEQNS , NOFSUB, & NSUPER INTEGER ADJNCY(ADJLEN), COLCNT(NEQNS) , & INVP(NEQNS) , & IWORK(NSUPER+2*NEQNS+1), & LINDX(NOFSUB) , & PERM(NEQNS) , SNODE(NEQNS) , & XSUPER(NSUPER+1) INTEGER XADJ(NEQNS+1) , XLINDX(NSUPER+1), & XLNZ(NEQNS+1) C C*********************************************************************** C FLAG = 0 IF ( IWSIZ .LT. NSUPER+2*NEQNS+1 ) THEN FLAG = -1 RETURN ENDIF CALL SYMFC2 ( NEQNS , ADJLEN, XADJ , ADJNCY, PERM , & INVP , COLCNT, NSUPER, XSUPER, SNODE , & NOFSUB, XLINDX, LINDX , XLNZ , & IWORK(1) , & IWORK(NSUPER+1) , & IWORK(NSUPER+NEQNS+2) , & FLAG ) RETURN END quantreg/src/rqfnb.f0000644000176200001440000001144114470134064014152 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine rqfnb(n,p,a,y,rhs,d,u,beta,eps,wn,wp,nit,info) integer n,p,info,nit(3) double precision a(p,n),y(n),rhs(p),d(n),u(n),wn(n,9),wp(p,p+3) double precision one,beta,eps parameter( one = 1.0d0) call lpfnb(n,p,a,y,rhs,d,u,beta,eps,wn(1,1),wn(1,2), wp(1,1),wn(1, *3),wn(1,4),wn(1,5),wn(1,6), wp(1,2),wn(1,7),wn(1,8),wn(1,9),wp(1,3 *),wp(1,4),nit,info) return end subroutine lpfnb(n,p,a,c,b,d,u,beta,eps,x,s,y,z,w, dx,ds,dy,dz,dw, *dr,rhs,ada,nit,info) integer n,p,pp,i,info,nit(3),maxit double precision a(p,n),c(n),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dxdz,dsdw double precision deltap,deltad,beta,eps,mu,gap,g double precision x(n),u(n),s(n),y(p),z(n),w(n),d(n),rhs(p),ada(p,p *) double precision dx(n),ds(n),dy(p),dz(n),dw(n),dr(n) parameter( zero = 0.0d0) parameter( one = 1.0d0) parameter( mone = -1.0d0) parameter( big = 1.0d+20) parameter( maxit = 500) nit(1)=0 nit(2)=0 nit(3)=n pp=p*p call dgemv('N',p,n,one,a,p,c,1,zero,y,1) do23000 i=1,n d(i)=one 23000 continue 23001 continue call stepy(n,p,a,d,y,ada,info) if(info .ne. 0)then return endif call dcopy(n,c,1,s,1) call dgemv('T',p,n,mone,a,p,y,1,one,s,1) do23004 i=1,n if(dabs(s(i)).lt.eps)then z(i)=dmax1(s(i), zero) + eps w(i)=dmax1(-s(i),zero) + eps else z(i)=dmax1(s(i), zero) w(i)=dmax1(-s(i),zero) endif s(i)=u(i)-x(i) 23004 continue 23005 continue gap = ddot(n,z,1,x,1)+ddot(n,w,1,s,1) 23008 if(gap .gt. eps .and. nit(1).lt.maxit)then nit(1)=nit(1)+1 do23010 i = 1,n d(i) = one/(z(i)/x(i) + w(i)/s(i)) ds(i)=z(i)-w(i) dz(i)=d(i)*ds(i) 23010 continue 23011 continue call dcopy(p,b,1,dy,1) call dgemv('N',p,n,mone,a,p,x,1,one,dy,1) call dgemv('N',p,n,one,a,p,dz,1,one,dy,1) call dcopy(p,dy,1,rhs,1) call stepy(n,p,a,d,dy,ada,info) if(info .ne. 0)then return endif call dgemv('T',p,n,one,a,p,dy,1,mone,ds,1) deltap=big deltad=big do23014 i=1,n dx(i)=d(i)*ds(i) ds(i)=-dx(i) dz(i)=-z(i)*(dx(i)/x(i) + one) dw(i)=-w(i)*(ds(i)/s(i) + one) if(dx(i).lt.0)then deltap=dmin1(deltap,-x(i)/dx(i)) endif if(ds(i).lt.0)then deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz(i).lt.0)then deltad=dmin1(deltad,-z(i)/dz(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23014 continue 23015 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) if(min(deltap,deltad) .lt. one)then nit(2)=nit(2)+1 mu = ddot(n,x,1,z,1)+ddot(n,s,1,w,1) g = mu + deltap*ddot(n,dx,1,z,1)+ deltad*ddot(n,dz,1,x,1) + deltap **deltad*ddot(n,dz,1,dx,1)+ deltap*ddot(n,ds,1,w,1)+ deltad*ddot(n, *dw,1,s,1) + deltap*deltad*ddot(n,ds,1,dw,1) mu = mu * ((g/mu)**3) /dble(2*n) do23026 i=1,n dr(i)=d(i)*(mu*(1/s(i)-1/x(i))+ dx(i)*dz(i)/x(i)-ds(i)*dw(i)/s(i)) 23026 continue 23027 continue call dswap(p,rhs,1,dy,1) call dgemv('N',p,n,one,a,p,dr,1,one,dy,1) call dpotrs('U',p,1,ada,p,dy,p,info) call dgemv('T',p,n,one,a,p,dy,1,zero,u,1) deltap=big deltad=big do23028 i=1,n dxdz = dx(i)*dz(i) dsdw = ds(i)*dw(i) dx(i)= d(i)*(u(i)-z(i)+w(i))-dr(i) ds(i)= -dx(i) dz(i)= -z(i)+(mu - z(i)*dx(i) - dxdz)/x(i) dw(i)= -w(i)+(mu - w(i)*ds(i) - dsdw)/s(i) if(dx(i).lt.0)then deltap=dmin1(deltap,-x(i)/dx(i)) endif if(ds(i).lt.0)then deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz(i).lt.0)then deltad=dmin1(deltad,-z(i)/dz(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23028 continue 23029 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) endif call daxpy(n,deltap,dx,1,x,1) call daxpy(n,deltap,ds,1,s,1) call daxpy(p,deltad,dy,1,y,1) call daxpy(n,deltad,dz,1,z,1) call daxpy(n,deltad,dw,1,w,1) gap = ddot(n,z,1,x,1)+ddot(n,w,1,s,1) goto 23008 endif 23009 continue call daxpy(n,mone,w,1,z,1) call dswap(n,z,1,x,1) return end subroutine stepy(n,p,a,d,b,ada,info) integer n,p,pp,i,info double precision a(p,n),b(p),d(n),ada(p,p),zero parameter( zero = 0.0d0) pp=p*p do23038 j=1,p do23040 k=1,p ada(j,k)=zero 23040 continue 23041 continue 23038 continue 23039 continue do23042 i=1,n call dsyr('U',p,d(i),a(1,i),1,ada,p) 23042 continue 23043 continue call dposv('U',p,1,ada,p,b,p,info) return end quantreg/src/brute.f0000644000176200001440000000216713752023347014173 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine brutpow(n,p,m,h,a,b,c,x,tau,u,xh,d,jminz,nflag) integer n,p,m double precision x(p),a(n,p),b(n),c(n) double precision u(p,p),d(p),xh(p) double precision zero, one,tau,pow,minz,z integer h(p,m),k,findk,jminz,nflag parameter(zero = 0.0d0, one = 1.d0) jminz = 1 minz = pow(n,p,x,a,b,c,tau) do23000 j = 2,m k = findk(p,h(1,j),h(1,j-1)) if(k .eq. 0)then nflag = 4 return endif call pivot(n,p,h(1,j-1),h(k,j),h(k,j-1),a,u,d,xh,nflag) if(nflag .gt. 0)then return endif do23006 i = 1,p xh(i) = b(h(i,j)) 23006 continue 23007 continue call dgemv('N',p,p,one,u,p,xh,1,zero,x,1) z = pow(n,p,x,a,b,c,tau) if(z .lt. minz)then minz = z jminz = j endif 23000 continue 23001 continue return end integer function findk(p,h,g) integer p,k,h(p),g(p) findk = 0 do23010 k = 1,p if(h(k) .ne. g(k))then findk = k goto 23011 endif 23010 continue 23011 continue return end quantreg/src/akj.f0000644000176200001440000000564113752030125013607 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine akj(x,z,p,iker,dens,psi,score,nx,nz,h,alpha,kappa,xlam *) double precision dens(nz),score(nz),psi(nz),h,kappa double precision z(nz),x(nx),xlam(nx),p(nx),qrange,pi double precision con1,sum,sqsum,xsd,a,fifth,hinv,half double precision xn,xker,dxker,ddxker,fact,xponen,alpha,glog,zero, *one,two parameter( zero = 0.d0) parameter( one = 1.d0) parameter( two = 2.d0) parameter( four = 4.d0) parameter( half = 0.5d0) parameter( fifth = 0.2d0) parameter( pi = 3.141593d0) xn=nx if(iker.eq.0)then con1=one/sqrt(2.0*pi) else if(iker.eq.1)then con1=one/pi endif endif if(h.le.0.)then sum=0. sqsum=0. do23006 i=1,nx sqsum=sqsum+x(i)*x(i)*p(i) sum=sum+x(i)*p(i) 23006 continue 23007 continue xsd=dsqrt(sqsum-sum*sum) sum=zero i=1 23008 if(.not.(i.lt.nx))goto 23010 sum=sum+p(i) if(sum.lt..25)then goto 23009 else qrange=x(i) goto 23010 endif 23009 i=i+1 goto 23008 23010 continue sum=one i=nx 23013 if(.not.(i.gt.0))goto 23015 sum=sum-p(i) if(sum.gt..75)then goto 23014 else qrange=x(i)-qrange goto 23015 endif 23014 i=i-1 goto 23013 23015 continue a=min(xsd,qrange/1.34) h=kappa*a/(xn**fifth) endif hinv=one/h do23018 j=1,nx xker=0. if(iker.eq.0)then do23022 i=1,nx xponen=(x(j)-x(i))*hinv xponen=half*xponen**2 xker=xker+p(i)*exp(-xponen)*hinv 23022 continue 23023 continue else if(iker.eq.1)then do23026 i=1,nx xponen=(x(j)-x(i))*hinv xker=xker+p(i)*hinv/(1+xponen**2) 23026 continue 23027 continue endif endif xlam(j)=con1*xker 23018 continue 23019 continue glog=zero do23028 i=1,nx glog=glog+p(i)*log(xlam(i)) 23028 continue 23029 continue g=exp(glog) ginv=one/g do23030 i=1,nx xlam(i)=hinv/((xlam(i)*ginv)**(-alpha)) 23030 continue 23031 continue do23032 j=1,nz xker=zero dxker=zero ddxker=zero if(iker.eq.0)then do23036 i=1,nx xponen=(z(j)-x(i))*xlam(i) fact=exp(-half*xponen*xponen)*xlam(i) xker=xker+p(i)*fact dxker=dxker-p(i)*fact*xponen*xlam(i) ddxker=ddxker- p(i)*fact*(one - xponen**2)*xlam(i)**2 23036 continue 23037 continue else if(iker.eq.1)then do23040 i=1,nx xponen=(z(j)-x(i))*xlam(i) fact=xlam(i)/(one+xponen**2) xker=xker+p(i)*fact dxker=dxker-p(i)*two*xponen*fact**2 ddxker=ddxker- p(i)*two*(fact**2)*(xlam(i)- four*(xponen**2)*fact) 23040 continue 23041 continue endif endif dens(j)=con1*xker psi(j)=-(dxker/xker) score(j)=(dxker/xker)**2-ddxker/xker 23032 continue 23033 continue return end quantreg/src/qfnb.f0000644000176200001440000000151713755220523013774 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine qfnb(n,p,m,a,y,t,r,d,u,wn,wp,b,nit, info) integer n,p,m,nit(3),info double precision a(p,n), y(n), t(m), b(p,m), r(p) double precision d(n), u(n), wn(n,9), wp(p,p+3) double precision zero, one, eps, beta parameter( zero = 0.0d0) parameter( one = 1.0d0) parameter( beta = 0.99995d0) parameter( eps = 1.0d-6) do23000 i = 1,m call dgemv('N',p,n,one-t(i),a,p,d,1,zero,r,1) call dscal(n,zero,wn,1) call daxpy(n,one-t(i),u,1,wn,1) call rqfnb(n,p,a,y,r,d,u,beta,eps,wn,wp,nit,info) if(info .ne. 0)then goto 23001 endif do23004 j = 1,n u(j) = one d(j) = one 23004 continue 23005 continue call dcopy(p,wp,1,b(1,i),1) 23000 continue 23001 continue return end quantreg/src/bound.f0000644000176200001440000000174213522271353014154 0ustar liggesusersc 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c c Function to obtain the step length c c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c subroutine bound(x,dx,s,ds,z,dz,w,dw,n,beta,deltap,deltad) c integer n double precision x(n),dx(n),s(n),ds(n),z(n),dz(n),w(n),dw(n) double precision deltap,deltad,dmin1,big,one,beta parameter (big = 1.0d20, one = 1.0d0) deltap = big deltad = big do i=1,n if(dx(i) .lt. 0) deltap = dmin1(deltap, -x(i)/dx(i)) if(ds(i) .lt. 0) deltap = dmin1(deltap, -s(i)/ds(i)) if(dz(i) .lt. 0) deltad = dmin1(deltad, -z(i)/dz(i)) if(dw(i) .lt. 0) deltad = dmin1(deltad, -w(i)/dw(i)) enddo deltap = dmin1(beta*deltap,one) deltad = dmin1(beta*deltad,one) return end quantreg/src/kuantiles.f0000644000176200001440000000042713752203220015034 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine kuantiles(k,m,n,x) integer i,j,k(m),m,n double precision x(n) j = 0 do23000 i = 1,m call dsel05(k(i)-j,n-j,x(j+1)) j = k(i) 23000 continue 23001 continue return end quantreg/src/powell.f0000644000176200001440000000733613777105467014372 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine powell(n,p,p2,a,b,c,x,tau,h,f,u,s,g,d,xh,maxit,nflag) integer n,p,p2 double precision x(p),a(n,p),b(n),c(n) double precision f(n),u(p,p),s(n),g(p2),d(p),xh(p) double precision zero, one, mone, step, tau,pow integer h(p),hin,hout,k,it,inset,maxit,nflag parameter(zero = 0.0d0, one = 1.d0, mone = -1.d0) it = 0 23000 continue it = it + 1 if(it .gt. 1)then call pivot(n,p,h,hin,hout,a,u,d,xh,nflag) endif if(nflag .gt. 0)then nflag = nflag + 2 return endif do23007 i = 1,p xh(i) = b(h(i)) 23007 continue 23008 continue call dgemv('N',p,p,one,u,p,xh,1,zero,x,1) call dgemv('N',n,p,one,a,n,x,1,zero,f,1) do23009 i = 1,n if(inset(p,i,h) .gt. 0 .or. f(i) .gt. c(i))then s(i) = zero else if(b(i) .lt. f(i))then s(i) = one - tau else s(i) = - tau endif endif 23009 continue 23010 continue call dgemv('T',n,p,one,a,n,s,1,zero,xh,1) call dgemv('T',p,p,one,u,p,xh,1,zero,g,1) do23015 i = 1,p if(f(h(i)) .lt. c(h(i)))then if(b(h(i)) .lt. c(h(i)))then g(i + p) = - g(i) + one - tau else g(i + p) = - g(i) - tau endif else g(i + p) = - g(i) + tau endif g(i) = g(i) + one - tau 23015 continue 23016 continue k = idmin(p2,g,1) if(g(k) .ge. 0 .or. it .gt. maxit)then goto 23002 endif call dscal(p,zero,d,1) if(k .le. p)then call daxpy(p,one,u(1,k),1,d,1) else k = k - p call daxpy(p,mone,u(1,k),1,d,1) endif call dgemv('N',n,p,one,a,n,d,1,zero,s,1) do23025 i = 1,n call dcopy(p,x,1,xh,1) step = (b(i) - f(i))/s(i) call daxpy(p,step,d,1,xh,1) s(i) = pow(n,p,xh,a,b,c,tau) 23025 continue 23026 continue hin = idmin(n,s,1) if(inset(p,hin,h) .gt. 0)then nflag = 2 goto 23002 endif hout = h(k) 23001 goto 23000 23002 continue if(it .gt. maxit)then nflag = 1 endif return end subroutine pivot(n,p,h,hin,hout,a,b,u,v,eflag) integer n,p,h(p),hin,hout,inset,k,eflag double precision a(n,p),b(p,p),u(p),v(p) double precision zero,one parameter(zero = 0.d0, one = 1.d0) eflag = 0 k = inset(p,hout,h) if(k .eq. 0)then eflag = 1 return endif if(inset(p,hin,h) .gt. 0)then eflag = 2 return endif if(hin .lt. 1 .or. hin .gt. n)then eflag = 3 return endif call dcopy(p,a(hin,1),n,v,1) call dgemv('T',p,p,one,b,p,v,1,zero,u,1) call dcopy(p,b(1,k),1,v,1) do23037 j = 1,p do23039 i = 1,p if(j .eq. k)then b(i,j) = b(i,j)/u(k) else b(i,j) = b(i,j) - (u(j)/u(k)) * v(i) endif 23039 continue 23040 continue 23037 continue 23038 continue h(k) = hin return end integer function inset(p,k,h) integer p,k,h(p) do23043 inset = 1,p if(h(inset) .eq. k)then return endif 23043 continue 23044 continue inset = 0 return end double precision function pow(n,p,x,a,b,c,tau) integer n,p double precision x(p),a(n,p),b(n),c(n) double precision tau,u,zero,rho,fit,ddot parameter(zero= 0.d0) pow = zero do23047 i = 1,n fit = ddot(p,a(i,1),n,x,1) u = b(i) - min(fit,c(i)) pow = pow + rho(u, tau) 23047 continue 23048 continue return end double precision function rho(u,tau) double precision u,tau,one parameter(one = 1.d0) if(u .lt. 0)then rho = u * (tau - one) else rho = u * tau endif return end quantreg/src/kuantile.f0000644000176200001440000000042613752201267014661 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine kuantile(k,m,n,x) integer i,j,k(m),m,n double precision x(n) j = 0 do23000 i = 1,m call dsel05(k(i)-j,n-j,x(j+1)) j = k(i) 23000 continue 23001 continue return end quantreg/src/boundc.f0000644000176200001440000000240013522271353014307 0ustar liggesusersc 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c c Function to obtain the step length c c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c subroutine boundc(x1,dx1,x2,dx2,s,ds,z1,dz1,z2,dz2,w,dw,n1,n2, & beta,deltap,deltad) c integer n1,n2 double precision x1(n1),dx1(n1),x2(n2),dx2(n2),s(n1),ds(n1), & z1(n1),dz1(n1),z2(n2),dz2(n2),w(n1),dw(n1) double precision deltap,deltad,dmin1,big,one,beta parameter (big = 1.0d20, one = 1.0d0) deltap = big deltad = big do i = 1,n1 if(dx1(i) .lt. 0) deltap = dmin1(deltap, -x1(i)/dx1(i)) if(ds(i) .lt. 0) deltap = dmin1(deltap, -s(i)/ds(i)) if(dz1(i) .lt. 0) deltad = dmin1(deltad, -z1(i)/dz1(i)) if(dw(i) .lt. 0) deltad = dmin1(deltad, -w(i)/dw(i)) enddo do i = 1,n2 if(dx2(i) .lt. 0) deltap = dmin1(deltap, -x2(i)/dx2(i)) if(dz2(i) .lt. 0) deltad = dmin1(deltad, -z2(i)/dz2(i)) enddo deltap = dmin1(beta*deltap,one) deltad = dmin1(beta*deltad,one) return end quantreg/src/pfnb.f0000644000176200001440000000645313767155436014014 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine pfnb(n,p,m,a,y,q,r,b,band,m0,d,u,wn,wp, aa,yy,slo,shi,r *hs,glob,ghib,nit,info) integer n,p,m,kk(2),mm,m0,nit(5,m),info,sumbad integer i,j,k,slo(n),shi(n),ifix,ibad logical notopt double precision a(p,n),y(n),r(n),q(m),d(n),u(n),b(p,m) double precision wn(n,9), wp(p,(p+3)),band(n),qk(2) double precision glob(p),ghib(p),aa(p,n),yy(n),rhs(p) double precision zero,one,tau,beta,eps,big,fm,fn parameter(zero = 0.0d0) parameter(one = 1.0d0) parameter(beta = 0.99995d0) parameter(big = 1.0d+10) parameter(eps = 1.0d-06) do23000 iq = 1,m notopt = .true. tau = q(iq) mm = m0 ifix = 0 ibad = 0 23002 if(notopt)then ibad = ibad + 1 fm = mm fn = dble(n) kk(1) = int(n * dmax1(1./fn, tau - fm/(2 * fn))) + 1 kk(2) = int(n * dmin1(tau + fm/(2. * fn), (fn - 1)/fn)) do23004 i = 1,n u(i) = r(i)/band(i) 23004 continue 23005 continue call kuantiles(kk,2,n,u) qk(1) = u(kk(1)) qk(2) = u(kk(2)) call iphil(n,0,slo) call iphil(n,0,shi) do23006 i = 1,n if(r(i) .lt. (band(i) * qk(1)))then slo(i) = 1 else if(r(i) .gt. (band(i) * qk(2)))then shi(i) = 1 endif endif 23006 continue 23007 continue 23012 if(notopt)then ifix = ifix + 1 call dphil(p,zero,glob) call dphil(p,zero,ghib) call dphil(n,one,d) call dphil(n,one,u) k = 0 do23014 i = 1,n if(slo(i) .eq. 0 .and. shi(i) .eq. 0)then k = k + 1 call dcopy(p,a(1,i),1,aa(1,k),1) yy(k) = -y(i) else if(slo(i) .eq. 1)then do23020 j = 1,p glob(j) = glob(j) + a(j,i) 23020 continue 23021 continue else if(shi(i) .eq. 1)then do23024 j = 1,p ghib(j) = ghib(j) + a(j,i) 23024 continue 23025 continue endif endif endif 23014 continue 23015 continue call dcopy(p,glob,1,aa(1,k+1),1) call dcopy(p,ghib,1,aa(1,k+2),1) yy(k+1) = big yy(k+2) = -big call dgemv('N',p,k+2,one-tau,aa,p,d,1,zero,rhs,1) call dscal(k+2,zero,wn,1) call daxpy(k+2,one-tau,u,1,wn,1) call rqfnb(k+2,p,aa,yy,rhs,d,u,beta,eps,wn,wp,nit(1,iq),info) call dcopy(p,wp,1,b(1,iq),1) call dcopy(n,y,1,r,1) call dgemv('T',p,n,one,a,p,b(1,iq),1,one,r,1) sumbad = 0 do23026 i = 1,n if((r(i) .gt. 0) .and. slo(i) .eq. 1)then slo(i) = 0 sumbad = sumbad + 1 endif if((r(i) .lt. 0) .and. shi(i) .eq. 1)then shi(i) = 0 sumbad = sumbad + 1 endif 23026 continue 23027 continue if(sumbad .gt. 0)then if(sumbad .gt. 0.1 * mm)then mm = min(2 * mm, n) goto 23013 endif else notopt = .false. endif goto 23012 endif 23013 continue nit(4,iq) = ifix nit(5,iq) = ibad goto 23002 endif 23003 continue 23000 continue 23001 continue return end subroutine iphil(n,a,v) integer n,i,a,v(n) do23036 i = 1,n v(i) = a 23036 continue 23037 continue return end subroutine dphil(n,a,v) integer i,n double precision a,v(n) do23038 i = 1,n v(i) = a 23038 continue 23039 continue return end quantreg/src/rqfn.f0000644000176200001440000001133314470133671014013 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine rqfn(n,p,a,y,rhs,d,u,beta,eps,wn,wp,aa,nit,info) integer n,p,info,nit(3) double precision a(p,n),y(n),rhs(p),d(n),u(n),wn(n,10),wp(p,p+3),a *a(p,p) double precision one,beta,eps parameter( one = 1.0d0) call fna(n,p,a,y,rhs,d,u,beta,eps,wn(1,1),wn(1,2), wp(1,1),wn(1,3) *,wn(1,4),wn(1,5), wn(1,6), wp(1,2),wn(1,7),wn(1,8),wn(1,9),wn(1,10 *),wp(1,3), wp(1,4),aa,nit,info) return end subroutine fna(n,p,a,c,b,d,u,beta,eps,x,s,y,z,w, dx,ds,dy,dz,dw,ds *dw,dxdz,rhs,ada,aa,nit,info) integer n,p,pp,i,info,nit(3) double precision a(p,n),c(n),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dasum double precision deltap,deltad,beta,eps,cx,by,uw,uz,mu,mua,acomp,r *dg,g double precision x(n),u(n),s(n),y(p),z(n),w(n),d(n),rhs(p),ada(p,p *) double precision aa(p,p),dx(n),ds(n),dy(p),dz(n),dw(n),dxdz(n),dsd *w(n) parameter( zero = 0.0d0) parameter( half = 0.5d0) parameter( one = 1.0d0) parameter( mone = -1.0d0) parameter( big = 1.0d+20) nit(1)=0 nit(2)=0 nit(3)=n pp=p*p call dgemv('N',p,n,one,a,p,c,1,zero,y,1) call stepy(n,p,a,d,y,aa,info) if(info .ne. 0)then return endif do23002 i=1,p do23004 j=1,p ada(i,j)=zero 23004 continue 23005 continue ada(i,i)=one 23002 continue 23003 continue call dtrtrs('U','T','N',p,p,aa,p,ada,p,info) call dcopy(pp,ada,1,aa,1) call dcopy(n,c,1,s,1) call dgemv('T',p,n,mone,a,p,y,1,one,s,1) do23006 i=1,n d(i)=one if(dabs(s(i)) .lt. eps)then z(i) = dmax1( s(i),zero) + eps w(i) = dmax1(-s(i),zero) + eps else z(i) = dmax1( s(i),zero) w(i) = dmax1(-s(i),zero) endif s(i)=u(i)-x(i) 23006 continue 23007 continue cx = ddot(n,c,1,x,1) by = ddot(p,b,1,y,1) uw = dasum(n,w,1) uz = dasum(n,z,1) rdg = (cx - by + uw) 23010 if(rdg .gt. eps)then nit(1)=nit(1)+1 do23012 i =1,n d(i) = one/(z(i)/x(i) + w(i)/s(i)) ds(i)=z(i)-w(i) dx(i)=d(i)*ds(i) 23012 continue 23013 continue call dgemv('N',p,n,one,a,p,dx,1,zero,dy,1) call dcopy(p,dy,1,rhs,1) call stepy(n,p,a,d,dy,ada,info) if(info .ne. 0)then return endif call dgemv('T',p,n,one,a,p,dy,1,mone,ds,1) deltap=big deltad=big do23016 i=1,n dx(i)=d(i)*ds(i) ds(i)=-dx(i) dz(i)=-z(i)*(dx(i)/x(i) + one) dw(i)=w(i)*(dx(i)/s(i) - one) dxdz(i)=dx(i)*dz(i) dsdw(i)=ds(i)*dw(i) if(dx(i).lt.0)then deltap=dmin1(deltap,-x(i)/dx(i)) endif if(ds(i).lt.0)then deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz(i).lt.0)then deltad=dmin1(deltad,-z(i)/dz(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23016 continue 23017 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) if(deltap*deltad.lt.one)then nit(2)=nit(2)+1 acomp=ddot(n,x,1,z,1)+ddot(n,s,1,w,1) g=acomp+deltap*ddot(n,dx,1,z,1)+ deltad*ddot(n,dz,1,x,1)+ deltap*d *eltad*ddot(n,dz,1,dx,1)+ deltap*ddot(n,ds,1,w,1)+ deltad*ddot(n,dw *,1,s,1)+ deltap*deltad*ddot(n,ds,1,dw,1) mu=acomp/dble(2*n) mua=g/dble(2*n) mu=mu*(mua/mu)**3 do23028 i=1,n dz(i)=d(i)*(mu*(1/s(i)-1/x(i))+ dx(i)*dz(i)/x(i)-ds(i)*dw(i)/s(i)) 23028 continue 23029 continue call dswap(p,rhs,1,dy,1) call dgemv('N',p,n,one,a,p,dz,1,one,dy,1) call dpotrs('U',p,1,ada,p,dy,p,info) call daxpy(p,mone,dy,1,rhs,1) call dgemv('T',p,n,one,a,p,rhs,1,zero,dw,1) deltap=big deltad=big do23030 i=1,n dx(i)=dx(i)-dz(i)-d(i)*dw(i) ds(i)=-dx(i) dz(i)=mu/x(i) - z(i)*dx(i)/x(i) - z(i) - dxdz(i)/x(i) dw(i)=mu/s(i) - w(i)*ds(i)/s(i) - w(i) - dsdw(i)/s(i) if(dx(i).lt.0)then deltap=dmin1(deltap,-x(i)/dx(i)) else deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz(i).lt.0)then deltad=dmin1(deltad,-z(i)/dz(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23030 continue 23031 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) endif call daxpy(n,deltap,dx,1,x,1) call daxpy(n,deltap,ds,1,s,1) call daxpy(p,deltad,dy,1,y,1) call daxpy(n,deltad,dz,1,z,1) call daxpy(n,deltad,dw,1,w,1) cx=ddot(n,c,1,x,1) by=ddot(p,b,1,y,1) uw = dasum(n,w,1) uz = dasum(n,z,1) rdg=(cx-by+uw) goto 23010 endif 23011 continue call daxpy(n,mone,w,1,z,1) call dswap(n,z,1,x,1) return end quantreg/src/rqfnc.f0000644000176200001440000001564114470133740014161 0ustar liggesusersC Output from Public domain Ratfor, version 1.05 subroutine rqfnc(n1,n2,p,a1,y,a2,r,rhs,d1,d2,u,beta,eps,wn1,wn2,wp *,nit,info) integer n1,n2,p,info,nit(3) double precision a1(p,n1),a2(p,n2),y(n1),r(n2),rhs(p),d1(n1),d2(n2 *),u(n1) double precision wn1(n1,9),wn2(n2,6),wp(p,p+3) double precision one,beta,eps parameter(one = 1.0d0) call lpfnc(n1,n2,p,a1,y,a2,r,rhs,d1,d2,u,beta,eps,wn1(1,1),wn2(1,1 *),wn1(1,2), wp(1,1),wn1(1,3),wn2(1,2),wn1(1,4),wn1(1,5),wn2(1,3),w *n1(1,6), wp(1,2),wn1(1,7),wn2(1,4),wn1(1,8),wn1(1,9),wn2(1,5),wn2( *1,6), wp(1,3),wp(1,4),nit,info) return end subroutine lpfnc(n1,n2,p,a1,c1,a2,c2,b,d1,d2,u,beta,eps,x1,x2,s, y *,z1,z2,w,dx1,dx2,ds,dy,dz1,dz2,dw,dr1,dr2,r2, rhs,ada,nit,info) integer n1,p,i,info,nit(3),maxit double precision a1(p,n1),a2(p,n2),c1(n1),c2(n2),b(p) double precision zero,one,mone,big,ddot,dmax1,dmin1,dxdz1,dxdz2,ds *dw double precision deltap,deltad,beta,eps,mu,gap,g double precision x1(n1),x2(n2),u(n1),s(n1),y(p),z1(n1),z2(n2),w(n1 *) double precision d1(n1),d2(n2),rhs(p),ada(p,p) double precision dx1(n1),dx2(n2),ds(n1),dy(p),dz1(n1),dz2(n2),dw(n *1) double precision dr1(n1),dr2(n2),r2(n2) parameter(zero = 0.0d0) parameter(one = 1.0d0) parameter(mone = -1.0d0) parameter(big = 1.0d+20) parameter(maxit = 500) nit(1)=0 nit(2)=0 nit(3)=n1 call dgemv('N',p,n1,one,a1,p,c1,1,zero,y,1) do23000 i=1,n1 d1(i)=one 23000 continue 23001 continue do23002 i=1,n2 d2(i)=zero z2(i)=one 23002 continue 23003 continue call stepy2(n1,n2,p,a1,d1,a2,d2,y,ada,info) if(info .ne. 0)then return endif call dcopy(n1,c1,1,s,1) call dgemv('T',p,n1,mone,a1,p,y,1,one,s,1) do23006 i=1,n1 if(dabs(s(i)) .lt. eps)then z1(i)=dmax1(s(i),zero)+eps w(i)=dmax1(-s(i),zero)+eps else z1(i)=dmax1(s(i),zero) w(i)=dmax1(-s(i),zero) endif s(i)=u(i)-x1(i) 23006 continue 23007 continue gap = ddot(n1,z1,1,x1,1)+ddot(n2,z2,1,x2,1)+ddot(n1,w,1,s,1) 23010 if(gap .gt. eps .and. nit(1).lt.maxit)then nit(1)=nit(1)+1 call dcopy(n2,c2,1,r2,1) call dgemv('T',p,n2,mone,a2,p,y,1,one,r2,1) call dcopy(p,b,1,dy,1) call dgemv('N',p,n1,mone,a1,p,x1,1,one,dy,1) call dgemv('N',p,n2,mone,a2,p,x2,1,one,dy,1) do23012 i = 1,n1 d1(i)=one/(z1(i)/x1(i) + w(i)/s(i)) ds(i)=z1(i)-w(i) dz1(i)=d1(i)*ds(i) 23012 continue 23013 continue do23014 i = 1,n2 d2(i)=x2(i)/z2(i) dz2(i)=d2(i)*r2(i) 23014 continue 23015 continue call dgemv('N',p,n1,one,a1,p,dz1,1,one,dy,1) call dgemv('N',p,n2,one,a2,p,dz2,1,one,dy,1) call dcopy(p,dy,1,rhs,1) call stepy2(n1,n2,p,a1,d1,a2,d2,dy,ada,info) if(info .ne. 0)then return endif call dgemv('T',p,n1,one,a1,p,dy,1,mone,ds,1) deltap=big deltad=big do23018 i=1,n1 dx1(i)=d1(i)*ds(i) ds(i)=-dx1(i) dz1(i)=-z1(i)*(dx1(i)/x1(i) + one) dw(i)=-w(i)*(ds(i)/s(i) + one) if(dx1(i).lt.0)then deltap=dmin1(deltap,-x1(i)/dx1(i)) endif if(ds(i).lt.0)then deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz1(i).lt.0)then deltad=dmin1(deltad,-z1(i)/dz1(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23018 continue 23019 continue call dcopy(n2,r2,1,dx2,1) call dgemv('T',p,n2,one,a2,p,dy,1,mone,dx2,1) do23028 i=1,n2 dx2(i)=d2(i)*dx2(i) dz2(i)=-z2(i)*(dx2(i)/x2(i) + one) if(dx2(i).lt.0)then deltap=dmin1(deltap,-x2(i)/dx2(i)) endif if(dz2(i).lt.0)then deltad=dmin1(deltad,-z2(i)/dz2(i)) endif 23028 continue 23029 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) if(min(deltap,deltad) .lt. one)then nit(2)=nit(2)+1 mu = ddot(n1,x1,1,z1,1)+ddot(n2,x2,1,z2,1)+ddot(n1,s,1,w,1) g = mu + deltap*ddot(n1,dx1,1,z1,1)+ deltad*ddot(n1,dz1,1,x1,1)+ d *eltap*deltad*ddot(n1,dz1,1,dx1,1)+ deltap*ddot(n2,dx2,1,z2,1)+ del *tad*ddot(n2,dz2,1,x2,1)+ deltap*deltad*ddot(n2,dz2,1,dx2,1)+ delta *p*ddot(n1,ds,1,w,1)+ deltad*ddot(n1,dw,1,s,1) + deltap*deltad*ddot *(n1,ds,1,dw,1) mu = mu * ((g/mu)**3) /(dble(2*n1)+dble(n2)) do23036 i=1,n1 dsdw = ds(i)*dw(i) dr1(i)=d1(i)*(mu*(one/s(i)-one/x1(i))+ dx1(i)*dz1(i)/x1(i)-dsdw/s( *i)) 23036 continue 23037 continue do23038 i=1,n2 dr2(i)=d2(i)*(dx2(i)*dz2(i)/x2(i)-mu/x2(i)) 23038 continue 23039 continue call dswap(p,rhs,1,dy,1) call dgemv('N',p,n1,one,a1,p,dr1,1,one,dy,1) call dgemv('N',p,n2,one,a2,p,dr2,1,one,dy,1) call dpotrs('U',p,1,ada,p,dy,p,info) call dgemv('T',p,n1,one,a1,p,dy,1,zero,u,1) deltap=big deltad=big do23040 i=1,n1 dsdw = ds(i)*dw(i) dxdz1 = dx1(i)*dz1(i) dx1(i) = d1(i)*(u(i)-z1(i)+w(i))-dr1(i) ds(i) = -dx1(i) dz1(i) = -z1(i)+(mu - z1(i)*dx1(i) - dxdz1)/x1(i) dw(i) = -w(i)+(mu - w(i)*ds(i) - dsdw)/s(i) if(dx1(i).lt.0)then deltap=dmin1(deltap,-x1(i)/dx1(i)) endif if(ds(i).lt.0)then deltap=dmin1(deltap,-s(i)/ds(i)) endif if(dz1(i).lt.0)then deltad=dmin1(deltad,-z1(i)/dz1(i)) endif if(dw(i).lt.0)then deltad=dmin1(deltad,-w(i)/dw(i)) endif 23040 continue 23041 continue call dgemv('T',p,n2,one,a2,p,dy,1,zero,u,1) do23050 i=1,n2 dxdz2 = dx2(i)*dz2(i) dx2(i) = d2(i)*(u(i)-r2(i))-dr2(i) dz2(i) = -z2(i)+(mu - z2(i)*dx2(i) - dxdz2)/x2(i) if(dx2(i).lt.0)then deltap=dmin1(deltap,-x2(i)/dx2(i)) endif if(dz2(i).lt.0)then deltad=dmin1(deltad,-z2(i)/dz2(i)) endif 23050 continue 23051 continue deltap=dmin1(beta*deltap,one) deltad=dmin1(beta*deltad,one) endif call daxpy(n1,deltap,dx1,1,x1,1) call daxpy(n2,deltap,dx2,1,x2,1) call daxpy(n1,deltap,ds,1,s,1) call daxpy(p,deltad,dy,1,y,1) call daxpy(n1,deltad,dz1,1,z1,1) call daxpy(n2,deltad,dz2,1,z2,1) call daxpy(n1,deltad,dw,1,w,1) gap = ddot(n1,z1,1,x1,1)+ddot(n2,z2,1,x2,1)+ddot(n1,w,1,s,1) goto 23010 endif 23011 continue call daxpy(n1,mone,w,1,z1,1) call dswap(n1,z1,1,x1,1) return end subroutine stepy2(n1,n2,p,a1,d1,a2,d2,b,ada,info) integer n1,n2,p,i,j,k,info double precision a1(p,n1),a2(p,n2),b(p),d1(n1),d2(n2),ada(p,p),zer *o parameter(zero = 0.0d0) do23056 j=1,p do23058 k=1,p ada(j,k)=zero 23058 continue 23059 continue 23056 continue 23057 continue do23060 i=1,n1 call dsyr('U',p,d1(i),a1(1,i),1,ada,p) 23060 continue 23061 continue do23062 i=1,n2 call dsyr('U',p,d2(i),a2(1,i),1,ada,p) 23062 continue 23063 continue call dposv('U',p,1,ada,p,b,p,info) return end quantreg/src/srqfnc.f0000644000176200001440000004765214470134121014345 0ustar liggesusersc 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 subroutine srqfnc(n1,m,nnza1,a1,ja1,ia1,ao1,jao1,iao1,n2,nnza2, & a2,ja2,ia2,ao2,jao2,iao2,nnzdmax,d,jd,id, & dsub,jdsub,nnzemax,e,je,ie,nnzgmax,g,jg,ig, & nnzhmax,h,jh,ih,nsubmax,lindx,xlindx,nnzlmax, & lnz,xlnz,iw,iwmax,iwork,xsuper,tmpmax,tmpvec, & maxn1n2,ww1,wwm,wwn1,wwn2,cachsz,level,x1,x2, & s,u,c1,c2,y,small,ierr,maxit,timewd) integer nnza1,nnza2,m,n1,n2,nnzdmax,nnzemax,nnzgmax,nnzhmax,iwmax, & nnzlmax,nsubmax,cachsz,level,tmpmax,ierr,maxit,maxn1n2, & ja1(nnza1),jao1(nnza1),ja2(nnza2),jao2(nnza2), & jdsub(nnzhmax+1),jd(nnzdmax),ia1(n1+1),iao1(m+1), & ia2(n2+1),iao2(m+1),id(m+1),lindx(nsubmax),xlindx(m+1), & iw(m,5),xlnz(m+1),iwork(iwmax),xsuper(m+1),je(nnzemax), & ie(m+1),jg(nnzgmax),ig(m+1),jh(nnzhmax),ih(m+1) double precision small, & a1(nnza1),ao1(nnza1),a2(nnza2),ao2(nnza2), & dsub(nnzhmax+1),d(nnzdmax),g(nnzgmax), & h(nnzhmax),lnz(nnzlmax),c1(n1),c2(n2),y(m), & ww1(maxn1n2),wwm(m,6),tmpvec(tmpmax), & wwn1(n1,10),wwn2(n2,7),x1(n1),x2(n2),s(n1), & u(n1),e(nnzemax) double precision timewd(7) parameter (beta=9.995d-1, one=1.0d0, zero=0.0d0) call slpfnc(n1,m,nnza1,a1,ja1,ia1,ao1,jao1,iao1,n2,nnza2, & a2,ja2,ia2,ao2,jao2,iao2,nnzdmax,d,jd,id,dsub, & jdsub,nsubmax,lindx,xlindx,nnzlmax,lnz,xlnz,iw(1,1), & iw(1,2),iwmax,iwork,iw(1,3),iw(1,4),xsuper,iw(1,5), & tmpmax,tmpvec,wwm(1,2),wwm(1,3),cachsz,level,x1,x2,s,u, & c1,c2,y,wwm(1,1),wwn2(1,1),wwn1(1,1), & wwn2(1,2),wwn1(1,2),wwn1(1,3),wwn2(1,3),nnzemax,e,je, & ie,nnzgmax,g,jg,ig,nnzhmax,h,jh,ih,wwm(1,4),wwn1(1,4), & wwn2(1,4),wwn1(1,5),wwn1(1,6),wwn2(1,5),wwn1(1,7), & wwn1(1,8),wwn2(1,6),wwn1(1,9),wwn1(1,10),wwn2(1,7), & maxn1n2,ww1,wwm(1,5),wwm(1,6),small,ierr,maxit,timewd) return end c23456789012345678901234567890123456789012345678901234567890123456789012 subroutine slpfnc(n1,m,nnza1,a1,ja1,ia1,ao1,jao1,iao1,n2,nnza2, & a2,ja2,ia2,ao2,jao2,iao2,nnzdmax,d,jd,id,dsub, & jdsub,nsubmax,lindx,xlindx,nnzlmax,lnz,xlnz,invp, & perm,iwmax,iwork,colcnt,snode,xsuper,split, & tmpmax,tmpvec,rhs,newrhs,cachsz,level,x1,x2,s,u, & c1,c2,y,b,r2,z1, & z2,w,q1,q2,nnzemax,e,je, & ie,nnzgmax,g,jg,ig,nnzhmax,h,jh,ih,dy,dx1, & dx2,ds,dz1,dz2,dw, & dxdz1,dxdz2,dsdw,xi1,xi2, & maxn1n2,ww1,ww2,ww3,small,ierr,maxit,timewd) c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 c Sparse implentation of LMS's interior point method via c Ng-Peyton's sparse Cholesky factorization for sparse c symmetric positive definite c INPUT: c n1 -- the number of row in the coefficient matrix A1' c m -- the number of column in the coefficient matrix A1' c nnza1 -- the number of non-zero elements in A' c a1 -- an nnza1-vector of non-zero values of the design c matrix (A1') stored in csr format c ja1 -- an nnza1-vector of indices of the non-zero elements of c the coefficient matrix c ia1 -- an (n1+1)-vector of pointers to the begining of each c row in a1 and ja1 c ao1 -- an nnza1-vector of work space for the transpose of c the design matrix stored in csr format or the c design matrix stored in csc format c jao1 -- an nnza1-vector of work space for the indices of the c transpose of the design matrix c iao1 -- an (n1+1)-vector of pointers to the begining of each c column in ao1 and jao1 c n2 -- the number of row in the constraint matrix A2' c nnza2 -- the number of non-zero elements in A2' c a2 -- an nnza2-vector of non-zero values of the contraint c matrix (A2') stored in csr format c ja2 -- an nnza2-vector of indices of the non-zero elements of c the constraint matrix c ia2 -- an (n2+1)-vector of pointers to the begining of each c row in a2 and ja2 c ao2 -- an nnza2-vector of work space for the transpose of c the constraint matrix stored in csr format or the c constraint matrix stored in csc format c jao2 -- an nnza2-vector of work space for the indices of the c transpose of the constraint matrix c iao2 -- an (n2+1)-vector of pointers to the begining of each c column in ao2 and jao2 c nnzdmax -- upper bound of the non-zero elements in A1A1' c d -- an nnzdmax-vector of non-zero values used to store c the transpose of the design matrix multiplied by the design c matrix (A1A1') stored in csr format; c also used to store A1Q1^(-1) and A2Q2^(-1) later c jd -- an nnzdmax-vector of indices in d c id -- an (m+1)-vector of pointers to the begining of each c row in d and jd c dsub -- the values of d excluding the diagonal elements c jdsub -- the indices to dsub c nsubmax -- upper bound of the dimension of lindx c lindx -- an nsub-vector of interger which contains, in c column major order, the row subscripts of the nonzero c entries in L in a compressed storage format c xlindx -- an (m+1)-vector of integer of pointers for lindx c nnzlmax -- the upper bound of the non-zero entries in c L stored in lnz, including the diagonal entries c lnz -- First contains the non-zero entries of d; later c contains the entries of the Cholesky factor c xlnz -- column pointer for L stored in lnz c invp -- an n1-vector of integer of inverse permutation c vector c perm -- an n1-vector of integer of permutation vector c iw -- integer work array of length m c iwmax -- upper bound of the general purpose integer c working storage iwork; set at 7*m+3 c iwork -- an iwsiz-vector of integer as work space c colcnt -- array of length m, containing the number of c non-zeros in each column of the factor, including c the diagonal entries c snode -- array of length m for recording supernode c membership c xsuper -- array of length m+1 containing the supernode c partitioning c split -- an m-vector with splitting of supernodes so that c they fit into cache c tmpmax -- upper bound of the dimension of tmpvec c tmpvec -- a tmpmax-vector of temporary vector c rhs -- m-vector to store the rhs c newrhs -- extra work vector for right-hand side and c solution c cachsz -- size of the cache (in kilobytes) on the target c machine c level -- level of loop unrolling while performing numerical c factorization c x1 -- an n1-vector, the initial feasible solution for the primal c solution that corresponds to the design matrix A1' c x2 -- an n2-vector, the initial feasible solution for the primal c solution that corresponds to the constraint matrix A2' c s -- an n1-vector c u -- an n1-vector of the upper bound for x1 c c1 -- an n1-vector in the primal; negative response in the c regression quantile setting c c2 -- an n2-vector, the negative rhs of the inequality constraint c y -- an m-vector, the initial dual solution c b -- an n1-vector, usualy the rhs of the equality constraint c X'a = (1-tau)X'e in the rq setting c r2 -- an n2-vector of residuals c z1 -- an n1-vector of the dual slack variable c z2 -- an n2-vector c w -- an n-vector c q1 -- an n1-vector of work array containing the diagonal c elements of the Q1^(-1) matrix c q2 -- an n2-vector of work array containing the diagonal c elements of the Q2^(-1) matrix c e -- an nnzdmax-vector containing the non-zero entries of c A1Q1^(-1)A1' stored in csr format c je -- an nnzdmax-vector of indices for e c ie -- an (m+1)-vector of pointers to the begining of each c row in e and je c nnzgmax -- upper bound of the non-zero elements in g,jg c g -- an nnzgmax-vector containing the non-zero entries of c A2Q2^(-1)A2' stored in csr format c jg -- an nnzgmax-vector of indices for g c ig -- an (m+1)-vector of pointers to the begining of each c row in g and jg c nnzhmax -- upper bound of the non-zero elements in h,jh c h -- an nnzhmax-vector containing the non-zero entries of c AQ^(-1)A' stored in csr format c jh -- an nnzhmax-vector of indices for h c ih -- an (m+1)-vector of pointers to the begining of each c row in h and jh c dy -- an m-vector of work array c dx1 -- an n1-vector of work array c dx2 -- an n2-vector of work array c ds -- an n1-vector of work array c dz1 -- an n1-vector of work array c dz2 -- an n2-vector of work array c dw -- an n1-vector of work array c dxdz1 -- an n1-vector of work array c dxdz2 -- an n2-vector of work array c dsdw -- an n1-vector of work arry c xi1 -- an n1-vector of work array c xi2 -- an n2-vector of work array c xinv1 -- an n1-vector of work array c xinv2 -- an n2-vector of work array c sinv -- work array c maxn1n2 -- max(n1,n2) c ww1 -- an maxn1n2-vector of work array c ww2 -- an m-vector of work array c ww3 -- an m-vector of work array c small -- convergence tolerance for inetrior algorithm c ierr -- error flag c 1 -- insufficient storage when calling extract; c 3 -- insufficient storage in iwork when calling ordmmd; c 4 -- insufficient storage in iwork when calling sfinit; c 5 -- nnzl > nnzlmax when calling sfinit c 6 -- nsub > nsubmax when calling sfinit c 7 -- insufficient work space in iwork when calling symfct c 8 -- inconsistancy in input when calling symfct c 9 -- tmpsiz > tmpmax when calling symfct; increase tmpmax c 10 -- nonpositive diagonal encountered when calling c blkfct c 11 -- insufficient work storage in tmpvec when calling c blkfct c 12 -- insufficient work storage in iwork when calling c blkfct c 13 -- nnzd > nnzdmax in e,je when calling amub c 14 -- nnzd > nnzdmax in g,jg when calling amub c 15 -- nnzd > nnzdmax in h,jh when calling aplb c maxit -- upper limit of the iteration; on return holds the c number of iterations c timewd -- amount of time to execute this subroutine c OUTPUT: c y -- an m-vector of primal solution c 1 2 3 4 5 6 7 c23456789012345678901234567890123456789012345678901234567890123456789012 integer nnza1,nnza2,m,n1,n2,maxn1n2,nsuper,nnzdmax,nnzemax, & nnzgmax, & nnzhmax,iwmax,nnzlmax,nsubmax,cachsz,level,tmpmax,ierr, & maxit,it,nnzdsub,nnzd, & ja1(nnza1),jao1(nnza1),ja2(nnza2),jao2(nnza2), & jdsub(nnzhmax+1),jd(nnzdmax),ia1(n1+1),iao1(m+1), & ia2(n2+1),iao2(m+1),id(m+1),lindx(nsubmax),xlindx(m+1), & invp(m),perm(m),xlnz(m+1),iwork(iwmax),colcnt(m), & snode(m),xsuper(m+1),split(m),je(nnzemax),ie(m+1), & jg(nnzgmax),ig(m+1),jh(nnzhmax),ih(m+1) double precision ddot,gap,zero,one,beta,small,deltap,deltad,mu,g1, & a1(nnza1),ao1(nnza1),a2(nnza2),ao2(nnza2), & dsub(nnzhmax+1),d(nnzdmax),lnz(nnzlmax),c1(n1), & c2(n2),b(m),rhs(m),newrhs(m),y(m),tmpvec(tmpmax), & r2(n2),z1(n1),z2(n2),w(n1),x1(n1), & x2(n2),s(n1),u(n1),q1(n1),q2(n2),e(nnzemax), & g(nnzgmax),h(nnzhmax),dy(m),dx1(n1),dx2(n2), & ds(n1),dz1(n1),dz2(n2),dw(n1),dxdz1(n1), & dxdz2(n2),dsdw(n1), & xi1(n1),xi2(n2),ww1(maxn1n2),ww2(m),ww3(m) double precision timewd(7) real gtimer,timbeg,timend external smxpy1,smxpy2,smxpy4,smxpy8 external mmpy1,mmpy2,mmpy4,mmpy8 parameter (beta=9.995d-1, one=1.0d0, zero=0.0d0) do i = 1,7 timewd(i) = 0.0 enddo it = 0 c c Compute the initial gap c gap = ddot(n1,z1,1,x1,1) + ddot(n2,z2,1,x2,1) + ddot(n1,w,1,s,1) c c Start iteration c 20 continue if(gap .lt. small .or. it .gt. maxit) goto 30 it = it + 1 c c Create the diagonal matrix Q1^(-1) stored in q1 as an n1-vector, c the diagonal matrix Q2^(-1) stored in q2 as an n2-vector, c and store the residuals in r1 in ds, and r3 in dy temporarily, c and r2 in r2 permanently c c Call amux to obtain A1x1 and store the value in ww2 c call amux(m,x1,ww2,ao1,jao1,iao1) c c Call amux to obtain A2x2 and store the value in ww3 c call amux(m,x2,ww3,ao2,jao2,iao2) c c Store A2'y temporarily in r2 c call amux(n2,y,r2,a2,ja2,ia2) do i=1,n1 q1(i) = one/(z1(i)/x1(i)+w(i)/s(i)) ds(i) = z1(i) - w(i) enddo do i=1,n2 q2(i) = x2(i)/z2(i) r2(i) = c2(i)-r2(i) enddo do i=1,m dy(i) = b(i) - ww2(i) - ww3(i) enddo c c Obtain AQA = A1Q1^(-1)A1' + A2Q2^(-1)A2' in 5 steps c c Step1: Obtain A1Q1^(-1) and store the values in d,jd,id in csr format c Also compute A1Q1^(-1)r1 and store the values in ww2 to be used c to generate r3; c Step2: Compute A1Q1^(-1)A1' and store the values in e,je,ie c Step3: Obtain A2Q2^(-1) and store the values in d,jd,id in csr format c Also compute A2Q2^(-1)r2 and store the values in in ww3 to c be used to generate r3; c Step4: Compute A2Q2^(-1)A2' and store the value in g,jg,ig c Step5: Compute AQA and store the values in h,jh,ih c c Step 1 c call amudia(m,1,ao1,jao1,iao1,q1,d,jd,id) call amux(m,ds,ww2,d,jd,id) c c Step 2 c call amub(m,m,1,d,jd,id,a1,ja1,ia1,e,je,ie,nnzemax,iwork,ierr) if (ierr .ne. 0) then ierr = 13 go to 100 endif c c Step 3 c call amudia(m,1,ao2,jao2,iao2,q2,d,jd,id) call amux(m,r2,ww3,d,jd,id) c c Step 4 c call amub(m,m,1,d,jd,id,a2,ja2,ia2,g,jg,ig,nnzgmax,iwork,ierr) if (ierr .ne. 0) then ierr = 14 go to 100 endif c c Step 5 c call aplb(m,m,1,e,je,ie,g,jg,ig,h,jh,ih,nnzhmax,iwork,ierr) if (ierr .ne. 0) then ierr = 15 go to 100 endif c c Generate rhs = r3 + A1Q1^(-1)r1 + A2Q2^(-1)r2 and store in rhs c do i = 1,m rhs(i) = dy(i) + ww2(i) + ww3(i) enddo c c Extract the non-diagonal structure of h,jh,ih and store in dsub,jdsub c nnzd = ih(m+1) - 1 nnzdsub = nnzd - m call extract(h,jh,ih,dsub,jdsub,m,nnzhmax,nnzhmax+1,ierr) if (ierr .ne. 0) then ierr = 1 go to 100 endif c c Compute dy = (AQ^(-1)A')^(-1)rhs; result returned via dy c c Call chlfct to perform Cholesky's decomposition of h,jh,ih c call chlfct(m,xlindx,lindx,invp,perm,iwork,nnzdsub,jdsub, & colcnt,nsuper,snode,xsuper,nnzlmax,nsubmax,xlnz,lnz, & ih,jh,h,cachsz,tmpmax,level,tmpvec,split,ierr,it, & timewd) if (ierr .ne. 0) go to 100 c c Call blkslv: Numerical solution for the new rhs stored in rhs c do i = 1,m newrhs(i) = rhs(perm(i)) enddo timbeg = gtimer() call blkslv(nsuper,xsuper,xlindx,lindx,xlnz,lnz,newrhs) timend = gtimer() timewd(7) = timewd(7) + timend - timbeg do i = 1,m dy(i) = newrhs(invp(i)) enddo c c Compute dx1 = Q1^(-1)(A1'dy - r1), ds = -dx1, dz1, dz2 and dw c call amux(n1,dy,dx1,a1,ja1,ia1) call amux(n2,dy,dx2,a2,ja2,ia2) do i = 1,n1 dx1(i) = q1(i) * (dx1(i) - ds(i)) ds(i) = -dx1(i) dz1(i) = -z1(i) * (one + dx1(i) / x1(i)) dw(i) = -w(i) * (one + ds(i) / s(i)) enddo do i = 1,n2 dx2(i) = q2(i) * (dx2(i) - r2(i)) dz2(i) = -z2(i) * (one + dx2(i) / x2(i)) enddo c c Compute the maximum allowable step lengths c call boundc(x1,dx1,x2,dx2,s,ds,z1,dz1,z2,dz2,w,dw,n1,n2, & beta,deltap,deltad) if (deltap * deltad .lt. one) then c c Update mu c mu = ddot(n1,z1,1,x1,1) + ddot(n2,z2,1,x2,1) & + ddot(n1,w,1,s,1) g1 = mu + deltap*ddot(n1,z1,1,dx1,1) & + deltad*ddot(n1,dz1,1,x1,1) & + deltad*deltap*ddot(n1,dz1,1,dx1,1) & + deltap*ddot(n2,z2,1,dx2,1) & + deltad*ddot(n2,dz2,1,x2,1) & + deltad*deltap*ddot(n2,dz2,1,dx2,1) & + deltap*ddot(n1,w,1,ds,1) & + deltad*ddot(n1,dw,1,s,1) & + deltad*deltap*ddot(n1,dw,1,ds,1) mu = mu*((g1/mu)**3)/(2.d0*dble(n1)+dble(n2)) c c Compute dx1dz1, dx2dz2 and dsdw c do i = 1,n1 dxdz1(i) = dx1(i)*dz1(i) dsdw(i) = ds(i)*dw(i) xi1(i) = dxdz1(i)/x1(i) - dsdw(i)/s(i) & - mu * (one/x1(i) - one/s(i)) ww1(i) = q1(i) * xi1(i) enddo c c Compute A1Q1^(-1)(X1^(-1)*dx1dz1 - S^(-1)*dsdw - mu(X1^(-1) - S^(-1))) and c store it in ww2 temporarily c call amux(m,ww1,ww2,ao1,jao1,iao1) do i = 1,n2 dxdz2(i) = dx2(i)*dz2(i) xi2(i) = (dxdz2(i) - mu)/x2(i) ww1(i) = q2(i) * xi2(i) enddo c c Compute A2Q2^(-1)(X2^(-1)*dx2dz2 - mu X2^(-1)) and store it in ww3 c temporarily c call amux(m,ww1,ww3,ao2,jao2,iao2) do i = 1,m rhs(i) = rhs(i) + ww2(i) + ww3(i) enddo c c c Compute (AQ^(-1)A')^(-1)rhs and return the result in dy c c Call blkslv: Numerical solution for the new rhs stored in rhs c do i = 1,m newrhs(i) = rhs(perm(i)) enddo timbeg = gtimer() call blkslv(nsuper,xsuper,xlindx,lindx,xlnz,lnz,newrhs) timend = gtimer() timewd(7) = timewd(7) + timend - timbeg do i = 1,m dy(i) = newrhs(invp(i)) enddo c c Compute dx1=Q1^(-1)(A1'dy-X1^(-1)*dx1dz1-S^(-1)*dsdw c -mu*(X1^(-1)-S^(-1))-r1), ds = -dx1, dz1, dz2 and dw c call amux(n1,dy,dx1,a1,ja1,ia1) call amux(n2,dy,dx2,a2,ja2,ia2) do i = 1,n1 dx1(i) = q1(i) * (dx1(i) - xi1(i) - z1(i) + w(i)) ds(i) = -dx1(i) dz1(i) = -z1(i) + (mu - z1(i)*dx1(i) & - dxdz1(i))/x1(i) dw(i) = -w(i) + (mu - w(i)*ds(i) - dsdw(i))/s(i) enddo do i = 1,n2 dx2(i) = q2(i) * (dx2(i) - xi2(i) - r2(i)) dz2(i) = -z2(i) + (mu - z2(i)*dx2(i) - & dxdz2(i))/x2(i) enddo c c Compute the maximum allowable step lengths c call boundc(x1,dx1,x2,dx2,s,ds,z1,dz1,z2,dz2,w,dw,n1,n2, & beta,deltap,deltad) endif c c Take the step c call daxpy(n1,deltap,dx1,1,x1,1) call daxpy(n2,deltap,dx2,1,x2,1) call daxpy(n1,deltap,ds,1,s,1) call daxpy(n1,deltad,dw,1,w,1) call daxpy(n1,deltad,dz1,1,z1,1) call daxpy(n2,deltad,dz2,1,z2,1) call daxpy(m,deltad,dy,1,y,1) gap = ddot(n1,z1,1,x1,1) + ddot(n2,z2,1,x2,1) + & ddot(n1,w,1,s,1) goto 20 30 continue 100 continue maxit = it return end quantreg/vignettes/0000755000176200001440000000000014470135051014110 5ustar liggesusersquantreg/vignettes/crq.pdf.asis0000644000176200001440000000010313513032713016316 0ustar liggesusers%\VignetteIndexEntry{quantreg: crq} %\VignetteEngine{R.rsp::asis} quantreg/vignettes/rq.pdf.asis0000644000176200001440000000010213513032730016151 0ustar liggesusers%\VignetteIndexEntry{quantreg: rq} %\VignetteEngine{R.rsp::asis} quantreg/R/0000755000176200001440000000000014414305572012306 5ustar liggesusersquantreg/R/qrisk.R0000644000176200001440000000352012457527311013564 0ustar liggesusers"qrisk" <- function(x, alpha=c(.1,.3), w = c(.7,.3), mu = .07, R = NULL, r = NULL, lambda = 10000){ # # find optimal Choquet-risk portfolios given: # # x (n by p) matrix of asset returns # alphas alphas defining a Choquet capacity risk function # w w defining weights for Choquet capacity risk function # R Matrix defining constraints on the parameters # r rhs defining constraints on the parameters # mu required mean rate of return # lambda Lagrange multiplier for RoR constraint # n <- nrow(x) p <- ncol(x) m <- length(alpha) if(length(w)!=m)stop("length of w doesn't match length of alpha") xbar <- apply(x,2,mean) y <- x[,1] r <- c(r,lambda*(xbar[1]-mu), -lambda*(xbar[1]-mu)) X <- x[,1]-x[,-1] R <- rbind(R,lambda*(xbar[1]-xbar[-1]), -lambda*(xbar[1]-xbar[-1])) R <- cbind(matrix(0,nrow(R),m),R) f <- rq.fit.hogg(X,y,taus=alpha,weights=w,R=R,r=r) fit <- f$coefficients pihat <- c(1-sum(fit[-(1:m)]),fit[-(1:m)]) x <- as.matrix(x) yhat <- x%*%pihat etahat <- quantile(yhat,alpha) muhat <- mean(yhat) qrisk <- 0 for(i in 1:length(alpha)) qrisk <- qrisk + w[i]*sum(yhat[yhat eps) return("lambda too small?") yhat <- x%*%pihat muhat <- mean(x%*%pihat) sigma <- sqrt(var(x%*%pihat)) list(pihat = pihat, muhat = muhat, sigma = sigma) } quantreg/R/quantreg.R0000644000176200001440000015274014413475660014275 0ustar liggesusers bandwidth.rq <- function(p, n, hs = TRUE, alpha = 0.05) { # Bandwidth selection for sparsity estimation two flavors: # Hall and Sheather(1988, JRSS(B)) rate = O(n^{-1/3}) # Bofinger (1975, Aus. J. Stat) -- rate = O(n^{-1/5}) # Generally speaking, default method, hs=TRUE is preferred. x0 <- qnorm(p) f0 <- dnorm(x0) if(hs) n^(-1/3) * qnorm(1 - alpha/2)^(2/3) * ((1.5 * f0^2)/(2 * x0^2 + 1))^(1/3) else n^-0.2 * ((4.5 * f0^4)/(2 * x0^2 + 1)^2)^ 0.2 } plot.rq.process <- function(x, nrow = 3, ncol = 2, ...) { ## Function to plot estimated quantile regression process tdim <- dim(x$sol) p <- tdim[1] - 3 m <- tdim[2] oldpar <- par(no.readonly=TRUE) par(mfrow = c(nrow, ncol)) ylab <- dimnames(x$sol)[[1]] for(i in 1:p) { plot(x$sol[1,], x$sol[3 + i, ], xlab = "tau", ylab = ylab[3 + i], type = "l") } par(oldpar) } print.rqs <- function (x, ...) { if (!is.null(cl <- x$call)) { cat("Call:\n") dput(cl) } coef <- coef(x) cat("\nCoefficients:\n") print(coef, ...) rank <- x$rank nobs <- nrow(residuals(x)) p <- nrow(coef) rdf <- nobs - p cat("\nDegrees of freedom:", nobs, "total;", rdf, "residual\n") if (!is.null(attr(x, "na.message"))) cat(attr(x, "na.message"), "\n") invisible(x) } "print.rq" <- function(x, ...) { if(!is.null(cl <- x$call)) { cat("Call:\n") dput(cl) } coef <- coef(x) cat("\nCoefficients:\n") print(coef, ...) rank <- x$rank nobs <- length(residuals(x)) if(is.matrix(coef)) p <- dim(coef)[1] else p <- length(coef) rdf <- nobs - p cat("\nDegrees of freedom:", nobs, "total;", rdf, "residual\n") if(!is.null(attr(x, "na.message"))) cat(attr(x, "na.message"), "\n") invisible(x) } print.summary.rqs <- function(x, ...) { lapply(x, print.summary.rq) invisible(x) } "print.summary.rq" <- function(x, digits = max(5, .Options$digits - 2), ...) { cat("\nCall: ") dput(x$call) coef <- x$coef ## df <- x$df ## rdf <- x$rdf tau <- x$tau cat("\ntau: ") print(format(round(tau,digits = digits)), quote = FALSE, ...) cat("\nCoefficients:\n") print(format(round(coef, digits = digits)), quote = FALSE, ...) invisible(x) } "rq" <- function (formula, tau = 0.5, data, subset, weights, na.action, method = "br", model = TRUE, contrasts = NULL, ...) { call <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action"), names(mf), 0) mf <- mf[c(1,m)] mf$drop.unused.levels <- TRUE mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) if(method == "model.frame")return(mf) mt <- attr(mf, "terms") weights <- as.vector(model.weights(mf)) tau <- sort(unique(tau)) eps <- .Machine$double.eps^(2/3) if (any(tau == 0)) tau[tau == 0] <- eps if (any(tau == 1)) tau[tau == 1] <- 1 - eps Y <- model.response(mf) if(method == "sfn"){ if(requireNamespace("MatrixModels", quietly = TRUE) && requireNamespace("Matrix", quietly = TRUE)){ X <- MatrixModels::model.Matrix(mt, data, sparse = TRUE) vnames <- dimnames(X)[[2]] X <- as(X ,"matrix.csr") mf$x <- X } } else{ X <- model.matrix(mt, mf, contrasts) vnames <- dimnames(X)[[2]] } Rho <- function(u,tau) u * (tau - (u < 0)) if (length(tau) > 1) { if (any(tau < 0) || any(tau > 1)) stop("invalid tau: taus should be >= 0 and <= 1") coef <- matrix(0, ncol(X), length(tau)) rho <- rep(0, length(tau)) if(!(method %in% c("ppro","qfnb","pfnb"))){ fitted <- resid <- matrix(0, nrow(X), length(tau)) for(i in 1:length(tau)){ z <- {if (length(weights)) rq.wfit(X, Y, tau = tau[i], weights, method, ...) else rq.fit(X, Y, tau = tau[i], method, ...) } coef[,i] <- z$coefficients resid[,i] <- z$residuals rho[i] <- sum(Rho(z$residuals,tau[i])) fitted[,i] <- Y - z$residuals } taulabs <- paste("tau=",format(round(tau,3))) dimnames(coef) <- list(vnames, taulabs) dimnames(resid)[[2]] <- taulabs fit <- z fit$coefficients <- coef fit$residuals <- resid fit$fitted.values <- fitted if(method == "lasso") class(fit) <- c("lassorqs","rqs") else if(method == "scad") class(fit) <- c("scadrqs","rqs") else class(fit) <- "rqs" } else if(method == "pfnb"){ # Preprocessing in fortran loop fit <- rq.fit.pfnb(X, Y, tau) class(fit) = "rqs" } else if(method == "qfnb"){ # simple fortran loop method fit <- rq.fit.qfnb(X, Y, tau) class(fit) = ifelse(length(tau) == 1,"rq","rqs") } else if(method == "ppro"){ # Preprocessing method in R fit <- rq.fit.ppro(X, Y, tau, ...) class(fit) = ifelse(length(tau) == 1,"rq","rqs") } } else{ process <- (tau < 0 || tau > 1) if(process && method != "br") stop("when tau not in [0,1] method br must be used") fit <- { if(length(weights)) rq.wfit(X, Y, tau = tau, weights, method, ...) else rq.fit(X, Y, tau = tau, method, ...) } if(process) rho <- list(tau = fit$sol[1,], rho = fit$sol[3,]) else { if(length(dim(fit$residuals))) dimnames(fit$residuals) <- list(dimnames(X)[[1]],NULL) rho <- sum(Rho(fit$residuals,tau)) } if(method == "lasso") class(fit) <- c("lassorq","rq") else if(method == "scad") class(fit) <- c("scadrq","rq") else class(fit) <- ifelse(process, "rq.process", "rq") } fit$na.action <- attr(mf, "na.action") fit$formula <- formula fit$terms <- mt fit$xlevels <- .getXlevels(mt,mf) fit$call <- call fit$tau <- tau fit$weights <- weights fit$residuals <- drop(fit$residuals) fit$rho <- rho fit$method <- method fit$fitted.values <- drop(fit$fitted.values) attr(fit, "na.message") <- attr(m, "na.message") if(model) fit$model <- mf fit } "rq.fit" <- function(x, y, tau = 0.5, method = "br", ...) { if(length(tau) > 1 && method != "ppro") { tau <- tau[1] warning("Multiple taus not allowed in rq.fit: solution restricted to first element") } fit <- switch(method, fn = rq.fit.fnb(x, y, tau = tau, ...), fnb = rq.fit.fnb(x, y, tau = tau, ...), fnc = rq.fit.fnc(x, y, tau = tau, ...), sfn = rq.fit.sfn(x, y, tau = tau, ...), conquer = rq.fit.conquer(x, y, tau = tau, ...), pfn = rq.fit.pfn(x, y, tau = tau, ...), pfnb = rq.fit.pfnb(x, y, tau = tau, ...), ppro= rq.fit.ppro(x, y, tau = tau, ...), br = rq.fit.br(x, y, tau = tau, ...), lasso = rq.fit.lasso(x, y, tau = tau, ...), scad = rq.fit.scad(x, y, tau = tau, ...), { what <- paste("rq.fit.", method, sep = "") if(exists(what, mode = "function")) (get(what, mode = "function"))(x, y, ...) else stop(paste("unimplemented method:", method)) } ) fit$fitted.values <- y - fit$residuals fit$contrasts <- attr(x, "contrasts") fit } "rqs.fit"<- function(x, y, tau = 0.5, tol = 0.0001) { # function to compute rq fits for multiple y's x <- as.matrix(x) p <- ncol(x) n <- nrow(x) m <- ncol(y) z <- .Fortran("rqs", as.integer(n), as.integer(p), as.integer(m), as.integer(n + 5), as.integer(p + 2), as.double(x), as.double(y), as.double(tau), as.double(tol), flag = integer(m), coef = double(p * m), resid = double(n), integer(n), double((n + 5) * (p + 2)), double(n)) if(sum(z$flag)>0){ if(any(z$flag)==2) warning(paste(sum(z$flag==2),"out of",m, "BS replications have near singular design")) if(any(z$flag)==1) warning(paste(sum(z$flag==1),"out of",m,"may be nonunique")) } return(t(matrix(z$coef, p, m))) } "formula.rq" <- function (x, ...) { form <- x$formula if (!is.null(form)) { form <- formula(x$terms) environment(form) <- environment(x$formula) form } else formula(x$terms) } "predict.rq" <- function (object, newdata, type = "none", interval = c("none", "confidence"), level = 0.95, na.action = na.pass, ...) { if (missing(newdata)) return(napredict(object$na.action, object$fitted)) else { tt <- terms(object) Terms <- delete.response(tt) m <- model.frame(Terms, newdata, na.action = na.action, xlev = object$xlevels) if (!is.null(cl <- attr(Terms, "dataClasses"))) .checkMFClasses(cl, m) X <- model.matrix(Terms, m, contrasts.arg = object$contrasts) } pred <- drop(X %*% object$coefficients) dots <- list(...) if (length(dots$se)) boot <- (dots$se == "boot") else boot <- FALSE if (length(dots$mofn)) mofn <- dots$mofn interval <- match.arg(interval) if (!interval == "none") { if (interval == "confidence") { if (type == "percentile") { if (boot) { if(exists("mofn")) {# Rescale and recenter!! n <- length(object$fitted) factor <- ifelse(mofn < n, sqrt(mofn/n), 1) XB <- X %*% t(summary(object, cov = TRUE, ...)$B)/factor pl <- apply(XB, 1, function(x) quantile(x, (1 - level)/2)) pu <- apply(XB, 1, function(x) quantile(x, 1 - (1 - level)/2)) pl <- pred + factor * (pl - pred) pu <- pred + factor * (pu - pred) } else { XB <- X %*% t(summary(object, cov = TRUE, ...)$B) pl <- apply(XB, 1, function(x) quantile(x, (1 - level)/2)) pu <- apply(XB, 1, function(x) quantile(x, 1 - (1 - level)/2)) } pred <- cbind(pred, pl, pu) colnames(pred) <- c("fit", "lower", "higher") } else stop("Percentile method requires se = \"boot\".") } else if (type == "direct") { if (boot) stop("Direct method incompatible with bootstrap covariance matrix estimation") Z <- rq.fit(object$x, object$y, tau = -1)$sol V <- summary(object, cov = TRUE, ...) df <- V$rdf tfrac <- qt(1 - (1 - level)/2, df) Vun <- V$cov * V$scale^2 tau <- object$tau bn <- tfrac * sqrt(diag(X %*% Vun %*% t(X))) tauU <- pmin(tau + bn, 1 - 1/df) tauL <- pmax(tau - bn, 1/df) tauhat <- Z[1, ] yhat <- X %*% Z[-(1:3), ] n <- nrow(X) pl <- yhat[cbind(1:n, cut(tauL, tauhat, label = FALSE))] pu <- yhat[cbind(1:n, cut(tauU, tauhat, label = FALSE))] pred <- cbind(pred, pl, pu) colnames(pred) <- c("fit", "lower", "higher") } else { V <- summary(object, cov = TRUE, ...) df <- V$rdf tfrac <- qt((1 - level)/2, df) sdpred <- sqrt(diag(X %*% V$cov %*% t(X))) pred <- cbind(pred, pred + tfrac * sdpred %o% c(1, -1)) colnames(pred) <- c("fit", "lower", "higher") } } else stop(paste("No interval method for", interval)) } pred } "predict.rqs" <- function (object, newdata, type = "Qhat", stepfun = FALSE, na.action = na.pass, ...) { ## with all defaults if(missing(newdata) && !stepfun && (type == "Qhat")) return(napredict(object$na.action, object$fitted)) ## otherwise tt <- delete.response(terms(object)) m <- if(missing(newdata)) model.frame(object) else model.frame(tt, newdata, na.action = na.action, xlev = object$xlevels) if(!is.null(cl <- attr(tt, "dataClasses"))) .checkMFClasses(cl, m) X <- model.matrix(tt, m, contrasts = object$contrasts) pred <- t(X %*% object$coefficients) taus <- object$tau M <- NCOL(pred) ## return stepfun or matrix if(stepfun) { if(type == "Qhat"){ pred <- rbind(pred[1,],pred) if(M > 1) f <- apply(pred, 2, function(y) stepfun(taus, y)) else f <- stepfun(taus, c(pred[1,1], pred[,1])) } else if(type == "Fhat"){ taus <- c(taus[1], taus) if(M > 1) f <- apply(pred, 2, function(y) { o <- order(y) stepfun(y[o], taus[c(1,o)])}) else f <- stepfun(pred[,1],taus) } else stop("Stepfuns must be either 'Qhat' or 'Fhat'\n") return(f) } else if(type == "fhat"){ akjfun <- function(z, p, d = 10, g = 300, ...) { mz <- sum(z * p) sz <- sqrt(sum((z - mz)^2 * p)) hz <- seq(mz - d * sz, mz + d * sz, length = g) fz <- akj(z, hz, p = p, ...)$dens approxfun(hz, fz) } p <- diff(taus) if (M > 1) f <- apply(pred[-1, ], 2, function(z) akjfun(z, p, ...)) else akjfun(pred[, 1], p, ...) return(f) } else return(t(pred)) } "predict.rq.process" <- function (object, newdata, type = "Qhat", stepfun = FALSE, na.action = na.pass, ...) { if(missing(newdata) && !stepfun && (type == "Qhat")) return(napredict(object$na.action, object$fitted)) tt <- terms(object) Terms <- delete.response(tt) m <- model.frame(Terms, newdata, na.action = na.action, xlev = object$xlevels) if (!is.null(cl <- attr(Terms, "dataClasses"))) .checkMFClasses(cl, m) X <- model.matrix(Terms, m, contrasts = object$contrasts) if(!length(X)) X <- rep(1, NROW(object$dsol)) # intercept only hack pred <- t(X %*% object$sol[-(1:3),, drop = FALSE]) taus <- object$sol[1,] M <- NCOL(pred) if(stepfun){ if(type == "Qhat"){ pred <- rbind(pred[1,], pred) if(M > 1) f <- apply(pred,2,function(y) stepfun(taus, y)) else f <- stepfun(taus, pred[,1]) } else if(type == "Fhat"){ taus <- c(taus[1],taus) if(M > 1) f <- apply(pred,2,function(y) stepfun(y,taus)) else f <- stepfun(pred[,1],taus) } else stop("Stepfuns must be either 'Qhat' or 'Fhat'") return(f) } else if(type == "fhat"){ akjfun <- function(z, p, d = 10, g = 300, ...){ mz <- sum(z * p) sz <- sqrt(sum((z - mz)^2 * p)) hz <- seq(mz - d * sz, mz+ d * sz, length = g) fz <- akj(z, hz, p = p, ...)$dens approxfun(hz,fz) } p <- diff(taus) if(M > 1) f <- apply(pred[-1,], 2, function(z) akjfun(z, p, ...)) else f = akjfun(pred[,1], p, ...) return(f) } else return(t(pred)) } "rearrange" <- function (f, xmin, xmax) # Revised Version September 11 2007. { if (is.list(f)) lapply(f, rearrange) else { if (!is.stepfun(f)) stop("Only stepfuns can be rearranged.\n") call <- attributes(f)$call; right <- call[match("right",names(call))]=="TRUE()" x <- knots(f) n <- length(x) if(missing(xmin)) xmin = x[1] if(missing(xmax)) xmax = x[n] x <- x[(x >= xmin) & (x <= xmax)] x <- c(xmin, x, xmax) n <- length(x) y <- f(x) o <- ifelse(rep(right,n-1), order(y[-1])+1, order(y[-n])) x <- cumsum(c(x[1], diff(x)[o - right])) y <- y[o] y <- c(y[1], y, max(y)) stepfun(x, y, right = right) } } # Function to compute regression quantiles using original simplex approach # of Barrodale-Roberts/Koenker-d'Orey. There are several options. # The options are somewhat different than those available for the Frisch- # Newton version of the algorithm, reflecting the different natures of the # problems typically solved. Succintly BR for "small" problems, FN for # "large" ones. Obviously, these terms are conditioned by available hardware. # # Basically there are two modes of use: # 1. For Single Quantiles: # # if tau is between 0 and 1 then only one quantile solution is computed. # # if ci = FALSE then just the point estimate and residuals are returned # If the column dimension of x is 1 then ci is set to FALSE since # since the rank inversion method has no proper null model. # if ci = TRUE then there are two options for confidence intervals: # # 1. if iid = TRUE we get the original version of the rank # inversion intervals as in Koenker (1994) # 2. if iid = FALSE we get the new version of the rank inversion # intervals which accounts for heterogeneity across # observations in the conditional density of the response. # The theory of this is described in Koenker-Machado(1999) # Both approaches involve solving a parametric linear programming # problem, the difference is only in the factor qn which # determines how far the PP goes. In either case one can # specify two other options: # 1. interp = FALSE returns two intervals an upper and a # lower corresponding to a level slightly # above and slightly below the one specified # by the parameter alpha and dictated by the # essential discreteness in the test statistic. # interp = TRUE returns a single interval based on # linear interpolation of the two intervals # returned: c.values and p.values which give # the critical values and p.values of the # upper and lower intervals. Default: interp = TRUE. # 2. tcrit = TRUE uses Student t critical values while # tcrit = FALSE uses normal theory ones. # 2. For Multiple Quantiles: # # if tau < 0 or tau >1 then it is presumed that the user wants to find # all of the rq solutions in tau, and the program computes the whole # quantile regression solution as a process in tau, the resulting arrays # containing the primal and dual solutions, betahat(tau), ahat(tau) # are called sol and dsol. These arrays aren't printed by the default # print function but they are available as attributes. # It should be emphasized that this form of the solution can be # both memory and cpu quite intensive. On typical machines it is # not recommended for problems with n > 10,000. # In large problems a grid of solutions is probably sufficient. # rq.fit.br <- function (x, y, tau = 0.5, alpha = 0.1, ci = FALSE, iid = TRUE, interp = TRUE, tcrit = TRUE) { tol <- .Machine$double.eps^(2/3) eps <- tol big <- .Machine$double.xmax x <- as.matrix(x) p <- ncol(x) n <- nrow(x) ny <- NCOL(y) nsol <- 2 ndsol <- 2 # Check for Singularity of X since br fortran isn't very reliable about this if (qr(x)$rank < p) stop("Singular design matrix") if (tau < 0 || tau > 1) { nsol <- 3 * n ndsol <- 3 * n lci1 <- FALSE qn <- rep(0, p) cutoff <- 0 tau <- -1 } else { if (p == 1) ci <- FALSE if (ci) { lci1 <- TRUE if (tcrit) cutoff <- qt(1 - alpha/2, n - p) else cutoff <- qnorm(1 - alpha/2) if (!iid) { h <- bandwidth.rq(tau, n, hs = TRUE) bhi <- rq.fit.br(x, y, tau + h, ci = FALSE) bhi <- coefficients(bhi) blo <- rq.fit.br(x, y, tau - h, ci = FALSE) blo <- coefficients(blo) dyhat <- x %*% (bhi - blo) if (any(dyhat <= 0)) { pfis <- (100 * sum(dyhat <= 0))/n warning(paste(pfis, "percent fis <=0")) } f <- pmax(eps, (2 * h)/(dyhat - eps)) qn <- rep(0, p) for (j in 1:p) { qnj <- lm(x[, j] ~ x[, -j] - 1, weights = f)$resid qn[j] <- sum(qnj * qnj) } } else qn <- 1/diag(solve(crossprod(x))) } else { lci1 <- FALSE qn <- rep(0, p) cutoff <- 0 } } z <- .Fortran("rqbr", as.integer(n), as.integer(p), as.integer(n + 5), as.integer(p + 3), as.integer(p + 4), as.double(x), as.double(y), as.double(tau), as.double(tol), flag = as.integer(1), coef = double(p), resid = double(n), integer(n), double((n + 5) * (p + 4)), double(n), as.integer(nsol), as.integer(ndsol), sol = double((p + 3) * nsol), dsol = double(n * ndsol), lsol = as.integer(0), h = integer(p * nsol), qn = as.double(qn), cutoff = as.double(cutoff), ci = double(4 * p), tnmat = double(4 * p), as.double(big), as.logical(lci1)) if (z$flag != 0) warning(switch(z$flag, "Solution may be nonunique", "Premature end - possible conditioning problem in x")) if (tau < 0 || tau > 1) { sol <- matrix(z$sol[1:((p + 3) * z$lsol)], p + 3) dsol <- matrix(z$dsol[1:(n * z$lsol)], n) vnames <- dimnames(x)[[2]] dimnames(sol) <- list(c("tau", "Qbar", "Obj.Fun", vnames), NULL) return(list(sol = sol, dsol = dsol)) } if (!ci) { coef <- z$coef dual <- z$dsol[1:n] names(coef) <- dimnames(x)[[2]] return(list(coefficients = coef, x = x, y = y, residuals = y - x %*% z$coef, dual = dual)) } if (interp) { Tn <- matrix(z$tnmat, nrow = 4) Tci <- matrix(z$ci, nrow = 4) Tci[3, ] <- Tci[3, ] + (abs(Tci[4, ] - Tci[3, ]) * (cutoff - abs(Tn[3, ])))/abs(Tn[4, ] - Tn[3, ]) Tci[2, ] <- Tci[2, ] - (abs(Tci[1, ] - Tci[2, ]) * (cutoff - abs(Tn[2, ])))/abs(Tn[1, ] - Tn[2, ]) Tci[2, ][is.na(Tci[2, ])] <- -big Tci[3, ][is.na(Tci[3, ])] <- big coefficients <- cbind(z$coef, t(Tci[2:3, ])) vnames <- dimnames(x)[[2]] cnames <- c("coefficients", "lower bd", "upper bd") dimnames(coefficients) <- list(vnames, cnames) residuals <- y - drop(x %*% z$coef) return(list(coefficients = coefficients, residuals = residuals)) } else { Tci <- matrix(z$ci, nrow = 4) coefficients <- cbind(z$coef, t(Tci)) residuals <- y - drop(x %*% z$coef) vnames <- dimnames(x)[[2]] cnames <- c("coefficients", "lower bound", "Lower Bound", "upper bd", "Upper Bound") dimnames(coefficients) <- list(vnames, cnames) c.values <- t(matrix(z$tnmat, nrow = 4)) c.values <- c.values[, 4:1] dimnames(c.values) <- list(vnames, cnames[-1]) p.values <- if (tcrit) matrix(pt(c.values, n - p), ncol = 4) else matrix(pnorm(c.values), ncol = 4) dimnames(p.values) <- list(vnames, cnames[-1]) list(coefficients = coefficients, residuals = residuals, c.values = c.values, p.values = p.values) } } "rq.fit.conquer" <- function(x, y, tau = 0.5, kernel = c("Gaussian", "uniform", "parabolic", "triangular"), h = 0, tol = 1e-04, iteMax = 5000, ci = FALSE, alpha = 0.05, B = 200) { if(!requireNamespace("conquer", quietly = TRUE)) stop("method conquer requires package conquer") fit = conquer::conquer(x[,-1], y, tau = tau, kernel = kernel, h = h, tol = tol, iteMax = iteMax, ci = FALSE, alpha = alpha, B = 1000) coefficients = fit$coeff names(coefficients) = dimnames(x)[[2]] residuals = fit$residual list(coefficients = coefficients, tau = tau, residuals = residuals) } "rq.fit.fnb" <- function (x, y, tau = 0.5, rhs = (1-tau)*apply(x,2,sum), beta = 0.99995, eps = 1e-06) { n <- length(y) p <- ncol(x) if (n != nrow(x)) stop("x and y don't match n") if (tau < eps || tau > 1 - eps) stop("No parametric Frisch-Newton method. Set tau in (0,1)") d <- rep(1,n) u <- rep(1,n) wn <- rep(0,10*n) wn[1:n] <- (1-tau) #initial value of dual solution z <- .Fortran("rqfnb", as.integer(n), as.integer(p), a = as.double(t(as.matrix(x))), c = as.double(-y), rhs = as.double(rhs), d = as.double(d),as.double(u), beta = as.double(beta), eps = as.double(eps), wn = as.double(wn), wp = double((p + 3) * p), nit = integer(3), info = integer(1)) if (z$info != 0) warning(paste("Error info = ", z$info, "in stepy: possibly singular design")) coefficients <- -z$wp[1:p] names(coefficients) <- dimnames(x)[[2]] residuals <- y - x %*% coefficients list(coefficients=coefficients, tau=tau, residuals=residuals, nit = z$nit) } "rq.fit.fnc" <- function (x, y, R, r, tau = 0.5, beta = 0.9995, eps = 1e-06) { n1 <- length(y) n2 <- length(r) p <- ncol(x) if (n1 != nrow(x)) stop("x and y don't match n1") if (n2 != nrow(R)) stop("R and r don't match n2") if (p != ncol(R)) stop("R and x don't match p") if (tau < eps || tau > 1 - eps) stop("No parametric Frisch-Newton method. Set tau in (0,1)") rhs <- (1 - tau) * apply(x, 2, sum) u <- rep(1, max(n1,n2)) #upper bound vector and scratch vector wn1 <- rep(0, 9 * n1) wn1[1:n1] <- (1 - tau) #store the values of x1 wn2 <- rep(0, 6 * n2) wn2[1:n2] <- 1 #store the values of x2 z <- .Fortran("rqfnc", as.integer(n1), as.integer(n2), as.integer(p), a1 = as.double(t(as.matrix(x))), c1 = as.double(-y), a2 = as.double(t(as.matrix(R))), c2 = as.double(-r), rhs = as.double(rhs), d1 = double(n1), d2 = double(n2), as.double(u), beta = as.double(beta), eps = as.double(eps), wn1 = as.double(wn1), wn2 = as.double(wn2), wp = double((p + 3) * p), it.count = integer(3), info = integer(1)) if (z$info != 0) stop(paste("Error info = ", z$info, "in stepy2: singular design")) coefficients <- -z$wp[1:p] names(coefficients) <- dimnames(x)[[2]] residuals <- y - x %*% coefficients it.count <- z$it.count list(coefficients=coefficients, tau=tau, residuals=residuals, it = it.count) } "rq.fit.scad" <- function (x, y, tau = 0.5, alpha = 3.2, lambda = 1, start = "rq", beta = 0.9995, eps = 1e-06) { n <- length(y) p <- ncol(x) if (n != nrow(x)) stop("x and y don't match n") if (tau < eps || tau > 1 - eps) stop("No parametric Frisch-Newton method. Set tau in (0,1)") if(length(lambda) == 1) lambda <- c(0,rep(lambda,p-1)) if(length(lambda) != p) stop(paste("lambda must be either of length ",p," or length one")) if(any(lambda < 0)) stop("negative lambdas disallowed") R <- diag(lambda,nrow = length(lambda)) R <- R[which(lambda != 0),, drop = FALSE] r <- rep(0,nrow(R)) X <- rbind(x, R) Y <- c(y, r) N <- length(Y) rhs <- (1 - tau) * apply(x, 2, sum) + apply(R,2,sum) dscad <- function(x, a = 3.7, lambda = 2){ lambda * sign(x) * (abs(x) <= lambda) + sign(x) * (a * lambda - abs(x)) / (a - 1) * (abs(x) <= a * lambda) * (abs(x) > lambda) } binit <- switch(start, rq = rq.fit.fnb(x, y, tau = tau)$coef[-1], lasso = rq.fit.lasso(x, y, tau = tau, lambda = lambda)$coef[-1] ) coef <- rep(.Machine$double.xmax,p) vscad <- rhs - c(0,dscad(binit) * sign(binit)) it <- 0 while(sum(abs(binit - coef[-1])) > eps){ it <- it + 1 d <- rep(1, N) u <- rep(1, N) wn <- rep(0, 10 * N) wn[1:N] <- c(rep((1 - tau),n),rep(.5,nrow(R))) vrhs <- rhs - vscad binit <- coef[-1] z <- .Fortran("rqfnb", as.integer(N), as.integer(p), a = as.double(t(as.matrix(X))), c = as.double(-Y), vrhs = as.double(vrhs), d = as.double(d), as.double(u), beta = as.double(beta), eps = as.double(eps), wn = as.double(wn), wp = double((p + 3) * p), it.count = integer(3), info = integer(1)) coef <- -z$wp[1:p] vscad <- c(0,dscad(coef[2:p]) * sign(coef[2:p])) } if (z$info != 0) stop(paste("Error info = ", z$info, "in stepy2: singular design")) coefficients <- -z$wp[1:p] names(coefficients) <- dimnames(x)[[2]] residuals <- y - x %*% coefficients it.count <- z$it.count list(coefficients=coefficients, residuals=residuals, tau = tau, lambda = lambda, it = it.count) } "rq.fit.lasso" <- function (x, y, tau = 0.5, lambda = NULL, beta = 0.99995, eps = 1e-06) { n <- length(y) p <- ncol(x) if (n != nrow(x)) stop("x and y don't match n") if(!length(lambda)) lambda <- LassoLambdaHat(x, tau = tau) else if(length(lambda) == 1) lambda <- c(0,rep(lambda,p-1)) else if(length(lambda) != p) stop(paste("lambda must be either of length ",p," or length one")) if(any(lambda < 0)) stop("negative lambdas disallowed") R <- diag(lambda,nrow = length(lambda)) R <- R[which(lambda != 0),, drop = FALSE] r <- rep(0,nrow(R)) if (tau < eps || tau > 1 - eps) stop("No parametric Frisch-Newton method. Set tau in (0,1)") X <- rbind(x, R) Y <- c(y, r) N <- length(Y) rhs <- (1 - tau) * apply(x, 2, sum) + 0.5 * apply(R,2,sum) d <- rep(1, N) u <- rep(1, N) wn <- rep(0, 10 * N) wn[1:N] <- 0.5 z <- .Fortran("rqfnb", as.integer(N), as.integer(p), a = as.double(t(as.matrix(X))), c = as.double(-Y), rhs = as.double(rhs), d = as.double(d), as.double(u), beta = as.double(beta), eps = as.double(eps), wn = as.double(wn), wp = double((p + 3) * p), it.count = integer(3), info = integer(1)) if (z$info != 0) stop(paste("Error info = ", z$info, "in stepy2: singular design")) coefficients <- -z$wp[1:p] names(coefficients) <- dimnames(x)[[2]] residuals <- y - x %*% coefficients it.count <- z$it.count list(coefficients=coefficients, residuals=residuals, tau = tau, lambda = lambda, it = it.count) } "rq.fit.pfn" <- # This is an implementation (purely in R) of the preprocessing phase # of the rq algorithm described in Portnoy and Koenker, Statistical # Science, (1997) 279-300. In this implementation it can be used # as an alternative method for rq() by specifying method="pfn" # It should probably be used only on very large problems and then # only with some caution. Very large in this context means roughly # n > 100,000. The options are described in the paper, and more # explicitly in the code. Again, it would be nice perhaps to have # this recoded in a lower level language, but in fact this doesn't # seem to make a huge difference in this case since most of the work # is already done in the rq.fit.fnb calls. # function(x, y, tau = 0.5, Mm.factor = 0.8, max.bad.fixups = 3, eps = 1e-6) { #rq function for n large -- n <- length(y) if(nrow(x) != n) stop("x and y don't match n") if(tau < 0 | tau > 1) stop("tau outside (0,1)") p <- ncol(x) m <- round(sqrt(p) * n^(2/3)) not.optimal <- TRUE ifix = 0 ibad = 0 while(not.optimal) { ibad = ibad + 1 if(m < n) s <- sample(n, m) else { z <- rq.fit.fnb(x, y, tau = tau, eps = eps) break } xx <- x[s, ] yy <- y[s] z <- rq.fit.fnb(xx, yy, tau = tau, eps = eps) xxinv <- solve(chol(crossprod(xx))) band <- sqrt(((x %*% xxinv)^2) %*% rep(1, p)) #sqrt(h<-ii) r <- y - x %*% z$coef M <- Mm.factor * m lo.q <- max(1/n, tau - M/(2 * n)) hi.q <- min(tau + M/(2 * n), (n - 1)/n) kappa <- quantile(r/pmax(eps, band), c(lo.q, hi.q)) sl <- r < band * kappa[1] su <- r > band * kappa[2] bad.fixups <- 0 while(not.optimal & (bad.fixups < max.bad.fixups)) { ifix = ifix + 1 xx <- x[!su & !sl, ] yy <- y[!su & !sl] if(any(sl)) { glob.x <- c(t(x[sl, , drop = FALSE]) %*% rep( 1, sum(sl))) glob.y <- sum(y[sl]) xx <- rbind(xx, glob.x) yy <- c(yy, glob.y) } if(any(su)) { ghib.x <- c(t(x[su, , drop = FALSE]) %*% rep( 1, sum(su))) ghib.y <- sum(y[su]) xx <- rbind(xx, ghib.x) yy <- c(yy, ghib.y) } z <- rq.fit.fnb(xx, yy, tau = tau, eps = eps) b <- z$coef r <- y - x %*% b su.bad <- (r < 0) & su sl.bad <- (r > 0) & sl if(any(c(su.bad, sl.bad))) { if(sum(su.bad | sl.bad) > 0.1 * M) { # This warning may get annoying? warning("Too many fixups: doubling m") bad.fixups <- bad.fixups + 1 m <- 2 * m break } su <- su & !su.bad sl <- sl & !sl.bad } else not.optimal <- FALSE } } nit <- c(z$nit,ifix,ibad) coefficients <- z$coef names(coefficients) <- dimnames(x)[[2]] list(coefficients=coefficients, tau=tau, nit = nit) } "rq.wfit" <- function(x, y, tau = 0.5, weights, method = "br", ...) { if(any(weights < 0)) stop("negative weights not allowed") if(length(tau) > 1) { tau <- tau[1] warning("Multiple taus not allowed in rq.wfit: solution restricted to first element") } contr <- attr(x, "contrasts") wx <- x * weights wy <- y * weights fit <- switch(method, fn = rq.fit.fnb(wx, wy, tau = tau, ...), fnb = rq.fit.fnb(wx, wy, tau = tau, ...), br = rq.fit.br(wx, wy, tau = tau, ...), fnc = rq.fit.fnc(wx, wy, tau = tau, ...), sfn = rq.fit.sfn(wx, wy, tau = tau, ...), conquer = rq.fit.conquer(wx, wy, tau = tau, ...), ppro = rq.fit.ppro(wx, wy, tau = tau, ...), pfn = rq.fit.pfn(wx, wy, tau = tau, ...), pfnb = rq.fit.pfnb(wx, wy, tau = tau, ...), { what <- paste("rq.fit.", method, sep = "") if(exists(what, mode = "function")) (get(what, mode = "function"))(x, y, ...) else stop(paste("unimplemented method:", method)) } ) if(length(fit$sol)) fit$fitted.values <- x %*% fit$sol[-(1:3),] else fit$fitted.values <- x %*% fit$coef fit$residuals <- y - fit$fitted.values fit$contrasts <- attr(x, "contrasts") fit$weights <- weights fit } "summary.rqs" <- function (object, ...) { taus <- object$tau xsum <- as.list(taus) dots <- list(...) U <- NULL # Reuse bootstrap randomization for(i in 1:length(taus)){ xi <- object xi$coefficients <- xi$coefficients[,i] xi$residuals <- xi$residuals[,i] xi$tau <- xi$tau[i] class(xi) <- "rq" xsum[[i]] <- summary(xi, U = U, ...) if(i == 1 && length(xsum[[i]]$U)) U <- xsum[[i]]$U if(class(object)[1] == "dynrqs"){ class(xsum[[1]]) <- c("summary.dynrq", "summary.rq") if(i == 1) xsum[[1]]$model <- object$model } } class(xsum) <- "summary.rqs" if(class(object)[1] == "dynrqs") class(xsum) <- c("summary.dynrqs", "summary.rqs") xsum } "logLik.rq" <- function(object, ...){ n <- length(object$residuals) p <- length(object$coefficients) pen <- (length(object$lambda) > 0) tau <- object$tau fid <- object$rho val <- n * (log(tau * (1-tau)) - 1 - log(fid/n)) attr(val,"n") <- n if(pen){ if(!hasArg(edfThresh)) edfThresh <- 0.0001 attr(val,"df") <- sum(abs(object$coefficients) > edfThresh) } else attr(val,"df") <- p class(val) <- "logLik" val } "logLik.rqs" <- function(object, ...){ n <- nrow(object$residuals) p <- nrow(object$coefficients) pen <- (length(object$lambda) > 0) tau <- object$tau fid <- object$rho val <- n * (log(tau * (1-tau)) - 1 - log(fid/n)) attr(val,"n") <- n if(pen){ if(!hasArg(edfThresh)) edfThresh <- 0.0001 attr(val,"df") <- apply(abs(object$coefficients) > edfThresh,2,sum) } else attr(val,"df") <- p class(val) <- "logLik" val } "AIC.rq" <- function(object, ... , k = 2){ v <- logLik(object) if(k <= 0) k <- log(attr(v,"n")) val <- AIC(v, k = k) attr(val,"edf") <- attr(v,"df") val } "extractAIC.rq" <- function(fit, scale, k=2, ...){ aic <- AIC(fit,k) edf <- attr(aic, "edf") c(edf, aic) } "AIC.rqs" <- function(object, ... , k = 2){ v <- logLik(object) if(k <= 0) k <- log(attr(v,"n")) val <- AIC(v, k = k) attr(val,"edf") <- attr(v,"df") val } "summary.rq" <- # This function provides methods for summarizing the output of the # rq command. In this instance, "summarizing" means essentially provision # of either standard errors, or confidence intervals for the rq coefficents. # Since the preferred method for confidence intervals is currently the # rank inversion method available directly from rq() by setting ci=TRUE, with br=TRUE. # these summary methods are intended primarily for comparison purposes # and for use on large problems where the parametric programming methods # of rank inversion are prohibitively memory/time consuming. Eventually # iterative versions of rank inversion should be developed that would # employ the Frisch-Newton approach. # # Object is the result of a call to rq(), and the function returns a # table of coefficients, standard errors, "t-statistics", and p-values, and, if # covariance=TRUE a structure describing the covariance matrix of the coefficients, # i.e. the components of the Huber sandwich. # # There are five options for "se": # # 1. "rank" strictly speaking this doesn't produce a "standard error" # at all instead it produces a coefficient table with confidence # intervals for the coefficients based on inversion of the # rank test described in GJKP and Koenker (1994). # 2. "iid" which presumes that the errors are iid and computes # an estimate of the asymptotic covariance matrix as in KB(1978). # 3. "nid" which presumes local (in tau) linearity (in x) of the # the conditional quantile functions and computes a Huber # sandwich estimate using a local estimate of the sparsity. # 4. "ker" which uses a kernel estimate of the sandwich as proposed # by Powell. # 5. "boot" which uses one of several flavors of bootstrap methods: # "xy" uses xy-pair method # "wxy" uses weighted (generalized) method # "pwy" uses the parzen-wei-ying method # "pxy" uses the preprocessing method # "mcmb" uses the Markov chain marginal bootstrap method # "cluster" uses the Hagemann clustered wild gradient method # "conquer" uses the He et al multiplier bootstrap # "BLB" uses the Bag of Little Bootstraps method # # function (object, se = NULL, covariance = FALSE, hs = TRUE, U = NULL, gamma = 0.7, ...) { if(object$method == "lasso") stop("no inference for lasso'd rq fitting: try rqss (if brave, or credulous)") if(object$method == "conquer") se = "conquer" mt <- terms(object) m <- model.frame(object) y <- model.response(m) dots <- list(...) method <- object$method if(object$method == "sfn"){ x <- object$model$x vnames <- names(object$coef) ctrl <- object$control } else{ x <- model.matrix(mt, m, contrasts = object$contrasts) vnames <- dimnames(x)[[2]] } wt <- as.vector(model.weights(object$model)) tau <- object$tau eps <- .Machine$double.eps^(1/2) coef <- coefficients(object) if (is.matrix(coef)) coef <- coef[, 1] resid <- object$residuals n <- length(y) p <- length(coef) rdf <- n - p if (!is.null(wt)) { resid <- resid * wt x <- x * wt y <- y * wt } if (is.null(se)) { if (n < 1001 & covariance == FALSE) se <- "rank" else se <- "nid" } if (se == "rank") { f <- rq.fit.br(x, y, tau = tau, ci = TRUE, ...) } if (se == "iid") { xxinv <- diag(p) xxinv <- backsolve(qr(x)$qr[1:p, 1:p,drop=FALSE], xxinv) xxinv <- xxinv %*% t(xxinv) pz <- sum(abs(resid) < eps) h <- max(p + 1, ceiling(n * bandwidth.rq(tau, n, hs = hs))) ir <- (pz + 1):(h + pz + 1) ord.resid <- sort(resid[order(abs(resid))][ir]) xt <- ir/(n - p) sparsity <- rq(ord.resid ~ xt)$coef[2] cov <- sparsity^2 * xxinv * tau * (1 - tau) scale <- 1/sparsity serr <- sqrt(diag(cov)) } else if (se == "nid") { h <- bandwidth.rq(tau, n, hs = hs) while((tau - h < 0) || (tau + h > 1)) h <- h/2 bhi <- rq.fit(x, y, tau = tau + h, method = method)$coef blo <- rq.fit(x, y, tau = tau - h, method = method)$coef dyhat <- x %*% (bhi - blo) if (any(dyhat <= 0)) warning(paste(sum(dyhat <= 0), "non-positive fis")) f <- pmax(0, (2 * h)/(dyhat - eps)) fxxinv <- diag(p) if(method == "sfn"){ D <- t(x) %*% (f * x) D <- chol(0.5 * (D + t(D)), nsubmax = ctrl$nsubmax, nnzlmax = ctrl$nnzlmax, tmpmax = ctrl$tmpmax) fxxinv <- backsolve(D, fxxinv) } else{ fxxinv <- backsolve(qr(sqrt(f) * x)$qr[1:p, 1:p,drop=FALSE], fxxinv) fxxinv <- fxxinv %*% t(fxxinv) } xx <- t(x) %*% x cov <- tau * (1 - tau) * fxxinv %*% xx %*% fxxinv scale <- mean(f) serr <- sqrt(diag(cov)) } else if (se == "ker") { h <- bandwidth.rq(tau, n, hs = hs) while((tau - h < 0) || (tau + h > 1)) h <- h/2 uhat <- c(y - x %*% coef) h <- (qnorm(tau + h) - qnorm(tau - h))* min(sqrt(var(uhat)), ( quantile(uhat,.75)- quantile(uhat, .25))/1.34 ) f <- dnorm(uhat/h)/h fxxinv <- diag(p) fxxinv <- backsolve(qr(sqrt(f) * x)$qr[1:p, 1:p,drop=FALSE], fxxinv) fxxinv <- fxxinv %*% t(fxxinv) cov <- tau * (1 - tau) * fxxinv %*% crossprod(x) %*% fxxinv scale <- mean(f) serr <- sqrt(diag(cov)) } else if (se == "boot") { if("cluster" %in% names(dots)) { bargs <- modifyList(list(x = x, y = y, tau = tau), dots) if(length(object$na.action)) { cluster <- dots$cluster[-object$na.action] bargs <- modifyList(bargs, list(cluster = cluster)) } if(class(bargs$x)[1] == "matrix.csr") bargs <- modifyList(bargs, list(control = ctrl)) B <- do.call(boot.rq, bargs) } else B <- boot.rq(x, y, tau, coef = coef, ...) cov <- cov(B$B) serr <- sqrt(diag(cov)) } else if (se == "BLB"){ # Bag of Little Bootstraps n <- length(y) b <- ceiling(n^gamma) S <- n %/% b V <- matrix(sample(1:n, b * S), b, S) Z <- matrix(0, NCOL(x), S) for(i in 1:S){ v <- V[,i] B <- boot.rq(x[v,], y[v], tau, bsmethod = "BLB", blbn = n, ...) Z[,i] <- sqrt(diag(cov(B$B))) } cov <- cov(B$B) serr <- apply(Z, 1, mean) } else if(se == "extreme"){ tau0 <- tau if(tau > 0.5) { y <- -y tau <- 1 - tau } if(length(dots$mofn)) mofn = dots$mofn else mofn = floor(n/5) if(length(dots$mofn)) kex = dots$kex else kex = 20 if(length(dots$alpha)) alpha = dots$alpha else alpha = 0.1 if(length(dots$R)) R = dots$R else R = 200 m <- (tau * n + kex)/(tau * n) taub <- min(tau * n/mofn, tau + (.5 - tau)/3) # This warning is a bit different than Section 1.3.4 of the Handbook chapter #if (tau.b.e == tau.e + (.5 - tau.e) / 3 && b >= min(n / 3, 1000)) # warning("tau may be non-extremal results are not likely to differ from central inference"); xbar <- apply(x,2, mean) b0 <- rq.fit(x, y, tau, method = method)$coef bm <- rq.fit(x, y, tau = m*tau, method = method)$coef An <- (m-1)*tau * sqrt(n/(tau*(1-tau)))/c(crossprod(xbar,bm - b0)) bt <- rq.fit(x, y, tau=taub, method = method)$coef s <- matrix(sample(1:n, mofn * R, replace = T), mofn, R) mbe <- (taub * mofn + kex)/(taub * mofn) bmbeb <- rq.fit(x, y, tau = mbe*taub, method = method)$coef # Accelerated xy bootstrap B0 <- boot.rq.pxy(x, y, s, taub, bt, method = method) Bm <- boot.rq.pxy(x, y, s, tau = mbe * taub, bmbeb, method = method) B <- (mbe - 1) * taub * sqrt(mofn/(taub * (1-taub))) * (B0 - b0)/c((Bm - B0) %*% xbar) if (tau0 <= 0.5) { bbc <- b0 - apply(B, 2, quantile, .5, na.rm = TRUE)/An ciL <- b0 - apply(B, 2, quantile, 1 - alpha/2, na.rm = TRUE)/An ciU <- b0 - apply(B, 2, quantile, alpha/2, na.rm = TRUE)/An } else { bbc <- -(b0 - apply(B, 2, quantile, .5, na.rm = TRUE)/An) ciL <- -(b0 - apply(B, 2, quantile, alpha/2, na.rm = TRUE)/An) ciU <- -(b0 - apply(B, 2, quantile, 1 - alpha/2, na.rm = TRUE)/An) } B <- R-sum(is.na(B[,1])) coef <- cbind(b0, bbc, ciL, ciU) if(tau0 > 0.5) {coef <- -coef; tau <- tau0} dimnames(coef) = list(dimnames(x)[[2]], c("coef", "BCcoef","ciL", "ciU")) } else if(se == "conquer"){ if(length(dots$R)) R = dots$R else R = 200 Z <- conquer::conquer(x[,-1], y, tau, ci = TRUE, B = R) #Fixme: should have option to choose another bsmethod coef <- cbind(Z$coef, Z$perCI) cnames <- c("coefficients", "lower bd", "upper bd") dimnames(coef) <- list(vnames, cnames) resid <- y - x %*% Z$coef } if( se == "rank"){ coef <- f$coef } else if(!(se %in% c("conquer", "extreme"))){ coef <- array(coef, c(p, 4)) dimnames(coef) <- list(vnames, c("Value", "Std. Error", "t value", "Pr(>|t|)")) coef[, 2] <- serr coef[, 3] <- coef[, 1]/coef[, 2] coef[, 4] <- if (rdf > 0) 2 * (1 - pt(abs(coef[, 3]), rdf)) else NA } object <- object[c("call", "terms")] if (covariance == TRUE) { if(se != "rank") object$cov <- cov if(se == "iid") object$scale <- scale if(se %in% c("nid", "ker")) { object$Hinv <- fxxinv object$J <- crossprod(x) object$scale <- scale } else if (se == "boot") { object$B <- B$B object$U <- B$U } } object$coefficients <- coef object$residuals <- resid object$rdf <- rdf object$tau <- tau class(object) <- "summary.rq" object } akj <- function(x, z = seq(min(x), max(x), length = 2 * length(x)), p = rep(1/length(x), length(x)), h = -1, alpha = 0.5, kappa = 0.9, iker1 = 0) { nx <- length(x) stopifnot(is.numeric(x), length(p) == nx, any((iker1 <- as.integer(iker1)) == 0:1)) nz <- length(z) if(is.unsorted(x)) x <- sort(x) .Fortran("sakj", as.double(x), as.double(z), as.double(p), iker1, dens = double(nz), psi = double(nz), score = double(nz), as.integer(nx), as.integer(nz), h = as.double(h), as.double(alpha), as.double(kappa), double(nx))[c("dens", "psi", "score", "h")] } "lm.fit.recursive" <- function(X, y, int = TRUE) { if(int) X <- cbind(1, X) p <- ncol(X) n <- nrow(X) D <- qr(X[1:p, ]) A <- qr.coef(D, diag(p)) A[is.na(A)] <- 0 A <- crossprod(t(A)) Ax <- rep(0, p) b <- matrix(0, p, n) b[, p] <- qr.coef(D, y[1:p]) b[is.na(b)] <- 0 z <- .Fortran( "rls", as.integer(n), as.integer(p), as.double(t(X)), as.double(y), b = as.double(b), as.double(A), as.double(Ax)) bhat <- matrix(z$b, p, n) return(bhat) } "rq.fit.hogg" <- function (x, y, taus = c(.1,.3,.5), weights = c(.7,.2,.1), R= NULL, r = NULL, beta = 0.99995, eps = 1e-06) { n <- length(y) n2 <- NROW(R) m <- length(taus) p <- ncol(x)+m if (n != nrow(x)) stop("x and y don't match n") if (m != length(weights)) stop("taus and weights differ in length") if (any(taus < eps) || any(taus > 1 - eps)) stop("taus outside (0,1)") W <- diag(weights) if(m == 1) W <- weights x <- as.matrix(x) X <- cbind(kronecker(W,rep(1,n)),kronecker(weights,x)) y <- kronecker(weights,y) rhs <- c(weights*(1 - taus)*n, sum(weights*(1-taus)) * apply(x, 2, sum)) if(n2!=length(r)) stop("R and r of incompatible dimension") if(!is.null(R)) if(ncol(R)!=p) stop("R and X of incompatible dimension") d <- rep(1, m*n) u <- rep(1, m*n) if(length(r)){ wn1 <- rep(0, 10 * m*n) wn1[1:(m*n)] <- .5 wn2 <- rep(0,6*n2) wn2[1:n2] <- 1 z <- .Fortran("rqfnc", as.integer(m*n), as.integer(n2), as.integer(p), a1 = as.double(t(as.matrix(X))), c1 = as.double(-y), a2 = as.double(t(as.matrix(R))), c2 = as.double(-r), rhs = as.double(rhs), d1 = double(m*n), d2 = double(n2), as.double(u), beta = as.double(beta), eps = as.double(eps), wn1 = as.double(wn1), wn2 = as.double(wn2), wp = double((p + 3) * p), it.count = integer(3), info = integer(1)) } else{ wn <- rep(0, 10 * m*n) wn[1:(m*n)] <- .5 z <- .Fortran("rqfnb", as.integer(m*n), as.integer(p), a = as.double(t(as.matrix(X))), c = as.double(-y), rhs = as.double(rhs), d = as.double(d), as.double(u), beta = as.double(beta), eps = as.double(eps), wn = as.double(wn), wp = double((p + 3) * p), it.count = integer(2), info = integer(1)) } if (z$info != 0) warning(paste("Info = ", z$info, "in stepy: singular design: iterations ", z$it.count[1])) coefficients <- -z$wp[1:p] if(any(is.na(coefficients)))stop("NA coefs: infeasible problem?") list(coefficients = coefficients, nit = z$it.count, flag = z$info) } #preprocessing for the QR process "rq.fit.ppro" <- function (x, y, tau, weights=NULL, Mm.factor = 0.8, eps = 1e-06, ...) { ntau <- length(tau) n <- length(y) if (nrow(x) != n) stop("x and y don't match n") p <- ncol(x) m <- n * sqrt(p) * max(diff(tau)) # check this length(tau) == 1 case? dots <- list(...) method <- ifelse(length(dots$pmethod), dots$pmethod, "fn") if(length(weights)){ if(any(weights < 0)) stop("negative weights not allowed") if(length(weights) != n) stop("weights not of length(y)") else { x <- x * weights y <- y * weights } } coef <- matrix(NA, p, ntau) resid <- matrix(NA, n, ntau) rho <- rep(0, ntau) Rho <- function(u, tau) u * (tau - (u < 0)) z <- rq.fit(x, y, tau=tau[1], method = method) r <- z$resid coef[,1] <- z$coef rho[1] <- sum(Rho(z$residuals, tau[1])) xxinv <- solve(chol(crossprod(x))) # Is pmax really necessary here? band <- pmax(eps, sqrt(((x %*% xxinv)^2) %*% rep(1, p))) for(i in 2:ntau){ not.optimal <- TRUE mm <- m while (not.optimal) { M <- Mm.factor * mm lo.q <- max(1/n, tau[i] - M/(2 * n)) hi.q <- min(tau[i] + M/(2 * n), (n - 1)/n) kappa <- quantile(r/band, c(lo.q, hi.q)) sl <- r < band * kappa[1] su <- r > band * kappa[2] while (not.optimal) { xx <- x[!su & !sl, ] yy <- y[!su & !sl] if (any(sl)) { glob.x <- c(t(x[sl, , drop = FALSE]) %*% rep(1, sum(sl))) glob.y <- sum(y[sl]) xx <- rbind(xx, glob.x) yy <- c(yy, glob.y) } if (any(su)) { ghib.x <- c(t(x[su, , drop = FALSE]) %*% rep(1, sum(su))) ghib.y <- sum(y[su]) xx <- rbind(xx, ghib.x) yy <- c(yy, ghib.y) } z <- rq.fit(xx, yy, tau = tau[i], method = method) b <- z$coef r <- y - x %*% b su.bad <- (r < 0) & su sl.bad <- (r > 0) & sl bad.signs <- sum(su.bad | sl.bad) if (bad.signs > 0) { if (bad.signs > 0.1 * M) { mm <- 2*mm warning("Too many fixups: doubling m") break } su <- su & !su.bad sl <- sl & !sl.bad } else not.optimal <- FALSE } } coef[,i] <- b resid[,i] <- y - x %*% b rho[i] <- sum(Rho(resid, tau[i])) } dimnames(coef) <- list(dimnames(x)[[2]], tau) list(coefficients=coef, residuals = resid, rho=rho, weights = weights) } # R function for fnb call for multiple taus rq.fit.qfnb <- function(x,y,tau){ n <- nrow(x) p <- ncol(x) m <- length(tau) d <- rep(1, n) u <- rep(1, n) z <- .Fortran("qfnb", n = as.integer(n), p = as.integer(p), m = as.integer(m), a = as.double(t(x)), y = as.double(-y), t = as.double(tau), r = double(p), d = as.double(d), u = as.double(u), wn = double(n*9), wp = double(p*(p+3)), B = double(p*m), nit = integer(3), info = integer(1)) if(z$info != 0) warning(paste("Info = ", z$info, "in stepy: singular design: nit = ", z$nit[1])) coefficients <- matrix(-z$B, p, m) dimnames(coefficients) <- list(dimnames(x)[[2]],paste("tau = ",tau)) list(coefficients = coefficients, nit = z$nit, flag = z$info) } rq.fit.pfnb <- function (x, y, tau, m0 = NULL, eps = 1e-06) { m <- length(tau) n <- length(y) if(!is.matrix(x)) dim(x) <- c(n,1) if (nrow(x) != n) stop("x and y don't match n") p <- ncol(x) if(!length(m0)) m0 <- floor(n^(2/3) * sqrt(p)) # Needs testing! s <- sample(n,m0) xs <- x[s,,drop = FALSE] ys <- y[s] z <- rq.fit(xs, ys, tau = tau[1], method = "fn") r <- y - x %*% z$coef b <- matrix(0,p,m) nit <- matrix(0,5,m) xxinv <- solve(chol(crossprod(xs))) band <- pmax(eps, sqrt(((x %*% xxinv)^2) %*% rep(1, p))) z <- .Fortran("pfnb", as.integer(n), as.integer(p), as.integer(m), as.double(t(x)), as.double(y), as.double(tau), as.double(r), b = as.double(-b), as.double(band), as.integer(m0), double(n), double(n), double(n*9), double(p*(p+3)), double(p*n), double(n), integer(n), integer(n), double(p), double(p), double(p), nit = as.integer(nit), info = integer(m)) coefficients <- matrix(-z$b,p,m) nit <- matrix(z$nit,5,m) dimnames(coefficients) <- list(dimnames(x)[[2]],paste("tau = ",tau)) list(coefficients = coefficients, nit = nit, flag = z$info) } LassoLambdaHat <- function(X, R = 1000, tau = 0.5, C = 1, alpha = 0.95){ # Chernozhukov and Belloni default lasso lambda proposal: n <- nrow(X) sigs <- apply(X^2,2,mean) U <- matrix(runif(n * R),n) R <- (t(X) %*% (tau - (U < tau)))/sigs r <- apply(abs(R),2,max) C * quantile(r, 1 - alpha) * sigs } quantreg/R/boot.R0000644000176200001440000003023514222062520013365 0ustar liggesusers"boot.rq"<- function (x, y, tau = 0.5, R = 200, bsmethod = "xy", mofn = length(y), coef = NULL, blbn = NULL, cluster = NULL, U = NULL, ...) { n <- length(y) if(class(x)[1] != "matrix.csr") x <- as.matrix(x) p <- ncol(x) B <- matrix(0, R, p) if(tau < 0 || tau > 1) stop("tau outside (0,1) not allowed") if(length(cluster)) bsmethod <- "cluster" if (bsmethod == "xy") { if(!length(U)){ if(mofn < p || mofn > n) stop("mofn is out of range") U <- matrix(sample(n, mofn * R, replace = TRUE), mofn, R) } B <- sqrt(mofn/n)*boot.rq.xy(x, y, U, tau) } else if (bsmethod == "wxy") { if(!length(U)) U <- matrix(rexp(n * R,1), n, R) B <- boot.rq.wxy(x, y, U, tau) } else if (bsmethod == "pxy") { if (!length(U)) { if (mofn < p || mofn > n) stop("mofn is out of range") U <- matrix(sample(n, mofn * R, replace = TRUE), mofn, R) } B <- sqrt(mofn/n) * boot.rq.pxy(x, y, U, tau, coef, ...) } else if (bsmethod == "pwxy") { B <- sqrt(mofn/n) * boot.rq.pwxy(x, y, tau, coef, ...)$B } else if (bsmethod == "BLB") { B <- boot.rq.pwxy(x, y, tau, coef, ...)$B } else if (bsmethod == "cluster"){ # Hagemann wild gradient bootstrap if(!length(U)){ if(length(cluster) != n) stop("cluster is wrong length") u <- unique(cluster) m <- length(u) h <- c(-(sqrt(5) - 1)/2, (sqrt(5) + 1)/2) hp <- c((sqrt(5) + 1)/sqrt(20), (sqrt(5) - 1)/sqrt(20)) U <- matrix(sample(h, R * m, prob = hp, replace = TRUE), m, R) U <- apply(U, 2, function(v) v[match(cluster,u)]) } if(class(x)[1] == "matrix.csr") r <- c(rq.fit.sfn(x, y, tau)$resid) else r <- c(rq.fit.fnb(x, y, tau)$resid) psi <- (r < 0) - tau W <- as.matrix(t(x) %*% (U * psi)) if(class(x)[1] == "matrix.csr") B <- boot.rq.spwy(W, x, y, tau) else B <- boot.rq.pwy(W, x, y, tau) } else if (bsmethod == "jack"){ # Portnoy proposal if(!length(U)){ if(missing(mofn)) mofn <- n - ceiling(2*sqrt(n)) if(mofn < p || mofn > n) stop("mofn is out of range") U <- matrix(0, mofn, R) U <- apply(U, 2, function(x) sample(n, mofn)) } B <- (mofn - p + 1)/sqrt(n * (n - mofn)) * boot.rq.xy(x, y, U, tau) } else if (bsmethod == "pwy") { if(!length(U)){ U <- matrix(runif(n * R), n, R) } W <- as.matrix(t(x) %*% ((U < tau) - tau)) if(class(x)[1] == "matrix.csr") B <- boot.rq.spwy(W, x, y, tau) else B <- boot.rq.pwy(W, x, y, tau) } else if (bsmethod == "mcmb") { B <- boot.rq.mcmb(x, y, tau = tau, R = R) } else if (bsmethod == "wild") { n <- length(y) fit <- rq.fit(x, y, tau = tau) S <- sample(c(-2*tau,2*(1-tau)),prob = c(tau,1-tau),size = n * R, replace = TRUE) W <- matrix(S,n,R) r <- c(fit$resid) f0 <- akj(r,z=0)$dens if(inherits(x, "matrix.csr")) H <- diag(x %*% solve(t(x) %*% x) %*% t(x)) else H <- hat(x, intercept = FALSE) r <- r + H * (tau - I(r < 0))/f0 Y <- c(fitted(fit)) + W * abs(r) B <- rqs.fit(x,Y,tau = tau) } else stop("your bootstrap method is not implemented") #cat(paste("Bootstrap standard errors based on ",R," replications")) list(B = B, U = U) } "boot.rq.mcmb" <- function (x, y, tau = 0.5, R = 200) { n <- length(y) p <- ncol(x) if(n < 2000) fit <- rq(y~x - 1, tau = tau, ci = FALSE) else fit <- rq(y~x - 1, tau = tau, method = "fn") coef <- fit$coef svdx <- svd(x) condx <- svdx$d[1]/svdx$d[p] Ainv <- svdx$v %*% diag(svdx$d) %*% t(svdx$v) coefTilda <- Ainv %*% coef A <- svdx$v %*% diag(1/svdx$d) %*% t(svdx$v) r <- fit$resid psi <- signr <- sign(r) psi[signr > 0] <- tau psi[signr < 0] <- tau - 1 psimat <- matrix(psi, nrow = n, ncol = p, byrow = FALSE) x <- x %*% A ZTilda <- x * psimat sumxij <- apply(x, 2, sum) sumabsxij <- apply(abs(x), 2, sum) zstar <- .C("bootnp", as.double(t(x)), as.double(y), as.double(tau), as.double(coefTilda), as.double(t(A)), as.double(ZTilda), as.double(sumxij), as.double(sumabsxij), as.integer(n), as.integer(p), success = as.integer(1), theta = as.double(rep(0, R * p + p), as.integer(c(p, R + 1))), as.integer(R)) if (zstar$success == 0) return(list(success = 0)) else{ B <- matrix(zstar$theta,p,R+1)[,-1] B <- t(A %*% B) } B } "boot.rq.xy"<- function(x, y, s, tau = 0.5, tol = 0.0001) { #function to compute xypairs bootstrap for regression quantiles #stripped down for monte-carlo purposes x <- as.matrix(x) p <- ncol(x) n <- nrow(x) R <- ncol(s) m <- nrow(s) z <- .Fortran("xys", as.integer(m), as.integer(n), as.integer(p), as.integer(R), as.integer(m + 5), as.integer(p + 2), as.double(x), as.double(y), as.double(tau), as.double(tol), flag = integer(R), coef = double(p * R), resid = double(m), integer(m), double((m + 5) * (p + 2)), double(m), xx = double(m * p), yy = double(m), as.integer(s)) if(sum(z$flag)>0){ if(any(z$flag)==2) warning(paste(sum(z$flag==2),"out of",R, "BS replications have near singular design")) if(any(z$flag)==1) warning(paste(sum(z$flag==1),"out of",R,"may be nonuniqu")) } return(t(matrix(z$coef, p, R))) } "boot.rq.wxy"<- function(x, y, w, tau = 0.5, tol = 0.0001) { #function to compute weighted bootstrap a la Bose for regression quantiles x <- as.matrix(x) p <- ncol(x) n <- nrow(x) R <- ncol(w) m <- nrow(w) z <- .Fortran("wxy", as.integer(n), as.integer(p), as.integer(R), as.integer(m + 5), as.integer(p + 2), as.double(x), as.double(y), as.double(tau), as.double(tol), flag = integer(R), coef = double(p * R), resid = double(m), integer(m), double((m + 5) * (p + 2)), double(m), xx = double(m * p), yy = double(m), as.double(w)) if(sum(z$flag)>0){ if(any(z$flag)==2) warning(paste(sum(z$flag==2),"out of",R, "BS replications have near singular design")) if(any(z$flag)==1) warning(paste(sum(z$flag==1),"out of",R,"may be nonunique")) } return(t(matrix(z$coef, p, R))) } "boot.rq.pwy"<- function(U,X, y, tau = 0.5, tol=1e-4) { #resampling method of parzen,wei,ying for quantile regression #NB. x should be full design matrix including intercept n <- length(y) p <- ncol(X) R <- ncol(U) Y <- c(y,length(y)*max(abs(y))) if(inherits(X, "matrix.csr")) x <- rbind(X, t(as.matrix.csr(rep(0, p)))) else x <- rbind(X,0) xu <- t(U)/tau n <- n+1 z<-.Fortran("pwy", as.integer(n), as.integer(p), as.integer(R), as.integer(n + 5), as.integer(p + 2), as.double(xu), as.double(x), as.double(Y), as.double(tau), as.double(tol), flag = as.integer(1), coef = double(p * R), resid = double(n), integer(n), double((n + 5) * (p + 2)), double(n)) return(t(matrix(z$coef, p, R))) } ################################################################# # NB: In an ideal world the loop below would be in fortran, in a # a really ideal world all of this resampling code # would be able to adapt to the "fn" or "sfn" etc # method used by the original fitting scheme. # My initial attempt to allow control to be passed # from the initial fit of the coefficients was a failure. # There was a "memory not mapped" segfault presumably # due to the fact that the pwy scheme has one extra # observation. Who would have guessed things were so # delicately tuned. This should be fixed when I'm in # a more delicate frame of mind. Meanwhile, on Andreas # test problem using sfn is substantially faster 26s # vs 148s for fnb, and even more for br as I used earlier. ################################################################# boot.rq.spwy <- function(W, a, y, tau=.5) { y <- c(y, length(y) * max(abs(y))) n <- length(y) m <- a@dimension[2] a <- rbind(a, as.matrix.csr(t(rep(1,m)))) nra <- length(a@ra) W <- W/tau k <- ncol(W) # Number of resampling realizations if(m != nrow(W)) stop("W row dimension not compatible with design matrix") if(n != a@dimension[1]) stop("Dimensions of design matrix and the response vector not compatible") for(i in 1:k){ a@ra[(nra - m + 1):nra] <- W[,i] W[,i] <- rq.fit.sfn(a,y,tau = tau)$coef } B <- t(W) B } # Preprocessing version of the xy bootstrap # globs as in "pfn" method # matrix s contains multinomial resampling draws (n by R) boot.rq.pxy <- function (x, y, s, tau = 0.5, coef, method="fn", Mm.factor = 3) { x <- as.matrix(x) p <- ncol(x) n <- nrow(x) R <- ncol(s) mofn <- nrow(s) #I have implemented the bootstrap with the count vector instead of the permutation vector counts <- apply(s, 2, tabulate, nbins=n) m <- round((p*n)^(1/2)) # Is there any theory for this? xxinv <- solve(chol(crossprod(x))) band <- sqrt(rowSums((x %*% xxinv)^2)) # H[i,i] vector r <- (y - x %*% coef)/band #To avoid computing quantiles of r in each replication I calculate once the cdf rs <- sort(r) B <- matrix(NA, R, p) #add two observations for the globs x <- rbind(0,0,x) y <- c(0,0,y) counts <- rbind(1,1,counts) for(i in 1:R){ mm <- m not.optimal <- TRUE #keep only the observations with positive weights bs <- (counts[,i] > 0) xb <- x[bs,] yb <- y[bs] rb <- r[bs[3:length(bs)]] wb <- counts[bs, i] while (not.optimal) { M <- Mm.factor * mm lo.q <- max(1, ceiling(n*tau - M/2)) hi.q <- min(floor(n*tau + M/2), n) kappa <- rs[c(lo.q, hi.q)] sl <- c(FALSE, FALSE, rb < kappa[1]) su <- c(FALSE, FALSE, rb > kappa[2]) while (not.optimal) { if (any(sl)) { xb[1,] <- colSums(xb[sl, , drop = FALSE] * wb[sl]) yb[1] <- sum(yb[sl] * wb[sl]) } else sl[1] <- TRUE if (any(su)) { xb[2,] <- colSums(xb[su, , drop = FALSE] * wb[su]) yb[2] <- sum(yb[su] * wb[su]) } else su[2] <- TRUE sel <- c(!su & !sl) #use weighted QR z <- tryCatch(z <- rq.wfit(xb[sel, ], yb[sel], weights=wb[sel], tau = tau, method = method), error = function(e) e) if(inherits(z, "error")){ mm <- 2*mm warning("Singular design: doubling m") break } b <- z$coef rb <- yb[3:sum(bs)] - xb[3:sum(bs), ] %*% b su.bad <- c(FALSE, FALSE, rb < 0) & su sl.bad <- c(FALSE, FALSE, rb > 0) & sl bad.signs <- sum(su.bad | sl.bad) if (bad.signs > 0) { if (bad.signs > 0.1 * M) { mm <- 2*mm #warning("Too many fixups: doubling m") break } su <- su & !su.bad sl <- sl & !sl.bad } else not.optimal <- FALSE } } B[i,] <- b } B } boot.rq.pwxy <- function (x, y, tau, coef, R = 200, m0 = NULL, eps = 1e-06, ...) { n <- length(y) if (nrow(x) != n) stop("x and y don't match n") p <- ncol(x) if (!length(m0)) m0 <- round(sqrt(n*p)) r <- y - x %*% coef b <- matrix(0, p, R) nit <- matrix(0, 5, R) # This version keeps track of fixups! info <- rep(0, R) xxinv <- solve(chol(crossprod(x))) band <- pmax(eps, sqrt(((x %*% xxinv)^2) %*% rep(1, p))) r <- r/band o <- order(r) r <- r[o] y <- y[o] x <- x[o,] loq <- max(1, ceiling(n*tau - m0/2)) hiq <- min(floor(n*tau + m0/2), n) qk <- r[c(loq,hiq)] z <- .Fortran("pwxy", as.integer(n), as.integer(p), as.integer(R), as.double(t(x)), as.double(y), as.double(tau), as.double(qk),as.double(r), b = as.double(-b), double(n), as.double(band), as.integer(m0), double(n), double(n), double(n * 9), double(p * (p + 3)), double(p * n), double(n), integer(n), integer(n), double(p), double(p), double(p), nit = as.integer(nit), info = as.integer(info)) if(any(z$info != 0)) warnings("Some bootstrap replications have abnormal convergence") B <- t(matrix(-z$b, p, R)) nit <- matrix(z$nit,5,R) list(B = B, nit = nit) } quantreg/R/khmal.R0000644000176200001440000000732013505157215013526 0ustar liggesusers"rqProcess" <- function (formula, data, taus, nullH = "location", ...) { z <- summary(f <- lm(formula, data = data, x = TRUE)) xbar <- apply(f$x,2,mean) vars <- names(z$coef[-1, 1]) p <- length(z$coef[, 1]) n <- length(z$resid) Jinv <- z$cov.unscaled pivot <- any(taus < 0) || any(taus > 1) if(!pivot){ #grid method if(abs(diff(range(diff(taus)))) > sqrt(.Machine$double.eps)) stop("rqProcess must be evaluated on equally spaced taus") ntaus <- length(taus) z <- summary(rq(formula, data = data, tau = taus, method = "fn"), covariance = TRUE, ...) coefs = t(sapply(z, coefficients)[1:p,]) Cov = array(sapply(z, function(x) x$cov), c(p,p,ntaus)) qtaus <- coefs %*% xbar Vhat <- t(coefs)[-1,,drop=FALSE] vhat <- t(coefs)[-1,,drop=FALSE] J <- solve(Jinv) p <- nrow(J) if (nullH == "location-scale") { f <- lm(coefs[,-1] ~ coefs[,1]) b <- matrix(f$coef,2,p-1)[2,] R <- matrix(f$resid,ntaus,p-1) for (j in 1:length(taus)) { V <- Cov[, , j] v <- V[-1, -1] + V[1, 1] * outer(b,b) - outer(V[-1, 1], b) - t(outer(V[-1, 1], b)) v <- solve(v) v <- chol(0.5 * (v + t(v))) Vhat[,j] <- v %*% R[j,] for (i in 2:p) { v <- V[i, i] + V[1, 1] * b[i-1]^2 - 2 * V[i, 1] * b[i-1] vhat[i-1,j] <- R[j, i-1]/sqrt(v) } } } else if (nullH == "location") { b <- apply(coefs, 2, mean) R <- t(coefs) - b for (j in 1:length(taus)) { V <- Cov[, , j] A <- solve(V[-1, -1,drop=FALSE]) B <- chol(0.5 * (A + t(A))) Vhat[,j] <- B %*% R[-1, j,drop=FALSE] vhat[,j] <- R[-1, j,drop=FALSE] / (sqrt(diag(V))[-1]) } } } else{ stop("pivot method is now deprecated for Ktest") } dimnames(Vhat) <- list(vars, NULL) dimnames(vhat) <- list(vars, NULL) x <- list(taus = taus, qtaus = qtaus, Vhat = Vhat, vhat = vhat, n = n) class(x) <- "rqProcess" x } "KhmaladzeTest" <- function (formula, data = NULL, taus = 1:99/100, nullH = "location", trim = c(0.05, 0.95), h = 1, ...) { gdot = function(x, taus = 1:999/1000, h = -1){ Qt = quantile(x, taus) z = akj(x, Qt, h = h) Qf = approxfun(taus, Qt) den = approxfun(Qt, z$den) psi = approxfun(Qt, z$psi) gdot0 = den(Qf(taus)) gdot1 = psi(Qf(taus)) gdot2 = Qf(taus) * gdot1 + 1 cbind(gdot0, gdot1, gdot2) } f <- rqProcess(formula, data = data, taus=taus, nullH = nullH, ...) G = gdot(f$qtaus, taus, h = 1) ntaus = length(taus) Vtil = Vhat = G[,1] * f$Vhat vtil = vhat = G[,1] * f$vhat if(nullH == "location") X = G[-ntaus,2] else X = G[-ntaus,2:3] for(i in 1:nrow(Vhat)){ Y = Vhat[i,-1] y = vhat[i,-1] B = lm.fit.recursive(X,Y) b = lm.fit.recursive(X,y) Vtil[i,-1] = Y - diag(cbind(1,X) %*% B) vtil[i,-1] = y - diag(cbind(1,X) %*% b) } trim <- (f$taus >= trim[1] & f$taus <= trim[2]) Tvtil <- (vtil - vtil[, 2])/sqrt(max(f$taus) - min(f$taus)) TVtil <- apply(abs(Vtil - Vtil[, 2])/ sqrt(max(f$taus) - min(f$taus)), 2, "sum")[trim] Tn <- max(TVtil) THn <- apply(abs(Tvtil[, trim,drop = FALSE]), 1, max) x <- list(nullH = nullH, Tn = Tn, THn = THn, taus = taus, Vhat = t(Vhat), Vtil = t(Vtil)) class(x) <- "KhmaladzeTest" x } print.KhmaladzeTest = function(x, ...) { cat("\nTest of H_0:", x$nullH, "\n") cat("\nJoint Test Statistic:", x$Tn, "\n") cat("\nComponent Test Statistics:", x$THn, "\n") } plot.KhmaladzeTest = function(x, ...) { dev.new(height = 6, width = 10) par(mfrow = c(1,2)) matplot(x$taus, x$Vhat, xlab = expression(tau), ylab = expression(hat(v)[n](tau)), type = "l") title("Parametric QR Process") matplot(x$taus, x$Vtil, xlab = expression(tau), ylab = expression(tilde(v)[n](tau)), type = "l") title("Transformed Parametric QR Process") par(mfrow = c(1,1)) } quantreg/R/crq.R0000644000176200001440000005755114265213414013230 0ustar liggesuserscrq.fit.pow <- function(x, y, yc, tau=0.5, weights=NULL, start, left=TRUE,maxit = 500){ x <- as.matrix(x) y <- as.vector(y) n <- nrow(x) p <- ncol(x) if(missing(yc)) { yc <- rep(0,n) if(!left) warning("default right (!?) censoring at zero") } yc <- as.vector(yc) if(length(weights)){ if (any(weights < 0)) stop("negative weights not allowed") contr <- attr(x, "contrasts") x <- x * weights y <- y * weights } if(left) { x <- -x y <- -y yc <- -yc tau <- 1-tau } # Starting value of beta if(missing(start)){ tol <- .Machine$double.eps^(2/3) r <- rq.fit.br(x,y,tau)$residuals h <- which(abs(r) < tol)[1:p] } else if(start[1] == "global"){ # Generate H matrix H <- combos(n,p) m <- ncol(H) # Starting value of beta U <- solve(x[H[,1],]) bh <- U %*% y[H[,1]] f <- .Fortran("brutpow", as.integer(n), as.integer(p), as.integer(m), as.integer(H), as.double(x), as.double(y), as.double(yc), as.double(bh), as.double(tau), as.double(U), double(p), double(p), kminz = integer(1), nflag = as.integer(0)) if(f$nflag!=0) warning(switch(f$nflag, "Error in pivot: hout not in h", "Error in pivot: hin in h", "Error in pivot: hin out of bounds", "Error in findk: k not found" )) k <- f$kminz bh <- solve(x[H[,k],],y[H[,k]]) residuals <- as.matrix(y - pmin(yc, x %*% bh)) return(list(coefficients= bh,residuals = residuals)) } else if(is.numeric(start) && length(start) == p){ if(all(start %in% 1:n)) h <- start else h <- order(abs(y - x %*% start))[1:p] } else stop("Invalid starting value") xhinv <- try(solve(x[h,])) if(class(xhinv)[1] == "try-error") stop("Singular basic solution generated by 'start'") f <- .Fortran("powell", as.integer(n), as.integer(p), as.integer(2*p), as.double(x), as.double(y), as.double(yc), coef = double(p), as.double(tau), as.integer(h), double(n), as.double(xhinv), double(n), double(2*p), double(p), double(p), as.integer(maxit), nflag = as.integer(0)) if(f$nflag!=0) warning(switch(f$nflag, "Max iterations reached", "Solution may be nonunique", "Error in pivot: hout not in h", "Error in pivot: hin in h", "Error in pivot: hin out of bounds" )) coef <- f$coef residuals <- as.matrix(y - pmin(yc, x %*% coef)) return (list(coefficients= coef, residuals = residuals)) } Curv <- function (y, yc, ctype = c("left", "right")) { nn <- length(y) if(length(yc) != nn) stop("Event times and censoring times of different length") ctype <- match.arg(ctype) if(ctype == "right" && any(y > yc)) stop("Event times can not exceed ctimes for right censoring") if(ctype == "left" && any(y < yc)) stop("Event times can not be less than ctimes for left censoring") if(!(ctype == "left" || ctype == "right")) stop("Invalid ctype for method Powell") ss <- cbind(y, yc) dimnames(ss) <- list(NULL, c("time", "ctime")) attr(ss, "ctype") <- ctype attr(ss, "type") <- ctype class(ss) <- "Surv" ss } QTECox <- function(x, smooth = TRUE){ # compute quantile treatment effect for a Cox PengHuang fit g <- survival::survfit(x) if(smooth) g <- supsmu(1-g$surv,g$time) taus <- (g$x[-1] + g$x[-length(g$x)])/2 Qhat <- (g$y[-1] + g$y[-length(g$y)])/2 dQ <- diff(Qhat)/diff(taus) taus <- taus[-1]; Qhat <- Qhat[-1] QTE <- outer(dQ * (1-taus) * log(1-taus) / Qhat, coef(x)) list(QTE = QTE , taus = taus) } boot.crq <- function(x, y, c, taus, method, ctype = "right", R=100, mboot, bmethod = "jack", ...) { n <- length(y) p <- ncol(x) if(missing(mboot)) { if(bmethod=="jack") mboot <- 2*ceiling(sqrt(n)) else mboot <- n } if(length(taus) > 1) A <- array(0,dim=c(p,length(taus),R)) else A <- matrix(0,p,R) for (i in 1:R){ if(bmethod == "jack") { s <- sample(1:n,mboot) yb <- y[-s] xb <- x[-s, ] cb <- c[-s] w <- rep(1,n-mboot) } else if(bmethod == "xy-pair"){ w <- table(sample(1:n,mboot,replace=TRUE)) s <- as.numeric(names(w)) w <- as.numeric(w) yb <- y[s] xb <- x[s,] cb <- c[s] } else if(bmethod == "Bose"){ w <- rexp(n) yb <- y xb <- x cb <- c } else stop("invalid bmethod for boot.crq") if(method == "Portnoy") a <- crq.fit.por(xb,yb,cb, weights = w, ctype = ctype, ... ) #else if(method == "Portnoy2") #a <- crq.fit.por2(xb,yb,cb, weights = w, ctype = ctype, ... ) else if(method == "PengHuang") a <- crq.fit.pen(xb,yb,cb, weights = w, ctype = ctype, ... ) else stop("Invalid method for boot.crq") if((i %% floor(R/10)) == 0 & n > 100000) cat(paste("bootstrap roughly ",100*(i/R)," percent complete\n")) if(length(taus) > 1) A[,,i] <- coef(a,taus) else A[,i] <- coef(a,taus) } list(A = A, n = length(y), mboot = mboot, bmethod = bmethod) } coef.crq <- function(object, taus = 1:4/5, ...) { # Extract coefficients from the crq solution array if(min(taus) < 0 || max(taus) > 1) stop("taus out of range [0,1]") if(length(object$tau) == 1){ coef <- object$coefficients return(coef) } taus <- sort(taus) S <- object$sol ctype <- object$ctype r <- S[1, ] r <- c(r[1],r) if(is.unsorted(r)) r <- r[-length(r)] #kludge until why this happens is found B <- S[-1,,drop = FALSE] B <- t(cbind(B,B[,ncol(B),drop = FALSE])) ts <- taus[taus > min(r) & taus < max(r)] bin <- findInterval(ts,r) wgt <- (ts - r[bin])/(r[bin + 1] - r[bin]) binlag <- bin - 1 binlag[binlag == 0] <- 1 coef <- t(wgt * B[bin, , drop = FALSE] + (1 - wgt) * B[binlag, , drop = FALSE]) nna <- length(taus) - length(ts) if(nna > 0) { if (ctype == "left") coef <- cbind(matrix(NA, nrow(coef), nna), coef) else coef <- cbind(coef, matrix(NA, nrow(coef), nna)) } taulabs <- paste("tau=", format(round(taus, 3))) dimnames(coef)[[2]] <- taulabs coef[-nrow(coef),] # Delete Qhat entries } crq <- function (formula, taus, data, subset, weights, na.action, method = c("Powell","Portnoy","Portnoy2", "PengHuang"), contrasts = NULL, ...) { if(!requireNamespace("survival", quietly = TRUE)) warning("crq requires survival package to be installed") #if(method == "Portnoy2") stop("Portnoy2 method not (yet) implemented") Surv <- survival::Surv call <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action"), names(mf), 0) mf <- mf[c(1, m)] mf$drop.unused.levels <- TRUE mf[[1]] <- as.name("model.frame") mf <- eval.parent(mf) if (method == "model.frame") return(mf) mt <- attr(mf, "terms") X <- model.matrix(mt, mf, contrasts) weights <- as.vector(model.weights(mf)) Y <- model.extract(mf, "response") eps <- .Machine$double.eps^(2/3) if(!inherits(Y,"Surv")) stop("Response must be a survival object") method <- match.arg(method) if(method == "Powell") { ctype <- attr(Y, "ctype") if(!ctype %in% c("right","left")) stop("Only right or left censoring Surv objects are allowed") left <- (ctype == "left") if (any(taus < -eps) || any(taus > 1 + eps)) stop("invalid taus: taus should be >= 0 and <= 1") y <- Y[,1] cen <- Y[,2] if (length(taus) > 1) { coef <- matrix(0, ncol(X), length(taus)) fitted <- resid <- matrix(0, nrow(X), length(taus)) for (i in 1:length(taus)) { z <- crq.fit.pow(X, y, cen, tau = taus[i], weights, left = left, ...) coef[, i] <- z$coefficients resid[, i] <- z$residuals fitted[, i] <- y - z$residuals } taulabs <- paste("tau=", format(round(taus, 3))) dimnames(coef) <- list(dimnames(X)[[2]], taulabs) dimnames(resid) <- list(dimnames(X)[[1]], taulabs) fit <- list(coefficients = coef, residuals = resid, fitted.values = fitted) fit$tau <- taus class(fit) <- "crqs" } else { fit <- crq.fit.pow(X, y, cen, tau = taus, weights, left = left, ...) fit$tau <- taus class(fit) <- "crq" } } else if(method == "Portnoy"){ ctype <- "right" if(attr(Y,"type") != "right"){ if(attr(Y,"type") == "left") ctype <- "left" else stop("Only right censoring Surv objects are allowed for Portnoy method") } y <- Y[,1] cen <- Y[,2] fit <- crq.fit.por(X, y, cen, weights, ctype = ctype, ...) class(fit) <- "crq" } else if(method == "Portnoy2"){ ctype <- "right" if(attr(Y,"type") != "right"){ if(attr(Y,"type") == "left") ctype <- "left" else stop("Only right censoring Surv objects are allowed for Portnoy method") } y <- Y[,1] cen <- Y[,2] fit <- crq.fit.por2(X, y, cen, weights, ctype = ctype, ...) class(fit) <- "crq" } else if(method == "PengHuang"){ ctype <- "right" if(attr(Y,"type") != "right"){ if(attr(Y,"type") == "left") ctype <- "left" else stop("Only right censoring Surv objects are allowed for Portnoy method") } y <- Y[,1] cen <- Y[,2] fit <- crq.fit.pen(X, y, cen, weights, ctype = ctype, ...) class(fit) <- "crq" } else stop("Method not defined for crq") fit$terms <- mt fit$call <- call fit$formula <- formula(mt) fit$method <- method fit$contrasts <- contrasts fit$ctype <- ctype attr(fit, "na.message") <- attr(m, "na.message") fit } predict.crqs <- function (object, newdata, type = NULL, ...) { pred <- predict.rqs(object, newdata, ...) } predict.crq <- function (object, newdata, ...) { method <- object$method if(method %in% c("Portnoy","Portnoy", "PengHuang")){ #Kludge to make crq sol matrix look like rq sol matrix p2 <- nrow(object$sol) object$sol <- object$sol[c(1,p2,p2,2:(p2-1)),] } pred <- switch(method, "Powell" = predict.rq(object, newdata, ...), "Portnoy" = predict.rq.process(object, newdata, ...), "Portnoy2" = predict.rq.process(object, newdata, ...), "PengHuang" = predict.rq.process(object, newdata, ...) ) } crq.fit.por <- function(x, y, cen, weights = NULL, grid, ctype = "right") { if(!is.matrix(x)) stop("x must be a matrix") if(!length(dimnames(x))) dimnames(x)[[2]] <- paste("V",1:p) p <- ncol(x) n <- length(y) cen <- 1 - cen #NB: Fortran routine wants censoring indicator flipped (!!!) mp <- max(n + 5 + max(1, sum(cen)),n+p) eps <- 1e-04 kmax <- 10000 # perhaps this should be parameter in future if(length(weights)){ if (any(weights < 0)) stop("negative weights not allowed") contr <- attr(x, "contrasts") x <- weights * x y <- weights * y } if(ctype == "left") y <- -y if(missing(grid)) grid <- seq(1/n,1-1/n,by=1/(5 + 3 * n^.4)) if(is.numeric(grid)){ ginit <- min(grid) dgrid <- diff(grid) gstep <- median(dgrid) if(any(dgrid <0)) stop("grid is not monotonic") if(gstep < eps) stop("grid stepsize too small") nsol <- 3*n mw = -1 } else if(grid == "pivot"){ nsol <- 3*n ginit <- 1/(2*n) gstep <- 1/(2*n) mw <- min(10, mp) # Somewhat arbitrary see crq.f } else stop("Invalid grid") z <- .Fortran("crqf", as.integer(n), as.integer(p), as.integer(mp), as.integer(p+2), as.double(x), as.double(y), as.integer(cen), as.double(ginit), as.integer(mw), as.double(gstep), ift = integer(1), h = integer(p), xh = double(p*p), wa = double(mp*p), wb = double(mp), wc = double(mp*(p+2)), wd = double(mp), we = double(mp), wf = double(p), iflag = integer(mp), as.integer(nsol), sol = double(nsol*(p+2)), lsol = integer(1), icen = integer(n), tcen = double(n), lcen = integer(1)) nw <- z$h[1] flag <- z$ift msg <- switch(flag, paste("Error in input dimensions, n,p,mw "), paste("Error in input dimensions, n,p,mw "), paste("Error in input dimensions, n,p,mw "), paste("Less than p=",p,"observations above tau = 0 solution"), paste("Possible degeneracy at",nw,"tau values.", "$tau.degen: first mp =", n + 5 + sum(cen)," such tau values"), paste("Number of pivots to be saved in sol > nsol.", "Redefine nsol: use nsol < n to save for tau = i/(nsol-1)"), paste("Error with partial return: possible degeneracies", "Max number of rq calls exceeded: dither x or increase mw"), paste("Premature stop: defective conditional distribution"), paste("Simplex iteration limit exceeded -- consider dithering y")) #if(flag > 0 && flag != 5 && flag < 10) if(flag %in% c(1:4,6,7)) ifelse(flag <= 3,stop(msg),warning(msg)) J <- z$lsol B <- matrix(z$sol, nrow=p+2, ncol=nsol, byrow=FALSE)[,1:J, drop = FALSE] if(B[1,J] < B[1,J-1]) B <- B[,-J] # SLP hack Oct 27 2014 ic <- z$icen sp <- (1:n)[ic == 1] tsp <- z$tcen[sp] t1 <- z$wd[1:nw] if(ctype == "left") { B[1,] <- 1 - B[1,] B[-1,] <- - B[-1,] B <- B[,ncol(B):1] } dimnames(B) <- list(c("tau",dimnames(x)[[2]],"Qbar"),NULL) a <- list(sol=B, Isplit=sp, tsp = tsp, status=ic, ctype = ctype) fitted <- x %*% B[-c(1,dim(B)[1]),] dimnames(fitted) <- list(NULL, paste("tau=",round(B[1,],4))) a$fitted.values <- fitted class(a) <- "crq" return(a) } crq.fit.pen <- function(x, y, cen, weights=NULL,grid, ctype = "right" ){ p <- ncol(x) n <- length(y) if(missing(grid)) grid <- seq(1/n,1-1/n,by=min(0.01,1/(2*length(y)^.7))) if(!is.numeric(grid)) stop("Invalid grid") if(any(grid < 0) || any(grid > 1)) stop("Invalid grid") m <- length(grid) xbar <- apply(x,2,mean) if(length(weights)){ if (any(weights < 0)) stop("negative weights not allowed") contr <- attr(x, "contrasts") x <- x * weights y <- y * weights } if(ctype == "left") y <- -y s <- rep(0,n) u <- rep(1,n) d <- rep(1,n) r <- rep(1,p) B <- matrix(0,p,m) cc <- as.logical(cen) y1 <- y[cc] n1 <- length(y1) x1 <- x[cc,] z <- .Fortran("crqfnb", as.integer(n), as.integer(p), a1 = as.double(t(as.matrix(x1))), c1 = as.double(-y1), n1=as.integer(n1), as.double(x), as.double(y),as.double(cen),B =as.double(B), g = as.double(grid),m = as.integer(m), as.double(r), as.double(s), as.double(d), as.double(u), wn = double(n1 * 9), wp = double((p + 3) * p), info = integer(1)) J <- z$m - 1 B <- matrix(-z$B, p, m) B <- B[,1:J,drop = FALSE] qhat <- t(xbar) %*% B B <- rbind(grid[1:J],B,qhat) dimnames(B) <- list(c("tau",dimnames(x)[[2]],"Qhat"),NULL) if(ctype == "left") { B[1,] <- 1 - B[1,] B[-1,] <- - B[-1,] B <- B[,ncol(B):1] } B <- list(sol=B, ctype = ctype) class(B) <- "crq" B } plot.summary.crqs <- function (x, nrow = 3, ncol = 3, CoxPHit = NULL, ...) { taus <- function(x) x$tau xx <- unlist(lapply(x, taus)) coef <- lapply(x, coefficients) dots <- list(...) p <- nrow(coef[[1]]) k <- ncol(coef[[1]]) if(k != 6) stop("summary.crqs object has wrong column dimension") m <- length(xx) blab <- dimnames(coef[[1]])[[1]] a <- array(unlist(coef), c(p, k, m)) if(length(CoxPHit)) CoxQTE <- QTECox(CoxPHit) oldpar <- par(no.readonly=TRUE) par(mfrow = c(nrow, ncol)) for (i in 2:p) { b <- a[i, 1, ] bl <- a[i, 2, ] bu <- a[i, 3, ] if(length(dots)) plot(rep(xx, 2), c(bl, bu), type = "n", ...) else plot(rep(xx, 2), c(bl, bu), xlab = "", ylab = "", type = "n") title(paste(blab[i]), cex = 0.75) polygon(c(xx, rev(xx)), c(bl, rev(bu)), col = "LightSkyBlue") points(xx, b, cex = 0.5, pch = "o", col = "blue") lines(xx, b, col = "blue") abline(h = 0) if(length(CoxPHit)) { lines(CoxQTE$taus,CoxQTE$QTE[,i-1],col="red") } } par(oldpar) } summary.crq <- function (object, taus = 1:4/5, alpha = .05, se = "boot", covariance = TRUE, ...) { mt <- terms(object) m <- model.frame(object) x <- model.matrix(mt, m, contrasts = object$contrasts) Y <- model.response(m) method <- object$method ctype <- object$ctype y <- Y[,1] cen <- Y[,2] wt <- as.vector(model.weights(object$model)) if (!is.null(wt)) { resid <- resid * wt x <- x * wt y <- y * wt cen <- cen * wt } if(method == "Powell"){ coef <- coefficients(object) vnames <- dimnames(x)[[2]] resid <- object$residuals tau <- object$tau n <- length(resid) p <- length(coef) rdf <- n - p if(rdf < 1) stop("residual degrees of freedom nonpositive") if (se == "boot") { if(attr(Y,"type") == "left") s <- cen < x %*% coef else s <- cen > x %*% coef B <- boot.rq(x[s, ], y[s], tau, ...) cov <- cov(B$B) serr <- sqrt(diag(cov)) } else stop("Only boot method is implemented for crq inference") coef <- array(coef, c(p, 6)) fact <- qt(1 - alpha/2, rdf) coef[, 2] <- coef[,2] - fact * serr coef[, 3] <- coef[,3] + fact * serr coef[, 4] <- serr coef[, 5] <- coef[, 1]/coef[, 4] coef[, 6] <- 2 * (1 - pt(abs(coef[, 5]),rdf)) cnames <- c("Value","Lower Bd","Upper Bd","Std Error","T Value","Pr(>|t|)") dimnames(coef) <- list(vnames, cnames) object <- object[c("call", "terms")] if (covariance == TRUE) object$cov <- cov object$B <- B object$coefficients <- coef object$rdf <- rdf object$tau <- tau class(object) <- "summary.crq" return(object) } else if(method == "Portnoy" || method == "Portnoy2" || method == "PengHuang") { if(length(taus) == 1) taus <- c(taus, taus) # Kludge to avoid dimensional errors coef <- as.matrix(coef(object,taus)) coef <- coef[,apply(coef,2,function(x) any(!is.na(x))),drop = FALSE] # Delete NA columns if any if(ctype == "right") taus <- taus[1:ncol(coef)] else taus <- taus[(1 + length(taus)-ncol(coef)):length(taus)] B <- boot.crq(x, y, cen, taus, method = method, ctype = ctype, ...) bmethod <- B$bmethod nas <- apply(is.na(B$A[1,,, drop = TRUE]),1,sum) Brep <- dim(B$A)[3] p <- dim(B$A)[1] if(bmethod == "jack") sqmn <- sqrt((B$n - B$mboot - p + 1)/B$mboot) else sqmn <- sqrt(B$mboot/B$n) fact <- qnorm(1 - alpha/2)/qnorm(.75) A <- apply(B$A, 1:2, quantile, probs = 1:3/4, na.rm = TRUE) #D <- .5 * fact *(A[3,,]-A[1,,]) * sqmn #L <- coef - D #U <- coef + D DU <- fact *(A[3,,]-A[2,,]) * sqmn DL <- fact *(A[2,,]-A[1,,]) * sqmn L <- coef - DL U <- coef + DU S <- (U - L)/(2 * qnorm(1 - alpha/2)) T <- coef/S P <- 2 * (1 - pnorm(abs(T))) G <- list() cnames <- c("Value","Lower Bd","Upper Bd","Std Error","T Value","Pr(>|t|)") for(i in 1:length(taus)){ tab <- cbind(coef[,i],L[,i],U[,i],S[,i],T[,i],P[,i]) dimnames(tab)[[2]] <- cnames if(covariance) cov <- var(t(B$A[,i,]), na.rm = TRUE) * sqmn^2 else cov <- NULL G[[i]] <- list(tau = taus[i], coefficients = tab, NAs = nas[i], cov = cov, Brep = Brep, bmethod = bmethod) } class(G) <- "summary.crqs" return(G) } else stop("Invalid method for summary.crq") } "summary.crqs" <- function (object, ...) { if(!object$method == "Powell") stop("Invalid method") taus <- object$tau xsum <- as.list(taus) for(i in 1:length(taus)){ xi <- object xi$coefficients <- xi$coefficients[,i] xi$residuals <- xi$residuals[,i] xi$tau <- xi$tau[i] class(xi) <- "crq" xsum[[i]] <- summary(xi, ...) } class(xsum) <- "summary.crqs" xsum } print.crq <- function(x, ...){ if(!is.null(cl <- x$call)) { cat("Call:\n") dput(cl) } coef <- coef(x, ...) cat("\nCoefficients:\n") print.default(coef) invisible(x) } print.summary.crqs <- function(x, ...) lapply(x,print.summary.crq) print.summary.crq <- function (x, digits = max(5, .Options$digits - 2), ...) { coef <- x$coefficients tau <- x$tau if(length(x$NAs)) NAs <- x$NAs else NAs <- 0 cat("\ntau: ") print(format(round(tau, digits = digits)), quote = FALSE, ...) if(NAs > 0) cat(paste(" Number of NA Bootstrap Replications: ", NAs, "out of", x$Brep)) cat("\nCoefficients:\n") print(format(round(coef, digits = digits)), quote = FALSE, ...) invisible(x) } # SLP: Mar 31 2015 (Revised RWK: Aug 2015) # An R version of crq.fit.por without any frills on a fixed grid. crq.fit.por2 <- function(x, y, cen, weights = NULL, grid, ctype = "right") { method <- "fn" BIG <- 1e+6 ztol <- 1e-6 n <- length(y) p <- ncol(x) cen <- as.logical(cen) uncen <- !cen if(sum(uncen) < p) stop("too few uncensored observations") sol <- matrix(NA, p+2,1) if (length(weights)) { if (any(weights < 0)) stop("negative weights not allowed") contr <- attr(x, "contrasts") x <- weights * x y <- weights * y } w <- rep(1,n) if (ctype == "left") y <- -y if(missing(grid)) { # Fixme: else if ... g0 <- 1/(2*n) dg <- 1/(5 + 3*n^.4) grid <- seq(g0,1-g0,by=dg) } repeat { # Peel censored points below g0 fit z <- rq.wfit(x, y, tau = g0, weights = w, method = method) J <- which(abs(z$resid) < ztol & cen) if(length(J)){ y <- y[-J] x <- x[-J,] w <- w[-J] cen <- cen[-J] } else break } n <- length(y) U <- which(cen) if(length(cen) == 0) { # No censored points left! z <- rq(y ~ x - 1, tau = grid, weights = w, method = method) return(coef(z)) } else { # Data Augmentation: m <- sum(cen) x <- rbind(x, x[cen, ]) y <- c(y, rep(BIG, m)) w[cen] <- 0 w <- c(w, rep(1, m)) } taw <- rep(0, length(y)) K <- NULL sol <- matrix(NA, p+2, length(grid)) b <- z$coef xbar <- apply(x, 2, mean) sol[,1] <- c(0, b, sum(xbar * b)) for(i in 2:length(grid)){ tau <- grid[i] if(length(K)){ # Update w w[K] <- (tau - taw[K])/(1 - taw[K]) idx <- which(which(cen) %in% K)[rank(K)] w[n + idx] <- 1 - w[K] } z <- rq.wfit(x, y, tau = tau, weights = w, method = method) b0 <- b b <- z$coef sol[,i] <- c(tau, b, sum(b * xbar)) if(any(abs(z$resid) < ztol & (y > BIG - 1))) break J <- U[z$resid[U] < 0] if(length(J)){ U <- setdiff(U, J) K <- union(K, J) y0 <- x[J,,drop = FALSE] %*% b0 y1 <- y[J] - z$resid[J] gstep <- grid[i] - grid[i-1] taw[J] <- tau - gstep * (y1 - y[J])/(y1 - y0) } } if (ctype == "left") { sol[1, ] <- 1 - sol[1, ] sol[-1, ] <- -sol[-1, ] } dimnames(sol) <- list(c("tau", dimnames(x)[[2]], "Qbar"), NULL) return(list(sol = sol, ctype = ctype)) } quantreg/R/table.R0000644000176200001440000004350513735334754013540 0ustar liggesusers"latex" <- function(x, ...) UseMethod("latex") "latex.summary.rqs" <- function (x, transpose = FALSE, caption = "caption goes here.", digits = 3, file = as.character(substitute(x)), ...) { taus <- function(x) x$tau taus <- unlist(lapply(x,taus)) taus <- format(round(taus, digits)) coef <- lapply(x,coefficients) p <- nrow(coef[[1]]) k <- ncol(coef[[1]]) m <- length(taus) rlab <- dimnames(coef[[1]])[[1]] clab <- taus a <- format(round(array(unlist(coef),c(p,k,m)),digits = digits)) table <- matrix("", p, m) for (i in 1:m) { for (j in 1:p) { if (k == 3) { table[j, i] <- paste("$\\underset{(", a[j, 2, i], ",", a[j, 3, i], ")}{", a[j, 1, i], "}$", sep="") } else if (k == 4) { table[j, i] <- paste("$\\underset{(", a[j,2,i] , ")}{", a[j,1, i], "}$",sep="") } } } rowlabel <- "Covariates" dimnames(table) <- list(rlab, clab) if(transpose) { table <- t(table) rowlabel <- "Quantiles" } latex.table(table, caption = caption, rowlabel = rowlabel, file = file, ...) invisible() } "latex.table.rq" <- function(x, ...) { cat("table.rq and related methods are defunct -- see rq, which now accepts a vector of taus.") } "plot.table.rq" <- function(x, ...){ cat("table.rq() and related methods are defunct -- see ?rq, which now accepts a vector of taus.") } "table.rq" <- function(x, ...){ cat("table.rq() and related methods are defunct -- see ?rq, which now accepts a vector of taus.") } plot.rqs <- function(x, parm = NULL, ols = TRUE, mfrow = NULL, mar = NULL, ylim = NULL, main = NULL, col = 1:2, lty = 1:2, cex = 0.5, pch = 20, type = "b", xlab = "", ylab = "", ...) { ## extract taus taus <- x$tau ## obtain rq coefficients (in "parm") cf <- coef(x) if(is.null(parm)) parm <- rownames(cf) if(is.numeric(parm)) parm <- rownames(cf)[parm] cf <- cf[parm,,drop = FALSE] ## obtain OLS coefficients if(ols) { obj <- x mt <- terms(x) mf <- model.frame(x) y <- model.response(mf) X <- model.matrix(mt, mf, contrasts = x$contrasts) olscf <- lm.fit(X, y)$coefficients[parm] } ## plotting parameters mfrow_orig <- par("mfrow") mar_orig <- par("mar") if(is.null(mfrow)) mfrow <- n2mfrow(length(parm)) if(is.null(mar)) mar <- c(3.1, 3.1, 3.1, 1.6) par(mfrow = mfrow, mar = mar) col <- rep(col, length.out = 2) lty <- rep(lty, length.out = 2) if(is.null(main)) main <- parm main <- rep(main, length.out = length(parm)) xlab <- rep(xlab, length.out = length(parm)) ylab <- rep(ylab, length.out = length(parm)) ## actual plotting ylim0 <- ylim for (i in seq(along = parm)) { if(is.null(ylim)){ if(ols) ylim <- range(c(cf[i, ], olscf[i])) else ylim <- range(cf[i,]) } plot(taus, cf[i, ], cex = cex, pch = pch, type = type, col = col[1], ylim = ylim, xlab = xlab[i], ylab = ylab[i], main = main[i], ...) if (ols) abline(h = olscf[i], col = col[2], lty = 2) abline(h = 0, col = gray(0.3)) ylim <- ylim0 } ## restore original par settings par(mfrow = mfrow_orig, mar = mar_orig) if(ols) invisible(cbind(cf, ols = olscf)) else invisible(cf) } plot.summary.rqs <- function(x, parm = NULL, level = 0.9, ols = TRUE, mfrow = NULL, mar = NULL, ylim = NULL, main = NULL, col = gray(c(0, 0.75)), border = NULL, lcol = 2, lty = 1:2, cex = 0.5, pch = 20, type = "b", xlab = "", ylab = "", ...) { ## normal quantile zalpha <- qnorm(1 - (1-level)/2) ## extract taus taus <- sapply(x, function(x) x$tau) ## obtain rq coefficients cf <- lapply(x, coef) if(ncol(cf[[1]]) == 4) { for(i in 1:length(cf)) { cfi <- cf[[i]] cfi <- cbind(cfi[,1], cfi[,1] - cfi[,2] * zalpha, cfi[,1] + cfi[,2] * zalpha) colnames(cfi) <- c("coefficients", "lower bd", "upper bd") cf[[i]] <- cfi } } if(ncol(cf[[1]]) != 3) stop("summary.rqs components have wrong dimension") ## extract only coefficients in "parm" if(is.null(parm)) parm <- rownames(cf[[1]]) if(is.numeric(parm)) parm <- rownames(cf[[1]])[parm] cf <- lapply(cf, function(x) x[parm,,drop=FALSE]) names(cf) <- paste("tau=", taus) ## obtain OLS coefficients if(ols) { obj <- x[[1]] mt <- terms(obj) mf <- model.frame(obj) y <- model.response(mf) X <- model.matrix(mt, mf, contrasts = obj$contrasts) olscf <- summary(lm(y ~ X))$coefficients rownames(olscf) <- rownames(coef(obj)) olscf <- cbind(olscf[parm,1,drop=FALSE], olscf[parm,1,drop=FALSE] - olscf[parm,2,drop=FALSE] * zalpha, olscf[parm,1,drop=FALSE] + olscf[parm,2,drop=FALSE] * zalpha) colnames(olscf) <- c("coefficients", "lower bd", "upper bd") } ## plotting parameters mfrow_orig <- par("mfrow") mar_orig <- par("mar") if(is.null(mfrow)) mfrow <- n2mfrow(length(parm)) if(is.null(mar)) mar <- c(3.1, 3.1, 3.1, 1.6) par(mfrow = mfrow, mar = mar) col <- rep(col, length.out = 2) lty <- rep(lty, length.out = 2) if(is.null(border)) border <- col[2] if(is.null(main)) main <- parm main <- rep(main, length.out = length(parm)) xlab <- rep(xlab, length.out = length(parm)) ylab <- rep(ylab, length.out = length(parm)) ## actual plotting ylim0 <- ylim Ylim <- NULL if(is.matrix(ylim0)) if((nrow(ylim0) != 2) || ncol(ylim0) != length(parm)) stop("ylim matrix of incompatible dimensions") for(i in seq(along = parm)) { b <- t(sapply(seq(along = cf), function(tau) cf[[tau]][i, ])) if(is.matrix(ylim0)) ylim <- ylim0[,i] if(is.null(ylim0)){ if(ols) ylim <- range(c(b[,2], b[,3], olscf[i])) else ylim <- range(b[,2],b[,3]) } plot(rep(taus, 2), c(b[,2], b[,3]), type = "n", ylim = ylim, xlab = xlab[i], ylab = ylab[i], main = main[i]) polygon(c(taus, rev(taus)), c(b[,2], rev(b[,3])), col = col[2], border = border) points(taus, b[,1], cex = cex, pch = pch, type = type, col = col[1], ...) if(ols) { abline(h = olscf[i, 1], col = lcol, lty = lty[1]) abline(h = olscf[i, 2], col = lcol, lty = lty[2]) abline(h = olscf[i, 3], col = lcol, lty = lty[2]) } abline(h = 0, col = gray(0.3)) Ylim <- cbind(Ylim, ylim) } ## restore original par settings and return par(mfrow = mfrow_orig, mar = mar_orig) if(ols) x <- c(cf, list(ols = olscf)) else x <- cf invisible(list(structure(as.vector(unlist(x)), .Dim = c(dim(x[[1]]), length(x)), .Dimnames = list(rownames(x[[1]]), colnames(x[[1]]), names(x))),Ylim = Ylim)) } "latex.table" <- function (x, file = as.character(substitute(x)), rowlabel = file, rowlabel.just = "l", cgroup, n.cgroup, rgroup, n.rgroup = NULL, digits, dec, rdec, cdec, append = FALSE, dcolumn = FALSE, cdot = FALSE, longtable = FALSE, table.env = TRUE, lines.page = 40, caption, caption.lot, label = file, double.slash = FALSE, ...) { nc <- ncol(x) nr <- nrow(x) if (missing(caption) & !missing(caption.lot)) warning("caption.lot is ignored unless caption is specified") if (!longtable & !table.env & !missing(caption)) stop("you must have table.env=TRUE if caption is given") if (!missing(digits)) .Options$digits <- digits sl <- if (double.slash) "\\\\" else "\\" rlj <- if (rowlabel.just == "l") "l" else "c" if (!missing(dec)) { if (length(dec) == 1) x <- round(x, dec) else { if (!is.matrix(dec) || nrow(dec) != nrow(x) || ncol(dec) != ncol(x)) stop("dimensions of dec do not match those of x") for (i in 1:nr) for (j in 1:nc) x[i, j] <- round(x[i, j], dec[i, j]) } cx <- format(x) } else if (!missing(rdec)) { cx <- NULL for (i in 1:nr) { x[i, ] <- round(x[i, ], rdec[i]) cx <- rbind(cx, format(x[i, ])) } } else if (!missing(cdec)) { cx <- NULL for (j in 1:nc) { x[, j] <- round(x[, j], cdec[j]) cx <- cbind(cx, format(x[, j])) } } else cx <- format(x) cx[is.na(x)] <- "" if (dcolumn) sep <- "." else { #cx <- translate(cx, " ", "~") cx <- matrix(chartr(" ", "~", cx), nrow=nr) if (cdot) { #cx <- translate(cx, "[.]", "\\\\cdot", multichar = TRUE) cx <- gsub("[.]", "\\\\cdot", cx) cx <- matrix(paste("$", cx, "$", sep = ""), nrow = nr) cx[is.na(x)] <- "" } sep <- "c" } if (is.null(n.rgroup) && !missing(rgroup)) n.rgroup <- rep(nr/length(rgroup), length(rgroup)) if (!is.null(n.rgroup) && sum(n.rgroup) != nr) stop("sum of n.rgroup must equal number of rows in x") if (!missing(rgroup) && !is.null(n.rgroup) && (length(rgroup) != length(n.rgroup))) stop("lengths of rgroup and n.rgroup must match") fi <- paste(file, ".tex", sep = "") rowname <- dimnames(x)[[1]] if (length(rowname) == 0) { rowname <- NULL rowlabel <- NULL if (!missing(rgroup)) stop("you must have row dimnames to use rgroup") } #start new file if (!append) cat("", file = fi) cat("%", deparse(match.call()), "\n%\n", file = fi, append = TRUE) if (dcolumn) cat(sl, "newcolumn{.}{D{.}{", sl, "cdot}{-1}}\n", file = fi, append = TRUE) if (!is.null(rowlabel)) form <- paste("|", rowlabel.just, "|", sep = "") else form <- "" f <- paste("|", sep, sep = "", collapse = "") if (missing(cgroup)) ff <- c(rep(f, nc), "|") else { k <- length(cgroup) if (missing(n.cgroup)) n.cgroup <- rep(nc/k, k) if (sum(n.cgroup) != nc) stop("sum of n.cgroup must equal number of columns") if (length(n.cgroup) != length(cgroup)) stop("cgroup and n.cgroup must have same lengths") ff <- NULL for (i in 1:k) ff <- c(ff, rep(f, n.cgroup[i]), "|") } form <- paste(form, paste(ff, collapse = ""), sep = "") #if(missing(cgroup)) hline <- "" else hline <- paste(sl,"hline",sep="") hline <- "" if (!missing(caption)) caption <- paste(sl, "caption", if (missing(caption.lot)) NULL else paste("[", caption.lot, "]", sep = ""), "{", caption, if (longtable) NULL else paste(sl, "label{", label, "}", sep = ""), "}", sep = "") if (!longtable) { if (table.env){ cat(sl, "begin{table}[hptb]\n", sep = "", file = fi, append = TRUE) cat(caption, "\n", sep = "", file = fi, append = TRUE) } cat(sl, "begin{center}\n", file = fi, sep = "", append = TRUE) cat(sl, "begin{tabular}{", form, "} ", sl, "hline", hline, "\n", sep = "", file = fi, append = TRUE) } else { cat(paste(sl, "setlongtables", sep = ""), paste(sl, "begin{longtable}{", form, "}", sep = ""), sep = "\n", file = fi, append = TRUE) if (!missing(caption)) cat(caption, sl, sl, "\n", sep = "", file = fi, append = TRUE) cat(sl, "hline", hline, "\n", sep = "", file = fi, append = TRUE) } if (!missing(cgroup)) { cgroup <- paste(sl, "bf ", cgroup, sep = "") if (is.null(rowlabel)) { labs <- c(paste(sl, "multicolumn{", n.cgroup[1], "}{|c||}{", cgroup[1], "}", sep = "", collapse = ""), if (k > 2) paste(sl, "multicolumn{", n.cgroup[c(-1, -k)], "}{c||}{", cgroup[c(-1, -k)], "}", sep = "") else NULL, paste(sl, "multicolumn{", n.cgroup[k], "}{c|}{", cgroup[k], "}", sep = "")) g <- paste(sl, "hline", sep = "") } else { rowlabel <- paste(sl, "bf ", rowlabel, sep = "") labs <- c(paste(sl, "multicolumn{1}{|", rlj, "||}{", rowlabel, "}", sep = ""), paste(sl, "multicolumn{", n.cgroup[-k], "}{c||}{", cgroup[-k], "}", sep = ""), paste(sl, "multicolumn{", n.cgroup[k], "}{c|}{", cgroup[k], "}", sep = "")) g <- paste(sl, "cline{2-", nc + 1, "}", sep = "") } cat(labs, file = fi, sep = "&", append = TRUE) cat(sl, sl, " ", g, "\n", sep = "", file = fi, append = TRUE) if (!is.null(rowlabel)) rowlabel <- "" } collabel <- dimnames(x)[[2]] if (is.null(collabel)) collabel <- as.character(1:nc) labs <- c(rowlabel, collabel) if (missing(cgroup)) { if (is.null(rowlabel)) pre <- c(paste(sl, "multicolumn{1}{|c|}{", sep = ""), rep(paste(sl, "multicolumn{1}{c|}{", sep = ""), nc - 1)) else pre <- c(paste(sl, "multicolumn{1}{|", rlj, "||}{", sep = ""), rep(paste(sl, "multicolumn{1}{c|}{", sep = ""), nc)) } else { if (is.null(rowlabel)) { pre <- NULL j <- 0 for (i in 1:k) { if (n.cgroup[i] > 1) { g <- rep(paste(sl, "multicolumn{1}{c|}{", sep = ""), n.cgroup[i] - 1) if (j == 0) g[1] <- paste(sl, "multicolumn{1}{|c|}{", sep = "") pre <- c(pre, g) } j <- j + n.cgroup[i] if (j == 1) g <- paste(sl, "multicolumn{1}{|c||}{", sep = "") else if (j < nc) g <- paste(sl, "multicolumn{1}{c||}{", sep = "") else g <- paste(sl, "multicolumn{1}{c|}{", sep = "") pre <- c(pre, g) } } else { pre <- paste(sl, "multicolumn{1}{|", rlj, "||}{", sep = "") j <- 0 for (i in 1:k) { pre <- c(pre, rep(paste(sl, "multicolumn{1}{c|}{", sep = ""), n.cgroup[i] - 1)) j <- j + n.cgroup[i] if (j < nc) g <- paste(sl, "multicolumn{1}{c||}{", sep = "") else g <- paste(sl, "multicolumn{1}{c|}{", sep = "") pre <- c(pre, g) } } } labs <- paste(pre, labs, "}", sep = "") cat(labs, file = fi, sep = "&", append = TRUE) cat(sl, sl, " ", sl, "hline", hline, "\n", sep = "", file = fi, append = TRUE) if (longtable) { if (missing(caption)) cat(sl, "endhead\n", sl, "hline", sl, "endfoot\n", sep = "", file = fi, append = TRUE) else { cat(sl, "endfirsthead\n", sep = "", file = fi, append = TRUE) if (!missing(caption)) cat(sl, "caption[]{\\em (continued)} ", sl, sl, "\n", sep = "", file = fi, append = TRUE) cat(sl, "hline", hline, "\n", sep = "", file = fi, append = TRUE) cat(labs, file = fi, sep = "&", append = TRUE) cat(sl, sl, " ", sl, "hline", hline, "\n", sl, "endhead", sl, "hline", sl, "endfoot\n", sep = "", file = fi, append = TRUE) cat(sl, "label{", label, "}\n", sep = "", file = fi, append = TRUE) } } if (is.null(n.rgroup)) rg.end <- 0 else { rg.end <- cumsum(n.rgroup) rg.start <- rg.end - n.rgroup + 1 if (missing(rgroup)) rgroup <- rep("", length(n.rgroup)) else rgroup <- paste("{", sl, "bf ", rgroup, "}", sep = "") } linecnt <- 0 for (i in 1:nr) { if (!missing(rgroup)) { k <- rg.start == i if (any(k)) { j <- (1:length(n.rgroup))[k] if (longtable && linecnt > 0 && (linecnt + n.rgroup[j] + (n.rgroup[j] > 1)) > lines.page) { cat(sl, "newpage\n", sep = "", file = fi, append = TRUE) linecnt <- 0 } if (n.rgroup[j] > 1) { cat(rgroup[j], rep("", nc), file = fi, sep = "&", append = TRUE) linecnt <- linecnt + 1 cat(sl, sl, "\n", sep = "", file = fi, append = TRUE) } l <- rg.start[j]:rg.end[j] if (length(l) > 1) rowname[l] <- paste("~~", rowname[l], sep = "") else rowname[l] <- paste("{", sl, "bf ", rowname[l], "}", sep = "") } } else if (longtable && linecnt > 0 && (linecnt + 1 > lines.page)) { cat(sl, "newpage\n", sep = "", file = fi, append = TRUE) linecnt <- 0 } cat(c(rowname[i], cx[i, ]), file = fi, sep = "&", append = TRUE) linecnt <- linecnt + 1 if (i < nr && any(rg.end == i)) g <- paste(sl, "hline", sep = "") else g <- "" cat(sl, sl, " ", g, "\n", sep = "", file = fi, append = TRUE) } cat(sl, "hline", hline, "\n", sep = "", file = fi, append = TRUE) if (longtable) cat(sl, "end{longtable}\n", sep = "", file = fi, append = TRUE) else { cat(sl, "end{tabular}\n", sep = "", file = fi, append = TRUE) if (!missing(caption)) { cat(sl, "vspace{3mm}\n", sep = "", file = fi, append = TRUE) #cat(caption, "\n", file = fi, append = TRUE) } #cat(caption, "\n", file = fi, append = TRUE) cat(sl, "end{center}\n", sep = "", file = fi, append = TRUE) if (table.env) cat(sl, "end{table}\n", sep = "", file = fi, append = TRUE) } invisible() } "table.rq" <- function (x, ...) stop("table.rq now defunct, rq() now accepts vector tau argument. See ?rq.") quantreg/R/sfn.R0000644000176200001440000002174213742063653013231 0ustar liggesusers#WARNING -- needs considerable work to finish implementing sfn.control fix. #----------------------------------------------------------------------------- # Storage parameters and other controls for sfn fitting # nsubmax = upper bound of dimension of lindx # tmpmax = upper bound for the dimension of tmpvec # nnzlmax = maximum number of non-zero elements in L # cachsz = size of the cache memory; it's machine dependent # small = the tolerance used to check for convergence # maxiter = allowed limit for sfn iterations # warn.mesg = flag to control printing of warnings # sfn.control <- function( nsubmax = NULL, tmpmax = NULL, nnzlmax = NULL, cachsz = 64, small = 1e-6, maxiter=100, warn.mesg=TRUE) list(nsubmax = nsubmax, tmpmax = tmpmax, nnzlmax = nnzlmax, cachsz = cachsz, small = small, maxiter = maxiter, warn.mesg = warn.mesg) ################################################################# # Interface for a sparse implementation of LMS interior point method # a = structure of the design matrix A' stored in csr format # y = pseudo response vector # tau = the desired regression quantile # rhs = the rhs of the dual problem -- specify at your own risk ################################################################# rq.fit.sfn <- function(a,y,tau=.5, rhs = (1-tau)*c(t(a) %*% rep(1,length(y))), control) { y <- -y n <- length(y) m <- a@dimension[2] if(n != a@dimension[1]) stop("Dimensions of design matrix and the response vector not compatible") u <- rep(1,length=n) x <- rep((1-tau),length=n) nnzdmax <- nnza <- a@ia[n+1]-1 iwmax <- 7*m+3 ao <- t(a) e <- ao %*% a nnzemax <- e@ia[m+1]-1 ctrl <- sfn.control() if (!missing(control)) { control <- as.list(control) ctrl[names(control)] <- control } nsubmax <- ctrl$nsubmax tmpmax <- ctrl$tmpmax nnzlmax <- ctrl$nnzlmax if (is.null(ctrl$nsubmax)) ctrl$nsubmax <- nsubmax <- nnzemax if (is.null(ctrl$tmpmax)) ctrl$tmpmax <- tmpmax <- 6 * m if (is.null(ctrl$nnzlmax)) ctrl$nnzlmax <- nnzlmax <- 4 * nnzdmax wwm <- vector("numeric",3*m) s <- u - x b1 <- solve(e, ao %*% y, tmpmax=tmpmax,nnzlmax=nnzlmax,nsubmax=nsubmax) r <- y - a %*% b1 z <- ifelse(abs(r)0)+ctrl$small),r*(r>0)) w <- z - r wwn <- matrix(0,n,14) wwn[,1] <- r wwn[,2] <- z wwn[,3] <- w fit <- .Fortran("srqfn", n = as.integer(n), m = as.integer(m), nnza = as.integer(nnza), a = as.double(a@ra), ja = as.integer(a@ja), ia = as.integer(a@ia), ao = as.double(ao@ra), jao = as.integer(ao@ja), iao = as.integer(ao@ia), nnzdmax = as.integer(nnzdmax), d = double(nnzdmax), jd = integer(nnzdmax), id = integer(m+1), dsub = double(nnzemax+1), jdsub = integer(nnzemax+1), nnzemax = as.integer(nnzemax), e = as.double(e@ra), je = as.integer(e@ja), ie = as.integer(e@ia), nsubmax = as.integer(nsubmax), lindx = integer(nsubmax), xlindx = integer(m+1), nnzlmax = as.integer(nnzlmax), lnz = double(nnzlmax), xlnz = integer(m+1), iw = integer(m*5), iwmax = as.integer(iwmax), iwork = integer(iwmax), xsuper = integer(m+1), tmpmax = as.integer(tmpmax), tmpvec = double(tmpmax), wwm = as.double(wwm), wwn = as.double(wwn), cachsz = as.integer(ctrl$cachsz), level = as.integer( 8 ), x = as.double(x), s = as.double(s), u = as.double(u), c = as.double(y), sol = as.double(b1), rhs = as.double(rhs), small = as.double(ctrl$small), ierr = integer(1), maxiter = as.integer(ctrl$maxiter), time = double(7))[c("sol","ierr","maxiter","time")] ierr <- fit$ierr if(!(ierr==0) && ctrl$warn.mesg) warning(sfnMessage(ierr)) coefficients <- -fit$sol residuals <- -y - a %*% coefficients list(coefficients = coefficients, residuals = residuals, control = ctrl, ierr = ierr, it = fit$maxiter) } #------------------------------------------------------------------------------ ################################################################# # Interface for a sparse implementation of LMS interior point method # x = structure of A1' stored in csr format # y = pseudo response vector # m = column dimension of A1' in full mode # R = structure of the constraint matrix A2' stored in csr format # r = rhs of the inequality constraints # tau = the desired regression quantile # rhs = the rhs of the dual problem -- specify at your own risk ################################################################# rq.fit.sfnc <- function(x, y, R, r, tau = 0.5, rhs = (1-tau)*c(t(x) %*% rep(1,length(y))),control) { y <- -y r <- -r n1 <- length(y) m <- x@dimension[2] if(n1 != x@dimension[1]) stop("The design matrix A1' and response vector y are not compatible") n2 <- length(r) if(n2 != R@dimension[1]) stop("The constraint matrix A2' and constraint rhs are not compatible") maxn1n2 <- max(n1,n2) u <- rep(1,length=n1) x1 <- rep(1-tau,length=n1) x2 <- rep(1,length=n2) wwm <- vector("numeric",6*m) wwm[1:m] <- rhs nnzx <- x@ia[x@dimension[1]+1]-1 nnzR <- R@ia[R@dimension[1]+1]-1 nnzdmax <- max(nnzx,nnzR) iwmax <- 7*m+3 ao1 <- t(x) ao2 <- t(R) e <- ao1 %*% x g <- ao2 %*% R h <- e + g nnzemax <- e@ia[e@dimension[1]+1]-1 nnzgmax <- g@ia[g@dimension[1]+1]-1 nnzhmax <- h@ia[h@dimension[1]+1]-1 ctrl <- sfn.control() if (!missing(control)) { control <- as.list(control) ctrl[names(control)] <- control } nsubmax <- ctrl$nsubmax tmpmax <- ctrl$tmpmax nnzlmax <- ctrl$nnzlmax if (is.null(ctrl$nsubmax)) nsubmax <- nnzhmax if (is.null(ctrl$tmpmax)) tmpmax <- 6 * m if (is.null(ctrl$nnzlmax)) nnzlmax <- 4 * nnzdmax s <- u - x1 chol.o <- chol(e, tmpmax=tmpmax, nsubmax=nsubmax, nnzlmax=nnzlmax) b <- backsolve(chol.o, ao1 %*% y) r1 <- y - x %*% b z1 <- ifelse(abs(r1) < ctrl$small, (r1*(r1>0)+ctrl$small), r1*(r1>0)) w <- z1 - r1 z2 <- rep(1,n2) wwn1 <- matrix(0,n1,10) wwn1[,1] <- z1 wwn1[,2] <- w wwn2 <- matrix(0,n2,7) wwn2[,2] <- z2 fit <- .Fortran("srqfnc", n1 = as.integer(n1), m = as.integer(m), nnzx = as.integer(nnzx), x = as.double(x@ra), jx = as.integer(x@ja), ix = as.integer(x@ia), ao1 = as.double(ao1@ra), jao1 = as.integer(ao1@ja), iao1 = as.integer(ao1@ia), n2 = as.integer(n2), nnzR = as.integer(nnzR), R = as.double(R@ra), jR = as.integer(R@ja), iR = as.integer(R@ia), ao2 = as.double(ao2@ra), jao2 = as.integer(ao2@ja), iao2 = as.integer(ao2@ia), nnzdmax = as.integer(nnzdmax), d = double(nnzdmax), jd = integer(nnzdmax), id = integer(m+1), dsub = double(nnzhmax+1), jdsub = integer(nnzhmax+1), nnzemax = as.integer(nnzemax), e = as.double(e@ra), je = as.integer(e@ja), ie = as.integer(e@ia), nnzgmax = as.integer(nnzgmax), g = double(nnzgmax), jg = integer(nnzgmax), ig = integer(m+1), nnzhmax = as.integer(nnzhmax), h = double(nnzhmax), jh = integer(nnzhmax), ih = integer(m+1), nsubmax = as.integer(nsubmax), lindx = integer(nsubmax), xlindx = integer(m+1), nnzlmax = as.integer(nnzlmax), lnz = double(nnzlmax), xlnz = integer(m+1), iw = integer(m*5), iwmax = as.integer(iwmax), iwork = integer(iwmax), xsuper = integer(m+1), tmpmax = as.integer(tmpmax), tmpvec = double(tmpmax), maxn1n2 = as.integer(maxn1n2), ww1 = double(maxn1n2), wwm = as.double(wwm), wwn1 = as.double(wwn1), wwn2 = as.double(wwn2), cachsz = as.integer(ctrl$cachsz), level = as.integer( 8 ), x1 = as.double(x1), x2 = as.double(x2), s = as.double(s), u = as.double(u), c1 = as.double(y), c2 = as.double(r), sol = as.double(b), small = as.double(ctrl$small), ierr = integer(1), maxiter = as.integer(ctrl$maxiter), time = double(7))[c("sol","ierr","maxiter","time")] ierr <- fit$ierr if(ierr == 13)# stop() stop("Increase nnzh.factor") if(!(ierr==0) && ctrl$warn.mesg) warning(sfnMessage(ierr)) coefficients <- -fit$sol residuals <- -y - x %*% coefficients list(coefficients = coefficients, residuals = residuals, control = ctrl, ierr = ierr, it = fit$maxiter) } "sfnMessage" <- function(ierr){ switch(ierr, "insufficient storage (work space) when calling extract\n", "nnzd > nnzdmax\n", "insufficient storage in iwork when calling ordmmd\n", "insufficient storage in iwork when calling sfinit\n", "nnzl > nnzlmax when calling sfinit\n", "nsub > nsubmax when calling sfinit\n", "insufficient work space in iwork when calling symfct\n", "inconsistancy in input when calling symfct\n", "tmpsiz > tmpmax when calling bfinit; increase tmpmax\n", "nonpositive diagonal encountered blkfct() matrix is not positive definite\n", "insufficient work storage in tmpvec when calling blkfct\n", "insufficient work storage in iwork when calling blkfct\n", "impossible error condition", "impossible error condition", "impossible error condition", "impossible error condition", "tiny diagonals replaced with Inf when calling blkfct\n") } quantreg/R/tools.R0000644000176200001440000000031411555564235013575 0ustar liggesusers"FAQ" <- function(pkg = "quantreg") file.show(file.path(system.file(package = pkg),"FAQ")) "ChangeLog" <- function(pkg = "quantreg") file.show(file.path(system.file(package = pkg),"ChangeLog")) quantreg/R/dynrq.R0000644000176200001440000002225114247331626013573 0ustar liggesusersdynrq <- function (formula, tau = 0.5, data, subset, weights, na.action, method = "br", contrasts = NULL, start = NULL, end = NULL, ...) { stopifnot(requireNamespace("zoo", quietly = TRUE)) Zenv <- new.env(parent = environment(formula)) assign("dynformula", function(x) structure(x, class = unique(c("dynformula", oldClass(x)))), envir = Zenv) assign("L", function(x, k = 1) { if (length(k) > 1) { rval <- lapply(k, function(i) lag(x, k = -i)) rval <- if (inherits(x, "ts")) do.call("ts.intersect", rval) else do.call("zoo::merge.zoo", c(rval, list(all = FALSE))) colnames(rval) <- k } else { rval <- lag(x, k = -k) } return(rval) }, envir = Zenv) assign("d", function(x, lag = 1) diff(x, lag = lag), envir = Zenv) assign("season", function(x, ref = NULL) { freq <- frequency(x) stopifnot(freq > 1 && identical(all.equal(freq, round(freq)), TRUE)) freq <- ofreq <- round(freq) freq <- if (freq == 12) month.abb else if (freq == 4) paste("Q", 1:4, sep = "") else 1:freq rval <- factor(zoo::coredata(cycle(x)), labels = freq) if (!is.null(ref)) rval <- relevel(rval, ref = ref) rval <- zoo::zoo(rval, zoo::index(x), ofreq) return(rval) }, envir = Zenv) assign("trend", function(x, scale = TRUE) { freq <- ofreq <- if (inherits(x, "ts")) frequency(x) else attr(x, "frequency") if (is.null(freq) | !scale) freq <- 1 stopifnot(freq >= 1 && identical(all.equal(freq, round(freq)), TRUE)) freq <- round(freq) rval <- zoo::zoo(seq_along(zoo::index(x))/freq, zoo::index(x), frequency = ofreq) return(rval) }, envir = Zenv) assign("harmon", function(x, order = 1) { freq <- frequency(x) stopifnot(freq > 1 && identical(all.equal(freq, round(freq)), TRUE)) freq <- round(freq) order <- round(order) stopifnot(order <= freq/2) rval <- outer(2 * pi * zoo::index(x), 1:order) rval <- cbind(apply(rval, 2, cos), apply(rval, 2, sin)) colnames(rval) <- if (order == 1) { c("cos", "sin") } else { c(paste("cos", 1:order, sep = ""), paste("sin", 1:order, sep = "")) } if ((2 * order) == freq) rval <- rval[, -(2 * order)] return(rval) }, envir = Zenv) assign("model.frame.dynformula", function(formula, data = NULL, subset = NULL, na.action = na.omit, drop.unused.levels = FALSE, xlev = NULL, ...) { if (is.null(data)) data <- parent.frame() if (!is.list(data)) data <- as.list(data) args <- as.list(attr(terms(formula), "variables"))[-1] args$retclass <- "list" args$all <- FALSE formula <- terms(formula) attr(formula, "predvars") <- as.call(append(zoo::merge.zoo, args)) attr(formula, "predvars")[[1]] <- as.name("merge.zoo") NextMethod("model.frame", formula = formula) }, envir = Zenv) if (missing(data)) data <- Zenv orig.class <- if (is.data.frame(data) || is.environment(data)) class(eval(attr(terms(formula), "variables")[[2]], data, Zenv)) else class(data) cl <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action"), names(mf), 0) mf <- mf[c(1, m)] mf$drop.unused.levels <- TRUE mf[[1]] <- as.name("model.frame") mf[[2]] <- as.call(list(as.name("dynformula"), mf[[2]])) mf <- eval(mf, envir = Zenv) mfna <- attr(mf, "na.action") if (length(zoo::index(mf[, 1])) > nrow(mf)) { for (i in 1:NCOL(mf)) attr(mf[, i], "index") <- attr(mf[, i], "index")[-as.vector(mfna)] } is.zoofactor <- function(x) !is.null(attr(x, "oclass")) && attr(x, "oclass") == "factor" for (i in 1:NCOL(mf)) if (is.zoofactor(mf[, i])) mf[, i] <- zoo::coredata(mf[, i]) mf1 <- mf[, 1] start <- if (is.null(start)) 1 else { if (length(start) > 1) start <- start[1] + (start[2] - 1)/frequency(mf1) start <- min(which(zoo::index(mf1) >= start)) } end <- if (is.null(end)) length(mf1) else { if (length(end) > 1) end <- end[1] + (end[2] - 1)/frequency(mf1) end <- max(which(zoo::index(mf1) <= end)) } if (end < start) { warning("empty model frame specified") mf <- head(mf, 0) mf1 <- head(mf1, 0) } else { mf <- mf[start:end, , drop = FALSE] mf1 <- mf1[start:end] if (!is.null(mfna)) attr(mf, "na.action") <- mfna[as.vector(mfna) >= start & as.vector(mfna) <= end] } if ("ts" %in% orig.class && zoo::is.regular(mf1, strict = TRUE)) { for (i in 1:ncol(mf)) if (!is.factor(mf[, i])) mf[, i] <- as.ts(mf[, i]) } if (all(orig.class == "numeric")) { for (i in 1:ncol(mf)) if (!is.factor(mf[, i])) mf[, i] <- as.vector(mf[, i]) } rownames(mf) <- zoo::index2char(zoo::index(mf1), frequency(mf1)) mt <- attr(mf, "terms") attr(mt, "predvars") <- NULL attr(mt, "dataClasses") <- NULL Y <- model.response(mf, "numeric") weights <- as.vector(model.weights(mf)) if (is.empty.model(mt)) { X <- NULL rval <- list(coefficients = numeric(0), residuals = Y, fitted.values = 0 * Y, weights = weights, rank = 0, df.residual = length(Y)) } else { Rho <- function(u, tau) u * (tau - (u < 0)) eps <- .Machine$double.eps^(2/3) X <- model.matrix(mt, mf, contrasts) if (length(tau) > 1) { if (any(tau < -eps) || any(tau > 1 + eps)) stop("invalid tau: taus should be >= 0 and <= 1") coef <- matrix(0, ncol(X), length(tau)) rho <- rep(0, length(tau)) fitted <- resid <- matrix(0, nrow(X), length(tau)) for (i in 1:length(tau)) { z <- { if (length(weights)) rq.wfit(X, Y, tau = tau[i], weights, method, ...) else rq.fit(X, Y, tau = tau[i], method, ...) } coef[, i] <- z$coefficients resid[, i] <- z$residuals rho[i] <- sum(Rho(z$residuals, tau[i])) fitted[, i] <- Y - z$residuals } taulabs <- paste("tau=", format(round(tau, 3))) dimnames(coef) <- list(dimnames(X)[[2]], taulabs) dimnames(resid) <- list(dimnames(X)[[1]], taulabs) rval <- z rval$coefficients <- coef rval$residuals <- resid rval$fitted.values <- fitted class(rval) <- c("dynrqs", "rqs") } else { rval <- { if(length(weights)) rq.wfit(X, Y, tau = tau, weights, method, ...) else rq.fit(X, Y, tau = tau, method, ...) } dimnames(rval$residuals) <- list(dimnames(X)[[1]], NULL) rho <- sum(Rho(rval$residuals, tau)) class(rval) <- "rq" class(rval) <- c("dynrq", "rq") } } rval$na.action <- attr(mf, "na.action") rval$contrasts <- attr(X, "contrasts") rval$xlevels <- .getXlevels(mt, mf) rval$call <- cl rval$tau <- tau rval$terms <- mt rval$model <- mf rval$index <- zoo::index(mf1) rval$frequency <- frequency(mf1) rval$residuals <- drop(rval$residuals) rval$X <- X rval$y <- Y rval$rho <- rho rval$method <- method rval$fitted.values <- drop(rval$fitted.values) return(rval) } index.dynrq <- function(x, ...) { x$index } start.dynrq <- function(x, ...) { start(x$residuals) } end.dynrq <- function(x, ...) { end(x$residuals) } print.dynrq <- function(x, ...) { rx <- residuals(x) cat(paste("\nDynamic quantile regression \"", class(rx)[1], "\" data:\n", sep = "")) cat(paste("Start = ", zoo::index2char(zoo::index(rx)[1], x$frequency), ", End = ", zoo::index2char(zoo::index(rx)[length(rx)], x$frequency), "\n", sep = "")) NextMethod() } print.dynrqs <- function(x, ...) { rx <- residuals(x) ix <- dimnames(rx)[[1]] cat(paste("\nDynamic quantile regression \"", class(rx)[1], "\" data:\n", sep = "")) cat(paste("Start = ", zoo::index2char(ix[1], x$frequency), ", End = ", zoo::index2char(ix[length(ix)], x$frequency), "\n", sep = "")) NextMethod() } summary.dynrqs <- function(object, vcov. = NULL, df = NULL, ...) { rval <- NextMethod() #rval$frequency <- object$frequency #class(rval) <- c("summary.dynrqs", class(rval)) return(rval) } print.summary.dynrq <- function(x, ...) { rx <- residuals(x) x$residuals <- zoo::coredata(x$residuals) cat(paste("\nDynamic quantile regression \"", class(rx)[1], "\" data:\n", sep = "")) cat(paste("Start = ", zoo::index2char(zoo::index(rx)[1], x$frequency), ", End = ", zoo::index2char(zoo::index(rx)[length(rx)], x$frequency), "\n", sep = "")) NextMethod() } print.summary.dynrqs <- function(x, ...) { lapply(x, print) } quantreg/R/rqss.R0000644000176200001440000011254314414305231013417 0ustar liggesusers"rqss.fit" <- function (x, y, tau = 0.5, method = "sfn", rhs = NULL, control, ...) { if(is.null(rhs)) rhs <- (1 - tau) * t(x) %*% rep(1,length(y)) else tau <- 0.5 fit <- switch(method, sfn = rq.fit.sfn(x, y, tau = tau, rhs = rhs, control = control, ...), lasso = rq.fit.sfn(x, y, tau = tau, rhs = rhs, control = control, ...), sfnc = rq.fit.sfnc(x, y, tau = tau, rhs = rhs, control = control, ...), { what <- paste("rq.fit.", method, sep = "") if (exists(what, mode = "function")) (get(what, mode = "function"))(x, y, ...) else stop(paste("unimplemented method:", method)) }) fit$contrasts <- attr(x, "contrasts") fit$resid <- c(y - x %*% fit$coef) fit } "untangle.specials" <- function (tt, special, order = 1) { spc <- attr(tt, "specials")[[special]] if (length(spc) == 0) return(list(vars = character(0), terms = numeric(0))) facs <- attr(tt, "factor") fname <- dimnames(facs) ff <- apply(facs[spc, , drop = FALSE], 2, sum) list(vars = (fname[[1]])[spc], terms = seq(ff)[ff & match(attr(tt, "order"), order, nomatch = 0)]) } "qss" <- function (x, constraint = "N", lambda = 1, ndum = 0, dummies = NULL, Dorder = 1, w = rep(1, length(x))) { if (is.matrix(x)) { if (ncol(x) == 2) qss <- qss2(x, constraint = constraint, dummies = dummies, lambda = lambda, ndum = ndum, w = w) else if (ncol(x) == 1) x <- as.vector(x) else stop("qss objects must have dimension 1 or 2") } else if (is.numeric(x)) { if(Dorder == 1) qss <- qss1(x, constraint = constraint, lambda = lambda, dummies = dummies, ndum = ndum, w = w) else if(Dorder == 0){ if(!(constraint %in% c("N","I","D"))) stop("This constraint not implemented for Dorder = 0") else qss <- qts1(x, constraint = constraint, lambda = lambda, dummies = dummies, ndum = ndum, w = w) } else stop("Dorder must be either 0 or 1") } else stop("invalid argument for qss function") qss } "qss2" <- function(x, y, constraint = "N", lambda = 1, ndum= 0, dummies = NULL, w=rep(1,length(x))){ # # Sparse Additive Quantile Smoothing Spline Models - Bivariate (Triogram) Module # # This function returns a structure intended to make model.matrix for a bivariate # nonparametric component of a model formula specified by a call to rqss(). A sparse form # of the Frisch Newton algorithm is eventually called to compute the estimator. # An optional convexity/concavity constraint can be specified. If # the formula consists of a single qss component then the estimator solves the # following variational problem: # # min sum rho_tau (y_i - g(x_i)) + lambda V(grad(g)) # # where V(f) denotes the total variation of the function f. The solution is a piecewise # linear function on the Delaunay triangulation formed by the observed (x_i,y_i) points. # Additive models can consist # of several components of this form plus partial linear and univariate qss components. # To resolve the identifiability problem we delete the first column of the qss design # components. On return F contains the fidelity portion of the design, A the penalty # contribution of the design, R the constraint portion, and r the rhs of the constraints. # # Constraints are specified by the constraint argument: # # N none # V convex # C concave # # Author: Roger Koenker April 2, 2003 # # For a prototype see triogram in ~roger/projects/tv/cobar/.RData on ysidro. # # Warning: Under development...todo: # # o weights # o dummy x's # o tau's # o lambda's # o ... # stopifnot(requireNamespace("interp")) # y <- x[,2] x <- x[,1] n <- length(x) if (n != length(y)) stop("xy lengths do not match") f <- triogram.fidelity(x, y, ndum = ndum, dummies = dummies) F <- f$F A <- triogram.penalty(f$x, f$y) switch(constraint, V = { R <- A r <- rep(0, nrow(R)) }, C = { R <- -A r <- rep(0, nrow(R)) }, N = { R = NULL r = NULL }) list(x = list(x = f$x, y = f$y), F = F[, -1], dummies = f$dummies, lambda = lambda, A = A[, -1], R = R[, -1], r = r) } qts1 <- function (x, constraint = "N", lambda = 1, dummies = dummies, ndum = 0, w = rep(1, length(x))) { # This is the taut string TV(g) not TV(g') penalty option xun <- unique(x[order(x)]) h <- diff(xun) nh <- length(h) nx <- length(x) p <- nh + 1 makeD <- function(p) { new("matrix.csr", ra = c(rbind(rep(-1, (p - 1)), rep(1, (p - 1)))), ja = as.integer(c(rbind(1:(p - 1), 2:p))), ia = as.integer(2 * (1:p) - 1), dimension = as.integer(c(p - 1, p))) } A <- new("matrix.csr", ra = c(rbind(-1/h, 1/h)), ja = as.integer(c(rbind(1:nh, 2:(nh + 1)))), ia = as.integer(2 * (1:(nh + 1)) - 1), dimension = as.integer(c(nh, nh + 1))) if (length(xun) == length(x)) { F <- new("matrix.csr", ra = rep(1, nx), ja = as.integer(rank(x)), ia = 1:(nx + 1), dimension = as.integer(c(nx, nx))) } else { F <- new("matrix.csr", ra = rep(1, nx), ja = as.integer(factor(x)), ia = 1:(nx + 1), dimension = as.integer(c(nx, length(xun)))) } switch(constraint, I = {R <- makeD(p); r <- rep(0, p-1)}, D = {R <- -makeD(p); r <- rep(0, p-1)}, N = {R <- NULL; r <- NULL}) list(x = list(x = xun), F = F[, -1], lambda = lambda, A = A[, -1], Dorder = 0, R = R[,-1], r = r) } "qss1" <- function (x, constraint = "N", lambda = 1, dummies = dummies, ndum = 0, w = rep(1, length(x))){ # # Sparse Additive Quantile Smoothing Spline Models - Univariate Module # # This function returns a structure intended to make model.matrix for a univariate # nonparametric component of a model formula specified by a call to rqss(). A sparse form # of the Frisch Newton algorithm is eventually called to compute the estimator. # Optional monotonicity and/or convexity/concavity constraints can be specified. If # the formula consists of a single qss component then the estimator solves the # following variational problem: # # min sum rho_tau (y_i - g(x_i)) + lambda V(g') # # where V(f) denotes the total variation of the function f. The solution is a piecewise # linear function with "knots" at the observed x_i points. Additive models can consist # of several components of this form plus partial linear and triogram components. # To resolve the identifiability problem we delete the first column of the qss design # components. On return F contains the fidelity portion of the design, A is the penalty # contribution of the design, R the constraint portion, and r the rhs of the constraints. # # Constraints are specified by the constraint argument: # # N none # I monotone increasing # D monotone decreasing # V convex # C concave # CI concave and monotone increasing # ... etc # # Author: Roger Koenker February 27, 2003 # # Warning: Under development...todo: # # o weights # o dummy x's # o tau's # o lambda's # o ... # # xun <- unique(x[order(x)]) h <- diff(xun) nh <- length(h) nx <- length(x) p <- nh + 1 B <- new("matrix.csr", ra = c(rbind(-1/h, 1/h)), ja = as.integer(c(rbind(1:nh, 2:(nh + 1)))), ia = as.integer(2 * (1:(nh + 1)) - 1), dimension = as.integer(c(nh, nh + 1))) makeD <- function(p) { new("matrix.csr", ra = c(rbind(rep(-1, (p - 1)), rep(1, (p - 1)))), ja = as.integer(c(rbind(1:(p - 1), 2:p))), ia = as.integer(2 * (1:p) - 1), dimension = as.integer(c(p - 1, p))) } D <- makeD(nh) A <- D %*% B if (length(xun) == length(x)){ F <- new("matrix.csr", ra = rep(1, nx), ja = as.integer(rank(x)), ia = 1:(nx + 1), dimension = as.integer(c(nx, nx))) } else { F <- new("matrix.csr", ra = rep(1, nx), ja = as.integer(factor(x)), ia = 1:(nx + 1), dimension = as.integer(c(nx, length(xun)))) } switch(constraint, V = { R <- A; r <- rep(0,nrow(R)) }, C = { R <- -A; r <- rep(0,nrow(R)) }, I = { R <- makeD(p) r <- rep(0,p-1) }, D = { R <- -makeD(p) r <- rep(0,p-1) }, VI = { R <- makeD(p) R <- rbind(R,A) r <- rep(0,nrow(R)) }, VD = { R <- -makeD(p) R <- rbind(R,A) r <- rep(0,nrow(R)) }, CI = { R <- makeD(p) R <- rbind(R,-A) r <- rep(0,nrow(R)) }, CD = { R <- -makeD(p) R <- rbind(R,-A) r <- rep(0,nrow(R)) }, N = { R=NULL; r=NULL} ) list(x = list(x=xun), F=F[,-1], lambda = lambda, A=A[,-1], Dorder = 1, R=R[,-1], r=r) } "plot.qss1" <- function(x, rug = TRUE, jit = TRUE, add = FALSE, ...) { if(!add) plot(x,type = "n", ...) lines(x, ...) if(rug) { if(jit) rug(jitter(x[,1])) else rug(x[,1]) } } "plot.qts1" <- function (x, rug = TRUE, jit = TRUE, add = FALSE, ...) { if (!add) plot(x, type = "S", ...) lines(x, type = "S", ...) if (rug) { if (jit) rug(jitter(x[, 1])) else rug(x[, 1]) } } "plot.qss2" <- function (x, render = "contour", ncol = 100, zcol = NULL, ...) { stopifnot(requireNamespace("interp")) y <- x[, 2] z <- x[, 3] x <- x[, 1] trinew <- interp::tri.mesh(x, y) tri <- interp::triSht2tri(trinew) if (render == "rgl") { if(!requireNamespace("rgl",quietly=TRUE)) stop("The package rgl is required") collut <- terrain.colors(ncol) if (!length(zcol)) zcol <- z if (max(z) > max(zcol) || min(z) < min(zcol)) warning("fitted z values out of range of zcol vector") zlim <- range(zcol) colz <- ncol * (z - zlim[1])/(zlim[2] - zlim[1]) + 1 colz <- collut[colz] s <- c(t(interp::triangles(trinew)[, 1:3])) rgl::rgl.triangles(x[s], y[s], z[s], col = colz[s]) } else { stopifnot(requireNamespace("interp")) if(render == "contour"){ plot(x, y, type = "n", ...) contour(interp::interp(x, y, z), add = TRUE, frame.plot = TRUE, ...) interp::convex.hull(trinew, plot.it = TRUE, add = TRUE) } else if(render == "persp") persp(interp::interp(x, y, z, ), theta = -40, phi = 20, xlab = "x", ylab = "y", zlab = "z", ...) else stop(paste("Unable to render: ",render)) } } plot.rqss <- function (x, rug = TRUE, jit = TRUE, bands = NULL, coverage = 0.95, add = FALSE, shade = TRUE, select = NULL, pages = 0, titles = NULL, bcol = NULL, ...) { SetLayout <- function(m, p) { # Shamelessly cribbed from mgcv # m is the number of plots # p is the number of pages if (p > m) p <- m if (p < 0) p <- 0 if (p != 0) { q <- m%/%p if ((m%%p) != 0) { q <- q + 1 while (q * (p - 1) >= m) p <- p - 1 } c <- trunc(sqrt(q)) if (c < 1) c <- 1 r <- q%/%c if (r < 1) r <- 1 while (r * c < q) r <- r + 1 while (r * c - q > c && r > 1) r <- r - 1 while (r * c - q > r && c > 1) c <- c - 1 oldpar <- par(mfrow = c(r, c)) } else oldpar <- par() return(oldpar) } m <- length(x$qss) if (m == 0) stop("No qss object to plot") if(length(select)) { if(all(select %in% 1:m)) oldpar <- SetLayout(length(select), pages) else stop(paste("select must be in 1:",m,sep="")) } else oldpar <- SetLayout(m, pages) if ((pages == 0 && prod(par("mfrow")) < m && dev.interactive()) || pages > 1 && dev.interactive()) ask <- TRUE else ask <- FALSE if (ask) { oask <- devAskNewPage(TRUE) on.exit(devAskNewPage(oask)) } qssnames <- names(x$qss) if(length(titles)){ if(length(titles) != length(qssnames)) stop("Length of titles doesn't match length of qssnames") } else{ titles <- paste("Effect of ", qssnames) } if (length(bands)) { rdf <- x$n - x$edf if (any(unlist(lapply(x$qss, function(x) ncol(x$xyz) == 3)))) warning("Can't plot confidence bands in 3D (yet)") band <- as.list(rep(NA, m)) V <- summary(x, cov = TRUE, ...)$Vqss "summary.qss1" <- function(object, V, ngrid = 400, ...) { x <- object$xyz[, 1] eps <- 0.01 newd <- data.frame(x = seq(min(x) + eps, max(x) - eps, length = ngrid)) G <- predict(object, newd, ...) ones <- as.matrix.csr(matrix(1, nrow(G$D), 1)) D <- cbind(ones, G$D) S <- as.matrix(D %*% V %*% t(D)) se <- sqrt(diag(S)) cv <- qt(1 - (1 - coverage)/2, rdf) if (bands %in% c("uniform","both")) { E <- eigen(as.matrix(V)) B <- E$vectors %*% diag(sqrt(pmax(0,E$values))) %*% t(E$vectors) D <- as.matrix(D) BX1 <- B %*% t(D[-1, ]) BX1 <- BX1/sqrt(apply(BX1^2, 2, sum)) BX0 <- B %*% t(D[-nrow(D), ]) BX0 <- BX0/sqrt(apply(BX0^2, 2, sum)) kappa <- sum(sqrt(apply((BX1 - BX0)^2, 2, sum))) cvu <- critval(kappa, alpha = 1 - coverage, rdf = rdf) if(bands == "both") cv <- c(cvu,cv) else cv <- cvu } list(pred = data.frame(x = G$x, y = G$y, se = se), cv = cv) } } if(!length(select)) select <- 1:m for (i in select) { if(!is.null(x$qss[[i]]$Dorder)){ if(x$qss[[i]]$Dorder == 0){ qts <- x$qss[[i]]$xyz qts[, 2] <- x$coef[1] + qts[, 2] plot.qts1(qts, add = add, ...) } else { qss <- x$qss[[i]]$xyz if (length(bands)) { if (is.na(x$coef["(Intercept)"])) stop("rqss confidence bands require an intercept parameter") B <- summary(x$qss[[i]], V[[i]], ...) cv <- B$cv B <- B$pred B$y <- B$y + x$coef["(Intercept)"] if(!length(bcol)) bcol <- c("grey85","grey65") for(k in 1:length(cv)){ if (add || k > 1) if(shade){ polygon(c(B$x,rev(B$x)), c(B$y - cv[k] * B$se,rev(B$y + cv[k] * B$se)), col = bcol[k], border = FALSE) } else matlines(B$x, cbind(B$y, B$y + cv[k] * cbind(-B$se, B$se)), lty = c(1, 2, 2), col = c("black", "blue", "blue")) else { matplot(B$x, B$y + cv[k] * cbind(-B$se, B$se), xlab = paste(qssnames[i]), ylab = "Effect", type = "n", ...) if(shade){ polygon(c(B$x,rev(B$x)), c(B$y - cv[k] * B$se,rev(B$y + cv[k] * B$se)), col = bcol[k], border = FALSE) } else{ lines(B$x, B$y + cv * B$se, lty = 2, ...) lines(B$x, B$y - cv * B$se, lty = 2, ...) } } lines(B$x, B$y, ...) } band[[i]] <- list(x = B$x, blo = B$y - B$se %o% cv, bhi = B$y + B$se %o% cv) if (rug) { if (jit) rug(jitter(qss[, 1])) else rug(qss[, 1]) } } else { qss[, 2] <- x$coef[1] + qss[, 2] plot.qss1(qss, xlab = paste(qssnames[i]), ylab = "Effect", rug = rug, jit = jit, add = add, ...) } } } qss <- x$qss[[i]]$xyz if (ncol(qss) == 3) { qss[, 3] <- x$coef[1] + qss[, 3] plot.qss2(qss, ...) } title(titles[i]) } if (pages > 0) par(oldpar) if (length(bands)) class(band) <- "rqssband" else band <- NULL invisible(band) } "triogram.fidelity" <- function (x, y, ndum=0, dummies = NULL) { #Make fidelity block of the triogram design in sparse matrix.csr form #The rather esoteric match call identifies and handles duplicated xy points n <- length(x) A <- as.data.frame(cbind(x,y)) dupA <- duplicated(A) if(any(dupA)){ x <- x[!dupA] y <- y[!dupA] J <- match(do.call("paste",c(A,"\r")),do.call("paste",c(A[!dupA,],"\r"))) z <- new("matrix.csr",ra=rep(1,n), ja=J, ia=1:(n+1),dimension=as.integer(c(n,max(J)))) } else{ z <- as(n,"matrix.diag.csr") z <- as(z,"matrix.csr") } #Augment with dummy vertices, if any... if(length(dummies)){ if (is.list(dummies)){ if (all(!is.na(match(c("x", "y"), names(dummies))))){ ndum <- length(dummies$x) if(length(dummies$y) == ndum){ x <- c(x,dummies$x) y <- c(y,dummies$y) zdum <- as.matrix.csr(0,n,ndum) z <- cbind(z,zdum) } else stop("dummies x and y components differ in length") } else stop("dummies list lacking x and y elements") } else stop("dummies argument invalid (not a list) in triogram.fidelity") } else if(ndum > 0){ u <- runif(ndum); v <- runif(ndum) xd <- min(x) + u * (max(x)-min(x)) yd <- min(y) + v * (max(y)-min(y)) Tnew <- interp::tri.mesh(x,y) T <- interp::triSht2tri(Tnew) s <- interp::in.convex.hull(Tnew,xd,yd) x <- c(x,xd[s]) y <- c(y,yd[s]) ndum <- sum(s) zdum <- as.matrix.csr(0,n,ndum) z <- cbind(z,zdum) dummies <- list(x = xd[s],y = yd[s]) } list(x=x,y=y,F=z, dummies = dummies) } "triogram.penalty" <- function (x, y, eps = .Machine$double.eps) { n <- length(x) trinew <- interp::tri.mesh(x, y) tri <- interp::triSht2tri(trinew) bnd <- interp::on.convex.hull(trinew,x,y) q <- length(tri$tlist) m <- 13 * n z <- .Fortran("penalty", as.integer(n), as.integer(m), as.integer(q), as.double(x), as.double(y), as.integer(bnd),as.integer(tri$tlist), as.integer(tri$tlptr), as.integer(tri$tlend), rax = double(m), jax = integer(m), ned = integer(1), as.double(eps), ierr = integer(1))[c("rax", "jax", "iax", "ned", "ierr")] if (z$ierr == 1) stop("collinearity in ggap") nnz <- 4 * z$ned ra <- z$rax[1:nnz] ja <- z$jax[1:nnz] ia <- as.integer(1 + 4 * (0:z$ned)) dim <- as.integer(c(z$ned, n)) new("matrix.csr",ra=ra,ja=ja,ia=ia,dimension=dim) } predict.rqss <- function (object, newdata, interval = "none", level = 0.95, ...) { ff <- object$fake.formula Terms <- delete.response(terms(object$formula, "qss")) Names <- all.vars(parse(text = ff)) if (any(!(Names %in% names(newdata)))) stop("newdata doesn't include some model variables") #ff <- reformulate(ff) nd <- eval(model.frame(ff, data = newdata), parent.frame()) qssterms <- attr(Terms, "specials")$qss if (length(qssterms)) { tmp <- untangle.specials(Terms, "qss") dropv <- tmp$terms m <- length(dropv) if (length(dropv)) PLTerms <- Terms[-dropv] attr(PLTerms, "specials") <- tmp$vars } else { PLTerms <- Terms m <- 0 } if(requireNamespace("MatrixModels") && requireNamespace("Matrix")) X <- as(MatrixModels::model.Matrix(PLTerms, data = nd, contrasts = contrasts, sparse = TRUE),"matrix.csr") else X <- model.matrix(PLTerms, data = nd) p <- ncol(X) y <- X %*% object$coef[1:p] X <- as.matrix.csr(X) if (m > 0) { for (i in 1:m) { qss <- object$qss[[i]] names <- all.vars(Terms[dropv[i]]) names <- names[names %in% Names] dimnames(qss$xyz)[[2]] <- c(names, "zfit") newd <- nd[names] if (ncol(qss$xyz) == 3) { g <- predict.qss2(qss$xyz, newdata = newd, ...) y <- y + g$z if(interval == "confidence") X <- cbind(X,g$D) } else if (ncol(qss$xyz) == 2) { g <- predict(qss, newdata = newd, ...) y <- y + g$y if(interval == "confidence") X <- cbind(X,g$D) } else stop("invalid fitted qss object") } } if(interval == "confidence"){ v <- sqrt(diag(X %*% summary(object, cov = TRUE)$V %*% t(X))) calpha <- qnorm(1 - (1-level)/2) y <- cbind(y,y - v*calpha,y + v*calpha) dimnames(y)[[2]] <- c("yhat","ylower","yupper") } y } "predict.qts1" <- function (object, newdata, ...) { x <- object$xyz[, 1] y <- object$xyz[, 2] if(ncol(newdata)==1) newdata <- newdata[,1] else stop("newdata should have only one column for predict.qts1") if (any(diff(x) < 0)) stop("x coordinates in qts1 object not monotone") if (max(newdata) > max(x) || min(newdata) < min(x)) stop("no extrapolation allowed in predict.qts") bin <- cut(newdata, unique(x), label = FALSE, include.lowest = TRUE) p <- length(x) m <- length(newdata) V <- cbind(bin, bin + 1) B <- cbind(x[bin + 1] - newdata, newdata - x[bin])/(x[bin + 1] - x[bin]) ra <- c(t(B)) ja <- as.integer(c(t(V))) ia <- as.integer(c(2 * (1:m) - 1, 2 * m + 1)) dim <- c(m, p) D <- new("matrix.csr", ra = ra, ja = ja, ia = ia, dimension = dim) list(x = newdata, y = D %*% y, D = D[, -1]) } "predict.qss1" <- function (object, newdata, ...) { x <- object$xyz[, 1] y <- object$xyz[, 2] if(ncol(newdata)==1) newdata <- newdata[,1] else stop("newdata should have only one column for predict.qss1") if (any(diff(x) < 0)) stop("x coordinates in qss1 object not monotone") if (max(newdata) > max(x) || min(newdata) < min(x)) stop("no extrapolation allowed in predict.qss") bin <- cut(newdata, unique(x), label = FALSE, include.lowest = TRUE) p <- length(x) m <- length(newdata) V <- cbind(bin, bin + 1) B <- cbind(x[bin + 1] - newdata, newdata - x[bin])/(x[bin + 1] - x[bin]) ra <- c(t(B)) ja <- as.integer(c(t(V))) ia <- as.integer(c(2 * (1:m) - 1, 2 * m + 1)) dim <- c(m, p) D <- new("matrix.csr", ra = ra, ja = ja, ia = ia, dimension = dim) list(x = newdata, y = D %*% y, D = D[, -1]) } predict.qss2 <- function (object, newdata, ...) { x <- object[, 1] y <- object[, 2] z <- object[, 3] tri.area <- function(v) { 0.5 * ((v[2, 1] - v[1, 1]) * (v[3, 2] - v[1, 2]) - (v[3, 1] - v[1, 1]) * (v[2, 2] - v[1, 2])) } barycentric <- function(v) { b <- rep(0, 3) Area <- tri.area(v[1:3, ]) b[1] <- tri.area(v[c(4, 2, 3), ])/Area b[2] <- tri.area(v[c(1, 4, 3), ])/Area b[3] <- tri.area(v[c(1, 2, 4), ])/Area if (any(b < 0) || any(b > 1)) stop("barycentric snafu") b } if (is.list(newdata)) { fnames <- (dimnames(object)[[2]])[1:2] if (all(!is.na(match(fnames, names(newdata))))) { newx <- newdata[[fnames[1]]] newy <- newdata[[fnames[2]]] } else (stop("qss object and newdata frame names conflict")) } else if (is.matrix(newdata)) if (ncol(newdata) == 2) { newx <- newdata[, 1] newy <- newdata[, 2] } else (stop("newdata matrix must have 2 columns")) trinew <- interp::tri.mesh(x, y) tri <- interp::triSht2tri(trinew) if (!all(interp::in.convex.hull(trinew, newx, newy))) stop("some newdata points outside convex hull") p <- length(x) m <- length(newx) V <- matrix(0, m, 3) B <- matrix(0, m, 3) for (i in 1:m) { Tmp <- interp::tri.find(trinew, newx[i], newy[i]) V[i, ] <- c(Tmp[[1]],Tmp[[2]],Tmp[[3]]) v <- rbind(cbind(x[V[i, ]], y[V[i, ]]), c(newx[i], newy[i])) B[i, ] <- barycentric(v) } ra <- c(t(B)) ja <- as.integer(c(t(V))) ia <- as.integer(3 * (0:m) + 1) D <- new("matrix.csr", ra = ra, ja = ja, ia = ia, dimension = c(m, p)) list(x = newx, y = newy, z = c(D %*% z), D = D[,-1]) } fitted.rqss <- function(object, ...) (object$X %*% object$coef)[1:object$n] resid.rqss <- function(object, ...) object$resid[1:object$n] rqss <- function (formula, tau = 0.5, data = parent.frame(), weights, subset, na.action, method = "sfn", lambda = NULL, contrasts = NULL, ztol = 1e-05, control = sfn.control(), ...) { call <- match.call() m <- match.call(expand.dots = FALSE) temp <- c("", "formula", "data", "weights", "na.action", "subset") m <- m[match(temp, names(m), nomatch = 0)] m[[1]] <- as.name("model.frame") special <- "qss" Terms <- if (missing(data)) terms(formula, special) else terms(formula, special, data = data) qssterms <- attr(Terms, "specials")$qss dropx <- NULL if (length(tau) > 1) { tau <- tau[1] warning("multiple taus not supported, using first element") } if (length(qssterms)) { tmpc <- untangle.specials(Terms, "qss") ord <- attr(Terms, "order")[tmpc$terms] if (any(ord > 1)) stop("qss can not be used in an interaction") dropx <- tmpc$terms if (length(dropx)) Terms <- Terms[-dropx] attr(Terms, "specials") <- tmpc$vars fnames <- function(x) { fy <- all.names(x[[2]]) if (fy[1] == "cbind") fy <- fy[-1] fy } fqssnames <- unlist(lapply(parse(text = tmpc$vars), fnames)) qssnames <- unlist(lapply(parse(text = tmpc$vars), function(x) deparse(x[[2]]))) } ff <- delete.response(terms(formula(Terms))) if (exists("fqssnames")) { mff <- m mff$formula <- Terms #mff <- delete.response(terms(formula(Terms))) ffqss <- paste(fqssnames, collapse = "+") #ff <- paste(deparse(formula(mff)), "+", ffqss) mff$formula <- as.formula(paste(deparse(mff$formula), "+", ffqss)) ff <- delete.response(terms(formula(mff))) ff <- deparse(formula(ff)) mff <- eval(mff, parent.frame()) } m$formula <- Terms m <- eval(m, parent.frame()) weights <- model.extract(m, weights) process <- (tau < 0 || tau > 1) Y <- model.extract(m, "response") if (requireNamespace("MatrixModels") && requireNamespace("Matrix")) { X <- MatrixModels::model.Matrix(Terms, m, contrasts.arg = contrasts, sparse = TRUE) vnames <- dimnames(X)[[2]] X <- as(X, "matrix.csr") } else { X <- model.matrix(Terms, m, contrasts) vnames <- dimnames(X)[[2]] } p <- ncol(X) pf <- environment(formula) nrL <- 0 if (method == "lasso") { if (!length(lambda)) stop("No lambda specified for lasso constraint") if (length(lambda) == 1) lambda <- c(0, rep(lambda, p - 1)) if (length(lambda) != p) stop("lambda must be either of length p, or length 1") if (any(lambda < 0)) stop("negative lambdas disallowed") L <- diag(lambda, nrow = length(lambda)) L <- L[which(lambda != 0), , drop = FALSE] L <- as.matrix.csr(L) nrL <- nrow(L) ncL <- ncol(L) } if (length(qssterms) > 0) { F <- as.matrix.csr(X) pf <- environment(formula) qss <- lapply(tmpc$vars, function(u) eval(parse(text = u), mff, pf)) mqss <- length(qss) ncA <- rep(0, mqss + 1) nrA <- rep(0, mqss + 1) nrR <- rep(0, mqss + 1) for (i in 1:mqss) { F <- cbind(F, qss[[i]]$F) ncA[i + 1] <- ncol(qss[[i]]$A) nrA[i + 1] <- nrow(qss[[i]]$A) nrR[i + 1] <- ifelse(is.null(nrow(qss[[i]]$R)), 0, nrow(qss[[i]]$R)) vnames <- c(vnames, paste(qssnames[i], 1:ncA[i + 1], sep = "")) } A <- as.matrix.csr(0, sum(nrA), sum(ncA)) if (sum(nrR) > 0) { R <- as.matrix.csr(0, sum(nrR), sum(ncA)) nrR <- cumsum(nrR) } ncA <- cumsum(ncA) nrA <- cumsum(nrA) lambdas <- rep(0, mqss) for (i in 1:mqss) { lambdas[i] <- qss[[i]]$lambda Arows <- (1 + nrA[i]):nrA[i + 1] Acols <- (1 + ncA[i]):ncA[i + 1] A[Arows, Acols] <- qss[[i]]$lambda * qss[[i]]$A if (nrR[i] < nrR[i + 1]) R[(1 + nrR[i]):nrR[i + 1], (1 + ncA[i]):ncA[i + 1]] <- qss[[i]]$R } A <- cbind(as.matrix.csr(0, nrA[mqss + 1], p), A) if (nrR[mqss + 1] > 0) { R <- cbind(as.matrix.csr(0, nrR[mqss + 1], p), R) r <- rep(0, nrR[mqss + 1]) } else { R <- NULL r <- NULL } if (method == "lasso") A <- rbind(cbind(L, as.matrix.csr(0, nrL, ncol(F) - ncL)), A) if(length(weights)){ F <- F * weights Y <- Y * weights } X <- rbind(F, A) Y <- c(Y, rep(0, nrow(A))) rhs <- t(rbind((1 - tau) * F, 0.5 * A)) %*% rep(1, nrow(X)) XpX <- t(X) %*% X nnzdmax <- XpX@ia[length(XpX@ia)] - 1 if (is.null(control[["nsubmax"]])) control[["nsubmax"]] <- max(nnzdmax, floor(1000 + exp(-1.6) * nnzdmax^1.2)) if (is.null(control[["nnzlmax"]])) control[["nnzlmax"]] <- floor(2e+05 - 2.8 * nnzdmax + 7e-04 * nnzdmax^2) if (is.null(control[["tmpmax"]])) control[["tmpmax"]] <- floor(1e+05 + exp(-12.1) * nnzdmax^2.35) fit <- if (length(r) > 0) rqss.fit(X, Y, tau = tau, rhs = rhs, method = "sfnc", R = R, r = r, control = control, ...) else rqss.fit(X, Y, tau = tau, rhs = rhs, method = "sfn", control = control, ...) for (i in 1:mqss) { ML <- p + 1 + ncA[i] MU <- p + ncA[i + 1] qss[[i]] <- list(xyz = cbind(qss[[i]]$x$x, qss[[i]]$x$y, c(0, fit$coef[ML:MU])), dummies = qss[[i]]$dummies, Dorder = qss[[i]]$Dorder) if (ncol(qss[[i]]$xyz) == 2) class(qss[[i]]) <- ifelse(qss[[i]]$Dorder == 1,"qss1", "qts1") else class(qss[[i]]) <- "qss2" } names(qss) <- qssnames fit$qss <- qss } else { X <- as.matrix.csr(X) nrA <- 0 if (method == "lasso") { rhs <- t(rbind((1 - tau) * X, 0.5 * L)) %*% rep(1, nrow(X) + nrow(L)) X <- rbind(X, L) Y <- c(Y, rep(0, nrL)) } else rhs <- NULL if (length(weights)) { if (any(weights < 0)) stop("negative weights not allowed") X <- X * weights Y <- Y * weights } XpX <- t(X) %*% X nnzdmax <- XpX@ia[length(XpX@ia)] - 1 if (is.null(control[["nsubmax"]])) control[["nsubmax"]] <- max(nnzdmax, floor(1000 + exp(-1.6) * nnzdmax^1.2)) if (is.null(control[["nnzlmax"]])) control[["nnzlmax"]] <- floor(2e+05 - 2.8 * nnzdmax + 7e-04 * nnzdmax^2) if (is.null(control[["tmpmax"]])) control[["tmpmax"]] <- floor(1e+05 + exp(-12.1) * nnzdmax^2.35) fit <- rqss.fit(X, Y, tau = tau, rhs = rhs, control = control, method = method, ...) fit$nrA <- nrA } names(fit$coef) <- vnames n <- length(fit$resid) - nrL - nrA[length(nrA)] if(length(weights)) fit$resid[1:n] <- fit$resid[1:n]/weights uhat <- fit$resid[1:n] Rho <- function(u, tau) sum(u * (tau - (u < 0))) fit$fidelity <- Rho(uhat, tau) fit$edf <- sum(abs(uhat) < ztol) fit$X <- X fit$y <- Y fit$n <- n fit$nrL <- nrL fit$terms <- Terms fit$fake.formula <- ff fit$formula <- formula fit$method <- method fit$call <- call fit$tau <- tau if (length(qssterms)) { fit$lambdas <- lambdas fit$qssnames <- qssnames fit$nrA <- nrA fit$ncA <- cumsum(c(p, diff(ncA))) } else fit$ncA <- p attr(fit, "na.message") <- attr(m, "na.message") class(fit) <- "rqss" fit } "Munge" <- function(formula, ...) { # Recursive substitution {per Gabor Grothendieck} if (length(formula) > 1) { if (identical(formula[[2]], as.name(names(list(...))))) formula <- eval(formula, list(...)) if (length(formula) > 1) for (i in 1:length(formula)) formula[[i]] <- Recall(formula[[i]], ...) } formula } "summary.rqss" <- function(object, cov = FALSE, ztol = 1e-5, ...){ resid <- object$resid coef <- object$coef lambdas <- object$lambdas formula <- object$formula fidelity <- object$fidelity edf <- object$edf nrA <- object$nrA ncA <- object$ncA nrL <- object$nrL tau <- object$tau cntl <- object$control X <- object$X p <- ncol(object$X) m <- length(ncA) n <- length(resid) - nrL - nrA[m] uhat <- resid[1:n] h <- bandwidth.rq(tau, n, hs = TRUE) while((tau - h < 0) || (tau + h > 1)) h <- h/2 h <- (qnorm(tau + h) - qnorm(tau - h)) * max(ztol,min(sqrt(var(uhat)), (quantile(uhat, 0.75) - quantile(uhat, 0.25))/1.34)) f <- c(dnorm(uhat/h)/h,rep(1, length(resid) - n)) D <- t(X) %*% (f * X) D <- chol(.5 * (D + t(D)), nsubmax = cntl$nsubmax, nnzlmax = cntl$nnzlmax, tmpmax = cntl$tmpmax) D <- backsolve(D,diag(p)) D0 <- tau * (1 - tau) * t(X) %*% X V <- D %*% D0 %*% D scale <- mean(f) serr <- sqrt(diag(V)) ptab <- array(coef[1:ncA[1]], c(ncA[1],4)) pnames <- names(coef[1:ncA[1]]) dimnames(ptab) <- list(pnames, c("Estimate", "Std. Error", "t value", "Pr(>|t|)")) ptab[, 2] <- serr[1:ncA[1]] ptab[, 3] <- ptab[, 1]/ptab[, 2] ptab[, 4] <- 2 * (1 - pt(abs(ptab[, 3]), n - edf)) if(cov) { Vcov <- V[1:ncA[1],1:ncA[1]] Vqss <- as.list(1:(m-1)) } if(m > 1) { penalty <- rep(NA, m - 1) qssedfs <- rep(NA, m - 1) ntab <- matrix(0, m - 1, 5) vnames <- sub(".$","",names(coef[ncA[-length(ncA)]+1])) dimnames(ntab) <- list(vnames, c("EDF", "Lambda", "Penalty", "F value", "Pr(>F)")) for(i in 2:m) { ntab[i - 1, 3] <- sum(abs(resid[n + nrL + ((nrA[i - 1] + 1):nrA[i])])) ntab[i - 1, 1] <- sum(abs(resid[n + nrL + ((nrA[i - 1] + 1):nrA[i])]) > ztol) v <- V[c(1, (ncA[i-1] + 1):ncA[i]), c(1, (ncA[i-1] + 1):ncA[i])] v <- .5 * (v + t(v)) if(cov) Vqss[[i-1]] <- v b <- coef[(ncA[i-1] + 1):ncA[i]] ntab[i-1, 4] <- t(b) %*% solve(v[-1,-1],b)/ntab[i-1,1] ntab[i-1, 5] <- 1 - pf(ntab[i-1,4],ntab[i-1,1], n - edf) } ntab[,2] <- lambdas ntab[,3] <- ntab[,3]/lambdas if(cov) z <- list(coef = ptab, qsstab = ntab, fidelity = fidelity, tau = tau, formula = formula, edf = edf, n = n, Vcov = Vcov, Vqss = Vqss, V = V) else z <- list(coef = ptab, qsstab = ntab, fidelity = fidelity, tau = tau, formula = formula, edf = edf, n = n) } else if(cov) z <- list(coef = ptab, fidelity = fidelity, formula = formula, tau = tau, edf = edf, n = n, Vcov = Vcov, V = V) else z <- list(coef = ptab, fidelity = fidelity, formula = formula, tau = tau, edf = edf, n = n) class(z) <- "summary.rqss" return(z) } "plot.summary.rqss" <- function(x, ...) warning("No plot method for summary.rqss objects: plot the rqss object instead") "print.rqss" <- function(x, ...) { cat("Formula:\n") print(x$formula) sx <- summary(x) cat("Quantile fidelity at tau = ", x$tau, "is", sx$fidelity, "\n") cat("Estimated Model Dimension is", sx$edf, "\n") } "logLik.rqss" <- function(object, ...){ n <- object$n tau <- object$tau val <- n * (log(tau * (1-tau)) - 1 - log(object$fidelity/n)) attr(val,"n") <- n attr(val,"df") <- object$edf class(val) <- "logLik" val } "AIC.rqss" <- function(object, ... , k = 2){ v <- logLik(object) if(k < 0) k <- log(attr(v,"n")) val <- AIC(logLik(object), k = k) attr(val,"edf") <- attr(v,"df") val } "dither" <- function(x, type = "symmetric", value = NULL) { if(length(x) == 0) return(x) if(!is.numeric(x)) stop("'x' must be numeric") if(!length(value)) value <- min(diff(sort(unique(x)))) if(type == "symmetric") v <- x + runif(length(x), -value/2, value/2) else if(type == "right") v <- x + runif(length(x), 0, value) else stop("invalid type") v } print.summary.rqss <- function (x, digits = max(3, getOption("digits") - 3), signif.stars = getOption("show.signif.stars"), ...) { cat("Formula:\n") print(x$formula) if (length(x$coef) > 0) { cat("\nParametric coefficients:\n") printCoefmat(x$coef, digits = digits, signif.stars = signif.stars, na.print = "NA", ...) } cat("\n") if (length(x$qsstab) > 0) { cat("Approximate significance of qss terms:\n") printCoefmat(x$qsstab, digits = digits, signif.stars = signif.stars, has.Pvalue = TRUE, na.print = "NA", cs.ind = 1, ...) } cat("\n") if (length(x$fidelity) > 0) cat(" Quantile Fidelity at tau = ", x$tau, " is ", formatC(x$fidelity, digits = 6, width = 11), "\n", sep = "") cat(" Effective Degrees of Freedom = ", formatC(x$edf, digits = 5, width = 8, flag = "-"), " Sample Size = ", x$n, "\n", sep = "") invisible(x) } critval <- function(kappa, alpha = 0.05, rdf = 0){ # Hotelling tube critical value for uniform confidence bands # This should agree to about 6 digits with the following call to locfit: # crit(const = c(kappa,1), cov = 1-alpha,rdf = rdf)$crit.val tube <- function(x,alpha,rdf){ if(rdf <= 0) kappa * exp(-x^2/2)/pi + 2 * (1 - pnorm(x)) - alpha else kappa * (1+x^2/rdf)^(-rdf/2)/pi + 2 * (1 - pt(x,rdf)) - alpha } uniroot(tube,c(1,5),alpha = alpha, rdf = rdf)$root } quantreg/R/lprq.R0000644000176200001440000000072311555564235013417 0ustar liggesuserslprq <- function(x, y, h, tau = .5, m = 50) { ## A toy routine to do locally polynomial quantile regression xx <- seq(min(x),max(x),length=m) fv <- xx dv <- xx for(i in 1:length(xx)) { z <- x - xx[i] wx <- dnorm(z/h) r <- rq(y~z, weights=wx, tau=tau, ci=FALSE) fv[i] <- r$coef[1.] dv[i] <- r$coef[2.] } list(xx = xx, fv = fv, dv = dv) } quantreg/R/anova.R0000644000176200001440000003376014176270216013547 0ustar liggesusers"anova.rq" <- function (object, ..., test = "Wald", joint = TRUE, score = "tau", se = "nid", iid = TRUE, R = 200, trim = NULL) { if (length(list(object, ...)) > 1) { objects <- list(object, ...) return(anova.rqlist(objects, ..., test = test, joint = joint, score = score, se = se, iid = iid, R = R, trim = trim)) } stop("Anova is only defined (yet) for lists of rq objects") } anova.rqs <- function(object, ..., se = "nid", iid = TRUE, joint = TRUE){ class(object) <- "rq" m <- length(object$tau) z <- rep(list(object), m) for(i in 1:m){ z[[i]]$coefficients <- object$coefficients[,i] z[[i]]$tau <- object$tau[i] z[[i]]$rho <- object$rho[i] } return(anova.rqlist(z, ..., se = se, iid = iid, joint = joint)) } "anova.rqlist" <- function (object, ..., test = "Wald", joint = TRUE, score = "tau", se = "nid", iid = TRUE, R = 200, trim = NULL) { objects <- object responses <- as.character(lapply(objects, function(x) formula(x)[[2]])) sameresp <- responses == responses[1] if (!all(sameresp)) stop("Models don't all have the same response variable") n <- length(objects[[1]]$resid) models <- as.character(lapply(objects, function(x) formula(x))) nobjects <- length(objects) dimp <- lapply(objects, function(x) length(coef(x))) objects <- objects[order(-unlist(dimp))] mf <- model.frame(objects[[1]]) models <- as.character(lapply(objects, function(x) formula(x))) taus <- unlist(lapply(objects, function(x) x$tau)) if(is.matrix(coef(objects[[1]]))) names <- lapply(objects, function(x) dimnames(coef(x))[[1]]) else names <- lapply(objects, function(x) names(coef(x))) if (test == "Wald") objects <- lapply(objects, function(x) summary(x,se=se,R=R,covariance = TRUE)) sametaus <- taus == taus[[1]] if (all(sametaus)) { Tn <- rep(0, nobjects - 1) ndf <- Tn ddf <- Tn pvalue <- Tn topnote <- paste("Model ", format(1:nobjects), ": ", models, sep = "", collapse = "\n") if (test == "anowar") { X1 <- model.matrix(objects[[1]],mf,contrasts=objects[[1]]$contrasts) y <- model.response(mf) weights <- as.vector(model.weights(mf)) tau <- taus[[1]] for (i in 2:nobjects) { if (!all(sapply(names[[i]], function(x) any(grepl(x, names[[1]], fixed = TRUE))))) stop("Models aren't nested") mf <- model.frame(objects[[i]]) X0 <- model.matrix(objects[[i]], mf,contrasts=objects[[i]]$contrasts) Htest <- rq.test.anowar(X0, X1, y, tau = tau, R = R) ndf[i - 1] <- Htest$ndf Tn[i - 1] <- Htest$Tn ddf[i - 1] <- Htest$ddf pvalue[i - 1] <- Htest$pvalue } table <- data.frame(ndf, ddf, Tn, pvalue) } else if (test == "rank") { x1 <- model.matrix(objects[[1]],mf,contrasts=objects[[1]]$contrasts) y <- model.response(mf) weights <- as.vector(model.weights(mf)) for (i in 2:nobjects) { if (!all(sapply(names[[i]], function(x) any(grepl(x, names[[1]], fixed = TRUE))))) stop("Models aren't nested") nullH <- is.na(match(names[[1]], names[[i]])) X1 <- as.matrix(x1[, nullH]) mf <- model.frame(objects[[i]]) X0 <- model.matrix(objects[[i]], mf,contrasts=objects[[i]]$contrasts) if(score == "tau") tau <- taus[[1]] Htest <- rq.test.rank(X0, X1, y, score = score, weights = weights, iid = iid, tau = tau, trim = trim) ndf[i - 1] <- Htest$ndf Tn[i - 1] <- Htest$Tn ddf[i - 1] <- Htest$ddf pvalue[i - 1] <- Htest$pvalue } table <- data.frame(ndf, ddf, Tn, pvalue) } else if (test == "Wald") { V <- lapply(objects, function(x) x$cov) coef <- lapply(objects, function(x) coef(x)[,1]) for (i in 2:nobjects) { if (!all(sapply(names[[i]], function(x) any(grepl(x, names[[1]], fixed = TRUE))))) stop("Models aren't nested") nullH <- is.na(match(names[[1]], names[[i]])) ndf[i - 1] <- sum(nullH) Tn[i - 1] <- t((coef[[1]])[nullH]) %*% solve((V[[1]])[nullH, nullH], (coef[[1]])[nullH])/ndf[i - 1] ddf[i - 1] <- n - length(names[[1]]) pvalue[i - 1] <- 1 - pf(Tn[i - 1], ndf[i - 1], ddf[i - 1]) } table <- data.frame(ndf, ddf, Tn, pvalue) } else stop("test only defined for anowar, Wald and rank") } else { m <- length(taus) n <- NROW(objects[[1]]$residuals) for (i in 2:m) { if (!setequal(names[[i]], names[[1]])) stop("Models with common tau don't have same X") } if (names[[1]][1] != "(Intercept)") stop("Intercept required in common tau testing") Omega <- outer(taus, taus, pmin) - outer(taus, taus) J <- objects[[1]]$J p <- dim(J)[1] H <- array(unlist(lapply(objects, function(x) x$Hinv)), c(p, p, m)) H <- matrix(aperm(H, c(1, 3, 2)), p * m, p) %*% t(chol(J)) W <- (H %*% t(H)) * (kronecker(Omega, outer(rep(1, p), rep(1, p)))) coef <- unlist(lapply(objects, function(x) coef(x)[,1])) if(joint){ D <- kronecker(diff(diag(m)), cbind(0, diag(p - 1))) ndf <- (p - 1) * (m - 1) Tn <- t(D %*% coef) %*% solve(D %*% W %*% t(D), D %*% coef)/ndf ddf <- n * m - (p-1) * (m - 1) pvalue <- 1 - pf(Tn, ndf, ddf) nobjects <- 1 tnote1 <- paste("Model: ", models[[1]], "\n", sep = "") tnote2 <- paste("Joint Test of Equality of Slopes: tau in { ", paste(taus, collapse = " "), " }\n") topnote <- paste(tnote1, tnote2, sep = "") table <- data.frame(ndf, ddf, Tn, pvalue) } else{ Tn <- pvalue <- rep(0,p-1) ndf <- m-1 ddf <- n*m - (m-1) for(i in 2:p){ E <- matrix(0, 1, p) E[1,i] <- 1 D <- kronecker(diff(diag(m)),E) Tn[i-1] <- t(D %*% coef) %*% solve(D %*% W %*% t(D), D %*% coef)/ndf pvalue[i-1] <- 1 - pf(Tn[i-1], ndf, ddf) } tnote1 <- paste("Model: ", models[[1]], "\n", sep = "") tnote2 <- paste("Tests of Equality of Distinct Slopes: tau in { ", paste(taus, collapse = " "), " }\n") topnote <- paste(tnote1, tnote2, sep = "") table <- data.frame(ndf, ddf, Tn, pvalue) dimnames(table)[[1]] <- names[[1]][2:p] } } x <- list(table=table,topnote=topnote) class(x) <- "anova.rq" return(x) } "print.anova.rq" <- function(x,...){ table <- x$table topnote <- x$topnote dimnames(table)[[2]] <- c("Df", "Resid Df", "F value", "Pr(>F)") title <- "Quantile Regression Analysis of Deviance Table\n" a <- structure(table, heading = c(title, topnote), class = c("anova", "data.frame")) print(a) } rq.test.anowar <- function(x0,x1,y,tau,R){ if(!requireNamespace("logspline", quietly = TRUE)) stop("anowar test requires logspline package") n <- length(y) f0 <- rq(y ~ x0 - 1, tau = tau) f1 <- rq(y ~ x1 - 1, tau = tau) Rho <- function(u,tau) u * (tau - (u < 0)) Mn <- sum(Rho(f0$resid,tau)) - sum(Rho(f1$resid,tau)) if(!hasArg(R)) R <- 200 W <- matrix(rexp(n*R,1),n,R) B1 <- t(boot.rq.wxy(x1,y,W,tau)) B0 <- t(boot.rq.wxy(x0,y,W,tau)) R0 <- Rho(y - x0 %*% B0,tau) R1 <- Rho(y - x1 %*% B1,tau) W0 <- apply(R0*W, 2, sum) - apply(W * Rho(f0$resid,tau), 2, sum) W1 <- apply(R1*W, 2, sum) - apply(W * Rho(f1$resid,tau), 2, sum) RefDistn <- logspline::logspline(W0 - W1) pvalue <- 1 - logspline::plogspline(Mn,RefDistn) ndf <- ncol(x1) - ncol(x0) ddf <- n - ncol(x1) list(Tn = Mn, ndf=ndf, ddf=ddf, pvalue=pvalue) } "rq.test.rank" <- function (x0, x1, y, v = NULL, score = "wilcoxon", weights = NULL, tau = 0.5, iid = TRUE, delta0 = rep(0, NCOL(x1)), omega = 1, trim = NULL, pvalue = "F") { if (length(weights) > 0) { y <- weights * y x0 <- weights * x0 x1 <- weights * x1 } n <- length(y) if (!length(v) > 0) if(score == "tau"){ r <- rq.fit.br(x0,y,tau = tau)$dual - (1 - tau) r <- list(ranks = r, A2 = tau * (1 - tau)) } else{ v <- rq(y ~ x0 - 1, tau = -1) r <- ranks(v, score, tau, trim) } else r <- ranks(v, score, tau, trim) if(iid == FALSE && score == "tau"){ h <- bandwidth.rq(tau, n, hs = TRUE) bhi <- rq.fit.br(x0, y, tau + h, ci = FALSE) bhi <- coefficients(bhi) blo <- rq.fit.br(x0, y, tau - h, ci = FALSE) blo <- coefficients(blo) dyhat <- x0 %*% (bhi - blo) if(any(dyhat <= 0)) { pfis <- (100 * sum(dyhat <= 0))/n warning(paste(pfis, "percent fis <=0")) } eps <- .Machine$double.eps^(2/3) f <- pmax(eps, (2 * h)/(dyhat - eps)) x1hat <- resid(lm.wfit(x0, x1, w = f)) } else x1hat <- as.matrix(qr.resid(qr(x0), x1)) Tn <- as.matrix(t(x1hat) %*% r$ranks) Tn <- t(Tn) %*% solve(crossprod(x1hat)) %*% Tn/r$A2 ncp <- (omega^2) * t(delta0) %*% (crossprod(x1hat)/n) %*% delta0/r$A2 ndf <- NCOL(x1) Tn <- Tn/ndf ddf <- length(y) - NCOL(x0) - NCOL(x1) if (pvalue == "F") pvalue <- 1 - pf(Tn, ndf, ddf, ncp) else pvalue <- 1 - pchisq(Tn*ndf, ndf, ncp) list(Tn = Tn, ndf = ndf, ddf = ddf, pvalue = pvalue) } "ranks" <- function (v, score = "wilcoxon", tau = 0.5, trim = NULL) { A2 <- 1 if(length(trim) & !(score == "wilcoxon")) stop("trimming is only permitted with the wilcoxon score functions") if (score == "wilcoxon") { phibar <- 1/2 A2 <- 1/12 u <- v$sol[1,] J <- length(u) d <- v$dsol if(length(trim)){ if(length(trim) == 1) trim <- c(trim, 1 - trim) else if(length(trim) > 2) stop("Only 2 trimming proportions allowed") else { if(any(trim < 0) || any(trim > 1)) stop("trim must lie in [0,1]") trim <- sort(trim) klo <- findInterval(trim[1],u) khi <- findInterval(trim[2],u) wlo <- (trim[1] - u[klo])/(u[klo+1] - u[klo]) dlo <- wlo * d[,klo] + (1-wlo) * d[,klo + 1] s <- (klo+1):khi s <- (klo+1):khi if(khi < J) { whi <- (trim[2] - u[khi])/(u[khi+1] - u[khi]) dhi <- whi * d[,khi] + (1-whi) * d[,khi + 1] u <- c(trim[1], u[s], trim[2]) d <- cbind(dlo, d[,s], dhi) } else { u <- c(trim[1],u[s]) d <- cbind(dlo, d[,s]) } a <- trim[1]; b <- trim[2] phibar <- c <- ( a^2 + 2*b - b^2)/2 A2 <- (2/3) *(a^3 - b^3) - c * a^2 - 2 * b * c + c^2 + (1+c) * b^2 } } D <- v$dsol J <- length(u) ranks <- c((0.5 * (d[, 2:J] + d[, 1:(J - 1)]) %*% diff(u)) - phibar) return(list(ranks = ranks, A2 = A2)) } else if (score == "normal") { J <- ncol(v$sol) dt <- v$sol[1, 2:J] - v$sol[1, 1:(J - 1)] dphi <- c(0, dnorm(qnorm(v$sol[1, 2:(J - 1)])), 0) dphi <- diff(dphi) ranks <- as.vector((((v$dsol[, 2:J] - v$dsol[, 1:(J - 1)]))) %*% (dphi/dt)) return(list(ranks = ranks, A2 = A2)) } else if (score == "sign") { j.5 <- sum(v$sol[1, ] < 0.5) w <- (0.5 - v$sol[1, j.5])/(v$sol[1, j.5 + 1] - v$sol[1, j.5]) r <- w * v$dsol[, j.5 + 1] + (1 - w) * v$dsol[, j.5] ranks <- 2 * r - 1 return(list(ranks = ranks, A2 = A2)) } else if (score == "tau") { j.tau <- sum(v$sol[1, ] < tau) w <- (tau - v$sol[1, j.tau])/(v$sol[1, j.tau + 1] - v$sol[1, j.tau]) r <- w * v$dsol[, j.tau + 1] + (1 - w) * v$dsol[, j.tau] ranks <- r - (1 - tau) A2 <- tau * (1 - tau) return(list(ranks = ranks, A2 = A2)) } else if (score == "normalscale") { J <- ncol(v$sol) taus <- v$sol[1,] dt <- taus[2:J] - taus[1:(J - 1)] Qt <- qnorm(taus[2:(J-1)]) phi <- c(0, -dnorm(Qt)*Qt, 0) dphi <- diff(phi) ranks <- as.vector((((v$dsol[, 2:J] - v$dsol[, 1:(J - 1)]))) %*% (dphi/dt)) return(list(ranks = ranks, A2 = 2)) } else if (score == "halfnormalscale") { J <- ncol(v$sol) taus <- v$sol[1,] dt <- taus[2:J] - taus[1:(J - 1)] Qt <- qnorm(taus[2:(J-1)]) phi <- c(0, (taus[2:(J-1)] - dnorm(Qt)*Qt)*(taus[2:(J-1)] > .5), 1) dphi <- diff(phi) dphi[dphi > .5] <- 0 #Kludge to zap jump point. ranks <- (((v$dsol[, 2:J] - v$dsol[, 1:(J-1)]))) ranks <- as.vector(ranks %*% (dphi/dt)) return(list(ranks = ranks, A2 = 1.25)) } else if(score == "lehmann"){ J <- ncol(v$sol) taus <- v$sol[1,] dt <- taus[2:J] - taus[1:(J - 1)] taus <- taus[2:(J-1)] phi <- c(0, -(taus -1)*log(1-taus),0) dphi <- diff(phi) ranks <- (((v$dsol[, 2:J] - v$dsol[, 1:(J-1)]))) ranks <- as.vector(ranks %*% (dphi/dt)) return(list(ranks = ranks, A2 = 1)) } else if (score == "interquartile") { j.25 <- sum(v$sol[1, ] < 0.25) w <- (0.25 - v$sol[1, j.25])/(v$sol[1, j.25 + 1] - v$sol[1, j.25]) r.25 <- w * v$dsol[, j.25 + 1] + (1 - w) * v$dsol[, j.25] j.75 <- sum(v$sol[1, ] < 0.75) w <- (0.75 - v$sol[1, j.75])/(v$sol[1, j.75 + 1] - v$sol[1, j.75]) r.75 <- w * v$dsol[, j.75 + 1] + (1 - w) * v$dsol[, j.75] ranks <- 0.5 + r.75 - r.25 A2 <- 1/4 return(list(ranks = ranks, A2 = A2)) } else stop("invalid score function") } quantreg/R/ParetoTest.R0000644000176200001440000001016413733372154014530 0ustar liggesusersParetoTest <- function(formula, tau = 0.1, data = NULL, flavor = "Hill", m = 2, cicov = 0.9, ...) { if(flavor == "Hill") z <- Hill(formula, tau, data, ...) else if(flavor == "Pickands") z <- Pickands(formula, tau, data, m = m, ...) else stop(paste("flavor", flavor, "not (yet) implemented")) summary(z, ci = cicov, ...) } # Pickands Estimation and Inference for the Pareto Tail Exponent Pickands <- function(formula, tau = 0.1, data = NULL, m = 2, ...){ y <- model.response(model.frame(formula, data)) X <- model.matrix(formula, data) Pickands.fit(X, y, tau, m, ...) } Pickands.fit <- function(X, y, tau, m, ...){ if(tau > 0.5){ # Right tail X <- -X y <- -y tau = 1-tau } taus = c(tau, m * tau, 2 * m * tau) F <- rq(y ~ X - 1, tau = taus, ...) Xbar = colMeans(X) num = c(crossprod(Xbar, (F$coef[,3] - F$coef[,2]))) denom = c(crossprod(Xbar, (F$coef[,2] - F$coef[,1]))) xi <- (-1/log(m)) * log(num/denom) z <- list(xi = xi, tau = tau, m = m, F = F) class(z) <- "Pickands" z } summary.Pickands <- function(object, se = "boot", B = 200, ci = 0.9, ...){ tau <- object$tau xi <- object$xi m <- object$m X <- object$F$x y <- object$F$y n <- length(y) b1 <- object$F$coef[,1] bm <- object$F$coef[,2] Xbar <- colMeans(X) Xg <- X %*% (bm - b1)/c(crossprod(Xbar, bm - b1)) #aargh humbug! R <- rep(NA, B) for(i in 1:B){ # Parametric Bootstrap Default Method ys <- -(rexp(n)^(-xi) - 1)/xi * Xg R[i] <- Pickands.fit(X, ys, tau, m = m, ...)$xi } z <- rep(NA,6) z[1] <- xi z[2] <- xi - quantile(R - xi, .5, na.rm=TRUE) z[3] <- xi - quantile(R - xi, (1+ci)/2, na.rm=TRUE) z[4] <- xi - quantile(R - xi, (1-ci)/2, na.rm=TRUE) z[5] <- sqrt(var(R)) z[6] <- B - sum(is.na(R)) names(z) <- c("Estimate", "Bias-Corrected", paste("Lower ", 50*(1-ci),"%",sep=""), paste("Upper ", 50*(1+ci),"%",sep=""), "StdErr", "Sample Size") z <- list(z = z, tau = tau) class(z) = "summary.Pickands" z } print.Pickands <- function(x, ...){ print(x$xi) } print.summary.Pickands <- function(x, ...){ cat(paste("Pickands Estimation and Inference: tau = ", x$tau, "Effective Bootstrap Sample Size = ",x$z[6],"\n\n")) print(x$z[1:5]) } if(FALSE){ # Test problem require(quantreg) n = 500 x = rnorm(n) y = x + rt(n,2) P = Pickands(y ~ x, .9) S = summary(P) } # Hill Estimation and Inference for the Pareto Tail Exponent Hill <- function(formula, tau = 0.1, data = NULL, ...){ y <- model.response(model.frame(formula, data)) X <- model.matrix(formula, data) Hill.fit(X, y, tau) } Hill.fit <- function(X, y, tau, ...){ if(tau > 0.5){ # Right tail X <- -X y <- -y tau = 1-tau } F <- rq.fit(X, y, tau = tau, ...) yhat <- F$fitted.values z <- log(ifelse(y <= yhat, abs(y/yhat), 1)) z <- z[is.finite(z)] z <- list(xi = sum(z)/(length(z)*tau), tau = tau, F = F) class(z) <- "Hill" z } summary.Hill <- function(object, se = "boot", B = 200, m = 2, ci = 0.9, ...){ tau <- object$tau xi <- object$xi X <- object$F$x y <- object$F$y n <- length(y) b0 <- object$F$coef bm <- rq.fit(X, y, m * tau, ...)$coef Xbar <- colMeans(X) Xg <- X %*% (bm - b0)/c(crossprod(Xbar, bm - b0)) #aargh humbug! R <- rep(NA, B) for(i in 1:B){ # Parametric Bootstrap Default Method ys <- -(rexp(n)^(-xi) - 1)/xi * Xg R[i] <- Hill.fit(X, ys, tau, ...)$xi } z <- rep(NA,6) z[1] <- xi z[2] <- xi - quantile(R - xi, .5, na.rm=TRUE) z[3] <- xi - quantile(R - xi, (1+ci)/2, na.rm=TRUE) z[4] <- xi - quantile(R - xi, (1-ci)/2, na.rm=TRUE) z[5] <- sqrt(var(R)) z[6] <- B - sum(is.na(R)) names(z) <- c("Estimate", "Bias-Corrected", paste("Lower ", 50*(1-ci),"%",sep=""), paste("Upper ", 50*(1+ci),"%",sep=""), "BS_StdErr", "Sample Size") z <- list(z = z, tau = tau) class(z) = "summary.Hill" z } print.Hill <- function(x, ...){ print(x$xi) } print.summary.Hill <- function(x, ...){ cat(paste("Hill Estimation and Inference: tau = ", x$tau, "Effective Bootstrap Sample Size = ",x$z[6],"\n\n")) print(x$z[1:5]) } quantreg/R/nlrq.R0000644000176200001440000003436713151101657013415 0ustar liggesusers###====== Nonlinear quantile regression with an interior point algorithm ====== # see: Koenker, R. & B.J. Park, 1996. An interior point algorithm # for nonlinear quantile regression. J. Econom., 71(1-2): 265-283. # adapted from nlrq routine of Koenker, R. to be compatible with R nls models # by Ph. Grosjean, 2001 (phgrosjean@sciviews.org) # large parts of code are reused from the nls package of R v. 1.2.3 # TO DO: # - nlrq should return a code 0 = convergence, 1 = lambda -> 0, etc.. # - Extensive diagnostic for summary() (Roger, what would you propose?) # - Calculate with a list of tau values at once (currently accept only 1 value) # - When providing several tau values, allow also to calculate a single value # for one or several parameters across all models fitted to all tau values... # ...but I have another idea for doing that more efficiently. "nlrq.control" <- function (maxiter=100, k=2, InitialStepSize = 1, big=1e+20, eps=1.0e-07, beta=0.97) { list(maxiter=maxiter, k=k, InitialStepSize = InitialStepSize, big=big, eps=eps, beta=beta) } # Still needs to be cleaned up: several parts of the code not used here (QR,...) "nlrqModel" <- function (form, tau, data, start) { thisEnv <- environment() env <- new.env(parent = environment(form)) for (i in names(data)) { assign(i, data[[i]], envir = env) } ind <- as.list(start) parLength <- 0 for (i in names(ind)) { temp <- start[[i]] storage.mode(temp) <- "double" assign(i, temp, envir = env) ind[[i]] <- parLength + seq(along = start[[i]]) parLength <- parLength + length(start[[i]]) } useParams <- rep(TRUE, parLength) lhs <- eval(form[[2]], envir = env) rhs <- eval(form[[3]], envir = env) resid <- lhs - rhs tau <- tau dev <- sum(tau * pmax(resid, 0) + (tau - 1) * pmin(resid, 0)) if (is.null(attr(rhs, "gradient"))) { getRHS.noVarying <- function() numericDeriv(form[[3]], names(ind), env) getRHS <- getRHS.noVarying rhs <- getRHS() } else { getRHS.noVarying <- function() eval(form[[3]], envir = env) getRHS <- getRHS.noVarying } dimGrad <- dim(attr(rhs, "gradient")) marg <- length(dimGrad) if (marg > 0) { gradSetArgs <- vector("list", marg + 1) for (i in 2:marg) gradSetArgs[[i]] <- rep(TRUE, dimGrad[i - 1]) useParams <- rep(TRUE, dimGrad[marg]) } else { gradSetArgs <- vector("list", 2) useParams <- rep(TRUE, length(attr(rhs, "gradient"))) } npar <- length(useParams) gradSetArgs[[1]] <- (~attr(ans, "gradient"))[[2]] gradCall <- switch(length(gradSetArgs) - 1, call("[", gradSetArgs[[1]], gradSetArgs[[2]]), call("[", gradSetArgs[[1]], gradSetArgs[[2]], gradSetArgs[[2]]), call("[", gradSetArgs[[1]], gradSetArgs[[2]], gradSetArgs[[2]], gradSetArgs[[3]]), call("[", gradSetArgs[[1]], gradSetArgs[[2]], gradSetArgs[[2]], gradSetArgs[[3]], gradSetArgs[[4]])) getRHS.varying <- function() { ans <- getRHS.noVarying() attr(ans, "gradient") <- eval(gradCall) ans } QR <- qr(attr(rhs, "gradient")) qrDim <- min(dim(QR$qr)) if (QR$rank < qrDim) stop("singular gradient matrix at initial parameter estimates") getPars.noVarying <- function() unlist(setNames(lapply(names(ind), get, envir = env), names(ind))) getPars.varying <- function() unlist(setNames(lapply(names(ind), get, envir = env), names(ind)))[useParams] getPars <- getPars.noVarying internalPars <- getPars() setPars.noVarying <- function(newPars) { assign("internalPars", newPars, envir = thisEnv) for (i in names(ind)) { assign(i, unname(newPars[ind[[i]]]), envir = env) } } setPars.varying <- function(newPars) { internalPars[useParams] <- newPars for (i in names(ind)) { assign(i, unname(internalPars[ind[[i]]]), envir = env) } } setPars <- setPars.noVarying on.exit(remove(i, data, parLength, start, temp)) m <- list(resid = function() resid, fitted = function() rhs, formula = function() form, tau = function() tau, deviance = function() dev, gradient = function() attr(rhs, "gradient"), incr = function() qr.coef(QR, resid), setVarying = function(vary = rep(TRUE, length(useParams))) { assign("useParams", if (is.character(vary)) { temp <- logical(length(useParams)) temp[unlist(ind[vary])] <- TRUE temp } else if (is.logical(vary) && length(vary) != length(useParams)) stop("setVarying : vary length must match length of parameters") else { vary }, envir = thisEnv) gradCall[[length(gradCall)]] <<- useParams if (all(useParams)) { assign("setPars", setPars.noVarying, envir = thisEnv) assign("getPars", getPars.noVarying, envir = thisEnv) assign("getRHS", getRHS.noVarying, envir = thisEnv) assign("npar", length(useParams), envir = thisEnv) } else { assign("setPars", setPars.varying, envir = thisEnv) assign("getPars", getPars.varying, envir = thisEnv) assign("getRHS", getRHS.varying, envir = thisEnv) assign("npar", length((1:length(useParams))[useParams]), envir = thisEnv) } }, changeTau = function(newTau) { assign("tau", newTau, envir = thisEnv) assign("dev", sum(tau * pmax(resid, 0) + (tau - 1) * pmin(resid, 0)), envir = thisEnv) return(dev) }, setPars = function(newPars) { setPars(newPars) assign("resid", lhs - assign("rhs", getRHS(), envir = thisEnv), envir = thisEnv) assign("dev", sum(tau * pmax(resid, 0) + (tau - 1) * pmin(resid, 0)), envir = thisEnv) assign("QR", qr(attr(rhs, "gradient")), envir = thisEnv) return(QR$rank < min(dim(QR$qr))) }, getPars = function() getPars(), getAllPars = function() getPars(), getEnv = function() env, trace = function() cat(format(dev), ": ", format(getPars()), "\n"), Rmat = function() qr.R(QR), predict = function(newdata = list(), qr = FALSE) { Env <- new.env() for (i in objects(envir = env)) { assign(i, get(i, envir = env), envir = Env) } newdata <- as.list(newdata) for (i in names(newdata)) { assign(i, newdata[[i]], envir = Env) } eval(form[[3]], envir = Env) }) class(m) <- "nlrqModel" m } "nlrq" <- function (formula, data=parent.frame(), start, tau=0.5, control, trace=FALSE, method = "L-BFGS-B") { mf <- match.call() formula <- as.formula(formula) varNames <- all.vars(formula) if (length(formula) == 2) { formula[[3]] <- formula[[2]] formula[[2]] <- 0 } if (missing(start)) { if (!is.null(attr(data, "parameters"))) { pnames <- names(attr(data, "parameters")) } else { cll <- formula[[length(formula)]] func <- get(as.character(cll[[1]])) pnames <- as.character(as.list(match.call(func, call = cll))[-1][attr(func, "pnames")]) } } else { pnames <- names(start) } varNames <- varNames[is.na(match(varNames, pnames, nomatch = NA))] varIndex <- sapply(varNames, function(varName, data, respLength) { length(eval(as.name(varName), data))%%respLength == 0 }, data, length(eval(formula[[2]], data))) mf$formula <- parse(text = paste("~", paste(varNames[varIndex], collapse = "+")))[[1]] mf$start <- mf$tau <- mf$control <- mf$algorithm <- mf$trace <- mf$method <- NULL mf[[1]] <- as.name("model.frame") mf <- as.list(eval(mf, parent.frame())) if (missing(start)) { start <- getInitial(formula, mf) } for (var in varNames[!varIndex]) mf[[var]] <- eval(as.name(var), data) ctrl <- nlrq.control() if (!missing(control)) { control <- as.list(control) ctrl[names(control)] <- control } m <- nlrqModel(formula, tau, mf, start) nlrq.calc <- function (model, ctrl, trace) { meketon <- function(x, y, w, tau, ctrl) { yw <- ctrl$big k <- 1 while(k <= ctrl$k & yw - crossprod(y, w) > ctrl$eps) { d <- pmin(tau - w, 1 - tau + w) z <- lsfit(x, y, d^2, intercept=FALSE) yw <- sum(tau * pmax(z$resid, 0) + (tau - 1) * pmin(z$resid, 0)) k <- k + 1 s <- z$resid * d^2 alpha <- max(ctrl$eps, pmax(s/(tau - w), -s/(1 - tau + w))) w <- w + (ctrl$beta/alpha) * s } coef <- z$coef return(list(coef=coef, w=w)) } model.step <- function(lambda, Step, model, pars) { model$setPars(pars + lambda * Step) model$deviance() } w <- rep(0, length(model$resid())) snew <- model$deviance() sold <- ctrl$big nit <- 0 if (trace) { model$trace() optim.ctrl <- list(trace=1) } else { optim.ctrl <- list(trace=0) } lam0 <- ctrl$InitialStepSize while(sold - snew > ctrl$eps & nit < ctrl$maxiter) { z <- meketon(model$gradient(),as.vector(model$resid()), w, tau=tau, ctrl=ctrl) Step <- z$coef Pars <- model$getPars() lam <- try(optim(par=lam0, fn=model.step, method=method, lower=0, upper=1, Step=Step, model=model, pars=Pars, control=optim.ctrl)$par) if(inherits(lam,"try.error") || !is.finite(lam)) stop("optim unable to find valid step size") if (trace) {cat("lambda =", lam, "\n")} model$setPars(Pars + lam * Step) sold <- snew snew <- model$deviance() w <- qr.resid(qr(model$gradient()), z$w) w1 <- max(pmax(w, 0)) if(w1 > tau) {w <- (w * tau)/(w1 + ctrl$eps)} w0 <- max(pmax( - w, 0)) if(w0 > 1 - tau) {w <- (w * (1 - tau))/(w0 + ctrl$eps)} if (trace) {model$trace()} if (R.Version()$os == "Win32") {flush.console()} nit <- nit + 1 } Rho <- function(u,tau) u * (tau - (u < 0)) model$rho <- sum(Rho(model$resid(),tau)) model } nlrq.out <- list(m=nlrq.calc(m, ctrl, trace), data=substitute(data), call=match.call()) nlrq.out$call$control <- ctrl nlrq.out$call$trace <- trace class(nlrq.out) <- "nlrq" nlrq.out } "logLik.nlrq" <- function(object, ...){ n <- length(object$m$resid()) p <- length(object$m$getPars()) tau <- object$m$tau() fid <- object$m$rho val <- n * (log(tau * (1-tau)) - 1 - log(fid/n)) attr(val,"n") <- n attr(val,"df") <- p class(val) <- "logLik" val } "AIC.nlrq" <- function(object, ... , k = 2){ v <- logLik(object) if(k <= 0) k <- log(attr(v,"n")) val <- AIC(v, k = k) attr(val,"edf") <- attr(v,"df") val } "extractAIC.nlrq" <- function(fit, scale, k=2, ...){ aic <- AIC(fit,k) edf <- attr(aic, "edf") c(edf, aic) } "print.nlrq" <- function (x, ...) { cat("Nonlinear quantile regression\n") cat(" model: ", deparse(formula(x)), "\n") cat(" data: ", as.character(x$data), "\n") cat(" tau: ", as.character(x$m$tau()), "\n") cat("deviance: ", format(x$m$deviance()), "\n") print(x$m$getAllPars()) invisible(x) } # For the moment, print.summary is the same as print # However, some extra diagnostic should be done here "summary.nlrq" <- function (object, ...) structure(object, class=c("summary.nlrq", class(object))) "print.summary.nlrq" <- function (x, ...) { cat("Nonlinear quantile regression\n") cat(" model: ", deparse(formula(x)), "\n") cat(" data: ", as.character(x$data), "\n") cat(" tau: ", as.character(x$m$tau()), "\n") cat("deviance: ", format(x$m$deviance()), "\n") print(x$m$getAllPars()) invisible(x) } "coef.nlrq" <- function (object, ...) object$m$getAllPars() "deviance.nlrq" <- function (object, ...) object$m$deviance() "tau.nlrq" <- function (object, ...) object$m$tau() "fitted.nlrq" <- function (object, ...) { val <- as.vector(object$m$fitted()) lab <- "Fitted values" if (!is.null(aux <- attr(object, "units")$y)) { lab <- paste(lab, aux) } attr(val, "label") <- lab val } "formula.nlrq" <- function (x, ...) x$m$formula() "predict.nlrq" <- function (object, newdata, ...) { if (missing(newdata)) return(as.vector(fitted(object))) object$m$predict(newdata) } "residuals.nlrq" <- function (object, type = c("response", "rho"), ...) { type <- match.arg(type) val <- as.vector(object$m$resid()) if (type == "rho") { tau <- object$m$tau() val <- tau * pmax(val, 0) + (1 - tau) * pmin(val, 0) attr(val, "label") <- paste("quantile residuals rho(", tau ,")", sep="") } else { lab <- "Residuals" if (!is.null(aux <- attr(object, "units")$y)) { lab <- paste(lab, aux) } attr(val, "label") <- lab } val } "summary.nlrq" <- function(object, ...) { y <- as.vector(object$m$resid()) X <- object$m$gradient() tau <- object$m$tau() pnames <- names(object$m$getPars()) f <- summary(rq(y ~X-1,tau), se = "boot", covariance = TRUE, ...) f$coefficients[,1] <- object$m$getPars() f$coefficients[,3] <- f$coefficients[, 1]/f$coefficients[, 2] f$coefficients[, 4] <- if (f$rdf > 0) 2 * (1 - pt(abs(f$coef[, 3]), f$rdf)) dimnames(f$coefficients)[[1]] <- pnames f$call <- object$call f$tau <- tau class(f) <- "summary.nlrq" return(f) } "print.summary.nlrq" <- function (x, digits = max(5, .Options$digits - 2), ...) { cat("\nCall: ") dput(x$call) coef <- x$coef tau <- x$tau cat("\ntau: ") print(format(round(tau, digits = digits)), quote = FALSE, ...) cat("\nCoefficients:\n") print(format(round(coef, digits = digits)), quote = FALSE, ...) invisible(x) } quantreg/R/combos.R0000644000176200001440000000121713075136524013715 0ustar liggesusers"combos" <- function(n,p){ if(length(n) != 1){ n <- n[1] warning("Using first element as n") } if(length(p) != 1){ p <- p[1] warning("Using first element as p") } if(n != as.integer(n)){ warning("Coercing n to integer") n <- as.integer(n) } if(p != as.integer(p)){ warning("Coercing p to integer") p <- as.integer(p) } if(p > n) stop("p is greater than n") m <- choose(n,p) z <- .Fortran("combin", as.integer(n), as.integer(p), as.integer(m), a = integer(p*m), integer(n), integer(n), integer(n)) matrix(z$a,p) } quantreg/R/kuantile.R0000644000176200001440000000431113776615657014266 0ustar liggesusers"kuantile"<- function(x, probs = seq(0,1, 0.25),na.rm = FALSE, names = TRUE, type = 7, ...) { if(na.rm) x <- x[!is.na(x)] else if(any(is.na(x))) stop("NA's and NaN's not allowed in 'x' if 'na.rm' is FALSE") if(any(is.na(probs))) stop("NA's and NaN's in 'probs' not allowed") if(any(probs < 0 | probs > 1)) stop("probs outside [0,1]") p <- probs op <- order(p) p <- p[op] n <- length(x) m <- length(p) g <- rep(.5,m) if(type == 1) #Hyndman-Fan Typology k <- j <- pmax(1,ceiling(p*n)) else if(type == 2){ j <- pmax(1,floor(p*n)) k <- sort(c(pmax(1,j),pmin(j+1,n))) g <- ifelse(p*n > j, 1, 0.5) } else if(type == 3) k <- j <- pmax(1,round(p*n)) else{ switch(type - 3, {a <- 0; b <- 1},#Type 4 {a <- b <- 0.5}, #Type 5 {a <- b <- 0}, #Type 6 {a <- b <- 1}, #Type 7 {a <- b <- 1/3}, #Type 8 {a <- b <- 3/8}) #Type 9 d <- a + p * (1 - a - b) j <- floor(p*n + d) g <- p*n + d - j k <- sort(c(pmax(1,j),pmin(j+1,n))) } uk <- kunique(k) uz <- kselect(x,uk$xU) z <- uz[uk$ix] if(type %in% c(1,3)) A <- matrix(z,m,2) else A <- t(matrix(z,2,m)) G <- cbind(1-g,g) y <- (A * G) %*% c(1,1) # <=> diag(crossprod(A,G)) y <- y[rank(probs)] if(names && m > 0){ dig <- max(2,getOption("digits")) names(y) <- paste(format(100*probs, trim = TRUE, digits = dig), "%", sep="") } class(y) <- "kuantile" return(y) } "kselect" <- function(x,k){ n <- length(x) m <- length(k) z <- .Fortran("kuantiles", k = as.integer(k), m = as.integer(m), n = as.integer(n), x = as.double(x)) return(z$x[z$k]) } "kunique" <- function (x, isuniq = !duplicated(x)) { # shamelessly plagarized from Martin Maechler's sfsmisc package need.sort <- is.unsorted(x) if (need.sort) { xs <- sort(x, index.return = TRUE) ixS <- xs$ix isuniq <- isuniq[ixS] x <- xs$x } ix <- as.integer(cumsum(isuniq)) if (need.sort) ix <- ix[sort.list(ixS)] list(ix = ix, xU = x[isuniq]) } q489 <- function(x, tau = .5){ n <- length(x) z <- .Fortran("qselect", as.integer(n), as.double(x), q = as.double(tau)) z$q } quantreg/MD50000644000176200001440000002363314470144215012421 0ustar liggesusersb1f924a48acae24a3fb518ecb2ab2656 *DESCRIPTION 59ae171f84eb2be52ee904fe100b1291 *NAMESPACE 6c1789eaa459e5175106e2eba12bdbb4 *R/ParetoTest.R 708697bbfb4cbcf4664df9e26380bc66 *R/anova.R 3f4b1aec96f0b43d0ba9d3be270d36d4 *R/boot.R 0f5c733522683d9f88c7487515bc52de *R/combos.R efb3424dc544ed9c6ddd522c167c496b *R/crq.R 34bc98c3a42d48a718f06e31df95431f *R/dynrq.R 3e27870071ee6cd633956a2ad6946499 *R/khmal.R 44dbaf9a2729c29c089086617e815817 *R/kuantile.R d2f509eb6977017d1b77faae7de97a7c *R/lprq.R 74e57bf2387ac9e764dfc185bec65980 *R/nlrq.R 23abbfdfe6ab274c1ebe89aaa4d825ef *R/qrisk.R 3bf5158a9b5a4d1b34d4713b9d360f29 *R/quantreg.R a77c6ad37ae6093e30c9d639e27351f0 *R/rqss.R f7723bc3ed3a21afb5b60417ddc7baa0 *R/sfn.R 522fc9d16e1ef995877eaaf3972eb29e *R/table.R 11102c1b9076b53ebaac51cc79b90bfb *R/tools.R 00f6440dcfd495483f57d543f4918de0 *README e09c24c453cc999bb8a83facb461775d *build/vignette.rds 56ef7db1af717ba44a86062560b034df *data/Bosco.rda 403622377f41685bab4f044f2dac7785 *data/CobarOre.rda 3d69ca4dff26067565dddb340c8d12a3 *data/Mammals.rda 3ea9205a82abc3bef3ff9aa4c0b3c6d2 *data/MelTemp.rda 6e59d02236628b81168bf984cfa098d9 *data/Peirce.rda 16131516dc017723dd2b44b7be7d0b0b *data/barro.rda 2cb41ec2ee5de9777a3577f2e441e17c *data/engel.rda 693ec4307b3dbdd7bf234215b8d65ffc *data/gasprice.rda 175e672761a8912f1c6221e232f3d088 *data/uis.rda 3234ebf9fac1080114876484d936544c *demo/00Index 45e5019ec3600dddc740bd9c6b5435e3 *demo/Frank.R 5264e9798b77f8c83153b37fa71e1a4c *demo/KMvCRQ.R 61962e1209de42a8d8f73a4844d83802 *demo/MCV.R 999f285311986ba48839f973b543ccbb *demo/Mammals.R b4f9fd933511f97b0f7408dc6b401c4d *demo/Mel.R 0f6eb578db3343cd49234c2d68e73d5c *demo/Mel2.R 2b83cdb0cd34debfcd80ef266f07f0b4 *demo/Panel.R 8871644563874ecaf6184266985d5e72 *demo/Polson.R f6b197c9dd0ccf97b10fab9e8f9be542 *demo/RB-r.R a9cc1e5271ab2c9f1311705ac34b0401 *demo/arqss.R fcf5e10320aea6e0ad0b4f949da834e1 *demo/cobar.R 4288d49cb3eb56ec86798b28da27e791 *demo/combos.R f859ed7e3664566f9d74636d537b8762 *demo/cpoint.R 6c55988db9dee0d6dbde385185967de2 *demo/crquis.R d907e0e11fd1a4007ca28a3d1b03efed *demo/engel1.R 66c9a9b4a33a03bba9805d4b6dbd1cbb *demo/engel2.R 7ac73a95fd412129c2d1295a00d6865f *demo/hinged.R 2b83cdb0cd34debfcd80ef266f07f0b4 *demo/panelfig.R ea9c96de3d670a1fa922585cf85789e3 *demo/predemo.R 32f68b8e497d02b2cae7cf5f9b83ff52 *demo/rqsslasso.R 5235d61a73c80e7eb83777d7d923d144 *demo/stack.R a582af0bad3d273cb076a346c906cba5 *demo/subset.R 3b2a3fb335a44402e61316c1edf41bb9 *inst/ChangeLog 8266697d263517278ba9c7d5a97ef42a *inst/FAQ f2732c4ab5eb2f4ca3421239a030f0ee *inst/TODO 3fb70411ec441d151dcae73d63a5e018 *inst/doc/crq.pdf 48b99baf4f65ac9b9a820769d55a75f0 *inst/doc/crq.pdf.asis 8d7109abf013b827de1f1cb7a2854a34 *inst/doc/rq.pdf 8faba626ac2f6a7ca45473bca52e2e67 *inst/doc/rq.pdf.asis 64449a66c0d80474c7aefef8907b8f05 *man/Bosco.Rd 768cf6c848f78a1862b44371c1f3e2a4 *man/CobarOre.Rd 5701d2b99e27ab58a510d8d2d9a7832e *man/FAQ.Rd 10e300026d352f6940c4f22d7eda1868 *man/KhmaladzeTest.Rd ca950153dafc968e44ffa412177bcb88 *man/LassoLambdaHat.Rd 5b7d1c28799b3f9e4691ad61bf69b5b0 *man/Mammals.Rd e0161d8945e1258ff78943b06d7298de *man/MelTemp.Rd 87b1e3e354423acdff86f29b0999d89c *man/Munge.Rd 5e19c6a25ab4ac17d770ee7c24c981e6 *man/ParetoTest.Rd 1c55b05cfde94862b2503523ccca1998 *man/Peirce.Rd 114a06055c68efb323cb9dd8a7278050 *man/QTECox.Rd 9d5c7b53fc04bbbbe5820d2d616e31b5 *man/akj.Rd a303a4ced70b992220472a10f79fa65c *man/anova.rq.Rd 742ec68efdfbcf12a2a47e1adcfde3fe *man/bandwidth.rq.Rd 36991ef697fde62deb19e355974477dd *man/barro.Rd 9121a0c8f5ade9142d089cfb87db490b *man/boot.crq.Rd 04100f2d44413f147c904ad5a784d62d *man/boot.rq.Rd e82257e42bca148c307aadf04829ce4a *man/boot.rq.pwxy.Rd 79f67fde266ceeeac49ac2628884650b *man/boot.rq.pxy.Rd f0c967422ef597cf9b87bee298fc0ec9 *man/combos.Rd e95befd0c07043e2f858f55c43d95b51 *man/critval.Rd a38140e53d0ce37aeef2e9c8764b36af *man/crq.Rd 7a808195ff0171df916917d7ed31ecb7 *man/dither.Rd c788c8d2b04ca2720385021ea88fba1f *man/dynrq.Rd 1a3a7dbfb064513db6b48ce85d06524f *man/engel.Rd 1d469f209e0a9ce8a5f0d81ca45c37c0 *man/gasprice.Rd ae4f006622b154a304a34633f9bc56c0 *man/kuantile.Rd e03ac409e3cf886564c982e0225f9876 *man/latex.Rd 689ab28a6c1f74159fec1e7469f4f878 *man/latex.summary.rqs.Rd 9a0e4c743c6fe7fda830b2bd60eb6999 *man/latex.table.Rd 08e8c0de0437be5f697bf6b8fed95ac7 *man/lm.fit.recursive.Rd f0fb5464e8dc6dc0de17d2e11cdae24f *man/lprq.Rd 5535e4c74d8c8b876cd1412c079237f8 *man/nlrq.Rd d2e7a73053e94b9a0444af290d0a19a1 *man/nlrq.control.Rd 01a0f1c6e3d5edb2ab5e8592b9d88620 *man/plot.KhmaladzeTest.Rd aa5102d7ad3c26a1eb17570d8e712134 *man/plot.rq.process.Rd f147921961ec856f8ab74dccc81466cc *man/plot.rqs.Rd c13ffb80fa594fbfcecc2d2b1dbbf55a *man/plot.rqss.Rd ded41d155578d1d75df60ab5332c6fac *man/plot.summary.rqs.Rd db8b8073598318c738c5e475a8e74c62 *man/predict.rq.Rd ac427a32840e5aabddb87df2ff2b64a2 *man/predict.rqss.Rd 4eeff49d40b43c732f92ab317d9b7650 *man/print.KhmaladzeTest.Rd 686fc7e0c9f3138fd5ff01645b8e9911 *man/print.rq.Rd 5745e185fe3d47339bd0242bdbc29e23 *man/print.summary.rq.Rd 8d1f34ce14b8da44a7a84ce9eac0e099 *man/q489.Rd 261f6c62bdd9db554c3d7999185f191c *man/qrisk.Rd e7fa217bf726ed0efa7342f4fb4d310b *man/qss.Rd a916d9f3d2bed1c77cba165f268873a6 *man/ranks.Rd e4a4292807cd1a251a98f57e7892e427 *man/rearrange.Rd 6f68d1c8d2c8cc7009c9c13f102acd27 *man/residuals.nlrq.Rd 3f3b6af2a92f01f777669b8c76431c26 *man/rq.Rd 97edf8f7e4a17a81e73bfe2889b9c899 *man/rq.fit.Rd aea8247091db06872d7b0b25ff7e8184 *man/rq.fit.br.Rd 016b697ad60256a0b3d0e09acf76ab31 *man/rq.fit.conquer.Rd 67225085d5c626b389544a23b8116d80 *man/rq.fit.fnb.Rd d0f422911138a73ea6f7f236dc28bd8e *man/rq.fit.fnc.Rd c80cfbe02e22a91c22139355bf151269 *man/rq.fit.hogg.Rd c8277c4702a9baf8c46c89e4a53e9cf7 *man/rq.fit.lasso.Rd f6b9d69a6975d7741178dc18b4426bba *man/rq.fit.pfn.Rd f12c21b68faa80a9db051405aaca9d78 *man/rq.fit.pfnb.Rd aa976325fa2a0f23f71cafab9091b8db *man/rq.fit.ppro.Rd 1228e0e3446d874ad8cc1c15cf144e9d *man/rq.fit.qfnb.Rd 55f92799613bbb08fd10107f92a55c16 *man/rq.fit.scad.Rd 4eda8605d8c65c05f78621e1418fdf6c *man/rq.fit.sfn.Rd fa356613a916b242cccfa02593986d4e *man/rq.fit.sfnc.Rd 5b3b9d437a05dc195caa2502b1e72e9a *man/rq.object.Rd c42b5515ccf48527ae43449357b3dfb0 *man/rq.process.object.Rd 0a8b72f28db402c6333d4387f0fca020 *man/rq.wfit.Rd 7f71e0ab0e75719d478a54b4404f896d *man/rqProcess.Rd 47b5d67bdd5108808d62c0905ab8e58a *man/rqs.fit.Rd 60adfb48bc8cf2d2728035eb0d19f547 *man/rqss.Rd 1d5e4c75789a5fac11763df6b7edef03 *man/rqss.object.Rd 7a198b2a81968dc5da8b7f59ff282714 *man/sfn.control.Rd 2dfb6597245f45ee542f157105db4bc4 *man/srisk.Rd cf9fd105c0bd87edbcce9ec4a71780e5 *man/summary.crq.Rd 3ec599a6f561cd6908bfa5032e59be75 *man/summary.rq.Rd 8d1741b40851f000d6ab080331b93a28 *man/summary.rqss.Rd 7c19b7bc8dcaeafdb05e8fae65322c04 *man/table.rq.Rd f5a8859d2b97685d09b1e5bc77f27194 *man/uis.Rd bda0ebc1c480b97ce4c9cb3b2ddaf9a9 *src/Makevars 85f5794fa8b4d5f0656c3330b2a51360 *src/akj.f 2923f24ddccf1a8036d1639f0d899f23 *src/boot.f bb6fb4e8354bba1c16aeaf0cf5f9768e *src/bound.f f3a2629172dbce899d97b55d42490e5f *src/boundc.f 1bcb651bc603316f27c0c6a38f85d70b *src/brute.f 227e77b85b2278a98a0f434a0106d858 *src/chlfct.f 9a8bd868bd58c2480c9afb53bb087002 *src/cholesky.f 344362611adeaf7c79c8c5a5c344aa21 *src/combos.f 6613198e21236c98f7eb46a830ab09ef *src/crqf.f b804ab3d1bd9b62cb5b201d5f2827668 *src/crqfnb.f a22827856f4818d9e202adee29184a11 *src/dsel05.f 2d19097f7cd6cf38a3ed971ebab917f9 *src/extract.f 2843ca0c6210e382571f62de62ba2fd4 *src/frand.c 8477411df62550adb9c16c81844f1dfb *src/grexp.f ebcf4bf9967db6f738fa56684414627f *src/idmin.f 64caadde39f4c814949c37af379fb270 *src/iswap.f a7fcca4bae02f091040a7b3229e60104 *src/kuantile.f 989c81d2cfe84db1139fb34370babf7c *src/kuantiles.f ca347ccd4d515f52f554f9d2d17f1b46 *src/linpack.f bd367d08c640378ec21e2cc69f8bd8bb *src/mcmb.c dd733aa428e0c89b27369672ed35feed *src/penalty.f aa1c7f42338ca5cab5d660c86460c859 *src/pfnb.f bd02eb1fbf344dd91d0e24a60a1c5269 *src/powell.f 7641a9d3cf6c240ab6c59e16a9b7d4c8 *src/profnb.f abef5781d8b3c202a444af9fb291072b *src/pwxy.f b8b6da4241edbbf057b398691772e4b0 *src/qfnb.f 00b5c50c8caa28b22e1434a7436d0bb9 *src/qselect.f 8e36db97b4d1a23328d5ceba8c882bf7 *src/quantreg_init.c d2eb1038dddc50e80368118675819272 *src/ratfor/README df3e98bf71bf48242ffe8a2939ea98b4 *src/ratfor/boot.r abc8e4125098a8ec492c6d56a2e990ed *src/ratfor/brute.r 3e5dff3e19ea81068ea86fd98c510acf *src/ratfor/combos.r b569add1122b3e4cd029915ecea9a548 *src/ratfor/crqfnb.r a058db5df513de1b5e89385a6eb21c46 *src/ratfor/grexp.r 7c807299a3375d290406d491211a441f *src/ratfor/kuantiles.r b6107d8e8661f641a0199a1d7972a844 *src/ratfor/penalty.r cd4d6264bea3eeadb08bd659890bab41 *src/ratfor/pfnb.r 6d74f3c8f1b5dcb25fc879236a7447e2 *src/ratfor/powell.r 60c66e271c58da8e547accbaecb1913d *src/ratfor/pwxy.r e97583079efd291c479548af68f78b1f *src/ratfor/qfnb.r 7a211874682556b49d290d27b1520290 *src/ratfor/qselect.r f38b4b2bbad4d6f924f63c120e57374b *src/ratfor/rls.r 8e286089e89b453c211465cd732806ec *src/ratfor/rqbr.r 3ddce8dbdf5360a6db3e4c6780984106 *src/ratfor/rqfn.r 208ea6ff24b897cbc012fcc3084bf087 *src/ratfor/rqfnb.r 871292f8ecd406be005eaf914282f332 *src/ratfor/rqfnc.r 6b34a4c3ddbc92462cc5f9df01852bdf *src/ratfor/rqs.r 0e001756ea962193959d53abd1f2cd85 *src/ratfor/sakj.r f55c27cd17f314e965550006712b6b20 *src/rls.f adc10cd5c28afaa18b3b90e138e02b13 *src/rq0.f d40fa68fb77b43b94bf693452565a2b9 *src/rq1.f 120a0f8d078df59a5d0c18e824703087 *src/rqbr.f 42a4780dc3b31dcdb2af2a58f3f73145 *src/rqfn.f b353855747f32c33cd3543ac87151ee0 *src/rqfnb.f cbe8e3c270c3863ecbd3d01ba512b2c4 *src/rqfnc.f 2e4d138de042e0dc24f5432dea05a7f6 *src/rqs.f 8420f9a87d703ab5237d1707f25eb3a9 *src/sakj.f aef01c414f773d044dc72cb95c8741f4 *src/sparskit2.f ec5e92b756a88e077a3de86c8fb7bf86 *src/srqfn.f 5e11cb4cad5ff02717b26234beae168f *src/srqfnc.f 2d66ab8cf738665d38eea1dca124b264 *src/srtpai.f a838141113a2049f3ca6b6c5914989bc *tests/panel.R 62bf15687c35cd5a9fa8d05d94fe28a5 *tests/rq.R 9010017cc909325f119ca1bc119560ab *tests/rq.fit.panel.R 88bcffa8d0464bf62f7535f89c4a9e7f *tests/run-demos.R 48b99baf4f65ac9b9a820769d55a75f0 *vignettes/crq.pdf.asis 8faba626ac2f6a7ca45473bca52e2e67 *vignettes/rq.pdf.asis quantreg/inst/0000755000176200001440000000000014470135023013054 5ustar liggesusersquantreg/inst/ChangeLog0000644000176200001440000020172714470134753014650 0ustar liggesusersRecent Revision History (For older revision history diff the code ;-)) 3.04 September 19 2001 1. ci set to F if p==1 to prevent seg fault identified by Marcel Wolbers. 3.05 December 21 2001 1. "iid" case in summary.rq fixed to update call to l1fit 2. documentation and consistency checking updates to conform with R1.4.0 3.06 March 5 2002 1. Added LEGAL directory to clarify the licensing arrangement with Splus/ Insightful Corp. 3.07 March 2002 1. Expanded table.rq to use method="fn", and adapted plot.table.rq to use the polygon strategy of recent papers for the confidence band. 2. Adapted the old version of latex.table and latex.table.rq to use output of table.rq to make latex tables from the output array. This eventually could be updated to fit better into the expected R version of Frank Harrell's Hmisc. (The function latex.table is a slightly hacked version of Frank's old latex.table function for Splus.) 3. Added argument transpose to allow the tables to be flipped so that row dimension is quantiles rather than coefs. 4. Added error checking for tau+/-h outside (0,1) in summary.rq 5. Revised rq.fit.fn and rqfn.[rf] to simplify the calling sequence basically to move the initialization into the R function. (This is in preparation for a new version that will incorporate inequality constraints.) 6. Also relaxed upper bound constraints so that they could be specified in rq.fit.fn rather than assumed to take the value one. 7. Added a (long awaited) anova function for rq to do F test like inference for both nested models for a single quantile and tests of equality of slope coefficients across identical models estimated at several quantiles. These new functions are (for the moment) in the R directory as anova.R. 3.08 May 22 2002 1. Fixed a bug in anova.rqlist ndf = (p-1)*(m-1) not p*(m-1). 3.09 May 27 2002 1. Added new functions rq.fit.fnb and rq.fit.fnc and associated fortran and ratfor code. The former is a slightly revised version of rq.fit.fn the interior point algorithm for computing rq; it should have exactly the same functionality as the prior version, but _might_ work somewhat more efficiently on some problems. The new function rq.fit.fnc is an interior point method for fitting rq problems subject to inequality constraints on the coefficients. The algorithm is a modified version of the interior point method used for unconstrained problems and should be described in detail (eventually) in a paper with Pin Ng. 3.10 July 4 2002 1. Revised slightly the rq.fit.fnb function and the related ratfor/fortran code to enable it to start at a (dual) point that doesn't satisfy the equality constraints. And attempted to fix the many places that used T/F rather than TRUE/FALSE in preparation for R-1.6.0 (at the suggestion of Kurt Hornik.) 3.11 July 10 2002 1. Fixed a few more T/F's at Kurt's behest, and changed some _ to <- in the examples. And added PACKAGE = "quantreg") to the .Fortran calls. 3.12 Nov 1, 2002. 1. fixed two generic inconsistencies Kurt found in table.R. 3.13 December 18 2002 1. Fixed bug in summary.rq when se=iid found by Xuming. 3.14 December 30 2002 1. Added a graphics example to rq.Rd using the Engel data and added the data set 3.15 January 22 2003 1. Fixed a typo in the akj.Rd file and added a reference. 3.16 February 6 2003 1. Fixed a generic method mismatch in the latex family prompted by Kurt's notice that R CMD check quantreg produced a warning in R 1.7.0. Now seems to check cleanly in the devel version of 1.7.0 installed today. 3.17 February 17 2003 1. Removed the last of the _ assignments in the example files. 3.18 March 4 2003 1. Fixed a documentation bug in rq.fit.br the entry for alpha was changed from: alpha: the nominal coverage probability for the confidence intervals to alpha: the nominal noncoverage probability for the confidence intervals 3.19 March 25 2003 1. Added src/Makevars file in accordance with Brian's email request, see R email folder. 3.20 April 27 2003 1. Found a bug in the fn family of fortran/ratfor functions. When the initial least squares start produced a residual which was a hard zero, then the initial value of Q had a NaN value and this caused the function to return with all NaN coef values. This was altered to make z and w = eps when this happens. 2. When interp=FALSE in rq.fit.br the tcrit flag was broken. 3. added names to coef return when CI= FALSE in rq.fit.br 3.30 August 13 2003 1. added several bootstrapping methods to summary.rq including the MCMB approach of He and Hu based on code by Xuming He and Maria Kocherginsky. 2. added n choose m subsampling for the xy pair version of the bootstrap. 3.31 August 25 2003 1. fixed a bug in anova.rqlist that messed up the checking for an intercept found by Juan de la Garza. 3.33 January 09 2004 1. Fixed a bug in ranks() found by Brian Cade involving the tau score function. 3.35 March 09 2004 1. Changed the default behavior of rq to produce only the point estimates and residuals when 0 < tau < 1, instead of automatically producing the rank inversion confidence interval table. The latter is now available from summary.rq by specifying se="rank". (This is actually the default option in summary.rq when the sample size is less than 1001. 2. Altered anova.rq slightly to accomodate its use for two sample rank tests -- this task was simplified somewhat by (1.). 3.36 June 9, 2004 1. Scoping problem in summary.rq made data invisible when formula variables were specified using data=blot in rq(). This entailed a somewhat extensive updating of rq and summary.rq in accordance with the "Notes on model-fitting" white paper on the R developer page. Thanks for that! to the anon author. Now rather than passing x,y a model object is passed indicating how the model should be reconstructed. As a byproduct, the lowest level fitting routines no longer return x,y, thus saving some memory. 2. added a error check to boot.rq to prevent users from calling with tau outside (0,1). Calls with tau = 1 produced a rather nasty memory overwrite as experienced by Alexis Diamond, debugging required some interesting adventures with gc(). 3. Major revision of the code to do inference on the rq process based on the Khmaladze approach. See khmaladze.test for further details. In the process discovered a minor bug the resulted in problem with the Joint test statistic. (Two missing commas!) 3.50 July 17, 2004 1. The function table.rq was made defunct, replaced by the more direct ability to specify multiple taus in rq(). When a vector of taus is specified, rq() returns an object of class rqs, and summary.rqs produces output for each tau. There are plot and latex methods for objects of class summary.rqs. 2. The Solaris f95 compiler choked on the & in column 1 of akj.f, so this has been moved to col 6. 3.60 September 20, 2004 1. The choice of bandwidth was corrected for the "ker" method in summary.rq() to account for the scale of the residual vector. Thanks to Victor Chernozhukov for pointing this out! 2. On a 64bit gentoo linux system the statement data one/1.d0/ set one = equal to zero...so I have systematically changed all data statements to parameter statements. This seems to be a general problem that was created by gcc 3.4. On the updating note that several of the .f files were preprocessed by a new ratfor processor. See the README file in the src/ratfor directory for further details. This bug in g77 was reported to the gnu folks and a patch was forthcoming with about 48 hours. If only American foreign policy could respond so efficiently to their snafus. 3.70 October 1, 2004 1. The nprq and nlrq packages for nonparametric and nonlinear QR were folded into quantreg. The revision file for nlrq is reproduced below: This is a package for estimating nonlinear in parameters quantile regression models. The algorithm is originally based on an Splus implementation of Koenker and Park (1996, J. Econometrics). The interface to model specification a la nls() was very kindly provided by Philippe Grosjean. It was originally submitted to CRAN in May, 2001. Version 0.1-4 (May, 2004) ` o Added method argument to nlrq() to be passed to optim() at the suggestion of James Rogers (Pfizer) See the documentation files for rqss() and friends for further details on the nonparametric functionality. There is a strong dependence of the rqss fitting functions on the SparseM package, and some use of tripack, and akima packages as well. Finally, the demo for the triogram fitting included in the demo directory wants the rgl package. 2. Brian Cade sent an example for forensic exam, which revealed that the call to model.weights failed to work properly in summary.rq This is now fixed using model.weights(object$model). 3.71 November 18, 2004 1. The translation of boot.r and penalty.r were updated using the SEM ratfor compiler so that their continuation characters appeared in col6 not col1 -- to comply with our local switch to Sun compilers on ysidro and with the other code in the package. (Isn't fortran wonderful?) Now that we are back to gcc this isn't needed here, but might save some one else some consternation. 3.72 November 27, 2004 1. Reference to nls package was removed (thanks Kurt) since it has now been merged into stats. Also upped Depends to R >= 1.9.0. 3.73 December 1, 2004 1. Fixed a small bug in summary.rqs which had appended olscoefs for no apparent reason, and this caused a printing error. 2. Fixed large bug in anova.rqlist in which chi-squared statistic was divided by numerator degrees of freedom (ndf) when this had already been done in rq.test.rank, and modified the way that the score function specification was passed. 3. Also fixed a printing glitch in the anova.rq procedure by adding an explicit print method for such objects. 3.74 February 24, 2005 1. Fixed bug reported by Steve Portnoy in summary.rq. The se="iid" option was broken after the switch from a matrix valued coef object to a vector one. 3.75 March 11, 2005 1. Fixed bug reported by Jose Machado in predict.qss2. Further work is needed to integrate these methods for qss2 and qss1 objects into a upper level predict.rqss function, but this will have to wait. 3.76 March 17, 2005 1. Jan deLeeuw reported that the warnings for rqbr.f had turned into errors in g77 4.0 -- some hand editing of the ratfor translation fixed this, but it is depressing to think that there isn't now an automatic way to get from the ratfor. See the README file in the ratfor directory for gory details. 3.77 April 28, 2005 1. Cleaned up a few unescaped % signs in the .Rd files at the request of Kurt. 3.78 May 2, 2005 1. Finally added back in the vignette just in time for the first copies of QR from CUP. 3.79 May 2, 2005 1. Fixed 3 problems identified by Gabor Grothendieck having to do with rq interaction with fitted() and residuals() and na.action. 3.80 May 11, 2005 1. Added predict method for rq and a subset argument. 3.81 May 14, 2005 1. Added a flag to enable anova.rq to allow computation of separate tests on each of the slope parameters for equality across quantiles. 2. Fixed reference to Engel (1857) in the vignette. 3.82 May 15, 2005 1. Added a formula.rq function that seems to be necessary to make formula updating work. 3.82 May 20, 2005 1. Modified initial bandwidth in akj() to insure default starting value, this had produced a rather mysterious bug that was only apparent on a few machines due to (essentially) trying to check whether double(0) <= 0. 2. Modified predict.qss1 to fix a problem with non-unique x observations. This needs further work, ideally a predict.rqss function that would dispatch pieces of the prediction problem to the right lower level prediction function. 3.83 Nov 23 2005 1. Added a "cen" method to rq that fits the Powell censored regression model using the Fitzenberger algorithm. This is very beta for the moment and needs to have some inference methods written, before it is terribly useful. A related project will add Portnoy's CRQ method as well. 2. Fixed a bug in the predict.qss1 function that made it invisible. 3. Fixed several bugs in the rank testing with anova.rqlist in response to a report from Brian Cade. In particular, to enable rank tests with weighted QR. 3.84 Nov 28, 2005 1. One (last?) bug fix for rq.test.rank which for weighted data introduced a faulty intercept. Again, thanks to Brian Cade for the report. 2. Changed tau checking to not allow tau either 0 or 1 in an effort to discourage these values, which seems to have dire consequences on some machines, cf email of Andrew Clausen regarding segfault on Debian. 3. Added summary.fcrq and summary.fcrqs to provide some basic inference on the Powell censored regression estimator. 3.85 Feb 11, 2006 1. Revised predict method for rqss objects motivated by an inquiry by Denis Chabot. 2. Added a note to explain that the default se method in summary.rq was sample size dependent. 3.86 March 16, 2006 1. Revised rq to allow taus to be 0 or 1 when there multiple taus. 3.89 March 31, 2006 1. Changed summary.rq so that call to rq.fit.fn is to rq.fit.fnb based on an example provided by Nantachai Kantanantha. The former called produced NaN's for the coef vector, while the latter agreed with rq.fit.br. This deserves some more attention at a later point. 2. Added function kuantile which implements the O(n) algorithm of Floyd and Rivest for computing univariate quantiles. 3.90 May 17 2006 1. Major revision of the rqProcess and KhmaladzeTest functions. 2006-08-14 Martin Maechler * tests/rq.R (stopifnot): regression tests added. * man/plot.Rd: improve; notably plot.qss2() arguments * man/predict.rqss.Rd: no rm(.) in example; improve 2006-08-12 Martin Maechler * R/quantreg.R (akj): 'iker2' is never used; add a check for length(p) == length(x) [vignette did not fulfill this and gave spuriously wrong results because of initialize memory in .Fortran("arj" ...) ! * inst/doc/rq.Rnw: fix the akj() weights * man/akj.Rd: no 'iker2'; cleanup 2006-08-11 Martin Maechler * tests/run-demos.R: one simple test suite .. * demo/cobar.R: make sure this also works when 'rgl' does not * demo/Frank.R: clean up a bit * demo/engel1.R: nicer; + legend * demo/engel2.R: is incomplete => if(FALSE) { .. } for the moment FIXME: use vignette ! * man/engel.Rd: added somewhat interesting example. * src/chlfct.c (chlfct): eliminate goto; correct timing also when error; more comments (timewd, etc) * R/sfn.R (rq.fit.sfn, rq.fit.sfnc): only keep what's needed from .Fortran(). Save one (sparse) matrix multiplication 2006-08-09 Martin Maechler * src/srqfn.c: new from src/srqfn.f ... * src/srqfnc.c: new from src/srqfnc.f ... 2006-08-05 Martin Maechler * src/cholesky.c: new from src/cholesky.f which must be renamed 3.91 Sept 11, 2006 1. Removed Makevars from src directory which seemed to be causing some difficulties with multiple definitions of symbols for gfortran. 4.00 Sept 11, 2006 1. Implements some suggested fixes by Martin Maechler. See detailed entries of Martin above. 4.02 Oct 21, 2006 1. Fixed problem with olscoef plotting in plot.summary.rqs. 2. Changed variable names in the engel data and examples to avoid long-standing problems of masking x,y names. Thanks to Marc Schwartz for pointing this out. 4.03 Nov 18, 2006 1. Fixed memory problem with rq.fit.fnc when n2 > n1, the vector u was being used as a scratch array but had insufficient space. 2. Fixed rqProcess bug with "location-scale" option noted by Alvaro Novo. 4.04 Dec 19, 2006 1. Removed [.terms from rqss.R at the advice of BDR. 2. Added a summary.nlrq function to bootstrap se's. This is highly experimental at this stage. 4.04 Jan 15, 2007 1. Modified penalty.r so that it checks to ensure that all triogram quadralaterals have the same orientation, this was a longstanding bug that prevented that convexity and concavity constraints from properly working. Still needs further checking.... 2. Some mostly cosmetic changes were made in rq1.f in the course of debugging an apparent problem in boot.rq.xy which eventually turned out to be caused by a rank deficient X matrix. Some attempt was made to improve the reporting of this, but I'm afraid there are some inherent problems in the BR code that makes it difficult to recognize this sort of problem. 3. Added a residual vector to the object returned from rqss.fit to conform with general R practice and also because it was needed to do some exploration of the number of exactly fit points in an example of Xuming He. 4. Added a demo called cpoint.R that illustrates how rqss can be used for a simple broken stick piecewise linear median regression problem. 4.06 Feb 1, 2007 1. Fixed legend ordering problem in rq.fit.fcen.Rd. 2. Fixed a call to as.matrix.csr(diag(n)) in rqss to avoid creating a dense matrix. 3. Added summary.rqss logLik.rqss and AIC.rqss functions 4. Fixed etime bug in Cholesky.c according to a patch kindly provided by Simon Urbanek. 4.07 April 17, 2007 1. Added two new methods for fitting: rq.fit.lasso and rq.fit.scad. 2. Added ... to a call to plot from plot.summary.rqs suggested by Tyler Smith. 3. Added the Peirce dataset and my attempt to reproduce the Wilson and Hilferty analysis of it. 4.08 July 1, 2007 1. Modified predict.rqs and added predict.rq.process to produce stepfun objects. 2. Added a function "rearrange" to do rearrangement of stepfun objects a la Chernozhukov, Fernandez-Val and Galichon. 4.09 August 7, 2007 1. Modified plot.summary.rqs according to a proposal by Achim Zeileis to improve default mfrow choice and tone down the colors to grey scale for better plotting. Also added a plot.rqs function 2. Changed predict.rqs and predict.rq.process so that the stepfun version is an option and the default is still returning a matrix. 4.10 September 12, 2007 1. Modified rearrange according to suggestions by Ivan Fernandez-Val and Victor Chernozhukov to acommodate right and left continuous stepfuns. 2. Cleaned up some Rd files that improperly documented methods. 4.11 Jan 15, 2008 1. Fixed summary.nlrq problem with coef/coefficient duplication 2. Fixed rqss problem with models without any qss terms Thanks to Hiroyuki Kawakatsu for pointing this out. 3. Fixed summary.nlrq to pass ... to boot.rq and updated man file 4. Fixed typo in demo/hinged.R pointed out by Brian Ripley 4.16 Jan 15 2008 1. Revised the formula handling for the Fitzenberger/Powell estimator and replaced the old rq1 fortran routine with an even more stripped down version from the crq package. (This seems to have eliminated a memory leak problem.) This is now called via crq() not rq(). 2. Added the Peng-Huang estimator as a option to crq(). This is preliminary step toward also folding in the crq package. 3. Fixed problem with crq FP method which required a new (bastardized) version of Surv called FSurv to accommodate fixed censoring times. 4. Incorporated crq package into quantreg and rationalized the interface to all crq functionality. Insert of revision history of crq: Version 0.3 Oct 2007 1. Fixed a bug in the boot.crq which led to double weighting in the bootstrap. Version 0.4 Nov 2007 1. Modified summary.crq (at the suggestion of S. Portnoy) to: a.) make .95 coverage the default rather than .90 b.) center intervals at betahat(tau) rather than median of bootstraps 5. Cleaned up the boot.whatever code to call rq1 in a consistent way as a prelude to investigating other bs methosd for crq. 6. Replaced Fitzenberger's qrcens fortran subroutine with a new version that was written from scratch along the lines of the pure R implementation of Barrodale and Roberts. 7. Reworked the naming conventions for the crq methods. Note that FSurv is now Curv. 8. Added an option to the Powell method to compute the full global optimum by pivoting through all the possible h's. This entailed a new function combos() that produces an ordered version of combn() output. 4.17 Feb 22 2008 1. boot.r had a wayward comma, 2. added start options for powell method. 3. Thanks to Robert McGehee for a report that g77 on his fedora system didn't like the ordering of the integer declarations in my fortran. Integers used as variable dimensions should be declared integer BEFORE they are used as dimensions in other arrays. (Picky, picky. Sometimes I wonder whether this is a conspiracy by the C-conspiracy to stamp out fortran altogether.) 4.18 Feb 23 2008 1. Revised the rho, logLik and AIC functionality of rq(), so it is easier to extract these values. 2. Revised predict.rqss and friends to fix a problem with variable names as suggested by Kyle Jennings. Further work is needed: print methods for rqss objects would be nice. 3. Changes to predict.rqs as suggested by Achim Zeileis. 4.19 Mar 31 2008 1. Added extractAIC method for rq objects. 2. Added singularity check for rq.fit.br since Gabor G pointed out that the checking otherwise isn't really reliable and when it fails, R may crash. (Still open question: should I provide some automagic aliasing for such situations?) 4.20 July 17, 2008 1. Added a reference for rq.fit.scad. 2. Added crq.pdf as a pseudo-vignette, pseudo because it isn't sweaved. 3 Fixed a bug in rq.fit.lasso for tau != .5. And for rq.fit.scad. 4. Fixed bug in plot.summary.rqs and plot.rqs when OLS=FALSE. Thanks to Jim Kossin UW-Madison for reporting this. 5. Modified both rq.fit.lasso and rq.fit.scad to allow a vector of lambdas to be passed thereby allowing users to fine tune the style of l1 shrinkage. In particular, to exempt some covariate effects from shrinkage by setting some elements of lambda = 0. In prior versions only the intercept was exempt and all slopes were shrunken equally. 6. Removed the function rq.fit.fn and made all invocations of method "fn" fitting call rqfnb version of the fortran algorithm. This was precepitated by finding that the earlier version of this alg had trouble with problems in which there were observations (x,y) = (0,0). Such observations shouldn't affect the solution, obviously, but on yzzy (my ppc mac desktop) they weren't so innocuous. This eventually was attributed to the fact that the initial setting of the dual variables was perhaps not feasible. The "fnb" version of the algorithm relaxed this requirement and seems to be generally more robust. 7. Modified the class structure for lassorq(s) scadrq(s), etc. objects so that they inherit from rq, rqs objects and therefore can use AIC evaluation for those methods. Note that there is a edfThresh option for AIC to determine how to evaluate the effective degrees of freedom when using the lasso and scad penalty methods. 4.22 Spetember 17 2008 1. Fixed bug in summary.crq which for the Bilias, Chen Ying bootstrap of the Powell estimator produced the wrong sample selection. Thanks to Ajay Shah for pointing out the problem. 2. Fixed bug in rq.test.rank which computed the denominator degrees of freedom incorrectly. (Thanks to Xuming He for pointing this out.) 3. Added a weighted bootstrap option to boot.rq a la Bose and Chatterjee using unit exponential weights. (This is a prelude to implementing another option for anova.rq using the approach of Chen, Ying, Zhang and Zhao (Biometrika, 2008). 4. Made a distinct version of rq1.f called rq0.f for use in the bootstrapping routines. So now rq1.f is used exclusively by crq, while rq0.f is used exclusively by boot.rq.: 5. Implemented the test proposed by Chen, Ying, Zhang and Zhao (2008) based on drop in the value of the objective function. (This uses the same resampling scheme as the Bose and Chatterjee GBS to compute a reference distn for the test the statistic. 4.23 October 13 2008 1. added the line: fstcol = 1; in cholesky.c which seemed to have been lost in MM's conversion to C. Thanks to to Kurt for pointing this out. (rather scary -- what?) 2. A major extension of the function predict.rq was made to provide confidence intervals for the predictions. This is now possible using a variety of methods, including percentile bootstrap and Portnoy and Zhou's "direct method". These methods can be used to construct prediction intervals as well. A more systematic study to compare the efficacy of these methods would be useful. A demo file has also been added to illustrate the useage of these predict methods: try demo(predemo). Thanks to Ivan Mizera for several contributions to this extension. 4.24 October 20 2008 1. Added an argument to nlrq.control called InitialStepSize that allows the user to control the starting value used by optim to compute a step size given a Meketon step. For some work on the AR(1) Clayton copula model, it seems that the only prudent value is 0. Default value remains 1. 2. Changed rq.fit.lasso to fix a bug when p=2, as suggested by Gal Goldshtein, and in rq.fit.scad. 3. Fixed a bug in predict.rq that involved factors. Fix required adding an xlevels object to the fitted rq object as in lm. Thanks to Sandy Weisberg for pointing out the bug. 4.25 January 6, 2009 1. Fixed buglet in latex.table diagnosed by Gert van Valkenhoef. 2. Fixed several .Rd files formatting identified by the new Rdversion 2 parser. 4.26 February 2, 2009 1. fixed rq.fit.pfn buglet for cases in which m > n. 2. Fixed Qhat at 0 and 1 in the sol array as suggested by Steve Portnoy. 3. Fixed logLik.rqs to have the right df attribute when pen = 0. Thanks to Brian Cade for pointing out this omission. 4. Fixed some issues with plot.rqss: added an "add" option so that one can either initiate a new plot, or add to an old plot, added a par(ask =TRUE) when there are multiple qss terms. Added title and better axis labels using names of the qss variables. 4.28 April 12, 2009 1. Fixed (I hope) an environmental issue in rqss: when data was specified in rqss, the eval of the qss formulas failed to find the lambda values. This seems to be resolved by defining pf <- parent.frame(), and then adding enclos = pf to the eval call. But at the suggestion of Duncan Murdoch and Peter Dalgaard I'm using instead pf <- enviroment(formula). Thanks to both for their help with this. 2. Added Boscovich data to the data directory with an example in the documentation file (Bosco.Rd). 4.30 May 10, 2009 1. Motivated by some trouble with rqss, I've reverted to the .f version of cholesky.c originally used before MM provided the .c version. This has somewhat reduced the frequency of occurance of the dreaded ierr=17. 2. rq.test.ranks and friends have been modified to allow trimmed Wilcoxon score functions. 3. In .First.Lib cat was replaced by packageStartMessage() at the suggestion of BDR. 4.34 June 3 2009 1. Added option in rqss to use lasso penalization for the linear covariate effects. See also the file rqsslasso.R in the demo directory. 2. Deleted the component tausplit from the output of crq.fit.por which seemed to do nothing useful, and had a potentially dangerous sideeffect. 3. Added coef names for rqss objects 4. Fixed rqss so that when no qss terms appear the fitting still by rq.fit.sfn and weighting can be handled. 4.35 June 27 2009 1. Some fixups of rqss to handle models without any qss terms. 2. Added a function dither() to facilitate dithering. 3. Portnoy's bug fix to crq.fit.por to handle cases without censoring. 4. Minor changes to plot.rqss to handle ask parameter. 4.36 July 10 2009 1. Fixed bug in rq() that prevented contrasts from being properly propagated forward to summary.rqs when there were multiple taus. Thanks (yet again!) to Brian Cade for the bug report. 2. Added two new functions in tools.R FAQ and ChangeLog to facilitate looking at those two files for packages that have such files in the package inst directory. 3. A very primative print method for rqss objects was added, summary.rqss needs some adaptation to provide better info for lasso fitting, etc and then a better print method could be written. 4.37 July 24 2009 1. Fixed computation of residual and fitted.value components in rq.wfit, thanks to Vclav Varva#ovsk for point this out. 2. At the suggestion of Steve Portnoy the default grid spacing in crq.fit.por was modified to reduce the number of grid points. 4.38 August 3 2009 1. Removed a comma in an .Rd file, at the prodding of Kurt. 2. Fixed a bug in summary.rqss which led to a miscalculation of the edf in cases when there was a lasso effect. This involved passed the number of rows of the lasso constraint matrix forward as part of the fit object. 4.42 August 24, 2009 1. Added a demo for the Melbourne temperature data. 2. Made some extensive changes in plot.rqss and summary.rqss to implement confidence bands and summary coef tables for rqss. 3. Added a faux vignette about rqss fitting and a function to read such objects. 4. Minor mod of coef.crq to deal with a zero index problem identified by Portnoy. 5. An experimental option to add uniform confidence bands for 1d rqss components based on Hotelling tubes has been added. Further work is needed to evaluate the performance of these bands, which will be eventually added to the rqss vignette. 6. Fixed yet another missing drop = FALSE in summary.crq. 7. Added an iid argument to rq.test.rank, and the option (when iid = FALSE) to do the nid version of the rank test, only when the score function is the special tau specific one. (I don't think that nid makes much sense otherwise.) 8. rq.fit.br modified so that it optionally returns dual vector, and rq.test.rank modified to use this vector when rank test uses tau-score function. This avoids computing the whole rq process in such cases. 9. Added a reference to the Peirce.Rd file. 4.43 October 17 2009 1. Fix bug in predict.rq so rdf were found, thanks to Richard Berk for report. 2. Added set.seed(1989) for Frank demo, after Kurt reported that it choked on a random realization. 4.44 October 17 2009 1. latex.table was producing two captions... why didn't I see this earlier? 2. pwy bootstrap method was badly centered for prediction intervals, this was eventually traced to a mistaken inequality in boot.rq. Thanks to Richard Berk (Wharton) for pointing out the original anomaly. 4.45 January 12 2010 1. Added 3 score functions to "ranks" for the work on the Jana Festschrift paper. 2. Added shading option for plot.rqss confidence bands. Color of these bands is hard coded to grey scale and this probably should be fixed. 3. Modified plot.rqss to (optionally) plot and return both pointwise and uniform bands. 4. Added titles option for plot.rqss bands. 5. In plot.rqss the eigenvalue decomposition once in a while produced negative eigenvalues which then caused havoc. I replaced E$values with pmin(0,E$values). 4.46 March 15 2010 1. Added select argument to plot.rqss to plot subset of qss objects. 2. Commented out a line in latex.table at the suggestion of David Epstein, Warwick. 4.47 April 21 2010 1. Updated mcmb.c to fix a problem with the 64bit version, thanks to Garth Tarr for pointing this out. 2. Updated the references for rearrange manpage and fixed an ambiguity in the summary.rq manpage. 3. Fixed a bug in predict.rqss having to do with name wrangling: when qss terms had a variable name specified for lambda, this got carried along for the ride and caused problems with name matching for newdata. Fix entailed adapting the mcgv interpret.gam to do something similar for rqss. Thanks to Ivan Mizera for pointing out the original problem. 4.48 May 21 2010 1. Added error message to alert users that summary.rq doesn't know how to deal with lasso'd fitting. Thanks to Richard Berk (U. Penn) for pointed this out. 2. Fixed summary.rqss problem that made models without qss terms choke. 3. Changed predict.rqss so that confidence intervals for the prediction can be returned. 4. Modified the fix in 4.47.3 to avoid using interpret.rqss. This avoids calling qss twice for each fit, and returns a fake.formula directly from rqss that can then be used by predict.rqss. Involved some semi-fancy footwork to deal with the formula wrangling, but seems cleaner than the prior approach (which had the unfortunate additional flaw that it didn't work as intended). 5. Fixed a bug in predict.qss1 by adding the argument include.lowest = TRUE in the call to cut. This (seems to) allow newdata values equal to the minimum of those used in the fitting. Prior version produced NAs in such circumstances and generated a god-awful error message when new() was called to construct the design matrix for the predicted observations. Thanks again to Richard Berk for the example that led to this fix. 4.50 May 26 2010 1. Added fitted() and resid() methods for rqss objects. 2. Fixed bug in powell.f -- failure to declare ddot double precision which (curiously) caused example(crq) to produce something insane in 64bit R, even though in 32bit R it was ok. 3. Updated some references in rq.fit.sfn.Rd as suggested by Ott Toomet. 4.51 Sept 25 2010 1. Fixed the vignette fiasco thanks to help from Bob Obenchain. See inst/doc for the dummy Rnw files to enable one to make non-Sweave vignettes. 2. Fixed bug in predict.rq.process pointed out by Stephen Wegland (Mayo). 4.52 Sept 28 2010 1. Revert to my old Makefile processing of rq.tex, after Kurt reported infinite loop in the texi2pdf step in Vienna. 4.53 Sept 28 2010 1. Changed run-tests.R in tests directory to conform to a suggestion of BDR 4.54 1. Added sentence to summary.rq.Rd to make it easier to find how to change coverage probability for rank based confidence intervals. Thanks to Jochem Kail for this suggestion. 2. Modified definition of S in summary.crq to fix a problem with bootstrap inference. Thanks to Xianghua Luo for this suggestion. 3. Fixed vignette call to plot.summary.rqs... thanks to Jan Henckens. 4. Fixed call to latex.table to pass optional ... args. Thanks to Jan Henckens, again. 5. Fixed rqss problem to pass optional space allocation arguments. Thanks to Jungmo Yoon for noticing this problem. 4.55 1. Fixed bug in rq.wfit to allow fitted values to be computed when tau = -1. Thanks to Brian Cade for this report. 2. Fixed bug in rqss that prevented models without qss terms to be estimated. 4.56 1. Cleanup and compression of vignettes for Kurt. 4.57 1. Slight change in summary.rq to clarify default behavior 2. Compactification of rqss0.pdf 4.58 1. bug fix in summary.crq for cases with only one tau. 4.59 1. bug fix in predict.rqss for cases without any qss terms. 4.60 1. bug fix in rqss lasso rhs. Thanks to Stefan Bache for reporting this. This also affects rq.fit.panel as posted on my webpages, which as been modified accordingly. 4.61 1. Moved non-R data files to extdata directory and fixed some problems with the vignettes, as requested by Kurt. 4.64 1. Added an option to predict.rqs and predict.rq.process to allow one to predict conditional dfs rather than just conditional qfs. 4.65 1. rqss fitting now passes a list called control that contains various parameter for rq.fit.sfn(c) functions. 4.66 1. rqss now allows partially linear part of X to be made sparsely thanks to maodel.Matrix from the Matrix package. 2. Typo introduced by the 4.65 change that caused cobs to seg.fault corrected. 4.68 1. Added demo for the Mammal plot. 2. Added warning for specifying a vector of taus in rqss indicating that only the first element will be used. (Thanks to Hadley Wickham for pointing out that this used to generate a rather mysterious error message.) 4.69 1. Added an experimental new function dynrq() modeled after dynlm() by Achim Zeileis, which is intended to make formula specification for dynamic models involving time series data simpler and more natural. 4.70 1. Added NAMESPACE file kindly provided by BDR. Now that there is a namespace it is somewhat more difficult to debug using old fashioned work habits. A trick suggested by Martin Maechler is the following: example(source) # needed to define function sourceDir sourceDir("/quantreg/R") This has the effect of putting all of the R functions in the global workspace where they can be edited and changed at will. 4.71 1. Kurt's new gfortran found an error in the crq.f code: det in the call to dgemi wasn't dimensioned, but it was supposed to be a 2-vector. Now fixed. 2. Added a new wild bootstrap option to boot.rq based on Xuming's forthcoming Biometrika paper. For the moment only the two point weight distribution is implemented, but stay tuned for a smoother variant. 4.72 1. Added a demo to illustrate automatic lambda selection for univariate rqss fitting. This is based on a test problem in a recent paper by Oh and Nychka. 2. Changed the default bootstrap method in boot.crq from xy-pair to Bose, at the urging of Steve Portnoy. 4.73 1. Changed the default score function in anova.rqlist to score = "tau" as suggested by a question from Mo Dang-Arnoux (Grenoble). 4.74 1. Altered taus in rq() so that any tau == 0 or tau == 1 are replaced by values strictly in (0,1). As noted by Christophe Rolphe under some exotic circumstances this produced crashes from rq.fit.br. 2. Clarified the documentation for summary.rq to indicated that when se == "boot" you can't get separate Hinv and J components only the full sandwich cov component. 3. Fixed the license designation to explicitly reflect the ambiguity of the status of the cholesky.f code. 4.75 1. Fixed the documentation for qss where convexity was imposed by "V" not "U". 4.77 1. Removed the LICENSE file that had described some uncertainties with respect to the license status of the code in src/cholesky.f. These uncertainties have now been resolved by the original authors, Esmond Ng and Barry Peyton, declaring their code to be open source, and thus the quantreg package can now be considered fully GPL. 2. Commented out some vestigial write and printf calls in mcmb.c and cholesky.f. 4.78 1. Fixed a bug in summary.crq which failed to check whether censoring in the Powell method was "right" or "left" before calling boot.rq. 4.79 1. Added logLik and AIC functions for the nlrq class. 4.80 1. added optional se argument to anova.rqlist so one can specify "ker" standard errors. 4.81 1. modified crq to allow left censoring for both Portnoy and Peng-Huang methods. 2. added tsp to the object returned by crq.fit.por to facilitate conputing the weights used by the Portnoy method. Eventually, there should be some further documentation of this. 4.83 1. modified rq1.f to fix a dimension problem for the workspace, and added a new argument to control the maximum number of simplex iterations. This was needed to fix problems encountering severe degeneracy, which induced the possibility of an (essentially?) infinite loop. A fixed 100000 limit is currently implemented, with a warning when exceeded that users might want to consider dithering the response variable. 2. added a few lines in summary.crq and print.summary.crq to provide the number of NA replications in the bootstrap simulation for each of the requested taus. 3. Modified the documentation files to mention the above changes and also to mention that the grid for the Portnoy method is equally spaced. 4.84 1. Removed wayward files in ratfor directory 2. replaced call to dqrls in rq.fit.br by call to R qr function. 4.85 1. Changed example for uis data in crq.Rd to Peng from Portnoy. 4.86 1. Changed crq.f so that it stopped the tau iteration whenever IFT = 9 "simplex iteration limit exceeded" occurs. 4.90 1. Reverted to earlier code for rq1.f and crq.f pending resolution of strange disparity between results for R CMD check for osx and windoz. in versions 4.85-8 demo(KMvCRQ) produced errors on windows that were irreproducible on osx. 4.91 1. Tried to clarify documentation for summary.rqs concerning changes in the level of the confidence intervals when the rank method is being used. 2. Increased the default number of iterations in rq.fit.fnc. 4.91 1. Added a drop = FALSE in nas definition of summary.crq to preserve the matrix structure there. 4.93 1. Fixed several bugs in the crq code for left censored data. Thanks to Brian Cade as always for bringing this to my attention. 4.94 1. Moved UIS crq example from man directory to demos to save check time as advised by Uwe Ligges. 4.95 1. Bug in summary.crq when ctype == "left" and some specified taus weren't estimable -- upper quantiles from bootstrap were deleted, but it was the lower ones that should have been. 2. BIG in crq.f was changed from 1.d37 to 1.d17 which "fixes" a segfault condition in an example of Brian Cade's, but I have no frigging idea why. 4.96 For left censoring the idea of reversing the order of the taus in the solution array turned out to cause all sorts of havoc in my interpolation scheme for coef.crq.... so I've reverted to the usual ordering. 4.97 1. Yet another modification of coef.crq. This time I've decided to eliminate the midpoint interpolation scheme that was originally motivated by the pivoting method for the Portnoy crq estimator, and go back to conventional linear interpolation. This is more consistent with the default grid methods that are now being used and was endorsed at coffee by Steve. This change was again stimulated by Brian Cade's careful checking of anomalies in crq output. 2. Added drop = FALSE for the coef object returned from crq.fit.[por,pen], to hangle the case in which there is only one column of the solution, which hopefully is a very rare occurrence. 3. Changed Curv to return a type object, to fix a bug introduced into the Powell methods when I added ctype for left censoring for Portnoy and PengHuang. Thanks to Mike Smithson for reporting this. 4.98 1. Fixed a plethora of places that the new dimension checking for fortran arrays identified issues. 5.00 1. Fixed several places with excessive line lengths in the .Rd files. 2. Purged the econometrica.bst bib style, as requested by Brian R. 5.04 1. Fixed logLik.nlrq bug as noted by Erin Graham. 2. Changed the default bootstrap method for crq objects to the delete-d jackknife method proposed recently by Portnoy. This seems to work better especially when, as is ofter the case the process is "defective." 3. Fixed predict.crq so it would return fitted values when newdata was omitted, bug report by Carles Forn Izquierdo. 5.05 1. BDR suggested a fix to dynrq to avoid a ":::" usage. This led to some adventures in environments that eventually led to inclusion of a model component in the first element of dynrqs objects so that plotting of summary.dynrqs objects could find the appropriate design matrix. 2. And in addition the Description file was augmented with a greatly expanded authors component -- which should have been done years ago but was greatly facilitated by the (relatively) new person() function. 5.07 1. Bug fix in predict.rq: when mofn < n and percentile method the interval needed to be recentered and rescaled, not enough to just rescale B matrix. 5.08 1. Incorporated my qrisk package for portfolio selection into quantreg. This includes the function rq.fit.hogg() that does what Zou and Yuan call composite quantile regression, or more accurately a generalized version of this. 5.13 1. Fixed several namespace problems identified by BR. 2. Fixed bug in qrisk code to convert data.frame X to matrix. 5.16 1. Fixed bug in rq.fit.lasso whose .Fortran call had an extra argument. 2. Fixed bug in rq.fit.pfn to correct behavior when m > n. Pointed out by Ivan Diaz (Google). Cause of this was rather pathological but ((p-1)*n)^/2/3 > n can happen when p is large as it tends to be these days. 5.17 1. Added anova.rqs at the suggestion of Jon Peck (IBM). This just takes rq() output from a multiple tau command and converts it to something that anova.rqlist can understand. Peck is writing something on the SPSS <-> R interface, so I was curious to see what is going on with that. The answer seems to be not too much, but there is a very annoying article here: http://www.ibm.com/developerworks/library/ba-call-r-spss/ -- ugly hacks indeed! It does make me wonder why I've spent part of my weekend making this extension just to accommodate a commercial implementation by IBM that enables SPSS to call quantreg. 2. Fixed a bug in rq.test.rank which produced the wrong p-value for the chi-squared version of the test. 3. Added various importFrom directives in NAMESPACE in accordance with Kurt's July 2015 suggestions. 4. Removed calls to crq.fit.por2 provisionally while we resolve some problems with the code for this new procedure. 5.18 1. Added a couple of further importFrom directives in NAMESPACE at Kurt's suggestion. 2. Added some further cautionary verbiage about the dangers of using rank inversion for large problems at the suggestion of Jon Peck (IBM). 5.19 1. Changed the printing of the number of NAs in the crq bootstrap functions so that it also reported "out of" number of bootstrap replications. 2. Changed the coef matrix for the Powell crq method so that it conformed to the other methods to facilitate plotting as requested by Vladimir Pazitka. 3. Changed the eps in summary.rq from .Machine$double.eps^(2/3) to .Machine$double.eps^(1/2). This will reduce (somewhat) the likelihood of getting one or two influential f_i's that dominate a covariance matrix estimate. 4. Introduced the Portnoy2 method for crq, which still should be considered experimental. It is a pure R rewriting of the original algorithm that iterates on a fixed grid. 5.20 1. Added FAW to the rq.Rd see also list at the suggestion of Terry Therneau. 5.21 1. Allowed ... to be passed in plot.summary.crqs. 2. Fixed namespace bug in dynrq, and added an Edgeworth wacky AR(1) example to dynrq.Rd. 3. Fixed rqss bug about length of residual vector 5.23 1. Added a "cluster" option for summary.rq() when using the bootstrap option this option implements the wild gradient bootstrap method of Hagemann (2016). See boot.rq for further details. [Needs further testing.] 2. Added a sfn method for rq models, and in the process modified somewhat the return object for both rq.fit.sfn and rq.fit.sfnc so that it is compatible with other rq.fit objects. 5.24 1. Reverted to the old fortran versions of srqfn.f and srqfnc.f, ie removed Martin Maechler's C versions, in preparation for some new sparse forms of the bootstrapping functions. Made a couple of slight changes in the return object for these functions. 2. Fixed a sign error in the cluster option pointed out in an email of Andreas on May 9 2016. 3. Added jackknife option to boot.rq for the proposal of Portnoy. 4. Adapted boot.rq and friends so that when there are multiple taus summary.rqs reuses the same randomization for each of the taus to facilitate joint inference with the bootstrap realizations. 5.25 1. When method = "sfn" store model$x in sparse form. Then when bootstrapping use method = "sfn" rather than the usual "br" method. 2. When using the "cluster" option for bootstrap allow "sfn" as above. 3. When na.action = "omit" and length(fit$na.action) > 0, then omit these values from the strata indicator "cluster". This would seem to help bring together the survey package and quantreg as desired by email correspondance with donald706. 5.26 1. Fixed long line per Kurt's suggestion. 2. Added some comments about method "sfn" in the man page for rq. 5.27 1. removed lines that cat'd taus from rqprocess in the khmal.R 2. fixed environment problem in nlrq, according to suggestion of Vaidotas Zemlys-Balevicius email August 9 2016. 5.28 1. Cleaned up the fortran source a bit in accordance with Kurt's mandate of late August 2016. There are still some offensive items mainly in crq.f that should be dealt with, but I wasn't able to dig into this at the moment. 5.29 1. I'd botched the fixup of rq0.f which was only revealed by a test from the package Qtools as discovered by CRAN checking and reported by Duncan Murdoch. 5.30 1. Removed Y argument in crq GRAD subroutine, which seems to be superflous. 5.31 1. Added bag of little bootstraps option to summary.rq. Needs further testing. 5.32 1. Modified the BLB code to use boot.rq.wxy so that the inner loop was all in fortran, would be nicer if this loop were done with "fn" rather than "br". See the note in boot.rq above boot.rq.spwy. 2. modified the crq.pdf file to fix a mento in the description of the Peng Huang algorithm. 5.33 1. Added option to return density estimates from predict.rqs 2. modified rq.fit.fnb to include a rhs input argument. 3. modified boot.crq to properly deal with only one tau requests and also changed the default for printing progress report to n - 100,000. Both suggested by Steve Portnoy. 4. modified boot.rq so it returns cov(B$B) not cov(B) as reported by Marco Geraci 5. Fixed bug in anova.rqlist to correct error when "fn" method was used and no $y component was returned. Reported by Tom LaBone. 6. Fixed bug in summary.rqss -- control parameters weren't getting passed to chol call properly. (Reparted by Geoffrey Shideler (NOAA).) 7. Added init.c to register .Fortran calls and removed the package = "quantreg" argument. 5.35 1. Fix a bug in rqss to allow control parameters to be passed to rqss.fit when the method is "lasso" (pointed out by Heracles Apergis.) 2. changed nrow(R) to NROW(R) in rq.fit.hogg thanks to Paul Newell for bug report. 3. fixed axis label typo in demo engel2. 4. Added Panel.R demo to illustrate fixed effect panel estimation, a la Galvao job market talk. 5. Some changes to crq.fit.por as suggested by SLP: line 1: add an input variable mw (the error messages suggest changing mw if there are problems with resolving degeneracies or trying to pivot too far, and so it should be possible to do this without getting into the deep part of the code) lines 3 and 5: test that x is a matrix and add column names if they are missing line 39: define mw so that the fortran constraint is satisfied 5.36 1. added an iid argument to anova.rq and friends to allow one to specify iid = FALSE when using rank tests, at the suggestion of Brian Cade. 5.37 1. added a R=R argument to the call to summary in anova.rqlist so that changes in the bootstrap replications get passed along as intended, again at the suggestion of Brian Cade. 2. removed init.c and mcmb.c from the src directory: the former was left over from some C-ification of some code done by Martin Maechler long ago, that I have gradually undone, the latter is Xuming's Markov chain marginal bootstrap code that I would hope to reinstate, but at the moment I have problems with an unresolved header file. 5.38 1. changed if (any(b < 0 || b > 1)) to if (any(b < 0) || any(b > 1)) in barycentric() in response to CRAN Debian ERROR. Is this something new? 5.39 1. Reintroduced mcmb.c after a fix of the clang6 setup. 5.40 1. Removed superfluous blas routines from crq.f at the suggestion of Brian Ripley. 2. Similar overlap with some linpack routines exists except that these do not seem to be linkable automatically from R. 5.41 1. Modified summary.rq to half the bandwidth h when it is/was too large, rather than declaring an error. 2. Changed maxit in rqfnb.[rf] from 50 to 500. This produced some scary problems when n was large, in the course of testing the code for the next item. 3. KhmaladzeTest has been thoroughly revised, but needs considerable further testing. This was motivated by an email from Andres Manzanares (ECB) that reported poor coverage when n was large. Remains to see how/whether reasonable defaults can be found for this. Presumably, the taus grid should get finer and the trimming can be less aggressive as n gets larger, but how? 5.42 1. Removed seed argument in mcmb.f -- thanks to Brian Ripley for finding this! 2. Removed rq.Rnw and friends from the vignette directory in response to a still mysterious GCC 9 problem identified in the CRAN check on Debian. Possible indexing overrun?? See email from Brian. 3. Removed two data statements from dynrq.Rd. 5.51 1. Made several (seemingly innocuous) changes in rqbr.f that have apparently fixed the gfortran-9 problem originally reported by Kurt and then in more detail by Brian. With considerable help from Dirk E. I was able to make a Docker container that allowed me to run R as if in a Debian environment with gfortran-9. I'm still rather puzzled that the changes I made fixed the problem: as originally reported by Brian based on his array bounds checking there was a point at which an array subscript took the value -1, which is obviously bad... further debugging with print *, ... revealed that indices that were computed with a*sign(a) instead of producing abs(a) produced 0 instead, and changing these instances to abs(a) worked perfectly in both the old and new environment. I should now reinstate the rq.Rnw version of the vignette, but I think I'll let this go for a while and catch up on other things. 5.52 1. Added Cleve Moler to authors as suggested by Brian to acknowledge use of several linpack routines. 5.53 1. Modified the calls to class(x) in boot.rq so that they conform to the new convention that class(M) has two components c("matrix","array"), so if() wants to look at only the first component. 5.54 1. Modified call to class(x) in crq.fit.pow() as in 5.53 2. changed http to https in crq.Rd 5.55 1. Fixed bug in predict.rq.process for Fhat reported by Vincenzo Coia. 2. Fixed bug in AIC.rqs to use correct edf reported by Brian Cade. 5.57 1. Added link to a new fitting method by He, Pan, Tan and Zhou that uses a smoothed version of the usual piecewise linear QR objective and gradient descent. This approach is MUCH faster than interior point on large problems especially those with large p. See ?rq.fit.conquer for further details. 2. There is also a new multiplier bootstrap for inference. At the moment it is automatically invoked only when the original fitting method is "conquer". 5.58 1. Added new fitting and bootstrap methods employing preprocessing, as implemented by Blaise Melly, see ?rq.fit.ppro for further details. For large applications with moderately fine grids for tau these methods should speed things up considerably. 5.61 1. Fixed inconsistent author entry for Melly. 2. Moved definition of eps up in rq() to resolve problems in packages vdg and qrjoint. 5.65 1. Made two changes in rq.fit.lasso that I hope will improve robustness of the fitting, thanks to report by Yuanzhi Li. Only time will tell, with the help of further testing. o beta default was changed to conform with rq.fit.fnb code o wn initialization was also changed to conform to rq.fit.fnb. 5.66 1. Added rq.fit.ppro and boot.rq.pxy to exported objects in NAMESPACE. They were documented but invisible heretofore. 2. Commented out the warning about too many bad fixups in boot.rq.pxy since it was making too much noise. 5.68 1. Added a subset argument to the rqss function as requested by Brian Cade. This seemed more difficult than expected as a R-help inquiry of 21/9/2020 indicates. 2. Added a Dorder argument to the qss function, which when Dorder = 0 results in penalization of the fitted function itself, rather than its derivative. See the vinaigrette: conformal.Rnw for an example. 3. Noticed that the demo rqsslasso.R had an argument bandcol that generated a warning -- "not a graphical parameter" -- I think that this was intended to be bcol in plot.rqss which when changed now works as originally intended. 5.70 1. Further fiddling with rqss to get the fake.formula trickery to work. Had to ask John Fox (car package) and James Craig (tidyvpc package) to modify their code to provide explicit data arguments when rqss was called inside their functions and added a note to warn others of this necessity. 5.71 1. Added ParetoTest function and friends to do tail exponent estimation and inference based on original code of Chernozhukov and Fernandez-Val. 2. Added new "se" option to summary.rq to implement the extreme CI estimates of Chernozhukov and Fernandez-Val. For the moment I've commented out a warning about tau not being extreme enough to justify the use of this option. 3. Modified plot.summary.rq so that one can pass a matrix of ylim values to assure that two summary.rq plots have the same scale. A suggestion born of Victor's totally legitimate critique of my extremal QR vinaigrette, now modified to fix this. 5.74 1. Fixed bug in rq.fit.sfn so that all the control parameters are passed. 2. Modified summary.rq so that the "nid" option can now use "sfn" fitting if the original fitted object was computed with "sfn". This is the first step in trying to get the "boot" methods to behave similarly. 3. After the upgrade to catalina and then upgrading R and gfortran and xcode Command Line Tools I was getting compilation errors with stdio.h not found. This was eventually resolved by removing my .R/Makevars file which pointed to obsolete clang compilers and libraries. I've now also removed clang6 and clang7 from /usr/local since they are now irrelevant. 4. The code for clustered bootstrap is now adapted so that if method = "sfn" is used for the initial fitting then it will also be used for the bootstrapping. This speeds things up considerably. A potential issue that is still unresolved here is that I am not allowing users to pass control parameters, so one has to hope that default choices work. My naive attempt to pass the control list from the initial fit produced a "memory not mapped" segfault, presumably because the spwy bootstrap method uses one extra observation than the initial fitting. 5.75 1. Implemented weights for rqss fitting when there are qss terms, as suggested by the ConfidenceQuant package of Zhang et al. This is prepatory to exploring their implementation of lambda selection and BLB inference. Note that they don't undo the weighting when computing residuals which may or may not be important. As currently implemented, I do undo the weighting. 2. Added Munge function to mangle formulas for rqss (used in demo(MCV) 3. Added demo MCV to illustrate lambda selection via k-fold CV. 5.79 1. In preparation for some attempt to rationalize the multiple estimation and inference methods, I poked around to see whether I could find a workable version of ratfor to use to write new wrapper code for various extensions. Eventually I found an updated C version maintained by Brian Gaeke that worked for all of my existing ratfor code with the exception of rqbr.r which emits a gfortran warning about goto's jumping across blocks (see email from Gaeke on 23/11/20). This isn't really a problem since I have functional f77 code for this anyway. The point is that going forward, at least for the foreseeable I have a workable ratfor. 2. Added two new estimation methods qfnb and pfnb designed to speed up estimation for large problems with many taus. The former just puts calls to the existing fnb routine inside a fortran loop, the latter translates the ppro preprocessing method into ratfor. This seems to help quite a lot as experiments in my ongoing vinaigrette show, but there is probably still some fine tuning that could be done. I have the feeling that it would be worthwhile being more aggressive about reducing the sample size as n grows. 3. Changed default m0 parameter for rq.fit.pfnb so that it was proportional to n^(2/3) rather than n which seems to speed things up considerably. 5.80 1. Added a new bootstrap method boot.rq.pwxy which calls a fortran preprocessing subroutine. Generation of random exponentials is done inside the loop thanks to grexp() and some C trickery documented in the R Extensions manual. For large problems this promises to be much quicker than other prior methods, presuming that I can get the interface with summary() and boot.rq() working. 2. Added a more elaborate iteration count object to the return from boot.rq.pwxy that provides information on the number of "fixups" as well as FN iterations and final sample size. 3. Removed the standardize argument from rq.fit.conquer which seems to have been removed from the argument list of conquer::conquer. 4. Changed the BLB procedure so that it uses pwxy rather than wxy, pending further investigation... 5. Changed the rq.fit.pfnb procedure so that it knows how to do only one tau. 5.81 1. rq.fit.pfn and rq.fit.pfnb now return nit info as part of my effort to investigate how to set tuning parameters for these functions. 2. changed rq.fit.fnb so that non-zero exit status from an error (stop) to a warning. Experiments with large p examples involving factor variables suggested that these cases were often harmless. As long as 10 or more iterations were done, these exits were generally just stepy being too fussy about the cholesky factorization. 3. Changed plot.rqss so that it returned all the confidence band information not just for the last one. Thanks to Zehra Atik for the bug report on this. 5.82 1. Fixed rq.fit.pfnb to work with vector x. 2. Added q489 function to compute univariate sample quantile via literal translation of the original (Algol 68) code of Floyd and Rivest. 5.83 1. In response to Brian Ripley's email of 11/1/21 several ratfor/fortran changes were made: ddot was declared double in boot.f and rls.f, the routine spwy.[rf] was removed since it was never actually functional, and several nonconforming tab characters were removed from sparskit.f. 2. Added a new plotting function for qss objects with Dorder 0 that imposes the piecewise constant feature of the fit. 3. Added options for increasing and decreasing constraints for the Dorder 0 qss functions. By setting lambda to zero, one can get something equivalent to the solution from the isotone package using their weighted fractile option. 5.84 1. The changes to plot.rqss in the last version messed up plotting for qss objects, this is (hopefully) now restored to prior functionality. 5.85 1. Added doi info for K 2005, and K et al (2017) at Uwe's suggestion. 2. modified qss code to test is.numeric(x) rather than is.vector(x) to avoid the fact that is.vector(x) is false, if x happens to have attributes other than names. Thanks to Wolfgang Viechtbauer and Terry Therneau for help in tracking this down. The Rstudio function haven::read_dta() adds an attribute to the data.frame it constructs to indicate that the data was born in the hell of Stata. 3. Added predict.qts1 function which was somehow neglected when I made the conformal QR vinaigrette. 4. Added a LassoLambdaHat function to compute the Belloni-Chernozhukov lambdahat interval. And modified rq.fit.lasso to use this as the default lambda selection rule if lambda is not specified. 5.87 1. At the suggestion of Adelchi Azzalini conquer package was moved to "suggested" rather than "imported" which lightened the dependency graph considerably. 2. change in anova.rqlist to broaden pattern matching for variable names at the suggestion of Max Gordon. Uses the relatively new \(x) syntax which may cause problems for those on old R installations. 5.89 1. removed the anonymous function syntax in 5.87 #2 since it did provoke complaints from users. 2. Fixed bootstrap methods for sparse X matrices for wild and pwy methods report by Tom Parker. a mcmb is hopeless since it doesnt know about sparse matrices, will add something to man page b pwy problem was annoying in the sense that rbind(X,0) doesnt work in SparseM because 0 isnt sparse! Duh. c wild problem revealed an ecosystem of bugs, even in the non-sparse case there was a bug: hat(X) was called but should have specified hat(X, intercept = FALSE), when X is sparse I needed to cook up a special version of hat. 5.91 1. CRAN is doing more severe checking about installed packages, so several changes were made to make calls to suggested packages conditional on their loading status. This is supposed to be checkable by setting the environment variable _R_CHECK_DEPENDS_ONLY_="true" R CMD check ... but I haven't yet gotten this to work. 5.93 1. The problem referenced in 5.91 above was mainly due to the fact that packages were put in the system library not my personal library. This was fixed by reinstalling so that now: Sys.getenv("R_LIBS_USER") [1] "/Users/roger/Library/R/x86_64/4.2/library" and now adding to .Renviron _R_CHECK_DEPENDS_ONLY_=true I believe will trigger the checking without the dependencies as required. 5.94 1. Albrecht Gebhardt has made a translation of the Renka interp functionality used for bivariate smoothing by rqss. This effectively eliminates the need for tripack in quantreg, and the code as been modified accordingly, thanks to Albrecht for all his efforts on this. This is all due to the unfortunate ACM TOMS licencing policy that is incompatible with R. 2. Brian Ripley noted that the DOI for my CUP book was broken and I have urged them to fix this. 3. Minor bug fix in crq for case that the user specifies a single tau value. 5.95 1. modified rqss to use rgl.triangles3d instead of rgl.triangles as suggested by Duncan Murdock 2. modified predict.rq and friends to adapt to na.action as suggested in email of ggrothendieck@gmail.com on 5 April 2023. 5.96 1. Changed gtimer to return 0.0 at suggestion of BDR to facilitate compatibility with flang. 2. Changed DFLOAT to DBLE crqf.f per BDR's email of 19/07/23 5.97 1. Changed dfloat to dble per BDR's email of 19/08/23 quantreg/inst/FAQ0000644000176200001440000002614614371400640013417 0ustar liggesusers The Quantreg FAQ 1. [Non-uniqueness of Solutions] "The estimation of regression quantiles is a linear programming problem. And the optimal solution may not be unique. However, rq() provides a single solution. My question is what are the additional constraints to get the single solution? Because when we do the research, we can write our own routine in different software like in SAS to estimate quantile regression, does that mean people will get different solutions?" From ?rq.fit.fn: eps: tolerance parameter for convergence. In cases of multiple optimal solutions there may be some discrepancy between solutions produced by method '"fn"' and method '"br"'. This is due to the fact that '"fn"' tends to converge to a point near the centroid of the solution set, while '"br"' stops at a vertex of the set. There is already facility for doing QR in SAS and it is based _very_closely_ on my R package and uses essentially the same algorithms. 2. [Non-uniqueness redux] "And all these solutions is [sic] correct? Or do we need additional constraints to get the same solutions as derived in R?" Yes, they are all correct. Just as any number between the two central order statistics is "a median" when the sample size is even and the order statistics are distinct. The main point here is that the differences between solutions are of order 1/n and the inherent uncertainty about the estimates is of order 1/sqrt(n) so the former variability is essentially irrelevant. 3. [Basic Obervations] "How can we identify the cases (data pairs) that belong to different quantiles in a scatterplot? It seems that they must be identified by the code in the process of analyzing the quantile means, but I've been unable to figure out how to find and extract them." For a given fit: f <- rq(y ~ x +z, tau = .4) h <- which(abs(f$resid) < tol) will recover the indices of the observations that have zero residuals. Of course you need to specify tol which I would recommend to be something like: tol <- .Machine$double.eps^(2/3) If f has p fitted parameters then h should have p elements. If this isn't the case then you might need to experiment with tol a bit. 4. [R^2] "I am currently trying to caculate the coefficient of determination for different quantile regression models. For example, how do you calculate the the sum of the weighted absolute deviations in the models ..." R-squared is evil, that is why there isn't an automated way to compute something similar for quantile regression in the quantreg package. But if you insist use: R1 <- 1 - f1$rho/f0$rho Provided that f0 is nested within f1 and the taus are the same, 0 <= R1 <= 1. If you want to test f1 vs f0 then use anova(f1,f0) For further details see: Koenker R. and Jose A.F. Machado. Goodness of Fit and Related Inference Processes for Quantile Regression J. of Am Stat. Assoc, (1999), 94, 1296-1310. 4a. [R^2 redux] "I am very interested in the coefficient of determination for different quantile regression models. And, I have f1, but don't know what is f0, so that I failed to run R1 in your FAQ 4. Could you please help me solve my question?" f0 could be any nested fit, but usually it would be rq(y ~ 1, ...) a model with only an intercept that returned unconditional quantile estimates. 5. [Singular Designs] "R crashes in some cases when fitting models with rq()." This happened in some earlier versions of the package when the design matrix was singular. This is now checked more carefully, and shouldn't happen in versions 4.17 or later. Eventually, I may try to treat singular designs in a way that is more compatible with lm(). 6. [Confidence Intervals] "Why does summary(rq(...)) sometimes produce a table with upper and lower confidence limits, and sometimes a table with standard errors?" There are several methods for computing standard errors and confidence limits. By default on small problems (n < 1001) summary uses the rank inversion method, which produces (potentially asymmetric) confidence intervals,while for larger problems the default is to estimate the asymptotic covariance matrix and report standard errors of the parameter estimates. 7. [Non-positive fis] "What does the message "Non-positive fis" mean? When method ="nid" is used in summary local density estimates are made at each x_i value, in some cases these estimates can be negative and if so they are set to zero. This is generally harmless, leading to a somewhat conservative (larger) estimate of the standard errors, however if the reported number of non-positive fis is large relative to the sample size then it is an indication of misspecification of the model. 8. [rq vs lm fits] In the Engel example in ?rq both rq fits and the least squares fit are plotted -- what should we expect to see in such a comparison? In the classical linear regression model with iid error we could integrate betahat(tau) over [0,1] and should get something quite similar to the least squares estimate. In the one-sample model this is exact: averaging the order statistics is equivalent to averaging the unordered original observations. In non-iid error situations this is more complicated but generally one sees that least squares coefs look roughly like some sort of average of their corresponding rq coefficients when averaged over tau. 10. [AIC and pseudo likelihoods] In quantreg of R package, rq.object can compute AIC (Akaile's An Information Criterion).but, AIC=-2L/n+2k/n ,where L is log-likelihood, k represents the number of parameters in the model ,n is the number of observation. We know likelihood base on distribution,but quantile regression can not assume specific distribution,this is AIC maybe not compute accurately, or AIC maybe can not calculate.Why do rq.object can compute AIC? This is discussed many places in the literature. Yes, it is not a "real" likelihood, only a pseudo likelihood, but then the Gaussian likelihood is usually not a real likelihood either most of the time.... 11. I would like to know why the equivariance property is so important in the quantile regression model. I have read a lot of article about it; but I don't really get the idea. As a basic philosophical matter it really isn't that important, the nearest star is very far away and we will all die, but in math the idea that functions commute: in the QR case that Q_h(Y) = h(Q_Y) is interesting, and it doesn't hold if you replace Q by E. 12. My recent paper used quantile regression model which is interesting for plant physiologists, the reviewers questioned that my independent (x) and dependent (y) variable should be exchanged as OLS showed. In my research, x=stomatal conductance, y=stomatal density, however, the reviewer suggested to plot as x= stomatal density, y=stomatal conductance. But, the meanings of x and y in quantile regression model should be different with OLS, what are the differences? Could you kindly give me some indications? From a predictive point of view, the question is straightforward: both QR and LS answer the question how would you predict y given information on x, QR by delivering an entire conditional distribution function, LS by producing a mean of that distribution at each x. More difficult is the usual causal question: if we imagine an intervention that changes x and ask: what is the consequence for the distribution of y? If this formulation doesn’t make sense for a particular choice of x,y then one might consider reversing them. 13. "My student has discovered a couple of corner cases that hang inside the Fortran code when trying to find bootstrap CIs on quantile regression fits." This seems to be invariably due to repeated values of the response variable that create degeneracy of the solution to the LP problem. In the dual simplex algorithm (method = "br") this can lead to cycling. There are two work arounds: 1. Use method equal "fn" in rq() since the interior point algorithm isn't bothered by such difficulties (since it only approaches vertices from the inside of the constraint set). 2. Use dither() to perturb the y observations slightly. 14. "I have wrote in R the function qreg to estimate quantiles using the optimizer nlm (see below, please). The results I get are different from those of your package. Please, could you help explain these differences." qreg <- function(y,x,INT,q) { if(INT==TRUE) x<- cbind(1,x) Q <- function(beta) { e <- y-x%*%beta q*sum(e[which(e>=0)]) + (q-1)*sum(e[which(e<0)]) } Beta <- solve(crossprod(x))%*%crossprod(x,y) Reg <- nlm(Q,Beta,hessian=TRUE) Reg } Imagine that you would like to cut an apple into quarters, you have two tools: a knife and a spoon -- you would expect different results, no? At a slightly more technical level, the Hessian that you presume to exist is identically a matrix of zeros, almost everywhere. And no, this is not just a matter of local optima, the problem is convex, so there is a unique global optimum. 15. When using method = "sfn" I sometimes see the warning: 1: In rq.fit.sfn(a, y, tau = tau) : tiny diagonals replaced with Inf when calling blkfct This is generally harmless, but admittedly annoying. I may eventually decide that it is completely harmless and eliminate it, but meanwhile we just have to live with it. Think of it as not nearly as annoying as loud motorcycles in cities. 16. "It seems a lot of applied people like to bin the data (i.e, based on outcome Y) into quantiles and run regressions and claim to get quantile effects. Is there a reference in the quantile regression literature that looks at the consequence of doing this?" Quoting from Koenker and Hallock: QR: An Introduction (Journal of Economic Perspectives, (2001) We have occasionally encountered the faulty notion that something like quantile re- gression could be achieved by segmenting the response variable into subsets according to its unconditional distribution and then doing least squares  tting on these subsets. Clearly, this form of \truncation on the dependent variable" would yield disastrous results in the present example. In general, such strategies are doomed to failure for all the reasons so carefully laid out in Heckman's (1979) work on sample selection. In contrast, segmenting the sample into subsets de ned according to the condi- tioning covariates is always a valid option. Indeed such local  tting underlies all non-parametric quantile regression approaches. In the most extreme cases we have p distinct cells corresponding to di erent settings of the covariate vector, x, and quan- tile regression reduces to simply computing ordinary univariate quantiles for each of these cells. In intermediate cases we may wish to project these cell estimates onto a more parsimonious (linear) model. See e.g. Chamberlain (1994) and Knight, Bassett, and Tam (2000), for examples of this approach. quantreg/inst/doc/0000755000176200001440000000000014470135051013622 5ustar liggesusersquantreg/inst/doc/crq.pdf.asis0000644000176200001440000000010313513032713016030 0ustar liggesusers%\VignetteIndexEntry{quantreg: crq} %\VignetteEngine{R.rsp::asis} quantreg/inst/doc/rq.pdf0000644000176200001440000117036314470135051014752 0ustar liggesusers%PDF-1.5 % 3 0 obj << /Length 3308 /Filter /FlateDecode >> stream xڅr6򮯘r247u\JIE@ 13L@P䃆 h4Mzcn Htswب,"ܤQ UO[;~owqya~?o+/a]7~%4Ɵ~z7_dBUم9tvyqHoY9v*4]懌`oi(a'+ĉ&\hP7AqX0xԲ/;.{#~xH9eӭN0J9`w$e\3qTx%[GNüz'jPժH&/j"p ^'F. 3MGɯ[X87x;p:4Fo,x;9Rx/%-j9bWqad~4%xArr-[l+ ̝=MZ~% ; Bqy ODjT(=MBL*"Ew?ZE\~@07a?B'k#gT(4,hE>aI|@EK3 1GQhO3+OC?s9=ʁN=n7"+.^-cb;g`Rx!]d7#n,h"%>E:۝ +_n?1O`h@r'v"/4a80DfsAM:~rbjA$*Rq0-i }7Œ]( -  'e~y{rh+4#ޚt`<%.hKxBXTQLJ.HȻb _m<Z$OCMzG$hE'7i^XH_ޥ"9!M*+Ltr9P|$PQT/ǚ!^b$<, XX 2m HZBCn qHzز HgG5gH8d\V=z+UPxgnϒZLKs;$5&̮i8(wkr& c l@ X m[/0R ? p)P2$r 6v b urӗ334q'n_׊V6w=?⑬g߅\׉ˤMxL;NlEKkp~yj@+YqNj=j@k#i=8lALbskF(I <|3>._J`IF , DڠÒIB rm0dCsEnC3{+QǸQbzT|P$W2H=ЂZrzQ@Viu!Z $0h = + s 6QM ޖ33Ks4Oןys=IO BEq 3V⩲Qn1:*{R).^H=5Eգ=X^~䐸 yn@B:YG2/Rf<.qZ&vpVP2RY j_T)vNMucx쩴9A 2˦fM{9#%%20k&B[~b9^>)(A["vrB)@&?:pl9Yy`<̧lmŲ[-2J7v[Y-THx+ꇀrl&g`X~G\ lU$v/( _`m`{)9kiL?l"qZ,"4IKO1Wrx;N6+W:a/IU3T53m_sn7]%wNc $"pn\dL& GW"+ hhShCbsLԊ)"`N|ϹH: +.KqquGVʹ " jR:L{8zz¹l߈1&9/yD:NhSےnʞ':%ϑt(7J#>2u)- gVr怓 pKH/'_󍥉mtr`P=R;IJ9$(ŚUQlʹ[nB_3^M}\K( _)r1bsԐIJaU2eͩ_g҇9Nv9l*{~WPfMP\rO9on,n؉#ﶒރh'6C ;t$U5cR}ggmRi>,#Km:)ev F|]8yz@Te ID׶>I[{-W{ͷC5G-1:YY:Y)n s HU/As`³ O$b9*~24е8Hnii/N#Ob<8wY++$U薙ћpb·Pyc32ldlY7 Hq4z\C :P%K~͇yEOqlGD'4L `bW\Ke)^ pFmTigߤ(6`S" H<hI ?Psǫ߯?5-?G"6/?3/gR}K'K9~˷l!#r&~?i)s0* endstream endobj 16 0 obj << /Length 3252 /Filter /FlateDecode >> stream xڭZm~bO6pI^ MI_.@յ%DzoW>4]I$Er3<3>yUGUaˇɣ0yYEeMۇf?*@k<11u,,Wཱྀ}/P>TQ_%&JaelT%mqqEVx35_>u/fׅ+7ETY~i[bjE9+S,6(!Yy j|/taX"ܚ!QaP|%W^st2Cb4H0?X;G"_eN|eN(փOViY,OMЏ |bd0È(0Ē @FF1;>&sݩ"-p:#&3cQR6-K⥗b?jcSk @,[#;Flo4xxQcj£$Jtێ_gW6@K#`/(6<!w7\Do\Zt#=5aw۴j5AJdnN;ht7Ü1WWjuYf| =sű)mgk N;dXq&bM`OA#6zWBĮ j@UI(R7B_?\8ٗ88jeCQQ8Cݍ*@q HeSU;Tj-#YU5e\3Urr$HxUnSCq*zhmk(VPʑTpt={+EE@z O6a$Xv.'>:_vsLxqN6Z:W$6 in Ky(-ܤDdQmAJ=7n?ZHkN^-_'ŝܝWbm6/B/nLX>.bgJ\Ӣw+۽ FSs@Ϡ Ȫq)Τ]kgF4/\kXG!=rq>5(_MJxHesSoM.^:&*373Yr,e?l6^ 0;uȾ_ΑFinCȟs0 [>)c<+J@ėW4VI_`HLʹ:zu-\)R͡xCP1-|tYS=hiunM :熣Qxfy$:\NQ~âw׉bT&8kqō)=[LtE-/Ge\:uK/d~m~`Xruq8K' x截yG(r$h3[9c\r{FA{__,~ I(]+8Ϩ\sKD wD70uyou!^'S$Y{T$ ֳa.\=f>.(>6"$,L6{j}pI'_hNTK7Af׎ʈE"RP5QaF7Zé& R0NL^fvD}|ඊEyoH>$I DlYMB~ glv_v.q.TsK羂Cׁ>DOq-.[+YI _@:{W j]Xq8H̡p\~CuMˮ΂I5۵+\Qjlo"F |uH`ˏo "? endstream endobj 21 0 obj << /Length 2704 /Filter /FlateDecode >> stream xZK WLd<]Rs}(J$jE!=x"5T9<' >}LZW=ʦ*S[cΒ~MwZ$?-:;:|?؀\)S&z?wuZ {봨\b @4If vnsDLP43VM?"92O*d < Md0˿5{!ȖˀU U\+ g]Rh 6QkJH6v[{$ר*z\W3%oM 88,`TyӲzA*K30,Y0m'>$&-p N#,fJ8|,<o5)|Y8L<Ujieq_ AdSb(W@YaQIGkO.IgxvwTntZy!![l΂Wr4YhU{>~KCz: =EM|G(3V#|twԼYuomS3yG x GȨ ?IU^΁_Q9U~6ιqgrU/eLܒYDR9V!C腽xMp$~sJ r\BD.{ :qlk|}ҌVI3,,"ONoh.sǩ N-a4mZ'Vb!V<R oNFH,2yzhZa@ Ȱ+)@@08´YY,Gm#RxlXDC8y+& ۊHd;2:QPZ6ě:w8P@.YQ'Z:+8!p,qƯ4yBuͣy'V\ N \2qG:jl%ئjF%AS" okb^`J/B[CýcjCewdݎ}e'8۫pGbmIdP3@;rC]0Y'G@8:4Jyh μ #7[D^jtJrH9Y7RHԕ;8NOwƩb}7l=U'5wġwibNŗȍڽ8YBC4ZgVļwK$ vEh<`6.Ff]by}79kaG',g橥hw?'˜[g= /D@7a7e880&xL x3qm'0~&{wt&ca5A_wY |1Y7BocE3H숙'00F7USƩww߄W$#1[TUth%Yu^EеU e<'2djF9g'Vr8p\/xW,+5O;/3R)â/q66 #(B%G4Ư 5 h,]Rn!Me}ĐC<CX"ʜ$Rk}vA1ݽԪl~K=nr5hf~} 6K,38B| .uD9mP.ewȡ&0)]mxHxƦ)BVDfE z-:qmؼrF=9I~"ƛMm3L ]dbE!"00 qCxe*|rF$JCP0]rJS[:EpLQ) gϼDzZQ)lM|{'Yeof**^q; j@j: :'he&HkfHl;ʛtuZBwJ9u#o+f*ӖjOpA.Zf` ~R }~UÞ:xr sҦo-ɗz聂 ]f؂ɥCvtw3G9GJQ!r).}]+**-yk~blL`vJ{]%5[df`STy+^#ri<FZ u(gä,Z)z< &\u3p&^4GaKOuRZ}v"VGW-9 y5#GbI,B+!e9d&{+>%߄"duP=;x*^i«+uH\:Vh_T +rq.y'Jm_UushLxuZOAпIJO^ʾ{E$Ct%bl'[Y%?kd ëIN endstream endobj 25 0 obj << /Length 3744 /Filter /FlateDecode >> stream xڕZKoFW D#k,, @K$:4o=d7Y]U]Uusŗ謁]U^]մyB/__~Wsye컂|gx}ru~Nue) ]p.o /kQ0{j0o-gne _g |o+ne+9&ke))[!FW `ʘ-+x'"yDʛ'8a\1ޅv>Uq|:IT\yD8[zy/S;|ub YE';t* aHr'^;jWMBҹUoV~-EdQ3Gz3R YG -ǵȩ^"]Ye~v="#" t^Օi1yj SЅrcl0}~j&ui\ iw|D޳5XdyA,EFz@>+#6\3r9ĶYGEnrdzjnm)X`m/,;F:)B[bMWg 38:tA(q4)cfDNVb0.XGApz';~  9=TfЅttq3O;2%EӬI\~eM^,ew$FůHV}2H\cQwk8^&ܟ5̚5Fȍ>lq)A`)6:&3 Bˉ-ڼj*>0}68q߅GX+0 +F xx_7u: SUe@u_I@[f?(/ gMuvTe/ Lz];@Q4{x%:>< iP^0hܝ\ϊDN+{h} E4Fq 6nkXGad;A{^dR:MKyrH jBwg阗4y윗h-k H.'e!ꊆ`Ef&ȑm>ARэx?qI-1 S W @<̍Eπnhal5'ɩHEa"GvɗaOATҤMTȄ:吊fvwY: w l\;,نRJ~` ŋ*$yD &bt߀jgV9uⶉaUqz,0MmgNfp,%8}&B0θ[r>wEy'gM LʹVs p?3n۶ ט+f)ט2D3oml4 z!,"tPCn %b Z;W3M8L_ Pq29򇚄^Y(fGMK5)ǩћ;jLW3]@~Jd'n"05 7H Vzg'd/;,l򺠪 WwFҒjo a#FC\;j#y5OR ,m!bdx̋T̶FEޘp0_™JP6YI֥лÑw围pFx7#}|o=ڹ 5Tq2+ll&ڬO׼krd闡Һ㮺3[mdJW`ع7As#`݅3&y-ʿ`bmx'[ny0Җ A:>8h .懖J79'W'ՂߖҌE^xlW^D|iqp|_Oz=҄:D~')7:TDMX6y e4MnJ}UGj[D6ZZvн* ğ0I54 @I/x+tfɐTXl<ύs嗸鉸2o+Pߚf@:uD{10maaHxQT[%q? I G&,eB*1_\HR9ƄJ)(ܒm؝”A@dl):,Ϟw&YE]ERvA`W_z,+ 0({8 xrT˖'S½*g#$*NȒ廐nx˛ik.4d@%clSp8{&2DmФ6&)7JE2S,sƫ4\ ZN訪%:gbIV̨p-El=ȶfާۑ>*RsU:q6rpCB,j5WgfT7Xp! T$9Ie1 |ӱ!ܟm5<+[LG}񭇆PXPɚ4NiP`t.rI'qv{o=)I[HBz8y`yQWil 6V^RrBVޥE83SW|`Aۢ,GSuHnw(u=<+R!Pp1&T73wΌaIL{!{c$gA12 ox_LrĽ;9`5:f2< #"~' Lhef/of8@|[Q˥IM=ØtgR=h>!LE+Q_~hv!N'@q01`g)7jeBpWL ueJNRbyM_o¸8ox' endstream endobj 29 0 obj << /Length 3669 /Filter /FlateDecode >> stream xڥَ_1ؗhMv4`Y؃z85$Iig0MJ꺚on>^ISfse:Ɍ*&Z_[xmE-zirk,0b,?}me)MhY%yq46i20v1<{yZ•-9-ROkxFZ0|\dBNAg[1%ew|_b*z!n/DhfHBB 7m֕@5SH)LsYIu Yq&+9:O(n#8X3\36k늶|b4E`. 0UF/ta vh@Y8svۊ ~FA!}r@N91CFz$F}z(4!~YpF(|跦7K#l0Q ~GF0ecBxF-W4%[uVuM#͞_$e?hj㙡F;b%:jӔMvr&b5yYU,~lNj{{5{ SjbM4G9קc @P)uյw$4WЃ| a̝vAExj"J[.4 U{Ksf wC2ԉֿt1 ]86sh$ʉ s|%@,^aq.$mDov ֈp $i )Pk{VP&߬Brfn56]ɄT4cff|JD8Da@ǵ;K^(FVK)6Rs -x!*,2k"-F*XAIvt'Lk%EktK:,Yĩ~p9SB*0٦6)&/ͬREM3{ehQZ䞲<$@8ދ~:õ)jQoqtffETBULHæV,ruLNV}G{g@ruvӤ2 wUĽOe X_B{>$1;<"Yyئx^Y3JgܔQZzW%+q#m?[.{#f?u vΪ(&I?'&9Rw{ZA5hk@8yvd]I+d mq=s+I9uE8e q?hn0(ߦR!mOzE@ E`mCvE*q;ܝIG5`}yV e0W7.JxɄM0%t %h?էN3r"?tGW%.2pQ Aʌ ru>26ҡi>tZia5ϩ K@j]A2@)f.rWwļ^"ˡz?[Ѵ SΣ/WyDFXah9)* |N)nD"];("lub-f\Ӛ8G{YJ|(8)TnE 'Nӊ ; QF8Sx -uf Zí/: ]u "X ¼qӶ ^n2lދzW5sy|SC?=Uvz>l endstream endobj 35 0 obj << /Length 3741 /Filter /FlateDecode >> stream x]=bq/XH}&iq$84hR@+kFmˑI]҇]{/z[QU&1y&/k{*_|Wo3Z剹ouO~zc|#|p;po7(oMoDylw]v̬=6|bۖGjawĭw}Ѿ[o`@7.rů4N@=b}sƒnNqaZfg&Q_:.kz0̀br{sFO s8 |4 kS2w~:QeCMgN~mft<@p&$bTil*-6=mMY\CCC؎yRÞhIMnyUb"{?o3I} ܏Ձy߭T7K{.UM:-Zw:R% ^ȺzmaN[3f1J"7 Vq뙗35e֮nnbԅ{8G[;r̙NeU.SwsBh8 ).8>0Hlr(Ȅ\ DŽxx46~ 4($MD))#-< N q"uw< ˑ/@2ҪEW46ID`@ڝTS "ǖP*smܢ MIBJSUw<dB"U[c@ 2wPS*2d.K/I bܞ&U6ܷ1^[GhTo0;,OWCAh,@:P Ƭ!+`aPNQO;XρXw\Hʯꇰ@~Ra{I¶8G܅`'I2,!LP޲"*,`UTNFJj8cELN; 87ڰ?@U B3ZP?ŽLE$3lqW ;>}{q褩Ri! r#9Ip5*++)YGGM'25~HnjDr櫮f1瘝+$˔Ic=[Iث^ȃE SD^=Xj'`"]ka / Y| ik4 [Nt+Gx&9dx'ϝ[\wn#Fyyz9#(I j2G)/$×E|ъz; .&XmB(e[v<"16ˢJaoO#4DgXUc]^#9G^[S~~' U1PycoGM#b4G͢苒ToGOx 1Aj#,YL)0LvK7 \ET턫=⨰sz(]HʛD>.֖| Ӗ?8A mHF3!I|OPP<;YQOc6gԨYGl $'!aOIJ_Ԅ䃏} ƔMoCظL?_.$5lRrʢ<-4a)©ײS Olf_V$ޢVNᇠޤQjLшd (bR}ʧk I,F~\UAr\<%Ypw?^(&G@"**Ib=!H Mj Ly(7fϯ^p厊».T 9)`ԣS5p KV^8h$?+ /EO nr}J(gawNrV6+윝j,`w{jl wz%3v er ET3y_}8 Ē۰'ߩ7&J[h_K\xT2C'Yթ^kbkٞ& Q N}}Uc \fRǛN v}p&v-M.è9OJ%tӻ\Gw@ . ~gV<u/kج'$3q1^~ 0ZӾ\ e[ endstream endobj 41 0 obj << /Length 1600 /Filter /FlateDecode >> stream x]o6=B^dfE[heK< Ȋ#Ԏ\Knk o}b} `D_=H SeM`Bic(UQ"xQtlygO3S][wNb0EnRɐ\Z%i07FidS+8¸&":仇kFyc';KFxkMnH'7, _WST,QZ'TR+jc7c!`l^{{`(F*A`VMVkY> cf~+"1Z'/eZ c_( g䱞e!*R=Py'[4[B~ 9OQ5h9\kon{RaYl-' HSd婨ϕ4NuoBF7'֍MˡdGXj9#F arDLzۻ㶑 h$`N`_byM;Z1dsgW)U=c'jk zKp'N̤L&V%Tب",r-XwYydNGJ.F9QmUN"l@0蠣Hyʼn @"QSh: )vߔ _ub̟յ j`h]IL\K#/Q{$S%ZRA_4u>$0v^kb+JeR0{` yPCAʯ]5rpmm88ѳO=ccҮhow~8]X,\wQEխ[)?̸_0c+!DSbqx}`=HZVb\]sE~~ٌMzhNwtNV2uƢ<v4Um̚fܬdA'AjgX%K2ea5|N`؟ ~*Q3l_ endstream endobj 31 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-engelplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 43 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 44 0 R/F2 45 0 R>> /ExtGState << >>/ColorSpace << /sRGB 46 0 R >>>> /Length 2384 /Filter /FlateDecode >> stream x[M\Q:ڰHG `$)H6b$??UH,2C'nZz,M~{ys?GKK/ݎ2S-tc]ztΎG~<{[Goxc=-a}ooO|ºK2?N~^YgK ۷7Ɨ?=:l\L{GQ/_Om^Loӷ-cu >G}09==ċyp ax1_0~~.z,,}cyr|f<9'_oˬG_֖*nc~z|?/Çj3 ÜɏUw||w߿{sB߿No޿?H*Ӹ2Qs&9K%cv85ͣ;'yGN|d(7l2.zttOvd(f_xu _!fgsWϦOVL?0mҎTR4]:ZZ)<Dl!%̡SЕiU '$~ݕh!(g[4RW $_%L>F>"p& |ZhxQ4<3`Lqd\n'.a5m!oH)L^ ݁ ɻΚ[7b#$!#4^ +Z֌x)mGgM0H2:v^]hs[^KX;ygt`ehEa3F,#gF3)@#iYŕN>NQ`/oU #WjTTI%`kY14`Rڌ]RngfBNNȋKeN.dcњhf8:%d `fx3ʹ^5ceMD1Ug[Wgt)IR%hz-z|j}DLԆI^wggO'_ Hu:OrPmƵҩE9IuvPݥC!I\ E"ԵFlIUݞ\_Nܚbɓ(v+FJo!v%P#Rq.-WZ X7R0%'\wf>]qgtJPg6IM*2DJ3:sy]c.OȀϥ4!jgliԲB@ea2fU,LNQiAbF.D2= D},&5a!RJNnf%~|gO+"]*6sjKO^> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 51 0 obj << /Length 2394 /Filter /FlateDecode >> stream xZIϯCpurp"2 vAҁF^,ˇ4= !LXWE8 |iTfZU5t-goͷ_yOVmf%OtfsǪ \@N k-W?\ie<u=k !'_۫_'f7hPVu0FybXWiOׅ7ƪ^+_d-d/XoKw4͵#Oц/?i΁&R%Q_`c?d=]c6Z֠=2MT >$&B͞;6GN4jy> }1b+&&ZPMig&ח8]lUOb#<'KγvK("|%)K :$.eA@OvL@jVmOA ]6oKFBK>D(l`0Mkvogd蕭u!;5ŏ>=py/~!$F{6{)Mh"R,Q`nF2թgI;Rv]<J0wЁ#s(3w6cG37Kn哰 eD$JKvD@Hݔ(j 7b҂Wid#a6>kbf*j*BT[AYv#({ o zSn€q3Je7Vg򪲘?a!*Uzcؒx s}` V4 ON TCuޖ_BBRD> (Cx l T?Q#:i# ƧU Qu}1lLYRJ@H=HH=EC]0c;S9t܄*cyF~.[Xůfe~84ÜQBX}4c4tg@UE(텔5냊~ȍ \V/uuc.3V.vQsK1=7}m^sɘ u_,D]^M5 z1VUԘьG OP 51~9xg~Pt&\^frSEC3ׇW P3%[j |_? Ԕ^gP{8<9< jrAPS9P 5 &$'@ ayuP3PC_jBiIٚ&_k&G|G de 41O!V&;hb&.43}#~GpiR&Q˧R%gctPNLz2̔OdONPfoSa&3!3^rQ1|T7V/fo}² N>Z(֩vĥwU4BK\Y0W:ǭPY Tkz8 UT: Զ]H=ARjiw*"JNub)L%X\a}_4T NJ5 /8rQ:UIJwG(<}G^]xPT4"1V]alrS27OVl.(yGEDl.52M$K]\C5ٜʾs[*f˩fKrJ*_TB@1§T% A {BXE7CCSis&6`llv Ri5Ve^iela$=pؓùL1"s6H\]C8eUq zJ9)qv鈌|DtCSfJŚi,sy3.%-bmw-+rNmNψ[Xm]@<9(ỨCJ"v/QHTY3?6"̡?u# .`d[w4v%A<1fD繶pg;%ƃa$^__B{{c#$6I"5&!Hӝ#a=` ?<<4x endstream endobj 32 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./engelcoef.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 53 0 R /BBox [0 0 468 252] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 54 0 R/F2 55 0 R/F3 56 0 R>> /ExtGState << >>/ColorSpace << /sRGB 57 0 R >>>> /Length 4733 /Filter /FlateDecode >> stream x\K&7_ɂv"HX6&$Hsk߫IWbuG=7O~vt~[h?_>ӑSKo^8:j={=>Jg.~8>{lZXgV֜9ŭ9n>ڹn7nG⻏Lw_|_=r92YYڑ96}rVJxv}B[+v* E+=iR2aLRXfkmM[g9F2#Y'av ZA^p.2dj^ L?WBRJcsi5Ȝesua$Ø!WW 5hȋ8!|Y@l˒V&6^[9ZnY*̬rÃ8>:aY)|qb O3<Ā,0tt#f6[gZnYeѭn g|L=d/DyeaX; r420~_ {ܸL_4C5n1)L?_fk,bS׆TzؿN wg_j;qSN3EhgT?aPb.CMd{^cz߬>=շ4 3\WO]ٶYm=ll>}#ʶ*繭3eq{c<{tnafjoK6P'dնnؘ/o͟-Lꏒx_7#m|3x'Ux?v_g}5o^᳭!ju'm7G~<_!-OUnu˗O+ߪlZe\󥭧{x[ '1]6Ce"H|؀ @`A4 a8{[J`ETCDԅ2$@ ^)70&b;"=`-:LA |Ԉƥ7hcd-@k4[$UoPsuxz /jPH V #LAu#k8܄e۷ۣGb/m|cY W^Ms+`ێ留tga9"V&I@p$+*PnAyP85~^Y*R nSj3eTWnP(.ISF05Ν Y1\:mV<5{ծ]{`P:@n gD{YYim͵sƝphvS"[VJ`D8VDqa31Ro(hFlz\`,BuQ,<(g^P5"0Y@u%^@vi@#=ۚjս{%U!uA[ʈÖŜe4CgƵ=R}p׭L:C$IgOS<% ؈ؗU5:Pga- ru$֡l :NA+`>"_ǮrCcG aP,H.S}s"VצzijN][l .p|˰z#/`;D}ϫd/5uxZdYS_`5*|(;~hld*ۂ<}ϫEJ8WCmzZhQ鞗= W o!CM-qB`hyԩBc_x=J.//'ϫ?Zwz \E#> Eя(LԌs)uSs؛&48Ju$)D2+§WL7.lMɬ].nlR1v6w{Mkg~&-8 I%/'#'*U'u3/#Gt'63}h7qkgM\ޟ(,O?XY'Lޟ@4&O'&y x7~Чuz{^#5ν1eZ?ԟ~+:4FM5}]q1I,-2YsU2YfQ\ݫq"SZn[jsdd#D@!M g? L4{"_ ]~_)7I쿺k1~/}&Z 7־ȾtZ`EvA,gFsD6}RSNvܫ2UQ5HIYRD*jY؄L:9Lb@JCfba۞clD4֎UL9bxRmv|0XqY''B'I11 ,j(HUI`Ѳ:-Ո`PI$. .?e{_[F!r[p mmuxSzGf|ٮ|TzZ5^7.{l7{j|ٳcse-g0v{^v[߬{c_땿ܟ;e5{x!+lQ+?<^[fxfTR x[xEem,2ϋ}~~žL-Ya|w*lLxek<=Cx$-Yr(S;2^;C>4';[~G~fiZ{(a Pd,"d3plp e9b4Sq1TrIF4- S g t!`͸6Ȍ܃CYQڐ$. $\kbgd"FE}L}Cˉoo;tT&6ղ#gi"0tƀ!@2YSO;@5=a`ΰېP**>F T  #ELqrXS۝ + hOWNߎ zP #gl ̹$n qg2`gءJۂښc4GBHCμ%ͭhKH 'u#ښ>G vm∥VxY#2kh/=Xn iZ"aK~;GVLg_@Bi@AH0"$+u Eֻؚ3blWAȍЈ86P%#o,5"SYGC+rv.&/>BEqSX(#&xE9xz[}.NA^x)v\%Y uְwҌХĄ@ 7@ QsCd8Lds~"lT.0UP"M$"xb)bg o+YbYgZvc=B=r9 iQ%jb ǯ\ BG-lԚcdXE5#WT#4_Ԩ8P[$"DڀC:[@y_$R հ[\WQqwڏ;|]2KE.^DȬ8,"BHEݎq2[5C=4vItЏQZxXc]t$^zzFer\& pR endstream endobj 59 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 64 0 obj << /Length 3445 /Filter /FlateDecode >> stream xڽZKWLjE8Me]N%lf@IJfv.'R:@h4ur{WuibwEUU ]+DD_mYD]uԵu#1Eի_ꮎ"-pֵMwƵIi@h`.]j&hfγ#.'O$=Wu9;H(=Vi~2 LIB'lQ ma's\fz vľ722Zv>Nrh9Qy ;SKgx2:T217@WΉ;NY]+kYYj3){ca/t{'n@츤["=ڬw4,7+`X|k"SD6bC=9Yiѽ_+;s9t69*Wiz"AD^AɁ{Qky(*tl&@72W`OLM]kM{eW6 i&j?3I|3nd3i<+qUذR _\ qM]]vx$ lz%^d3RXOm(bPKض~ YF.;/Ӛթ~4͍,@\XhEx=F< p ?%LH'gʙ@֋,q?QKG?ֲ}Pc~+aRQM&,WY7s]ĂֆMYA g<t^Ӆ{GhQLTo塓wb[K'N06{7j∞7~WYԵ\{%^T6,]YhG+bpkjfk_-һ[>'صX뭚3|f 5b 7ڸ5h8`Js:n6?,ZZ')BZSZ(L5sծE%備R:$[ 0I3Bv-l^0g%^ -XF&4]zIPԌ/D>.!]թjQFQPOgL8>08 ÛE^}(=S#aac)zw&nr Ȟ4NM>+z.cj[} H-`rΓj ;nfvGb$tx|<žӠ6|`,bfO JH @)Q%fPV͜e&wݪt)\c֝[%k `Z^/GI<ǥ؂lE6"V<;?wu[籂k?$xB<\*} )|MD5;Wfv#E]{99VxŇTX 7NH\@0-&sV? h"߂<()\> 9=j^*$/idztwY%?M-R257f$OD;i/!A Qh{,O/͒xLkdr5Lkux"lثLhe2z[5~ sa~)1ނ[^Z͒= nY]tSZr*DF` tUY2"Wr\YF. [.07DŽJ|Aix2=/.;<}q8@.q?cue,u&tD*uحo𜲒R΋Lb2@" W:lUdzrR el K67PGASkz0 AC'IEßV,fIiU> stream xko6{~tZH`) 1bGͱ?vG֊yw1::FVđ7F3K #ijib} w3zw: <yN("]Otv~ӞEaZͧjܭz;]4Fpġ 5PtG:ozv guQcX֏jjQM/$[5AbDŽ聶DD @*9 1{IS0ռ |"RH l) \j#({B(}^ә1PF+?^<3CJ?jHG8G8&v}528>l~㾈/']g]=2)0̕L~Zďq"ivW/BqF\< ChVܓS@WImﱬR+CφC&$e+VLkӎ,J@1qJkolk.د&Z[1EaTw%#PʒyB(dY9qJJM(^koj9SVP&] z*)L^JHuRH\SM6$FePqMe$g*s{HHuEf2)WȎ$-O~м\jG9]`}Bgӝs.(7٨a`!p'p}!5)pu7WaKCa&Bo]yvȚҏYW'WD;1AxIK5\'GQ $ QE7eݴ# 0euuZ׉jCFwi[p^Z#A`Ԋ=;'س`-\O.] R3%87+\U 2_]3~yi DݡK7^oTnU0PpbQRuAD~ ӈIP -Olnm.i endstream endobj 60 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-eqfs.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 68 0 R /BBox [0 0 432 216] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 69 0 R/F6 70 0 R>> /ExtGState << >>/ColorSpace << /sRGB 71 0 R >>>> /Length 11368 /Filter /FlateDecode >> stream xͮ)8,-R?$0p=0*R|Z .QijZ[zOSI:T .*KtPiuAzyڮ+R|R-NS OtPNN2Wݯb }2ǸJSgdZ,UQd)[lF)t|S1֥*rԴj6꽯sb}isУt}y7N+ea$w|.d!wcg^LZ.Ǝxvi`!q0vHS܌ 'JfQU줻V/A(~U"7n̯r2wHa\6̟?9̹yݖ8api@4u,HO?dH1@.˻!.'&s>ι2aM0)'yKN#1wJyy@^Ϻ;L}N}H|RZcWm; oqcg^+4t c '%nT昝(X]*qUrX;\]=Ff^ 0о{s1qRZC{"9=uH0Nkc7{f~w!-q6*Q0UJ0.O< -Ɲ# r3{ =yw!-SZاϔ=w97|2$?usr3fy%Ȼ}\,wX^){^]~%qiD mʏa6~\~K~M?6=\|@ZNGMӛHsDnr12clYǡc@89%HlNٺ@rRZNC>dTҜ?:-d ?%`Tmnstwv1`~n^!DngH0 E^lp2t&C"Fa.͹JatdH~@|%= HfpK9/0 ,_|fbr(-6f옾Jfy)-ӉS7t4`CԜFfpm]}Q\8e/}F|2$r3.׍wnn٦|(-[\0,?N犝tcS}#%r3*}}OU2ǒ+-wa`YA"/y7v~fpT=L:ClwCG5D֋r(gaT9\{?.վL+s0tt3Cw>9 /Ji̯Ji5O=yz3Ii9 ,%[>$r30!đy7\D J䓁~,>(5FfMZ~Vu$r3EېȻ 4t] H<>=3Dލ;8C򻹈. /])Ff~.!-Ys3 @Z *=Hf_20Mp14v2$lIz-~~> ]HfizeACfX}'f|w2--rhj<$r30~RȜ Zus:{{.0t|!mN/㇐2~QaZQS WEKhN dy9+N1S|XqPt Lxb&L8E( xLxb&|(Zph'Oh>-8|P @т'OE -8|P /)&OX>|(ZphwO >|(Zph'O >aK|(Zph%K,<ŃXxxO1-8|P @т',E @>-8|瞗xh'O b^ϼă>ay(Zp h'OX>|(Zp h'OX-8|P @т',E @%-8|P @т'OE -8|P ;@т'/ă>|(Zph'OX>ay(Zp h'OX>ay(Zp3@т',E @>-8|P ;@т'OE -8|P @т'OE -8|P ^StOX>|(Zp hW<œXxXx/ /xXyx O%K,<œXx/+/O^b)V^b)S P ;@т'OE @>-8|P @т'OE b%<P /)&OXxO1-8|P +b%/^b)SS,S%b%săE @>-8|P @т'OE @>-8|P @1xXx/O^b)>%VB3#+~C)*@Q>b@EQQ.2%s3wPRnh;P Ji|-94 JiT ԼzRn\.a9Bt>*Rj#F&VP2s>#^Ai:JɇqqAXmYP2g{,(5 -|ƅKj@-(57ԜF@E&51 Jb - JjDb$ ]Pj> b ^P2q􂒹 Հ/(5/(gwW J͇QAi

b{iˠdNCOwCGfP2Wgk3(5:jIy7~РdFWDRnh Ja켌L9 ~ jPj m߀jPJ> (Ay7j#p Jj9 Jid;I0b0lr7(5qtRs'7(-?uZ@P4DJͻ] CWRa`%sX rPj> ԯ(0cO$r:R00f(XPDJgЎ9@ jGɜvwPj>xPZCGSxPj>yPjNr(A|z0A9 \0؃0SWPރɝ{\sAm怪HFU5*Ԩ{2#j0P!Â1J:L[:iP[:; : BL45*X!-:U3!<2ZaιT/* F4#C :[B>jPG !ԨNӨdDBQBP"ԨSs"'Bmܧ qizFHB VNxxjT ˡ5*31#VAFQ[֊I*[4*D8n_!iF :;[:0$VaDP;GBmtHb(IB : `I1$VaIQ1m@P;d~t|*(UB`\ 5*Sb8ؒ9WA/V! UY̫L{|r&Ԩ*HqEw2ήɚPb8UTO ބt 2'VAGϢɜāONm;P[9XczݩXOU{a*đ B50(V1fCFp&*蠧%`;hW1;xW1 >9՘M[:jP'B :jL :8zOjN3>eN3BU EjTt2(8agN%N 9'A UQPb8FHkm性P^1EVat8PbvQ+;:Mn) hkC`WQA WP[:$D;kTVl&Bʾ8j#2Hj#׊++d :hW@b8ƫ55*DK.)-jTt}:P-VNQ \ Uw*4*S>mFVUjCi :)U2Bm`IsӅ`sP@Pb8+JVA^F4]$<, 5* 5*sB *ӌ|qÙj(/q|<ܿ*ɬiN3U dE=M[:95p0Ԩ10ԨZ)0ԨzaQA'< U)CcZ :+APb8%@;8΁ :`P;8Ci,V2ԨS FAKJ*IP;i"eB,XjT9H냖FEwUrLZ+ 5*@P;oP[:',@Pb8kC:DjTtg{š? %hQ u ϣ@P;8iOJ;ՖT*Rb8`FEw2Ձv* jѓFG*!@WШJ l>iV̦5ټhfhfhGp6+Gp6 Gp6/8yp4 ghs4 g1Glfq6Y8,ټhCTF̓Y8xflټh,,, fl<8yr4 gr4 gp4 ghGp6OflVflfl^q4 gr4 gh,,+flVflfl^p4 g9y,̓Y8'Gp6+Gp6 Gp6flټhfhfh,̓Y8W٬<9yp4 gr4 ghCٜټhC,̓~h>5y<89Gp6OflVflxfl>h 8q4 g!Gllo1훌n_|D G@r'S.o#riҦrn~ dND{m2mI/???pxVѧ._21m8g b.8r).CN X 犝Gj*~U@^b|y=N+:Mr<ԍd"m38|2|>A!usnvYXMJ3%mU8k|:6f$Q7WɽÅ?_?o7?}IznDe5oO[Q?ٝWO|G=1{Ϲ^CRp]`BG[Ȫ򤬐(<ڤBF}څ9eR^RMN}&R63R녤SRޭt-/Yp_ʋAY_WK<k|cӧ@//J o9(U-+Ln1mڡTy;`l2tet]Ʌ]7 |K/>?3kTI{Ȭ\_Wn)QV}>Z|X*ϏI^~pn|yP^m[f}vLꃯs,xαW<Y?HO1<X[2ǯm<5^-sAd8͊w}(֕HggF,d_F$*e^9s>[ߗx-|Rf*<& Y(佉~Fqޡ΋$kyN2YVA)/\)Ur7yao;}[*SݸBrPn(ثJ6=~)ʝR~m*kq¬7L,׍m]֣Xxz֨f=D-$Gros~$RĦJGhi Ko&YL6-{=lw3[i)c|J{wF$a)ԧbcz5?b kii2bG*Qwv!ŅD ,CiIh_.dѶΎ)Yi@tb7m8.d4Wlل)u)z+,kQv|BV'0\|t_ :y8=y_M/X7!=.ܼSPOX'1aسoyq\懼z|03WOŢk!$eb:%He8)K{J!fgS/#=иUp ^^R[Ye,wI42U[}CѸU}Xkx6jFR3޵ TݘcScωƐ2Bnh'qd屍F_˹}J%tTwñ "n*7rsUBE$R Gv!nYhcS;A3QszЌ]j2E ųĜ#6ps_pA]YWW"OX*ċw3g2kTf4$^xJoǴ:t,zbs\(8-Hfe*/{E>n8EerחCJy/j} U}ϐj;)Νu=Ǣq#R=t&'R-y—(?_Iލ͚HyC~J}fӟ# ҳ*qRg"Os}'kiQYc32ȈY%jmBBrP)=&V4Jڧ?WG$ʻy>hݿr!W6<֜zR\OJ}siu{,n]^V+{WЂD/3>XH]xO myڋ!aà-{\O oey?.f}=~>O%@j~y٩t9}F+S߰R o*T~\ۘ{<.\Muͦd:!}ʦOܟNUB RܓY.dYPTǞOk1=,4>pvRupK%7-׼߯耢5,ǽ l굞;Y>cGWZ>Nȏ/)W2;}>^8EoɐO'z'Sn?An6?-= u3 dm}d/Y00<2䧚,qrYY}YŦFJ Ex+"B (-GUUkOi ePz8r NPa6?Y48O~yN|YӡSli/-d3/o㪳۵LoW<˧q+x}8vJZ~>e4U뉩蜗ۖ~Bn5}N=ߧFC^@UuME>^lȴ .zsh'\czͯoߦ寋\=}_8>Rx1Koer}K@/\=E[~.>>^ ݩg䩕Cu>}㋾Xo<Ȧqc> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 76 0 obj << /Length 1795 /Filter /FlateDecode >> stream xXKoFWDj5%ECMHj@Th{R}ۙ^\]\Z3ɔM1P֓pp4x%EE&ϦgMw5,m??L$뫟..s=qe:CQbIr6e"x!-YxI'?ߊ(B*[_~B+)>hⰯd*ZE%+N C osv rZ kmq/v%A*ۚ2LV|uCRH>t. "GS ך&ih?e=ԣ}/oӱkq83OXUdJ~ AJ+UxE'0'97:xrXbJ#GT'(lO?5k4r?DMWఔ g*xxJzkެizٞmeV8w5BsQ3._wv.gE{K9s]D,_=3HfشxӲȴ䝲) UoBojG,݆kǘ7Q.N| )ETuucs&=vbԢlK [GX )Udͦ׾VXr/ڶbiV80(z:l S6xcMF;@ُ8~=Q{|U\rNov9ǣA1B")$ ("ռ vUz%[u~ 8WYc;e\m۵ݩ~O[Z7'^MvNI4;d3g ,;,Hy7a;/STx c^N&fP+VC\5[Xenr䙁wr ..0ilMz*Ʃqaj[r9TebX z8 zYc wK_h{>5x CЭGPZ$jMٲsEultbCI'I}LgPaogMZAջاbY(m`rFn(}xBXbkCYɓmtWk5} u+!9Ǔ[*(*ʓߗ[o5֣0>P .Q ȫ'\@=$9~^K} L%7{i;E"5iW t[|7x553.3q>"q-Al,NZ'<(Bm3 ޞ*}RqQ Ix;Z ӿsG3{G^8طBQ! c3SSM eoo%) endstream endobj 61 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-engellogplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 77 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 78 0 R/F2 79 0 R>> /ExtGState << >>/ColorSpace << /sRGB 80 0 R >>>> /Length 2413 /Filter /FlateDecode >> stream x[n]߯t{kN" JRI1OUe+aiI̫},=Kޤ}|YF=jN^ӻW7/N9/3h_~L9:Yzޜtwn8_Q<ܦ'o7p [.ZiQٓq,{?FIVQ ^1+aGVg>ZNnvĻ㖪o=-ġ7"-p 3aʵ[WvÞc)y>qzBgG?"Z3{({)bZ6ܾrq# %s^:ֻE19Bf?L}c.Uj;th Kn]7Vra-^98xji%i#Nr :Y?bֻr5ZIiWep@6Rh j@RM nyZ/يJx薉-*\$ùҳ3,8 X/to .U-Fw!2BF@ʩh,̩GgN0#*0L{qxZiɟ$BrT7\@x!KZ PM9dQX*nDC R{/З VMoӅ/vT`R5p ROp'Vh[uTI)+.WG44 t*)`$@MY:G)Ҙ}W !Q# [Pu:5;DAsr0х'agOg8)B瑽)|EdcaS5O#ݚo#-ʽXbH2Lsr(U K7]acr @ l{_uS#Ƹm'ߢ(VL' ֧;V{=H) Ѽ]Au5?G; 0LH\vV MmȦ)yJ0&S/6wCgaWY!jG%)dsen˴3~dnDeV%(?2,`M)DC-Y&LqswX@xIC L`dlQm"b%JvQzTX D+ITpd<4#|'Fթ/+R1ט?Hn9+92ǑaUe5ې!' #I@> yR!dmc"9@$rfސ[9")ptp^T5Qp鑸J5r$ui1&\(%"y;$6](3iOP!ň O1$)9Oz ۾j*bN ږ\/RN6l R]w`܂kT8WHʢwQJZ[גWA:^:=GHyL Fj9u_{ӚV tIrcٿ ;"a6 , क़I"MFGzk7hLTw--}Jo Gu׻7Aj$$H*J=ZyHɀ"{D1l&]$ZjFh{m)JNI΍<Ez4v RI(Te`VFd xxTl)yTUVҗ2%{&&S"}Y̡TRtgˁ J=۹,kyFJq.W[ɹҵոn:IId NNjD)3%lY#+.a{FdEF:ס'&]TXUC7Zqg/ ^.83Z" US_kW&cg(VEWf:蔃HQNO0r̹xH[>]_s R!G/RTȖ>M@.PWB_'\6Uj~|^bx?GZ ct~0.?pbs/?>|ESt3^mM˙w9 G`qӯQeo~'F n #k>ø$ZϏ0>.fޏ_=jc/+߸ϊ\|Ȕ˼bzj}٨.߄_D|r|:yx#C\Ɵx endstream endobj 82 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 85 0 obj << /Length 3380 /Filter /FlateDecode >> stream xَ_1p$y%q Mbxc؀#ɣˢ|{C6 u7~٫7MinoJ6mZ/_)MiLZM0oOym+xۙ[8\'.xM۪L&ms^@<&K@]u9.p;+d?wqhDvRE%hcV[[ .K`ܖP'3B: DP5GY0>#<֫׉"N V׎ $F\g(lca-Ap3|Dr`fh$[Mdщn-LLa!ES[>Cn%ZsMi!<ODͫMNc6{4=r0(Z:;n Ry6<(<U$.2G6Me8z/Kdb 4#:L TZS5|;fr4##KmxǏ,(O*?|1ȘG䩬1t`Q^ҎgD a%4}*vx;fM$W+MHg 0UY'%d"Vά㰏HMQEq􎊳ܐqB(,ȨDfպcWݎee{nߛK~`Lvk!;l4 OQ.3&3k{662Z[1q+oΤu4ǂ/sL7/Qe0~g <<N?:YNsͅ #9;0$24] ޙs ,r/'} n6g%H16eW%r;@<|f`^ `YjnkTq&EvK'n:"ZϲWo"ȨLˬ\odYcI{ ҌSYYY5&/D -ԑ}: -fPbw3cpX82[~'OeL`81 Ów|-ߤٍ;U&jASA.51rOnXhŶZ?|WGޔplNvy&YEe|!:>8eZ22DT!pņObm3|N+ T^ɀAare,t8/ƈ䞷ߑe2Rw Y"G2W&G ;0P x\;spfjk?.5 KVu.ɁB YKhzJL6[ެ;?iebխ˲8gD*2wvlQAnOlww=ʝw7_B{o "|632\wE͏~{U/!cs"T?A]z 둳"QOO~URI.UE(hJ d>2`Gt]C] 85O{%kA;-.fᩄ %c\5n54|$Q/DžmR.οJ3#Y t.E4p%)៴bZ&p&j.XU+uGŒau"M0'KRXIXN;@Զ-Ҷv%QTvBy_/Ȃ YY] ]3I!T<"_Vii;C2c6'qI)Ӽ21BW.e1rKljL)Jz*AДRS *3iC+6q'@- _0 u.ԏxO&5MY:w38Bf  (YߐpjOM(ZY C9HbLDou\eQ8(" ٦:XX籃(QU4)߻oC{@W}>CxeֻFr}ׄ5LQYm([$OU.~?޾|ut3d\j/\<)ӮzOM. #D Z.{">?Q/%>Tzެ4b .gLt!g]zlZׯ0.[QFƅu\Ф% IhWY|ewDWB\ ~⌟_ϸ{]uɡ Br*ț< ]/)ds6//J6KOd4 g쿍8 endstream endobj 90 0 obj << /Length 2426 /Filter /FlateDecode >> stream xڥَ_1GmvlA`d k?P5#Xאhfͷ苢4Ƀ>7>ٍuU7wUVB*uZTYZ|di&ӬU',m/j%L׻PԢJiQn*$ĕ 8CJ@~4v[^wUYY&fl+mL}}oV@vZ d)j}2f;QUrQNU] 5{-l‘0ɽhbgKȜ.Pht "6Z@=$ Rԅ߂oVxJ͖3䭥I[l{b[Yr "AqǖA/:J)CHeme ˏJT*idS0dѵ=\;Fe=ԲZw%9`iU[4kcCNHEez`GT4S!e6P>b1isq69Xƈaav֌d.T3! \9|r :K$N} Q< VdKg?mF"|AKޢc^]CsGBېcl'=V~Mjؿ7~*D՛'~72PfιI0$Mp Xoɩыu݁Dѯ9yuqnG5b2a)z* "[o={[TKFe U_eS3C&"$G?%ڱ=#xo)03%vB8[K (΅#KKZ .bC%kCP!fJ A0c_جC&soF4;-T#*=W-ώV9z\{>G -/iTzpY^ Vlx0ݢJudz:2/;^Ctp2D#q6=oM(w1ן, n}c)/GI"ڗ3>?Q|!4dz:$ f[SoִȂmf1ePJ|2./q٥f7p #uo-D:l4۷N+9HerctpE򽞐4_/JcCG(Zd&R3+~Qk't Vs/?U uŲJGfcu|^F+gEl-`W5.¤mp_☥aEE9,6k͵KXߔ!)6L1,Nv7Ty`*xk\ Wu+VH_QtB nU=8 |KrH.*5ap`.f-p#eM#é5xJvdP5KBDeMP pe/@| #H#ҐXbʱvldcϊDZ A^0OAU9 Xhz iT э\4chr)Eb=zSZd`|g>'}!Kά<Ǹ#?ӿU-,++WzmӶP }l[޻=EK:C,__[ n6p~qCjr<NC?!ړo56&.@`Cc6Š3̃Dh|d&"gZ_ll %/,SE&rm3HNv]Qi$ǖ`ХHueQlC]lS$c|TBWEZfvXlMjX$2 a7#l>}lM?TEY}ܧ,>+d׵Q^ nGˢzWNʄw X-e.sd R] 1a$ c+Q'LETw|3v:vudua|llsc DRʽ/i=ؼr%3Cgz`-r ~G-aZ)>jE̙ZBa d5T91 MԦ"y,ˏ?Y$Z:(|̸ ,,캰﫥oiBg\uЖ?*e|Y%*鴉w6g+r(ր n5tlɦTPKA%WL endstream endobj 94 0 obj << /Length 1060 /Filter /FlateDecode >> stream xWo0_M> /ExtGState << >>/ColorSpace << /sRGB 98 0 R >>>> /Length 8314 /Filter /FlateDecode >> stream xM%Q+$K be`1[=qɪu{Ny*?"8y^y?~돯Zew^\zy/ׯrz~__^߿o?|I?~_~ns'/G^K}}5NW{'˚׃ug\ooһW*An=dͯy~fW>i^kEsj;<1pQvgƛ[y}Z=O:~es~_Gߩu6eIcoۨۛXۻu{Y5zիOۃ]y>3z4u+Tkl{;Vz:X*t|ŷ;jIsr{ie:Zi~RbOͷV*O6|)w?ܲpT67|?k^b͓jOM䠹5kw;yu lkH%ׁWs|t^G:syw/G?|RfoO5%\u2kl,D<"rbQ#'ޢ`s6/4pǃѣ9u6pǽ.w b5\"&z~8y GfnM?lY[Y1'"|qG8v;[aƸA56wGocΥû{HjQU$εcN멚9q˃Ժgiǒ ƽ6a|xꉋgGpk.ª6tIXsVk]:~:|Us;bye;h/ Q-xq ,'Λ/N&]O;{iԳj{3涯^=ΘY'w HWt|>lgp|&aa:cz hؑT;tldȔѬ Gs#N#-jGsAvs %v䣔7wt;i>.O4y:8kLghGWOz~^4/(5Qw̳VGIQy-d&Us6*1mYp'Wn`ŕOf]qqE`܋KLrU恣.6[}<ysO3wQR DD]x;1<~<:5ti׵؜?9/G$J7F]8z?+)ys۝]=[lc=p9E[py2p9Kr1N{F Bz*yd:s7/GTGiͣڛ;Xr1/~yUֳ}Kv꼓WBab֓YW\zq6๖#/e:Ie qΛ7{|5{U xɻ.J=O:pA+׌I18s?Jl]2H'ZM8~5<_?jq̣#; _Gw.2t᪳qm2z6ҾNvux+/.Bfp?`!Em8^ S- vߗnm^2}uf ZusOLqſm09:u̾~۳}GBY_O6]''dN6R:W~Q'oK`Y 9l4ŪRezh߅P_N ik.ι O+? z̳kv;[mҙBSq f6w%n'50̜aPDWssj]uP]2#LC"$7? ^^qLwCjnfx8h+x2c fwow 7Yǿ07v ;,̄=-,Hhpp yIvcQS ԛB|'}PȦ#]j6@|vunxR"ֳoDg08Y4cc=a$ޣEE{ƅQRc~}gPV9E8ݎ9`B0֭v tn`73lWm8&;?.8" .^*wq_K8pъ+24vi_!x>sY4یE%nmxV|ʄt ְ~=NhXr<_N ;&c=m_>vù8Y/FnL+5nvHFudKvn-iCtMnjTЙ o\/l|~\:q@ ^B庍e\OZO̎pJ_yFC{@]u8衒޿i}fl xki g_f&nv"ZEHEa\3Uo6Yl`^~ef_lQ(l?ݹ!//z߇c2fc/{pE@ ; l-n8ap?\h?ia?q[]av^~W.,1^xٖE&6FG b~{IjBv1`g b[=+^qVGoF2n7dV"r}T/+)=ydѰx@-ٲkQ똟%?xut?P'mL֑ ɏ` 2xwcF3"fvv QPs~m;h#ڸv= ha9`ppUqvM? t6"#bAc~D^?q)@F@Aq[dx @rLqo@/8  :$nXd," `"]yR?O0@\ `AblR _O)/},=4o O ; &uɞa 5 X 5q| 0 ! \P 57 q u0%Px_H]Nپ7<RH_H˜O7"@*@JnۀqݞmB";}|?HOH|~oezlkl$$tu#X@z#X7c@G7ҕ!t?7 k@?& X% W`@$6f@22 T " '@F@F& % Vdt dtdH c@z#0b$Eq[Vl '3jx%dv~ĆBa'̉+q{n11{=_7Ld.2|.d1)Y3de] ?@_muE(YohoY <~'_Tpx 忰 Jhf@B0;| / n "OmHfgh@2G' HQRe E@qTl@R@vL)ʐ@ 341 e(M)Sp)\_@R/n<, 9~Tft f#COa@g7T*IJd7Ė6t p uq Kv ; &] H@`@*H뜿`@<@ @u/lD0yWokNUD"@0@SyO1@z%@v@J񌫀θ@:: (U@`HP@pu&f/q CPœbS # fo @FfH CML @  d?R2T d^ S@KFb"2eD p?5>쵁dVdB{>d@#l@qYJ@~| 8wȪz W Ȫ+ @  @0braB'xX6LH6"$,@@U6+ .oy$ n x6*#C$ޟi cC0@r| m?Ź>H|x?u[_ 9DəH.H0 @< e@@2c?lXʬWY{3 hQ7`2|Yee"*4AKU^ɚ,[P(dMYi4YhA!-8K/9T(K+c P.n (uP @@T'\P(P`C% L@I J҆O@q{n@IxPW ($ ? (q#\! Dk h(RFUŀ[-I(_O/`%gI(7d0P܏ XllȒhuV$I4hI2' JTDKJ@@)*JI>Š|[o@)MBVc$VxH5$bj0DK$ZdI(mIⶀ*&P}(.ڒ-wLHSU5(-J2$Z $RB/2Ԓh)C-IVMV$-kD (ђDhI5 J'h $Zx-b{KڳBҮH(jO@ih@D%ZI@B*D h]$ZD$Jhu$ZJ8I5% )RF")+VO@iJXP ~&D@iP$hmI%Z%ƒhm%Z鮘>JD+3!#VQ $ZHh D-ѢkKqDxD UH >PBB-ɪQ`Kb$֥ %ZDKDk۔h]PHh1-I$ѢtK*h1%ZT,lVaEAP3$Zx ĄPğ IJ-Ѣ %Z %Z̘mVpP ÖheU@(*$ZԘnVeH-xHֳB-NDkOVċ-$Z(R]IUI% D-ѪψD1A V`P% $Z].JGJ+8hB%ZJ`I`Dk}hO Hy}h1h$"<$Z -j8mև3">%XhO-Ŗh=%Z<#2)}HdP זh H$JI %ZD gTn+,D+DyFdUDg>D%Z[%Z-ѺyJh]1D OYo$_ؒh%J$ѢDsK-a-U$b|K$D$bBdKdK5|OVz=nOyG.Jt[3he ЖhUV$jV_7F $ZM@uISu--JDkH$^DkΌ@2$D-2ph]KuJ%$ZIDK$Z$jtQ%@D H(:M$HQ?LIxHw H(bjKM2ВhϖhD/$:he`h %Z:# I3"}<#RUёDbB$4hI.J!wf)X@. h%$Z$Z? \DKgn XDK[CD -J$Zg@"beKz J5%ZD:%Z rܒ-dQ5$Dk>*V ])Pł}F)+"dU}K(jI3Xhi}JDK$ZD%ђP-JDKMI^%Pue(ȐM-$Z$ZKJ+TIdꌒ$Zl-d$hhI*VաsD%gh(֔yjOI%ZHIHh-UP(R^D+Q"(~$@-ԡ IT%Z((6%Z> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 104 0 obj << /Length 1326 /Filter /FlateDecode >> stream xڥWKo6WA21C[`nݢAe[_MҢ3áDvh(76A*LLun2\i4up[hfTJJH_>]f*(DUG2$A(cU<i'E2,y|K0{x1h1iGֲb8hs6ܺZwt˚Y[XKp˟wv`- pinYC7X~AZi˛OS{p.N%$%dI>OjHGdٕ3 99d)}?N#q;?s_:EQ{!޼j|Μ0.4 l~_ؕ X87y\<:,#0'oX^d_c:#gQ~Ά .]w iTDgJ!TD2+M},N_MENg)1]Jk! [1T*s>nmGt(v%5L[+9C8@Y*JeKv7T AmIwԝMĈo:<Cؚn,XK:t [-j"] (ŋ]( 7[ܹ#8ġcʳ(`tŢ-.3ε>-g rt@jbc b=HǗi_A5Gs}wQ0"\W#&7.%23cpg#z\4[;W4z \sU7Q먗1R}5! *7r(%C"euuJ &t TeGoA%o(YqeP@5JMi endstream endobj 87 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-mcycle1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 105 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 106 0 R/F2 107 0 R>> /ExtGState << >>/ColorSpace << /sRGB 108 0 R >>>> /Length 2453 /Filter /FlateDecode >> stream xM+(&_l$$ `` ,aWErn05k{I*oo7}ھm_vqo~W{tۿϧoNnwmߛ[O?on䷷O?ܞp柯[c/]P6)y/q^ݽn?_nvsvS5h=6h.r,KgoԽ86jfmS4ۼֽEɾ`Զۣޅ e/{zG~oLpxɻbR'Da2[L7ԭkwLf#3{(2ѻ:|)ʪmtCXԫ &uwg=k}Խ:LIfwŤ.Z׮wu$`qZ٣MW翂I=R0y8iyOi _. .c!9'OGvVu"OVud^c Iyكr]Yl;6ˮwm3͛}ӇzBei p~šs2^YWx8X<Ͻ=+Iݰff(*FG)SIDW@PYIb[ps-:FaV̇ ZpqdnX`.HfNfh[K9A`- 5^E_2fuE}a[j`kҠ1yC1%j/zg3m_ue5&muf,a<@&jqڡH-Nپqc6 ˧9-&dRS˲v%$뺺Y"ay`e)'%#Xђ!4X/W/N1z&>եEJ*w6TT|!-5MOƾr@e$ nXg(*$[Aۣ艍}GcmOu:-tW\y kdž;;2 nUQ/Tg2D<fd2-_6ŭѝֵ7%TNllG}p_PN;vQgv<\ܝ;?y&tyeW2/KhּF ˧\FrD^/PxӢPTd]C\]< !ǀ2eEo"6ᶶ,xMۼkޥ7ruF\3O7f`pyEhV8~|Ajn KpNLJK {~z>|}X?v_IS{vݩYKMkņC;D~D*٧̔NԓSA %0!@f)ϩ3xֶ!+Ik^߇JkY+P6 /}~<FԩxmhG|_:uՂ#;+ hPXQ4*?Ar )7oȸv ^/%f;q!?srSV7ӽ 1-g/B=%A˕Uy *EF䢊v6j# _N`pީݜR%űrM^`$ /05~%ʭ=x iiviv&:1옻RڂLE?BF 9*"_paE&QEd z@Á <׳ _BW KL!9dYVdo NdHdxgVdkp2}SS?4mͧ`~wt fNz*}Pnj.2oǩ?8 endstream endobj 110 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 113 0 obj << /Length 1583 /Filter /FlateDecode >> stream xڽKoD_aUp~ʡb+ U 0'Im+5L ~W+yVbIe<j:Om4 8"ywžZxl,Hκ̒%R7Hڙ49b'H讝:ђB21PP@i˧Ĵ|;q8)ĴJ}l@ Q6G\Sʶq= {ᣉN%\+-hB;N/p ?F& 9{+7 khCY^pƉ:5QNƶ[kCNcBϺ! =ql5(y<3_"p8~C#xѲJM &.7NUXFӁk!\acqNHߴ>SahySćqpzX=34#" {{Qկ1n[yUZyh4s)";hqB?"Ӿ܍[f`h7j&fHp$g՚o-2*Ԇ̚+ w8 y?ւhFoolk›@qإB8m "a@nXѢ`En$=M^&r:^ojLcO=Ԅ4T۱7 AC-^.H`֚^éd`vzϊ,52w'qݢ:ڌOiĺT'<+=g#]#퓟0egG,,46L-1IL SkʇpPVftf' j-Ԙd~^ᯘ>(> /ExtGState << >>/ColorSpace << /sRGB 117 0 R >>>> /Length 3105 /Filter /FlateDecode >> stream xO)hn'69>HXɈ _?UgzwZNuO=5$dՏܰ\nçWwۺm۲O_m.,/]߲my-|X^=}n2UZ:1Uǔ|nr|u *uԿm?w?5Y^B\z5%5]^,r/_ePӚ8^ac[SkGXS+S)k*;r2V?\ntzl'uL\ylCM[v#~7Ј9ۡohz]cTrylq_o)pbl>IbFhi~%A}Ik5Oo^OW 9!{~ׯ<fË_>t|&>Y|-J{|r03flع:O?뺦tuh[\GpXǵ wϫ o9.7ubvwa?nik;`sGÖVo0/վf&q:bAZtﴀP~â 2ͻ.g瓦wE{='uƾXK#ްS[Wsݐb^nHo.שyכuyi .$3Vr?v5olymmԜl.srZqK(X7#DO0ײ9K\3(<=yHypn|C$:yboyn4kZ"P.L-nt3/9 l|m9'3m#&˲u;Z ^@. Uoҫ!Ŋ.)veWA/>]\YYE#^6ua!ug'D5VG:ȨZ:+,U=KK !kyz=ݎ?7A'0l 7GzJ)]1^f$#0]hv;%Ƚ?t#X:+D,>Ǩ: *J1.,ɰtF,p.7C<<-+Y:K.KXn(MCƗ63tI<$C-5j/D7R[%U284rZ3+Vj#.4~HYp#-LwKI$ Q05#]9kzۂ7>'4Oh$|mBCe>CCa4' A Ο Ei &4TK Mt.wOpjϠE r$Wh:A@UpVH@P $0tW\jVk8 <;VhhA{-̲+ /R° {!xYuO h8Ln4b~PhhCAaU+ \#,\!0R+F(p)HfJ|A֗3)P+)i.ɔێvuFRUP2h&Vr幒3f -)SJ>#,S9䪑yC) '90H{F `؏C&(Y9$nJ i^5+QI@RZJɾB 90!*)"1B+)$79]h#.Cc$\$LrP2f>IeE mx',j%ފؓW1r_h96gU+)@oȁBFFh_7ɡOr@@#ʼn,]j#䠿s"#IC$$ `C|:ɡR`;+7!=*7$Bgȡ'9T$ƈ#DؑC~\nMMC"$jVR`j!<- T. hʳ@߬\rVR @jE޶ :k~ӱ|*ZQ~Hf \̯"%ch 1@fPN5@3Pӛ %<*>2RTcnyʡTL Mg'9F(C}e e1_ пq!xz[u?cV}cGFq!!c!&A r1*(3[]2VVSjc\wRXO2Sc4w0~u2C²T+CǮjR CD+c6}ctKb#Y7fo#m 111İh3bXuk2sWN_heh~ ? endstream endobj 119 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 124 0 obj << /Length 3896 /Filter /FlateDecode >> stream xڕZKWLĩhjlIʙ=p$X"gEiwǿ>ăÌH 4_}[ڻ*mk=<ݙIscM6w?'?,d۟WM=4 ?|UMrx>|շ]pU^iQޭMۜpojqKtxy56ɿYHam_Lta#iˉND$~S@nwviA#,ZC. ui+Cǯaמ??߯Yiv ?(F7Mo6ev{$EM!tA]$u8K^ZPi1V6X,֪duZ\rwMmp"52 A*n Z q8zy`^): xin#̺SH{kqopܢu{~bvPCՅN,LNG^﻽o_/ udF2ygX!W}c+`k#_(iYqwNgVuZnizvXL&V9j"A]bkkVSQ:F8Җ`A֊Nq/cCtgO8Wm*<#w$StxkVE&"PbA#Ȏ :GnAyBqۣS x:5pB O2;LJ\@L o6c?JV O#A6U I Աm?]l UЂ{?h0B1ALC6i Vҡ|\~|P$,~bdtDW` *0B[S=ejq^xJ4X>7:!k MP@TN}n7p'hy +Tap--&y{o'U`Ý<=8@5u'nƕ# 9˃HZ!;sAq96Fgw傽ρF RY$еƆfa)' T r1-x 98j$*sAeՄـ["B *Bw-aӚsB6f)%(#Sɴ];w,>U~>.y ʴJiFZؚ Rx~-yJGwUiS/շ̦ɯ+x`h POG8`]9MUHרNQY U )0?cVCj?PՂAS]W6(##.f-d.'{2i%"8@%Z`GB3Լ󹸂q,|kBkCRgtc=ruIzm)OgΜ 7  t5kMl$/4^ă/ S1ai>T&rM|M(LyV7PG=ʗA?m#av ƶSM= T[:K E1~Jo^R(Ԗ:MYɶQ2-YN Szk6zn.vlz]ZҔ6'@` gH+Jr9ʫ[&h"lkvQ$jvwI=Nr1܆C ƴ ]Am*i׿9!|X">1 MF,(R=i){=\`NREˏ 18e2mRU0|]fB#J^]p6Gn>кS endstream endobj 127 0 obj << /Length 1312 /Filter /FlateDecode >> stream xڭVKFW{0<+F(;RG9c<&1<䷧^ ͌Ud']dvaaqt7ws05Ӫ+`sˏBsX 82YY(N$BT`) I`=?έ#o?w(lOV.*-H5^Z_JR7H:zvAǜ)k]g`oë+)Ӫ8w֍؆ǘͩjvCd—xqا4#FXh~y{+5f"lAkT~ D=3aOEk_^("*#ןVj;\ɵixKSVL:be%\xݙѺ{Gq@.ŚuKݡ?ސRI{Re=R ?a}>,g.t pCvBי #푎=!R#ԑdZ[0u\:f o6Xvq;cT`T =kU\`*<^9 ON$M%k~n-\rc-lώ`PWXN5Vb٤$\Ci+ݧ T yV.$P>ͽ 398"WR@ri%k#Agd"iS7:јIue:wMf(6x\rlRj60TaeC 9 '$m8!bNǴ}6ēN_ u%5\ q_R@;=3M% k#<9@N@]͘$IO>N\'kKRtZw AN.I-26S4￀O0\Mbَ 6ea2 NJ%B|a?^"cԥWu/RwqK Xkgbj0T@ܚM*2 fʎI*0`X!rU.<Wu7h襕r,CqHmaTkވ%Q #}t'h(QJETE9#=Ds*JY\5FnBx< HWJ}(JؗUX^}Hgd rR [ CEZZ SŜqgl0+Vȕ=kNDuPN1ɗ„'F͚W=,َk endstream endobj 120 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-mammals.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 128 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 129 0 R/F2 130 0 R/F3 131 0 R>> /ExtGState << >>/ColorSpace << /sRGB 132 0 R >>>> /Length 2421 /Filter /FlateDecode >> stream xZˎ\Wp90Eڰ (HGx!{%aa$%SnVO,EfaIǧ,֋EFE}|?}7S)}(.Os4q{=U/oǶ 7R.ѧ 7OORPz9mۻDy^?=!^"Su;wMuwoOɧ,it@6߳_/R#(Jz@wYvnn H?7AsO5{~ͯϼ_M-THn4-^(ۀ}v3([C )L,;}? 䭬gO]Ϸy7߻_nouwOR1O&=y_K-GxԲ}|~v-k{J{Y+F)eIlP9pS農!K6_\ xX8*cZshcvdT_׾ƯX6Yİ!t`8pƐi_tX<2oE><>9k<<2%hY8z:>rb_c*  Rvx Wk`wd-Sgf{ ˼?/NCɗaSeK9&^;d8k}hY;g(/PJv8[ =b ءCb{_(-qAsv$ٔ8 bv|H\W8qk_VǧqdQݲ:ebuKܺvo7YB4['čI,N:8&J3,.S+a!E5Xq䧸9jZ۬gQN$Lxmɰ=I]5TF_4s$ǡB2+옓!xrlX\p3oHWhq `Ƣ4EzB+ GF{A<z=SCBl>\ ^|lu7Cq;N4,ݞn"kKi(+q)G:I9BE f[O 5Ż8" al\FK?7Dcͽ; M'IO-9%$|opmb5@EauyOra$Һ8 L:bж"7_$R"T VK| Iv1OHZ] }@XMlHsSp %"Ep] &8FܲS`B\{ @dUfm֤EYXO"(ĉ3 Љߣ&0׃&(wп{ϕe|p׸O2Cx< ' 1[dz@A8|: ?]C.x90ץѧ.h Ǹqb5^QEz4O7G~4b;~a)v/6>)à/Ͳ=aVfg>my_* T| *~X6nAK$ۼ@'O)j]PQ6/P h5?b Oy/~AD T|v'|z898+PRim^ Լ47/PHJ~B'|+2jk[WJAB͓' 5ߑv6/p((~<޼@gT~cAW? j~\?/)X&T<  5O:,b5Qm^)鄾5T| *~P~B͗P]_V/t|ZP0h 5@ynoPZIQ>jM7߿zuՌys<_\ͱ endstream endobj 134 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 137 0 obj << /Length 1646 /Filter /FlateDecode >> stream xڥXYoF~ D{qiߚ%Z"8iεRA5;;7:>{ۤPui61e1IQժaj^Nl$e81uڷ0+&/M5 oo.MR0δ$3F1'76sC>!t55f`^l SzBGr@#.XT 3=Ze7^}?^i=Q-8#>9 2x]K=XH⹚I'RT-zL) AvltCy(z L\Ufx$ao(ݞ>WV?=VyU`YJ`&]G\7#Uswu9Rۏp#j6K;cj̵/!NX2V^Dyup Yăt𾣭]R z9=UZ؝m4UeѬ(X8\Xm` w7h/vG p΋wh ZOWkۺ._3]pp =~&_vL@A;s-pw`Ӭe׊[*["9kCRMV(ǣ U&dOBJjpՎ -K79Ġi@#}{kTk'rȢKUWNL[q x]?7NIas3ҍexr5ݐB/%y ?mv?`B"լ-;br y(1c0wqXxjJ~28I+C{麮TxdۮB endstream endobj 121 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./rq-cobar.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 139 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 140 0 R>> /ExtGState << >>/ColorSpace << /sRGB 141 0 R >>>> /Length 4507 /Filter /FlateDecode >> stream xZm9+vAo~3@ A }֪*uNߛ3Smo\Ue+^?_~JS<^w}?#߷ 9[nX^޳]j+WbmW?aFE PA']a;v-q\d+H!IwƠwnB8" }wBct\t r9@*0ʝLz\'r}}I_"_~R~yO.*>H RYW׏?GO2ͅ1A9 k]g~l*tϤ/RJᱥ?Zwxg/2 Cky{@]EȓSm4ϹL>eR?Yp+ץ=OKqWnK}f(%R/C<̰UI7c*NGˌBLQgi*;Ȏ4v8|8-AN4;F9JXqx# 1WO@'DD!L&MY˴-'?B k|][xȉ Qڈ2yuX?&& ;tr =,78('Qnb5(6%BZ lv=-Y2Zϻ1.ςA؃5/Lpr8,hehV!;xFa$4ZbF g/?":Mw"x9S4椂Z:x.ț&+FtևGɎ_hu6>|ĭ=1X~>0vhB !) +hLde)M> ]?UA&QE-)YnDuGwP\Ϸ2,{ bp7DW~pg|Vf2Aʅxz1Mw) ohArYnDH(NX/Hrh-9mGW;4^22;/`E LJ3QZnw\yx܀jPϰ.4PFf>1%$ 5m &*^(iH݊3GIQ /:EކM!5B.v""ŏ4NɫSdQygZp Q`&`Ueb f(9"aWy84-NJ]f6S"*Y%#m{>G lw:#M5+ I"# !H* n]m̖oXv4Fp.\O_ _׻*=y!T،;̶05XP>oXWUac 6#lT9by9OV+ kQ U@RcZ j0:&_'hsm҈!yor)%)}W5zvF%Zm9v~,.Z6cIfS`F$^'AWWg0?aڥ݈%[1:3"Urۙ5O>n00F 3R0a4(✲}6qYǃ -;(^$pttћ!eUq}!iː1m;i LДغ9C ++eK }waEб+UՅ>R0h~}K{Yr`ݾaKQ5Q|}j*žGA}n"hÍwg=EV/gEl~_(TT -Qd:Zbk=VfK,BX4+ ;'FXZ>hܰ7c'Y ЍMBU;}Ha_+˯o9N)7%Qߢ!h|aoV7RIҺ:Qqrb FtrF3Q5^V<;r}ⓕ mmsYMh2JW,S='>YICZj{Pg<NW+'Fg-%zq-[By 2MdO̖[cEI;)$8hd[E  \~@\YE$b! !C#<,-0iwYq]hD!r1j@!ox/VH(+N N\&\@iע&ֺ"mV0"SX+-0_a}`mMs. s=3!I EIfIrҒ#j`1z J;M9HOb턱tgtL{0mtrrƌ2\as;;9 7ihsdP(p;\]FM'FfۆDfXVTESѳNc%4I{W_Fq:6tZ'lY&>gtC,ޠ>'b.`Y*!#/\㡖RnuEbK>Xc SQZ>gFH$ N]uP$K Hq0">jߙYR;$Y,f t2Fɿ]X TW+SޏKSϏ^W7.mH.-ȋJe, dz-MRKqHd޹qYi!4l BMsC1L9_[bXz}@Yit#.\QBFIFϐȢ_vo4*?&9G2_S\Mr8Ist*\D[%vmK;rvirv.MHBJ ׅѮ ZJHt]ҕINWt]]ul#!!]Q6H '}&zHB]9l%>ҧ8F*}8yu}H >iZZm`qwzַA$ޚ^ZtyVi^Z,iY1D^!A,a'MC[ >GFG^)=#=g8ft׳~i=RSZj)Jb &Fx, 0 J M C7L5 0aSc5ި+,/݃,a-|79`nǻXӃ{z܂S7^]^"[t_߰9VaZ8UJv`.`6cCqKv\cmGZ/NΡUjìMOV u-+pPو+^"^be9>mcG'W^uI=_)OHg%".jYsTl}܃E[>l߆lإJchud31Gh4#| CK*#cj'4y!ubzyH?}l6+QfV]IqZc2rPx.#S 4'jl.g˰\ JXe'qvhwxz<q=ٮcYYW MC^Ek _k\d L>4TÇ3b[1J?ׁv_+Z1,ˣwy,?BSt!Q+$#<偏j6䟤,d􁞼!nQluuPs5`)F3}ȝ17V+1Vd+٦iՁJU+~$ endstream endobj 143 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 146 0 obj << /Length 3577 /Filter /FlateDecode >> stream xڭZIwFW6{!ް&;%l")dO y9Wxz,O•gW7gi^سҲٿ s=Ksc2~`zß`<7[WK|]$,yJ8PZVWcF[$00sɳY`hdrÿ^VyqjkivvjÑ+0[h0Yra[kY~>ҾՒNޝ֝aPz9 -I8ST]\AjC#`2 & 9y*G[ݭE`c;7 ĸ t.<ڐSKLy,x臁- jYCyuYԙFU6t8xOa6 ErI!*I(*(eZ&{\"7jSf<( TWOE>6ˬS( lDL;CPZl GUeSbǐǘݢ-XŢ>6pӚ*#;qҋDY*ۭq۸HՌt#}dm?򄁀O8񧉺V,d!Β1VXL\aĎxad{]^p7tJSy!f<%u`;ݼD-,u VL׆ %\ c`H 0+R`LUrE eEԸB7rS9ڀy`92 q EWlKÎ_2{;Na26YCG'u2PC܋͖ ?fسbn %+[tP wF|KHUytP0˽T:F9|6ϢxV_dĀ,3v7`5` o8$COh>5~y):2j@:y J $ǧ〖eƃvCj0[A QWNև7eqaMͧ(PؚvhGc.yOS,SqOt.~:)f+>0eţs*Ҫ#04'#_1 &yQIDhh{PhmF'Y|-:% P5[ilaCrB7GE5},vb%AãfT+9m\RODxl=U89=( e 2;&|([x &$w< ~qfKj ?Ȁ"y4;w^sC!!T1dv?).6Y A&N9{< RW6%h:ڦӢYOfy b}(2Q.CjP4%ɇnb%FhV{dV#',Hp 昒n&k-Y=hl 0e)I pwPyT(C7) eƠ"E5*rTMx1RrS=\B)Z ;VbR7~ǃv{uѾYfʠEmU$0+&Q׍EJfl'AryQI[>hn/ gV}>jwܤeOttpz"Pi0Ez8H<a},ma3|dX<ޓ[{vz׊2RTJ54RHEk80Wrļw"´b6h-mXL@7&#%ɛw{0$!. >fɆ+u+DXbyA,hG!*O1v]F,u*˼d.7ψ,bmP P{s<-dQ&\!紭[e(+wSʼn '9+O{fGڛ#kФK')?>DJ;;{&4=fO@ fWV,)R+aM.Z?obKWMjԘNCf cwi"B1>>e)[w'g?i]t-itka&TO3 .[O|DYH_rrAQ\i'C$;.(C)7mH|5r #cjńtŒXf_2"V ;y};;^l;}iRbk'=iZA llQ40=lx\]zl({2`0= Ҭ(sVƇG;q(RƇ|v*])NRnu^ ,GOXiMCϧ0ߊs+a^]au6qeUWE[٭ 2BY@O)7=8 <Ҳ,H](7U@5mƳژTk`4:,/}cP4/2 챪#45{ߣ2?0UOQ*o!7*X92/ӎN>.V'MMCaؾT}f4%/c{\Jq3#RMvIL2I)51Q\k$O"BZnC~է6;-Vg#VrK}a;-<_1Xha|mQQ,,Cye;OʦM#2 `XNI{2fսH}#W5R3]Isg)E=1HJZWRRCʚۓGVHf{_Rc޼&$~WR2^DԋGjfZˡO#;^Dkݜ49.|`S\f?X@%u<55x[Ku٥͋ގ.U +iern|M܂#d`Fxq#o5"qvZ9iIl^H3I8^+3`2wWL3 xq`S5лx9$s|8e>$!^?3Bz:-o\YGͻ'Ԋ|";1%e^գZVMC.;l}DRN4(6#^^TX])e?R0?a@5x`!ytx ?\o]-w'`Q+bTBsHN6Ǖ&/3q~X~Obb`E -GL7U ]jnw>}mFWTK<־8wQ_Hw#~jAl@xhb9?k _\z9lrR*ԚN{?gFaBW#D endstream endobj 149 0 obj << /Length 481 /Filter /FlateDecode >> stream xmRM1 W1l>c{KhۅpٶufA?dv^笷[gћlPZ7S F+.5[#:L?А7Z2Lc훛DA1)a]j#* ;9RS!̗[;Lמ 3M> stream x[KW&Y|'{HvaHǫdFrXx~UlIԴ楶7ðdX_XJ+2)2VU&+T'MT6DY٨29e4iE6fpO(yr[\P&8G\CTdR&56nIY"mm8b@'\-aI@.Ai"c($E2D"Du%"ƼW)tMr1}ۮ zwz(6z t; !BU#Qbn[. .4(\/ql 岝gɺU{M&$dmqyܻ3oԟO?ͦ+fi~&.7vɳ4ckCG͇5z/&V,sldz[K{sM'Odr|%_&[nlj~5jn f6߬p.6,u{s\@լ6f6rn?7eLżlA%l.gb5[5b}^5KLandlbNdھtWQKN8ڇ ?~vZ'ORrQUt]0u@Øwؠ' ujvPb&ŃA<raq}+#cC8AUp=/Fw>O dWɞ;xODΥ/7<(< {WDd{黓};)#h}>OT$UFžmlMy6rĵ>O.(Jqo+Ɯ}d6o߁< ƾO~t|noWt%O`9O`j['rz?b3kb ~\;s5v%AV{ CGOd#G~e1}x@% cRҾ]lǹܩ?Ev˞Q3އ3KǢN /=놠;8:bT>`Tywa~:ƱW.n3"O,p c i-ֺ:j5sՌ˘`\by6X+Hild=ލ91_ZkþI=|8ȜlQh?=1 Ȓ'2h4 B^_fHI)G E/tDh6%X#$lPؼu׊35 Lo!pZ4vv%u1vv$2;c:lNsZ3f+񐰆aEPFKxu%-7"u_evHڲWMSF#"jmŸrTo?GĉeK2`ٻS8 ײAvC6gjv`Rc*#.hߕXG-xUEYôb+"$?֘}65f(- VV{=> [,f|*F&&k dյe9B?+>o$# *8夓$P#\?.A'נE<0HYvҜV@AϺ;Je]ﵝ5_zwIQX)99h77xV-I|xq 9)괕(ᶔ8TƑBK} ﳶbUʹ6^MUW(J2WwjVo.24WoF.*5YwZt]S ʒxOw]E8wzW@u֨dvϣ3?.@,AK#X_}j] endstream endobj 169 0 obj << /Length1 1555 /Length2 10119 /Length3 0 /Length 11143 /Filter /FlateDecode >> stream xڍtP[.qwn!5X#k`kpwv92s{UUWkom U q He`eJ*KrٹX9Qhh4P;п(4 g0AYH:L/2)S苡2jr r 9eqJ-ʬ@F Hoc(nr:M v@ 9P ; +JZA. g7*[cEjZ]Rh@, lrpyqqu9_5䕀A+e {8@V@`?M!`+%|' 2M,04sL^ ,(#4}\̝PV=e{{ {}w!KmX:i9\ARۼPY@vvv>^~ 0f##O%|!@˗6@`Kuvzo" 4YP"Y_g߿O/ 8yc+i17 / {9gUSu/_yKPr_ X*悀݀M?]o,#]ݟz =oB_@ mku% v삸ݿv{,TPs\E;T!.? ;^py*gJis[ræΦ(/x/h@6VҜ/ǍlF|@6 A@6?MݿK'MS dTzɧob2?$1sWggOʾL_7@̅lZoĉYFNl0x9w@JdqJN>l`h\1Tspnܻe=jzJ>lmW*>LDiE|(6K&|e!0>|9L 0+[o3vkLӥP8nwQA iEmBJ?UbiJ8iv*@Z:w0Me|@q: T#Nւ{'YV;O\ GΈ=[t?އWlJ0T*L kdJDydLcRH8^ٶ\b!)H{貽>1AB`Jt5/c~g$jKL$D$=d#2SQ#l/J6T?)ݗ9[Z~:QDRBJ7.-4yaMtǩ/\QطZu0퐩@ERVhi#m!JkG{XJe}{x||L8ìYВs_FKWPNh`Rm(kGn&ްm(=5/>-pHwլRkJ%kb7^\tcAɋi 0&ZybK=cX52ړqB>@{qOx{sL?z\yY Lߔ>U,O+F\FⱕRohX~8~ܡ OUnN#8$*6P|dll'=IanQaJ|8'A@:{׵5|銫ؼL ʀgiFdfMvk'ԣ W|g+."Sw)_XqMC<'n1ڢT mkvK[]pzk! .GUYk(qoq@&tć-qsttYI^asޓz2/ I oJQEICОrE1ݬ~;)qf.NEVV2ZL`ZQ'k2ef*s$wQ"XХ#$[ָ2}gAI݅8(n?H>{ {T8tI:QQiY~otf[&XsϾ{VB#ퟫ1GUuߞ/; qޱ\oec@ہz<׽ DNĶqU%"c' n2ֶ )X__"0j% S'Rs+jy㞽 tg J_13@z>֢ںuLg391`ˌ }% vwk%IlQ~No}=9;R,qID-(K-~ Q1Af4ե@XY %3~ =X$JxKcW3~f׌o"<pJҝ.<+=)6ljWȣhZj_.A>\EWXh߼=1LRDB}:Fgf=֊JI7m6J ɩ۷7Η@M#+-{Kzu[*ۧfcM3Uk#_*\ Fq^M`s>)F\5IX߂h72Yq¶U75Uh7Ш=kDXKtJ} ef%){-8VF*r"BM?G318RK)":PME]PWV-!V+Et R-"܎VEt nlfMBfZjwcq#:ПlBMQhu$K]i WŸi:hq1ύ9S6y{ @i'F3R$|hyciK(jMXbOZ`?dl5 φ!(IZM:) )5w;%9u k(`VciFp&CgB{#6(uBE7d՗Ė>r۵>)"`,6Z4oNwS |&Hţ0EMn79tN((%b$ueN C<͏[W3ie&~ d/SBW:(XbAә&1f%feԧ:%5j|VxFIM#LYϺ3rxU=[7WJ-#LE p1I$s۵} ䷈B;D qHiD؝I巷_']>aՏsr/cwXK3T"Yqfs>.°9v`& Baa# wqo|ݕax#珖䲳'oPmD Gmz򜱛bx~.^*fnv,iC&Rsy0pɾ ;^񫂄߮O.dnɑ ]=XJ| 'ONa:~9 /6X-hжE Vpc7όFDe%_LȃI צFY ;~*qdiFUFc}x85?k.@agn_D)'C3BWdmUy=zTq5'X '&LvuOĨ}tS#&Լ2KbdW; _lE9AsffU*)YǬ9! ieN ^FX䠂4&55ɓ뚧^ kL?np? N&0ؐ+7vA<J'hpV.;}49EomEFlT}Hls<~re}K0/_Cl#3>צi3=#M")_QWg8% kϰNO,ëQr)VJKn+Βqݦ!t;1@oȕimxsq 8\IQ[Ŗx<$wmŪ OA,"f,:}ހ]Z&E6(E<0ayO%KKK>&ׄ%&&X! ^&.'Y:SZ),}yMmFbOI&S#᯴ Uq_OvNW#a(CLQPaUvj8fkVn M 4.d8ꢴ4o=;CKtu|%oɇ[[29X6`> X+千X5~Zz?'rbGA?9t~?%5ݚa{za@w>Z)?/n/z G:>08\T LJ+lçSOV3j)avfYB[)_#.,ָJg ;]sPuv%9J,Ѱ3Vnwp(Jې|?yZE .ݳQaԮ^{_w@G@ W,BLN:.e%P^o.x8F)Vl 'E|e@4a0Myb>2aBn/<$/5j{z H|]pI==0yѴpŐ6raQF҉z P4? sѓtcY1/ ˣ!NO6[Fۼ-\H8͢ Gz Ɓ I¨S0"ETkXED[govC:K < 5㻶7-KMQ xdw%Dauvfk.UOް޵&@ ǧ)j؜ EdžXÖxBM=1;E/V]*>'#pTc1th#t^*JQhU<ν]$ q '- '5F"b j-)y#s̜pa ItfŐ)Cg5NƆuY,7^5L>qlK8gCi +N _b 푧 rnURlJ"f-O˅dDEM~hkb=y.?7X~1] @W0OVSCsr_\zp6,QAX R7]7IP;56UR)2^qDX?&}T';)X]?ƪg0/p?1 iU\?2ƃ?ӡܙO`6JĻN-/E9SSJ)9#j^jnRkVlJ+{ spnmN.Ȋ^/Gֺcr:&=cK91,as)^sy a-lD9ǔK0ʾ6+i0_5QQR)6 &!pI6̖.vH[Wr;m.97ӄd1b")[Abqu0_k}E)>ö.?/gMO9m2acehI8c\k;14(Pݭiq +v1oqd!oGy[QLfΆ]WzmIۃdQѪKʲu%5ku=>Gg p"H:o3<1|ٕdV09ѷ@ m%ܣ`Mʪ gl>_yFfO74Krn!@bJr9,]ubDֻSXM[:S`<Id>yIλ~QZkKpϴR-d&#X45 ߳Dz.ɚve溧rQՙc`$zYǦHwe5VT]WceCi!TN|=bV:4r\2&YO aLǚp<|k$RVz>HT֮}Ik 5i2,j.褚cv3Z&f}Qsr /l.z4%2p 0YC\cZQ9٣m޶`eX/kx!{:JwZ}ҟ[M7l q#}r"t)V1Upo S<%J:mu^tf-P+oY9ܕnZbZNzt^HB*.:su=QCz0խ ]5+q8w< #NүeULD}@N 0*;-$'j#΀ +%HN&UΌ5K-$xjxd)x-goe@|W2C|E g} @Əa=g`wZ-B`O!u59?MPPgV*] a ( #0tNDs3ZE!CcNQ9Vq_979 E"bj qo]г.tvC(GiJyxgGQyi3"yNUWP$^F>.UYK$k"d-s^ u]Ϣ}8H.ߺVtzf{F zjPE/?vH 8O0'(]Y> z 2u9nn"dE8O{fsӲaq%fyRj6n|<'pLN$$(*iAEކOi&s4&ɤz{7Ƚ*

h0E*x? T\ ?s.8@{n1LUN1̘gY@DuVӝ|%ȁsnu6(M> sQW&9v~h̻L]ksxT)fxǪBqwˤ=<{4JX+5T]Aw-ѹ@ QZV<|>}L#utUL̍5 H)^A1Y pɇ)>`@"-`JR <?N>kq"ՐnѿV珥}4Z5˺ -[Kj Z8n)$1;fv-HH^(plQB8XM"xz]j6(ADgGc 5^kέM:.ڋswm}jl!re@ "Ug$scT1T4;j&p w̗WONKVU`dtUTJYӵG'R8+b=ug( -MJ'P1sleTr#Ξ۷m6?FbcbAE8p 2y,Iѡ-aMQ:~z}ɐ)@ooucx[䍛BX۫Q3ƍ]9p$g|߯#$v=W.ZdȻ }_Eeѯ28 ^+Y0C(rmE(ܢ箽Ԥuji1F֮KYJK5adm.Y  e=S#[[=-ʚas:VUȨ%lT9`R5ү2` ,Ɨ_ <ኆ(71O9bF5@gu5"L_wbr`LwMC'mtS]5O{JC# pF8l"{ړM{:">-c2Յ,elH J_T LJcɈ2y =ӘA W<VjiZ|bc;BDV{(O`* p\IM AQy"X2BnS?w4R|_<"o+&X4>?YEy#(Ɩg(qLq&ncBO2FDmVeÌCke&zm^mCooaϾCGIvy|7fy/a(Lq+V V->rs7/_:u=z[ԕHS4 fK z-8,d{)W.Ⰻռ ªi$TXPGvk'5ࡽй5c)wc4h>[9%X$34'Bg:VeI֘*~; AR*1f"o fbpaȽ{zw[i,;jo;SB2 3nP i m?UX,W q&h%]>e 5}N֨z#.56~/Qt'nu&脪^i؞Վ?ucFmѻLX9C.RQx)V'2 0_?FǬ欨JnfS -{k~X߿MOBE1©NEjC=,Ň<HB4 f{ι*{.8^A$efPMOGojtC#Ԯ endstream endobj 171 0 obj << /Length1 2096 /Length2 14956 /Length3 0 /Length 16213 /Filter /FlateDecode >> stream xڍP !8gpw 0w n!{8J꽢 f^-wȉU腌l @6֎ L<9f&+ <9%xru5?(" ()gc v09x9y,LL!DfF95\=> ܜt@f@kdh P149O*>SGG[FF ?5 r;@OP55sEhX}@)Y-_dW 3뿝6V@k73k% .HZEZ:ؼf@wߵBJ t07ut`p0K$_a,fm$bcevt>Q3{{s6.fF 1reT6sI~`gdcb WCSƿRق62u`.ef zt@^4/gf: @&fG>I}Ȍl-eF 5)uMhUXgag03qr8?xoEٿ Xި1P7T]ߤ}oIN!,My_'Uy_Kk@FfNV*|_ !kAdhhh׹_fif Rq0331Z?#/}ſ0}1kC;b-5=Fkw\/=_`_(_`b0JAQd(rQ0*qgP3(A,F?=`Tiq#zn_W Cx/$c3xeq;l'4|a.] yw~ߥ;r?BlOo8ޅw=PO!3eߺ?`t4]l.' C'{%{_;@ C6流Bx.{|Pg),_`fT2/˔/31\_ح#wc'?4!2v >qO,G#I~L Nd@ٓo1ޅXS:],>c56eֶUtNnX| _|K*j?AO9Y#0(Lj.sV44 tFt{ *nuXI5h#e28YiNC&A|4H\-&k<ȅxυGBj1S;&(VduY.^I&SZ\J3 ]/90~ }FՑ7u;%a.w\sIKMVL%adw(g$!Ð 3K}=P`1CElt!R[>UbQ{ٻՍhQu~&]>^?wuGm0x{19H(%UL? /ܝ8/-7A"β>'~L\Vq\mY9MDϐ7I,uI+7$,av^`Ȕx{R@Ed}DV&QӕsbvTkA!CV<#͝KɔqD S}tI{U`Y[?iI4^kdzV*c;LwU[7 NNI(cZû;7{J&*$geT(秞 /&? VmBS0EYK@flBaZ{u\7\ޯml-l*ZYߍr oغΖEFC54kY`\V_D uR]s+Iaywaq!N, J_&BQHTl5i,vebiV4&פ.b054[[3ixP?g4l>n`O?ua(݃3~m<>D&tN~{ckp)Sz=F eo3GE Rq\rl]pWCM %;!cGC''=u,X@raRp n:[j.YkZq@UVH3xN}W;?' $5򼧯;L4ُ֥ؒz%;'1':7)o*ܶ?y'фQ>Epy"&]ƋLaG-d@Pvy~;+kNm,8n.-%O^$~"-/Z+j LWcW@n7ϒ{Ťb:0Mڨ9 춢3xW!D3ţv=^H4|ۯ!x}|3[''e]^Sl9!rIB[h7KX1jE ?*PMls3A1QqZq'{A_+ê'Fz1lzژ/@[~6s߃ >YȑAַRѲtW?jߜ$͏g[?A=iO[@WG.=)p^a\pp1۫fL%Q;V,#T@[5y ٬\n&gzpGALJ|Bb3gyd!xŹ|#c?['mla=L5 xL-ӧm|,2h<ӼiJtcjh",S׏z?[H{=Bsbs>|Z'(bЋng]޾"M~ﳟO.:OœoA"I1ϥ]YXjcS %'0{R/$~ͭq[w,:PQi|6# (5or)PVCuT oΚ'!eʹ=|xDe3Q^ihQMZ(<״$J,IaPaJP~Nđ7Ko)Џat)_W=iO>zx$'.*ie G *5+7ć!@+0X27 g+'ӝ%<,O8I%1yo]0F{ ==F[dؔ_VmѾIӒx$5L'(ڗb#GxBT7$[syhO*iF1i5VΧB̡)&ulo4\]cόr{4De)^d*bj2?m0Ifv!{! ӧ4n Jogaqq[ǣ\>FO!IZ*!支&:UC@P I"\(tچgcKځ4` ?@MIV% 6" )_b&_9&2|>S ^O[/e˄~ O;|cRUFw˱޴6Tsoh/3(vt -/' bzb,z|?S>w1jUB?CXZ 6cA8zʋm)Ag1V<yQS:km~nc|Bȋ""O0ɗWZ+|W %5xoU*7UZ;@PgMuRtXTԢ{e%GB;d:=2mU݄).> E`Ρ@-=eL}%^JAZ.gs?ș'0^ZAB)zY6}vZSiLtnf&JH[)cG7=)mqf=71Ln6DPa98ZĠO2\:?]XuCљc֨\.RYDԱ+tRX#d&۔ vya n׆#%S&60j &AV?TJ< Wkܨ*4PCqˌeHcS~gc4mP-M<@ЎdO\~uN7Ĥ4z'q.dG0ƞ/$nxǠ>ǪKh4h:x8e$T|$N,Bsu7C.Cjn{IXya $H(Lڊ:bnSKwD߾H5_xu0zt} ͬ4J$ @{UB}鴬U< b9HzA^Wsc!2āىk#x4jEm8~,RRt5hG<'/̕!E pAO2D*J#ϲգM1 I\ÂsKՉ;MdsR}'t 4qB줃MN2m~>eո#5h^;Ox7{GPF {[wMvRQcb`"|IML##Ѩ=t^{BvSKc/BPUuJazw1}Dw 9OO鰵/3*ej1G_f6sy>>M>pH0v|YgSdmmͰiI R˓tS@׈:ֿ}}:߾yX*_xvЏ} >:!Ry+Unaq-Ўq chIr$n"{f5랞li$l {y<ݾS ]gẤkڟCgiP. pYbl8`͗Sz1`mk x-%;Ǣ:ʆRz.pa5B|zIX/fHZCu@ M:*cpn8FoZD<swp .yտ=LNs _"b˓ MTZ~ܬe9^s<0tMOlN8$:$~_`Qۯ9F +I~7<#sOo7NA4h43SaxB \2R&)a}aryB̈́_+a\ %Lz8߅f04Q6ũ=Z$/S֕8)3$1akm?kRtn":q`rx'i众 !.*Af;<ˍLoW*\ך?OX:{lՏyǶlT>i~+䋘Laz=Jme>3 Cu`|ef#hМ/3?4p|vL*m-BNV a=N{p.4-VvրrmCS;Q :+o*vT\VQxg:U#-kpʡ|3tqK%뼼̖|wZ%ƿ^Xb" 4m_/4m+% os/!*H#ˠz4e-y>CYH%*.[K:t[g./=i[Gz٤4h/uw=s+qQؠ9 v'|lc&c}ỔИ3%::QqO'tol)o¤ƅx#+o>a|mXws)w^..-f4 %4C=LD޺1u̓L?yh3ʝZ ">Xw%t6ӧG3 ˚Ýkf&I(7iEaǀYhUU9"E/I_[z҉(E\MGo6[VLg3#.wOLLZBQ `BsZ6M;{z s?Չ=av\L 쩉%G:Wr@i7&5:gݠ>q?{G,([ 𿹎}l h!~G2A3ܲ8\MmD*iaHa^}m/:}Ig(`JUt6P;(+I8~R/4К_%8G#HJi8Ik&DRVDf' ⧮b iϒD7HFxׄu]ԇb߯'uGn$p t^bOfmԐuBCY9qZ< Lfwat-Dbej?|d@PG̳GeQ26پ.ǠRR8'ܲ~xJ!FJ +I#D<)J{5pt6Bav?y1\BğAyvEwg1t|rt׳rٽI)LgN)}=/yZpc]JWo+bL@*^Ma~!k/SOX'BB\T1|Z7YU׭E0s{t^urLg ~[m)jiAGpzJFϱ~ |Vs|Oc#U4{M>7B-! 8&fya~]̍;W^; %s.fKuƀ6/K-c`[9ƯDE*In!Kѳ3}Gu+k C]A%3ڤgLAOrU7e˧bX(DG* 7XdTvK8 į&:ڈ5%|AKNL&7'FI%]BZR$# gvբn'7t0JpY'Y|}QĉVv9*0>$1^&%Erh-s=G>xsɇ\Cݢ$[GpzրSRt>EcɲguIsƁlG]pB)8'7=|sѠO\+Tҽ2z0,RFs›q q"-ngn/ f^zO0:c+m+6$K4niͣ D,YbqA;;`|v5=#y*y$_(~!$c `r7LѴEq氡T,;.ZrKK0l&#g">}Z%m|zrOj6[VxPtm=؃^c#![J~05ʖJה|{f,V@ޣܚ 74-'zni'C9t0\0N K/ |\+c0|*P<Ή!%Hϋi㑋ٗ$ג!CLS&MgK\C4@"1QUT=_i,]jHK1$F1^6Gqۼ\OV}OO\?eCeM>8_HO@%[zZDͰF|$lІ940x7R;ŋG):v:w8“"րqб=`ES)MEpk:r$$rW 3%̃?$;.?QEKTx믐v^ͩt2S'GFb Y^EU~~U"zƸAvfL68»q3S ~+u7+P񊒛@{}>EޟZ}3J{{jqI~]*C*eoc4u $BIRjrN.[-eȵD,o@;a'_^;Y`~Enyk^O>بe4"w+XU0'WՊ2]%hAkfY[{1 09סX4HSSp>jICqP 4-x2s~wŖkfi${pm2 72)$̻,iG椦ݗ3+oUm#Xہ6'j.&ZM5qL4H0b~Powob2h_nGO3[|1 lFE6\ ~iL])4 10jgHײOq`e:(ޥұyO=r;{΃yLe7Fg8Z?W^EFMb?< VIj, ,&A`8µzj%F,iFjF@Ӯt!ɖXir̅!aA@Vtł%A/n@D9y#8On;SYL< wBfxk*+|oH.$`ņtn>S<0%&=`eg b'ڻϢCi!1J@)~ ?PAnt Cz}m+?aqvS7`&0.P?_㠣,ptq" G lPH}R\~mΠ; Xx*3㺀I7KKj P37hn#+z/&ܻl=6xZ,K_ncc<1y@k )вuT\5OX]ݐn]F.X5O{RE@'yF6Wsz-@z8#;J>r2WѦLD٘oJ9gO`pYJs9S}ť}%>1\wBL<7˘Y,%F6GeXHKj$u$ҍDB^Z3}&/EO_Nuz׸2% rˊBR.;!o[^#'ϝ_?Y>@)>N,}@VZڙҭlC9o~clUl (+=Ny4Ahx=q=8g7MVYem)p*ʎpLM_Kw+}i;&=pzEPA8NW}$\:gLʱ|η,_7&m;|/)QߒWH Jd'ziOVJvv|}Sڬi7 Fg쏾0+AZS> R*_g-Ot\{REUXqy6[!iODV ن\rbEM,fZ91!ASn Y}S]"LH0-bRwݍPn )K6w2c+SM=X2 _;{zf?lRZJ0o^Tl˫JR/>y=[%tI}"ROݞY.^Ftm+ )Ҝ4H}hfץA*uz/z;LEHۑg!lMa5_9 X@u>ҽ cr~s_J%t'y")Q,(0Kn0N䏅 ^K;kqv=y8:GcK"95ā.$:;{깬&+/cB`xBp5& y*Sho4*7#Mn`WOyN]<|`p/ k0frr]WZN*È ۧQ=մoܮ= 峮Rt@R38[ڸ@qBiZ 9Q~˶Zmwn.idDcZ'2೶IAŖ-ʂC]ֵT=ZryÁ:k ˅$&$fi^սOm˚ &pI2iXS:rrs( xhm~׶0bѧfO^\(AL=ȫ7ǣϿ$yp638m- *v0i*R^z=aA(sd%a86#>lP ZN>odZ13Ҫ] _-߳%2LY41>Wčh>1RP*eN hV?tZM8s!/?g qkn*[>$f[ꯌ:TXwd8"m۞mu6-MJ!trs^}2SMKZ38rDɲ6JbX~إB΁TGBl(3t[\-ޓkJjGDo#$ewbz->GuԺAr*OnkE}ME*A2&W(XfiCm }bZ~#9k+G9ZD 40 y9c <j&VQJ9>:'w4(tuqB*.K҆,t#mW`[INJJ+Ғd2/Z$㇢9Yl qtBbBXӁאv56PMa5/ّ:xql!Oޕm=C Kt<xD@ӳ/uw_Sp(`Y]V:U'bƐPOcǾfJ:> Xާ _Eöb FD92W6T43 痈 {h[uD|LrkE~X31ZUxC@/u.اkQh2XͨZws"v)ANEDV,./,hEpP4123-_>QTTyZbtz㱗yE½^\V'}O?3lAɁxEg1={_ z<L4 5<,W I9a &tv]OYJo<汊U gO( I Bq& Rfw"lCѿp5XH~ٛIrDz&(7Wexa0Qn½V1 @]V7w~5}Զ]UسV;U-u=7r~gAXncOA^v$N]+W T]~lD 01 7u?&l<nUkҡb_,¿Ȟ2D̡t}Ruw.mX.C >Oo S>~ƀr*s6'*X6Df1gg XF%FfuBjVl5V1%>jD}g]Ҡi~t6:EWas\O#k ?1)j Bѓ[J>MY,,&OM-KODf^ME1 $`7Bq@ ae45&+-i=w82cSE]Ohfe.+u˨'E_y"3#qOh[xaA= ާ;Y'0GT8#G]Ʒ怞,'`ٮ0IV2-wW"N~m/5e5+TuhRyPG0R$ʁoO2o4K"?1CN㫏_gK;{Ĕ2eT2HF3ܽgz];u'>GP7DѢ'<_2jzގs:^׽4NjP݊W-)3/vrN\fp&)9pn 6' sGޞ^ u%-Xm1Ux^)83NH)JtoA׭#NOQv򇑒 cXeV} ZV]{\UBh25kZ x7 yp&#q5{D zIcë'2eiMZ~Çq'"qo :O2$z᠇ -h-5* ~X;E%@q[I9RXc]K*]wrl>%@vQnUdҬVZ䇮񉏹Wu{wi1U)u* e!n3Q{ڸMI2JyFM 'Y`φs5آePLWeF |%y$gayZ_{cUOGG^#]/#LS-QՎ?Lj4s?0vCZaMڅM"0=MOy rm=@/Á|A*K. FC{Zp}@)mtFMM_ٻPe>C-/ ؑȪ Y0([Br Og)b4\dh0Xt6 g' N(:$; z~w>wl9(sa>2qV}_. ĠwW!ttV&E !0NNqHK=u*wmkl٨1G\wZ.VgR>HWzj\+)!6ectxҞ#ճ?Ey&0Q*#ߣV=8'"nƱɆAgvQN#¹}rJ2d`NZLty>Ljުj.lՠݕꃙJ5dPDu}}Y fsڬ*k{)%2USv֛1;8;峂D?M|Ewߐj/cUvZ.6.⹲Y =>zexeW]C(ФF0pHB3;tLBU%b7 s<{ƒ7MM9[y׍jkW5O%HzN =k{iUЅOr8ά֎r endstream endobj 173 0 obj << /Length1 1386 /Length2 5995 /Length3 0 /Length 6949 /Filter /FlateDecode >> stream xڍuT۶5U:ҋ {{WB B"Mt(]@@@T)i/zg4!R.3/  FXCxaCP 0xu\$W?ѿ#p7@CW_@X e#; (K kF_i׬"a({@"01f7L[k" E$%$0O,ˌ!8bǀaR@aAtD ps#Hk9u>z2 D{fV準FSEE%@RRD`F#XH/ x(\H,ua3(`@gWݑo?_vA`@⿡½۫c堌prE½4~0! q1~i ".A_> 7]0~YRAB MD\F5cO H(7B$pDHTƮA^n`_xPX&Ͽ sHlu7}Gs[d bP?)2xk/N3{Wy>]`vZbZ`^7ڨ!;L2K +*tȝb⸆d!9>y|&AIeө*SW̷Xiގlfe.O';z\i*ڜ]p3@_GljTU2vUHMٰ⯾;7T:DZb8}(%[5 EmJK&2/SY# &+9'yGR@՚WkÀG|>_S$Ep3PevOǯVm\ڷ4Dz60e'[eʥV*Y%JΧ.$ʨY[vyW,rGj㓮wT#ǧ9U Ӷ}T}5\!wkzĕ njODo3lp[dzE~7|Er#1 Gg{?h_.{kS+g9!w)\L5" /2e!&~b3I|Gʼx]0l&E^滋,#od)9%x5TTeQur"|!F=c[x%ĸqC&76)f 4oДap ȝgPLOw6u`IKy$b@L)-'I Xsֳccx`M.nHS{Vzw7ʰ#%avzgMdX7kmr!CWAY!%? yKUkܛOӳxcXnӹus8`a S0ORW2@XWZw~x36w2Uqi@WbQEE)}9pT%*u&MSY"vevo}j݉ ԲwX;[]c|f 8߾ɽ`OqH*p-*V%C>g7FVv_)2WD0z: OϽ/v);ŏU0k%k"wO2kFu$WgRRgMdmVۈ|ùE),+YРǏP3vgF4||Fw}7&ܐmcp@hmbz4*BWz/Y+AȜ<:/NV3}JVI^(?zG=Fn 25$O=&7($ܢ%^(7$n]Qpj,{=uĦ ;.+EaL軪;ۂ) &:Pr-3 ' Մ([vݰ|_nld"3[ƑҒZ{~0,}-/^ `͇ >j2>,h gxc]\(ILGcBpf%1=Pio(_wjfRjߜF: 81ƻ1y E 3Yfl ݲ+Vr~u!WynQJw ~l!{F"M|sV֌չ]e};t9^oY *DVbv*ݜħ=^ծϙDVϕf%bnr'EʨO?b"%8ebk~^;QUv+?;%uX`q3HHgY FڳScH@jlΎDxXXW |C%KZ9Ǯpgߜ~ |a'.9F& T[o5/ qMTڒuwX(+1'89no;>xky]R2N-G17PV 3lhY^V> ~yN7xMsķPKrhx%.`5|4#q)kQϖg|`]Np6m͊B#S$d~̓e24V."[j6a,qL@6kI,9ʩ#M? 7vg=e貥^ Meٚm9| b|dҠDBV1Ty"uݬ]2;\KkԵw|%?]H;yipqa-6r\/厼NJ1x:kZHLO O96_\q8|e ʬ1:4~.={}*c3ܗv-aE='4[ibdxqJ`vpveo7 >5;֫.i5kmtCmw~[F k;]E-վ7vg_ y:3f$ ߓiT%h}$ w'=_s@cd'K[*~aT'J cgQ Q߳GT! C.*XSZ3}[4$ft[oo]\{J/T2f"$7ƸQezǶ O2J9<}Y zϷ'oP$Kt,BġطMjg5Hʐvk7 oحi.jo9HIf$ŠDsMS]FuMۇK_;zi:nen3qHPۙ=ڂ#'ǧش~*og̨?=V9}eeEN/xp%v7}ѵ77g4⫥fKNk4CJJœuژ+ßOL[~ }r/ApcQ7.1XT4KN)K @W*ʂRS.s#2X3N=Q&6+n75:EL~Ts^RڝG2SIn;O"f(هQfO9H#҃jH &7 [Ž19 +waG+in* PR uVQ }繼LlR:+ωQTBJhnY3H\t'&9~Ԗ֋ӴǪV'pדB[t/WH0RF3 W,i aǘ 砥.WU}QZZfyUMMFvAIXӰ%$|C)=aُ>jw>F3-Е6e܉q7YqR@"a}'dGF~XWF%cjŽ8L U2g#P|[!y9'5f]Ol}{u]K jJ&/Iq~#gnBvGc!{, ,}5VYY9K#Fۻp%dk{;b̋#2yuVOM [X1lPuc]RI_;feޏL_ߖ6_qaEB*N8k$ԙ ^tGPd"15Q ^a:& b7 _Atf7u5{QnY’ RL&ܷjdQάKץeWP&(<# 7ŽΎ.mȹ1WВ 2*{KMAލ͙ ߡ9Hǂ)?I:Z~nb!6l#}dITR8$cT^ m/Z`rEڧ˪u Mzv6_ូ~'[~_zڽ۫34yBbМftaQ2]~Y$~t2h(D0<ثh)'N ljBAnLj;?:6FLrJOmh|Lvޏ܍G1ݦGNrrLYxΛ!n6G䂩WT^ȧFD0o 105&P-*ˉ;^/0;U3&{s{͋:Pe4@sMi%e9\9?<ʌAquU^ҿ. ~p;'ՎXGLb#IoCtX&ի+-e~6OȾ=CP|pZ(K-vIB;Dk; vp:]JӐ{ v!Mb] |`=C41ޣ9/y O59VQiTHKʚ,cOk^]O]`2 (-X.Ui:2'(kqQKPb@3p;_.f}5v_vb- "*w-QMnts5ŧʠ>Ӟ8X5fS⪯Vᡚve (Oݠ%nT E'۪ΟZa >w7PلtSA@D嶛Z/𥬪5Qr%7%VU.e]d6EڔHoa }JRWzID1i&RPu\_12bO*zW&" Qq56eL0 UDfsК(c}"ؿ+넷w iPVqR6>[y)XOci%cQai R:܈ֻXGDc\ endstream endobj 175 0 obj << /Length1 1637 /Length2 8917 /Length3 0 /Length 9994 /Filter /FlateDecode >> stream xڍP-Lp &`pwwl= !h@p@GsjW{WKU f13 Xjgfc$؀ dǤՄm1i0Ԏ_ G0JP; ؁@PG~$bPbC0LZ #xߏzSϛ?b`G)[mO440(-p{~VV-h![03 e2Wk,MKπr6S1 x<!P Vpl,l+7d)dCliE+ dgAA G _L!p bG4c3ڂ0IBswcr.v[;3m9ٳjAra],p v]M-Yf#؃=` b~􀁜߁0fS8l 6~G+@(?6?O 3ٸYU%5j?Aqq+9y<^ͣ Uǿr̡d}5;%6dG(4}?RdH8Od q (]'(A:?wW lqߨbvffdr!`3UOp6;*y'e֏أ6 `+"ǥ:Lfrta>^`{\S3A)ǞPGJvaXA `}\xa{`5b51sHdOs99j( ٿб?"M&\_g} X7J ~R?8C'yL Ǘ D^Ź*rO%0!7-]aHU|jqo>8<"xcvVBfRCp%L;"y;|HdꭓBh_ XO?h"̓_W&oH13yd,^M&[j .6sp?@nlTxySVDvk: _v9ًt!*v#ѳcqr>!SjRčϫ][iJ C`|>iKrKلOI 1z 8UlVo,qP;Lڛ?<-#L|\LVպ#9a㗡k|߹W4)Z#Bj .53d<~=jˑV"q9*Q2 Xnh ]p=Q|uLiqv[|%0Wip>~ƺPg./|$YܠZ|nW4w BHx%ma{Z<}߽͡KwY>dWg6B/ if44u֒j&p~]ƞ k e β TΫ+14cUC~jO%Mv @IӇa]E_MXG ~<RsU!}?aMHL] Dhp~MW:{;a4/CWC_+ `%7'v >'Uw!̓m>&;uބ e\ [H:ٴd ⓦQxK6ґV4NR[qFhM"& pJ]8 YTJjtxRV(l؆4ƹt<}֓=hVfABsޭ[uSwvZJ:.X ;)ɻeS'1!p:%ԭPf}1 #)gF`<) -S_%D\x_;ĒC}z )\% GJaOZ#_8.W"QI0#}kg'Ͻ-q3ʱwou@#""kh68O Y7f{G_E̙RD{,^}njoҔٗh]v~Ӣ@Yn$l/zkmD'u0>RYDgq,T8;^[1f)QbWZ/5J)˪Y(ru\No[b! }*e&3=ZT G*u1A!'3n'mZCǰ \LpY=+VLɵM@ ܳI0}o3Gie/`d{"y dïsoit'x"ZҲ +$(+ꛐ4 ;~_m/ko1O+cHk`L#*\28mءUź4b뷧oh@G/*ayl*-d.7gtwryi}Ȏm <|QCcךHE~NWOIMѲEkܽuXkӰ$ݎȳ @j9qBƺ(_dbH3P׽ ƮK-`fAqMK\ m¥?\8 V(vyо mIňV4dz[u)ϢޙW^ Ie>SZqL3aDFqVVĤu*RKlÖ- dM\(yShOiqV8NKȻ9K!'3$t}IAʞ9+vEnʍXELWeP>Gu)wka;DBKcƉD6eK)` x` q{wɧ8DU5Dj>9аcτNs#RLjh(*F3ðɯJ\Xک1 DŽe~`w lQ؝U xUb-<3^e0#sXʔ+.SE_u]cwz\1X-_7KʒeM뼻 ׃ ,jzw{6`Lk:vRUl|q?aqʜ K["RN/֬_-eNJjd_{c1< ywdJ<2O?Lh9}yW[?~W BC&͎Ś[B*/1'geCǫ,!c}((1#փTA'Y3Q =MCYqp `s:z]arHDW`ϛs)Xpޱ*`{щvJox pD,X3|=5ǀ(ݖh VT D(E|+VOabF#Q_jٜa*MOjta׉Uf:<nkXBoeF*MS&+F '+Su,J;VvбIkzIriВ)5EIc\7F0ausōjзx.dOJSEhtdžk))@g@_ӭV[5Aݗ:#R䚎 qK 9{"hiz64|nC#ݽO%@(KIb0| ZD4"4%׸~j#Ťkf!#vCW͜X媼,\!5j#_  3L `ylj{ rR\Ĝ>_A1oRug4Dɂy{795S^>K @[IگWĦy2NʀU qO/'9˪}tdQyD&[g]5a>Gu/n%v%k-:NDDJe&; _mMԎEm1T؝OQy*[;jɚxѤҌX,-11SsU, gʽ5SZk&Dj~~ 6iwꖴHpU EbgՏ/0NsKWCR#gB(RL=ݝ&.ulM(l !O(F"vA%n9y,kRa@b,LL\= y;-,))H*fݱ?=E! Utryޛ&_$Y\)v6БΔ拑t K3m |&٭s=oI\c"`=?3"2 }[Ȇujr9uTz jm7qZyפg׭>sb+3әHD>f[npˆrc5U,`k* ]*1/.t ';daZ*'ԉDbؼEj˧x2^`.XIW"GE~B*[4woBOtL7SxD]zP5QN=rmL\$ۢ "T'!Fws}q]I'&,fV1R \4"t5i2յSEiv;\ -ĩ)o::qsbFxڴ7Vx{򾥟ܡpa{jrdo_:jJ6$X:]%fXkv{mOL9T̎g,'2Ej.!Zfb{p#*t堮mI ȳ2z5^$D&I&wSVFo),2ȴ>r /'aY_+^ϩNobhH -uѣNq}gƖ1ZDUF[Pr`~J "fu0'^C=7nXC^GirK4IDCup).=0k~S%ѕE|i5e#BֵE1Bٹ*̈bݿ fDeEj9S_6h `,ҫZ省ww%* KR}ܗ;q+vO!rSxċVYS:>37gwOkİk[ʘtq+-Y؅ҺRK;KUP0B%Fqy* DyM!q|[ fռ%3[ &nZ` C:!5Ý*p5tI`[ {3'gb\4c#_jxtm'/(g;qD0Nq 5O DO`?ZRO X#[ǻ?be*dvE'sjf晝X>lC="t'Ǹkj+9,~SEWcKw.2T?R*}‘FJi6GhNl,6[;>N&qVl^ˀ҇4CJ){Uܸ9ʚ3ZMջ=,GgՀ X) m,ִef%ag}~X3I~<;Y 5L۔aζÛIMGsIup(T3Z_ [Ԩcrt6뱞n ti3o[lȄ=Ԁ_vZiϺH|)7aX #%+g]fD?}djaV OkR ()F c yDllbQWt+j_xL߉RLnxJ̈́ c(DqGOU1loT.%54u1.ߖ8~pdt5!b+~Qq#b;~-^0Wv]AFG%1{#L6W{OmlQ!Cy%<}1IK[#,;meb6 ~Y5GWQ[3T, K&n?9aqV}E`߁y`z7u̿"96mv|Lqt^KݱԇdN_a*q2 z͡`@ׇ|J1ßsz>K"ө=7=HC櫽=[FB:Xep5<'&p־6fN0)cu8ZCBjakuA}ɫ(ٕC%C,- wj~|bWN槽5'R'@> stream xڍtT.)H 1t )  14HHHt#4("H8޵]7~v{y> =B )8@c8 MapR({ h ActPHŤR @W C t($̓r;:1%%~]ap( Ё`~(%FI @\=Pr|8 `yxB\a& p#` Czb20p6@ 'n`U BQnp#`=5m/A .'\Oпˆa>TP/  ?"1( =7Hp@yZ$@#^W/"tl eiP/L;Ii_o`0( *\~Zÿ6&qj.?VhMSYN1ɞ*WY;w*><}Z'rϬՑ.y{25#Y VY]>,}ۯo;9zfR}8(K5#u;_הfkS3J[Di9sW\}I}ƪ%yFS}{h`M\w>{$\UzQEt!"{ٝ{JܖܩkY}fxQC ^!يܲm Fޮ}= ]vZ/kᬼܘwhjCmL zR,nus$<*sqf}B);T21)i]jv/Er t4~bAC Eh,4xk)I\`8C˖`VTZ<$7:ts K^pۙz^?Oa@DEρs>xz!h*Qx.lwSsL$gm J"jn׵rC<)ӟ5=>9͜\ji#^7!OLSzSXIt\1aݓ]z6Ȣa%n#8kbH Y{۳Ò]h;TxO~^nK mͰν5ɻɛtN#<8ߒR<;pUZfQGpnxgM)e=0z9#o }3lҧY 5&N`FMRLN }kIo{ qe2fXRP݋XKA 猋X?H[8O۲-GSj6Xf"$U]+?iα!"IWD]PGm_OUPg[Wwz|vc?Qzx7I/=i2>-oR?=h?y\@"{W䷧_# >N=Ն5nw}Ƚ" ϻm!}kŕBckMuC 1ΏI.ҒRQ;i Fnr"\e*wj*XM|mݬ抮#; |ti#Z` TOf 8P_!q\EGLF*1pǧFNezS)EˑN<"SY;*b;CTw=5ѽ1CCG 852Չi΄i\Y= ryV9ĄձqE;_*$D /ik&|Z͞iY딿|QM~Nɀ2_ ;E3 m񸤚X/AqR種`Z75(-ĒĘ]G_EH^de Y; kt*J_z27SF*\dZ5xeP&^s%aU-3;k^QRO8~&Գrz8vM-1J,:T=ZZӸy, SgVO$"ʰ |Zâ2hzii}0}١{#"13M(p?[Ɲzh7Rw`@+y fZJӽ:y[.UzfbB(К8h݆E? W,ZM&mkNDpha!)m.kWi˜ew{]ug* Zez&bɤP)S:/~9 w_}]jpᑷ6mI_)JPʅ[" f|:$u1@{ ȹl p#SÚ;ݽnQ*6O뮫PR1XS<h ùlamZt8m[ulTqǼnhד2w2G8.$ӆdRRB4e#rf]3gN6B4r& .;zFg/KpoU`WxʽK}sR 3.3ܭփQ8n]PJ.4㜹TGߛ/X#:o[ 1 ׿ݷ+v<w%p׿;%pq]J1!M9nzbPu]5Tq`g}lȆWGUUZk7Pj7qKIyrƷˋF4$ޤ3.,ʋZY$3'dnb?q{[AC,I?C+M:{0VRUIY23yxϩ=93Ӛ/&>(߾wYE۶р:qO9s IO GL]1hn'lkŸ fn7S V\ijbb،xVt40̂pwxdu-ZЏ>і)may]7C \#+7\yݛΊ>^U 6P{{ҒB؟>|lN*KqeW\+U?rZ_AZ#Xk5А Mw LC"ds'_Tq\BATo5 SxytgՌ#?x4*w_f̸i]iمݳESc5F)&t1ݡ`Q5WvM`BnB <ߒqIlLlzѩ 0=}1SSԠrc-pqp:2wj-Q.C3'UB36<48iQ.ďo{}ixlg5jsxeELZ )وޅ.nLV%{>wkf1w^AKxRͩhAXm &mrѤ}m t%Ux NWWUSm F\oLp%[?HZI 8ahqw|u*; kȍg%&!IʕhUZ#lUuE}2alY \R*8f`PC~IK~&P ,6,J3Zk_Lo.-}4n@38tG/q}Nb@G=~P'tn9ԟ;W͕{~]\z[.Z9ug3" 8=v\bP1sdø.l㙥lF勯L~LpaX[8>9+n"txƿN4*S^{mx*ꭵz7r޲qP+,.::B(nz{½=|mw#) cZ( ^Ȯ\Vkd5{LԧJ/72.D$j5oiY*2^ Zs {t;4ڬgEͦ[} ӗݸ&mf> F5qһ&71χ^vjgKj+u-CgFؔϢ[_dmWA2DsMAR4X*s d! oTc x yا'//͒wkD'faG}t㭀Nљ|Bg^]a=8?vՎy-Y(¦P`7n2-qfi3Y?J;s]wOQn4?p].>5pˢoX7ɉ/՟%H >g$ ֬%G+{u<n6IEC~+(+2]Β%,;7lxy\TLNꐑPp3& 6/Xmۅf=rcӨ˵nS(>m T456L[cn+E!""W.RK`w@6gKXR[w#: cgscbXĸtM9' @heFp\i $* ]ݷ[3j7F0M/VZ3 ՋbJErdž%|+#m $e)qNz^VJ$ =Eq)R'*qМ۱sˤG( H g҉Ee=^?ݰ p,;*.|xec*zƳv|C߭Ҏ_=&>pR",z-^ X(jmAt*[h^/f Ǩͼ?}4s%)+n֜ŵTk'W! ?.4OSɠrpy=< 4rk:XUJ ~|"cXl<<B7Wr2BNVg*OO-+7TZUޗါ ٙWTQ"#Ǿr}V<Vu]Ԩ Lm^AD/;Du{Y>GͶ}z/ Tfһ1; > *|+Rz"X}ln._^;@.F:+]og}}.ړIDf~H;d'NU q0}%ߓy&ǀy0D%9coq2Q/}RYm|Zdd7B'Cnhߓ47D8>fV&ʭ7WR#Rd/bnv/i^4N %$m NЭM''vw1yzZFs{E]9xqXCm#_eԒp)xhҼ ]>i<`/T oHVwA} CfE(UWJ7eLzJZ[3jB6sGHo }ߜBdʍ8i?"}.(N[ f,42|Gf]>L v/#Pt_tZY:Uֽ3~ZoLpajDRfKvYwD9VApgIOX5[]ۖ=G=h;5n1h U9|r?t endstream endobj 179 0 obj << /Length1 2769 /Length2 24109 /Length3 0 /Length 25659 /Filter /FlateDecode >> stream xڌPX-;`Xq`$Hp;]w^gfWWTAmg> 9PPRgcr0#QQiں1#Qi]\mAH6I37p# n`qYY'х iak Pb;HTN.6nc#ւW:@bka('Z4-ln)A+hlb-Lu].@Kf;cFhغmpr4s{[ 4*N@03ۿ]Wd Tݼf ߁f|33[{3sp_bj3pjbjkEe,ptp\~uZݛɾ9z|V KMX;hl݁rMH/6kt,lX~vdmw7 yn.@?EHllK[ 79RlZw`'#,A/͗EURQWU;z|8YL\"oU3h+r|MtRv}!+JS*7oBifE^%GwUZں;ox@^Rome gW pK/9=R dh{عf..fH! @D `a9SV.H'`mqX_EX$_E_ `~Al`}A `A`. /E( 0/sQ}A`.j/Eh 0\_ s}A`.z">03#,R{+ 0ss37@ۋ_߻\_>-l],3T G?9?bX]g%Y!V͋~8 xHV/` m_0oG7oŠ%w^rOv n7@e*xd \T 2d8Ŝ f~r~otWR쿍n@KsI|xkf=?{/'lS1@?.jmN766p/ǂXl\|mn$ky>p\.rJ>@ϣn__}?Q@i~Bw-7UbLۣBT:tL.wht.Wb]KR 7ū5=Īo7#͍?%F$b{tz.O΋u#U[86SɭP2ie*eЗԾ{IxEK}s^YЙ*m#@ml[ىw4}X[&.*8&Xno{mV-WڝVv&jSz6 ߜ>7 mv|!d1_ZO# [6աFg\H}5  >{Ͷʪ 9Lt̕wɿTmm c(9[ټi> izmNTǜh5کӵr\fboRŸ ~N9يp`o[Ik_n mKM6z*Ddް)m:mz80 #N-PU>9 ~FF7}['AZ쇐,[\ʠJUUi""Z*ғkAu[9H=Ap;-ٖʆ i *W3?D tؽHx-'*6 niD V;"cq<)o\_Yg7r,^T<|得#p, _ˆ0dP<}ܱ F-z8.f:̔)ۢ~l{Q6㻥 @KfVv- W:wי+/wX2bO3M=ɉ_gΰoRb'Wd,=*[ΰށLK4 #GHx>٣Ges e.稄l53Yc({Ki;4ڸ-AT %B4Û"e╒LCsϏH8DLR.y ̜x86] ̒-cIʗuL܂f~V VE@B|Q]xԲ+Q5U/=BoCqNO C\lqbE2F]ĘZqs]U5!1/e#/¬Vb7w ].F *Wi0Y¬f[:Crj%d(&J.v }c~ۦɞ޺3c|T^L ]xj&| T2a,_+ƉRN.g/d,cD쮾s*4}JPco 2i/N~ +y)U5ْirt*ZQЩ=_۴o{w̃=Iu V>E!&_}*gbjAڿh}߭ iGK0s  g[QO[YhTJϲxDҤ 2۽p`ջbU3V7^8~:eHf9q_<ܬOݰ%Yp)8 7?^Ժ@Y*QcDs6qm'U3Ʀp]Ag[K1ӮJ(BG]ܘX]̾${V/+җJ՝EpxOj YCzsWL$uJft)dWv/oA f#:ᔺ$:-u!.Zcվ2%;*Rr \"m@NسoWs {]0IVq[[p%A@bxɿ#_m'UZ"E*3$0ڄ ?&Mi&@`3!hn=^Q-^53slDAVĘCQ*[[ 2G|лD{ڳZJ&62#0܏{qn,\6|Mq=J˿gW`{^>-”vd՞ETe!}a5b m@-LѦDi;˓@IUOxzL&xO7"T+0nyu5Mz0rFwH\MW`$.ᅱʜo>W,P'UR.VcƷ}LEr7, D5da[a ^ `"M r12oMIL # |"5{u< vC#k<|ɫE  wG߫:D3Sʾ2aXwԁD{ Qbtv khgA\aD#gVM!rRk7!N2Dhl9h@ iFqڦJ9yE;s7W[e;›C4-r6l[~6ОE JObi'18\2&g=>!iTZGs$c>kţ578+tDZnp&9]nʊ.Yy|Ӡ|vAI3%<J⻢^H#[9F+R|f-9"+U= [ L=ĒWQ $ˀx17 Fl&&|S_ܟ4vah*RnyZשl@yE:y&=ءs)~)밨!頌٬X?z#7>`Ai~# gf޷>ncL{SpptӉa̼.םf$(9>;f0톪vE·{^§l޻~JfѣUڋ\D$aF7:1)SC( LQu&/4y|o36|H36^lnʰҶ.ӑ1jb֧o)Xw %ecPw-PWϜ"F]1E#iƝcΊ@ǯZGoQ x/RdA1PMEbkPWK:YX79ZǂI%"*1ļ؞< C·fL$mJn50>R,W(~~r+6@R[FqaL)͘[7Md﫲[}2wn(@Դ=9Qa;:A-ϳoׁkGڒ~t_p CJ΋KP 'lQ̮G3}xm<MY o_ i*>8L1`.ETchM>Ex(G8E{%˨En$(>˱ `7gLZQ˶8ܰZYS\vji& ޮ32n2k`]͚ \P+UdM"\&8I(rΘkd=(uX`O)G˄!Rݜӓ:i4[4ΨhLݸdD_i͠s!]~6.䣗cǝ5$A8Z;tߒNT]-*A Γ+;EAcx~WGTF8$hMr?P;%wsW`oXV%-_8NgN5{bg j, jpIʉq-n_}wkcKuy ǩx"bT D<#Q{%&&)!M7AN]~"E +j#%q .ȨL=͟-[:p_)pe7{t8d.z>ax.,$MY>#1 } ۟~ OW|M?D0S1R!V"C҃۳tW361,u>7&ӉWIr3UzSJ)v(u@F%&;Zhu͟ÇUy N!llI\G|A>5.TM6p>jZ4 _8?p0[%۝'foWbI^mix&vGAՠ+zfTV|--8,onmz%!%e9@HÁ[h6ԨuYY~OOVC>Rp2EPT|X'Q2#er.$GII$kw{z\;=<~jr.0BsSԮ!^-RWN#>J~s1VE߮f|0CN-'mp}hdl"|wB.=#zg 0ܔz}uU<,.t%|hG5QG*SxfJ :W)DEP>RWnODO;';0ܮOKT& w?É(E?:-@rէKj ߡO]"9H0Bh}C= Rl62?DīIK 9\3E +:&lɍ2[,\qj-6#y*H V>^m}W& / 9jF'GNmAǬi֭د.~[, L^*A(7gZ<5ʱ>o4Z}t8{ qNWmu=C+_ҙؖ Cܕ >7㼹](Gaee9FTJe44Z4qCEpAW_صtiaz?'{?ujnDNecW^!8pLNﻸ8eºwhio+# u/y&'UkL\v7VtKɄJf3+5}ûrx)ҏ `/}lx7+yyzL%UџWF? BS4zpUS<|g[b&2Mzl{0WHmc7=YLTa -J" zq/'ף(JȦ,>vP=dMobB),8BU)oՁHv2~øW!I&JMn!8Y [um) qO `W/>5zT٦؉k|x@b"ˏ`V;hQBƟ/#&V?2oPӰQ-VeZ=ݭE=hʦZ2jX㻐o[8&۞s4Ғ(c/&7:᪱S ؍~XЫCf0dfD㳙V=姞[DA,aw4aԆ{2n0*OUNU6,{OF<2[w}$'}͸SzkSLN0?EH!TZC}l' t JJ+m 0WN&ii@B`QVrEx^ir^)IޤZtUGA!cL}lk w2s\h&b) gS2G_swJv1iĽKt{N&-U3tNiH`YK38^N5&!T#" uc;" UDf.N@7k.BL8 rs^ >h,?wz χ3Fy’68cw !Y=oN mL%Э8/J\[916n󙾷>iKj,nF֚oT8*ڞ4D!<(,?"WFcEkS}v`qVaÆ~ᇼw:Q؝$k'uASH+zeOG]=ͬ,ڍ R48'=Z)-PTN" yGmɖfʺꮋ}~2GCJ0 4ja ߕHDN7GL?\i>o<6iM7#u3̨RC?`j!rg. ߜYk@a&>Nce #&'MvP7Y^SGS lB (K|" , `H+<8zMxcZnz_5ɼގw"K- A2?NdaeueZ R$?2B6hX0TBssa$7SsƉb}9Yѿd5uOK϶ѷ"-.PV ׸ƞwJ 0Awp"G"AOOof?ejoo1yJz.]2Hd݃ 1RU+luKT:M)9Xޛ. 6R'^ߏJ sk Z41\,g+opC/= ߁v1l]  O3. MCm²㦘 @|emSܤ˯IXNy:%Lm*:".sKu?E#c^W{KkO $;plm`ߨBhX4YwetGM""HgPji߬la% ÊFF&󒓱/GH=yj/M uZ,7:') bpI-WK#.*P;-rك5մ˚SM lם(z_[ =ޟZAABc5y"VxCT[blʿ)#o]/xtqD@@IvRږ#t=Ga;;M/J0F"yePj2I^kkr̫ц0Um̈ìWJ&ha -}~uTv6ϖ2Ls=bիKQ):TY#Exnb'MJX'#r=_Wؗ_]K,_cqVϞfakD9iVhy}iPjblKFl٢RB&ԙup|ě+ʌv,t#$]bM!%9U'63 Xdz H$'Zq~w|f=:)].o.~ٓSA\N;sbs?!@JYt9a@ +xgqgf$&k*T#X'kƸ_LeI=}B a@ q:!-삃EE&7eb#!yG]qCe6Gmm1dݷӄǭ !fB584A]FCFqpP%'_\Q%]p˖.c݌H@rUu a7䔸|LɰP4.-'<}W$㻒)Hei  B8:}%pB+Q7wߙQI{%@925 ʰ7Ccw^C?rt+[\&}08)faPW͞]L0ulRㄚH6 9mU3Z, l^W]D‡,S8- WMO,Zlobﱥf~r.)|XzM> e\zN֟z@BmǪQq si!]jq k4! C+ ϋiIiMj}̢_-wudskp:J,t;dFA $Q iyY56ް$d>ǯZ_8NXb `eGV&/o3gm\z*åFH}BK6z Sް'+b >/X1ri`./h#,em`fU2D@!Cٷ>ߡu :=:VgF?_217*rm'̑nWiٴ5VJyaɴSfK!wpO_-df}eEM Vyc8OuÍ5bGB[`gYT|_N}ڼkF]1^jSub{zip !\a\!4ܟa}>*@6"/զ<4C=FĮM+7VyR~GY\{8^)# InoR}b Dϯ_i6Tr6x\3*E_$v5 G ?/0 S8 pS=~C|6Ar҃yٶqvNhG4aϰ3Y0 I$yo2&ʁ VWslY3*8"pM2JjE7B&&rˑ ic}kD.$iɞZR S'.YnEg>A`Q8LZ~So[H(Jk1U INLuP%^0x[A{S"E66OT\@Gt) nNv򪫛wz߫SJ>gmMG8KfOׯNw*Qs?)*`򔅒Ƕt%6 &2@*imfw50z+ "VlcF<Fe#f2ʷT>ieʕܘAd]ln7\MZ߭%'Otoq~(ҀОdg VS܂iZ?7BKsYg݃0GۦGin*wLV꧖)# )[@J^ վ!!fKtxܰa` : aYոR>ې`3{_ ?_eܺџ|--apd~ϭE }z?C1M 'zÐ^'η!ov h&e8#&No*t&N+8:xSG!/+lYxEU? K^TPJa| r*Sځ\ЭLhrt3d;(Ҿzxܿoᢩ`vMbp eo"Յ شB,7G/C{ܧ[ ~Jƃ&2#~Җx-|بG/l#I񧷍\ӔVx`I?d?vweU/ uq>FB#+ƈF&t&i3`rQ4~=#>aD}7Լ" [&Wa Q.IkuJ2bs%k]&lOQZi镬B+mFTW/(!M?\<ՍfU+[7︮-SMB ZyKQ=p4)<8`J Fv{}t'yjz;+@'c4xPe0Oղ(m×Aُs7:ciA}f+-+ۍED=4k"N`F!;T6 )/fV[s- Mc}_P{`#¸IfdVu҃]s2=%;7Oҗrr;.2q~iYX%ˆc:fWیTH\]&&SHdB$aq Փu1ZG ;Ez1ֵ#܎|F{R%jsJw% l>*.. ϔHssmZ߁dM{>- ~!>?N&/:r6 ;XDs-)!I&yzotr]pWF{1Ţ( M+.33YOtmV%mj=ą~dKKO&4c3Mf++Y7|GR33C`8 -ҕ/o0<[*`)A"+]{zЩ|焋R҂I%<}HLLYHAPz^y.l\ԎV Aֲc]N}" p{44ԯa1'>?[V!v#)(eɹCEKZ{G|\?ӌ:BJ# =^=dUW[52O}Q~R1n+6q\ 7W.׭ˎkB:*"О_dk'.B& |BQ_q"h7 {̰Ve緵@4Rb &("3,طk mX-Z/ ޥ8X5@:$j8rMWᵛTHqhef@uKzggTt'ﻊsS%u+əF9J ^ʬGn3jQ*"$r5aLzħַT75q'TI?ߠMLQU"|90-XI$ߣj5BV]+o|=$ n<6kV^vxko{0P ,_״ZrqIȂ].Rtp\*b 5eFk}hg]dzYn;s_03>%.c.aIq-"3Π 1u$=!zOhn=4r)UnB]tK|2ؾ 2[55Q m/!H|N(4k'fVnE ~'V2kX~ ŝRwbl.MZdi"kkٛ7PKQxJ>/Xf"rxʦl۪Z=ޭV uNߡsBԸ:Vnq\!+6JxN&Y4PD5!^q& ;lx ) " 6b%~,-ԅYpG9_᫖[% 5lRK={ķ¤s S"J&y G}M/(%'%;!f;4OZ.ȵdTf^9g>>,7Ǜ*K}mhՋ{.鹋2GԚg{!J A"NGeU;ws$(1u-/ՁԴMb%5ČGF|W lXiC`Aڢ xM􁋒jqUpC 9vGȖ15Ϯ ;utҹ$aS=%KWx%]c=+ !8qflrD{5R~р'-lCfNIZK@.΅w/Œ/fpG-S]ZF)qo2w/.Xx6N! <&ZV䌦r<hN0 xQC[͗*ԸpHm> '^Sk|wڡ7~<]HQ% 1JN^2ց/-\b0}ix4}S$~lc*0O+ro*iF|ABn=7CvJD^1W5}C]w Cte`.GZiHp+wdq*qA|+b('n^ZƮѣV߿yz{%> h5"E<sx /(2ĄLoˉ}bMTqrpaR<1 .lt]ckS,ԥT|y_XW5إd/k^Q5::w!J=U6ݬ A?QM,% ߟy$f'EI)řsXcRA,AȽ1FN|vcvX2X'11c]`aծ \nBy571Qlx8Tej#XIAW->'>1mtNHl)?OWMɔ}h0]6]1 R%!r/i 'a\']-W^E.)5V>jژP)PTc}p55}%;kK^j˲T3ji :V#"\KށCwl"ƌl#xcjahUtbۜkMV~+SWGOC ߆S@4V Qbj'jxUҦѰTͪg-2 j8˶\!T -;*daKqdBkDY~0j^#R0n:wV_дW"Y|]t,yg[P{>}ݗK["PFt@W0 4q1 ">@WE8K񛜣|G.&y4DRDVk\\#W E!,bXyI,e$wQkd?WWyg%kT~F; CeX\ ) La)2S{2,D;oҿ\VH3A&|WJ4sk!f~ X5C1Xjxɬ'4@ʰ-0uGY kՄ$C,r`mV? _, et1C/ R9=N.I&DhPgbݒe?Je%s%q> FEVFVgy+Kɻ# xO/{|C ]z+T%FHMSLcˆA\s}|=1 9<=g -jfVb1wZUlX c= IJ`|xYdA3WI`qyڊE]Y>XV2tx/b1 =/,OCewn_6Nwq9y#qrPq;{\oWD'Vff&5"Ԇs:J 4C~M/XڭVs0$)u<1}pV0ns}:t1jK|*^vޏ@w#߱yP!jVj(SE^6^ a+A=QFPqحu%5z=?"tN_(G!}<$ ~m 6nTs{W3s+I ݋Op^?TJJpiCWs!95o|C1o6\(8jn_c @%jϺٷx}Ђ9GUsǽLLJz[ ICEUGi\_v(XMb(hֻrK &&+Z bymJ*[W MNI9_<%\^z SJ v2ju%] oL!l̼3;>->)zSpkL6؜uH_>FsUا ʘ-"A:x} @KÒgxKP{k9<GdIS {r6u3|!gJTq0eax()6j ֍NASS#ȃ%0?=r׎^~ی?!Ԓfr <uBa˽rA"'2yyiљH-/sp{iU f= uZyHsBY.)mUBc qIɛtwc;;Cn{ ]_㪀@S?tt뇪ߘVe*+ $gֱCD>q{}A5Ov]wq$ DIV/"A0+!4sô`vowGk`r`Hepg_ތJ9%GLGZzZ1 ~]"[neIl@êOrDy>Y夰Ke5-z9/ &\G,Xqb^i'E?6,kl~O1!{'YP: [*;ǁ+sm [x`cM#9]8'[Ĉ3KFÏ N åc.$MR0oq9ˮ/.6¯JcNS'HuL/.@Y@FԀ|$+LajeO͒$`h}.x6ϡ%*8䉓I8AW&-ĀV0^l𞗔 ĤH6ktvhcF @n^J}VgUsQ@]5yV 'D1QLdG>JoZ3zg?o+L0N꧑楣wɥˡw-?o3I9uBO\\x́猬<3& ?BYTgy_qМer/(j<  v_~g> ͰFFat{8ѳu^j ;/yi67gCX+j-=]NAhBm 0+(+"&s} mAc >/+رFm=yqBIt|Yػi?ˏRޫ*Z@1%T~^YtěR!OzxgX8X|lܽ935՟? 7,Ja3!B-I!'eVUBȉ0JVKűSwc(}2\ӱ16j ufx` Nĕ9[GΦL/ә"C!IC#umfg|v_~7bAT>+Ѫ Y{x"O]9Mo o\T"K> >z4;јրÓmâW 'Ui@̹3oX҈؀M 8#Wfn;ʣ=cWD0=6,PWJ"U6aX&'+BHLjH⒏VoNRW+*I54}0R6oRNYTi ?>/l`WAx>(۝  <>TuQZEJˆBjxfPYDF c0ot>m~@~7dDgR~ UqM4E@gna&%0E32Y+LY,ezϿg5\)ؿ9Y/ Ynjk$Vp$dJ[+ ) `_>Nh-_SĘ6 7E%¸Aԧ 9A?*{V}b F# AW9$a,}ɜ܅KȎho ~kPq?L18hzXyҥT xD@_U`{/+a:dfT<Abp=z>~xϷb*t5Nq϶.Sx/M^ŖބIzL~ 4DzNw7󿩥\{ m\ >a\ymh_/ .F;ahT(#EaF9ْt&eh \-`%"oī~t βIMP>GHV@ZkqAH+T Ր5ozVJ! F <ݞfVE`bwyseMёAfW4,HmQ\S[uXf 2-˚'*U9HS3d:4GQgg\~5ND-Y@:9ptkBȞ0# kD.'*QZ`C`^Te!u1[1,2UEP|6@Ǭ}Ȯq34ųiQI !vcoId<4質1lMmXg[ Nh;d-)-Xy[Zl@ck|3bdqUf=_(cS?yl1 YKL5NKF^8 |*Sn׌+tB"L|`45jҩRkASqaՑ8 z0k%ѵāyŒ =+2 9 ʌr IJ"5Rὗ՝+IjM2/bKfI@2j"5;R,Tp{^iF7G(2w-sF{y° խ)zܢ:i0_xM0As.CZй?M8nࠜ"i=KAb>9wQ׫^1[>EUUp$D 06cee5'870_K ^u:(Ml$HHD v.U ~K. t; 32ԁNwe5qDi;S/[tcl&̃ qvN۠2?Pϕ6p;0 Ŋ@K7Lo&,Y6U߽Zu#'$祂;}8ib]h:@0 FR#QǻX({ރ%yИ9)6DC3]@tdГsB= -rY?UpM1xChsyGwH莴ZL%HΩ|1y2N1q: c]⧲MsKC'okO+jԳSGEsӺ*>#5Fkm*a)UInMZlN)iܓgM1-!0ZI?|X6I;eh1#ln*eNN+H߈~MY ch̞<~Y\ [Wϕ(4!L<[:[o?eHh fr` h2?%cKpXfG${Z(R H63]zѫHp3ע %d :scEUC\rf 8f󏤭\bt|\vc*FB+] `*//uou?G~C9~Їq2%&ve }dԍѾ!©4Ugƿ.d8cqo}[UƒT)qlZ#!Ph{PF-&Blw6at 8s{L).ȋbB&ߕյ6t$_"Ae'{8g޼t(Fq`i]*e:/ سg& C/;ڳYM~J84JO9|$wZ@E*"/",(HqCeiykN"ӌRchYR:fr☫9iH$@k?!EzQzťXwvppQK-Hz6dK)vm,ux~=nSH>̾ N8Q*j:2Fz癡OGo&D|KX@3 7~D6LF1grD׏2'B`j!Bs:$Tq 0ycBDMNzΚaJ+QE#h'(TI7\'Hd]{PG7-ނ8ɖXӨ20%x@Čӧo1HGI=(`T8O$ $b󥧯0갳@mU0|R3Ci ?;% R!QzNC2_ Z%$a͞A598v UsjfV>"$b<Bpa u]MT&EwiRyĚa'pv!#P=7eC]:%(e\( 7Hk`Ҷpuq{:5*Z\]\>̖1K5 ]5TENX5d= 4YS;qQQ:M}XU[/ IltQ76,{::#3Aqppr:O)Q%) xrtvEР_ eb-&xb nxΆd0I¸)U[w^dGDvC-P6YX(2ߟ)pŪt)UQ"mfk3\pEio=8wGil!/*-N™1U/|&ģL:YX[hAP@  tP1tuGc+_o~*GeצדmO3~KL&W4)\̟V[!/34IЪ^tR1b<®#,3BENr:ɞ+byAx$N0PZL{Ξ$AKQc֥Ri3go$訙s3٠V'YuRʣY*^f !#0}J -W endstream endobj 181 0 obj << /Length1 1570 /Length2 7928 /Length3 0 /Length 8972 /Filter /FlateDecode >> stream xڍTl7NIIHn FlPZBRAR$i%$E:<|9}uq痵EZÔ?D,B` rAap$B0( )@Qh3M$ !1 0(.Tzm@5$GP,9lqq1@Y;jBQ0tF3Pi| *y{{ @]<R|@o8{ljA]`p `}g vD܁@}U + X!+jctq"|{V@P/Ch߅CJ@(q<<ο: "VC<SlSV'lGjdyT@C0{ (@c[ wE-v0=a@pfGavdͻ}hA_Ohn"ξ\:V!}b@~A0U_U(XS_bpK f, "`]+[o-/G u;G&55YWM-((zdQ67`pL!`[e~4<|)6H_%(" C}+FK"@z ma>  ( ^ u"@/跄߈dGSo@ =Ā ֿaq 2rE/g?!·~nFzю(wNFskZ6茨lF? f&68{RћuHrc(ƽ/mflJ_ٗE#Y+5xIMzMïd d8alUqGGyݥS]:7>VT33Xq\Wt(~f|}1D^@3E mtGw6Rh < a+M.='ޫžftJЏSM}vWKdm|lkk1ӚˢQjlw$%8YcfXfYS+YtH4k@.yr1\Yw%`J)K$>5ڧ8|yuZZ<N%cX_ܶ%YJ͚>.0LJJalcb.$xԙbM}r'0^0gP:M޷Un{dKnçw{0ӖJ]RFan3JO/uL'&YeԶ+r#w:iŴϵ5N6~Zm!T ?N7շ&*X,l\Z:{p fk"F;^r#p1`sn wI5*ЍsUj~Mፇ>NC$>22)MD,J:V. J% '+C̎nfpRƭ#r~ yv u__rwBdl|[R*MHn%qqX75r70^#]#=- &8A0|T!.eOL~Ӛ.U,U ^HkeR/zUYF5ٯz'|f;J[DFq’xYl&QMwL{%sa :~|kǗElI)TS;_=+c¯)Q}IF#Tj2 8  QU`ؙDȳz"B+sC!B璊[XGZoԃxC1i^o첥㈗2?~KB(ŢœQi7sG<:7'EC ugl!'Y *ujtl&Yݩn`fAp<m̩#<' [_M fOm1O]vJ݄V2͓6 _ /reb ~>"Qj+"e] ܵzws8KiM@ni5 K3HbbO,fϰU5r*E.r{YhF1ɋ^ nwG!]t9^q^;5`Oz μxsnBFr%r]Qҙ`: F]zKg]DWXi,u)DD'əٜt$Z.f!)Z,Ӹ2[\Li >8MI3LU8!<8K EWn!ZesgfU`kzP<qotZXx,<#+n͞[[2SĈvl`,8rD~%`X@J0ioK^ FUǚw1 Cu?^1T6(j ky϶3CVrN 8XgN{|WqYcYŭ䮛CNnErekxH&Uc9oJ8J]r Fb3UO5i$٫/y`%ַ7'HWY>X/`dVi },JF8`x8eWa QȢAV 0kSAzT }Y{)JZ'|ߛ6LpP=U\ SvvAncUm嘈>f^cJ9p,+'lLDBp`feVgP16#jcϗ5+ #orOًIǾ))#ͤڧ sފ/~^\ږgkk-ke*bn7|/fhާ"#'R&s7A:vIPd6MU <1" 5Nq[)*zVȚ|zHc o~(DXd_9nKrz;|0YA63z䕀v{>7 90f z.mm= 0ujƦmMҰ5 < 7A.%\&d1S0\Mӯ0g*]DId HY"Z iJWϥP)0dKXF?գS49mJ1 0-DĸQJQ󿊝f H#xh{u6/&P+#B:0~8U[kv7n=cR6³<?QجI5l0•``,9sf|эOD?f:d2E 씅3Zvߦܧ[Hhvzt@ɺd2:cҗ.3v01pxz̦>˦loڐ:1k t F,kwY,%a _^W0\)#Ǭ!J/lJ♨1ʛR=(Mv<|2|M7D+*6b|DXf>eO32 eѢG 6H1hΠ`u:Zry:GPl,3 z Xs1qgcΞ2f:>$ۍSKXzjǦ+t0ȃM钽'/;ZMvh&, =?4ZffX~/ Ë\ZOޘGu A {%)@HkS"Yr2LxRv:o1OB/;y7SF$FRYU#TwYc9Ru)Bp-rJ_Bav˕ĀUS&Þ;l ĺI+ST[֐',evu%'G<1rgBށ?T':-Ȏe/}i'Zr/_ԏp;YmIL0 :50bIJKdZ&[MVoѫs.a<Rhv}O#VS&̺2maXG5:)Pn^sI&K޶v 2Fg`*= 9F(ؓݏ#mjav۫-[/" d%ZRx@lX߫b1;ߝM ;TTܣ}J6 oAgl[!św ®8] wr^K^叠t. ٟ 3E4]nt$AU}fډ=ZBdr5÷ sz9ɏK\}5bs b#pI`ON,bmе{np`'a!g *.y)o$ 3;ʘl}\tq~wʱg*r=zO)jIJ3jȻ&{ PQlPRH^ v}"=TON]i2MʎOnXW7'K2|NEm߸?*N{ǔ~锭P"vjc_I}mNKZ/aU\IbҦ"S@qʚ}$a̶AOPVƜ_z1_V(5cn#&)& `Λ;M8l W;盜(@>u+phbLBeWh7ЋI V0o.K޺3zؖwvOwm7,# j#^d3uT%'`.O6-X}[V^uZ=Nfm3R<30r;%jS_Elz'kr+nSLs2ld'n 6 U^vO IK./++cMz9i4]Ǔm>yGiQQRř[G_LM1[(?lm>ƅO@r]+B,M%Nǭo2j_uܩy#s$k)TdzBB>~{\ Wıc)3d|xY(Qcq3J(_iJj^B&V FS%'O반crpwco#4?IcNS9IBVnݰuۚJ05'8 eگ輩i^K^Sm-LBD&SWM{+U?l#?~qZ7R |lԁh8=v$f?{~L4{eGWx#K$~5"^/?Z/.hgL0SӔT} /~ʩ ȜJD׬o,٥B۳G|S%::ݦĒ~c-  ?OS}2䙟E Ġ5[g۳'c[l>v/_'ȬŠ~G]/ɲ0}~sRH,/AjmXfhW[]paeR'ģS ss֥#񤐬ཽ@͡Oɯ}=لV}%yi=z7-"х R,gIguu:G1Z4Uϓ5KW>,f$ޒ||d1L #q#QU}֗ vǘk^ϝ 5mLw_v5ǿe?a['Z=1- yug*[ݪ~eQ5A\}_$Ԛ!?XRg9{k}0gimk)0'2;^hj&>&?o4cWs:'<4dlJd~z.st[.Tpș%AnmD-8J.6So-I7y}ϧ- @m4T< ѻ !U_V`}-vG@QliJ+͍-Oܳ8PLQþȌL`;奄b+ ovS`ڙX.Tѫj!V ٘g?85#T{\:d R=Q6LQ:$t]>HkOßY9-!'vNPbi>,cw)*F*oJ.4 }C1]˄t,_GS1Ȟ]Co qo v ${Aq=\ܝ6&1-yriQTRhT)CI@P+d6x=EU֪ [~]V2dJ,kYuxDa4s9z!NB`J~4k endstream endobj 183 0 obj << /Length1 2039 /Length2 14196 /Length3 0 /Length 15430 /Filter /FlateDecode >> stream xڍP۲ n5;NNpww  c}ɾ+s=?2be:Ac[C=#7@XVB GFbdG Gtp4^h!1p0H9[XLL܌fFF1udR6@G82a[;wsS3,sPQ8hvZ̍ lNf@돌FVe[#s AɎՕڑjdP:\ƀX. bfXXm?meIc hi W s l lmL&V@ -/C+Gs+:G#s;'GzGs*d+GEmm6Np1w}tݝkulbnclW v 6@IX|LN6FFF.&t32c+o^vv^&p.@3ߊFNC ܟb?ڌ`￧elkceURlt,:f6F##(_I[?d??]sY *%g1@adc4a< #le/?yuv}Yۏ UhllN; hcj&;̝- P@t[edh8~*6Fm3;?c nO0Qdg0%q .Ab0HAQ NE# `P>bA"fG?#ۇ꣡#aeKbmN3 ~kcA07dd0 ~37fvf@Y|?Z ~j/QտGQɟl6/W?d>m0?"v+i||?s_#} -?*s 20wC`k>>?Q? 4[^5 hsۛ#SOXvp~BNp'8ҋkGV`wKtpkb۳^^i߂t*j~-]Rd9ΜH yhneA{/et:~d $PNt0ԨnwsSDR4p^',ZQ *TqHq oQg=߂\61WbzZr`>X|I 5/ ^jՀ}t6R erbm!Wn(ۏmu|ۯ&|r ~ 猻=eI؝RdGyǏH;f Hv{Yd3܁ AVGj${,.jPy*gwty#isq[<T [v0BfX04Ϊu`[O<_npjOؑYb43عD&ǠCE"޸81uaRfûpx ``?(\>rUYBghpt[ PN8(lB{HiM *Oi`i u\th#'>VnYQ4haA3\ђcWG9ax ^qvŅD9ؒM?:j?,є\*ЪW Q1qc4h2+ed{-|j pMc+fW~<4EVUhd,w /V3"U@'-|NBAVi4RV9("ۊne^b56zL/PgBʩJOYHܝ#Nbz^~jtg8(ibQjM{ܔ0c:;*DЎ_s7Z7dN(jFT!u\Sq$?; ʍaFV8 :knc o^oUtGWpLVXׁ7s%νpH &/`wgn*=vr"iT׭&MLx$:6zHRWDܧdNdDhX{4CݠVLe۴_p+|[3 (Mq,Kуi]Аhhx15>^j4qHO~.S0k[J/GOZW^C GY_~/ZxE{j4/`ZNF?>k/p pKn=yCș1O݁ǁL,$8YZXgr߮Z߃*GsRm UeS6R:$ø{gWkFUj_Hs'b_pPNNfV>D^z?E[udQG{"aB?tee!)+È#^XҿeE 胢*Epn.kg12};ln@;A;;HoJSQfM=꟥Q~j+HKfI+ِD͌A7tzv3JVwז4'bo5zv iПFl_߫hֆƲdN:qűՑT2q&H6Իl¶筷vr4Iph:A:R3sϕ̈́lDƌ,4eDF~eZsH3L]B_yrUBkZg:ڏ=obuG؎y7%b#RVGgACa#𣅗 Rh}hF"Wl>9{mffGT]DYX'$ς ]nE¿U:6{QE6BV&YC*~ϓëˊzg᫢fv +6`N4qcW}M;;UEH^ap5OK% 9 b4~bR|H3 }cQF18t`-USoig^$O'e[  bE-r_z!i.Vj ,ݻG!.v0edrq1t6&/6~) yjQV2 ?EP4z SŨ׺-Ĥr@(@"<)uihExTk:F~)q#f>})QS1#WݯcXF$mkQ_3xQ7<[y,^EJ̦x[Q#čl]O8?ﰫ^|ī:m{eC3_ #Ҁ7/kYs~lR]r(hSvf1.`T'7ar߼q&x#rx'k/WnmtiҔIE 8~ghdmUK/ynB9zs?ys\np M1Zoga'pɪ(\S8GJ=%be{&"ڃ#&m_ȉ&?XfP |N~JZzZcY*OVXl a5K|7.!wt6N:-E»|BamvZӰ~@ZXELM({ҧ/4k;9i z~4rAj2G*8ΖD% N(oOf葉IAc 5?=9|QA~0; :"'ٛ Ƴ\Fj73 !ageF[ʵQ5>v;!^%\UEF.BujK@-⦣(GT6Q61rA`yoSO970޴J䉳%L!o;%ufGZ3(h YrҚY@&f'2i_蜼As4 ņr;zպ} >Z,;t/C@Zu3a(Iyw12ͥ`AaPr"iyV]w% +M mߞNAzi)㧨P{wGB]aa%ysAҦL@(iK57-D MwN Ly_ޮ )JjQy 68#$7kyHې%z㠉 5(ݚ97RƄ군Zzw2aBi<+T{Swqx>ijHߏP}T6DURb*Kto=(+:CR ^\~D!ٕu?usLv3#z _dxm9L ~,v?L*pRoW=jAzFg3wf1,ci"'gަ8uavfJm\5XXaGG wۘj!;DCgx#B):"!H& My.ScE=ͩ[-)%RHd̊tF"FnNlGt^4\s8&Rnj)8`M +H_Zc[yࣕEu.ŗzλY츇{#;8%役ȿ(( 5u[u axJ&?VsdtUa;u:_~k@{rKVb((5t"=6й^?2EjEud;YFf3oz4fO^gqԂU C*7&VwŤ (5~D on8~S ;Zsb訓@Mb7h KCC4Ï2kԯ^p^"bw?&t/MpLqޢXG]:gyؖgyDvj`_#t/R 4PkId /L2tJJmc9esMar]*Xy | XH|"UsH$lMmxMXl7SְM,ﳝX1Oe%I9{:TMTwkFJu2D~Sk\.o]׈XQ= C^VH뗟OfgfQa6U[ioQokAU"- $m/c2 ܦ*52|YzBg.*ߌH"f^>/fsc"f,k+PRMϛ2 :p?.21D~՟A603^Q ?B\ѩT~[CΝjc̈hN^?V~!RP~^.sSnBoԺY&La󵫠k ҍc+ ?q֯vHmnvֲ1IÖ6iY'zSfwA) vV̽i۲+@=΅Yu@4Nd$2"bDXΕZ^?̺jt@6.rdb1 5Ro|D9\,qx`  =7ŕwe&Lg׮\>ԭ_0[:\jZl ]z PSһ6 (FK.cz !l[Bt%el[htZ 5 Egˏ&gF7=_4#|uEo‹rי`6d) Xso#K98Z x)-5׌;j$'QiMZ дnHzR'ؔc-%;c0YҢDkiU?#)L-jQiY.@:BI o{O I5:S'ԫm8ޏXghWdڷ.cʷ24Rp ;rB5|}Got{za]y*EYfBԣYG>:SOL"UI+ղgݨ Wڵ~m_RD!D VŤHyj(R9ΞaʑQY]-Ny A=AAښ"ynt5e 1.(~Tĥ<>C >|J' T[ t`", %uV g_D|pm|% y]~o꧓#SU(8rFzOPq}L5=r),s/(90:1Y? s7BgDjb_˯3& 8L1Qٱ<ػ~!Ow;6X/|߂%<*"ǥr !e=,f!r蝗ewwC\Un8b7a)FeI!^vWܥ|vKhis YP)i0O+Ր/A-VafTQ שM"n?c~cwC܊TS ^)q]#źr}K&^+GC a탹*׀`G0 y;D;}'^OA>ϯIWطIΘ!yLPQ5%__o֤6✣ 9/Wa""{ j఻11J>֣n-,a破w4Å6t?MzҴX i :F7S c.MqV;$KG71nbۢ%]ߢ^/o;仢ǽMGS]N:f‚Is E!eɄIp7Dv(Sݖf%hH{Ӈ Nqk|1LDp^Ps0O(ʁY`ŚYJ^s^S5pvVf'#O48/JRho߉~cizmYjKC3] +/Yܾ ߀N@cP]V,|8yb{-xOMvu#2܃~WzLﱃ[cnZOclij b2j_Bo&M>9D]gK"JҸKzv^g7>ʾ_Heo%Ͳ3t}r2QD6" r ^mS7 xxp ؟[hIX85TO*=uآMJU[9K̓8DNRF%R/Qi~!b jUp+j͜_NȄe&,7D@>>TB_vͽޙY5._<')"z`gi.ʂo㴒SvP5i@ ZoɇY^U\T1qȺr]{I"$׊Z „"#G}"=vO@IGQ(0jDgOۈ=Z0gB~_""z!j&B "[xڵ T4C_&;(OfIZ{Z8~D7ZR\8m@%v\3#V%TIiAG9A ]`paMyfP[`M5.ҩ1Fú%!kiCJ,u:@kqQI.ZO#2ϭ-60|rbxsXmTO=z-U2thUrL;J!4U*hNI-Pp/)='84{K(Y,5>-\0{<eDoVyG-}JD(/?Oi`Kb x>O*P|zbkL;[QMR~0`[LV70䝅C[B[`Q1F?K)CZо*3w"3vFw<,nܕo}ǫ٠/Cm[e|旀`k>dT|: Y\MLB,YrׂYzQt3c WD>P/e)i_*un#c(|Χ)s˩7A5cņ}5ߍF g&o6X5.{SGDZAX%k*G'q-~`M3 ߡ MY" W2߻TܰnP$.^l7!욖+[Fg}VJ7qsDZv\u"x\/W 'F' r]䓎sQ> stream xڌeT]JwK;6]"] JKwtIwww H9?` =Z7)P & `ffcdffEPv Ph]\xsd&n SG `ef /@ut"P9:yX[Z2_ _{@ hhfbPs4yOj~+77'^&&OOOF{WFGKAz@ t~ P4#@*5G 7O $6:́.P~<@ oc3 #?;ÿML,v@<=#dM"*P͕wLÀ-`.hotpsE] 4yov0݊;PF?V % :X3ef;_JbP|V-?&@;ߊE,,sk37)Otho b@DB3IFRAIEQ:z|X llN.''R6O!8X8x]/hP?DϞ7#@3s0~f\;ߚ$eA_l@vw#h)[4vZ7Z8Xo\_4XY;]_5f횙-:q_* h7cx#0He-9_|01:8\?,]~-'I߈ $q ?$ 6- P?$)A|(?OS@ vʮiA| ҙ;T5́YAıv/WP.&f@;_b18[l t{4.(U[botc5sG;;,@UD0&$wv?Q@fgbWt,DYXX{ ?I@z,oP;V Hfo_4?Mpc{A#='(h[ }iWI7OѠyup=s,鳁J(e/3f @4L€47$k,DMd zI  zܬ\QԻ_AqyAk@^APx h>E;ܬf.1]fKf|!6!" {lo$1v;=%w)ʣVz a1\<B1 #Oy.'{qӾyH_Pa9b}$z=8tV! .˯W:~ :WWᅙg OCjzEl<xnOl[)N oXUp'w¨T7?! p`E{%X[db <'fiCxm-<O c}rJN8g/`LwYO0&߃;,W}آVԄtHK)]ž$gQ=\& PfRI{XD/̏n:sPnk_BR]+yj)׬o@|;nBa.Dt#AHk{D4E<⧫Y`E) aDv:R4nRPfitBP+Tfzk/Ghi%s1K'~T g+Up( аH˽I:h IW"xкQPy'"=0ќnEeň<FʹKż&L86ԗ0.verkgD=?|ATl\ּRFy18vHA3qd03;ĈGh>k:(>3l&(co;E;%;_F"Ko}ǽJb_H\ʦg0&^]]*'1V0YiPJsK]G[Q`lEiQ Tu g(m6*1~U+'Z@1tO[{CpKJW? H xLq0%H3% )5s ?[?~(4v|4>{G \dY) SLf+FP o9+.yQhi'j|-+v%Ow`׷a Eol|mGĻںzuzڳPYe<8\W mz{{"|Ǧ.ƫ-UXn֌c31ڨzEd&R؛CshKO]H%eD AM6$I BbݍP׺(<-zi=*chjN0{}߿(ٔQλڠΏQ$Z~f%+~Z[ $M=[Q//)_ {>0/?yD 1a6F}R_ 9Ϊz?avE9s$HV ZIAOGy5$e}\̀| )ER<ɬa(OyFP/`mn2*:(Ir$|CQ17 jϘ=G 5Fã?B 賖弭RDQ"4~-ʣF3hybNXզ&<^Tِ14Кvk?F=;H ]zO9mzup1,{w 8.A.((ۿcG1 ^gbv3kQ?]*mQUePUMjD^w[ 7䤕 kw\T.bm'}lD(q3:]N8'<`nJ`_g'+|Qi76g3+;F,yCZ\ДG~Q"tR!!a⻦9פR_7R\j"%QsѴѿ%YEAdE/Ekq~f1{.rE7U#;L,E낙dd!XBk@7k4o0fһP/Bw lzvA4$Sy+Jk^،%TQ7R\v0xkFo޹#lCrvjC֎lQco>5lSybr}]˸_4c s@V?zHbnVleA ~y^H7}qeKu<"^ĜO2d!n=FK6b+Z%0~gehLeZVЕ"|F;<. +ER[aZzw]ݜMN5ƄkL.izQEL 1+P%+[D:A)uQY({d8gn? ̅@ ,eFarkx#փ#ǺIP'N&.tE|SY;ww_EP2 D!"ʭbK& +G2ͤl( JJ7w!cKE޽4G5K™OW>A< ]H0+=(V&Mt 3e>AUWi2xy$\j'O`%_u}vM::x2KQڮx?8fVd75@?$뤼M{ٞ%u*WlWʼn_G3]4*2HPal~NY;BOau'oыkDw.r=!3 $=|o9d{dՌϓ޸AA\ ʟ0Z22[}Fx_Vܞ2:dpn=3wkFBRl|=[1D8ʆN|t㈉LxvBtʅ+e't|l#}$6{,X|6Nznu_\Yە |k>@;;PaVܩ/EZzEWN}"V8:Ŧ"`|V{pA#\l+:X$_oBQ9d&ՆϤQ쓤*_%^/ ۡwX]ivl~8W^QgVY,$vn "N M^~@Ԙ{|e*S$Ǒ-n0V6@XH4WC6"Nc\0no([ܭ'0>otqF7% :ˆ 7 ǰ{Y9ךד toYͷf=7i`T^snjZn~laXWqe>z0$n(2j_&?}4C&EW3[o:.Vr(@Q1zpW(H6Ve젵*~FvCOY*iaj#ExT;쾹, ޢrzuȵ`Ӿ3CJ铿@WV&\YdH?k{ ˾v [I*HaC+'^^ 孮.yNK"^ڛS ӵ3tsiWrvzCTO7ra™rq[  Q K嬢sH{E‎[DUzҺ9;.f|E<2v1 9LN>]W/y/[ ߘMIVQjS>iR<ΦOܫ߶__fzeWCy m0tZT)H_R0]yH7|.`ۇRԚc1xiFfuj*N _Q1Wf\y3D\pO& e&_ŵhyL%Wjz$iߡzjRboV@(w՜ W%mq3 Gwd˕ {F!y!غsx#N&SASYs|!ޱs&svZ,“GjJs䆂@N Dg#J*sQC;xxK'==WO^I]M;1I7*`aBk7Uғ,goBQ&Pfܐv"} a~Hs}?UN=Es6Wvg;%52"8\J4䛱˽[+vLl1{ w|)#y,>yBٕMGj `3a\9o^&fj2;?ĝLn(M?7-/I/a7'j2= w%?廳Z цW+@(BS+cL%@jz"Vi'j3vvG/WrK~ԿEa81-o#uY?&MyQp7͘ߋ򔜃%X̨kSøJvYsv V2A*TEAѱbO(QO@cd{k[f@" ϔk>"'ϓXw\&DR[ f.dtM˸;V@{mW0(3\Upn Fm;1₎N%} Ҵ"Lm^u`IWIHH}!˕Nɟ4. #ڣ?dzx'/Owo F*p?d*l.Ť^yj2%&mjf\JM5X[.Ŕ1 cf{{#p}J [4rCwRuͼJdF2I鶙LVcD}Ҫܨ8 r1rkRnd&YV)Fjo IصALDvXW]\lnYB J]fZCC)+u}Y? $V8غ5Y\} 1$;զReK <33)w<Erj0>{?(]\^WRLw܃k#Ztj;ޣ^F:2^m~sEizkO(ƨ=lCX /? `CD3Y~>8ne9jf23ܽ-x81Z\6#oς9)}Dgu(t:_G[>/)Ne֭Da7oWCX+w bH]|ܰ/B_e tuھ՚ua}^S4V'f.}ww96#HNzM2m5]Bwi/Obmq.DgS~5%!OlK`̺.IA-`4aeL֩9"G|o^\OŊpr*x39* T:>* CCl'}|m6K2z}ܠ CaC0@u ӈZ{i3#P,yƝP"1} WWW D"YTĽ(WWV꯱xI`>]t|>%V`^/g42lw)П jiizB8+پDDX f;,ƾ-}&< DžzԽoR^]E]G:o5/R$53\h#jԋ:ϯu}QULTMj8WRfS`wwGxB~#zq[.eM_sR/x.^ceBCQBf,LQyJX>|wms.^-o iű87 ndb2<^t|7WC uވPz[_C`*&?,iI]*}z@>g}nV8+cIO6n#{rOut=}rȳ1"ڱg8K#vjP_72:OSLьl7w i Ѣ}Baa!IZw,ߵQسA1z>||2i`_.lg|ĭ+@Y " v vٜOo[@jO` XHpdJ4^ }SZL7Lܥd/zm# 錴BWVZ*H7X),"w]Vc n5n-\4[*ԕAA~XPyXR,Vi`OCSsQ(eeShdΠn]KP+M2AV3PrOO"#(rsM.[ы+q%FJWɏ WSi Mt(tj`/K)?7\aU[G'܉Mi] 1oщK/b7:og@왷mۛd&y6HHt/ֈS"seE;! xIO~6 Ljt**)qh㵀^*a+9%Spl׵~Εwc& iPXP!3g.S-J9פLo)(bpPȘBN\CU%!B!p\ǟ*%?gʼ#X JI#E?̱q@7"s.G cwT`S%~)J0%NDk$:Nڊ=CM;me>y3W>`vrOSv=I~b MA-YS5߿ Xik!@ZPQl"^ JGږѮODʞ{Z qr| ў2;yQO)3^{*SMF3]noGUj O2n?T d'ǍEC"hz=8JCFu~#L)(}Hb^ N[5-Um$1;ƍB=+>V5#0irw]0V^HdY_vʟh.$&y:D-W1H8)jǚ`Lfm U?%!}I9i3Xsk; iFnLnQ-(n),@@oyfru39Ȗ7(S+z*/I(7y۷FqZIn-sO!>ٕ#k ~VB &9yy=~2M@"x&OhM^Eh[t(vzu5>_oyK1ÈD'-cOUT'=҂6xJ+!:tԐ?*%\:NbP!+w}LHs &k@χny 68]A$~ts ۾]HA$",ˬhJl1YE*4wД _-Vo܇.Qy'kSI5Iũ ”"@Q~!_\R uX 5 nޯqdy΋ ck-JZ~:<"˃_>=w3ST;ʍ׷dm/s*^$$޴{^>F&~.YYd3vjFiO %?_'Dԝ$pl(Hχ؋[/Bol͈O~⢵iʿ]hO([E48DEsAc|aB]ȐUA`~IA` =QA ~ib$Q׸lÖ)oA7HzIFQ^W*pr:d7y5K:mdG kTrW\4l1â~w*}1Yـ cL5Vʍ~%lg0zp߼"z89֎zsm?;fN]?wMyn 7I9XO%}apۮѠX|q3тHEc!:>6bAIHAˉ8nnc]*J;^ziZEk1K$ƨO -^%GS>q^甒L [+/]ֿjF(ED#)|hNO}1F\4 bD.(w3vըFh"X':ɲPÅ]uN=-%mhnEe$w˩*g5xw)PDM"ٱk*^4g}lj׆/UTdB.5@UfF÷ԳX~G^SX;%xݗs-Jϕ3N1,J_0@)pgAIA e[VƝ OE|n47{oÍ8 Ԣ?PL?N3P2`uf~_~=[f[d&@O쀾쨠0.XEot'Q wz$-9<ʦ'gLe״ToQpt"۹.Dx>*^:î,SӍORVpd52ILaz C2^'eG\=FE*' 6eRPtzھDKzZ.#e4SK DR/W[x'^/2RH і b-B]ʒh)*KB9oݪd6Tl S_BowVH6X xP3'H.M6՗kK](lŁ. r^Ο֋[+b>"]Э*v.|oKeLyP7F@S~Wބ.$gPxe24z`ڽZfM؏V"9s,cЫc"jUF[&BG.WÆf g{R»ʟpN :갟Rq<2fsME܈+.Ti; ت[%U5]er[qnC/;E-JPW}ɇг*/e%:E̝ ݆|Zo4 Xt23$Kp-I-pؚ˜zߋ@ʺ{Jl2c$n(- FOj:AI%ݡizB8]tRm#ŷ{-a{„ʹ0­ٝ+Aci$e5[$ېa$LD㯬f4ƌEiQEκM-Nqzb6\s=u0_ɟ`ܽ1Zճo?4y%i%ghlXPհѲ ~giR'̢~}Wch-[8'yYr DY|6Ш{ڗߺ'Iϯccf_L݁Ұ|0,##OÍ@O3(ϕʉ~ XzTcc[(~=JSw#$/姄F=gl`W AܪT♬8H?7LUlemWFh4{:Ѻ\GDqvvgʝg(FvQYrSyJIl oSُH'Ԟ uOvmb=.z562QQa l9 jА?T^<ץ[R:e͚fZDC[zpn{—:ϵNn5؈Ĺ80XNB4Zy;LuĪ/&db4 с熾M=Wx{ HHR?!>y1=1zy0yOgeH%p4Zu}!O<4G\mZ)ɥy`R;)LC6O@ĕz꣮ۉ|d@ LU~!@履'I+Щ'_[f]h>ީPTi%Rmw H":}DdX ठތVa9Tɇ(o;\>1+CR@.,"Rf ϑZDUbn +^l"Db<.\%c$/3v4?䃊2%σxRXԻ,@e&'k.W㵷a,{Ip6rr.)"j?|)$SzpI '?3q1.[{\tud-wg A y8qC^s(DHww݅SuRMW7'k^yRqNFƒ7$2fC}$C4¾+Y6'Ky&z;Ft(Ɠ Zw/ŕ?(P;jj.I(Uw*L{?ǶVȝxG Mm$ը,V}p4jߣpc^<2!N(Q*[kI[,f3ǰ 翡%Oe[@CU'BSkM66tC?5bޱ_Y:zy^-ܾwGCx('͍Q&$ | Ә`ӿ&FٙREu1#/@@ # \xcUpaFd GXfA$bȈ{YQdϵ&'P}i# t5?HY#9U整a%&N|P:?z "F+X󡩺-͆ԖflFc, @x`׷QN{IN^:DQp@G3g.5!P "ص6힢+eeM<杘FQ 0LU Y6\4Ǎj/Vw֖wR8G)mDM&VkF<^`ҍEw_Q熖(?)Nɨ &4kЌȒ9-P8_uiWeB~/Ѳqqrrs"U@[Ltg(_m=C K@ S 3~SM`_`c 0\޼yIc'͔mPU$Y\Y4YXbF)r sv0Vp"(X" ho~`dToL ]eKyKJɦ~v] y @ǯLA W YS@0;CLFb^$Hanv\m O5""1kG"1IPe)\gI2#Pt+dAr \fV/ 6|# G+ZN a<5B;CwulŲV B9`VMsv 3U[oV A܏-6P+ֳNWȇ-d6zg/Mr0k !^l+"L}q[Y~]>[Mݏf} 3S՝;'~l0fL6ȩ'a. 5|wapJHB+%l~"}m~/J3*T698YɭQ?U5< 7YEa]5%6u{L,Q/=.6f.^p[1 >\kJ+B3%-=/yC P|7sx4}w؂2;tH}iʥL9˹N6DqLn:b{dÓMŒ#H\|~A :||>TD>+TFϽpZHyoRיo8D&lZ˅ǸSZ^zK_\s)9AJO؛{; x紷Fhvʷ2Rs4 aPwtQթgjj/BdTPƚ@gc"_gk e۔F-Ň=#J̠MwgPrؓFD041@8iޒֿi 6O!"L)CM\PUD,^cJe Z-O%o^yb%pc8}gYt f=-Pg\ĸAWD 1nkm|\(D[,;e] <ŲF>^uw8),0oZ7{~wUX<Ƕ~l=rPe/,t8=M}~%O'u }lTno93N*6 8)tQ#cS9c!m>g6FƬ6@!QדbDqC 6h XC|q:^o;qilVƕ*w? )#ry2mHt4RĕSeO +nha T o/ZD$j 4;.?AX' Kn()itFB\7 3JrAO~{\=}$N˸vʄ>8B𽆸1ٴRPL1͚! k5,B Ğ^۽ɨ"^^O`%$5!#% Y~W?+Ct|hMyr].A=#{ 3u˲}8ݧ3^cα)dB? @ye<5}l|%M9ԦNPē DwՌ i/gx.WeNc_8{Tǡ#9 RXX1\MZG~j?ijyZjO*zu?g[%o^<+aݺGDq(3w-VW[ȝ]vݡ4Hv|.K9C } ])xg26Mp]rۣ]<~M#jhfK*I @u]ۧ>u?V_PYX4 >NCeaIh6UȃO7mXݘ3$I!LcBA";ͱ>/֌~>,ZW5RY0ƪZ2>y3 q֏{G2nK9ylơ;W 38,fe+{)7dL+vɎϲ&!mcglLג\Ke,6=~Q؅蜊Q(ʽqY)BknL'#@+z j(MnZB/98S 6HH"2UUtɇD69x7[Z(ƴZ-BJ3kZu!Wd;Di?3#*'LLMcTVM-i@˯lӅyD~y%#7sYM O|d|+㉆oO7u1γ)ٮ,@ߟR'PZluM+]8>ٛnlTϗOipu@ &Xb!B]P $~g0)Mg~4D[OWa)C! &5lP'VGRm f_JAZtCqxJa5iNuD͗D>ŎOȷC$He(02&BΗ1qXsZQ|\;0F3 &B 5ش KHGr'+iٌ\&em&!2N]wN^e ݈Sʘ( HBjB &+P*Ìh 󴧤'"}Bt*{O7+-#\aNJAes%Ծ^π?OPLx`<=Z:֓[! {Śi"xgA.JtO2 {idLFDG,ib|c:;I(^3E\[/M?yk<|wAKQv(,oVSsca!E$6?a[rbE[IOfџ*@i'E ./7mJ rb'R!S$$  C ea-+/qRdሴб4(F|"; ⦏~j10v$˷Mgrˡt&ϊn= Df3Hzs,3\p"^ra2rн佑,xgt] ;1]!f9]kNYW8.!. Qo!$}j"c)E-v6muF幝E›]&mE b&?_NJtm픠d-P0 J±:X̩pu>W>n$q` %cd^؇(=oL(ΖY3Yg22]GV1LTw<%E7ZUQQLjfl"z^cS{PKFꤊ;YCMpsWPfaT{"๤ -E=S YCPd}U>w)7ºW ={:NJ*tLѤ42Y@`_äQz@7URq7!ˢXCޚ\1YpO%X4QU\Ui c+Nǖ\;Cʄ<VtQ=WH̳"|/Ol\h[}Ŀˤ#$՘򦼩&.TNwz |+\#A֏4$H6VCTUG41CLؐU&f:s^(nrK)xu8x.)8 endstream endobj 187 0 obj << /Length1 1384 /Length2 6113 /Length3 0 /Length 7053 /Filter /FlateDecode >> stream xڍwT6" "0t Jw0 ] "HJI H"tw#~{y}k֚y׮gae㕳C@p4HP $ʪC;CB(.$)@ PuwQI1I$""fh8ϪpF >?t@قqh v0%8hWI~~OOO> p0 AA;ʀ&g5>|V@+G{ Q)p;詨Z_`<UOB0d- =h)<n vF!`3{t0,7 sEP0_;*s}Jp; FO^7u#<[05] 07w̵ >( @ qq ^{B~~wuEk@a|_ `h] ˾$ 0]Oav`GxD$*p{ ״(G?ki" 8ssK)?'Rvwv .0g?k⺣EFwT a^;m/74g@~[^bu~I;V?[*mvd&(" H7>K"" ^i z=u/_G[w$Zkp=oaC ^[1TcEhi'R|SsH4l_[JzNj‡hO[Ӄfe1:wysZz; t@,)jN{eXJr&Ԋ2&Ңe6m`F0̣?ƒ!͒U ~`FbOcϼbS>)3IhZ{hIjrU̞ƥ֢0EvF1{> od$y܌y뽭M Úm\qI2}+PkVaD}lE^)qz&B2'1#']3ʦ@+qX\K"L$_pNrf{|H},6|^ZQMTsiyMϒtT2ThEmURTV<ȥ A&h8 ߺu/$LWf/@CM |w[t35>ODh-u?(xjA4b&xbC8dscQt)n <97cnn\+,`="EL k~S@s5کl&hiBAԇd{N;3F Y|swF)j7UN[o$QÙx-x?i=>O)N9tx5^N)CXS\uBĎEɫ'eoq?Tǽ s0&.ƬcjjL C=9U ¦4oL#-ҝƲh]Wūń뺒@­7j".Zn+yk.p虍O@ /LD6oۯC:}r j 0?pJRru߮4Hv|DÍ{Us[%׊"Lɱgv.G~۟ƱVlhtaJMM6>/5&X\\K륤l~5׆A$qamP4GD74>1_:.jRGd򝈱@frMNI" G{a3og1Tm)Iv^]xM\Uy['IAKh^y-;5l8s)3eMc.oLNj'[{qA YRjnɇ"2_іУwb^)H"Gk< O>՚C^zH 4M(C4@J@aM6UWjJδk.~[%ߣGn<|(`֛ϓuI~f^8%jP2T-ꨢWO"s={aN,iJ?S)sHܮ}۹J,'SNY`xsw8rjX 7Őh@ӌa/ƶhb2~5D&MRHhZ E4~oa|t:IIA8aIQ_ƕzLXMQWb#ˌX pqq s;let;Hϸ,TM { &[48N%[ %>^GdCIJžBz|٦,ʼwi+^ lRyȌ|6cw" ڶwHQ3 %IZbGLuaKerJ"̓56^VnVÀkt}I2I.{"uQvJ,֨Ѹ:bQpQ1MAJv̎*-j)1UeWRG'(<6nK:ybW_TCҝBx֊G-@;[ :?,* #%/>dͱ__ ߺS^1CLVmŒ-v3{wK4E^;9\a5L5Q䥡t5|*O=/u^R̰NwΪ}P.Wa6lae:KZ;q֗$og//6?k$juG?⩹Tʨ |OR"ik(zvrCt*91j-y60:,1u䐊O5:A jCbF %Fki Y[XU$#[7Bzc?gn̅<ʺt`3o?aZe`,e K nMQLPx-^2/1EbҞ͒D/}ayxQ=]y2;IϬ: REt}^ki 6LkK;lAW,wGdib *17t=.q=/60oT%5}U$Ή [Z7"2?Ik Wc>V̄?\INSI9YVE d?􊆶1ӏ:L+ c1Eˏ cpC a6w!$ ݗ" {!4l䜾zX7C ٘I[GUf% 5š,$~)ےMĐlsfM~Uq|AO|X5;AL{c̈'e3EX&Lܨ@FĦҥSD[9Nah\;@ӒTb*IKM0gʕ4[A4A~Zssf68K~2-;Oo0 jUR 毮ߑ0+E)[3_ -6}2_sa=τE;~!CL<~E`H&ay%" {ä #藨*pڝw}_AB/kt5Y;8/8]hLF, hsUՂÌfd Y^~'?4u2* 35YJVWސH QV&YŒ!w6|%EvPN~sC;.<=xSo;ZJ69aH\is+o!q5{ǾPId=$is9ޡ?@_ayc*r= t:@lDݗj*=˹zؚGs,̊IOA/{[5Sk.$6r(9iHQ67c뇀2G38V 8R]5onTI?]]UJ ߄"U02]|G|Qmd"jB[(ÇUQfU7;<%>8S|S\NTjz)I.Yyӥк'˷v4R^bd*GQ(a?;)^P#U-ynȳ]U{P מtΛ2:Xʯ# ۨvz֒4bg/ֲ]Ďѻ/'ڏ+mxE+uw~# tdV!HZepŒI^EEnk꼯@9`5mW\v+l!su>.c7J B{R ަ'a";KeJZ"6EZ<%* .QBRzHlM,,)m:vnM4ۋ8xU6qV*}(nz]Gs&fC5czE?&-ڳ^Wet>-t*g;gwη %H]m,/-RM'^>r164EJH0PҮ ތ{ok`];'zJĻ1{),<2 ~kӊxgCbeR}H MM~9+\tJv<݋=8(cN!;ZkS5 o&%)cr4v\<19Q9y; N.tvv}YixƅVƃLv[B?4XN#x/t􅛆[ N燼X7d]r|B㓪s&u{Md]|N8*_rm9No_tZmл(g:2zn٣FpJ t-ɩN< 3=T}ӄdŸ?v:ѥ70| `5f+>Q43DzAA9pO.h!pը0u5O'snl5\~MNޓk6Jnlz=A]R-H]>8ѪBXpn89pC.;`/y(pq{#bbxU˘alwI!Bհg`q [;Q-鉒c`1Z;5X4U/\fKԴ; 'TiſЛ(/]G& h1ZclVRD@qYZHrgIǠ2qcud{2IYt =,O n`\NbC}nc2DŽV`>Ok|7&˂ T 7w*>rHP<by8CdQY7ħKzoNXYlj/ ցs{$6[sW_0EoRSMV$D3h ;;(92)6b"g)N\4ή> stream xڍwTT6tHsA``f`%F$E )) i iRq}k:s޽߽F8Z 1278jD=V qa}tb-5H/I` G2v%H`&1 &@b! D I@iP(~ֿe BI>L!#\j#ZNjT}Dֆ&ZD`x8_TT1 ϔ=x?,{2kӑ1M;ѳ/R A29ȥ?\{lJioM`͗l9u))Q qW3<;Hcĩ}Ƌ^ XPӠ3u@#x1cՖXŚ=R_ V=Hˑ7H8G ë*sV]f:ru Pjsy{nqWk [{8wzʣ7"T[}opNyKSU&kQabBkfi3yi flXq#Nim$ALL j,-5]MH;aKr|q?9#R;-[{#9W?Hnͷg"h%!!3N~+$͝#>|] Wۤ #R!IkiY=^ҥ }/>nuz3DVe_X9d&>CXNvoo~4hUƲY}C"dsN,ЭӒP-$/gGRoԫ(EM> 7CtfrvƳy'iGVFmmaM7EⒶb fcڅHBu6Lc>/:D %8 < E\!ZzD 5YK \)N˗f?Hqʗ!j[{(^0ͬ|LjףrCwdZ=SaNSp*)_@ UWYֈH5LKISn5y^$Ey~AsU#Fo3TJ:Q%x{eULc$e֘K?JePhdAx7dto]k*+; V&V<:NwNa4ve ,mHn֑r8bm"m~:xU 1s,&? 655Q5$9&fD"\ʵn۾H"6EW|SGP+鳈68ˇ:m2ѩOWނtNaZbuLV%sy(]9돤$Dh#qau562|j Շ~6nQ!}/QOs)uUq9;tGQfjޛ Z -/4܏1.Oܠ|&~[; zUKR Y/KOѬ/ՙ 2׶O4Ь?R. Q{(Hi*j?尕Xm@Nm]|Y謴iIߘlr:z1'oS(u6% H0ge2{A P\h~!YRm! \Ӗ9hO;Db̒p'1FV4>\57Nv>;Gp25'MI}<3D)6޲T&Оl<)%R>\5aBY{GI5ֺ:'3͖(P^ټh>A7zt߼p)?|HgEN7nu u8W&vl@k<'r}Ζ2@9]quͭe.Ƭ&?2{ 6d[}Q[zWߥaZ4=(,||Jk@W8Y׳VbA{{?<*K-Vd4uL*ưccSÿ3#bQR*BbxnJ0Io$+։E M?kmA@^N񟆯_ ΅ȩRCMi]O8Hi=='|U qt{UcBV2=̅$|| 2N6P^~u!@6 . G:7^֢}&zno~*9{&P|>یg#`6Iɬ1\Q(Yػ`'(+)c{6D z1e-H؇6"`Ùؠ`W6j8rj$^z!&.JU{{%5CݷiHΒL#o:/jobfzPv9q|F=ow>=ͅk%F39XF7egBÙ~gOui[rt/)fxKkчyJ,g/id팴[3/x󼸄y$NwReL1z(1_c,~TZP19SccMڙP,$bhsn DBXq<\55xo*q,s/lh ̊i#p.:P*}cqd}@ j]qPn97d:,g,/AӬ9^GJ<$<=$mʣav=Y`RҒG8n!nxu}eu1:N|Lc"IF~>BDjEpfC,bGʒq iEs>Ņ?v@~VomV#=ڐJw/uC$~CgW\T<3ː[qMwGoQ]mY"/?/lXZ yveI] *LNt.+3NpfMw=]Dץ@ښT@Fb-lew)LJq{υ/>UeLjt?q*,5cxo azԋg+h̩l);nw#<<ӫڰ/ >T)!Ӭ(f]}niWm-DA2;}fbrdp>[Mvciu']ˆ!_L'~SLS =~np6e.qٙd=,L& NMs h[U){GQMW A KJSlwh6sx&oqD er3\=IF qmE?>ut% ^ga6ƺauݟЉh+Tv\.E>N2u\ D`[L냭 WӴK[c7unufv>{b ˰"#Y]Ν""6uvQFm)A_ u T +}lFd9hK߹i s0g)"=`S~JƮgؔ* W uYA=zs["zr;kQ?PQN5P۵ Cj>n2|ނIZ}m+XGrLQ֬:J9'j}i"NAU2fsqs5nJNLMvFvױ=u#Αr vнk76cJ8q,M{mMJOXx6N^5iyVvL+~"]dl'MJ94*ɯwY0qOʩH;U5cTjZZgLE=-7r4|3ŕ"e좩9J^ʉl{M3:&d?HTo3b@gMSw\d;_NPW?RBrf,F$Ȉm+NTMcqw;NK/k=_4]ӂɚ0!9iһ=J ^45(e`Up?ڮ22ZilϤxf]ǀ7qpDȊ^=?k|d3i2V- kݛVɞD)}L=?l'T̊^:VsٴdRBFf'!zmk s@|gg%n)?5yK4QD4IZ_mS/PJigҁE'enL\[{V.`kX Ѿͣ}/oDl'P nb21Sľ)};IDFeW|zUG!. d* hJ;TjpS3m0kV^D9+,g|AW{tР5\!BLb@K-7m"aAavqxRR=bz'0! T-lvy[uI߳5pT:Y0dYE 925a\eFCH=Nk' SH#} > stream xڍxT6E:ҋ= wA@ $HBU:E@Jo(iRϽ_VJ3g<Vc%=D@ *Ɩ@a qAQ0$B?*.E@qi0@DXXo"] 9tCstBc $\!00  8 A>-FI yyy \QHwGy~ 0 z Wȟ8&N0_c$r0 P`w "E9Pp!~;`C808#F@_D|a%zaqh_$DP\M BAGrtwKQlU6F_]#?J´'Ynž|uA͈-z\&c0Cn9wj?o @K8ǒ޸dMsΪU:y$*-C͐u - uO<ͩ\]+hV15vhH%u7PՉtRі?f0ͅ& P:7.ˢ*vuz_&hAGʆQ Öխ{BF/gYt8w25C#R(e \Legs2-U8QXIq$[04R lDSM>IB[" >őnEP:-Ȯef*nO\E@T}Vkl^NTH"$quuE_vG) td L^R G8VgGf7'"߄̰||dM! OMXj {'jÓj;DrR?7VBf̖/zaeM$v),GPX4Y#Lme ?+ W̛L{”#q]!'?M蕅`}u@}/:`5Ϭ҄4_ eYl*Lc٣)NI?<;mK68{ng7%25){ѻ9"BCOӠ&à?HqIYW~̶PQ`|,bݬM,22dYgxE\];ߋ` 18":cgi]ë\1tJ=7"oaWdh}h^<9nF(ofl3(/P쵝b05#IhiڸAc5.wehxy=YM债-.e=QYral]װ7X#d[pPݲ{[}Q${ޡ80Z8ë9dޝSfl8Ε&$+b@~SoMCZ\M_Gֱ(I<z{EU#Ʉm/CǏqn9@*阨g#;:fяO:w% Xsd+K|Sf5)aiO<*[G"4ib%=Sv^KEPBF/mK;_' 8|&j(d(Ekwĝcr9Tڇd7juފoK_'F[8PPj] o}YҼK:P8.dNP țL\Y&hFVzmU| }$zx{4?+.w1i# Y3b],)D|nJA5+D(TC$M'MnHe"R/edo.HC嬴` 1yA;H C֧]ݎG"kjWӂl+MRou(\S"GWJ{`[ І~wd ܓ,_pSbkz]S!#pRlf*$?N%yl~FuGE^7(iYGꞓ6|i6h`L,嵉gK+b]q])L?kggث=WLZ(؇u%i,jێ]b:mX/[ ^<)vO[gzJı|_9ս 9m8GlsO]J}Dϑ1Xh͵NUs 6D~jE]OW2)٩V69...vqЦj7*iGǗN ~ɌƵ_)r;p$Q$)%~2SGkV0Q\4׏,Ln вS.GB e"<ГԕՂskv~%,9Bœer_j_Lq//_f2( !-gH#ݞb db*ʕQqxF_|N@G1S4VUVȱEQS;|]pKW.Q'gcgQ=F:/$Tkh͹A>gUeOkտhlHP)Wpte]Qr[j $^~ۗ4F)]&=0af_Whx=)?svisGf nG>ͷ 8ބt*GΝkh8=֫jݎ R!<0]ܸ);4*=̷p>WGvd!K(VD\c} gG+' ~9K 3 qeGߥenSxI 'X S|3Ă*A`EKF!դ0 x5fzehܸȄ[boc܃t>rk*8mH=JpԫOftwB R8%h2S _m{q,2=xضd.S:=5u|LXIXgBzsS90x?ĎL;q FuɚmLB]I7l@&zTŖ1E9YHϜ~a~Y^[u78쯗zIC~} v.$@@Pn$(Wa]_DM ]ub[o+lEdχzpwL5V9Q+r&i,mf=C#24 ٯw隩Ss,b.%M ({ ;n<EG6Vlw.(g+r8MoE=㔇oII]3p^r#@3! W+M97Tr]8+ҸRt\kJ>?˥Ŗ ülǢՄcXDl>w|CJ-&c v@M ~cG9@X▜״\%N}#U6A,*:'IM4^7?37-eqJO0Ή7fާu<տ6tWEt ~Zay8;;J-#AԒ.6b@kY=&U(Gj(&sxeRJ9ܨ g2muRx{G=ot:ҳ۝D>LT+v|[s H\LX+iuٹPԞ |C{Z:'>épj|ȸ >7ģ}+ynr+QeB U7&9ѢlzzL)> stream xڍtT.(1( ! Ct7030 ݍ JtHҝtJH 8޵]7gw}MGOa UBQ| ~ @@@_@@r8 H7.H((4O;@BHLB@ ( _DR4j8ԍC⍄٣<; E `8@:w G .I{E;#v0=@Ez@mh&'[' ' wCgmHzs@ CC{6?f*NC g0œm% ~> E;!`0 l& P `NF*>eE< GOB sp'5 1UUKACD(QQaq7v~ }].[P-GPHwsEl`j:Y/   Z^6hg^_>D?,mC?p[n= 9@ D [So U%nHwwaN hѺDmoi560wh#b anJ0/ #?_Vs:7دo :K@bhA7.hs_E8ag"0 &@IPD B[ ?B3lH_* 0oAܑH~˿ֿ=zA!D3S0|_VZ&tG8_kg(Yٔ \16ȳ}˼=+x1U%ؽ&wb`{t QٽdbBW-nv΀odl8ٜ6Ԁ9Y<,@V ,\9{,>}`a/k ѲJz*5^z,z7 N9o) w #8'ALL]΀"&AYXfRhmSؐ g$OoR÷)`,p ]4زrTtH؄=;ZnpK>w8P喖ef{zKl n˜F546Ɇ<3 :;NGG;Sr^L;F07V4-/U4;Ey!+ֳ.9Ku[q-#/Ib+ͯ-'^kd !北7[b| RĬ&֧}@H1l8fRd[4HTuy>*^JA`l kBL4Z*(hi(E2<1d ?jR_Zvy#SĵMAP4qdw vGF_ 8'z+LYz՚ ns|?s0ɴaw<&dO(th~]&4RZKNl*Yr[rX>h!5Ք=Iwն\T>qE֐ @"YԑHޗuWjx Iّ]3ӏ#u*:y|f\[`E[hd\U&$'EKB19`Ы{t!ݟ˙^ A:s,V^8>N$/üzsvfR!fGw.!8Ż7S3BΊ(_x--} xKTF^U74uaJos,>HL5CerQF >?&8?#NR#'.X_Hg*e"5puXb$=y [ ]],|g6*/9/FEDkVx[95(gN?}ݩ4CXRXy-̕Kڻ3nB'[bqqrȹ"ą$0E%%a]&9W$iqjvgJ(9r$=I zp/E4V3_ZdlǶ9&ֿ/;TȧaM\U'Na1Ǎnt:W|vY9du؅jUD;g//K]6)h,6I^VV-d~pi^M\9zp۝9֡])$YRv8prǫ {  g*YΩ xaU-ea fj>hX ȣ$WGzv߯R`A Ț鸞òѬC,^V&Ksߜ ucXBU#{vE% W 8:{n9 ndh)'lsAx3'1TE= 1};&EӤB}}l:nv݃$̉7[/CҶ1& h(rq#\ wW`dӽ )DP׶A$N~9TlT-25DbSsL@kMIYN2i|K S61ɖӲְWslzU;A^$.5BY>Lm{Vb >7G+XR==s1.Ԋ"y" kwh7뾌#1u xR󜌢<."fiyX9䒐LD?Uܛ$ռ۹>}JZ^uR)#ɕO>dKl]ѷpX_[^UUhd!͏'_M?>x\!ǩ VqƷH1WLVbյQyv̫=}w|"yUp+ o$ic]Kp03s9ʝ\F[#ƿ-H8 5B}\B?c1~ ye`n>Ϝk~ܒ4tP 8xl_hd`YZaA͜>`{r Ryٖ Q6}a|4R/U)6dytճ>=yM{wu2<5diudwAEn )w} ե3=Y>[%Sbǁkz fV,?gx$.ÙSQՌnޣؠw"?WOM`V3>HN_eE #b\v 34|t58\2`?+ǁ7Ζmq ޔl$˥[OCy@NzwA3sj- $xc#,dpIP)؍q >(zаdz_-?MR>"qlc :!z?JmZ"_vy1CBdMg8?(X~ *踌:̽t}@Oh){j\l] =.k"So=Uq3150dJAjꢈCu_HXY}t\QݘɒI;O +^@o6fЋŅ8%?)n7Hr)~Vڅd?۔ 9R2}ks.NQH <<]xW'$;G5TGh67-4R_0Qh:y˼dYҏ(Ij\G]y V.=n;vߥcr(֕r]GQܫ2l]]x&N'a#zx> N0Z%{U*,Jr9 f=Zep)4RRnYҺ{]>+/Ҽqrt)߸F懼~fl8m.gdi ,uq9,Ñ2CI/Rn[o7/# ?m4oPb=٫`΀Obf"wM cI =3x+.D] m Jӷ[F\ KXNzm2mZk&F\9ҬI4.`b {",ATH9Iڦ ka@&o@u+PVSOKJ{`T%vxGc'VeC!GxIX4cROCq>-~R]48%Ҟ:]kppsC9r:83X&B(nt#Jt3>cf=O=ふtImc+TZ,ctƊh3+~K^%$=чW}^L$&+!̅QԪM 5N"5gyʝ.IG~^뛍gE.bAee'[Fh1,gop2W7Tג#jX;|Ec]|ZGK,G!ryovtf%zB0@\6C̗>yLZ*>TykgQU:jsLzM0^20tZ2R =O0n3}e3Yen!lN?$(ھ>ێݧ`GI^ GMmS{ɒzWK޳:%K)?rP *)n@tN\]r_-x qShGWnM!-Wio4< t\(/ƹ ^?߿qyEZc_/ڦVCLp3-k##\kJtSJG0'EjWs[ir/rC!}/zIBܣP̉sMr!KYQSWӭ\~ ?5[QITyڙ1x,u'֗xE=ƣ-jdp\ J||e(lk&Ur5Bolα7d#(aNval1|Ue(rzLfM)n*qTnD~bёVRA̯ee訚FM88}S$/m;UΟ`YtuEKu?djm˻rSu|t#oPxQ:"w-a R'{+CwF SԬtޑ,6Ti rd^5D9??c,ns 'M6/T$'K rqn4Kfd"C+"ug+pYE90Z,Xьd5iX%t, ru=”l*?'[pPFn#B3o\Ctx:QG AtC3; endstream endobj 195 0 obj << /Length1 2093 /Length2 16686 /Length3 0 /Length 17954 /Filter /FlateDecode >> stream xڌP\րn%:!d{79ǘTYQ(ig SPae3!PR#Pj@vs;čl.Vv+/G^ yƮ 3@@)fgt~G)-##`l yhjl P3= =/3 - l P:]fJ(]%@5;sg7cG ]` 2:ؚj2%{XX9mlljjgcol%Iy&gwg_NvƮ kcwS7H+w}N {g'&'_52}%lllN'r?d53 3{f [ PF:"?2 3tM- a{/{ >^v2> s+++ d 0Zlxr|byo?V_>wYIYLFY%wQT `ddq>?ecп_Rvw{@hKs?b6ym4RY7Y{[s]ߧ@}l_4UgixhFV&AN w2_]/_f *9aޭXXZ"N}7_0vt4@x?wxOf039k9"u\fD".`Cf?`/}d0K!v0xr=z)Y=b0j=z_yޣ&ZG1Aw_f #5?=o{E-=-.cZߓW` zk;[9Dߧ^?= 뻅? {2IxgFL]t2{o' h4og&JЍqwy2NkGuO%@=/rQkw&[[6wj$/R]6$㑓 oN]#v[3 &՟n3 sRTMwg LHQxHA""32N'$RG8 ,0R 3S{&3;=xOhۂИ8 eL^J_DɨZ4InB'Cm~#;߄nBˀS%b)QT S@o^r8;|TSbLjH:fڕ)Hdc4Aöj XVkõ j^TiDJRԈ'#|"oQ)Pvs5sO8#S^ly֫>HCyjc$Wy2{cH$ƢB\P-a/|ILp@\')K6H[P-?Ds1-=:\+-FylbDC)CpYWXWنPZgMI_ EB5F+Bnw%X#}862v|q#߼6_yI<7c EL&3?K Zgw̒ɑb,?~/Iˤ)u쟫dAbIqaaPii}u:Rz]~#(`7&=8 '=ةxG?nӇ49yO28>hSXT{ " 7NJɽ}1sw2S,gFˡ廛˶H|E `-`HnfU d4s(L wFRJ'x?9P ,4\Sƿ|G˓e<f=My5mQeq%mvS8FM  Y |VUs~>t!; Aq& DMqE=>Uˁ妶Y6jX2ٔi+[}Ǐى䄩9HPb-/+> >F=I/_R+-lky3A}b')!"vޚOjnW4 ~O4 TH3uVLCL^.NwA1XҖC/Pģ/A-SEb(a>%-7ZH͑ <=J,b_> .V`# ڟsNg3mWfLȽBZ8&~Lo֚A҈4X$S)=b Nߛ9wx';j4)PJX B>ےڟZ;Z;HS F@=ޠ$u,(MX*a>9u"<;_>}KYBkaVX7?i^6c|^EX/BTQ^jiŇ3fHpe=kXb\2w'W2R[rb UX~Ipj'MlT9Zf[xTlOPs#}WkVв[kԗDÖY\-?M&&Q#;ࠂ5CeP.ŭVl׵v,67ٸ#D_][}>1Qk6҅cCvXF)vG@`&|3G9   ea ܯ;W %*@.83z F11$7/zeC؏f:+G< a*50̚sf[pk={ؕZT2gD27"7tŀ^-}t[C*t "-y)(gņG ./PצC|ה(ۊ=~5:MY~nzZOy7/qk7SG0<'8p{D0$>1VþR#(%3іߵ\0 l@1y68D'ל6)V8 F JͲWtKŢkc``_&1}Y[ER$z(`_t|*zT-2h܄giAQ1E`li-؄O=7U+A c co @N]fųҎVX'uq$Mmؤ__;fRzuv&QP;#jYߵCr!jS7΄Fs8Kk21qoȨU-ãPc_QW鳱WQhWC+c gPh06[o/MQh&?x^p}F$B!;YLwlsUWdn<@jBZ5375( Y%SV+z+?U(QWkSAWymKkm+&MCDᐂ^& U3m>Sg- E~G̹D&&~rl*AhFPdX v!nQ{petZ 5Eav O[PPOi먀؁uwya/oA5uBn rsOw7TS `/tR?Wa d6";7ls8D}"(;7'+VY@}[$J/u8ުTтhVfqvCw!I<fݍ7o~:6 FTF+NRLoN3 U[ ^q\D,)Pi8s]T+HEI$qSٮ:̣_)v#u 0FПnڡEfH64ʸa~<7Gkwjfs.zm8>Tg_j~*XYQfV s+E|+~ZUmpg8wfg*9x~c m4gDtч0!$eL 257BIg k2jg<nac^(cX6[NH1!ju~av+ensfAQ:s^\Ƈ(٥œjy5EdIuRnpXEu"bż D*/ANQf!tFsg4!pZ9–fB8+YR=h]6laZ dӽ+?RseCq*J0NZYDdXYmtsƜ*}N)=ggD>GbrMvohO!s3ȗ`›lsQܛX])n{4>7и89?7mES,xΡjg-:$7I?"n>ž=UT?a.^Wr' Pc;{D(8rw iKlUZdDs?DU>ˠz/6jg¹|%HsaDd*wlrNKv~ahh|m/1V=it *Q"=+}&?0a Poڵ^:^I{RN,FVI?+z \uE 9 Tk&{Bk(eK e@N-\X+T~Ao9[)e!s*wWL=6f#Dtqvix^~ Ǭ-_":y n{o.mb!ͼFNFK<sT<_E:r wJw!v$f9فWؚWӪ;>!'MH=eG֘sM)o$aL N[#Cl%3s-* 5ONFKoM)8i!¹HO0i1eʊ[9r)!Id'~B(CQkuS߾gaYAtPhT,'5=,pU-7QҼ븻'[nzN7}iW՚v> ͯxݫ!ktk0}7^\1vck/U,Zס@tR"_UBR6НM,!$#@Is \o1Z*w¨!\zځDsR-s|F6f9)we*D]l`ڃmbJUP($o8"`Bxbc>-0m:%C"Xr|n>X&r:#h"P#Sa~KI.u/1yvF27dتM(O=QLAPlc 1j !c1+w>WM->TۘH$l?-U7_r5lY[vn 2˜M,_`6;rG.3JL-f*-8i=2[@3ן4P1H۴ObA2Uaݯ I?-cnc9$ɖ!ݛ[R,Mt\sN1@wqp("rΨNylfrHXPk2Z8I8|^ϩ.R!撸i#L'I4b&7pD0K)OtN{^X/ӣ֓ru;x8/{U`j~ޯ>lH`.1E}䔴W|egb6ҩ e=6o(4Oг^}_ vQg%;Lű!@$NSA x5a"\ r I6wRYٷن|;.p :j*33:_KMޞF$ėg3v<'qcy8qL 쿶Ftcd v]POׯ(&(Cz^Fk~_h`&EOjE;s `Zc);R9}oJa՟2黅QW1&7b7#juh[p>{10("),MXٖ:"oғT}V (N52^=Y`3fFcy1`$F4_*W2>+HId]*&m?weZڂ/4Mf^g#c4╳W="8[alDnrL+%I:..+?H&3JwB@2^&&4L` mUIvq&}IZa:ۼT&o}bl?5|ڦ=*`ڀ-`\VfzXA`{2 3FB(oE)43 $IV~IQVSI[pXn(맺i^.D v?1?| X(ZPo /Ifтho c+(ёQ­R7\)2̹$rb=B=Im$Xx36>FͫQ{$sAm>ϔhY̢8c2 PN~,%< QϬ7{9M3;"1/'p煖W^2i<8b`+rds$R)؏ht$*,:Nbl>UkUX L|n)?2dڞ)lXKj`9C9S&L+9ۍ*uM'o2M*m%4Vs ~e!'?NRœ~)_c XW T}"̲ ξRيly@3cbJ#@B8*nj5d~؅Jv<"(;82d0'飔d%4_'ڎ8bd|`(ϜG(\V,3,Ӯ~^XYq|&d6)񵊩Og:O<Ԙ|Kw[707Z^>l!- #9[q99z;%JSHa,ٙѢ&wK$)#_q]7&^ʉEfנT lnRiHNJ]fŐ . )9Nm&B">äm(%)(?WvqĈCT&tDW;W^^H:n,2Ot?¹+1] \Owҍ PE L("%ˤ9sˋuWYw[wZd~pY[pFэ΂|__h/Ԧ$W'o6L]tRDDpBx›ZDVTBA5̭YcLq+طc>"iTP#6>k*}*F!6Dz 8 YL8 xd{Qіzko}3߬sx[K䊝B~V#jc8o)9&Fҁn {l~ڌ :S귑݃:9{;y{xWJi }F l ]"[^:d7,L௦(;^sK,cb*r+G_"$7o?^[ARs+{RYyx+@loQSd ,D +MdԡmLgsd-R#E|#<Œ 8ױ 㳚j/N; 묆e`4߼`xz R;#S?6k/?I/C'/dx*'\[0u^ip1:$QfjWŤ HYhiN1&&L<k;(mE!'( <%,X 5I9h@.X}Ĵ~h7;4"foZH/m߼K~)SG4Y2Rp`ָ  2zHв@ә e Ɂ0{\1^j=,֧d78js+aKIjrMwV|MjPҡӕ!iW'_8wL4eӱvvMdn-LJl de+/pPʫ/Td `FN"'M #̃,G?*ex_O /%Zc޳ 9%!c%Q&ݦIuk5ɂ׫ȷ^v$TT}<523c.DlNgȇ3V:ֳQ3PdF]j,8k Sm_ D}{SB:ӹqԢ`IT\ |zBP6>]2sdD=*|XȤZstdbC^x((}h-޶ƒIi-b5Ν$[Xz51!*\Е3y{h)fWf_r@>FtKlA N8t*Z eSPZ@V%Ƥ mMA ~%hNp%#V]6cdsBgjbpVC+H1"@@nx˖&]zεi3}16ÅF%ow?!}QeCӾ*8@Fw_9#-lWB^֠Wĉ1ϟֶ< ԯĞ6@RfyK%lhܰ1\Ƴ WÅoQp>khtHƠ|!m[֊ԶSuAm^ZbYkWQ[: |.0Himq i7n%8nz6M&; >Ũ3h0c`RXUK]+ <B׾Odg5/*#ԃ#COEXFiMFTtʡ'30t>Y+ou16nj4q.2ĚﬠZ[anS&ȮgKUzJXUz-Dᢆj c fx!1bC2= "JM?|FEo{s` GV즴&7)[vwM_H rJ8Om3L5=hjV xSݱ^~L 0kc!`.v;heB>uK}vjrP'ۏ8]\&TGL()m;Eme ݒ旓2GH5$'BAh;α*k \N؁xm~ fHҢ8G~!P4S.iM+Emk<.Vф08iSZJC /a'[ [3d?ӭ5|ܠ~X,3Ĥ!ƦN&eMJ՜ŗnyUmL-$DJ'$8\ۑ4cISc+MdsaxA|Pmnwx(w*o]ݺYLYkR<Q5կGyJx3֞WH%#!\Cp+{ƟQ+/2䚙qNDQ& >EweLdULJJ%}'Mo+߷qQ&KBD]p*.0yh7(Bha5IWBϨf`Ftte/z[E5c۾ቶH#t|7>F,yiv{/cdMu wL6w\&Ҿ.V>,24%^1 p-y:@7}2 VG Q9^Dj/<> }-N@b݃lx)֢%jmI/`q*$,cuj䗭uJ{+]>9\~zvp&== 5/t}v Tr8:BS I|>]ljAXaFj^ő[Iu=khG0030 (l3EEy=߂nhM.57R{ABƤkXT5EdZROǞ_"M" r_/m-dsM`w,&JU/:^p"<|iai$Xsֆ>K<#b+  G&NNdFN4NC(ٗ,wK-0cIgVTnnn~^(Yp 5YK[OЛ6MD"q4ÓꀤJPwr- ƸI~S}ӎ;^^WN䒈nw g(z2  \2PNŀ<܄ W mo֗=PHa4!=Wyt.R,*v`.ci֋RZqFEE@bd+uV tX'#Xb =HʆߐPZfuA L?\>x '5!EA 㛟4hZ6@Yble ӒX^hk M&koU&oQcȒYzFhs.~3dro* rTR,w 486$+Ji#9=t+ IJ`&W b6χD=eܪJN=cHl(ܪPvٙuHe&^.&XkW1>m+9٢Bn ljC2Qåz  #uʿ&M#eܐǫo6ҤlU_Te+6l=XdXE[O6\\z%i3,ob3xgO_d.ZgH*#I7wU+ԏ(CdE꼏w%B:$L 5720l|9mJOfF7Gw觅Ʊa$7@N͉3~6OE-CƜ{U1<)[l7I:9rkhAX98^ͭO+q⋲Nyj!⤂wX:/ўR،whIU/k-/]F{~&2}:6Uܴ'a"*7F/d0%Zhagyu'd>E(T剌B9=>GXB+Tx+*]T ;/q %󲣰?}<̾N_ӌMt׮v[1V9ǐ +!3tR#f3Y{]Hm?A!{`a,H_]G蟴;yfY7:X)|PbJ7]pEW |"m*l 9YljTݞQ]tXaOCAē )YMuǻ05?JFjI1j#XueCRV(HѢ%h9 yhw@ܣ/il7v.K9I"_`wnN> J_ "1k@FȤqA#EMm%+..DK<^ 72;[/ԘeGAiSJ*=9Þ0Ilm>ʼn."tn'!dQ={8=Mr|WkkZQ?uhֺ߬KkX(o|{p;gW v24G׻;h|&#nѢc:wnR"%2L|3rmxPnVNP Fƞpt۾t;&Ή$ƩLџP7UH?)͟헲;.B:.3&2EI9}7ɿE$?[AD[MQg^?[?3KMlRXmTfQ<Do-5^eu^e՜si>AfN L DFSP[s$8(plJV8;eVb2syxpszեZuIH$EJ˝JMڪxfLSu9OTjO`BX  M;e//%TOpݶcui* YhTj sB3X q'FڽNJ(q5*D~؉%v&鹉u} H*!PFEZ:"g``aoZAW@j|'܇ړcq SA à @z=LogaWT}iTm#~VY`PytW:IXeQZƅ `$ $EFw[찤^oC.QTL)xa6#s- `UaOlYM Š 96[k5g<̫:*)!.)#N֨,zXY,lC!Zڳ"C-5sS"q%*$V!&*$2PB rX?2ڕ5T2=;*E:C:kmO/WiJwdh&] }Iwʟ.?lI"A={92P"~f12!P"¢hx= W IVM<,=?Ss.?9ƼkI6J @3.ZFC\;.H?$$+ $JLj$Z5;GJ*BSĠYr-| Xi^=[K |s$}X| e B|t͋䷆IQ8ɶ hoqK)جͱYlXT5ސSsԫA}E&ATX3kʏ eک<0kH!L@XoJ>ػICBgm{s3y0gYF4pW%FcDcE'Oy*T jQ6@p6” QᯕF}zWN^F!|,|~o՛n,X$)]"jP8C ?^QIUA/M%xI[K^E<7[m\}F܆uҡx=NA aإ':uv2t۹ ==ҙLMr3Zoj1șh"Yc3S C"ǰ\\Ce Fm.UQwpi0*HiJٴ/oAfa9^m{Vtg0N/G5ٰ\|Z߰CBu:~d_>}mq,~km`oFtUZ[րI_JЙ̢-Lo\i"ƵnT-B|l8 1\cS=c H'>sv>9v߳\HB։ 8xa8"fXKoA^Zs6) XaQ-Ҧ4.I:ˁ58Ik_6<@,A]tk.o*.ZIOUː%I:LLjvgi .Ex1FhoD %U32h!6(+ VCdΨg50 tf`dn< awֺYopdJ'-\a8M[aAy!nS}þM 6HYrYw2l˓s0?rew]쯟Z!]˸}MUZӹaB7^hn /=빙<Cᱶ/a? -#fVRm Mz@Q3> stream xڌP\ " 4Nnw'wwAp;3M2{UUkvNCA bh ttpc`ad)0Y((ԭQh]\xsd&n CG `ef /@utQ9:yX[Z#ڌE;@bmfP0qڃ2ͬn Aohbb)HCv].@s&Jc[YPsp4q@;k3+em@9F+_&ffN& k; @IRˍ``oabmgb 2 @RD`\\\]~+ b@7W_ĭ]f{33\[GO! ks_e;1i8X;e~,nfffn6V2b@ TTj}Ṱ@KkAb4k/3hX̿~d0sG;IQCQC]U:z| ll6.''QMa񇧌#o.?@yK@5g`6b_Q_2tKO ޺n@t T *ͭVt "v6U hlffn-ugv@eGW_O 3сp_* vQבrpL\\LAe]9%01:8\.pF`%q~#no`q1$#Vo`L(oʧ)A#oʧF|'I_g/ba)M\ͬA3+gg%oW9?\AYLM\Hn9}Fc[l t=ۿٿD4rf%:61 @;@a]6hIK.Xvѵ#/9@&#ސ?M@ܭ~Wꘕ bjMjoƜ.zP+CУw*P,57;Ԡ~A@TLg* ꖓlA_1W ]z`;Z_BG7AaLXX@! ߿9p\8_6@? zk[ v&V>`rr?y:bDZ@Ф|~E?T3wШz끞}fpKf|6w" Z4 .]H)45!.?ERQw%o׈}5BoORx{2JP[5_H Yfȕ7DN+"U TM $ԒOx{Կ ֢K?ˢDko_#!SN5Ya4z_&np85<Who]:1)x貏^d,)\ywgpTm7TUױZHlZA#D-ߟ%6.* sz3%d‹ԹD>lHYk'b hH,Ww~p/*Y]z*rReg6XXdw5کynl;Giz{K'I'%e=N֗JDTqH/jj,*nˉY֙[ 23t7uK࿭RW#+JGlgi?qld)ۋ,k.lL2"~cfGW[wR`pU!V,ư㙇6Ј7zRj-z`/CR .)X:AoCEms )Q+%H/;Vuʍ/Qg S穠3娐vP%y|ؤXU9/biR}9 btJx{whbRQ9IiԸNOԞ圩'Nd`\2Xx/i3ApgGQQ~-+C~u8JH^s!jTՇہ|cKA?7TeDNHo*uX~VFkV1*=U0<% Ƒe;)b@ؑxZ`2 ؏_m[jcAe:aL*T{= p;(u}enI!G9$#Y`W*v{7xn 9H:Wﳫ.!i* pnq#O\iE&D;[a,SkU ?2pheϮ䛺ƒvdHz+_| F>J0pv3Kv LF|/w:pIC}d;.4CݱI]EeַOCG"oiAӶ{;Ϛ#sSHv1NjZ_rP%cX#}/,v\/4=ݱ_%e'~¨ 򟑄=d͂\fǁSЕ`T-Z?gLdh}|.[}\G(OWty]CfBBD, F"ArT7J2}!-:x'ܢ$B}%l蕺o*(H::vqy^b)h}5GYDFMɠ~ӴUJ_tobewbOnp$'^"hO7Zɡ7oWb86JgN-ɪRs1ӞdzS)4=SCWԜ+W* [$ZĐަhR&vJ|7(c: |p)dEM9$jbgj v;sDw7hHmfp.MrNr`-M}.gn: xmc\~c@]ȱwJҟIqzWm|b1WxGwd2PS|Ah]cMmX=/)OG)2ɤBY9I?wMEfGֿH~ݸkFsކ2cج"֞g!FmKGr##hM RdV4i6 a0J7>E¦``͆7]Q "ɜ@ƭ #C~fLS_}3;6 'N೤'u[Y6I0Լp};1!({*~bV xѯ&Ndp:~j oj)Z&.< HQl}O"(+`\ENyGqOPfZ%cܑY!0ߚ F.WGPϘh4Vd=Cpo _=T'IG`sl`9}cF{u{W~:Mv,,jH^W%͈;nOT⸍/")_!$\Q%z*9_ڶUMOZާ͵Fh- grEʹh- Kˉ,^g(s2Yy,!tQ!tҡ,I>$6 y.]5vi :5r3j#9]Bo1Ovڣ'm5 6, QR>' )lqf0f0wB/$~@ݜ] ]mT)ߥmfT{˺低f-p@.BBmKN@;~z;W`i: '6s§9q%MtQ2Qآ4 qUI?7|FBB,w MGك槥K}zYZvL4ǃPgp+ܚj\^Wl h"ZRI(tEV IQ{D }5JTܘcO՟H$©_XwópMtveU?I MSIU=m0Ynn>m4,qF柡|rśLUYsyh*}* J= ziɔQP8{6<*te)v\A#-r?A=+~:Ũ~b>B[4'׳ڍuk_œMM\:ٗqͻ+=j80 Nڳ9t-f_ _2>Ge~ᓨ?4ȖVK꯭{ )~7AXX1\awtS - UDº:,:!aQDIU珥^n>W9a`Wұ]Ĉ-Fd wbrm~Be2Dyڲ9-J)r .wRHMbH@ ?v .d`v;T\f9_O\ 62K٥pRsϒ[.zk{ W./_+- j v.bm<脉O$޵&cYpen%jO9E=eSЩnx$Ɠ)pֻ0V`pƸxC4մ'&4Ŭ_Ay`(tȯanC4 j %A⷗jd,m$%b9.9ӯNW4#ʨ,.x\ aU;l=oOwxͺ8J?D4dx\f Xd3.ަ UjR՘x}$Bݞ‚)VQ)y%5kZM@8£!? C y-|WTTds0dh<2qadu!fte՘Z 3:ʐ-!fBF {ey ,!7ϤVMEWZڎ@HpAD(2;A"NZC=MR3 lp.j jCtEG)aT91.;45"*]p%qR@!&8 Q?)sJqٿiMn1g9al[3}ݫ8]oĚY~ 2u 0I8M٦!nǟ+ 4OZ8Ks 7v!sQoD[h uƆrOԂ`17-aL/CqL2sE, c2ebʈ}em Jj؃뢔@-琎ƹKWc˱i*x[OLD)ߏOVoCr 0mjVtO@I. )ls^E &eRrWk# Nf뷢8kj䉴#=@&ɃқYƂC;O?Vc CP}f=f̊yRkԸO|sstdm1]۾See>? ٴךTY@ܕJn|0Lj@z݁CVEPscgPADU c_pW<2CakoaDP ,$ٷ-/l(3"ϳF%;zm_gg'ٜ"(}_]PU$q[r͓4;kH@(L{޽CI-&fHv}6+@B{zPW ~GmpM!$ W N㔤mJ"@\K7Bq6y)ڷ~noX|kO4eeN*]/^*6X1-~tٜTUUGi1s&Wb(-6VYEyS7t}GQō8~L[ NnI,dM:Ԫ$̦8Q=6;808Gjhq}=ѧhŐôh{?S%lWas|6އo&pţ'"Ӝ}_ lf2,JI dh|dTK}9kAn9ҮZFcEҎZ^94T āMe3=G>*P|մY\@U&!+WtL5B q~w%$J'C*9VJاiطRj Ae׷9f Dʩ2T_[1^TÜwVq7[i50qguٛU9StX}Qp;BM .3}e.K"2rMM˭Z^:R+1.dqƛe"\y)4ݴu>b=~/fҨ6NE h>p3S]Z'+INb9=;8%5͊ĵSYJj˖DcdwEoI۶ yg[oH\hn޺MKH%? Eؓ/>᰿oɭr}3[{kf0 Cf^Ŏi2ik(aS"U.i ^ OuLҩT-w:kG!K! ezw=8>h582 tdV $Wɑ6v\$2Z`ٱrEt _`@~Qo01\}8]3CJA쾐Gfk@k.~T.WQg*=KۙʙPfKBsYcveEn]ڂnǍ2pRZ,TSQ*6 k%g^)'wJc"\ѿa$-{}j0B@HDs*A"5Yq6Ga [##>o1֬k3 &FyBo^>j7ݪwxɫ{ >?@$FZȵ֨XWnÄ7%%h|fz, ԃVTJ?"R(5%Bcp3 82LH)`[u` C`Us㜯ُ?Z XVKߝG RX~MRXWZܼor@Z!?0 n">w&0S3Tm^^{'p{ɬWxQ=;KHrj"DY}_x"74n=yYgo=iUʋP(-67,WW1mt]hBV!n0xC(&q<}-o+l&*69:yOي߽HÉޝis8PsD$М#˩kb1޳{l|2 /i7P,TO_}=gmM|z";+} .KQ˶VOC}ѭ}C}mѳ daXerH&Xi$j3̢ofvvgGg44{_8b3eod,ݨ"9v91 &j샯Lp PFSbC骼V887!VpP -he{t ,>6+I^j261A̪zbLk=M#܉!wSl61K>OWw8쀛s]anHOzzWCGhm"Y +18HÞ$n%AY.ssHg”ђyǕgdI#m2!pƟ>G[Yۈ_.N #T\+WO>lrULOL&;7UEHd;0qi>A, EPmu!ϲ`nܞ%szzBt\d&-f]L94]ߔ-=J9rq3,Yj N ۩oL슉=r12o7#ۺ0%].3#wTƎ)NG?TPKLӵeݔJyy IS_ &VoDSJMŢ'g.+Efg`ep(7#N'O!‚%pL3ЫgK.#3"2_CE8w IhEK[%s ~ܿT_ ʾ.Cy IpzΓoc dK7~@,gS+KF+F*U/4;j=6Nq >b0ҟԽ3`nƸRجǍ婻WvJ(G㐀6?6q}lUt?7wF0F!HIOO3`/u﫳>. OMU @2WS`k ?~Zs#C *ӎݥ L7?Y03eڡ~+xOb5e`/0~9|<^, c %UkSѵ48:l,6y($"e<.RǺRhw()Ek,)H D\j5o' Bl<M]wRl=Flx{Sdf&&WٯO .OF>%My;n"2 T hs6Xf趕G0w*ٶ0Sk;yֿ n5&LqCm4 hC'WgExH Uƭk^!&b86ci`тEϭI)r壨e okiW`Vg4KKHNvUG22HL)@`J,]3G,gc0=x :&oLM=3z/Ur>6S!6.aDg=)c&mp9mL>hޢ[ 6*eɏ }?Y*准v=rCy&|j c`* w׷*>m8 LU*aK< y#0L"" P7ou5Ho3Exٿq{~)H4WaΦ71$@6fZ&ꍚ_ߌ$o_w.g_TL}D1GV#u`xYS)8Pk(.G^"d2:UwČ0qdg`wg E]|c.jnc廂&}gDb)ޭIb| mfGu| ' u*ܴY?޷kU}4 '8WPq qaw39NAl]8xLZDGGmf99qU)4u6涵 +!%aWZy>4[@6װ{asXļy ^ܕ h8G?Is'ihoØȯZ.6,/725Lq+^! Z0=P~89R3tRޛB<}0}`;ag;GYfyOCg.غag]j zW ښ3selDgfb_o굮QȨts8FS,GЈ'Yt]#$Cq>(&#GqFk;#Tv{8z)|DQ5**sanMiB*N?3{ePum=T91:4n=PS' k!{*N*8.2tYԙ:^hDsn ^8.WL޷wq9*d> .vqb]@=>꧇ Q_]:p ׹{KHztژT}F5ʙ,i7νSWM5IX$KD_RQ*ĈtFv\i"EڳFNRjE\TɆs{)毮TMڕ}caIt~k#|֣VganShϼGfrNlrC%\o[惔>P8czslWs'^SO֏ OLBE@ş:DxfA*o.ՠ:;0E>0*-rxj# Ȭc0 d۽ׇ*wsl?D-rb1/oUk ^j6]:z;#˛Yiݘ=~K M?-ᭇӹr,귻]ӎߔxwqν9*QϜu=?ĝFTP4[s=rv.>6c 3Ki~¼;ۚ =M]6^M',߈Jy*^>Ol_mos J8 cnr2[Ev!6%q_`0\ry=)֖o,'v-Œ]]ZH|€Evw$CmŪ+!8Cؤ]9_ES\byf4 I 戴"'f;F^Q FpF87RFY4.o`ջRe|:bWX;$[b.+:1k ˣpRo!9?4=Jk",,Rz/40ށRG Ra}:%.nw5 IM)xH}VYx]N5sj}9Aو9⑚ d. ;iu} `O#b+(VQpX"(n.a;jSa~v?~cw:s,:''{0/2ثUBMCF:kZSv-Ê}+9rUՊ*#ܚR%7 qEjQ! uLaC>wø/cQoȡ_(6) &}Z3 ocKwL+N/P n뵌,/jLfjgo!ڊк=bCHcO1̩jo)_w&7.G\#&FHW˙r|8f5q$9Z{M81hzΤՖ#$0Ứ7H@x9_T8V]]KGZ a @&TxqIGؐ nm}ww)$)w2`戏J;83_=\Y`ZH^bbmf4J_ԗƁ}iޗZB"YYGތwI~U^ƧCS1n419~lk8N"7Gp*q}wY1^Xy7AV#Z?H5ruܷ_S7uH8\ŷFܖnt)M>;⋰kU)yaWGZbhys˓5K9?+k 'jN5zvCd9M{W:oI[v럇N-+b;HR3aTS_d\MSɛr2 {gf!g<ۚv6}S@ɯ dQ ?ǻWo,I`eHsP&nDcb50 D5 z9n&K!Xo<9[\_ߎ+1 % [wC>kmYx؎W}xt?QCeph[F~"hT3xT02OUX7^o'sr̭x3Cx9zCm;)' $PI 2ovVll>pq#΅׿c*rffCag 2uWx\q°Z `_(/$L7Y(0Lڲm~ڙޡP]yhN%lo `V_az40wvl#lDhq??Uɬ ZWdQ$\UBu =Bڒ|~ MVӣ$r􅨷Z*HPGae Y~]s*&ж=d_)֩ 1Wrs)ϋ\g99?fc5<Z%eF99d]dm`<8 mLe L߅DW,D<6,etUY%~Rh&&\%u=n3I/N!>׹ {ctPN$ Ü[Ңӑ?Ne0^$W1--͓H4rHãim]H' ,AabWAS㧽%⻺G!vUC*җ:%6jCw WѶzh$$KoR~3QIy?Er{H%r{׎ 6b[іjtU3)\xdhHFht8Ɵ1/i{ *Q{Ya#BZsga?G⤆TJNjxj:h39.ruݱBPFhp&k~߆aos \ [N}7rbuPQPyea.~Q+hFE 0]m {'}=ջloŚ-_s⽪ 2 [U4r+B50 c킆YmP5hy} +xo߳5e{1F![$f%G"h@-?0qj-|dRD()-#L9qj]6aTs tܩDθBZ& 'R#5/Er-)Z<m4Y8)6P15}wB RI@oɲr}2 ?tޏHTȼpmE76D0cAwp"2)D`Q0_0h8Œs"bNpEsb gJYgU ΐie}ZXGoчnF휳XݮyE,;XMhĠlJ"N.yuu oqܪ~JQ$Q V2ro}S#ۺꣁ ̿1M7è/ Q  tkO#߯qD}lT,vZ$&;yIYpBkq= Gb~ve< B߹K҈J-Zi& 9Sa+6H 0Ð~0/>HME ߁ }:  W4؞UwRM[S2&"ߨYj}ݍ\4f,OY՛/JUǤb~6'\3^[Mڴo_("+/E s;`\cӧ%N'`%+])l˲GBM qVajh8t:EI*?I]Aj_&ALv;Fx#0Qj Wek5fŻ3PA)Sw&mlɰcd O!M "`ݲ.밇P_;1{N)W\# NGrRho΢ۚe< K&[8+yQ$I٩I%Fw}jN%DKEXDP H$Dz[$7oC6Q"19!jXyY&Ff3[T~j>f_0T%z^pc Z4#5Ã,+圾60""_ +}2QE7]]m3W)R""cl+E>8yDJ%.L8zRH R?m3h!ˆeRO81aaꄉbPC}H悊P[bKF*^Bu5۶&J|4JzҺPǜ2¿ )}}#sV0 .PݽbЇvw0!o'$&֭H$evR^ӸH2؎M~Qi hcC;PN$?|&0ӼUG+O+aTrp(@Vj-3S~]Pff}.lU|0$mq_< qp|m1fؔqM\ (em%(L!/q2({Pavsetz{欫xJ]EèwYy 8N0Rz엌*E9T!v}Вr\B˲Q>r!P􉾤߳3޿ӧؓVO ILe*S_q7qz^r.ТkٚTl#ݠ:q*Cq C=[Xv*@(/?f$ڬL72H1i pu%RLcok_}z[0=1fc/ς?2,̼<>m? gs0C1){ CS ,$ߦFZ/,_K# DϹe=Rh=m.гmy+s '`qaų4*˸^4zSnr~4!KcoՊI#ɍq`¸^Y+E[l(,ҷ(Kv;D7L7r&hb3I ˅x.T? 08NVL<42G!`£UCaxFC:/I>FdW8_lG2do˸+VrJb#3AB\ ÃMT ?)Óϲ'oj^M 'Rm~+g~X#Zn\l=Mp`~BJQSK35Lσ~"@|ڈuXQd,5~?咝6Dr=⣼LY2QJEd|ŶU>K1u Y6ўaOJj*z9fxL⏘k* JSZUC |{lUOP0h@q)fXe{0"'< endstream endobj 199 0 obj << /Length1 1613 /Length2 3392 /Length3 0 /Length 4412 /Filter /FlateDecode >> stream xڍt 8m^kYfaɒ)̃a03,Ð([$6ԋ"dK,Smykkf~ι9;mTx;hF&TpQÑp#Fy*L`L4fAD"&?(p8\ @ y6;NĆ <ԏx@M bAF CwxOwГ@21tB0C“IĐ_?>h>##r0! u @Lb%(+҂APko?_j(!C_58 fOY7 "qӭX_1l 5ZG+k ZаIğc$P ޖ@ym icňhK6@z77] 6hJ‘ `)lo*4( < Ei0;B0O !2*_  "oPy`^!~^Do^h+`ߠ Bƀ BS~@QXo(7163P(Л)zh AO_][r -2֮x>i{Svz BkWC"j%w}>'.uz*u_Z}d0!IxO{A]sc9ܻ\5ùΤ*k{ SB[[ΩiTz`:o>j#ߔ*/HY.oM)KKߦ̳ ыuQ giەn[ :-MZ*?TJtctAI|\R?}D}g)4aݽBPSbO{&~w[h,y{ kHh!xoZ &{DLIѩ#icM9-stE։ڥ=Vmrz$_vVT)Q1g59̥2ob70LT̮q]v!|rt/`RN|*yCg4g%jc0 `+RayeFAN~TuY+(/ߚ[d]ޙweC,߂s9_DďDwNFj·41Z~ ;No tg8`yA$!)/]14J?cZzk 6prE\43ʋk'J%ꜭBpt$ڟWbXb8ʮܝ\ע\qs"w_WpWES*KU4e_VaQߊ6> 7T,jҖRrn`NVK/23Y7ݗ}0_z/+.Ҁh_H3 vSgfVbX[:['w5{U`yK}6az[#La[Ml5Kϩ<Gn-:V|ǬNRݯ*O?l}s4щ vbnݬqSd\ {6|*ǣo'pz_ku7Wjg=whS9{S<"0UNc2 K}>qfncIFM 粱XX®xN^"6a xYWpsexҐ  I)[Nx6ͻ ]X#;(F2iTHcOn Tĸ9Bʊ Lm'N~{8M0dZp>+nS4Bs{k!rݘ\6QU/VZE q94ꎒޟ~$}G߳^3-|uT_BR_HKM)@lV݆Jf/|=}rc:2ꣶP(JlHvq'~oN c>W5>Q#̿5sFM*<v'y'x h͇mLjP=P3H>++7L4YuAM9Kp7E`3.'bK]lyw#Q_sbːbY?"sLx;i)1 <%ztӱHR#Vqe-G_Gg"^}t >k;^15' N =so' LM 脹\m' Qr]Jܡ1w?X^h*m(76v@GGQ"{>ߩ~?pXtEkf zaEV'J? Y, ^'=E\ti|`O;yA N?%)j+2UOe:Ŷwۖ}e܊#>02}٧uEa]ooW/^F:-5%DŽX*meH8rͷ+m3RǢ#6.oJv}IxlY fv.[>n$jد<V>񛰙;0[}5M/혂M _e 揼{T$twpӊ ƔTS3uq}, wAV 輲 0I'Y>6j֍/r1=Sdγ pԚyx,ŽpՕ}mͰ/Y~7U3=MiNb2s,ٱ&p۶si!4k*2.A«)d߾S]ΈW+?-6q]؞zk?jyKr<u[|m@|_j7^q2%\V;']zƬ' endstream endobj 201 0 obj << /Length1 737 /Length2 966 /Length3 0 /Length 1535 /Filter /FlateDecode >> stream xmR PSWHD0´*"IJ(T6! ;T0$&O*". es%JŢl"D@& u!әΛyswz2#Iqb0]Aز0>d&ښK@!☷@k!XdLK"Pvy#  T *T,*KP2U! Ġ2A|y  +E2T Q1p ;@c:I! ARb\|eA|usCr#T6+r̒ ,ј5%Ä*&JPqX7_,l=(FC!Q2YP)IHO a$L&ĨNFKrTE2|I!% P2:00X&B$%)IB T)?)} #8&K+ȟV&lI}W=wW&5^\4Wf-KQmˮΩVe[+3w$J)=d@j)܀7?˦:lǚzIzs%e6%nRuFܻǖWE~Qq}ď9eh8št{$ꎿ}'\i~Vx]p(;Cx148nH -5U4pm1t:i%Ė.+w5nnm>m:]d_&5;R@Wt_lj^il~ >i[|V .Fْ\I0M;үȆns_l`WhA`,mk[ෙ V,<^uZ>8\秪^_r;9J"'|S/v6AJv{A/rlqq2MXFϓK6>CwyMB+597f]fiÆZޫ{V4jA-8w+Ny׃ߍo`z=J)%CF+M|_/+LgOU>&MXD㦯$eE3;qM3ٚQq>\Y?|dd>18_b} endstream endobj 205 0 obj << /Producer (pdfTeX-1.40.19) /Creator (TeX) /CreationDate (D:20190628120535+01'00') /ModDate (D:20190628120535+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) kpathsea version 6.3.0) >> endobj 164 0 obj << /Type /ObjStm /N 46 /First 382 /Length 2454 /Filter /FlateDecode >> stream xZ[o۸~9X4S$XMiޤE[I%n̐Mɑ9هKQ 7C9H7(OO τX+ u9 t&;VCvY"#:2"4s+""2q* XZ#ʂ| s8agZv1q" (%1vq $a0pH"$QG-A' h$A/LbQ#B+`{xB!VL7/qHhvw$q܀,N@M|jM%@KLAũ-忩bl)kb> *U+[fXh`VbG潅F/4X)_TL\m Z"ˆn_@7.%qԕ&cB3kpy#<<"$n|8S~ڷ' 1e_!Mt|G;;AR8 3$L1p}XG%(l1 # b-N[X2 zE<'q`(aخ7Av>W)W+uq? K΀aD h\ /\`ToXA+.R4>Q\tc{PNRC4r?3zz53T z@14 $:3Cj0{bgn 2'pE^wٯhI~?O:0BOo\r *xf|y ypk.zh ^5b4ףAF`i6粜qNN)}MwK!H =g^x07l7qtIHߝw_\\HYTj^C*HYDD(%ܦ{#=Z`DSzM{O3'zx6O萎(etLPl,+xD'E#"Itz72:kLgGE o󫋃 PFJW\%XRX,2ÚtF]iv;IdXOvևn,)# +GdL!ߥ`a &1H30OZӂn흽O^ Js>yXި< Jڠ:9<:T'MG h{! p'zIg4l7\O޷l:nE }/fÛA3|y6ɊXPK6; xK,I3lkaSsRZx~% okK+ѿl2I q=I54~w$묤mtD ݬöbwNQ"dчY51;@_gg!!^V-=7OݹM#[ǻӃx#w&g"5r^Q#.(q{̹gg KޙrR>M^OA?*:hlBۮ#*td"OAZs;Rz('9 aQBBO~0+<;%M-ƶ ]Mva`%^7~Kixci Ta: 64c"iv"Foui[Y Yq>gE>*8]+n<<t=ΦDNwe#x nM"/:G ~<[5z >!{WIDs%URZ#Wd VUh+: 1k`yjys,͗]+ֿ:z[F룣Y+ mktq\Y0]%JJ̪}N??t|5x)2_ .7}aM #VP8!F$7PnjzYAHuU Կb#hMZdس4$nb& -_᧼?+/:+E]2xm$ߴ_V\?Zեtt%x#עt䵋kuj-{z~+ _5ԍdoz/VO?szo`褬l xMu+VgE72Ktj[/\D7.}섊5"zW /y{zufU]o@$.~jyW3t:x]q1 C!Xx,z!262~S!vG KH|1 Ia\i[ C|v—GR+lo;a.` endstream endobj 206 0 obj << /Type /XRef /Index [0 207] /Size 207 /W [1 3 1] /Root 204 0 R /Info 205 0 R /ID [ ] /Length 573 /Filter /FlateDecode >> stream x%;LTQ<,]AEVE\(  [0FcE(,Hbi6jTbԂ&64gz̙sO̞539YQԓjl ZR|z͛OE|Gi!gy~s<@.K2%c 0W39GF endstream endobj startxref 322998 %%EOF quantreg/inst/doc/rq.pdf.asis0000644000176200001440000000010213513032730015663 0ustar liggesusers%\VignetteIndexEntry{quantreg: rq} %\VignetteEngine{R.rsp::asis} quantreg/inst/doc/crq.pdf0000644000176200001440000144342514470135051015117 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 5012 /Filter /FlateDecode /N 84 /First 679 >> stream x\YwDZ~B3/9ϑ(іEI4IY?!hԒ_nWD!GBciP )P)+ #!(6" %=5BiRBq"'By 9д ; =$M)&Z q#N Q0Q'ay 0t&$4Jd2a#Fc&!Ӂ X!B(@LpJpyp!)aprK&@N4>@X/ "8%| EP `,uN@A 4/D ]^qT"4ЅLQʑ|TGʅ<-( T!+4g $"E'*"- tO3P]e 3"pd ଈAbP  ^$+ *Nt"{Js&na_y LwQv1#X\If(I;ݎ{D̾>tRV|}mOEl>~4R\|ɏ~JzSB*@"l%\Jb0 E۷S?|7UE;(W"P 0-g\%"?СY%+J!($4ȣ} m* w^WšR&} |\* Ewk-D*E*!p: ԶH۬HWlHTE@QV8U9JWrZ$<~ v}*Df'Fod0fk,ymZ˜|B1TPT ޗ$'7FG0)Pv0Q3iWG>x~ʡ>'Ӄf khL>jf]P,d"iLLu|z5\cɳGt7b[aj+~3h5 U>k+q9=~FϞ`@W1?g?Ui_?::z|o>pu߁ͼO_ ާ.\krj3NxܾV[ޗ_Y.u9nq|?ÑȸeBf6%M0J|brG&'qkde5Mx`T4όbGDn!FLvu%w--f3HO5e(L#h.IB0W5n痰]&_VVN"g4*'b΃dRB}P DEY(`Nvvfi2sZ[LFtj'vFa_M 2X%o {d%]D:;d1_վQhD%3}ԝfSߴ&^FdgFJ@0N[D}I|5Ugtf3ɛ, Ld&&&&SK&fҬjW⪕zoT-׷vCiY\- o9/,ӓ'Oiuo˩ wqvՎmsA+4X*ҫQl+eT2U wp:Ū{+4)~HoH[P$r70d DtNP`+ggp?z`#?!gB5~P7pd%=Iu `bq.INjrU/hD4Y=h1&in@>-(FQ#p Nx}X];*-BSB[ ?E}h3r+_I.D72NqB󺴥Oq׻vi Fr[@VllL.0Jw'xL+Q=lދRS(3r=J\ _nDֽ1]7K`/Ań;KKV%u'.'넛9Bz\Ph%ĹI3(-2vNV4  AM`UH(˩yd Tٴ-L:'Ȋ6ѽZ^HZt uBAJ;Έ@&CC kю{h\ۂ(7-t:/sƮ6qOOm`[. rX6;!GO2=cBc)1ߣ׼BjW4X'hm@ {cO '4mrB'g!6ġ{x$%(@*iJP^z%<#Kꈒϣ'iYٯKGqr)v7k0,뛷Y:4 ;>(Mrf{)fFٜDhؚGUNA,KQ2:#CSi>fNT-oIel&avxFUe I|WY>Lkg`VݳM dAY.!Ⱦ2H8DSkIq䌞ľ%yL _."#&!ؒ=Kq' T,GFx~4oڤ ,i#IjC(z4|-bVG6-=rռzCapTlˊ{Re(V2B9:ycs\ Z* O6mnn|K[z o9ueN1*'-f̟X>]ڶ/Ii Nyu+V:y "[7]L m' o^;K dV>DQuy:Jj.`Ώan˽x^XҤ9Ѳ"T͏m Ӣ^o^֗uz\Oi}[ jz H494Q^>+JkS)F|?h NYŕu{i{ O켊ߔQ`%;i<ׇY~Q>_կ7o\(oidz>lmn4oN& K\_ћGv|5%L @OzzEyXןmo:^ 3Y" >հ`IyTn)VGAXʃ :bc:!pf_~W`AY)[Rr,z w<=f.u$ q}8/]wNۺM99kb:;qb~Fù5KZsq c> !tsu0m=Gh%,D&f3 q;o{v|HAx^0&{1\ոmiph;8іf&e)XYsCl kOَ2YsPE~#tAl38&p,߈F_`,JԵlC@td_gd(UVV-ř4+΁xBQw3OVܯh7{[/jlx;k֟ P2D)vT9U҃*Q]$;Q~g;an0Y3O<?K{M7F3h17쒧?`Np0e61z>:fo_ܐNN`{'v,;|}$!1O 8OD3oa(r}/7<1<IZ#[}$fQs־+Ў({Yh ~q82_Dͩ=c +٧u'o1+ o/ _/4VRVUE/fi{۷@UĻfz5i~n<-kp+""x3A9;OcG;Fm>a3̷BJ>vpqJR@>?/ɸi6Ks9ύ^v-cendstream endobj 86 0 obj << /Filter /FlateDecode /Length 3552 >> stream xZYo$~ׯih^8g5=i Y%7(.R z|*GR;Y_pGHwѓ_8f v7Sm]nO/~ ﲐE% /,"Z x{UR@e,jQ;p‚Ԝt,624 ]o%Lx !غak  @==jb䷼E;&Z"A0w4EXTwנ -|hHxÚ||rʲjFcq%j=y}І ],kBMe XC @5$Ge ohs &#-MD 14&:6ZN86Cqvf=xpG3䃠;q۸OKENwaOi"1hAU92ۮaҤv=-[P? o%8 zhKs0͒$FQzK1PGnvr[yX1>'Eaj*'2sI!Mdg!KMe83i|ExF X#үX Mŀ@cI([&Oʁ{'ZD%qDzn~!YDF;s^opVb[K;ip1l\cNHOqY`'M (uO<ݺ:<2 {f3A<< c R i/X%{?I7QMMT"q辍N 칝9"i! -!@rI-*D@.#e^Hx.x5". Q0#{t`.EH7aM,)s GVKQK]qX pvnٿCP;F9NQηVa%iwA'&D#hyJ-r<~KR0tl~RϢޱ$ |.& _QB&}.6N+{>ci;>Չcqŝ9!@٬h)7թa6ʀ8m<:dy,'SQ rb6pcBi} .j!-.(_pmG 1d\E,zwV𥽇vJ cV'Ų,~FF/Fg]-;N^u*̬ mD7%2Nb%"+'*ydC /P‹ڗDAR83.aRXRPUvҶ0– 6 ?Õ(+[(j]2Brs4lcWZQ2=W.D_`h]a x`7QUA u󘓒V`i 79, D_d\yWm r+esι̃s R/ݰz9\DtR {˥1 Pg=Uv)ʈ%襆FAc F%P}/t։zJhƾtw>cdaӨjӿey+;~{4mwhiq+ _=*pc2:{^$!J i ^$Ա 5lSֻB, RB54JQytWc0IvYvRUH!<^eeztd!ŀ V=9V]hpCت|>^~EYF% *D}(Tg8R|\!3IrrՑE,Ϻ,y9X& 2W_#W믬_U8i?FF6NP>xora |}+Y)+[SUi &bO!9(i`&`@edO"\t̫ء;B+JՋɪ.kF?YU%UOC2~u4!ݰЍ}3><Ŝ@<mlW+ >'y{"x9ք/_teïPFM>i˰WI:a嫙 Qv削 Ǭ {[!BP)Taesld%iN*gB 3Y_&ȓ,,{;O}e ]=%yCL_p;MxPt^g2e ;`BkSAi>%÷sI]!zxg?ᓐw]޶ɋ:mʗ5._R;}ҁendstream endobj 87 0 obj << /Type /ObjStm /Length 2452 /Filter /FlateDecode /N 84 /First 720 >> stream xY[S~ϯ跠ڢq v';|yowzf`$,S)[Lӧ "3E $IYTL:ˢfJx S&h|tLkŢg30# 3)sd^S1o0,Z<cO%K M I##05HHj tDZ1Rg5h@uR4O{GSX)r@C)Pt Ă4b "JIRC\D; H)3I+:`hy<  V4TT Q (GCZi^2U0 IL;bkOhI%t`Z 5Tg LC~g똉dX$0+‹d'04Zͬ&&;Ü!A9;\ SB> +2E7O?̊gW֧xS8yl5kU{#)&v3a¡TfO/C0"E:㈼ bܠf0 dMZsc%K k߬"Tގq1BtcDDz;J99ÐbzնCL1}7SHO⤞%-N Yq^~Yn(M|:v`Z( LkYsmaSw!Eoؒ<l"h1Y3@`#󘧝Ӷw[lnˈVlf5<7[ ukröY9־ Ζ׏њAͶ6k~kt=X7BH@wVǚE;jY_rE/T|EYH޳ /YqZ,WOt5?ݽ|^OhRemQN|C9h̢XPA>J?Vp(X 5V$[xiA9<wwtbH_ L7EVzV:ғTnUyQ_ZZsp0djZr2"cӂr1_r (x-ʤ٫{?wR UՋQM_:2q]]-u:&ǣ/v݆oE: 7zY<"*tQ(, ? WN⨺XJPW2n,-3,ϟ?oh"x. n! T}Mn[NN4*1B)~ j??DzZyyz8RP)Ⱥf)*hĵp\XcMR3[O;D A*t^Ĺ;pX$e^i6bCTSOs;- }_Z7Α6rP62!mm#QVKWdpViN:cly`1Qr4sn1BAsܵ8(}70gEOUH`z3EGh7[.=:,- ;Ũ(IQbVQŢXzf2&ߕD`8Mk/ۅv}VȒtDjZ/~ף2S_.Gj7:.Ζt[Z1 ®sZ$BH$p6nH6%ڌuT'P縺R69+sA9[B=sZNrP8.WQ_ʺ\@Z NqMhvAed/|r5 M?kJ#+ZC;_t4}UVn-^=f 4ZOr6 c:)_|702A{SywoѠyt6ȶ5S ]oy o^ 5m acyx|$sC|=8} =_ T `3Ow|>)4.tE5/ )D_@E}qwnCҧ[Lxcb/wu}\(Y9Zt_U;WU]nf{Vm*$$A_o>|ȶcO@jnEv_q)%znø"N۾6H=+$Qu鎽G4qbW!IkWi߇`;6[wm?Ueszf?ݶ޺h9w;WBx5_T˶} @endstream endobj 172 0 obj << /Type /ObjStm /Length 3415 /Filter /FlateDecode /N 84 /First 759 >> stream x[[S7~_GR~J]c;[~hz3̐8Ch;n˧s4*& );F iGGXT(YrGT6"aOH 0:i)6T$֣iRL{hI3<% )XfC1iHOS,LHIɬ4ydf Y0k1%-->8fC:٤N$2$>%挣HZhPyO+\璥˼Y*Ǽ6< "wc>(i-OLkłO[}0,ЀZ[$@ &Reς<hdBBgZc$ȫd,S͢iᴱ,Yb~;逎IjjYRD ` *`FhlR}-Q҄5-4aHh D)V^e{(1I q㧟ةt`ͳwo޼ql=fdPefb:ˣJvċɊŗwUmx-N9+23+6C:tmHb]-׳mM13JS&dq,q;"mN@zY5s!?TQ84 fhflr6ٲE-_W'!_yyYFF+R*m$EwP 1,`}vzDZ:@@|o70w :kuM$dca {֙N.\ rIJC=}?a;#>'n,փ40:]A :=qs\mHu4RCVU>s A>ҁ^\SR[: rt dBp:Gv +DZ!oya@(B&B).sG$fD8ur7!+MM`.ZJKJK\pMDmJheGͱՍ6]bYiNQ&*,.ݦ@bQӞEXë|3%N/Z V/ݴzZ4^٣¼AhhsMy9="zTiR},5BY5M'LjhD"6o@osT31@Fꕟ.''ly6h8=NjlQ{WXjB%Aj2΂YmV&S(<Ԥ"\fref• 2" a[,0@~E~Oks(xwn64(&kf*˔X9q+/) Vu2*,z'sdLWUIG]wctj}S+ ?)6p8}E{ H#V LI рЁ7,ԍӝQ3]6]6S<kQ7lCu)OqG7+\UZ6@!3Wn\(q,qZC%=JuTj>\ ?":tn,Py[#^L\ "lin [9 v. w%=L)& ʈm6}QJݎpCgHkH)K ER8Fk'N)0F T`ل%AR%Yx5^ӧFFf:XKחJ/z2у0j1 >UgzA^asr3%rAs /8'˨m3]Cq=El<;>'hlR@]X[:/Z0}y/b-yay~{mM+hIC?If i]gG> stream xڭ[KsWjTxmDZoTJ}@dDZV?~ @|4u(Z⛫^~g8 2^YVI].>ۿ~WD>QaӼmWM$Ox6Ep leHc0Hwy}K*%O{kIs^oY8&`\ ȂGj=Rmpɺ#l )ah,$6Z%8 NF/.xMvp׭,{tC m2`Pwrc*צG!|;N(NF&yYqҕACkhi\SA=X.;"lu=7 ߥӾ>xBMd TQP?ʰ[;4w,3B~;Hʃ378J9a@r,cӇ& ՟,}M'y [|*} 8WU7~"ʤuEw>0dLCinAKRDDQEUac$L0{TbI^Xo5ťE 5Eڜt,gH_`+w&Z]ꠒwuඝ')Fp)gSlB%>H M`Q.3ֲ do?Xbd174)7G4vb=N er@e 8@g VCȫeqrj;T`-ld"Sy!Nί!~3sZؖ釶ZO7N 47-& :C HMJm7*ls%}`CQ.v( M@ C.a+L@)i9¥FkE9N"ph35_\IdD$˭Oh!mMb.@`8G윟3aԬг9)b!=7')AF6})v#p˶iKO9L1,$gS 6HvrhG8H|{1مN'/Ur[[@_7: Lx$ˍ|ړ8esĒ8G0ƥsPtdЗKU߳iUBOv'o[ȴZϸ_Q-X \My'V}v&%A%ʢK3ES,pw3$4LVCbCO,)Iv/@ JQ"= C4UŔ<ؖϱ X!,iw7P!&E*ty k}8)|ڙ){VG+eM6f@h NX˘K$i/ox1oP[8y&=خTjaS8j2ڊoi&y @}ӉpM4匫UNY,H2ÏUv"B<_M'bHuDyʟ:n޲(,Ʀ X|?hsC 5?owes*FYzږqZj<@4PrhK0N Ny4y䓌{˯6u:뒪.[)$6\gwv?7ds)f{鲣XJ ~2o{i ͥY`7(uY WA dMd  DHN4a(N )O-HwFZP!, F &yۻ/F -6A!#~:$Pų~/Fr܏q;"̫|QeVhUL/ҬX$,_4F%tHw؈_W?ImANJ˰*;mב=cl^MjżL$^.]sZt:0Bύ5!Ŷ@֊Uqdw?I$ +)'2#XS8Qe58=&9G9|un sC"JG|Uqx>L1"i.x[xq 9=}! R9KкZLzkfF8xOBZ&EʔI6j'D^.3r]4ZꙂeCo5rT<΀s y;y$FMFla@;ojw^Qi<@wqi;AեN8N`I߼ nvW>: ;i~ @s,+֮ =TW ; IwSڴE!Gw JmS1d ERWĻzgV>(iv?ʋf= ge^&}*b\rxze zu;~?`/]izZr8&;!;̍\YX3[d2M0ު;J WĬDsxm%FTT@¥zFsDYwc[jwոK8klyZ{/]TRuFO5_~rљ.慠QQ3W׵2HZk]^n^aPl'PHn)PҝZ Jy {x>+b{?$J액{k/kYe69R:+/)0IGY%L<[fQBjw.Υ.d0G8@bE cdŚXk:~Dwyp6dj9)#)"ܤ3!3-/ôt:oFgإ:jRT,P Wk} sItxsM(EEj)CXgX-I*`{mmaF\E#iC9$,N[~^x Y I1A>e/+$4һ iǷgŤ2T e? qNx~J .4l<8p0A~등ͦ5 dy{kΘvY@x>a]G7]2-Ⰼ'A\z/fE.QX4nJɹdS#U0d]y06[+o0ܿrEN@4c#*5Y2^8}=A۫{>endstream endobj 258 0 obj << /Filter /FlateDecode /Length 3771 >> stream xڭ[Y~%v7,s ׋ G%%=u5c`V7.u|Uz~|w/}Ug<3mwwܖ&/Y]֦j~7 k_nfQ~of} }|> _B#ÆBw'3~aw_ݟ}1붩LS2b,up.-`uMU[tDr=\nai2^~fmz~~bm@,5Na¢0=$&$xf"+}E} ޤKV*g"M$ ĵȭ)]b¥E.5veI/Q }</YnUF$)| @FԙQGl?b~Ԋ8i?V%rg 6/h 0"Pȅ'SX\d-hg$d)'5vqDcMn yn\[1E#ýsDzU V  YݡE;@Ė4"ψ75ͪbZds-LUceF&(Z1;eL U80]f0dp9lQ`UZ.$ۿܩz>rIcˇ{mgl\;uӀy%y';+Fhrme}؍a_sLReC!yͭwF^{H*eLRfʔR)iɝ7WyMS BqgylRE ]VmՇA:8݁pn"x碍/Z-(#_Hi"7g )%ѢsOQkQ:N6_%MYλu/ά93zO57%X6kS8]Ss?[BEw^zߝ9_IJ=SE5O[he7PVʑ\Pb۝.q>uw=/a4ڙ Hq<;o_,16dH1Yg4rSٚGm[hl(̿2q4:R&.:Sf>Ht#3& 0zKhM^+CML:VʔƄ.$(*kZh)dLP.qJ'2F6q()@."]xq*v݉M$r9Q7Z#N@l8(*rWc`8 F<ɳrY|X* ߁Z#j1{h=rp#~~dycS[1H%8-A9ltH@"%,YM*C_4,nJA?i0hʯ y2QJ1VIw(Klvdi@10 ŧh1\kqk|W%..oDQ,u?wҞTEiE8ϐ HKJ}KńOgu؊} G ^Mrt"t$?h붜~Fg]]Y9,>_0DaίQX|Tf_-SHNxbRA8 azxREU#&TBE~U-6-dLcR}SZOe+j9zܺb˻KLtGYN:WƝ4\Bf/>*yEo;@顖j _5%HJ.s J}:Y;K% V^N\{(W;fWLAQNƋZ73udž^]!):ӒڧK|A+Yc##H( Iu(5n+yԚە2( Z-脆pzmtI@[#sTNbLMÀF?D0XieiC"60n).31""F ߰s&%BZEװyȢL#kFB>IAqs4񕃇 ixd,*qe3W{8ڮޫ= DE+uZ"D&yBӶXoV<ڋ埁#W=-BS7+b`S7-|7*oiD%3"Y ӣN*' t['Y0z,.++Qrr wRJFh3Loh`ѧO!M˫vkS1eQ6V(CT8 |e\狋>3EPa-Y #\ "/ex^kr* AZH'8Nc~jM)~&eǪl_gCB' ɬT 7.ze=elEgkX߫jjie6zq))HB]]\Z45N "8&VJB@ѢɅ w"vke:JH 5@E F&dwsԜQ0Uq4?0r1@ħ> q,oBRB6饞yӽ |뽐Y!vcb\EvZ*l8f[vc%LUE ZB]'1)5E?KΤFe.4X3[svY}Dž'pW|Ld]ӎP)N.4΄]'O$l ko n=Qwc{o ydP7,UYVe]cE%ry-ԙ$u2? \Ǔ Mk8_5{ a#=͇`_ɡ,]\C|(T9U1荮*fM|`q?}ndn hI ‡tLݹ֍t:0:I@+}$Qب 3zgYSLa85=P l|mBDqzMp)>ܖ ZlIM.=GW2K9]֑ʫ5(%A.~iזT%'P!a;t<[P+Ĩz->F n< w :|c2`l$>T 覤xd.5tYABCS= K}M唼GpR/Ѭ> stream xڭ{<Ǒ$}(B99<m1mHRI.,b9/B1B[wy^.Eygu34'( `ag  EE I H `,b:P"`A %a}|) =C¢Ikxb(8} N2Ak EQo #z?蠀\- PfTD>@c΁Dv/ [B?Ãx{߇/7@Ch Г̉uAPx,ʌ?MX2KŠ/p'c~1?%Cm9 Kh~= kjhjB؁?"h,}PI"!CA`.4 `l` N#@ߗ/ odLٹ&R_ ) [q/nss"5Lkj~ռ_  Cn&sX1*MDF%W\͏zΣi4]`To"'>6PuF==<Bd7 )ǃgȸ}g PXZ,-0t7-eQȷ+Y^0cCBk9Q?^ĘܹY$-\)En%fJgosV+d^9翵qc phGCC㦠93)wOb M콌CdkP'ُ̲U}BU=B7kB$O eV6^pXyCFcL):fC ⚐Y-UKp[1%35][ ^bV۪YU5'M 녍7!h4AĈKe|aZɬC̥(M5>Ĭeii8tx] b$9Χڽ2}dz_NU1κm׼4́V;CjbR;|]=$Ne$[6|@pyՇdlCh3ܲ'Wozzdw?G8b 4Ζ{3['"Kl_LSr;O<ns_4gZ~|"Ȅ.gY'rOzn;4OɏxzbC*쬺 ZG񰮮%߷#߲\^{E\a 3!}I*FK!9"j}CKd'D"g^?=ͲJ|`PpNX)* cBaUh{ǭ &R~7o'WaFˍȂul8{q&Eߨke(oqK! }i75WM$RHr)Srg| =/4e{XMAV˙>'Dtmpojմ)G`)ŗ jMP2>S=[3$K.3qeF23fY~FWaڒ[ŧ$-vKq+"ZTKi!5xR]*Ě;uW*$eILl!a9Ӎx*bTy.+TѸLڕendstream endobj 260 0 obj << /Filter /FlateDecode /Length1 1614 /Length2 12700 /Length3 0 /Length 13622 >> stream xڭcxcgL8ضm۶LlMl6'3m~=szҿUkze mDli9RRttt0ĂFzf6BzFzvvw'K# hcfofb $'oedofg s45ag P103rt[Z7r0w628L̬ah$nml`>Mei `hd C+mf..di)gO׳2t +['G#{ۜG, M,L4tL^7s1s525s40Y:k|߿|J+I|WPVQ@'_L?AGCGGwZ%&lm`chfm``f|~>A064r~:q</=? ghE=V1h#V1v>Чb>dЧԓCz  @>ՕЧTWCj!Ou?O?ճ5YIOӝ_!ꯂtjC#Kǿ>%O?ٿY>&MeMϓ12|:гSSRJ𯲟IFc\p07ugV&Ӛퟳ<8Y`W6ç_O0|ތ߽vsU 2|j:9 æ=gտp ?t?tSӽ_O;ngwJظzP32//hdoodI9k>ǓgyrcppT)8NjQxgP}*''}Ӥѷk $s2Ĥ3 ZCc-F~!ڠ%!xT4 Mm^e]&ʋ»MN*#z\̳`% o7>aS `$7cƞOEml jݡ/cXgIΧrBӑoO[Vd2 OUii:ڙ&gOJSW.A6(-6U ٭GbNmJ$}z#&zyx0¨QdKu&ӯTyÌw &@ğ˰&+σ^*Z˾VNAޝΕ1F!JV"1E-ۈ8 =_ AGv2+̮`>t ~o ~k[a)"9TåM68 1)s`¢HB{LC#9ip}dtH5l2բ䰈^IZPTy8rćѪ;ϴ%N>:;Nb0{ ؁9ѳ]'({n,ey'<\nEü!+;> SPf84/`UM_Lj}xCFW ?${df̈́(+A\ ߏms̅{ ϢZP훧Gg+s^!Y- R|;IN#H[eM=k+G:TaJFJ5 H':?j%vC.&FB X,mUA4T\\Kh K5J^K-$v)1FkD'n AR0Ez.].Rv ]6[&tx&ݫN׻"m lEZmuY<.QI6ň7/.j/Gݓ/ G颜vnK=zřRgl%egجBVmQ;AKS}t[ :o7(ۙQW5@vp!>sA{/WW<.Q%X%X1gX#=ae3I*+HiRmYyOZ'ўLpW@ꊑnm}\)n E{L vY鬏;d[5Oa0r<$h\clIO!5l\\Hs&QK4S+bzՒ d$jx9|(ID:%MsQj~ũNOKO ;i!A~لN SS]t O((렩dhd9;KJ'L-+UZZY6G뤴>{3S{7ǫ_U(/v]^臎'Kn:tAbH+.Qi#6{|#[.I/ Jqxz [bLom_csG@-*uT]:Qn~4 :N < ֙PZM*Px_i[TlL}dE[5r(TM!`7ܗ,)vv =,\ڻ ϩ(I^4eֺBw5p(13t&TT-E{>T75'dSُR3=窘:8(02&ӎl2)ʢ3aXʅa,Ҹ9z ɬJZJ*bf> (:L_q?z0+my_PL3ܨ +YKS%xLMg+~]85컵$kk}qtri֞Gnb$3]_~vI7{p=o`F, Z:sQ}* |0.ףtNx V\2+ƛaжɟHS]^Ƣ-k]޸4OfWiH33QꫂBj{{n^q "d5Оt18!Qfm=*k* [<]t:Uբ]H}:aR*i.RMs jJ3t:s5 A-$.ٮ?kRՓuNDnTb_K8ey퓈ZTa~I (I|,mqN`c"dȊ;c5~(ψK'{n_=V|tot +<&CxI;m < ܎oprR ٟ4{S$ƤPkYj-څ#sC;̛r6DsW⍉5ĵcZ/i}w%(9⒤>AR1Lui4WUS +&a t]I.{]ce݊0Dz.CSdL q(dC̠B0a [3ZF OZ}57[C?򶂉mWfWY!nlzxuʾR#ʺF,`;"?}7E{K+xz;E8R5 [n0}܏ o@g5&_k*򧂖rI)w_ F0}hr q Y"vqRzyPby .5Z~\Ϭo|2> [_@\#0h>P*p2\sAJݙFwQI`1򷃆X@)E,!VJٺci$"!;Uh;M{Qe]X'YW )peؼ,4 `Ґ nWBhcEmJS\@y^qkj6y*ZFW4\a 3xth67uMZ{gE eUd (ʕyuUTmOBk~p`X硍EݲwX$@>,Q\uS #pܦps9_a;#j' Zm/9bZDx,y2僎KDFkidN@GY|hR$Z4]Ӣ+7-ۮ-E c"7ԗbt{esc&lw6=hTǣrfH7p7H[VqFh?$_[aFXTq)wAwb_{ll-ty0[ғԹuhaz#I=)g7bǓH=:Ow݆LxĜLmFR,Ҩ2Gns9c-^VzoȣGsnSsoUFh [+myv#<Ĝm)o)"--\`+Vw ؇/b/bbj w )1eŐ]`%$WpVK&s="&AS Ȳhm`6UUێR:v)',,IoEr|AcOG%gx#W2ā Fbr28LTU1X)q GrF$ZE>$pʍ$2zqwٮ ?_1W_AUz]E$Z3w<8Wkn <\Rf5{6]*4$0E>oWĀQI(x 8Mn`WM" I ٹ"hg. O?&~-.hXT9`r۶tE̞;7Ocʎb\9qLG˿҃o&!6V*ămtߚZ!k6ໞ ba^IX܇%u7TReTeIQ@y0^=J sȪSjp&~Y@KBM/o 5n#Wazyhd_^5`n ĕŚ"Xȱ7KF(#k/jX\Q]~D 0ʕg@HI>Bwv|Ī\hGs|7 6F9ܥb&ꞷJǝ,Aԟ= L.f!7u/ ˔5X᧠UQX% P.cmUHt%z|^a\ƴms^äA_*_lz |/J6NwL_C|Ԧ`'}vwϳ{-9Bvi3Lx!:vKn ད,w9+0Ic35Q-_N d_Um"!ls(ŢM=.T"2l[$hId` qT=vn匽+|捕w"M'j$t|]?H!o`$,@W fCaq>͢۱q2襁b[ h'<-dݧʃI(?˳SLGDq=9_oV'i^Yl "gnq> $;i%%Y~J:]촬bb 2F`-O nTKVbg?fFgEȧ/,}n62merZDu mmhR=",jבXLajqmhuOG$05>?m鑾2w߷xWfFBvFLzn#קL>JA>uB !L#ۗUP[#aܸo& G.şLCN#t=I|mB>ՙVSr35]* n:4i-%e1=n HVI)| {g/a:\㿵Z K3/\'tNCJ7i,ihE c#h_:&Yv"sΖ&Z{{|UlxO֤ӌ<:^D%;RmKs {ISeކs0q$t Df;.ElH`Ax:2 -$n7V@yuljASu6L<#ppbt۾/#zpqEQ^Ōr([6'cAky嚃&6u*CcA5$'Қ׸_yͨFywX)=~XcדT%fl47xV,!~O* [@Knc(%@0^.Բ-~͹5Iks ĈX3/i$(F4o05Jsח`};,p[nJFФYrvg='.۞ݮOBvY8)3ڨ8Wsގ0G8i1xMfxC"Ѳ \4; \Vn&v[Kۇ;ɨ# 6ryS )ڜvXڹd+0CFlV^ȒDB8R`*͙,5$-2+0ԼPra+Elt4vߑʲJdukf*@^s)mP^a\\9ܢ bsy;Z֏&>´g:})jwGVT>2<ﰠZqQP#%\;#_չ]-).چ@ $\[r)y00/ +=*bba1T}'_ U^GoUY^ obT~ Rd)ngIl6kq@䣎Ϸ=X7z=ĎSߧ1cN~7CaXuUd7 z;)AU d23гI`F< 9Ĩ-sڤJxJwEUsV6@>3t>6B;y@4Y{c<;FZ߬nDBn>_'9bBy&w֮vq MZ KxW!A. #;VoO>޴{xDTRKji+};Y<& s$T/ux I:חM|I&'v`Gl. PNxa!h s.!/|`0]2} ^gJCC=Mn2iׅ蠣 X =uʟ ~`7 %|΂hDlmV9<|i'+;XT{E?r =+ -_!9<;&J!X\Xy"ӄQW,2۱* 7 }Z5T|蔢) K{mfooTl Mxa{ ;NM}0[1&_C?26{TʮdlM/ eŠDQGcʼnzPQP҄$:j? Kgӵ6,L_~1Y|)HT $ĬN?Ht' myᇁb8љ #SɰJ 恧~2y@׺(I֊V9~QƗ 1ɄCІgxor]ѾBb49ob6vrh'U,*CNÁm!EEeBc T6&2n8:'8v۞2My'qALEkضOZ' oݱ7A=9Ǚsgvlj1;$Tj0`km/7lwPyjʌH# Px2??mFkTP]jdx X 2K:0\yJaӳ: `z!v-AO9&e^d29qT]jWuA Dj"y(JTPgEjjx{-$S5 K5mbÚY`B!ö:MQ /XR^ZV-?Cmp`;X&ɮy]vJMD601=rXH' cHB yx ?ԛk;H4D'u\VJ|6׋ &z2~- IE'!Q} ×%v' zj #ц\d40&oY eHWMKMtq`7 jh>/|#j&W}`Ǣ#Z itO;9)款 仮mY E.BoE6f+0y}z&dHf}_B&U^W'q:BLxHߡ65fld5- bY*%Ԡ̏I.#vqNNFs9Zs >]:k.I>Fo|w@SVT]$ӂ%{"aˏ$6\滃K5WTwwQWC֏\JzS:i[MV6f|^!Dw0 V27IK +,oYɚ#U֠`IorQQm[G1$g&ޓ=(zkI"o] 40^iw~ŀTa_yk ;}stޮQt 'ŎюVK%=_n$~ $񼚫.8: |#m HwqU0^kb&ҭɧ8qGVٱq*vooiJ8Qpk6I 9gRQY{qit[Bh~o_5sY|,3O8[e:PP>3iy: N d2-^I7sJ}x1Y8X,HjzmSXp4NU{^P Δc+J\-7e~80&,CR8 .Q|_a+H~s0g0LV^%)Bs]|wɯTa_hd$<]E8sA'[@Q ]HųIwTB\vc$B`Je ͜ʁY,a6lU8b/3,p2dozLJv?*(vi2<^S[R0fu(U>\A d(tkn/~]#b%y b:{ʟyI:*$ƫI(9C9抢 -BNoUÔw K-u)_AO/4ͤȹ?vgxIL?( -l5jqp BM)"qt̬'qi9!^@\Z6kŐ YՔoM֬2sau!fAF` =, M ;h"W)@6D%-R~34VbFu_5\H&%eeZHVE$JDALՋB.":F.~8qǍ =D^04uxhEIg j4_1 M+b UGZ,]`$ C5Zm;oc6ޡ؂1Ym-_RҩTasmCW .3YK.l'T9^D oe/]WDh!8a'F!au1I N5B78p :'\>ܨ[RYݻ0J@_@5rt:z{]tڏD2N&'ns"cN;y#茕 XOg:d\S( }Q55hޤbZtXvHC%QFYgFx?:ݾ."%j6e VE;Cѩ/IqD{Nj6/aƕ<@Z7P{DLa4- @kۮ.s 6@;s@GR=.i<$) zvhv lRc%c\N18&ZqԋqC'Hd3_A(W^ :MI!H@fN /?!{@%qYi@2?O@{Xq|=Lj f]]0-5ď<<[̚vpV^?;ySMD`3H9;7QfX%vՇN 㧯ܷxiy@*GDӺm.} #Nׁ^RLTxfGnT ^ sW[;aJnRC yu0( (NX9Tbr}!]3޳a5"wT,lKThXᄐ->\O՝IyцŚ̸8v Udc&?7 QvjoI(1Ĺq.аZ]H?pSX ' \ ux%UX2FP9aIИ~%jx\ձw84lװ[ms.|7t=V#2$8`V+Y^>h$\m=kryZ5 ּw\4~?-vuEބ/MIaΑQe+R̉B KG( v@[Y#]Ɯte S&`f4ϔWfς Wp޴ 0.|Y[lUp&6GU>ݾ*pQ~ںZ(7endstream endobj 261 0 obj << /Filter /FlateDecode /Length1 803 /Length2 2329 /Length3 0 /Length 2890 >> stream xڭygAi蠐0yy1i$7w:Qn ( Q pfqd“@:S 0 ;5Hx: 0HfT"h,^|@7 P p  n qN9,_0dKA  ҨZl Ġ5$Ս M5:ۄNxw#{? + 'f?/G$D1@F9H~#\ Gpﯕ/gSDu(-G08gJЏF-'@`oU^u($-p@_ {{CCϟT( R9?>NC͌Eش?K‘R DԘTA@zdprN-<~ 4ɣ&jʭ/J?&ۇ?9ܣo]Y/X/g2Ius@|sfN=mzGV(\gtr[Qt(Ox>V9 A 14}CA)f]$!;o%5t vOzm+۲47pn$uĮVܐhtr$4U8'yטu߃D3!dFCJa{q&/%Yzeԑ/?qO+ׁ0!A,BfZH7wyimS4o JXkҴ89ا=D>ؔ|+z#9Qk6}ҽ] `t?k)MX8 GC`Ӡ`_"n#1gqu&^Y7"8j~<]t V|]'"qsco$m&h"1]-*6nyY&QJ|l&kquk3,ZHXyRPu 0$^0a4G6?rSX]Mq ,+Eql7| ,0.*X-!]zP}B{3 KxEKk:iIՄ$}YzXKՊo74 e MײQ-GYXbvBgnKێ& 9]ɎԠ"7@nG7NCLv9X{jϲ%l$%u,}_yr~Tk4aǹRGwvvnP/X1:.>a'['&3F^.XZ*:QMbi WVpZ9,y^۾G#_NY*KPib2Ju̿ Ve{jű}=}skpʖzֵIdq !6uy|6~lU7֝(`ӊ6?G u4+#/5&Kv h8K*gsfQ+K>c{ E韋hؚb6oV.bgdǓh>w^ۯ#ORΤW;6Ag*OnpcuvPHm k砷 QԘ/ NtWFqGؔ}yly}D`pQ> stream xڭeX\۲Cp ָӸ&wh-x<$N־{g}goUjԤTQg53IBY98⊊#;; -# 09g'OK ng B@`Sc[1yajlP3lQ_7j ' Ȍ `6L@`[_dm|29rtz`[&#E; dT{z!뿓K9(CJנqv{g(hgrPmп)ΐBm6 +7;`')L 58l[SPPaS1B5A?3~# 𑝍%IjIښڙm-<cGGcwT<<O A_^ 0sDU@L"P TCTCz&K3 O8ha |iR"9^_dvr?^jA/@bK?sss=H|7sd})aΎ [˂/; LQLRCJ|$KHӊ;ӄ؎64@XXV2̔ 9&Qא:0x k17]Hp`/$+|ob۾lK'|_I\ߗ>־˨̨wRPsAZ үpzg"sa(]|P2`JM׶7;ALR쭅e8'hNϚx7͏xYo>%ߨ,ЕXMbjspSv!3,BOY&vb^ C7&}vu;LZk%b=r3O$X%S9ƞvCU0A"iŢ҃~QA3]ias*VkMY[q۬HB:I I DplTG[?1yp4~A/}q=%ȩ"2ֆʛis9Oh)^7*Xw홅XpHD︻Tt+pʚ6&Ĺ|A%~Q`ãsFig]zy/iuvKիXs SK0N2(b^0dZ.|m]ڻ}^(#VkGߵMQ\v:8V9IZ@}6{=Y 3Kv/Rc\2|fd 3D8M=FCG~gos7 t\E*o&yEdNP#ByT\D:eVjw`Doz0}~awW$F_.Yf[D+C`՘,ܚ8m* qoƻf"N5) Bx nǑ6VI pBsu }'<8?1&Sl}aS %kgs*LuWFQn\- |mŁ)pm(򍆒HL]ZKsI̽6EM5E@W1FP@YQTpx+ܶ~or7J!^~pbأ 1:F/-$wq7glBkxOLZah?x|+*dPlvycA@$_ yaґ'sY0rXh&/3Δј;Ǫƥ}eU*wXExf$tM{=+KH(ﴕJINƍɴƙ fWgeEu |5S4nw&]ԿފX{7nE͠"#s"lh9i-]Hx-ۅ,֐ÖRLWqc=biw6”So˃O:%Hɑh׺m?RD/fvǚH%ZH!cgy^YI}R'LhËeV6+ۻEg||5R2ߐC$aQnB6)F]OPtr;agGnC <[k5m7S8M{ 2Z=?7;(˜*#JĽ)>y%%i[x?P-3=Yn}>o"{юX&EMyC.}nqaU#6VUd;)nˀJHOY8 +9)\o8㾝tk:}\qUX6|G܂ЉH<[ +nS»7^}Yo%V`d1<0dNe^م`k5Zm\K}Cvŵar遐p4WۍnD׻:>T$wC@Nptsa^Φ`m"_)|i\ VB@zry*W|Fsh 2˘vO˲ڍ b]=RLCM\gPoZPF8T 66F .l!7Ҷo}~(-5]0\m+2M̐^:g%"Џ{ hExcqF -[)@gԦUKsǔn4$SrC"CrgǩȮ3`T -UX)`O[Im/zԞbWT_Z{5pv w_TtZnaySSRܣ_ukb×9 Ց:sHvvVww6]]XX纼@+izhRBZAi_ *zz9vАf`&G%ou<@Rci#X60SOlWa+tc[ ʇRtIf̞.1@m TyA1#rӀg!ʸ )o=ZKjfR3vIŚ:a"1g0bs4yeAK}sdF b5gLװ_1Jąz@U~c nt]?bTM6?^ژ|niC I%,a ~>vL%tGB>+l]Fgkqەl!y Yُ">縫- R&2أġ^'􄽶AtsxUߢEo R{UCmKb܌UBke{L @JS7ve Rթ &5/dqvcDXV3 C#_%nV)Ošb{}ߦ3Ikߧ' ,EmeCA5 {56; f0t/zA]HjdmƉcBjd;~7ŊdW۸;l=Y1kS}6Х{ # 8[5D\@"@# :xu̥8m@=4iA^#ӌ W}Jϻrb+N(xܖ U)PsU8lhOA83rx엱_w6L&gf|?i_h.7\R`<k2ְp ^o;RGСr5EqL6kp< wy?EcFDGJtm-/ 5Vѓ{jltli̤lȺM'gO3y] .pm#5%!e0ż "@eۡz0"pE*dIJBCc UD^hv~MܼpԽJ30^.S1!ӥ!GQ1)k%HtJaϝ-JnĴf/V;k|m?4 |VKs|_ "5T!N/GvО0m3|=7ةqZ`8%X;SKF?&@׹h/ӶϤ88xTM,׫W;muLp%FreiIjw^[$)MI7vhm>xcϔPcN7:#+Ea~HA69W:(>RjR^ppxB1?L LhӁ bՖV_˨hj'XqQ]8;$/'a%mg1jnjkc1|d'SMd/弎Hnкz+T)L:G/>**6:·eLA]g\k-drw[^~|Q~ڸn 4UW[ -\><ЯRuUuQ32"\)mDD~jwxu%rSc8>fhn 0;utHuFem2j%n]9U bpA;v\Kq!F2] ^2$.8ۀޝZ'H11M ҋɼ2#6ΛR,-]҉j:K`|faq)a^hN~ zV_ƣttu3̥Qrkhq#Vz?|bNODɨW`HYP1dz\<1A[ v+R >ӯ 9*zq7Z.Z唦k<t(jGgd$=?T>#/;źJ$&T3|Ļ,d3y * ޣu8Q+7H,}E]_!\"~̻dIr1c=.Lh{VzbkKpd:! ԯbVnsYS/=QOCB[ln4Ͼ Qd ђwEv'-!{}F)ꬉ6^`1F\'jZ9vs vJ&ՙ ^endstream endobj 263 0 obj << /Filter /FlateDecode /Length1 2254 /Length2 16689 /Length3 0 /Length 17895 >> stream xڬeT̲w Np`pww'܂ww! ͳ9;-X,ꪻ{DYA(io SPea023"PP9]@v.@^ +@h@wtYXhq@vcK-8 @tdT P:܀f,,3 hC`G=f3W]r:9E%ifog 0#0)ڃZK(B?ƶ qupu:̀NvU om @3]q1Y6%A@3e%/;W_dU5)\=1W eO. ;S{3`d0qY ;3hg`nOC99L"M&?`C& 6.yL!.f{K!VbWdXۚQrXҟ`=J6Ζ1q+yA*,_u!|?5XC`C<`e:ϑ)x |?c]`b4wcg? 4|HS xS3pS{mm >_VG;x, |?{]_]2=!?+ ?G??8qwu+/#<@<3Onl+k礬`1ƦN՝0Ap4;_28ßep0c' ;X{Rg ˕_6Ƴ`WNψ8ڻLl+-VO r79mA=83Ϭ rb8lwpe]ź/g  Tg7+X4?_NvO_6? @)ʢ)_UjSXDrZHQϊ=s 6cruڏ0Q>*^܌2Z 3<HOQڛo8 f7˒>f_ )S_'uk Җ̰d#QEMs,`pGMJ|1gBӾ.˫=VhL7UKԚDxk92 TÖ"+J 7fWv~{-U:xU׭1N5{_a3G~i Ѵ[(4D';Yo*K 64AGB/W"t u*UH;+lDCIJ )5U0 6?7ncMrIV/8M@cOkZޘҰԇu! %>lw`]@LFz\^0BkR־!XmM{Ũh۴[Yf)I5J4DPT˞ wۖCop虚yE_Fcl5J^|g~8̺ vό{n8Օ>S,ٰ*S@1_:ok+&xĞtH|f.DQ.FZ7R.4ͭ5PhFGݠofBZ%3p<Ԅh":#uz)G9jz2RB7oՒ, RuIDי`' +osب9[-RՄaȱb$qI˓jq ̨70WHݳE ۈ:YO*+@ېB(٧T *ٓlu]mcRp !Tb% AxxvWBKGfǾ nFqDxi,QD}f3Q_W9H&6|%H90J3ząyظ_n:1VuX5S4=¨KKS2rԞHy=D> 4^bhsa~%% +nEe6ϸ3\w z3Gi8bWNJJc:4ufw X(:iuza ,-xxMȚ`))=0"K/t1xi<^/¿-t.ci;{J š/|.Qj]mO {\/]F}=ۛuWǑ~Hp _Z>t?WcLk`[b4È .Ɣ}֨aSYxD.baWi>~y@k' -φh!Y|Be(;|_h͵*¾>w5r69M5lB=z75[L}۽&Tum~&ـIHKRţ0,F|r fhA3;]ObF Dͯ+Xx0ŘK$ѹ w6[3nV/}ikZWM05ʳqP@~pQ廢޼X:!Ezv~`v$/_& |"|0Eף9" b^$bu]6y%E6y ImXߗ?H[:J9x/}BVb|+ϑ_Cj9-Ȍf66S_lh7sL'"i> {AH|N M!r{6RDOPR7V"@s!A[DŽ4cWO7r^tiCa(cY?f'@~-ldSuLNDn\`p`^'^^&"Yx*JCWWK>mǭAM#\NO_-I-xWIg,sHa\$E[QmmB0OŴVFg ҄MBXnxu +fL/_*ci[E1a¥-ak"?7g')N`6c,Qr y.U?Z67U;Ǔ֋o[[/i. Գp#ЏltӧP^*6gl|]tC߅ G;"%0psĉ{?hea7DỐ(`)X3QFakyi"QF)ẏ FB29'vߴ5ėɜQWkc}f42Ms~ə_V̸SI?lr 3ƆUX3ςa;2o#9b|TdrfJcSn[ܹmEWr!,yu{n٠3D^GeHrw}dGYREIO)fȽo٬T ՎoBSukt<  v(:ܮJeZid][6,ZI#NvӬ:DsZv!On"ELGA,.A& *O 88v8^ ׺AW2zAOJ5OFi4,j*;mX=/_໭Ţ@lg( O:LTCơg ڼ?h/J]JYkZ9,zmiֹ i Thǟr:<"[ZBNԸL@ȳW1[hPo$eʰbU(;cruNP{㱻ճws;zZ.L8v?c mB& 3W[ "Oi[&y5}yaمؔs6xiAQZ|X{E^5[$6Xɧ4gEwn84)|ZP:}! [RfW }'Y JDzX'BȢdU}y\pٟ(Loq ;t5W*'IӯQWme0Gs3A)'?͞nXpݱ)(i V'nf=ģ{YtoX7EgfRQ*H#)W!9' K\ºw.*jKiGd}N1f G[% !h&:;lSAvG@C#H(@MLc8`|[0(_'/(iv|բ+$kKBNԶ^>^WPOkPz]X&j~-rKo i2>%o7 k(*q?;dn Ug*l0_?J0 Ybq{:ȔaYE{[yfl>~"3Y^! +3Uq~xۦ`ϝOUg,lkOu~ A)^{( "ZWҕTf8;1zױW=ya={=o({xUN?Ggf~~m4i gRkw)S(׳W-W4l(]c$~hUC[a0C|Jt'^|OJ[ BS-#b=q22VcyYʺ\Xс}prR硲>B Kb>| P Yi"U@ݙ-'́0/|FvOZ+dY`z-rm⼒*X8D蓭mwJ5ڂm{,B1{ Gm.VɒEW{!.5lUDu-5QOEAV~ sQ~;->4-߽h"S Q|^xk.q R JfbSxIUReU6%$74DZ-F"z|ۼcp}}ZƃD]vv/[niV@9R3j>S|HemrTC'sOkI7!0u"E_//g?Bs9Dd%Ob٪vFgC:_8#5e{6Y G"}y2pã<]uT+{0y} p+GaEK}~PŽ#v\UH% EE} (v \%'ޞυN6xGm4$YnB+pRFC@P)l(k(zU2fNPP]s_H;f´Z2(Jxx8م;WW8bG?M#UYʛ ͑FWf sz%dl5֞z7h!(3]7ӳURmq Sс<s$-N]qFSX!þ:b ')߫PUĻ_p#'BӽT/K'iuafHPE =9S,GRV?[,)bׁ㣘YS罥bx޼b76#C,UCt>W S%VŜjozƻshl-RAרCx90c&̓ɑ` G\69c=Җ}Pϒؚ~XM5}RGx"v\l"'hwu .-y*+,=/ԀLhC9 D@L3oǚHRҚ b[3 C9E\AĭRe}](+`]tgP&oO YAcq(Rd-͈~?S]]#0sSsahA<ddʩC}A՚2? Q1%rO(VN 4(1gdF-p%}Y9-DsA$/c$ue2-ڳf-eNPciD`-75Tu2eAt i)WZ}W!6\FuS![CH?Sx'͞}V|(b=" 8:K#sV+Fí;<$HwkC#$8HXVL* Kjw3}ajw>!NO~p?=&i؅iG(W8`B8SNDW!d>6*ʇoғr(rp.l=ZQG 8r#4'g閞 4vOgTk*K+RBd2#oM߯rO]bLI+A*ð Uclԧa";ΟoY\bJ V&H>}[_k/j\V$K=6ך7t1/ hoap|yji]|6:({tr] gcw۽V(p ec*WNҀ$dGXߩMОwuAtp}5Es(:]ǩ}ٖ5=̲b#.mnD<֍J.)Moe,?&YXi}7T[gC52t{UD!doEf];e`3ʙ#ZOFXI:D~ڡz-ɤd;@*e|6c5k6#F*Dg6"GݑȈC#+E8gncߩhH4ܰ ㍡) ]Bԡ1gkwNg[ .=>vYqb}b[_Qx/:?8rxt +ԸvjbSTE,(??5@t~8f*7y$V,C,T5TL| ,v~k{ůM4 K޲; jF7?[}`&@~3}7"LЦ)CrŒ4M׆ir KnvU8Jn? &w?xWTq؄Čh*Fgפ*Bہ2+o (!e=LY!!ua7+(ӵф+/r㴩Ϧ}x`[.'n9vM-H{$Uq(WLXpI=Ba6}u%Ry b|Njm4;ΥxPkL1e zUd>jS1|]nܕXk#* o!zTdġb/ H7$/okEͱ{;9E02)sW8o# C=m#jB[oXbzK޸+8Y[2G 6ua0W6(a"ekL4u5Yi: |6)D{ܒoaC&SuuYY-4f[=A05 ea3d+rS٭ ѭW /5ϫCϽ茎ͩe^{[K}tiDKuUCV1rI:ajfZZ.Ò"6;O˙9H"rl7;'p6ޜvڤi?<8Rj| 7CG8'0k<َHokcj~)3;n KL?oͯCg:B#Fd7N9Z3b'✌;i~Z"քC rAe6-g5<}g)M+2+е;~A&Qoy`8SAe=QZ2{+,2'\z/ȚrCym1կrXiPAJIyˀ "w)PDy4 j+%pR9jrA2 %9q | Bu3gd׻ʋ/^v؞o5버L0d7J}D1 *0eEl_x/ #,Q{`\Btj[UwsGiA'sę=2FzRzLuQX"WN3}#:wdw%Y&r1[VBqN+wkÿYzlcǮ'MɪuG4QY"|0ǚ=|'̾{VIeڽQ@c?55.LҠ4Y_aDrj1H9xo;GPl0P"٦KFYt6oI 4%Z1P~˟_⑴ wJdl1,F@RSLV[R}f %>+"2G2L#rsMw1\5wtb^S,l?=Ut׺׹3֖݇J=.텸X+?HQS ro(}!v_;QXňwBjx> JZj'2Ⱥ@G\W-ֆE*Qf*X;9gpfr8Ql@JjRC]LKqR0c ,m9u7iJ۲ferhθ>䆇>v6hM?0 EJچńJŅ@m\I\KXn]ƞ[ 2U7` R[[ipl)4\`qqgZdS4dKu_aV6)D 1t>XZc/VF$,pjN*ӳH&P0$j/6Kd;ӃϢv:sµjU);dk FJƲ?8/psF1lʋK,.0p9F&snҬĬ ;Yt궽9R j5 BﴦI㎔2jqOH$2h~XL&)i-! {{QrA%Qgף:PӬvAkj cgzh Edvx81&AXg;3d^Ĥ۩=?w0*#a ֩­BTcy^i/8bm<pCըU*50e=QEfsW`~?f6ϐ)6wRRRĀ!OVMl-n/CpHU+vɰ9\K18n~Dm6uB *8 8e9n8ANHŶDsjŵ}NEүuN9O`o[߼V{Qɶ謯%s PI'. =!_ޑBGjnOtP)q3FGqIfNy< fGzmPX0;s詻k)TRjŷo,ÌR>6(-0('Otگ-z?l0I<2F)_μtBGجO {a)=l(AXG'!-V]UR&hi89\>MWƗeA#ÿVAF,7N枣l}Nۢ%+, :6;8v!|6sb>MA.@'qY)GZ|ͷ(Ba6< W#yfB1Ma2r ?(Ok{aï[MCObj/d O/ 0v66 q\.LZ@ypȜ&b uבN%4#2n)%J9 ,%ɝNj85%ץG6˞?ǿ+ xSjȯ3-b-ݎ|:,d%d֦''=zY~F{LS7㋂$XL[u^udp%Ҭpzf#eGNbJ*$ j)WZ|ڕ]ru6e"f%n ǒ].[#elOׅ8fSPjJ`=:$Т=Y9 8?(e&]恬6eq:X::O*LnSUDSHNZk2eoŲE:-:ޤ,u8$ qbcJVfD}Ua$NG3M2'ōAGg g>{YƋmD\Ќ)+GXYn^-Hdj^E>N_X0/5id29j@F^ ;pWgyISmMYG4(;qT큣ĻɐLsd+7%)v*~ii]F{_DD;n^~'R(cv,iSý;GdǪM[φ7jȊx_:|\̗uԦ8^RSAXCqE DP?~a`a|^i6i[1| 9-h-*mۀX2o Q^4?@ b螒8bY*6rD>R3.#$]| $V!{h(lz'k6Uhq#|7aʹnSy]>|,>In Z,9F!%3=eCPxFgTؔ }E|9q1f'+Cp[ٌEEV88! (o8OJ}Ӹ n5"8G-IŦ^ZGu2"̥mkWiyfnlL- {QI>b+佬MQ=ynθ 8LIomnBQ͙0F0pl&ݝP*mA A)밀UD5oa"?7 n/B_]̑#eS"GIXm֚BD3\L9LyI%'%;O75PetSV0){ә]ҵq=#7YB"kDcpp Bl/WdCX >{++U|_(e~Oc v8fXYkhz@yxߙu1勹 mzTQ ?m(tl9-B]kXPpE}JLoXc^r<ͪj:,xiaN״ϮNY;`n/n@ V[!2u*`#/eƓ=; i f\(}Cw^3LXIqķZpt .Slf\-1^SZ.MnE![O>Wp HAI$%/pa#l fZQwK^ >F 2$Ʌ4yZ406o=\͑S~ϋs|rRm},6H{Ufcc~CgCsZD(xѐ% V!W+ T(kFFPUHTSRr#PdBҼ?7Vo]7U.l <66Yen8xJxI\.NMDmoCs N(OŨEm˟ZDcN LP_r3}DsfkWdi\bsw"G*( `CLHc:$EB\tnIS 14Vډ>}N Omth%|ETվQ?dapӝ0Eƒ@7Vsإ@̒~tJ*d?oSeX0KkB"{`_JzQ4j1KU|(Y`:ع+RI6dikdz!#ܙ6qq,|R*{'Ҟ3:Fw^@ґoubfhٖgeӵ!O%(Y> stream xڭUy8}VFl!3e&k"k4gfǎRB! $Dl%"|S_߿sss]YM͉ \ :pUDN΄"X"Iupp-]úL`B 'aɀ76`IX" YD$F8-#pC@DBpE_K}cI43DI!LS"Ӥ&p@^ )8g4Vܟsyg8gC IiϷf>3!smçd>5 |d*p+]ٝ#PVwjmk^6<OW:gH ϸ1K Hppxx"^JǷ"kyz-jH'n^yY͠ON>-09eְǯģjcTO w*O4Ih~ŵ9lm^tA%a"D􋊣12Ş£F swލQ#-/\3#D{_-6/\Bl/p)pͽp~g)Ӓ.ONdr O9d$y TqǢ0Ztn%)۪)Z!byef|$$q/՛A*А&%o{.s\꜡:gTK c#wO9wW':/*2 E7\ SQ*:G8H;> <<8=m4y.:h't̆&~JV>J)mq+iYJx/f+p(VZ84'9Y+}_VvkRN*3Uy"7:l||ƚwKL@͠7/X>A^JrOj^cSe!Mic0❃ Wϝ.@V;gPéjk{yӳ97ow^(̻ e|0pEK|W QGrsalvV;#8gKK1:IΚ&Cwc62nץv~m֛%ϭ~9VٜeCt`MFa W X*ƠՋ]p?7q&YcMP;w3KO*tfލύ,re>q_ynStxᴔGgnEss]sQګwLpoѓ扌[zk?hn@ ڬ 9Z1vU(UT.hVW[L vIr<ѫLuIO R!rMF`4-%jJnK~SQ}e .K0>.gƧ-^{fubN^U1IDjͳ5y'x7zCZLSVw]̟Izh%of3_C6 YS90q;۱&ufj;ɷhpGq8]9|GƨF75IjY5vKtc:?ΘDzRE `p%4%+7u~sQ];#H`B.z =u8H5 oְFb,*l| :jcP`jXN_>85(vϹj>Tc-t1%l\ĩeŸl[X{ $Š W' #;fķ"JǍP} MIZ=&M({K( 8KZ?k S.'#s |/wK S ^rhզ}PW];I=K%tH^tdlvlg"II-`mnw;Z<=~[ Ja/HŝyUuP$}>0)Emx|1Ŭ64X}Ydgc.iN)> stream xڭeXJnI A@@:n  nR$}{\_Zkqu^z2pk"ŝO ceC@P<"xy!1^1~ wA@lr2;@5l0 q`ݿx Ѕ 'G0Jfg^~OeJ3iQO _* E/t-O:-=J@&qm6Ǘ0o<˲:?=.}I6^`<^g?H˘FvAgæE;?^oqݪD풂a F^L efkeN懺I__3odɥ>"7T[_FXKVFiuzֵ4q%@8rê^Pq2>#s 2*`zh}r5o90G?\jBb\X230FXSjVB|e9Qlq٣%"eKey}__vn۾D8(AdUiM[''omUE7ٶkeݺfz9kD!$8K,t?;—"PLqH"tzD,o.m! ^IWx At;np.l}86;Z U<{J6?KVOHf^Tl:ƛ4bR &\k-8o:>r6ZR-G[vǝֹc 7s$N?t>"`$UΜyA(o[.\l}uz56[TLp+4&&FcU~Knmۏԗ~MZۅociqhz;"9F5gL$u?L L.a`hy,jA MV'}UK֛ӞiJ{;ʦo9!Gd[eodnΡWCB=}ڿҭ%ҷ n 2hQuA$=&1& lBrXϹ|8k&19wB:5<n5~;z Fɕub5?ʸY=$NfyL zYqktjQ#NJEVvHO3^1>4Wiy>pPp1k{kgBQ/y|kc% ,5ALx25|3ELh\MbXJH|[Bd'h5Yq xzH2$V G@A]mܗwS7})pSrRYy,Uzk0f5'^w 10.hOqJ2& Ϊ?܌N['#frYw?Bīcw]\70ol& XX=!-C\q`,/ y1qx/tf(ksԬqjA~sWͶƱH)TB9-Rr[6l r WgjVupH˓:U/bV|]l)I5wϪ]DcDQ ҹwPL쮕OЩO-9rBp/.IM Jf Q^'Jñig-O@i+˻Wѻ/z|qPڙ&S=Y/[#՟;dg8Q,aΉR|<f]F(ÔOu~fPl=cԫmbyDQ\d8їD+{g#T⎎?t|kn^is(bLRl!0T'-lYsp\wK=hL,+Lw):"e4nkηfkǀ4IojVaw!۾EN[e n88b۔ɲ̼YJ )9y9k.C0a4\#EA. 7.*rK+AFUxX׸@/]hAZ"P[,N0J%zǮރx>p"o>7A[t,KMޱph灟 <yK-Y8( UR^xb&^֊2BCR /琘EjmNnXk o_*nsbӔǬX'JNiVnj_j||q6P'c3 40rX㶠EhϨY?VamwUd0 O dx5u隌ER=u5W3}2Vֽ>^gMuj()3@B~sV+=,O=#[ .CJ 5`V۶NJo2f pR#0gd99EOvcڴ~g)BL|gLb00w uƺ,'m.=\qRCMC&tB#A3}.vL &JGM@QlO5<:pF^r@ p`%p[Kj&%3]STaJS;|UcJ$ARE%3Ň?BZC3\s!B٣TONˇ[*Q2+V_MX Lu/ Y*5bSCPiP2&*bZE}-_rU1}xV@6k簂@F\"U~된D^̳6 &4=A2.2-FMX1BK,/x PF]UnYwu3 "bͭ}EIl6t&As1 O2LدLq"qrpb] {y•$ܜ+| >CSeݕ* 䌊Ί|=f$Nb-h@Q/ Aϱ5jMX{C?Vדa~T>ģyE(\BKp[edNC1E K:/Rwp&sڧ(j|o\i3~,[mw)ӜaᘮH=N )!$ d^hO)˥-}WBy2=J~T~")\؝l5<҅]o"ņR4ؾR_2}'n>T'6_^q-~]'1W"ÎUKo/*qKLP~2hewo4lRyg\O ӔPEXvpfK~|SMRKMs; . [kiu{8H(Q|Yl&y|MVVb55fޡz(tlK5IWƘcm :씝 [bP<8`{B7jX$9%{ޣ @}= 'Ծ%hE\IOTTNM\㌟\=}MA4+Pr0!\ھ3Zk̫vo.n&6=0vDC=+swl}l;29]#j6S_Ӭo!:V F6e}ٰUvMH6M\Q,:p7UΟl.+@Ϯi-v{F 8 wE|џ]dJJ7ѩz`[_U>٘Bǚj q4x%$)j)[.q^^z$Ѥ$0B c>9>VߨxdXKo=B9YS=7Z2ɖxtB)l uّ9Qס-<ܥ_?d S:')tbmx-P1_Gv2xРeewJ!CQiM磀]LXdYH fYFJoc#-㪕sԴ\ (xẍ́%X@kttSkp}.yTWZ T.<{v"èvV863DԴTWˇRcEGME0peLR$kj|6:k=lOZS]5 Vru=y!`3ʥF`R3bA`P} wg [}j,_W6^ԉy#魙`|({ch61)>݈>s9ʋ^Y?^txpTҷOϜ.!{lo7|+Z:-qp}yP+=ܖV惞{X(kfb//]j4 7eRa%]Bƭы.'F,PlE&[hJ Ǿ'NGdܗU=^*SK Ѹ6 nɍA'+U/L~&rTvŤg6^r~^Czvw6oEiXhJHCQAj dhTfTL($-@| Džku=J(͗`AS'{}E#^*v$˜jAל<]eZ1;:~F8uFG`iƑ jPURR_{Fav<冲J;~}:π> stream xڭR{He!m^Ĕ0G9L;2"@0%1/#ು#KM0"";&#?Pb?>$BiY/D$EXhd̨d`0%#t0 !}0)EB“ǨA7N~}+B\^^De?;n)-Yz@y`KĜ$:>_ Dz$1:1yF+e4ex64rхh>@'\QI7GpM++(,B+#}ų'%U~Vi=NA̓TUcHq-Zz}`x:v8 Ve_cq^s{D wetfkԔsC:,N_-heUv榬α9pt9»w0[ǧNW /+uPi~ޮ{Cc16Mk?YbXnNjW5|kV}IQ]RóWniUkzeJe뉤[A3uuzr(e]̈́{M)FZ7&*=n񵮚h69@IM;Oof&Q?Ki[;)||g(1Bk=˗.V߫G{}eT"0.+aU/uiݶyfhWKH Pr&Uo/m}bс<GԤro%>LJV6vf'ڼ=̿ _>r̠Yh؞qkmZfJ֝Hפ)ad35_LlSy1}~طq;䊍+ lmWg7`g^UGnFRhJQ:JHMW6ƙUn=TU4] 5)'ۋDM/\_ >~x>O;m"6䔎jOݐ aQG=FܜE-qUWYʒnkeW罬\_V\lCracƃ䑆~o6 {ep1-5ءɡ'Mc%?(\cv˶aZei|w2i\x uHo&˺@؛^y6>zݨ|?(IےB.5˻juWvۧ޵ʗѱ v*d `di̲&aaT9]endstream endobj 267 0 obj << /Filter /FlateDecode /Length1 1075 /Length2 2850 /Length3 0 /Length 3561 >> stream xڭSyϹnIqKy4ITy8 JJQ@ @&cRWGh?}?6_llZ6vKS#KATN$ݿOi`z<kq8/}V0.ovس (Cޖ "|x⎻j='m+.nM R9 YD>ȧV-,>nR𡰶y>^a9=l f~Uk5 sԂR^‰pmB\@-0⛦y+},GP9GD%qYx6Hp[/-5(lƃ_{= xr_=mYf,*r1>B$j.<ڕ"LT]1=8͗ut. ;U?C{)4.᦭* *bk&m!p]n˟=t _V6=EwXc wݭt{;) U2]$ZikO[9żl2>-~-fU"t'=%Ț]ArL]+-T&&%,/?!3W&'z8v"H7{q9CklCpA'խͯ؅y)U8)\_Wƫg.jXu8( VZ7+uŅ|VpmGmn=kԵ5i/'.JH3=qe9ǃgNUmߟܺ$$eeH_˿pݗ{n6n+R¡^Z&_q]I[',kfʈ1&//rZ~_˟!eRv6y#edz؅)V^ZxDСĀ;DG1v/СE궇e;&x~>` ;˞ccz4DHBk]eW7N5p已YT׬n{Y5^ibO<)LSW?/Y#߸n6EYe6j9:<'éHh)H2O\$4""Xfl<wF#c{?*爵vL#b!߱$x,9*;=:%#̒T@_']?Mҩ8VJ`7nh\P$gk V{~ I܋+`rci2VlW9Ig&_L5s8Ļr?j;4{P-lY݅ Yy]֌j, F?Ib}C>w{:bo+oاrHf,C;<-;'WOA(o֫1!޲ hkA4C~FnmsiO_BͰܔ=:+tͅzj~E\POqc''ɇ|{S^~eךhOCwN[zRMm#[zpCs=92ZҨAɔ{)Oṭ֪}g4" $۶gnR ٕCxDN~sZMoDVX!N3]'}JK w#Erۦ%l~x \sZ=߲[j_eZ/zB6n66*gR,S+ ;y;LOsl*Nl7̔+Ԍ5WN5ΉYt$> ־֛37XZ$o ۔z,#&aغl<-ib^)(>TP[e1eF\7=8' ^!!",zLqbY=)*눪ޖ"k V) J^,R)CwflKWh7H\;XWSC}S#3-/{~Q1zP4OdT{`yѫ _#x9>V$e)r^f.Y68Sb>wl ?PpKHsG|rm%σ›WW6ӽ+nt ,%iYe{O%t'[H+^q%$mK:*Uo 2_+"%8wGU ni_<O|s =xqjLFUmyyrׄ yf ٵtNniJɾGҴ#G]RR)3 9~kqV _N,'wLhfN*t>$h )[_bl}ܒ˩>~8}虥{]3̜I G<*7FE- | ЯӉqu `yh/Uo> stream xڭeXҮ ,ep'wwlpw ww$;};9=̏V_TJL"f$Ι &&`efaEs;!v >+//@dzcBA=Z1" G@d 1="66p@ 3fdVV`!$cgplb.Wӫ(d^EAl<f sdUY\F7xO;Toq 3{em"v6 +3 ǿ`'I;L lj 07q3o%,J`;g5{Oey2k) lg`;:{ nWxvf wU1z u2>s#? c7qC<%C,? 赂z y͢X@?!vPSn6U5~]ļZMk/!W)uퟬ,RWUy_[-z%W6h _Wד~7vـ̝XYB k 99m8 ׮\׮\׮RUǿ=w/&V.v'?\>Wkzڽes#r"@LC|%r9Ԧ3cO96H/B%Dze@3s5z~/U`V?.]v*©類@f_y-Uv }VآٙK_kѵyd3Dd#)H.d^5y® %Ly'$:wQd4ky ^] rA94nL +8X#.1Z7fSWگŰ귧?MЌ=ĢL ;װ=Lq:GOe X2ef?=ûAEH:'-=>,4N|rJЖVuʕqJMƴ<- a\L겠C@sV~ $4y >.ʦ.Shj P oJ{[XYITƕ*;|.I[d~(#FN[ 1 V`bC]%{OГ aEfC֋vf%=-ONĤֹV 8v QxB: w`sintfY~Q!7?;Έ`?ExHM~+}\փ%:o#xfb:8o =IגݑІf\t''.N^}vbhϧ)[wNe""gx\z+y/D:N0&VGR7MhVW! `cMvCQH6K+uұ9ʸhꝫmhn2 b@79hIPTwTyRV̕0v2#']$ḧ́4D`hWTșgm']-KF6SJtYH,ܵ#.8ܙ1ZٶWސLϴεU9pz]-;Nrz5e I2s6o7ڏ}8Vz3@Y&-U™ (š3M{ԽH98pd@vTwœap^Viޕ@3[݉TG<"ׂ: 6_3 EقC//0tDBOEӭw]LL9Fµ"Wwz?`ǣ5SpdY ݘeNŵ0 I`/Pݴ&vxgDfK0m-d5 ?EL4ڹIb̘b`\JԾu|Cމb9(NьiF%$ }>6oJj iJ"s$'|W\0kCe :1uKm}4;=$ÄjW$`OMOap  ](x1w_GiR_5_gM  fѻo8&2JCamɴXD*>NBznښH]õw"#/"ZJK]V)1g]ΟXLXMDUv 43y ăV <6s< Q\T\]5\鼽F[=F}!IpSuYKK0ޘ>s1p^U`SKII,)2eHGlk-g [E̤t>1w!H`}>xiWB" sɖe8l(N[C"P*Y9xvfq\aw%ԇيUO9s'&OSFGmi cä56?˾gR9&!}A(mHFr)ͧm,D*knK7t=2BgN=>}u}a*(o STMQ1upĠ/kО!R1{Er4fpd\jphCrwB$b"GxB=mܷOr͑b?(trƇ\: n@T n=P_4lv)OTnu±$Yd=ƞ5*^|-2{`{\j%5ET\aTrRg\'"XLV?Mj|Zf6ti9B OLuv'q8Iq>iFJyw

jd8cor'?ˬ%Fi +"Y'C|Ēr,n8軯Х0Jd>l|OmzGcG[8)=$Cn(n:N5 ԕZAe[Ic*YSfˑvd˰pvf/ ] .'CHvB\*(κl+j6oDAe$ߎi "@d:7sێyNp =oZ/eto(TuhWl9&lq3]ջ쐄=aU:2>htٿ4I7Tq:#τ"}6 1C o0EFnUPJw0EH, dgKzkC)o#54 XۧP5_q;9l8x GK_Zۤ:ÐpgKΑS$V};$Ӡ:cBt2BQ=h}:0Dr*E kr" }e0- 7z}`Pl k-'W] u;)wfkbg5VsQ{(yWY/hqW[&M#v߮SH۾$tl6%%\b6ԕVد3U((Qi%]۠Xݥ?%S(EZ*ޏ;ag U3)h<*^o|ȍDUCR86B =,In:}0An; )s;*pYR,]D9}6 ɣ}a3cB>e9/lہ9%k[eZ~ԖD0'z 2f[jvVv@x9G8*\Fa?GeR̓2nUv*s֤^6jjͣ$ªRme^%' P Hu^Bhϥj]^BR[1)7t>0[EG̼xG>o %zP }inI͉,A9 E1r 'nm<%2W!RN cR \Czͧ[R檵zKds0M*KE?'lȎN$:N<㶸&o YkPZ5JV]z 0||؊Mvߓ\k31+A3$1 _jULC,ð/V~4d^v:~dhO[3ܙ86hFwJ`O˛H]t5 ط\mV>NH38D)/ iʻE*V qGܳ0$ϷK#Wũ.W#|y]܀* &M\;ꆁ=LV Eh|#0ثoj\fن,ԌȿH|zq_dPÎ-cJuW)$u2c64=A|Q1]RibJulh!Inz_|roրgf!X!ݼ?VWB}'43Z}*27jj9hd\T q2򁃛ds=%C{RէȋuQ.jBfDID_ȂK[&*A(j &@W;"mTL,uOL(awrkFUEՏ27l ;"d:33cI(yHl*AKvuۏ1ˑ:[zt|vrR$uŠO $x>X- 6ƈhQIwFc':NknTG>ǹ ^(q4Ŝmt86LL&6rh.F @Y8uTy2 mu 5bJj& ;@RF{ 7S΂z#@?1>T4% #IcGTӻ9ss96ɍcyO,+jfjNjkZF{ z[gUFz`˨a~Dl@++O0K;SLdC.n'Ɨd<`|U5!Nչjvjewvxxf#Pg{|]_'X>дD<;Ε0gN>lKV8$8cR)1,^$4A o Cy0zBS K[x/I%x] V- CذNǬsUM>,Mm2[eM\ʴG! KjW|˔;885Mԣ1jmGnxD8<5k=R !jNG %(57E﫰`sY-`d{=F,K ~~tr{;lMj˭kh$xYT˫FńXtYhGɷ"gS0JV21Œ/?gd`"Lݹ"]j0sO4=4)>˽=khsP2FpQ~&=2gm_Xw)$KBF@_b"2tìq b=U{q rfJ06]47s}3/7y%ڣМ|ر74'؛M|CCi1\b&(~+)>z <_uT@&Я&rƺdA~OG2_emr--]?ciceVM"$Ed-2xB'mX6͌J;~˼6|7cƉ`=ΰ9z W7LoZqF!o6Wi 12+kG]/ľpFмQ)j/l~3;2$g@~k,/BRYi-61[< *2I\ٛl. Mw; Z0+˂CF;Ws?vQ'O`EiATyHt˗HNv2-ŀ^g#p!3, Q6_XKu]|yΑի")>`qzCK!P;+5H溗XvyU]MKg:p0(Q'%ߤn-e)vg\'`'ƽqci9͜gxf@Y6-,,ɕ];mvSOe` Xu#G#qtOo e ?TZ)skuh>qX#PP\vgMWq{BzRY5VA_ VŸ3''s>PW!Re%G񕡀*tOV Ҹ)S$эr]hAdB H/xfw榡|˜1FFK|!˂%*vſѸ5#Od&%:446MmƗȆl,H⚐wi 'EGڼ4Ḫc}+kEQ!Sps2NE03MU8Da+'5۔<9ɘuޚM4fBlGà>[U2f&{='>)=K፧T*E_ )ͶZ.RגUpniti s/Srx4 rH)~s1;r󨶰X& wВ.81h)R:./Ǜm:wPpK'^?hҽV+蹣JL)E1hFy{OdtMȖ@f8y  ^rE@amͭNa%8h3,~NnϚa@9Wg2q0F~\qEv,HSا3p=*(j.&]Nl"WDsUrsd Ȥ\ȑ&բ|7J4V]=,w`Rn7 &[4}~oUB(.#ZK'Tl46Lx4iY+|.8Kmd26%ƅ7dHCF8Quh_vbuBK)`[ǒ4/k4`2ɕ}i2((BE͟jѶdxL߰Lm/8_" %7i; i \6ǖd~IĹ|X *P;7'4޾ byjXTG]t/My9J%bv"DoL"eTD$UB%5i{!WR=1XO5ꖢK{Z.;NL?M=׫K* B͎T+do2 ~4VZ/jd ##ޞ@\Ja7wi>a$(ė}d&E[pC]jٰe1֬ąa\P.ډv(FeΗJ0vKz6:m_Ԛ:tfa?StlqA87UVa`Y_ߝCvn$BcEpel:^Ϳk'6W[_AJD]oG-4^> wxR~!ZF+\B|g% o;WL>񸜕ʮGfya&CcLNH;Fc1t/,T۱и&uta Q:+Ù6JQhrEe lVT%YʚJe k]FZi_A}1v_, OzjݙޗHMՏR:p$p4ӨX$|,?ӭӾ4'tZО $)P ZF:x%dȸb|.E?$l0L5嫌g}AӨ`w 1`"i96Vz7*#"(z~[Iʫ8ɋ2[/{Q<)N~1 K6$ LYR&nI⩏^uk3L0Zɖ`Y C[6COˉޤ~!U_ b_*o]ipj?9/M*I:S]z='>դ|LL9{ސt&9n{'ɷJhqVzPQkF~e9,bT:@gCk%GGU"\n}кaVd3&M!ޜ/Ga$Ԝڀ/ll@}5N_adpz9-00f Q&3-S9M *)7lVUNW:gj]&0֍_NY!gUf aЋR':lly{C˻S̙{Ykrh1l„kDgstW7Jzmm\!YCc*/@ Z+4*IX`"tC:6u`Z%S\ђ'xGaԙ#\Ńl0;%*6)]Z䇵lm+ikP^oTx;]I lߢ19Z#CDGP#."--dI X>(TNK""n#BAIhS'?1d y]8U(/cWgP63#brj}lׄf#{]<Ӈ׏Bn1uhz</>+WC3aPx+HX ݺZm?#< iendstream endobj 269 0 obj << /Filter /FlateDecode /Length1 1787 /Length2 11248 /Length3 0 /Length 12255 >> stream xڭUX]ͲqOL@pww-Xpw\wwwwÙZ{/rֹ=\VWW}rbeZAc[C-##@XVEH @N.4p21pr99v&6#  lk`njO;@`nd`5p2ZjXḿNtA++?;J@G И`ln0 Iﰱ.ATilkc0 قAZbVVrSϺdZ9;@NU[,W% ̍mL݀ NFf'g@r_ D%D%ikQI?U33s7_FP"f6F6&V6;+`nc t@ll@[ O&pM4˗mΨp9z`F0LBY i8":ڢzr]?"fZl[:&6[f Gqe`'8Na>(As6V"[:BVJ30`%˟i5 )KP< &M<_*VEDN>jzIヷ V1t½'Νt\Sﰒ?bvPf!<@ Z5TN,,;Ȟ&>0Ou%+MJٔâ F!7FETW.@Al~6խ ݎeI8v30J6V{)'c@;!̈́%هYk 2Q* ã6Ծn]nROsU!vlk߇fsQc" ;+ȩu$}#*??0OC> &!0dN_duZZ@7BR۝F0,G?Nxha/qh,"t}ł'/ЧDTj١O0B)*<$Xht*"r|u 3Z`&'?,gGS2aj[5y$AÞ9p8\R?5{z;dYͅ3 ^bJTf$?&rMrā7=q)2d?>uGd[GNOVޞꞤ+`.5,DF;-$gÞ0#n绒jA. ~[& V@&SxN<A.F E#w>R\&v߾.rRT=W8ξaKXz1uvFJ|򰋷V~'[ vv&՘MV%~L+˔F|}VXXviUc0,52SS'h4*^!, =|G'jc c>5;Q Q@+ĊU2̖pFp6OiO$LCܠhcfƵeǯ[ąÏ%r#`I/,y͎o#sH0Z ]gۨam\K 0gtgkɼ,Z1T?k!2lTKXK]R*h L'*}/9႘2p(Sy56bMnFn‹|BIN2;dAs'8Vtƌj10)uzH`J?8na-mb,{t&([Gs`ªQz ԳK(tLj'?A|ZyK mkzHN; KhYsgRne,W?T<:`څ`N "@Ohwyu0".{Dr eoB e2' 4k'zG8X5*DӆqDKsbذ=SoF*a(iMok+(I{)̵*wg+[Yfq/C tTapT3k-x0[>f!YMk'<x":y6 q>y:{CaFil`#. "diQ<0a]kfX؅ [^v |&`0lw::&|΍ .%@OͼDQ,*OV~#ixSbN JrDth{q9'-uk,*VȄӐGv#$SNݘyJr=oVObCRv!@+c|p*[kHgS9,>,&> NfA3C|MY_P D!*{5SHo~vI4N:Bk0[=Uw>>~ QeW"&T}3wE$EfT]r_έ^>]E"eظO, v#PkV/I担3vcC4soUwv3acMMOU[qoWQv!WCn ClBBi#xA>4֕"!bC>\j>|oP@K #k^بsZ\Zq{X{QPDҜ7Dԗ۱G%q<yQZ#Wdhֳk‘hn)^4V;FQ, 9fCJʹ10_n_V% I"OT8ǵ6ѴxN>KkX5p?zc@DFL9[2ӹ464\}#\d쫧f~Ke}4jة\WGRq MN^;XFp(}-Άm_G&4jE{U<(7U\t8ҋr-)5XŹ LI%;z6˾ڦn)ޟˁuw7".2Ff_ag6B2rtf9$Ժ:d0us i8͐ W}}r7pߖA.HHwD U5-莢C[b>I8~4:_.7F&-_p"AKlRMV?}EM+H2IYrX=ϭT,N'-s@cKm+6P,Ρt+"t(s!loW-.eT40_IöI[zy@; īOf_* zMZZp"XTҸӭ WW_W+?N&IʝfR rtNf*]pQAxt!U;.0uLطt#V*S|"GHK]8`"󭿅N2b76퉚mubGĶ A|ԺB0׭#k%툜UYa7]=!9)1ܑndY /wڥXۈ4 j<48CXϪu=|_԰ 5j 4Xui>ә?7zM GaX1_.4ui! ,#GB Y7RHWDznaE*1ӵΜv gyY Il= Q$}?"@Ih31M'=>cr1lr&p]yK^[h#\5y"Qɏ% GݔlZ4?{MB0~2y,Vc n[^|wntve`Ros^c+bɡk̪Die)G3`o7wd^b=: gs*mᬰ28hТt,^Kru b.agaO=oSN] mȚ#+q9ڏVLcSru]lO-? k )$  $nEa>كyW*ͤ k5#v& ߏ<A)i8M_TjN3 u%^j<^ _<eaT44ylKx^ eưZK`n눗ێ1vtHI 2v ?͂[ ̃oKJMPߐ W\j5 - k!&0jXQ[.Րz9B񛨦O\Q0xVrjSEӦaϗ` nq,CGzm+;svUsIqw';uaנu"(u隁ED0l{O>BQ@\'FcVd'֊c1FB!:]Z23ѓͬ>G?)Dp+HT(j7 ` :KtM*[&f{k/*B+Ey)]=a&fQűH"/n|Mư*SVn[DqVzɱJ\H1zO' »-X:>^7F)4mT4w BaluNS蒫dC~Gvf.HZպ 4:Ujlp1q&SOD.9o{SaxOFrpE0qv^-`ŎE1n镼|W {W-U0l]ǓxH*4Bg$Oj]̀-yUJ\Ԃ8M!3cҼçcZIQYܮ"X& ͕ qF'^nUVS J&0K2߿O{,lnC@GsoQV m(E8 i4:ZcJ0塍?WQ6?FզWo,M(.JJWp^UI(lzݚ((NڱVio 2(T$yY1{sQ\YJeGRn-wD۹vy98Z8%Vc(10gl,5*;/OkHQ`$c=5L,#U^i3Xqn7P-R>-?F8.IΒu_x |1 8)\ƽ(akk~/Ԯ{H]3\0V+I([4VxUf(yC:ixhsJU|!(J?&CkZ.2rPس 0 +- y8%St*^v\9 W#Dav}|:=EJ !ɗ K&1Y:U2Pc(3 Ə,hC,Tw`׽ў )w+T6Y~ōZ,;p_^xP"V# L, 񍢴ĨJLX6 =q髺ڋ!"Xi*Kdb՛12F!6V,rLrӆg Zkąpnc5;;9E D(2 ֐5V4+|񔦣=DiH|LwDCӼwT R,V &b(_NV?f*x.!l//YwA.n@OԺLqfn!2KJr']Β2F#pPn`hF&=1fܧ>D^KPzLӰBkR-2jL٧/q>"G4;qmDR%h[]NL Qa/FlHRIRn+ML9}>C#p4*xAD$%F!"Ky-qu)vVԢ / Ӕ^Sd̽Ubֆގb_!1b͛+1 >ҒY˳$fvShtDzHROgB}Q*f SGЎ0'ͿÜ*/;iIi[rʣև'̦;۷~:jLB|۝5Y@HHad( ev%fIC 'VIrF|__o ׇhYKH# Oe,iQ|&s5l-WM& es1m-+]uW P(N&yV^B:K錉1K5J 4 =sqؓDeI:ø,{6Y_x&RfcLV=8TԿgb(nVTM"YpKqҊ{ᄚ~PU@NdN֮y,]?Gمjӫ>??XH<H%Y/MʤEG˗|.J:t"4JŽFvgx1!_x(xqP _1@PÞy:x)=GoTaLS4Vu {%g`%p f$Au+6(8p0x>I Q/$j?dy>Q>Qab05۷ >16@|^Tm=m~Y#-9(2OVe"(ՂiN[9gd g~6'{3;*((ԐME iy8  us(?"G!&WQ GoLi7wy8ŭ?Y?Z0#>,PCm>{e1kZLğIsLڡ4DiEit2Hc؊F=9NKHUx냌Odl72$_ExJ魥SsxnL$׷蔥GV-=␹64,$5ΪqBw`&&[s76rkGOi]ܐS~Ou)8Uy£0HV*-]= "g >p\rba;DԄ"kx¹@%/~zrNWm`l[hlG7@1tOw|Jf+1łQ2\۷Eًg(M5$o3)qE TzfHw#xu".OtSo&+CA1v z􏣧YlDw,H'CmL{KÏ +6%qhu~V۴Ԛ+J }eyR?=jW{Y5DXo'fؘCAZӮ[ĊDÂzPmYrPӼ_iiafIp_fBo ̥y]- %8Y+Ft?& M}Y:b1TnmlB=0'@_Y"ui`#c̗"҅t "V;la Zo:0m늙jޚ~]ʜXHNY= b)WFoPb0Ө\t=##V`Y(XN_Mp%f6}d :6fnoHnc߂o0s0S{Er&@-w*NU%jwI=jQm `-bP3C\)("Lm 6(Aa9L%KOs)4;΁3@/ۓmiL"-,^0,S4$=:f?} 'iLV*(`b|eWx<:!qUÒIehwծ}Dc!T(U>zEs 3ObsbXFl-LU#TOWu!e)Őr;MK36^?ҩ4l#m.VWh)n|׼w7lX<{h4Q>^Y}eg:^2[P?uZ#M~D"\%XҸwM\Tͳ;t,l9am/5sxL)f4*ȀHD>,ngx-^Y9 w!ޖ' ڋj' یf_]t4,|1[ddڛs(Hؔ({$ב[:H,qT^'!tqxF%FD!2&pR6R:t`bs0|uxNzӶ/SV.z:ol݅#^{ёNc7PnpߖOsݾs^I'{.}5+{u\, kP)nhsv}J u-T'iƮ{=­ZzY7LJ[` H5t.g\@5h_,`| @WhhuMXG'` fqMp?YSXU+.6 m-\q7p.endstream endobj 270 0 obj << /Type /ObjStm /Length 1521 /Filter /FlateDecode /N 81 /First 709 >> stream xXMo6WV-A#m"i>9(ؕ+m>}P.%k{E gR\r,aI  LHaQeRӻc{ʔPxzӄiT0MT2H<Rਖ਼nKiY*R<a|D"0h 1%/@bc ҃R(=hM˄M8xxv𜂋Jk<{1MD DB0,'A.dJ8T0@*A(^gM(YeHóqg+L5g L)WːsC2I YTh(JFI2$RX*"UL.á"Ф9FRtJ(ӟN # *bi,R5<[(ŮR2-4YӔQa:" U;_]*y(]uo_Ŋ]ݲߪ=H'wM =dl~W4]Vdh|ȿ 7s4c*mLAO95nMTSt\L't̀TdϘڰyYW|8A?}QRŮn:^gUxNI:P2&Ҫxd=(;+U]gy_lu^f׻MQ\NN݀a*:g&E~S횲sٻa5r:&!NB?}e Q%몼yCլ`7|6dqxm_faͶc}bf0~n}3Z]s1wïe:kBn]SHyfDf'),ZO9N/z_1ܜ?s֒޻.=/0Ͽ8"6{ڽqZ 8qz 4i@J)[κ#%Sr_Js4q| q`䉙)HѥXHd)RɥH=ʼK]c iFY\NMҥZOM&#25' ~2GF p97 4F4rRN~qZ< )./Bs;pō)tj)q6ᔞpDZ eY1Z&NMy9H\ #b#9'-nf.6oۜ]7MP!"]u-s~d|M5rY*GdHVHY*T" R'IsԨj O EbVY*Tr Kg"U]uG(CSd#[@1ʵ%Q5Pԡm #B3(I"(OBm$Zl[sd&ɌT(j].P4{ABjDI#* b䁺R?tS-rV LX:P&-p GS>8No2G3 ^QEŵJZ?!;=endstream endobj 352 0 obj << /Subtype /XML /Type /Metadata /Length 3967 >> stream application/pdf Roger Koenker University of Illinois at Urbana-Champaign Censored Quantile Regression Redux 2009-04-30T14:31:07-05:00 LaTeX with hyperref package 2016-12-24T14:57:51-05:00 2016-12-24T14:57:51-05:00 quantile regression, censored data pdfTeX-1.40.3 False This is pdfTeX, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6 uuid:e26bf70a-42bf-5245-bdfb-e28975262bc6 uuid:57a61952-0d42-934b-8354-330c224975f2 endstream endobj 353 0 obj << /BBox [ 0.0 0.0 18.0 18.0 ] /Filter /FlateDecode /Resources << /ExtGState << /GS0 << /AIS false /BM /Normal /CA 0.6 /Type /ExtGState /ca 0.6 >> >> >> /Subtype /Form /Type /XObject /Length 294 >> stream HMN0 .Pc=HH,KĆ Xp}^'@jg&b|!_NÍΪr hьzFaNE1)fRȲ" ,yeog/s )BŞN:ᄊ' . nn֩Dս}am ֟ U12qʷ̽u,KdR"CB+:n>kCu %J21dXfqmig & Z=+5VQg!ӲAWǧ!lendstream endobj 354 0 obj << /Type /ObjStm /Length 3229 /Filter /FlateDecode /N 84 /First 757 >> stream x[[SG~_E6P)~Ř-l vٍ0HDhȗ\@r<.i[s49&q) L;gd&su/{Ţwxj S T[4(8XcdQLPL%Le|bZi$Ӛ i@4 @#tLTD!j'Y W4E XV#*)91Xtg"zM="&&f$sO9`O&FBT\DKԩh Z )[ R1FA3 mJc>)p = SYeb!Q@@!*h%2,*IıH,:`*`!:"qb1ZC1bI@jIaI[% %g02LWd)jIja#QP# ~͐Y@%(AROXlo3 b采~~1VلYHioRrR%ϲHorv\}L·jM_&^j0Rϝ+>=xa~vىVw}^Q|1Oj0|UI?_ыea]QM1O8{Zu\+at{j ghTV>xt@* mG{MJ}}<.^ϺX>Į]["jՕaEuW4]ڮBv sBGF;veL!2 4 ;){/sPu3' U"n8Y$g-OwXU!Df 0+@zʥ[ =9.##D9+ç藐tZ0q:a7Efg'U1,MǓ3hEElrI ltMfgli9azY=trRsZy\%(VB#"j[̷*")R爬D|F'$U}/JɓLQ@|̥Cd%>RO# [F8c5З 6:]h%lLIL,9bLf: tL2x4RJM'Hm<~;ӱ87rU#ζt -xn'D̓x*, $bl7҂8MVH8%<&ڞ}إB$s<_5 Lv1%itaVnz{v+ҭ%j7 [Kwxs;VpKE)pYo<*2EXJx x -ws4<  l8~?=ܥlNhβ‚aopնmc7aPCQ-67mh[y]тUzZi-Aӕ:7s=do+'-{&YN+µ*Sʦ} BtE_ SXaa,/S} v?I]Jo " ޤ+ DwpY%'bSFhi.}Reâ;:5/g;1w@J"sR T΋3siy'e6ɤ$[‡Ǖ+|l+?ˈQWnyf>ϊdNZzJw+s\pEl,ޜqXPݝ6AH./Wbʦr60Mff6ٛ7oxQM?VٛEG+8tK=8Bt y_Ei6J'.w. ٻ|2kڿvGFko {rr*0Άk և!572f?2d[O~&Mڂ%\`:{4Z~16&k;q6iq_;mN?-n^}r:ڢ{d&[߽}[rr zemg;%_Tm:l1>$ӝVZ,wM]˺D U#{^V*&[dcqb^Ջq>b'p_b 9#KԵiKDW?8endstream endobj 439 0 obj << /Filter /FlateDecode /Length 3099 >> stream xZ[oF~ϯa,3۹4Y;MeAXV$%ѕhg=eJu 5\d0$7/_|H*mb@,VZ ׃_q=#ctHd7C]Fؖ<.Vs:m3o?sv- 쌓s -&q/+lF3,}o{p㲰p2ڴΰӋDκ]Fi#8n<Ww\G}?jڴO)7xb<}jmip[MὛ,K J131ucc5lgf:pD$Lp^$^ce+.q݊&&#ؤ2q8U'"s'4utRlRH#y%,VF{.$WQ.J8K-{?ֲ$ZЮAeq} 9Bk.P\PlzRFIjΉZ0(B64I#7^X,3qɪ]SF6l@CGEvP$,B@܈>IɡĴo}6%pNA@/DD-=X١lf~8ĎOvu+&: y{Lޙt`""-.j_a-<;Atƌ}xfUn,|9Q8CxF̌} b5J uˊw) FW߮6`y׈I8ufWDe8Q{tפfs n.Ut~%}>^JDhu=r;i9uTFw0Sn$)s}'^tˀbDx QALdm4ig=;.y j雾pت3ow۵8o-Y!P ]TV,d;jћ !F$&5Ao)gIlLpՐک{|'>yO"#,DE뻒b'AfsJyʸűb~Nu:QXٔĈ~EsuG^bY)B))f%ITyO꫷8*ebgb#VOʐ, 7FT $;f&b߉tq#wD/hw$0lFFֻ8LԾG0nᐸк^KJJ㠰[2*`7|6_p͚y]Tǥ^DDd/n/+9u vKOM֕I0& e;!EтaZumx^%T5Oiږ̼s3g?9pBN?lߣyEoQW N"aჄ@!L-r7eLΙ x$ȢfmkLɳGwz2IeFcxz&>=G:e]:3%Sf ] lDmN!ٰMe]lcǍ'B9=dqRnLlgLW-y("K kEI s,ZPF;eU*ى,]ئSdY1N[ owĕ*ldyG<J;(m;k6{$jdѠ[xpQC8cacy`I$b 20Y.>SyV)t NBӡIA*O4i= Wui gS(Ϳ;-dY|F~Vqƙ>or YZi}h:.2| (~, 6%w8qU͒#2O'd$9fq^̊8+;uQEϞ(Y{d4%MJk/X㴦}*A, (R4E5#Am${Y=R`t+oupN4(Os{`}W)Wv$|TW }ʐn'%ҥ쯉xa\cz%Qϻ+mh窱8 ;4=*kkw<$'w!c_ޮ,c-;ҴY}{kj Ht x( jec굋š6$Qr.W|3 &b vwf~"jhk8ɵ JԔHC;,NM7 E+ TpN8Nf87%8MY;)!m{I|zӷP ۛhFVg 22W@nX, "F?r AfR[wY|V_|JT376ܷ)˂,t8& Ғ&Έ|+3ζ 0oX½ݑ^N3%䱭y ䷅}4+|w$olv=Q)E^2H+5;gnf 2~=Ir%: $RS谁֥%{eU>MZJBW^tpǷ2Ϗ)Wʫ9~sեaN:潩3OAl/c?c_D /Iusl8pzuضtendstream endobj 440 0 obj << /Filter /FlateDecode /Length 2013 >> stream xڽX[o6~00@*R,ҭ]:la&Ֆ2_w.,;bdyxx\H9'_M<{HIQR&GA4n4b^vG)k4A/ckiVؼƘGhnZsxLy9c A8.4nm/NE;IW NQgJJu$|李88k[dO#)09|*K&)ڶ^lV+&+nl:Ϫkt`dLF4 @?w2{,q?VR۸#ٰb4 'ş)0|DeiO12;yGYD4'vӖ!h7맸`R5b<4ԭ({Jpt} rn(ɡ9m8}yob6h-Pi')PaSl#2 a$ :FJmf8ޔQllvOy#SLr޴.zDz_ Me1MHq}XB?>i4FfwQ@q(:IMNjüQ  '6Xbi=|B-y4ߋ&xaAq޷X)\"4&m0/c@` e r%w슗]JkB0ݺҎ.×R9$,Y>qM +2Xox@#}+8)JL7{ #;;?7x@SC1Yrģ0U{GhNR/NV$Ae?@HE]pئH =.,䥔x.}2~{~Ƅh|smp l!5TZ w|n;Fs,, :@<D*\F"^ӭ-!zc}p< p rofKiw3Aþ}+[Is"w45E|,m{oPIq.l>C)w! /hB #wgSM,WcsElFi!>RR{#Xz|YE4 @1j J_L@6ޥx׽(rƢHtf]tq/MvFrS'U05닫n2t¨nJJiX%jNv;!Cv5w~{o! G؃gL:gs#KPe v#C?t-Aq/ `QJ/ogJn?6bBjL'wݳmZ?>XSֻ!rxͷQk6aў>#e_\洏>X[[Wưmd>Q:9: IenPYU,*~޷zQ(3$:0 \}G'WB7 htgO]cd]wFҿBD}R۴WuI^-b&]bb gu4x"*TВo/(m uΗU}ITI*!iIEpdߗ1˙єtl)J3\/&K^Xߝ<[ɓ4endstream endobj 441 0 obj << /Filter /FlateDecode /Length1 913 /Length2 3065 /Length3 0 /Length 3663 >> stream xڭy<}+Z('"a0ƾE6lYB}WtHQM{uss| A4Px{P#B$M$ %! ,ID w I))@a2w%`yM"9@$`8It])5X  LA$Ɓ؃']Fyu<(b" (5Sz' S,"]Ϝ@b]< 0@R+O{<_tH,ALBg㡍QFb=_q~j^2Bhb#18HR3eLpMRBRR"|i,$ 'D!8/`p(}(8<P&{,ERP7!b~Cy)7~CJoߐR7ߐ745H+i8r0@ /'∿3ea1C1 x0{EAZGy> h JUXSbA6m9cJXWJ(4-OF@4|S,'͌uc=Y]m,K| n5gwx5/_Y.)%x4}"6^?\~пẞcmv5s,#Wn–cgClB@rTw~qs1ޯ c7*a& ^g !GٚcoxÐ KFqH]T_a$bnW$¸y>|!3Yݓo;nH˰!IgJIv 1%J.Gjjp[zi4vUUhVF섎qc^F'B[Gb mtͪjA&gv'!th$I^'MHMt=̙KcrH6vt?uW{5}v->Vki"*bPfViG!sҊdѼmMͪWQ*;r^="`x=8X|sDpw=^Czj2>aPdl6,p-79Al =ELwي+T@ v`<$ Ŝi=:i  ^hL/U^ϟ'yp0׻]-Qz.W\q0 mkm坯jcwUXb Շ|) ?WSvok|vRW̙(ÛCoAS+٩'.v~yڑ^EhdwLKYg2ڦEЉLs*ݮH{?DN"j|c~l qA(m$  (_ ~K[Ju[+b Ͽu/dy e%܂#Cjw 2Cu9XB^..w ] 6#I>Cz(Rƙjnc[`9^s1Mt+,*(S4҃7)mfV{PNE b-5($\75{{?eM~ }VIܻ˺QsvpD):}7ſX0S/b[Oܖci*qkhGճB&j+7/#Lm*ɟx9Xw# ">k•!_gi+:e( 0$ %E5ɾZ?=99Ye B봐rP ?7h7-iexZ}Qb?x]9hn 6hsX~HE|q@QMX7g[euzodC'yYןW.g5 7DU"gsfiXWzhGH ,5m9ZsG;1O][g2䖖yT4bDI5~mL:lP*#vq%!VPF#ਞ\-qt4<>Y%؀vskOߩ4G\Brs7b͸{$ºObb=PjrEHgHփ0GǢvyU72oCu51iR'?B"pUC5sDGpfp7Ia]0q2J&d3$5NrUNIzk%tQnoglXIybTtVmLkÑl\x ,Tc{A+CoZKL"c-+39u?a񰔍e_֔i)ꟷA 5K \\p)4Ϸɨ_+KQwLɎ4ղO aHj^-=zlOƳ968%}mZBWoan:˖@\`r>QM HDBMm+ּݚ3KK74pzAbd_gTZ\p|DOOo۾qv wUYymGN~J2&{rA0* ¤(Ű8oUh5JiZeZ)>*mz1>Y6=RcM r[#jw3Ect%Ꮹ/uhrX*r]$8Nƞ!K+64m Qgx`{_6;N,;shpw$d|dd:D([UvQPM~!,(Xd$y?%m(Yez#ʧsʞ/T UdUKU6&1Q(+[꜐O]c}b=W?S u)mcϗ?s ͱ. qS)K ZDb ]/衙L~ + R2X>]fR$^G8f'49;'JSa`K}?mx))sbpNdE*/6z6J/^W$PO*ś_3%[`:5{$u΢C{(^Ӗ-ŀ紣_1{ ],qnl1KRcq$j }  3\R}0E\TRZ,L9An}!(GܮZ>#cendstream endobj 442 0 obj << /Filter /FlateDecode /Length1 744 /Length2 1028 /Length3 0 /Length 1544 >> stream xڭ{8Ty[m-YefhLN52qI.59a;sr%OM$ʹEEYbB eKE*Z]UY%|Km1[#w݊FPG0IvbG :f LXRp`h6.b"B x\KB1!J+ e4t:!¡J#!`N!yT)(`J@P@pw5\,HO@ A%$BR XNt<BU\ F4T Kd9# Dp2x"t » +חm>5ՉAqoe h1sLx$E fE !MM 1A`T*P "`2 p |!<>ԕր5"LcIҚA1`G(K0O, aTcBaIq\d2RXio5x^SZ .}ȭ 0s]Soj^6;rp00X)bN)n{2opU.5uO6 b^w2%6Ȥ5ZZ–UmXT53gGꄚQiTC@#C9BY+]5в+"PX?1xnqG‚O}+T=|vB~7%bѓᑇ4gN?o!, q`g@Ohh uVA&E?^Nb.weqE꿪SJ LDѵg.\nR40gNxfv?%9AV1"]PHaLcOXVɘ}dC.T-*9#[ E-X:19TygHڭ}F njkkccPk[gkwu ,F\gIIN]`]a-;- -+KA;m;7#{8*Vg}o۶ΞOc$]F/w[-1]¡9g`͌ jQNqXWOnJ d˳X<Ƽ ϑgPNvJZb'^,{IO-aO8Ɇs&hk1eh62 z+We|m{m%;+Oqm^E9ڬ GI3b"d3L-v?No)XqFoI+rԆ,TCU%endstream endobj 443 0 obj << /Filter /FlateDecode /Length 4167 >> stream xڵَ]_Kf-fa9C  wvDg%9Q쮮*w/|TW&Ϻ3W/ZsTMEyY@6Y9|?\~#6W7ߡy~]46𷅿#zāi>['F[vME5n$Vq^cxoU s99k&n#L,rE$q-໦Ϯےst712Pi͎DxŲsC9:Hr來[=M yfUM=unba3S*cZ*)ywExw&?:mI=(@ *u ߀7p>#ΩHl҄U{| K,?%D_N+!r>ƺUT: ]%ڮvOf)40[`,7],▍isv8 1`52CtV4ä?ɦŖLЄLaK.wRFԁ'2ç-=jlՐI0qQ8,Lǣ@nMӁgYƐ!hxeǘUHQ+u=nn#s5,1/ՙBPK't9y'R*:{qeJHZ|'ug)% j:*N 80=,LJC:?).#I[\  @*N\ԕ ~-xTn]DN(%DuΨ H#Cao=!р<~rl~yvegcjNDь cҬKD^گqY;+˃+%/Ќ"0~ tj{F٭Nܿ# = R{e{e̖uifQt mS*G]bK~Q_b4UTl˞e74<Mm{)MN M֐ߙնaM &&RH b>hjMά-SCf*B^E$o5̾gzTUWB›2>pf&qQz<}.IVC:fvnI M{L%"` Ly,%x PUE:"EmF"nRt7 EYS]>.2eUf&*O]X6MAFkjMt-PC' H|> X?&;ML.\;f9*!i#l5(]q Po+\*A+9Yӿ##%nH-e蒖OH,:R{|dMd?W6|MK0l]L/["DSdȈ\ݣB7aԅ:&$ s+.P5 !W?cxwQL2JŏLJ-7ԔF&4V Fv#2Yu5b|r (3DnQWY֜Fw;QYg*KOK $%P]\@!;hК aE&WRvB+[KT?B(`ȗ}ֻzYqdx~DL!wm٢~P Ͽc`m.uiVMƸ/[&; i?%D+g 4Ů\b,27e 0*hfLmRb lW;i<`QU+ Er&hݣ g.,u^ IƿZ&^(glKNڢc\ѤːЄ}JzҎZk-ZY z>1=^U21͢y9 2Zc\A>psIgPZ۲9|5S/)Hٿ.9UQNf7Ri$&=N0he$~Ɩ>X~ߴ]*v {JdDg*sRYIg{-Hj5%޺ǹUބUant wk#Y/xSZg_ܠ"5xnA"3Mz[ǛMGmNq', _΂z14s30`Tݶp3d"!<zzVwO$?/]l w%pN4 P In&,w\:&⯣t!z\QC@BL~Q Cs=W6s‘4a>Яʛ_h"(RG4?բʣ]f:eڲ#^bce/\片aVS+I& xkԮ+ՏzK:R).ПgLB)/ ƺd7JsޙD~'W4I̍f5ݪVg?B+6 B>H[dm1sz9 :lj8ЎOfϕ_A93AZ=ܡP'uRdčėz0+8JDՁtAp8X+G1p#*awXQoQV HY*+jW Ns$uf}?N06~~CݕJ=)Ɠs;i@x - =Nɵ}$s.9qIɫ2:Z S_\Mz^!9j]K_#֢9쁿7تW"&tRFz~g S\x,*gp̕u5~:Q]cځ:Ά]?tZ͒]3c2*jz="HԤq{4.øwW ~֏LՌ 8scRuf  v;חFC? O3aB;*Q fi)@{/ZMrrruʀKSbEU9> stream x[Y~ׯ Yxٞ戡۰ p2v9ecj{z1sTwUufyɫRegofzվV7O?\̭57_M];4smU?<GWlD olmv>y}:uT[XM#͋R:;gl+l~\j3AG xMxRxڿ[~0Y%9^/.@PPȀey!=H&gqob {U+3zyd(xy-p17!(fikY@8'wqX=]AXWpE^m=_ytMaM>Yoa 82ewb26loLKG DuYh\?E;aso{~yNy)v<_]2A|+2<ϪTomxo+_\'&DnLܬ&xB.瑦T)]jKJF)"`HN!E$c_7,dY(z` zŹWw@| 'b*a{\A7afj6?|t0]趭3W_ӦU;Bwo(eT켪0u׺p%~%9(D$^GQ7u"6ds]iUTF}t_{ԛ٢Qb-FdˁbCQ)|]ғnCo֔ 6`ٓl'qr8xob|[ ` 7 IW 17l|Ɨ(«*RTd"5VNbL˖u,/ zb^ؐ˲J3 SD!Tc(g&Up yh|1t#!d6 :S5Q] Y^ٺz:}'@dժiO}0Ԛz!:w85wr~ċ䆿uT>є M"zEHnI"I ~yu/U> x^OI/JʷBy6LZ*KQզx\(jS@Y)LIg_E.AߥNrj10Dճw|1QrG(D&˛/΁`!H\]n"::o7V)oގi1th ȴd2!-I}ezCKQ]N<}(W``t"&݅Ȑmzj}NԜoIUeAssA \I(U?s@2IĠ?K-_"0>+,_\#\ri[B*R ߷6EQ"{5eYgq.d*:Dl/O>Z>8f+~'e1BVpG,Z E:0mx$T{g:D瑫CME\[zI!>$pxƁs碉'4W~̕p]l K*i8,y.1{U@&,b`'vMg$zCX{(+ 4U Iv>mP'iRutJ.A8n_ّo(uԩe˶-,$9},_CB͵) lY)p)>ź"N}NF"ɣIEyi`o-G<4@Y4Qz2Ss obq ;uoGc\ OAdꈊ.S<0/C>yA!`64^J]39H\MdAs2lFiۄnC]Z9pslΝ[f("r3k8 4lL4uG*5^5w^pZf&tJT_3> A9@PW: xVlBhN:ɨ)0Oc`e])OȼՂ!kWc 4?R6b2.P,+(p7܌y8)׹T8`5&QZM *kjW?jeFOԎ9}Eg .Agw!YPh"')ݘk56;Yozj5\E+q5K)O ]cbqe!lqzDN&6c2R^Ol4dlNzSqHDA{RJv5s V]Mgƭ]@DCrU!&HCRUf#zd_n%ʴZJbm-DūӞܲNP[שJZk7̆'͖2t~Zw'- m5]JQ}XP=CBg-;岫IfAݯ2cf44Sv᚛IK'n'}l_dbZC`F 苛*7o{F [8GYioNzÁ)? ZLJ=n$uxē~3x W7ې)[HDGK$e;dzV:{]*]}(>{FS<Ye5ìIUՓbh2 I OxC{KOVhWd + ]gwBkad3r.~6vfI:=|{'2YymIxdoӎmZJI-9b=itJf@>]$Ҟ\YJ=e Jew^7l#u l/s1~i1h$=ڰ+驸&<:q3p|r3Ө:a;nA56)0LafMO8!ֻ[,.G`W j1)"N-c"V lX$UrH7xP즌ESI=T㢓=f" o/N>xq3'8M8uǷZZWQ\%'SD.AzRS/T8}[WdEaR z +xszl:gƭ`ur:. vJ1K!ŁSRP͋`>Fendstream endobj 445 0 obj << /Filter /FlateDecode /Length 4358 >> stream x[Y~_!%آ샤 !  $8G#X:ΟO}rZ#X컫d9)'ˋOz"ʢ-[1yq;iĤuJ=y_ӯ2n$d]hhYr/k1ϰLJ9^WO+=7/wXa-k\Ui<^̭e&u+'Uh&yvnvX>̱l Upw=~fj_ᾢA:;=gPKcW[𧚺-o,ݎ+o;,Ox]5'Vg_V`@, MUk5͔c G8qzS+6Ehw?RVX.*j¤V*=m;Z폴3X/v[](fRMm7aVE`en~]T [en~e!;V0㪧_䦮`ǵqsCĺpWXxeQ~@@&%,+{^MNdݖ$*𺋘&+*ڪ% ǹUuQ#b,H^#w D,5>g.wCRt.eJ ]1H2^;فl wH%zWӃUsq>ݛB}Ritȓ~eB5pf 3豳^zݺ++M o`0~AXpʥtI@VѡF<FAQw%'($󛱏,xD0@E],ORߍeê)-ny;6ݎ- ғ3 o}h?d{E]Տ_hZ/h<ѲY<quvcwAɖTAd۔?1pӜpH*7POi1tx N!MuіQӟTsG >[q8 X<->۴v\b| ϡKxaFtx@tH[YPRK}omg;Xy+tp&mXtbFA;Z|8ƛ@xϿ'5NiZ`}NiZy6K4w]MVʢTI =@cDŽ*S ғlm>n=G;[X̶{e4GKa?/wMN Vjx1-7lO@9탩-9flVBW"z(|Re "MRuSO"M}&&=q]/zn"O-;QN XIʿ3SBJS{ΧMx"'5}e! b.c1YGcsuގuf`:/_u`M/ԉXB?XXn&kUmaiwdyK)Ni ?'3]UB=ٸ&,뤕 X%\~.؈U5l[Y >ہkgv{CYĶPh%`R{;=m2:0DCδF*gb [(X9][s'SC>s1q`X>l0tXxx¹2ymY:@AsF \uQ 3K^#'!S nVi Bb+챨Lk dodi\=[lE֚;:DX_znVPS6z[N>J .;RyV@,9fUIZ1/5829,=aP4*,79Q~d̀]Y3={GvŔVtCjWRNckp90paîd'0lq}qYC?s? ztX*@Pd^G9:oDOJȖkUB=w"{gyB Od<08%H8VEʦ\ZIFgVD. ƜZpe2-8bek>3_T@\{^aɔ˽\ JF<M29d (.ڴVu3% @k.!c ([tP{ ~vnzЃ";аB4͓L -mЮe޹z^Yh.vgp_9{f6C G@/M&A3 K:l R3V G0mo:lq!.g 67NAvZJο%tC~㎋iW:qK+EfGqu9u<b*ۺw?QH7Q疁skЁUt^C61CkEUozN&9D5'jۻ]R.S[E,UgŴABeQRÑCA[sSίew{gʠ%ꄪ36zsa Z<^6Ɔ Gk 31KqpIv-r-%y"$8Ld W1krXEV a[#.|]U`dTPd@&/˳^spdrW=&Xk}Ыf+=.. jWDrx śNj?5G7:vR1ox1VCɪT՝z^Z.[:~>T2dTptL|e rP%8['S1/s:4ܡVI@uR9cЌCWZ? ]-m嗱[Q9X0jS_#)%} j5[x"AmȌ5\L1pB21u$+eX[C2D{o_~w{9#^ Ko-PIy!Hwނ+9vҞ6x y:-NS8YzFϺTM#`h7G/G6{@t:̦>:9|JZ.1$:G!6x&Ѯۥ{aVE]sv5"[De $:qa_=g~#/ˋcy.a E~Lǯ;'pL&L?[i uiZs 4t= >Px&!&عepU`Mz"@f-'PO< yDo3Y1Ru\Pu8GK]Cܷ`Zoj9ĺz؞{fVxs27Woϰ<;tVw.jgOC@qCÖOGnޅ 8 زuzԄVX.hojq?-"7P>/8֟ bx_]FuvA<ܐW/ endstream endobj 446 0 obj << /Filter /FlateDecode /Length 4217 >> stream x[Y~_!I,͛qxm簝q`;W%ߞ:ZACꪯzjNu:1iҦ<,'&/I]Iê?vGmWSSM4u +#klsR'0*n0\pUT/`궘¤RT _n}D!n~\Ys9/^__citAs,&a3p}OӖtQR|zy:|IˉW>")LycҬ!MLYh,uc"M~Hc5Iє(E0?%,k'3'erװޢ*(B.vcAEBYquO\acXqcHI;\*/$U$q{#*k d9J…d!,,NEiR$SB]ۭIʲ̼v?m[E儨~dE~-ikT^=]|6\44&T1.*1.u#VBM?2)uҔw_<ܽ3$U')utJȫkjvt^wg=RcUp8Kww(x/UFW\5PK%$I+Ae:9Wˁ[g)虶_-2:=b2iͣ\o+NWلg`PM/VN!kخzzMzQkޒ{=] +53gYi7+pb59Ϭh `"tVUo}(5VtnEw[UPG^, y&KZ7)Pbu³jl!,Jm>9Ut2ɬ-UGdҭ"q &I9Ț_뮭~]қmab"ނwPK%WZ^d;N1,GYQDFGw.T +]9."ص^bgeSYկPUvz:~-m:K? jn* 빅c!7Ĉ^jFQ9+{"W>wEd0bׁD@H۩:CKhrZM EZ X;M:%X%K>rZ^Uc-؝Y=w: ;U~G cH6M<3mێWlCS AxUe .M6{2qٶ@GjfY&Y]KKdT+"#^u'rs5Ͷ!fli5}^g:^)'xKk} %6~"Șw,(EKq9vcd:$3"b͓ƕb_KtsaƒQlS~'w"z|NIiGo _'Su:[ #C~Ni~kQĕgUee0.FJ)s!xmad?egEԹ u?!{KȉJcTJ6&[J PMPEVYz,no4Z2}Y RY#D!vqskUR`:iP;H@++3Kر, nʁj!7,"{"5rFv_5ΆsqYhnp?FaxJB~DʚA-8NOO< N/V=GRp?S7KG3p9~fm#|kǏo Yh wpmdeuv<~#x[Y2mx='G PvLmI-NGd!KXZ=&_iWCƃubEAU^/yP?3]nDIG#ߗ » đXzDlݞANU*a0,$$Ύ5.̯ä.qPp2uɞ-8S#N_#!pɳpX\0$Hi-^}\V6ɝs}h \NAUX(N]7$$EeO_b5sUo%qޣ%I?1v;e[I=`^Hԡk4y/yTC3%a;q+s&s3u Ddr,yna"-܇A'g/mP?.)&05O607ɒ: X p WfuŦo]DgM†ē*P# U(/„PIZM2:`(s͍DE0T#3J yɪ G@ā^UzwY ·]F٨ek_ư{AK1%pa 3e;&Fx*@%*Rb'q8jVm/[)x ȓpFSuXnҚeIJۛM4d(t#HXbmݖug([zm&9W'u?"p4L-ΞoN@cgUarLNh-{OȚq8Z7@6ǚ=5d,rۑ2wɬK2kq/ Lc4@BQp kq=cHna֞ +9h8"P?JlEL6d₝&T2 )Ͽ*[$AVtyge*pM% Փnֲa~N`hOxOk?N@`+mRR@*,'ekGonzKjZRv) =2';?Yf[ZE^$7}?PC鮪 ~t\4GW*ͣhf%/$+G`:d .3BΣҋL&:W)QlbJNW .K$ `U?rX5t'`,ev8J夲X0爇 s\;fvغXHwA;rʩ!\+pǧda7^ ؅j(=N ͯNTCDyB3|)jAsZʲmVBA~ GV0k 5ҥM&+ጓc\{qn]bZnSCK hv\]ڤq & +LWnjJ;&yօQ"F1}DLi2$E4q䧽9C{qD/?}.?dijh7#5zl#(uO I 4[x-;QYoUn5W9ͮ낄oU?{EDbx%?3`%\* E>_$`={߯c3ju{O™l#fBd`-]FxNPY w|6`ҫU@qyE7OQv%`s`C{K ޺1t`HzS,#`p0z=q6+ 5j![p%QJg N',@k`=t/JO_\4~;UyhFFaWyl73JsrήxFG{&y?'P(wE@0pHb[] -ύĂUwv>6SFC 7ef'7ophQjfA Z™\ad G0,3 ^f ߑ;`.DFO8fAI$Kz*/Aendstream endobj 447 0 obj << /BBox [ 0 0 432 576 ] /FormType 1 /PTEX.FileName (./figs/Ex1.pdf) /PTEX.InfoDict 221 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 222 0 R /F2 223 0 R /F3 224 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 18980 /Filter /FlateDecode >> stream xK-+Vg.  $=xHh:}2b\Ug̪}hgtt#/O>SJ_^G/?}ǿT>Z-m~s[ (%}gZu)ٟ?>S7tOm|?(} \m6?{}mq[NWq~ɥ}ꕕ*^gE|>K<}n3:}9ƾNy\G;W_OwA\Uܯo37|z-\۴ik~Z*vb vW,[O\Evu~ziܩ{>YF*~U @yՙz\5g_Sv]I⩿P}\&3^?-$>v?Z5|/[\^ks!H3@v@gn `Jad!XzjD iUVaw$x=(we|뮫m,<)W ~q]9_^UJׅ%z9^s,gYTc|tU =B.V*;Vꕢگu6d$`ӹPPl\Wa/FlY^ڊ_MnoBvZ޿y;IM{.S;={soOx}Z37E{ϙt 譵_O+_yɿ}p}_9)lW/+],﷉|Ϻ9F #ȭL]k|O.s AIr5EpvI'Kr@p2a5O_PbJh?ݟK;g7@/~͍k  ,bY0eک=ᮂRX>x_2lyW9.uNqJH֫m0ڗlQ}xImF db^- kZɥgj1Ő@2WH\"q? Y1ّ8FKƃ`.P뗬W $HNṑd4Kv\rIfFd#C(;*h"W*a;ޘ s yOH_[4ӥ꾮H&JBW}l r;WލSr;$'ټj-E95:eE4yu7ˌ9=r/%S.basDAdȹfdՄtן}r;5! Y ZAlXl٧W%,`]^VS#tM A9quƃd_}^vfXU5"EGԑA T4zC/m4LWgqA58lrB\2zwX1,@6&[{B#~ q5&,萆+a {^vmޮFEOdL^*}vQ]y_r֐/}o< ;y=<.#ZDh'oGhA8dYNCt \5rL{{ʐ=~Ɂ0^5F )>pS!Ldb6i9_ndϕoHg1\J_kQ'9̢~՝0׭JH) jc&tKձe.d_wP8)r KVGW >- C%'Ԙ{Y OO+>W.Q1Xz6XK@6{5l^QZ/16yɉ_%SC 3&zI_p^;"W PasɊHKɎ)SQUszYb#{=ٌ}n}f3Arh(vCa#$-atK..UK7FKv(WsJq>qP1s=]Ԯ,Q4QoFO0= u<u̇&밠ESkb0}弿M׽wUv*޽z;DwqkK/XŤuX&C gabkz҂nZ;V9&k|+(Ȉk^IU43ױ*j0:5_FԨ||dֵ̮QOw|+^RNr];wUk\:UXDW=oE_C/}Fx/~f_'|ߌU/9Y=SJΟ+~gox֨1Ϟ;6F'Yby^.OgE5LT@nM>tu71j \z~?7) MaKG~W9͆ u,] ˤ6]{}'}bG;94ѥwR{~+h~g\G޿,(+gRHQKRH;4l-7,5e/G.U_# XIHqu>'=S@)R)WێR@)zNSP)6bH})Hh0AO8b]%GQ߻8Qԣ,ט~6w$sܫd8,n;D7m3›K%w4o-LiؗTń1bt@N6p4 _Jķ`pV0EveZkg蕖6GGlGA?& jeO-x֐g%ɿNNF˗;>Ȏ_跻K|_J՝$}:_j/5I]_Fe,LuEq^-'g7sh~+%J>tb.. cb]Zu,ZEެC>ʰ QxK޾н=_cu޴死9F,azEpWyhLޏ얆I< 9VAĵ\@,;u]tcP)iۋś,JأO-cGX3\Z΄ۣ߻ÈGӶ)`dh(;>9&?ǂ0hqg ~jsUmb#إ;bX*Z 4?R kԆ0t+dzOlɻ4&uA ԕ]C^ }Qt[gWHkGAbk5oFz3ɘ{;lv{td ;_\gjw$L5\wWǝ(Zp q73< UfumP+=zsו\E^_Gotլ%WyLХ SzpMS4@w kF6_L\3=\k)}ϭ]`#P%on)zTFA8Cyuк6WPYp/9#R7֩'wi gy,-bRdFZ\ki1]Y2O<|$BWdxu}FSrp#Į;u?>s+p2c-wu=4zNG^C0yr+ GƜ"k7\D`9\υbEy~%!U23] \MwR4c/QDuk6 WC/=P>h!_m׶tA~ d۵~j$j|<ԭ{p'O턫\O܏Qp=>3ޗ׾>twj5EIW0~<>#Nh][Quϥ Ik4?q=v`mh?r6̡3~c\vMả}3a7k'7 %M3~/mhh_l6ogО/=-QC S<:DG.?Scv^sIL* elZxKh5+ץ?߭jkU=j>5~ Б] lt#;F{E_C{wݐ~VjʰZiN&Neg}D7C 1qucPg~X]uU3?EcOX/0:{2=!еYj-Z?\G*a~Cu2C/]q[ko&{~i翮}~eO<zS. ˜t^W]W8BϩA^io|G4ڣko/]5]w`:Cgf-L^&{1W(Ե׷/CuCszrZw\G-\":ٿ:j6AJ ur##;tӤw}0߽j&WץSh?~1?H^{? 6w\ <{zB~/ۑ^5K_RK%wztJ),r/ϽGC >~W(BuBeZCaZ~ G s>RWw)BIB}n*wxƞ«q_=MЖK,>B Њ#G,_r7VLVl9.X/lF>kl!& 3G/ǫ> JC#8/`N^Vl=K"VOӬX9K K2P;ٰ?˜ame"#ʻzz}r 8:r}o3q7i,&抻Hgr|Uou֠k-/+ Zoxm-pz憘XhɭWyi5B;d>sk=a==Ye8Y~Bs"߿ V߾k&b]=y3~W}6,~דZ6RcyEx{*bAFoR_)*kOy`#=q _v ]òuھTӘ31fqFE۩fU#H?QF5Ltb l6#?{ZɽK |AdLooE"{߫1z~e>}-v`Ϙ8C똿tx눕jث@AgKg-b>29A@{qz޸wl !9^:VukAyB,g%ĚzZU00rX'+%kX=׷a_'L"V5b'WElqޫe'}ޢȯV {-\.#sc%QΕz-'>>8@ץ%wu5AQG3 L .@HrwmyP4t{/ pMgQr&(H?л*Cw7Rxu::}w~)/=[cqX^_{_fGy\wrSx)5:C)x~?Mʮ׬ٓ&yzns[Ew{Ju/zU^xa8_N}r8aT|u(Ͽ$~džhbnE|&z0GXoj,WkUVe fSСG@\9V..lYj X |f<aYi%O%7sg/wEHn7OG:s[DY5K( ,r Yܕ3]!eYe]Cg׬lu#tTA̭Q \or}(ҟs}?J{?bn+zFOK\ 쁘h*:kcW.nbp-M$EOM~WyBq>z?>JbnYq!1 >1׻ӵ1&#b7XӾ!P)oڿ,b3uڿ cIX~fÃh_k28Mh`g8x,.5t ]bjrC-cbnYS$_~_\V bKbiM<&bnM<K.|hrnbK,C|sCƚ-BRS717k7" T%[s]bnQ@Q 1帉AuS(;LPIs"\/`ZC D&'B[֍ȝw] 溌I6.]Jn$yswۘl 燈.#bnMhC@=\_4&K#]a(ii}soB*"B+V ƺ#Į\8lF6 ֌*NZGY b0  "742`dA KDnQ '<.A-x_"t@5b˰ V]E̍艱~y8s e @< G!bn!bn<7rd17Lec D|BQ,%"7{VbRA c>Dusss~Mu9a2L]@u +<@̍?{\N"r+KDkqoEUDD/8S/WL+t̑}x m]V F-DYuL2aB2`y abnY<bn$2tN17M̍!5*eiܘQsc@܌Մ:fIsw[A&bnԛj%1Mܚ15 1թYX s]Wr}I&1uQ7V Uq>>=@A՜Epʉ8"Ʊ;_$Z|yL\_Uq[wAܤMs}ID - ,Q[ mZdqs >u-OAn?q=~/b듘 L]X^z*/fD@uϜl F$s+&]DZhυ&s^ߥcb@|1} N6t_ѩWՆ$1wL.p},S zyscO*]$DG{17vd*/A뮟 =# $*@ ƪ}8!17v$V b߿aH̍x>C-BE2vh̫#w;$;w>h1F`Ixe$1ףە71W})@>Sph) r>RXaL)K 1RrgWI-$yP\Rrݎw[!%׭xrW.{Pz"/(1)nW;OYk6Jn8$gs#1,qdԸ8uܟ%]>rHqY` Yi~PrKqferc8ؼ3>xW#$w\(7%()7%Ѥh%g :esKJnuPr}ۦL~%5ף"s9JkC@u w(EwRr]j Jn%7j..b'RrI.9DxwQq+gQqxu}6< wOח4ꀒ[&CNz~(E kFT>8DN;y2\I݆了h=d')<|@GN#=( #=12S/ M%ܔ]5tǂ[f8޿_ov (e zc\7M\^AeRrIJé.3D%賮䆞a/D-%5(a}~ܢo[FRr>GJ(}=ܣ<"DV1Pr]OPc#T=PrXϰtgz;{)`P\נ[6\5HPr]|@u j(Ae%RMJn_Iɍթ'Z'%wHuM1oH1n %k#0s7(wzϿ5ؐ~lp+#F\d)?(_QpFAa%LQ: Cn-"%u=(Q='7N*F{_8TBPr>GJne"=)%7 ~aSAuJn\?(u=ƻ$kp@ʦPJ*(Eu |QI=%lJ1(2TيxNJn+Rrcv& nA:l1^oST\ZD'| z}D@קy\כ˙>M D3~3ܻ=S>#& pPr]ÞWI(?/vZ(oQA Wg^OQޠF<(|XN) .OM )1,1Oxoנz{PrD)ꓔ8_t܂i7Qrc݋JnAuܲ)>(N{DU%,@JHjJnYF (M|j&jnkSu rPrDV؇MI 706H"\MJkt&%7҆p:(~So=|E%=th? QtؓHJnd[dHHݛ(Hɭ)߄Ij&Qq vwl nt)=#] 3\Jnx'uAx=K7A @RJn6«UTj%7±0ރы.jno֚~?z?(E7;D] L[QAɭ<·N\@\,ߊB J?ہP~÷Ċ)1]G)*bw #aw #s|-)÷<8|KJ_8$p{(8(LyƝ#)lSmYNA}@wN%<g\_.}z9/}ѫ?/>:}w<>~_5$Cۿ_!VxesXL\E,uE|𳽐}>ŢollNmDk_XRem׭=[+1IKp-r=]1Ə<`|po|o\˛.ۼdF̯YbT8K^|vVaXՠ-ťU#|tbYe/E딭nqɾ}gHu*WCo}Ⱦ{߮!]1$ 5a~~MetR7|&7ʳSw4Ɛ\"H,OoH 7ɷ.oGyFbpb+X2ɾ77귰@ ."}LYt<7wi]ohmޏ_"=}\oW^>U}úO*}] !mo8 iK"fȍXm;ɾo"]^ הVz:w e=pɾapUoH~OzPwNm=+#]1idoA#8s}P{GA-A$z}amg_o}co'0{=}cߤhIz}$5g [/mh@ Gd߲ɭ n"&ďѾ@9Ⱦw[&Oo1'1Au]IOIoj =\c|H F3H {˗d^dߨ{}&SdbOAkj1ɜ$["f%-,@G~ȵAuMk?) J c&o/''}_t_n^}ed_& 6;du!?C0"Rod߂mD p"$3޾I؏6Id߂&o :Ⱦ^>K$_~fyR>Z\K"p:^Cw@Ia]gZ&/@QH/uu#D&~Λg/ɾ"{8 B'@$f8'7?c}k=# ZߓCo?ȾG$$9DMש &ULdM TAiHG`:N)d }9ɾ*`_BX_]P_]W_tj_}yǂ{h]|ϻ|۾|Gl'77|@evhePU/t}5zk_O5mLN0qKWtqWߋCPF17p)p& W0Y@*r ' 0b2\#p`QMk 0rG4r{+P>"" eB٤%DZr~8e5wQ [D*&VNn+E .V!Э 5=Pn= 4?U[W5v?=SG5\M˽X@۪\@5b-5~_\[P}n rSF9F W&nmW{&hZ0[͐`+eP/IکC[4[JO3B4"lD\ 10bɯEP+A4:eȮo"? 6qY]S l-`lZ 'l+ ʼn+9C`ڼ )asjij!vl/QkUt"Z.L횢v@HĬ&$UJ% O8k'ViW_M}_(kY豚]XH.QxrPi#V@2i^dfɤLkb&&m4Oh曘 I&mh,obW1h/ U $'3lJ\b&4z8EU+=]鯌DcYźL:֐c<^ãbb)8Ezr)^`p ڧ1VLjx#Wcn?8nm`@BױAi_'h⾾bžy\wN| ӝYӋC^ 5OIi{poFz|VR,rGT_k|sX5ѷW~ M;G_7lHƋH%aGڨS V}{0uzHsZaBf]CBW#I;~fq/lپ+׫G0xH沿'3s~?|Y bςZK,51L^UvAt8fW+=&/l$Zm(;o' C CٓC{bC, DQI$k Yrdm<9(I,Ve)fOÄZ2d}OB˴Yn|]p7t#!n|+֞EYi|&t΂i,z# wic6Ipz"՟ JR_ G| 1?AL1`q }zXM&9O9&RcڬX&rjgm'(Vȉ.ljlKnjX~SG 0b % (G\1qqذ~Cxam['}EZD60I0a $Nk Ɲϸ4]jYi04#5NrH B +;1EU_pv4 `\=$V5} W&_uWn_-NP~uȯօu`}5bG})R_7W$UG2|Չ-_=p_5!u1{U,W[W7۵ (]U-z=wzc\&p?h2Wf〹b$Z o g[]߾"UlW9ۉvFȮ&DjB*F/jPW%UGttՉj]]&ʕw ՄUgIsřodnD䪞B󺌳o¸T):$H 8 jZ%6Yj@o5~{D5ȭڸ=}tf.j<Bd+!Dl%U֌Vr&\mZm`v ֊X:JMTn zv\ApZ;L)g4~BA{ٖ}mVAV8 j]|¯U!Y5+ Uc(ɬj˪cIJ46^:J&bMDSL"nI}!qXmƂŪ{D& 1A 7P`5a!ʭ1Dϲ2s9։UQWXu[BWu|U7lH_^5UVApWQ vDeu'tՆ: ѦiĐ PVi$nL?5i"$g$njȂ"iN<i**"j46AWiWi1bDaUP Xq^˖)&ۋ N J,+UO @qpUrUqDUuqSph˖UH8V䩮8o-##I@?lR.H+ <;%Gu%M`T7uI@TWCuMDwC*z.Bax\U ICN] 7ɩ?A%jA#3uu!c\DD/TK]K7IK K]SM4fkt/#)u PwI] xJ|x/M$I<Ҏh;G<ӾNy_Ǯ}~>~&4Hh"!Oi;T溑}k8y\>}^Y+4BPLQÖ)~wqTR:7O\i^$K= UI/@gxkH7 Ǘrʁ/ K|S49u-c\2FηhL\6BL09ne:9 Ic cC-)G;-B |) o4? ɹ؝z).;Ӈ9UeÓ*UyFݩ^JקCUw6 [Unen +  7E{kKApi.xMKs:u\:.L>IpiS!7fK[ .piQ{^f8K K# p[ .]W^MȵJ0z"A)rLN^dG`/#_rq"|fd`}(Mp&ZF:+4ig`= R)28NRz[gyܳqKysKt-u3>nm\2䖺F[Khp- niF]+u7_EFpK#8?58?gh=ԯ'qN,.i[ڨcx[34tf~8 +q^#]ct uhnSWrKc-K4(哥4cR4[R}ڣ7a_u}!e=P niRց[[oQG;9~T&/:;WpKC7N{xpKF2{pKÞfkl(N)ʹ-!S/.>h?pD6_\Sk};7h@F%1q;#_qI;K46'fh,lWQ}QG(I]Q~F~FCӶ86|W]3&4ң'Ѿ&5kqpKejΧ8FmMң {q2Wbg}/+~wRװon┶%7qK]gqIҧ[zd- Wю>8=^7>ukR_}-Ðv{7z!s8O8i'.iw"'~G8|u4t8V5m88QcsK#.)P򱹥[A>ƑN?qϏ-Ʒ4pK''ݴrV<<~ 4'r-zy,njʼn_rKni O[ qL$ ԟW@z}fa*Ō\A՟7޴endstream endobj 448 0 obj << /Filter /FlateDecode /Length 620 >> stream x}TMo0 WX.ۺk;8jf-GҬY8GQRv,auDWI%Xe`*J*Vw/ßզH|Ef݇g]I) gxc<=#x7<[>zßAX{4HUD4Ӥ` _V2q.%-!y!,~E؅QkϹ"/ESe ΓU #E?1: } ͦ0!KO =v}퍍јpc+>H "9)3>m-6n}\h]~&3?a.T|`0._݃9"a#ΤWv}Ntj"er)npTzd>RohM_2#3P@ȉM )+WGA"/l݀`b;Mp ps0 8Ei4_,o]@<r=o~״ܿ#Ϊr_Hj endstream endobj 449 0 obj << /BBox [ 0 0 432 432 ] /FormType 1 /PTEX.FileName (./figs/Ex2.pdf) /PTEX.InfoDict 234 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 235 0 R /F2 236 0 R /F3 237 0 R /F6 238 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 3814 /Filter /FlateDecode >> stream xO)xfC^$`[H xc*,_?]=CjvZw*Ms4_n~a_]2wn辿?݌zfin:.C-KpuSv~=vz!9p~u$o~R7v}aX>T9uݫo~7'ݘܗrqI7tn\~78}u3o0ue?;>'+]W}e4.חY]ܯ뇧}y]zlw5Y+MϹmEeۖgܖoVc7Ӏ6Qe.ߤL/e cÝ27g8~,]J?_v?ݾ_7?޾yow_݋R7.P'}׭`8^.? |[tt۾%{1Q붇RFuu0O/KۦCכ_?2eN6\6'B3f*O^=ruѕ]ID'zdQeZC#;e5oZpg>bjDud8'E|U#kZC#ќվpgw}]trr2[Vkh$3ۧlu3 j$ܱi"[pg&f54$}4QH4c+R5ͱ0 UxwhdF9~MpG w&6 Foa6\#΂[G546͙[MWΒ-1&5,Z{m`WzlX$ץj$$dZ wm4H4u]KHtj DsF$V54ؔyo\5%#gh$q, ^8_)%٪j׶R:8)E'IH#_ ?p2D2C/KՖIHy 8-6MVkh$I^H7(تFEwجHSX8:جёfc:tG54,>o 8ٶXH3՟QH&,` wowYcڠ;:X 5\5Є5k$6 |ۜe=sFvp)>%S;MɇM+4u皁 6mVqM#|a=zzLwXcQT`+K Nê2n}j[UUX5TƭS>~X 2n}LeaSFʸ;a*V[_ LeaS2LezS~JU#Lez S^^aS2LeqFʸ 2n0qk[UgV0qk[_j[2nVU/zXa*aaV0q LeL}aS~ê2neʸê2neʸU#Lez S>j[LeUO`*S>~X5Tƭg}FzS shf)]drmӟ\m}YK c,pw~}~7LL~7ڛLeendstream endobj 450 0 obj << /Filter /FlateDecode /Length 1986 >> stream xڭXYsF ~j#֝Iuvr(if>P-EŹ\t⇎G& `cAz<=z|z#ss/GˑƮ4N#?]TEzyaD3 m}IʎY(֤4i pfq{wB?ޡ91 j!QN fŞ 0gMIhK]h,QlhF6 2=JdY.-V0+pC:E^bG"*`ݥeu;X8uۊL뒍SՐ6]A}p;Ua-^kە=L!\53mlmpd4  [SqV%Щ`zhya`<7R1R"N?Nۚvb\al|Gr-o-b`9G˂F8b9/<$?ً{M[qk+vzԦ!]1G9RvLݸ`x ',a~¥Bc̠0-@uNW|2K9VZMzye։%)\HAJeNb#Uɳ+!Ny4E6F$Ho_C@beFO]N97>zUʧh!p.&o3[Hه7ګfq6Tz6đwɣRg]󚑢SB<"0Ā{ywh ZtDRC`Vۓ)Iq ;zwdg{kF2Ysu_6[5Ոt&oLDy2B&Aঙdk g7'HTL+fϷϏAzw {)PЃ_~LytT\kszQ\~Ñ;{_"Ũ}BJ?R2jNtCZ2Pz ]Zɭ`ÅsqJ_\[ɏO:z9tyMYW2>A\y[|i?.|Y!/TH\JPvpIq狕*;䘽~%~u1qxUk(“n}ujov&MHӱ0Ch>X͘tXO!7ȾˠwBڈm2yc&侱wA!ԅԇv}p%^>b?MPoͦ©eP-~f57m'ɸs'{&ǂi!} dqc`#rN~(W-ggVo'Ͱc 4%b/5gFIC&?igWٛga$Sj^Wk̗_l:''tt-iendstream endobj 451 0 obj << /Filter /FlateDecode /Length 4331 >> stream x\sƑ: 0@.;FeϩH.XdZy_? HKJ!Zzzzzճ77D]uu'ffYcNj~.ﯿ7Nk Z5 Uz})RJoq)O[w\V0>)[a󟐂<&rL6 Swx<|G}n$1k-4|w-nh4s?0=뀝kA5=%sr6+R*˄8܏~K~~L fP=C[Bv( } I=7:H>^Xjx:y8"am}Hlxv@NJ?$[W OckD)MH l74|+I[X,Ɨux ?o!,rQIS;UfGϏ\ދyD [Zgvb10Ymji`Y76+T87*.»$>d xX~ꑂPQr}t'!OFnꚧZr8M{gZS G&+I}%⊯6&S5YxdўwcV`B٬9 }j'7ը@<~㸵yd=&@D>>eK tϤPоľd깴E'XAhF#Aݚ_hp :$9(ؑ1gk3bKeG7},6aT3_F˷gĞׂ.0[*7U?_;wMxAK0P-Õݾ82iG5'> ?V.(W}Fu44xeyv\ҕi ^EHlJǥ7]-(W3G7)[&=zcMig`Σ-+Z][՟/[ŋ`!&h=M6=i4cCPޯi^[6$Cd2D{lX!fpmP32;,MuՊosStϤp$0`5{f%H6# x!Yel vaCg0AFgR+&I{0F*8JL:2b@9}KT-{J$yʩ;b?WȨ͎pDRǬUMI9qݢk;g> hۃ:'IwLe 'UHfRN ~" *0mąwUe!<y$omS=N)>:TNS ԣrEޗk;x%FH\T>Wa O=تbJQZɴFKפuH~&/QxIaBGs]tC]߶(MiCaDނ3ƢCdСVHBsn¦!>.~aq:|gjpr$xM@=57]<:wM|s)JL PտijH ]]Rb+uZ<źRT+VPVBS:f5QZyW s;W3 pOMj^}}ㅠ1PJ/^._VPݬ4'i蘂Mw?]:ҵ,K~k_O 2\,;'uJ>6*WߗE ?s/UXM,rT6X*^A"R ômu?FdhQMvFU=A N͵f"]A a&Y_&:J%O@qD)kiI6IpI+=XN(!m`@5(%^ġ@7Yy .C)Rd?L=eΡ*;\Ng.- ZT^zTO&kd'\$g \zduj0 i]pCtz0!-CϮWDAWP>y*SZRg6ĠF]]Dnz6'hbhe_ ZA& }gRA5f~R-vxׅO/Q W !Z:iǣ)I$ ?l5Im18-l8MT/d6>&e*uN@騽9?€J{r*(DSE)_q瞎 {e9.U>&%sIIy]wV[$>3Ҿb;Z> stream x[ms۸_ogBx34ir7K|^2،%,wwRJ#;M&%.b_4+|wtp-2^(yv!R3.xfeIzr~Z]R|4?̅U3PS)F&7>Z~O?pqh|og1H{:;|{\.aΖ-s$:(Yr`)q9j *\rKx/X_c xVr/7cB?:5"n5ߧ~?%}{7k .h')53լ) ErHo(8W4v`a0e҅=ME24 RbǕ?9:Ϡə(-SL6;~[d'p (MvMLL8ygo |`N1^ؠXaMi۪O˞.krdGNjPNr}5ݩ]af0mB0WJ͠J| VIח޾Kr H6Ze*UFksuө tE{rɸe,3킃S+޵ܩHʤH4\K"m̸mYmk"/巩_S`/:v8^?iV_hBS|˔ ?ea|DV˩w:>eXxWN'JX 0*,"ສcL(ZFM!|~ZTb2ӈ%yՌk T2iBzڰ6 tR[4aP,Mw{^PC ;]arZឳD8%f*wWd"d.+D[ϡh 6 $⎁쐉uG1NҀlݽ 6'!Qd7yT$+^H3Ȋ(L:] Ҫx:^ܲB7"1e&j!XiY*Hm0VdZcUv F۩r KUlzXL)%r^WfQ D^CH ~j O *Ban`[7hkuopPˉRtDF6i/|Z&dxѱiSZ݆5(6PBCM-6ٵ:f^ҁ1 t[/.[k3lnA'3+^Hoќ5*}p~&x_ /B2yGܬ5P~1 ksa xjE꽾,ʂԤި6*><)[{;}<#:ֆÖ > 137' , +$`h!2YDcRf@0 a ưfUڲh}Mk·5hA<]xQE͚k ֢ iA ىͷJ[ۓ&B\91rR7z9C'8gk&< /gԇ~Y̧ sj?MK SF25C,]-<9ؙQ/Z2@D^h: l8o>]󢝜5 9$%Ԓ#[2&ptaQ#W 9SFASe +_ƫxKϵ MLwĜَ[l!C*B.mq|8H43< V՘emR3+m"pMju ֣x,OС娔hT,#@>l˹˽M ~h_CK'OF糺IviadC׶)m(hA?żc$PՆ؎@.S^#tQlAҨ 'M?%4=f qmU<w_VD|עTFFNE0"`p=ent+V\yl=y6&5I|22td kQ=L mlfdջ-,ȠEh /?&||+I7EW;>Zzj n<{6yOoJʝoԪ Χ[|fBEܰh[YbфI+s(;&Ǵ:ߙԞ>̜ԣГ=we2۟]IdIk1Du*XÕEuUqɧ  );{VF*ΚQ73L Q,SUuU/TP0| HLm? {5=Q2f+|XcքUA0|Jwz#H2kKR3iVgg6`w88;=ؾOPܮ <. Bާq ȭPGi&k0! qK~3ޭ~=B{w:dxW m?; ؾ Z,QYS" )<Kɴ]Tg*%G`BFVįc^)j$d`Yy,8װٕ6*[/X8cC~Hr'2O\(Oj ^lĢ6)f̉=k򓏉OGRyQ8evj)dHEN%%4h]Nܟ,XIz o5`'KT.MJxtIlogoHW{7;G9E40Ldvd$2$z[$%-A+G"wi7Γ+F#D"}4|;fUHZg!{_O !Զ\g#S:2y#G֗\rg^`3iLoKͪ)ۖdc X /m}< 5t*lytT` dkތ6'aBr *6^ %@Ptm־mnh6<ϑl? ? v| Z_6ZSɆ%&n;ʻC`M<]ߨK*!]?Ѹ#ty [VtN'G oendstream endobj 453 0 obj << /Filter /FlateDecode /Length1 1460 /Length2 8342 /Length3 0 /Length 9189 >> stream xڭeX A$nF`RRJBTRxy{}^e~{{fB߀;7@FUڀAO/W0[X b p adN`kI A= liZl@vm%HZ 9\A@ nnl Y!9RXA8{ 7`d-;dkN?Lgr9;;5 ݥyorB 'eNj_20 ;Yja6+ ;g ?-NMEMM}Ͽ'5,?i3;N`w17<?XB`@ ,,<0'Nw0r99 P| o pJ5/p&a?$TMNϢYTS7sCB\N oi&opCsi ?\j?悋@*ZFw: +x¡.N$X 6 Q66? ?^7rk#rBc?jANp_GfW8@W{!?J;v݂GIpg.;?% Geܠ,77t1xz񿯥4;|y. sy@K''f+0)APKI > J[7FvMcA+TvdY1)M%B٢r#sk;wNzr5Jl&3@s0y~>4ToכqҷJg5Bk]wZ\nHP /^cE7'c>oCКXOm.7в̐#zGF7×~Ea.٪)woҹ~FM2LR*:*&3^ȇ* bZu+|sl̍.(?M(?=\l$cr3T21=**FMޗP:GW켕˯`ՅGA7̮T`(aV:C@&/މغ90ۮ8<5$>EYb U.al@ke f2)~X6;էޙՌcX!*'%uvSHLT1_>Ry xWrޠS4$ܬYV؛i3EN)mܙV3xdz29iq>Y\V's{_M4>=D?+/MoNr+Zl71}o.C; o5u}l.^E7| |E vGϲu|Y~OX1NBtǦ*S]=m9?8 0e മm9 pjp$rfvZUKp=@&t |(gB< /bOƺIȾ38^%+xQ"~,Rg〱5}SE cOks@IB< 1zy)bZ#ls Q܈? q3rYd%d^+;fPC]\0sAJ;it^33]()Twm-]qe@9S=uӺJvC' +8_x] :箣(BcF7׫ONK:@|dyl.? jАlo>7%U \$$)P{,m換xlS$.(qo$E cJa|xD FGaX\>NkrBEҩAe[4ΞJBKq1kFS5{T$dHf2OM{|9'{=ޓj ]![\;3cߖ}o|`0G/!-3Iy~\"PlX%bHX(:s a:YlרO@D\;kRDAK`3UYtmU~^ZL$x+e1`I)5,>i-7,lO:9[sxik혇EuZiB/ʝš|"R~RAF2ȴ-!&}>"@/֤u`&BOt[{mAHd&;q3`kbO4ˤX(7n[r]+'% ZlZ. .hcX,{+#…VAaٴ\`&qhS Lt7_(-VYrA%t|gu>{E+utv }r\`9}w/uz*PVf1}S&{avR ԡke,Y>øRnti55:"/7rORx'rKղ:jZ/chpHGa6K5m{b} x4s(Rb$B|fa#S1'Q\(k#RO}y .^ţo86 G̤zEOgn?1 x+6y׺Q}LrbGڕcb[VF)Evl.Db߆?mDFƤ~ޗO2-~ j$,םدǣoBi6Q 9az2}Evz7p ء<~- mtzzWbdRwcnN }\nnezdW$k{Cs!1槪^1ڈVJ]>mfN%'9-L|-@NU iTbIHO%8l\ qʆDXmY2JQmNj7s.jg$dCYg Az B4M>4]kqכ8`ln4t;U,FGMuMp3[nLsθJF\_y{]j żXsJT./wl2``U9?hĢ'1p*Mߕ!XV("L&!I(-\6^GlHZ*aDÚ۷wbb&fXD(A-Hm$w1}-9h]S?k";C |$I;~5 x/LθG.c>G]bfiP?d%LoF(ꌭm*ci9w"Y, [Ss0E(^J\%QZ?=J$Gƍzco M]EIYY0cz?ȨS4&O=-Vc o(k)N8q-_WQ֒\qo}4'p;5ǂQu.^ĸ #&5˙Y>il*΅[dq+Tc^Nh4}gσ67'.{2K+g~(cn?2 !Dj>\А{R鍏JM} w_upOYR]9l_<*FrbwN,vM-.ǚŽ!QE~c9o*\~R=w*+w5oa1WRADj%%/mX oz8WtcsfWYvy<U$J/JnꏿxEy7 q~U"BcpU_E'F,fNd)C˗3ٍckn*+qKN8ϛM)xoc(s ʎ3aȸ>Ol>El| w9+S+Fg5bF>UI0ŕ]MX}okFߺ)4#8H{~I/i2:#:af]V[$i僥=ʽ3̦½E@c^[R7\6+i_]2IWAx҆8Ɉu.'QK'b:B-MD}2&C  WIk4,4ʍ 2O~2];mrE{Lss0e8uqh T8=!5cb::A)%L$B"LaFܕꜣ{pG<U;~DVrV5v"=8OX E'+=2}DFiߛte*Xߵ$ILT`vS%kɄO֦[ ~C0: -: п#h ۞xO11Y)y}PqdSw.֚rsa;hqS0ɴ֑A|T }H"_ȓ (`EUݦE>8H Zje[Ԣ\)͎s߭$g ĘDԨ (W|n*?#dK|v~XPQӊ3 xy!< 9s[:qJNxN|0j_Ү@b&y\V?V5iq_UQiߠ3w ͵v\i寿(,(0zz̋Ͻ?D޻]*l1CYx[.4^滽{jFm[Z(4B_7S$kHJ(6~!/ s`"MHzPն)Jbafe! UjC}wb7XL %L脏5$!s y&JRQvA*w>]k+sA}"/jz3K1g8fò.q=c×ךs#lLSDwp$i~T*_Lbh1kn'rzHg%^œ{r"(%R1<Qrx6Ed&uZr2beٛв@jY?b.P )Q:y_%Z缤ɘPf"NJxncly4ʡQ괔1K*Zn /#>ğ1;MV3ʛu܉E6͔)QKסQA'$c˾V>!2Tt4lKbmՐ<dKYmm,dٺPb}܋ IS@ͷU>Y49NvڌMRngw.V#$_m:tyھ ~  /!V\s& gdLzB.t&Bk2;.`-q}&b+ *%,=ҙv4Onm,eP1.:x|d& :r~X3H#lhy_3bpA{ S3ď^ցɄY/m94- 93 6y7I vBEOcDDtB2V$X0,z =8)'Hʽƾ~q%Ww@l[H̅;3[\l|gCćyÎy@(Ί18reez&=x9j;c)$ _p Nu J/;yfBOUp˚Ԃ֪Yg#!}gq4vXn9ZFQ^D 7?gsENe|pwipcBg; i5ftG8r~?O,}+Nuu.4ㅑ;knx%VV |.bFF]jN~uG r?8$yz|(9 +(&zDLsń49F\с4n3Uݦ,+ht̒eTq$Y|˭GCr TADr .="J;3lQttyBB/EU5 vk tg4pܵQ7/NDU q'vT67誀D磄w~k?Nc9]0NDbaZ^nYzr> Gg;6ɬ/zԂ1Z lUY8CR/ʬGRZ3l!.*T6Dj}HϷsnK|,D.#1dX*bfgYDžߎRGIr B1RJ|QmP\kh/z.E6c3^fTę>bF"jM^p-kzfR( QcugKE"1<˰~,BoEs󂬡8`H*p\>9a6֥_}JU0k^*jFUMRn o+R%yW{i,ae/zXP,tD•v4~3+|@ W5R#-"ޤcL{l]1ZRꓦbҨ6'^ұl:-*$lꔺТ|Z^e5p|ả}ִx29tJAh 0|.TC*S +CfIW] zX6)+޹yЅK=0PQwgendstream endobj 454 0 obj << /Filter /FlateDecode /Length1 995 /Length2 2339 /Length3 0 /Length 2980 >> stream xڭy$ED02v%6))C" ax#  ZZP @U(D Vd ^D 5Nq D+4,pĀ%@>d( <%3<h|~!2Hd]4(@42@kҬ?\)nm98 6gK:?Y(/OjFB`1H};T~0>&e!!=4AD?B/H{~1I@aT0 lvR ПXY O JPB4ȶQ FD =AD0 ?7Y俠%;Ea|L#߀V ~!?E#DI&܏Yмi|0;&/UZiUSW44!DiI;&dAD% DK. 5(Oo^uV񞈾+؂ o2ǵ~B>u]&ޗ{7'Ȯ5BKV^_#f8k+{g_=/Jq4ku&F3]3Fa G ɘ2iU18WwQZ̠WJbX>,|yYrn^h?'soݗb&HBS%a"yB0*){$czmgYg:MU lƵJB/1v mS[TiTֺYdY:Ȳ>n7 >] p K4OnhqT7=#Cz'Ds#Gvl(q{w{VR:\\ k>"`4 ?A Og3'.맛]~oMBjlzG-溶&a,1g'`9C 1}U 0A!t~Ah>KuҬ^ݍ>DJJ- ʪW_qP>K ĪDC:AW˂n_41~E{㔄LNE loJœXa!~T֢e7쓹_K/f".085YB}s2%,$p^lEaݢĮkXp] }<d'ÇC0I#:7i@3'OqsM%i_. "TS:$)FhsKGjj;^ oo4~R$Wo[dI@@vʌ_6+eC7e' Ey"_6yJ.O凗VBsŜM@qﭔ abXګendstream endobj 455 0 obj << /Filter /FlateDecode /Length1 764 /Length2 1172 /Length3 0 /Length 1711 >> stream xڭR}<N8ٱrՒyN*;e}|0c#TScR+ 5JJloT6#߱s_\mkID@("t 𥆑O!F?xbg)D7 g < e ;_$W at!b5t eP9 l?bq 0a8iANK0SL%B|& DD&p$bᜂQ)Z^<@ӹ 1~ҹ0Gry"!(#S#%iT ٝB:fx# ,A CL,d#qa.ٶ() ›8EFa 1=<b|ۻ?@0 |&$ 1 B YP>na.GCb % ]Gl IXKЍi*l`TC C'{BwO쵓|pC\-{ |+7Z3;UҜxSjhwPɳc1crjO"iY~jwi{ԝ_+nIUIv s"|Shfp6U<UaiCo&:E}c Ezr9l._e]GACKIt,ȧ[ 1K+3Yf~^iht˵:R7}:guol5u7fT9.: wTx_炦E%^UM9?O&rwT~FJ*}_Bhơ_fFBD{7W6<>T+h tRck#MƷ${;$X|IgV2vOƻ*F)[%<%UOU>y]_guf!:zuaۅ977TyIv}zFէ̶^".[|E.?,,_sS{#8gW |v5uf_WNWHSuiM'jJ޸ұgWt2W(P/ ֳY%ǽ>kC^yRhpk,xR`0k5z U>b%l85 Cʬt.VO;߼N HTmXCI^GDli䳤]9_?wW:2N4 +V.hמVmҺ%:!X] Yc(*Mne^jnr:ƫ&meU4q^V/6jia[0^t\]R{vm٨):O7kv+t?j%SVúme['!+ Zeet .mYUS/ov3 sѦ z}Um5؇b3Nɋx2Z"M4ež'柗*mطz5|X$ >dCĺ񖙧 o襙:{IVei:}g +Ak^&5xn;+Rendstream endobj 456 0 obj << /Filter /FlateDecode /Length1 895 /Length2 1627 /Length3 0 /Length 2234 >> stream xڭy `Jh  +aKrd,:|eޚrCt=D2TZZ^lBl*LN.0r i-$^~b9g:Gο.+צ`4LFٝ3yA<6;=!BYw,6U|A[cn[ڹ׊[H5I#3Yæ97{;lrJܤ] ''y1"r,MwLJf{Jugx=I3.ߵJE$yS=Ewt7^6M_f(UU>!)k+:kIqd~hiJhMҴ WW{&/)h&S{u ޞ7iGÔy*VF$+˷O'=g?=+OͥHճRDicM,3z(XStN"UG$OD8aTAB c4*m-8E=G`o5.Sn!wDȋA{QMd71oܧ#8 `Yl4<J`vDi7!x$\/ѭNCNHT,ڪ3r&9:}11c!\-(0ևYjخyguGqCvjQCĻ q4(fj% 8XS5OQ7ޟД&RM)R(/}FMMz1|z׹NlSsڒ]^E7qx}o z%I +⟪QdΡ\L@gqI ƍb6)`LLqzS8_d@eD6*z72e9Yf>^endstream endobj 457 0 obj << /Filter /FlateDecode /Length1 801 /Length2 1236 /Length3 0 /Length 1785 >> stream xڭR}^ u.iLln33g̜qfM ˴rK iC7*j#Mb[ˆ.Uw܃ϵs=}ڂD"lD=`y1$bO&X[Qˆh(\ ɮd+FaB6"x8PB8Zq6H)PV yChۮO)+ @hĵ'H6 +|D<2RJps nr\ '=ZOΐ ~_o`koB  W}x@ZKqYx@!w4Ua}a~" E`LjLoo=DƁN[A(89 SQdqJ'v!RˤrPoMWRzBq"#f#pPIWć{CI$2ej^շ>nJjbw] _VltLcl[{SIfKbCƛܢ>X\Ԙ 9{%\Ly|w~IͿg*`y{;^g ⣶δpBvm"Р(Kx Rbҵ"-Ke>:} #¦)BsyjyK4xqk|(_/=/dQMCʮM9Nݖఞ 쯚i,waOl٬"*kz^1 YԅIf&gY::moV?Sp{tԷiA2꡽TZ2/ӘFf#ц-*͖aWl\erm aaIYH WbQ[z-gNRܷ&('Ȗz_R ¡^7H"}oRlwf[l5gE\LFE'2c%z[sӘ> stream x\ms_Kx9MiL&v4Ӵ;C"ReGx)'ybbԎ}ɓ/1"mcZCF'#MFJ01:^ =z}U"5-Љm/7Zh[.5x/foٽ>~AECD\,[v4Q 댲r$մ1h#M).(L6W$WrTE7mVM)ev=AKJۦuH!-,bSm["m%d )$Or8?8i{;X5mȝo= VzaWo.u;a7mLo9EpsxMߺ[gOhV貽wO,^]_&wuϜtNO3 6 G$hJ.vK[9$kW+MHv[So.*^IwUF>B-Kh~_Lkiڭ54׺J52iVnFX9p=vgPF1;~>7ih(QEdּt:n#\7@ҁ*/=zS5ƝӃ0 AFO%s&vZ=zHFr;X4V|P#2&;bܐ Op^=G)tfZF)~^L=aP}Z=+_L!ZDOmvN xpmxko" W0PZ}2;4A,-Bi~?,ra?JmwAi4]5{j;:UB퀚 0 gLujk޸ۗ܇M2©+\Μɂuݮn}cxEu7=K-iCwWSCg*h$G%suH\092>82Mn v av6wh| HOɱ #nSˉg_#Fk˗>]>GrR K7Sbrq"5`Q{G!cb <ꬽCZʍ^p3猢2U)`>GMZεu7OC]ƕ;Ur8&/a~&eyA-*Ӫ-~n!,_Ccs02j=1jX4̚mQ墄E6:8 Ho]t?UQ1 C(β2^m_GƆ~T*l]_wɶL,R!U1LI,Lx ]ULY%0 *k7*hU ۆ$^ևk=;Xp`mbnk-k {BE'(; zܓWf{;taXCFsU)Op塟T@n*]'SÔ|j9Z_581wN(' '\EOW> U;ځdr1TJ.N7ʿW:ƥ W ]ܻ*[ kg{X;E.HmUWĝq^G'+JDƬ+e5q~ v)܋)`7m[/xW~YG$2ofGU_YrB[wK"zˤtHQFSuA3F#^$:RN2/Ud6S6цңiC od; ҭָ &Ͽ 9j8TjQ.gm4J#k n$gzk_nk]QVl[?-N:P D 6 (X{6T2/ϭ1cjQlÃ6t@*=/31~DR>PFl/F0~g,Gg;-F .b(߈Fm=޷S]9k+GF#H'b ?^i { I`adX *Ŝ;*Ϫ"9T(ޡIO f!h;Ug-OT(X /2v-CQ5FգvYtPlkXh!-ЧʉT,֝⠀Ce/eN{O'+A((kcYP~!XUZ^:mb*U5VC` ΐ~nUaz'{GXBN6_#UlkYl-pRp~35"<< : 2cvUA<1d?8G܍7l L^nqShdznu ੠@PdN=웄<6[ EIs\Y?NؓBd&15e;M|t 2\_Z$Q_mxꁩKQ;UToܭ rSs8W_Ģbx,+*$%XƢbh ܸm]"صfVg'>{ YzmiE׻Bcф3iՅlvY8rwx۱^8gڼ auQ{GOáSv(b!8ٓtؽ?1}endstream endobj 459 0 obj << /Filter /FlateDecode /Length 4486 >> stream x[}6zߟbщ꺀//nz\A[) jgh6O煤( ggIȇ#U͖jg~׶lF̮ogBRbf-g7weKY^bw5mmئS?nW(z:G~{w˿oв8nE}E{h}?{}۫NIΔ62"ZHk͕9,=-vq?x:+q{[|5'tqqx?nh 7iyK/|n|p{3r,쁤-]OICv>|n;bK w({^RcVV s>{]*9?4-b5P8{GOґ)94[|]RmUlPЛk)y@~vܰ I_<k ZQ";'#fsȈs<]fIJ~y&`3-L)F6Ҙwga {֕R( Y 'D麆 YUxK KZWQ6]ׇ174:jrXmכ q)ɵzW&HiS;eKux_ߧaWAGIhRRf,'޹G#%e{~„N˚ToCh{a*ymnHgFЮ+ªcp2#{A !=tC*G^oz_\A7402:PYiU;2Y]0 Loh}ܸ">:)A{| $/vBA` \(s3qG^ъ1c:+X0Xp`!ld)|;s> [z(^xOt|ClhF\7xG]ssVf1>#yPF8Jq30S[y5e=C5lY9 f4|:*kU~PI UnTeGʊd(y2 㩊7ۄwqxBtfH+Ut=֔d1u@EkHKV^Z$DEХ Ů/Cf_*d pI~|1z{ *!V鑯?ORc{60C|2~SpOx cWrVNMx^ץz,!2DN ҕ $pN\4Rꝵ/i"kͺh6_&f( LӼV 9vqOIHtmqyߢסD1qXu$io'lܑ*?S:Rj(:(ih5X߂5[oB0[WAS%fbj; n$ڀ٨oswGtYb(cx_OcɆ{ kOUuބŜN/w1-}LM# 䵤D>;!"rTZ׈0xqd"4LFRֻe6xu&(u. ,#I5j9Da$*;Ѧ9HzDڞ2/J| eiH'Eޕ#p,X ܇%^"Wj΅:YxIPgK.UvT+!|J{f|8A sSނw+NE"o(m&\cXd*su0JLeGrEaȢi-,~bx hIuEy%hD\=6Ď<𳱥n&(lC_sKU7G2l?$EL/"bP1zZ.8$6u6`>piԗPuVX19XV2B&'^67zP$xAqL.*ռ;.1@Kg8Kɧ~ 1X JPpLːO -)WZ o=,bNOkO~PvcC]:yJ?n7gWݬY*Z#;QU9WJx+x7ĝCs! -f @ V;Cslcͬh ]K1O]xlz@^0T&\<_2|[*F~2 2 g 8W#!6d2w$1C2@[Jm&>:}08mF|^,e);4񨹮l:͖7ϴ*V(_(DCji/=C=3[e@QXQ7! 艨!`M(>!(@GL5P^YMjH}7vzM}V)~t{0 PuL=%-A<"㨼 @]8Fj{HJz[(KH+><.2yaNIEAq_@ȰoL`>%Fo%.oZƢRwc>m4Կ9ǸkÚYrO i1w< Αqf!m(N$ w|6sO-X/`K E)(˰601\-03<9ɖzPQ4>2{Eg-æ3G.tO [[Ԛ0|`7=iYs-0-&E_&$PwR҉4|̐|;ɾ.#J ٺTıN%iD>"=E!Sӄ}Ws|HtNliw#'vD5`]d4YeU/!.tufNxy<#t@W0Ǎ+L<;/ ͚) ܬ]cp{G ,)T$PU)SPonSF Y0Ѷi2IXMߜ8ʣ%N~)Q/_9)Ui,M@y5ʺZlI1JM_g#e'"ՔN'uQ]fbH//b.FHO('7\yӜQ PN*:G؉qr BrOCZ9Ktj& /HzLa W8;Z.%~UV|\YkX"0*#JRH nhʲry2Rύz6|606`Ӭa `47r=C`'DO `cQYr=d rM`z|w²q<"}y7x>2;s#. DÒg7f'T0 êRW,>O]4S2 ŧَ%p =8$i722O S#܀ZC6Ӈk3Lr!z4Eܛ2[#ء˂:_O>u 1 EW= ɹx>ٌY<*PhMXNQdv ?Pds6wJ haQ[♹,SL"ddzPx} EWS),lYi=>7Kš<ds>5y;g((]bb~o}y>uT/s * F*uY@S&Fg/wԱendstream endobj 460 0 obj << /BBox [ 0 0 504 648 ] /FormType 1 /PTEX.FileName (./R/scat.pdf) /PTEX.InfoDict 378 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 379 0 R /F2 380 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 132773 /Filter /FlateDecode >> stream x;-Iׯ")C$@9 P q`¿m8?;$-tv{Gxcٲe/ۏl?K =K?)]~=?K?׿yΏ1_ǿkj}]gUi?^>*UKg_??C}?~wP?M=>X~\S?X~瞟;gx<{jg[8n*-9?[y_Z?kϯ}|_巯_7[yO֭yQ?'ޫ_}7)W僿PcvnY>/)gG*׎>8xkf}7Y.zkcMy=d5OysK,bCϕ~.}So|zg]op/?NU>~>C> Y}^6}]`9֥n2}v>^rK[IkoRvx;𝟥nr|e[;:϶MVuLx}g3wk1y3Xh<|薇?'{9>#a|a&*sfMM9ϵi n·5Ulދ 0J~~n=?~T~=4y$0Gk["V>߶\}5|̄y[038'QytݯVgK]M$oٺS׳rpt%Alߟw&RTrNr<S JFs Dž+{E']`Z5%&U;+)H-gN硉QOt4S1/w'^'y[Y8eEs`z-o  ֏Ia][n7D,5];*o S.}k!r>O!C34<;B Цm-j?gޟ9 Xo_$dPo}VYp$x%vstIX.m:+U1ݥiYtV>dۙ#A!'.]Cgb~}Rg}xSs ׺?d;Q`MtV;47Տ}ygْ}B ghx.r5&M[w0 NTG,<)멡 NV>4QGÒyԛ-=c_,~!h|R[?o 4䭊s|Cw[-,0~B9GC!/=Zw&b*5LAiPxB tb0<]*ć=Qq}Iޡid}|#>ٻyh~Nd+znfѻPS0 C8*)aa) V`㮊B*S'ۭp&h4i {zBxVIig֕Ϫ)I]ܢͪCB圦d =N8lZhT +S]Jn`t^)56={7x`ŻVMaKo= k̀U%0f(_=VvݡᙄTCgXl O,KM)r%%LM` Aby͌3'$si4dA(~0krZǥ ʣĘٔh2U5|a撒u I sihɶ֭ hS|oa5G2GI%XvDxuskX7wndEfʪQ@G!MpQ ƬN1~!rwŊ:TiZc"UJpJWt~?ڨc߃BjǽRj,]iXڒDJ>lЃIjh>8MF6-JA"᧤zn VE!օBŢvic*CBL#5[ R HuHLI𡌡5"Y ,T̐T4+6IkS9{GأĢ0vɕ]tF.Mu T&0' ig'O yEtq ;^@$%AT-.åia!)v{ /qB Th~N؃Ȍٺ癸2VWib!mǚY5\>g0TwC: =hտ6Y]NRDOPbgfav x`hr>aOt]B*ꬮqߓ2 0ۣ{Y8d* '4fl?cb~z)\O H<~guc,?Tg}Nc'2NRWZ$ Ԭς]f/H|#胊9= &Pvw{z3VPJB-Jk?6M|B.;G;F>i^ԬWJGGh+rݨ$>͞ĐΈ+y* ƴ5+|ljX؉(.B~{͛B1{.DCJFۃX0oc+P~V![f5l݉{i`FNX{cT?$!2FV=AT~P+k(?ؖov&]uڅB0B,΂=/yU弯'{)u {s$E k{?z䗒:xm-mPG/;w­pMeG(&N3=N"ex)h sNKk\-l^cj,,bmBEwVr@ܴjH \u>cS=kb#8Q[[(`jvU{+Mzcm2affy#*X{l;$?fP1=LUNu i* wj[:3+-/Oo Mq͚vSi&XZT?;Yuy݂0p]Gr&?`S|qX힜/W|k•QAf/5Sî o|cm !){a޽@j 6EjAf ?T6:>-; OAqwX?<Tʹ\bSGK\SsEs'7{ 3Tjm2qq r{q٭j ͔7*?HzjOȳҸ@j=X?%kFe< k*̽*EF>F*<2FP$@n\w'[=|mX=]Z9?D*tU5T*uX~p,r1 2LOq V/oD}Osg&=bmz>ͩsiN-=58@1(17` \8(7Vy2~ynYkk~,yKxbT\?8ڄ#iʧZ:TLnT7=>Uwov J h1]K?p~eB,}o1#LnQ"Oʒ#w,+i;;r^?KԸ_חuz{|A\?BG9ڦi4w9YmS{|n[I K5b랬R ρ4FM\9Nbam"flip`8Ӷ3 ^n!5>i #mM/Wr$X{= )w$xr˝24+!)`t-Ȼzm_ҝT5xe%Db%b+ʖ7%hLglf[6gRawNYi_Ft3M3\MhFG*[S׹ym&?wdO:Rm?&rKPw3~$Mf0˲klG׬2eBlȱ9W]=چZei y7Oԣ6g aŽP˴D,5xI7uSϻy'򎪕`Uf;՗`^L적z@ U0]2{-+L~0 5na``'0qilf&+)&:N)RmjcnI<ѓ!?`+C`mEP,ZHZkL2rn]lH[քm"C6rXeYt?l7/ZNnYr]>ÆY.a6ku ?X6JNʁb V1(Pۍv.h&meԇj)~e7,-}IM|* Tsdd_27nľ ܬ'߹6-bz{B#n>wZsi#5s-4Jex!ө@k8쥵ok %VȖSW茭id{' YPIt6uO<9U6>J5ҙ364k>bX X 뢽d'S4Azl'`$~loo#NOă{KYHRH ͚e0_&MT-0:}"E(xOt#`RK=Nۺ&d)jNG# BOdDA1m٠}kTIؓ p>V`kXlCqK$r>2~Z۲kPu/fO-\]|%Ԁ/eS5ǽ;t5ʺqNGmUhԵYz/uoOh=4d^2 6$VkyM)>ܾ.̹4̟0\34甲0ǜgYkoT'ygEs9~M໻Tb#N[qC1X^1Csf?Xm]( <BxDmGI2Vϊɜ-zM8=VKw = qlۦ_rm"tynl1<ɥ]2"Z :POp0N0@V[Zb^95'.gu1 P1ޔq?M9($_e}z+i<'V=m9Ox;kapzi(ZHO8&>>\[;~Q8rC `²>߻IIYMzpۻ Ѭ'!o_1<y:&'2#+'g6&qHߴaRmkz^qm7954^}2h[A۔uqhϖވۘ!R'iuc=WS,7ckGVx`ٞk^8+=ŤFlO^sC#Mu5i|b,ǐeFOʁ|Gw;V[!X, Gbe]YrE蒭3\1U;̹ՒkLgZdدh9b^lHPsXx/&KGX %q]l׮ue%1ʋM{zKSL=΢:ɚMrS~\;l:nCz-s^'({Jl]}%;>0V 2ߍ9`e}5°]<> Myi}n XέnkIf3jnX1ڇ>m)5יpƃ/W4\O绱 Gbȝ`ȭkݩ'엻<=A΁f>z;?|a:YǮIoP GY.3䷩dϗiS4gLMO2Ӛ1q<΢ F u:Gr@lf0#>,sI2I{ջrG冉렑Jj|wḮx9~.`u(LmaV%׏! .G Dg/3aiS<6xdrgzIXA9 1a>U kHY_q݋*z{٨|*G09%q, ɻ9K1ɹk88.ͱm/KM}j%൮3it7c\[z5r;gC++'x|$ cͦC@};GK 35n4f@?XNBB}  q5>\TT;[1ˢ\TI=n8U!ux#GVXwkxk-`lf$hݞ:,-fN[<+g!չM{ĵ 6kf)I` "uư3!OGV\ǻq:wcqؿ%h`zOh Wl2_ńlҴ9O4U9N`냽PVYO[M#]OSq~Kn{Fd`l3þ`ӻ@NȶQz\3 ]?,ܰ8o[ಟD/8 Ļ(3XCnݎG=Ӊr?!S 6=bqx. SonE{<.Ֆ^ |Qi\k)c}gK6aViȉZ}#سv-bf?x|_6cep (L772Nd,asa s86JX2VC-ߒ?|twMJNϵбǻɜ[<>z=6ƚAJpe㥸:O{߻nociKRq ޓƵq5?\~F(dur1z~s>7vmF!L4b)zPWڹF؟Ts,~s=%1ݧr f8ld8gKrV8C}:MhGm l;x/ذV^\lAgS\㓴}Бy읳yw05cK]'j<پnn?;<0q~2kzU}>iiOz]LWq}X&s,cFɴLa//ЎDl{20¬Wqi9՞©Ymxff^6@4c. VEyGw2ºkڌudFOO8^1r E'Xt81}̃`O9ixߎ#A?kR;:A};J|_ҦBGE;9~]*^??J}Q&q=u{|BH%>!R~O>~}oWm8>X{L:K]_:nr}+^?~By۟\ynٯ_~~Εgyr 9ÑoX-i=wFφqJ|;8cA9^D\}Ns4U>g;G>gnD>7 gرs۟3;~زfgϷ] ;s6KzL=Cki\;{q~f:VQg"Q?Qbcr{u=se]dSf3=n|]%"Fy1r﴾;'u1;{97^7H|jZ읿IGj'?jw`p{%LǼ{_|]~ߘO;7ޭ9WRi{sh^`:9JuO$3ŞDEش\k 5%tn]0yϸk zM.I}Kfu~yGU=z?fG?C>j'ׂZwZOٍ}̘ h o/?wN_8قjs|0kvAyOi~1?;mϣۯ5ͤ\wjlZ0 s144lyܵn5 'Ֆ[ 3vX\cygja,ՓE9;jcr׳5N.]`3Yض,{;99TTjh:Ԉ! ꇵ^/ssw"bѼf}ǃh\@>n8|ju87E5w@1t\/d8I8=CGQx'>͵zy\y״$2gӸ h ,~!\uf.u{$e>"nډ9ghM7nk|m310]LkDк,:ShZ4oUog}{(9n\!!R튕zHN4&ښvƻzoT=2Lt竱d>߹mO s5>kܓL8'}z/_9?|HVޟM'Yrf=\W;;JwL {w={ahe}:DܞϘV gg>]ᘆ3؍m[]J|UkRy\|ó.=6c{0{߇+>SJjOvu$jwgpnr'X3vs:ß1l–sM&tgv61Qiq̘mK㽼Iި1 Moy">a/W̠¶ o=Sx$،V^ F9I2tR\G\utl>֞Cjƥ nc6τvv8'WӼјh!y>#k9 |s8FMXߑun iE |t}ŦD~ӴփvgezjzkШs".'[>?AqAiN5% l#񉹔3sO;ҳ\2 nt"Qs>Jf |L\#lw,/w#Xs@D+Uck lݻi<1IpZ9Vgxiܑ|81akx>wOuuy`qODK1;ugN(-2?2.'VϑTd:/ jCsp(ۉ6ru :c6gd{d9'_덖&PEk}|&a:%+%Оbi>yn+\O~.7\i%^ 54ΰ\fkyГyc"k>o*ߢ!TjZ3tŒיNP 'q9nxȓj(D:P^%3e'0?ƚUcVc'g(זA{̺Tge۹[ZB:&6y%' OYmzS>,kK}n+'>c5ވY|jpk=b fykd ec$~i4n?EuM=s;Ouw2;rXi{քgY֓_`1hx}gT Shh䔙YMx;auy#={萓-95}ӷt~ kΡ3D64jra%Mq]E݉a,d|bVZ!Aј{ln隔磧{dDKf=+Η;{pk3Q\=88^G JY/63Nsoٯ ^_Xq<,֧|p8\;{S.]1my&'1nE8ђ-y4xF'?.f$|}:ND1^X82.8|.u0SܭƳ3e8cylǐnuؚou jKa m{/0:*P=ѵT_B?mZ'>TkqfS֘,0kpgrn{zR!S9qSuRˑPs0u|D~nD*|ŮwEXNv>U ^94RVLj'l`)kBZ|9Oc?>|b9W6N-! :Yϫ< y"P77>A؍<'ub5PJMP냾i2-mt m|J &UYj7XԃVSy*zx )A^.vo (}k l͡Mj)+bK"9q]˖oRWF}}}<,8v֕'w ]WTO>}+\9W8}ڎ?&CA*461# zSPGTɒa'~!ї m4p}kC',jꛃSoUg1EQ-PK$Pvf[7S(GGz(\N,^4`DzM3e|E+0z/^+nzA ˮf bP4'6)fْI˵2i2C j܇c;!.nR+az2AH Y+$l\?Nj]9|R+tCۼ=qum/S"> xntl-O^}˲HI`y Jc-մa mE)/{$BPP,%[M8|M'ė ZfM X*k:;Wt(}_4>jd(W#`"F}\b.rSMsvZ0r`,F'J QQd <3]'mC@1-CU rT " R~+D-;NPN# =[ՓkT!9\⷏UI,_qdWMD/a{?1:]'+Yd:nʍ3쩺}ܝ۶ɡm2,D! !רQaqn'\$eW ͛A@Xgkʱ:R8h(IZG3keFSVT` 6o7;H:-h[`'cENf(Pcqp &y ǐ|b_T㭴Z-v?G mUiyXq۱͹\>F:= Oq[ ^YʶB|*uCIXmE:DRUwn R2A4OB ֍Z7jHT3p M?|~he8R+`& G֧enGŪ6Tcz,>ۉ]F9PGQ 0C=<$ذ ,u4^c%Xj)d|}Be7rl8]%/s[k1n|4Y7RV{6K (]-ppSqG0y_rݖQ1>֫YOD49h4cz!&r;0jIxmRӨNT6uE(k7End7@:qbg8XطpU +o͚pKn\we%2"قy 봰7Kfz5ױرһu;~*LkLc R}=7ȸ'Zw!lu19{?g͘(T_O(LS1PwZ[hxQ'蛃=dd1FƓ.VXy}-!z˥'{!Ou2Է1"@,Rڪij04s6X7MGu30Cj/syǾl 5&Bp[)Z6{ v(ōR+JvGB&3h$ʅx-62 'GbdjNЫw7r[U<+&V3*msE# ҨW"9$)p:8=f3\:ZlVjG\jo̥3@@=kZrIe"2K-wPD-wb4|r:Z՞sVr@)aDZ{z/d^BmV"iSRLchSؚ Bpi0&m P(DJg7(% WEo(N$L("ڡKB+,ӌKxr}On|L2 CmXآxH<*\ CD- h8bI{-KTimZDRoje@+bؼB N n971:W㉊kqal5.:[0 TiVn<1}+ +C]s${,!vP)>>C3ti Ym2#xRv]X,:PRމl9Z $(U dجϋFԼHK8f5Hܪ'үEأ$҇^vH}D1aN'0+ Ċc(u^58zp]hECdhWG GgwF{gd4˗n!2b3oJ+XIv Żי ǩ(M:VK M ʸ\ _4 G`iQCxUsIdʏnmE'9}%'(?!Ezհ VPX# 08zˆIO _0W%W*bYA!jШOYͦ}ZiքEHڊLNIaaWF@`NQNC0_3n!qra0P(XI!AU::0r6QEiWt2VvY,t> rLM4-0Tl&x]rov 5"^j.D޳}8F'ÞyAOLW`UfLY./{N\J3Sà VA-/('ea+ఢQЎrD^.uc4AJƹo(塚MWv쥊dpV $ zmqA%Abә؟"NǶ&'" nbD2[V@=#2 sXA@ @&4;| fyTv>'`</&5zc f;Fޛ.4Ru<-lTpY|"gƹ2_\VD մR ({ {X ~%Zq\;JH"!QAZ[qB;,5Mtٯ'OcwB,o x} _JLw<5Y? s,+ObJTXqk@S*NR Qp o6YS 8vC&"ܒp4pXm'ȗ%:&qhDMxBidT+ '3ȘC5FV4?rbr7q[tӑ‰>zco_ΚףO2_ZKm9D^!boks.\u"̽#<ط +hzڮdݱa[3ZVomUc'07 L̴gj\~b}C=(t. \-wVye=}7|"wrʣ8oΆ1fqe|͝ Oẍ́3lftFX#vY>gc)pIFxeҴ!O:}0}}dM1q7E4,ZV8EGr]rܑl.Ҝ15z r{obiF+k':'oJKqQzKQ`s'_;1~Ûn5o"lsqulȧ<e=60+f&"L 6t)W9H݌ Ar<ޏq3MѭV9W ݴutB9B"A!`YOھNԎe:}L83ٷ~C%}_)ejm5Mj(5j+1,lj;H"mP}(#|{f^pgu!ܻGƲXxHFWLdѯG(TuE(VIPga*#|.УL0bYj$'E#Ƒm}[ 8ދ5(kfr 'Z(*PoNQ"r 8LN#ݪ74Q-9'vODܵC>nߧ7qnTcX(~T&xwm@9)%&Y9i|$;N0CӬ!${uig/D=ъ"ퟤyv r$G~;.z6y e'Q6Q^6bd?1xiśdAN?34Fsc_ ٲǷ(+зG-ׅmB0E ;:9 >;j77+ڕF ~AϛàqCX=p$c;n&)5Rk]JF Pk0PF h x.G1|@'-K`Nu9|O&>, WtfE\v_ d\!vLW5O >ك0+hGp5O<-'JdCD*A/CygP}VzQVIc*/J!v K-0e8e)UE#,H }χP}zlSe@'Myj4AqF(XN$~u07vuخHN{?0("'(M/QjGdow Ikg xd%o&%5$)/@푺Yߛ,s"(~Eﳆ>?0H:B r(JQ=|RnhE ]մ\C?>̨os hH۷,`P7ez$}I o-\1]#TtCkRY)R(Om=:^!L٣]E7Vk;n+VfljX[ I}QX08!tVۥi3(%)("!.p8azp<)sIa Ju G'o2>b#CN;)eώ]wWz>W7q KM^BR}P9W&﷏ Q;t+%4QcRnS#q=*0<}cbz2w agw%=RL}(MJ4ܭ'SFD#;f:ӌ17:FzXxz!'Dvwp24|n 7ŗ!oƓXKuD< "=D W%ȗ՘ܶHoDMNLC1``ѰD@zfk#ch{';x'VRkelJV(dž糤4ܥ(Ԟ#qDP0|bzʦ0GۤŠ]Z5D's!f#$n!L̸1?$f<ϑ|DvdPxȮzǓ<qzTf0{n'"G^:sЦke|tvFѰOG>{hp}?I-K(NPޥˉPN=K~,/>i$1tA)Q}kڽ"+kdW_vVm@9w2'=ʍ1mj1a^ ^/1B*}AT()2h9eAl_u%'xݎ ʜ+cq'Kp+po_޾[EL z6h>g%e8Q `[Z(ۃJǡh2B$3 ̫qC^'Z*1kD !^L i%P<4%U#UJ=+>&~9EeޞA|JpbjTbD$c\CNՃ%~W15\ o')v1jRFKL dNjb}HqGt'@S$ul5 l8nd]4HbXopRλCrt:MVZOAG8؊Fmpweې%%W~Rlw0Fى!d5  057Ì7yJΕP']fBU&8#cN&4yzd1ۧ[68p ٦|EqՎc ?T^ x ڹ5ᆚ$f]@82vp[VVnXs\1  ͫ^h0|ϛ!fm?a6W8ٚ+`Ը[2R/0GK{ hĦY%Z 7)!Ɇi8o x>w/;r$z<]~k6ePA/*P'+#f%pDfV^4Ė@﷧Զ{чN~7RY#+^yƷe:6t hj۹8xb\3U,Z̮bkXAd}4}y8avg%-i%Lk[Y2b i;& y O?Gm 1rf\xQ'wZ[Li'mnU xU^>5XqdRh40W+c7ݚ6HbpN:X϶q#Wg\>kj. R 1aDʳ :4+P wwSS{I0/ XC鑾zL[;.vx>C,77tw;Lۤɤfzr&yA7ɑnqAuTVu߄I%lXgY d0lTH_Cn.%zi4ނPZfo '@2|_PCS/&v΀ĂOt<# ,;꟞Er3~ Zn<*Ju8W!p̑3ĤJZ)*RLی6~GV<_9"VGQ{@5r\ k$^=)Z 1\;VUŻ);!#p\wr'YTnBjAӦ\ݕ !oW.+@lZ\ \^[.mE6u{1i4LV%1nuZ=3 YQ&ob .㸰0HZy u'+v8 ^zL%!cMs=%h w'!qבT: "!׻}L>^HZ&:?;0czъNUNGHjA !ĥ__C :g:p^:1mަm o P4mߜo`vZw-Qrlbޜh/'氓3!w(L7(bU,UAڹ&$[>S%`;I_< )Bv$ @ ͪ1f /DoDž+h0[Vַ^a OzopCCG:[(i4eW52j-ߐTVtk "гeWΝDy]"6ȸrLHco&ѤPj;ܥʌMXP%x~+o__DB_ux ]Ty=bB-s~]쨴ʴ|2`nlpA{{{\cnj$j :3"FM)kE:;։pN>{F,g Y#N= ToXrB1o##<.RuMgϱQ_aZ`cܩxV:c>Q!')nrJoRQAc೧Fz^M~i4^CDžL2&@Ybo">b|:Í.W¦%5]ΒElS4?9q75zND_6' 1FX@N9W|-KOŴp[~B~ҟfs \Y XO8p|?_6q3>iCb4c!?@}I_߿F/_%B5/o/sP?RWY?+B99z~G{C?mGcNC%oNuk忐$ܟ; P?>%'ݱK^9O40L _63pg(ܔ>E\G޾ Kr4(eNVցuc}|N[[QY!loĴ?oύFEs1ܭC~QO3)ByRǿ=5w.lR#Mˑ|8\waZg B>Bw|z07 (֫ Ƭdݴ%zgVvx9]q.)sZT#?|ޅ= SnTooa:醪 _֖RQ 8CUpBؚ/-qϻ,sZerg ~ΧMEPLMueؚ#*tC:X! [_b]<յu\_د0Gwt< KNǻohSߧ֫27PC'C۠0ӑD&񆼊B6ːzk ?nY^vɃݬVef\qO&1Oޅ-b7wu^#)/ (| ~M|0||'4 h")j<€:l.pR]T3ӐUOl"՜9zy8zϧӖhwK.C4X825pvgE_!2oe0cz3t}NW#a3پ!_;:oZNOG+ع,ϫpY4f$y+.Pw?zLZwLwsnξOP_SCywl6 bbƘ^Υa?o[ "ϻl#{ǫ5qBnli^CXCX_dۈKI"5w(ܥ^=-} f6.sR7]@n|]$Fӛ@'1J9lW8~t{^V&dȑȂpSb)7t78…w ѝJkk OUlI!FnGߏ"̭k&9ݲVPl2CG܁' fttĉof!`bf-Zw//ŏ@M ߊlM視$å32o=l"o{or̠23p3f<5ᕍW -|FW$F>{İ;T3YO+btZH>UO[Z3M M}0JRjjF@ jeբqR`C(c즆B'"Fy 2'3MT/8y΀h$y5b׮DIMM-k:z%<{5:zw/{M(xg)>1NxN_ГB-¾|[y)${릆Z@5GrAPܳP@>sw5\(5j:@ɼi_ɦw/ˆ.i2;HՒrͲ}{#Q|N9Myq/h[(py`r$B{ S6_OD=iK6meC|3tC+T_O+ 3aŷJBJyV#o+^ hWߊ#w&ի{"]DM= cKS.2oݯ?CƊPݷy $eXx݋loXP=(uf;?xE}!,1᭮@hEȒa` WfH,ESR\ k58&< jՃ)d55K0`T!DzDƋ1"Y]>V/w 8NK*1/a5:nh0ԝPC:˳""օJ* ɯ_%d9GlU5}0kD#㰢us^ϳ٥xqm5Fft\drۇ7NxʵA>]Eqexa7 3Oʓ6f;yOA.UL y^1ۚt K/xvZp~ROWڷSN|U1G:B2CMNk>ƕ=Ɍh;eq ş[Ayo?{$[#N`ETۂKgdˑW<=|o# b.`zFe A\!vm10gixABҜ߿P[|6e]*vwyHr ESxy3r-̔lW [O߱a;u\e8Jzvl ѴIv &m/*aNjdd13WeC '"q&~k!dyq‰ t8-gír~`kg)C{O+ޙk[bfCLbЂraKP4G]E$$Is?k'XFtÙ-+50J4qc<) oYcHYj.yk5hEaKBO[]xyc<&F"9n:3?E1 rp Wڊ5pnC01;MUl,0ꭏnh3wȶ0@ѵr4rIn8RgfaC;mYsl_ t?`gqFc!SӼgPmnpׄ۸vcgb6`w sMƊh *`vȞ@nw [[K)==7_1cT@D$n ۟5"/Hmb:@?TWz7N&.2%o&SEP1 ^xwz =N/Rb#3{)5H.Z``lD.feuT+ͯCЏd䮒;YG9VRT 2Uqn+ZI M oCmY'zN)[IАIZ{yZcGD [v7|y/LeuZ@\7`welE:Ŗ;Pakyz@Q=:RÇ[TLCCRps*m{,\WIK zF eVP-w.ɔ3]E2_uzL6G!Mny?$!'03_E\no 1u4 #U6>:}v*p!ZJo%۹f/W{Cōwr![j+S_ Ic5uA3, 5bT(~0o [f1g; ?=;*3$ ) VV˻jF n7o6WM_ v.kmuLn8֏}K+mūAdM("RrCҕx[A24l0su6w]oh'!7?З]2 ,a< b;f̆h)QSvYY,B^ .oVs ֻMMQ78;ˎWԯЀ_,weifؗ dPb c;,Li@0)^A#"a\J=|s '֩gpr??9/gONg''د>%yI2?'g`cf9BksJV_kl_Tcb*6Ox):)9'iU+< x|qϟon.m%Sc](dsSȽLQr,9|\B;xB* Q2u*7YjlQٕtafhO][xOIeӾIәi~/QFe|/l}%7K6]Uޔkog7.N)!,]mU χ/R'Hxl]M:)}8O+˷hɖoz49{&׹ `ܹebrunPVrI*ѹ pȉojjR9ВzTy-20Rxy싚B #Tx`ٰR>G:]j߄>]a;,ǚ|lY>2o7£y+Kω/lƥ,fz[')8c_lkg8ÞekT׾6M0.C/ouq}^phmyWy]kxk;9/]|g˲:t5*lr`4N h֤kM,pIV O,5?+S , A*C*yY!8 e&G'M4疑 OtI=DoZ5#ء!GgN/oֵMPk8>kEVIHþ;U=OoB֊vo KwwElфIYG cEquU1xιM h{)~@-'H*QTS^wF`M~d?Oi712NKGsib{@2BWyAqeM6bm+ n9K:NZyY BiGh2 `UG,ˆ spA[+&KT""iri#"&.-k@&, ûR4z!y5R(jO( ܴle*LM7C qURbU 5,9PvhLM.7{C8&{ۖySM3E,I/A h1 ʼfA ]dZʛlB-Z4+oeR\kdʓ1pLJwu"*6?24n'A5&vGb"(57$aH W/u,_ЎJK FWi+M젖B4ʄywV$戻P 0! h\w+*z WJP4t9*E/F;gBip#U)!!1sC(ESpp<"B8Fu**\`a15R<*+$&5 ]uBbzN'a^;N,H *m"CY>PӶnd =A}ء;"^K>n.\wFut3E/8LY2$byV-Hh//TPrS3Ns+a.R]$+I"EMΗ ڼKڥ[6(K4b)&vD@ҋ͉P/R@'̪pP qswe(P)Ύ$󶽮sH{I5RB `O 3 #~Ԧ%WEj2y$ fL6ZEJ e&ծL B1߼=V30M%Rb8lEDg8io<׾0%"%*]+bgJk1B2Ӓ&܃N )0#S(`"NJ/^^pY[1[!-ˌJnSE|D8CyS$տtJkO)g>3Τ$A~PfDτ,CJk_#hnהBF)+}N% 'PIs^?5x?1N(/0J]ʣ˓`Ե@@(ϖ[Vi#+I }6f5'V5#-pZpRj8$(Z)I8 FFD H$ָE#p)aR5JW+cLܞ(?m֧l&b TCɑnNPbT|L㞒$-ker 6 +p:[mr{"e5Ȁo8BKo~Z*ALQ^APMIK9d%XJK$ m*htNaK9fCSGB/X4 :5+cJ 視ݗWe\p`'(2c|Mq mM-X5'rVtU,֬ưP:yebj4Y[#bÎZOۅ$ fBE'{5!$Ish oˑ:YkC\tƚexI~Pc{Q;Y?)j; vEm84ˆx\  Ͼ:8!nFăЮ$ELb/'!i;!I30$M(-fq9d- "U3mrcA DZho8:ݤrQnJ'l "Ul ¬L⬩WAsZ?~e=<\ W1 "iq˪ND\ޒ6=xJF |}ܺzVmQ*MHif\g}FM(ݿ zS@UW4^CjMTm&'vAa mWpyP@!z Xs![X;Trƺ}Sk)Жd)ЯX<4! (wlS8&= kCfT-J$UQX$L $޾STS|V2M;smw-թt퇧6C}!Tm*rH=н-y%c;{v}ƇcpUPkGOJb:wCkm2" S@O*1QC[k9hfl3 +rֶZ(S(P[T pKM UJJ? S_G]ԚGʧQ`E; 솶,BoiD?+XQ Eb@S^ºhDşOHxB$} =i gˇ ۯj:Qup?0=0f <ʰ(rO^guvkg=;ڜFeެD3C$Q_^G xLj{ CW`(T4 ~֖QmQM&Fĝo9孾El٢xZfj%.A8kGJq9abdۈ H*%c>zC[!V4-ԜqyP.X/UP%g%"h%Qe99ՌXE8v\P zxFPƄ5F슜ڠBJ *BVЧVy/+f&Y{C%:uX d$(wY-EŔTHn!5ܑ+Fۓ+jT5B3=wdV}u`TVYpn  Ak:'td,`EŃZvHf6.3 {G Ke+2ORZP_Oz.B'D']zEoB9 h0N| !HsR@p-zY &d:ePJK* t_:fڭ,cς d?;!S1"ׁ `rR8 $eei@lAЯL*f+w\eju$[άovd a(}Xx=4ןfLHf\(dZe@ֺ3S騩{~$4#JI% /Eӗ%61ZIGW(kVKo)a6ꪭBpL5EKm('bpn2.K#)ɼJkSȧijӘ99Hݑa|8`]@MIL3FsM>+3Nq8񟜋js>5e'?Vd>Q;e8DBV=3A/UmUGg<yJ ˘oe|s芕fDi{ҷJ!Д2sB \Fx1Ο-+/l `"=@ʼU76<7X='E2Uذ:owyQ ޝ3%,|oJѢ%E/?V~a29p4gRqo.etͭDr>\Fûbow^B7=b]RoTyVuTF⭤Z0]Y. 9M6!)а nyHŸ7>˷Zg -3ZIpMJ=^9sˬ-"iRT#cMv4C.oxџ+Ayۚ/$AhYbI+8.M x~Wf 1R*s쭵9[[4$#M9!Si_DZnl8i&@:{~\v2۱3xo,_R@* =͌5E|6$"d֗ymB#6k޺y  q t5[HP4|33|c 9` o8^ٴi?JH$^3x"(IG3i(gҟ$A&/a!f/\s?-@MU̠Ar#[ޮdI ԣ!d-(XYb2v6YXkڠp|YRI> VFe8Y>0%ʵȎa<[5ScbA!r 6+f0Gs GR/ ~قee&,ίF(W̤B4n}5uXJR0nEkbg<rb9t)y|,M GV搧*KFr`YGEܤ:c~暈:m C_CSi~WK$SB"@!:sVr&$As-qBH[$Ϛ>'ai m|V؍k;=bZ$HRJ pOU9Ayj@ŕF ۛ\M fL.阤мm=;%҃tK4}r 8͌cju\>eX鎰}R8|Qfc1X0ƛKCT3g*g.?8aM7?с`m!:]iu^8 s1bS(16׊1g3pn-H`3 JTAj'{7L疖 :&C6gkWWG$⽓Dm^pzYۛEN{$`6H7]pa-(w;jGv0Ic8$]ݔ$h>`bW_Kzv7{tŶ iUC@?$.3*``*axymrҀl Yz&4}p-o&ldZ7F_t; 񾺂^u)XjF$W{S3=G/1Iھny͛9Bܕ^.Td-ʖǾla,2HaVzڍ\u?{PL) c}k4]ɛ"64QL#4Is[#DV遺&P4VLLͰ -N4QD沟 ъBp]2Y54(pNbf ~ (BzJڒXoqж}7WQɝLU?d8fy10p-Xl (C=X}+܋+fo961H}USի+W::tt[!JN )ݫjez3nBeq՘ #8zʡq|; +ʮq!xca`P": ˙ 䳓skPH`V#.$lfqnkH URnϻbC<} %ӗ €|%"ni?9pn::ZTbeb@Nnj(fC>f;!"9&^˴^>DWӡo~Wm rҩW㌸#dqۧ{ѵ/An?0dfuo%ќI[|"{⚳sg3yZKq6j]a^bl-o1G̕u?= K, =CE]xz5tj&W~ttj9=@v?fXNJS"!ctyv'B}S_MZRL3M<(U&f- %`oApۈYFdGEo1!{.mL]b6 SPU&g:!.t9~%i7 ŬFzhM3ѵ{x'Ů ƚE! H?tu:ǽ|69 fpAlh|"< v.XrXm'\K JP#% imjh/u^[}Ud M/saB]Xtn3?Sїm8)@w-x38ޘG,R c޲BS-NfW%wg&Tp 3ע՛Bz$s\VH{8aV\ڲ@+uNG$XEҦҴәHطW!tׁv Sr.,06y6i[Ԟ\k-S/4(ż¦D.BF8"4_$zϥ;m o/`0w^ӧ6aٗG\8x Ai;na\Hlx/& `ݾ`\ jL^و8'Y&*tZiw|yo65U Fq GhʔC!5|EoA\/m1=%.^wյԯl'\A&RQ EFM(_vz}G V NcmDxk՚pEs!5J&ϸ8@)tFj6&b)ȑLb)L_"n]E T[>K.e$Vy2]sDBA T\^Gr?ѼDTRjL zv^^P=($V~;׎wņ"RgNr!䋰z6)Pp͂)AFe]ƨy5)s7MD&zc C@̵ͫz)t:{ߤ=z8f_W:@xPuƩq2ŏ sKPG;o[)89L{&\ouм43JsVpH,CFT&2Хc٦h`&HyhPL};ARC')?ʹ]>OPm鎹gy5Jn/ r?dK@Wer24¡:g ٥L7,>*OJǸfn&C5P洢,=loaHV 1#8ρ'gp//Ki*;g0n~Ѹ?ضfٸO"jF6d}v3j}B(/$_ȿ_? /Oh/ϯXԽ}z[=4mxu?[rGՋoz_Bg>Ѹmf0M=+dTs>4%}*7("Ok$e\!ҳ7gh5YM.l 7^D|z0n-%è<펦 јϫf|i'Zsh(ѫ;Mc{@vL`morm; V~﹟xӇJ"D} [6.oh葅=AD]`c 5nx(~~/R^)_םf؜|p2t5*a!kuNӻrLkбfIhgOkTn7f1xJx f8!Luʹ5ϋm񭅜4N<94o6-͎ƫ&[fiЋJb7ͼđsLn>8ADS`i;qeIweW \XZKzgo7Ӛp;AN_u*uȻTؚD\1#p:,(֦|.I,VIJ $zR$°DR▭;I;3fj#YF/c.r4M: ? e-Ѥkf}M;=Н!$R.U4)l#/|Nc;%k̵ C]V'ﰜ N*^hcq+H6,Ok};Ɋ*4r- t$Jv{F)fu ڄy17T?_DR6HwCqھ44M_)uVI9x=W~_1kBp Yb0 \L΀0&, vP.h@R}ϸ!.XO }`)yW 7TMYmН+aOzPg0~xA>'oL}^Y )&jz>iC08hiAy, G?m ^b}9X!g`M~0DRhMvnvwGO'qbZK*,ݏ m0ٕi^!/ؼŌ꥾I針W{+@\|ٗw?C'a|# W96#F2!$ ]%+5e;c(Պ/T!OAqȅ Wm1 %p#_f-Kt qrF"T%=XJ$g+[R&Ďg.5oT=kwqCpyޛRp YRL:ZO,In=xu`ZI,Qhm!Z}d_fw:|%,>k:\,]tώ.RwAmVË Q ݊il(Js3I!+AZ[chHZD,bMkOdz _@-Bu!>؈j,ӡL8PE0 g_A\R8ZPqrz4>UpX)ѬHN}O&b1(%E ̆|jZ|Mc^0Pb% SߡC5lohGjg[͆'dMhte8P~0wnep3WC@ ]~1 wk ND_ow]tF5gy_f7nV:NnU-8kMluZgϻSfa3}X#IlH zǀ5Z@u۵Pmt 0g3d6S굜Hj n޸i Z^4_u\2 )SpgkOR3W+OCapFb>&(RIc 6h65a[.VDCv*]+.s{ъR76EjX/"9"//m~5@lZwHa47DAWw6:Omd#d VQ4}ɉoWceW6}0RwE7{zn.6zHӈD&];cip_%䮪w,[!aƚMKԲ+>|MƊu 3ע`=+n U @uEvEF5htnmnnT1pm-[o/2].<"3ZwHZTˢ7nűj-&od3lDM[a~1FSq4y~[&2?B' _,v [ :B[[B;+ZS*C, b@~YOGkܣ0Eþ&,?=o^[qrAM+0*Wh͹far+q.Doi`R./@Se]2!ř"8KD{+=ZR/:xy]tݲY apO0F$a}6cɷxy#/;h4X=*k`](Ռjvgٲnht/T1)C$)϶.k: ﮧ}#!V%QQ\p 5}L%ugao -&c'zK7{8t--/35.*Jeڽ$ХE㈛XOۿ18Zlf1?Ȳc;pot 9FcYQh,h(0zLz:5ìu 0|l,_*M%2T{p Џs?+&qtBut(MT=&?Q92 Bhව*J $ݜpoЌiP,bM[ۆl_n`ȫDrԶ>)LI]*Y?7!QkbcyET |jXgYѐakGXZ-<.D9bt 7[Z>N+";k ô)412Ʌm\5 'Z#Cz<\!-59EL32niєl!WEV3+ _ExA syʺiXl-$Ѽ8}=X!5ȧrv6;$֥t|+Ȏo,5.>] K8iJB.aauP /euo&r o.ֈ?d-{QWC | Эup j.x s [Q T- Vj@AƎfaՂ$EA07\ҟm>;\+ѐd*noa"!h3rG9ċLѿ?ط/ѿ߿RCGdhkƵϧ >_]p?\ 埿>?q|yIAy9kl@M[s?^"7X,BSrv YKve&2sWot^:CϤJg}\UDoIq%ñ @8px:k@1'WeYdsA4U޸ y^kDxds!;R|?<'uF'*x9::ƦyS^ jչjpЌt""&wmY>*4$*ge:Os}) eus3sB{yϢ Fc^8\sւL,j;i5%~>|k ftlNZXĿux9CoKZDkr*=s,5cA}yEdV9U7>&~~[Y Ŏ  qQ*`o/gIsWM̴l?7rL͹HsB\A2VANF/r'/x.*:T j^PlHs4bu:CEEXg;-y stNXahjzQ~ؾIb\+UJ- -tW:,"}-+z%{l[P>6Tz1|M +T +g6')S+C!Oa jJ5?bƢXΉ_1YkjED Vzv<_g'=C\ub݄RzF:jwsKV eAMD5hHq#<ԥȡ4Bȼ |ЋhHF)Mc(Q7 "W_^E#uV^J(usm`uqsUr =Ykߔƿ xޤΌdRn٤eɖӡLx\,"}x 67'kO0Tq~(+ۯ=DMFϟ4X) 4e-s(UY$p8v*2;z^m^#"Y}pL3Ƣ4UF֤RpϹ9J,`Q2"Z\^Ef5@S_%*M:gUz5xO>4 =P1pɚLJ,xg?eryqx{)Z xg>ѸDIa1%}9PC^g!?Ɣ9Lu7?rx($ct>'>\ ,etmBrI>v- ӷz].>vN]k@״u5XWP;ㅻR0?.D?ZߤSD8s9^#-bvKL'/<- E8m*dH7k2&"ڠh??#KlȽXr<Y h\j"sW MGQϮ*qڎ.O(su$_ ZBcҲ&PDrۗy~ ik=_ʑXcPL9i6L\TBp6FQmzBUĖ/0V^sb5]IIUm"Y#y*:i؄-ߪXsSSTnp->CjE^ӈέhEES\-֮ t-2*ֶVZx˔0(*|;_TtQCkZXY,遆v`R7qh*?=9eB=?fQ׾uSz`s0[ĨOKAissM^BٚBϢѹ[sA,[s`bR{$tIrg&6M,h\ua25@[k=BF1:: 8@WL=:G!  eɑBx*SdYB&5bpu丯j^΅UG TI[ uM =vtE:+1G#+5"8ѽ Fz&pTEKx5Ye& Uucnڕщ٤ ns͉:=1+q^Tf*}3YYչEHΪ6P(U)dH\:˸i!Cǃ~oVj7IV]4szIB\ntΛ}9I?d]c u$EK +9Ri^e>֞B@$ڞ7;t4[.ѕzQz0&|H\hpXWf7i,kjs}8X)< 6R ^L#MMN!/:.[q\bg>ddl[a3//:d6`.[>CZ8$Q0jO @"7t`$qsYx(RE%R&`)Tx$$#ިPHj]I@,Z !d2˧e\M+4_L^P.멈KTs")ʥvՊZ)xVG"~H5ފKG*Z[u/.6somA"lTK8_cJgG4fZZU4 l_UEC]! 7d.R=P#ˑ_k0kIZDYߤ]RC/aqV( ԮjuA(fW^2&|0BaAUcLq"Ns@7d66< v#tkC =PIaCPU32S%y IMSSBlMnSѦ>[{tycP"I@TU(+$nz6+KG#MEmer P`4&F^E #᎐ '/LB"&XpK-7󌻞xmL2U"v5oy 97YͱTeKM]dMΫra.mE 4JS< gC3"hmS,SCB㙼tKuA(m,դHeks,򬭲h˺y}cK@h.Zc 7~< .$`-{I 𡬍00&BD++yZLN {B?xBV9W4,ֆ3ZɹNQvqE͊-P-җ+mSzezm^}X[F4E_*&HMe}5dG#[+pҴmk A^: ;6`$nMI1(hc@Quf[d?۔+p%|ϔ"Ƞ+{MdmUAZRW>ƌM4H+ y^SI7}fx&:SjthbxvOD78ˀ:L?FKlO^-4mccg->tͰ @pXI%1z&M]*ox ln: %zϲ22'OTWJhCt˸Mj"pTm>1%a_5002QsgA-J3z.-LdD n"a6L/ijb8t(g3B6),Gqx&־\֎gG܅ELjG-bͻ]$# LRkoW큥+`Ъ6g솆1FVo {S.}ŕ\/m| ۥ*yת @e'd&Bd/3ݸ֔5odb:u%7v3)hG,퉁Ts@oo15k5@)tElI{`Q lU,] QŅ\L˛Tcl?y>Uz4,z zCroI"7s(D/ ]AЗAFa6z R}dE90OK).QO͍D4Wl>nƝGUla;Юv5 N҃ Fv㥝Sc\wptef[`ˮdIdMsMM`<4"2%‰ވX2ybem8`śESO@4y=/tt8:`X cN=Xj-l V{Y"}p "z幂 bRgP0~w uJ'<мTuLyqڙKb gC:0ܺ/y֤) 9}&eghtK44m^$٣ұ |3R;2#-fҧo>+3 QHi0b Vm-g)/<y> Iԇw~7達w>'y=XRCԑ/{}3i-\A؍;;4%ʠK?͈ș\02װ$y| <!Si5!̚#)8aW9-QcG<ҳ#ٗD-؄z.8|˽g W,v. 4oG;Lwtp4ntyV$$}[(Ɉfmfs5{|8vŽw@Pu7AmK޸R#ė "qr:u +g.3 h}H}Q Y/VIU\to[;,u󩮴|) *Tk ؃~s !Ȯv6L<*G;qWi+2jg)`|j;gsj>AWF޸hRuz ^皀#OmD*dW!scI]ҠhܲmvߪEbue jR_6}kѵ?#>mZ5TW S\*?T^V_Ԃѡ3(}~hU(0㗭 L>U3xGw(}lWTvnD炔]h!F OlCDd1 KJP`&;ݗG)P'Rz>6D4r:Į[K dMr5t Dgsj04 I趻+ a7 Ѷ0c .ëU;c2MbQ;tbQx5P6N +҂,Ė'3DZi+J`Lєjӡ6ab )7L)sM^ZVExdqQQ.I qmRSDHvZ@y'\&&mDeNLHomX ֓$8"ZZN¼3qm-l&Xj3 \ƸRiX[FQ3uXzn遤h%Ob6x Y߂^N"ZysasC&cy"즆RAmpT"DHz聊C{yVt)B& if@^%DMf1q qLtxϥ`Sx>B Od ~B8٭mh{Y;dS4%I`R~6/uP麈f #-< RlryR_[._15ݲ7ב7kzlBt)%u%3}]d0Kh9cV8t4UB& 3dh,ˀ3tE2ݵ1FƖz~9ܛhBntD.ωI&I  &0{j±ekKlmGiek2ɣTcV῔5]RGџ =X0i3{GrMֳ}I܀-QFŠ+(ӦJWkprٕ*Ppn+QcمԨuh@9s#CQ-cR)NDZutřo:LfN"1wTl\Hj0ӝc :b!@@ fP2Zx{u=i d!ҒmSG˯pE8_*wغrd\6}WԴQӔ9-d2 `խť\P}*eEix1XoWhFdG6fiNk˄5p3h 5'Q\Bnm4fV(%&Ɍj5fw?f\].Rs6Qlw0ﭮB\1s\ַLc (pk`;&(0a*BWzк8r -535!O9ho1zlKӕXl꫐t@ uĢ %G ?M5cGsnLc`.hIۄɹ&o&$ۮC@OB?aΛ}H#D 5RSk/hHc".kK#F g +n/S#rV(OڷK'Kyo+q=H)X@9@'T+R-6Jb639#=jx"6?H)dPѣDK*D*TuF%=i2jIҪ0ZGwIĈ235F8 67Y!U;/KEWA&C o$ܹplWhЛxnCZ5C@)׮0h.nh 'R1nYl "SJhW7?FVԑد3V,a1M GqYQڏ0qx:;#5e| p:PFwN43 %([>FqپDYn{YݴȺU!z*6 ϑ(RY\5I+;WQL޿BYG+'C7t,O0j^=P*~dƋȨDpc[n =y͞Fe1L߄!wOeu[T8_Q5k"o}Z ye8 gijw@[ 5Hcѥ2#Qnw2#KnG,m-<<[EPc1 /OX ˛4%nɲ#9TjB{S{0Y])JHINP(1O,usfqJM5{AWE#pV>)?o bn]>0_ؿk??}òs> /]gzMcs?VA`]Cb.qpg!g49+ 9No?>ޡcxPCiD h~9(u/ 3_@v]*~ V&=cdޗjX*Scݭ'l>'"o剺>άd>,'ް>T9L{,k>|a5odtVֽ[vP&4~5x qNvѸatWx~if߬Ge}hfA_{ G KU߉ҮG5ɮ=4J :YkXN3[E3Ԭ=c- Y ҿVvͤfe 3BMt?kÚMP"ld2"Aұ|:1J2ͫYqH3TLh'ݎgE-얥|i\>_+qN//C=4-Lw߈Ǔbq*{6na-ZOZwetH-,5͉DPqsJwjMJx#m0ْA4vlƷ;ps %#>éS։co>"j9Ϟ;J 7a,ZliNz:J W8[ *c ӾSJc|]8G|ާ(BL,/[P!X_{ew물Jk0*?: -|K}ֻ-ûyݮ¹&x.Hoe|NDKN“]I~W `lGtb zڊ+<1$WL]82~3 ~=X>܊gxsj@+% >DòpcR!tR(f F0ee4oEYo@Ffc6RK7(uNg-d+(*9+<91X&j\#c յ0ՠ շ' ] c?'j;WȜ0 -Tј\g =KUVV\Ɛ9niS<#z3O"pJ&+W&؇Kh-@ ]b[ߜ!wI =nћ40jpē-ksr~-QQ;li훑G!q+PsEߌax! Fals+NRA:6c{ MZ{$iL8.P^V$x6+¬< AϡMͨ0 |5o?pkJ B)q&mvxgs C#B r''m%F0H#Q8kY;}(YdT8\eWwiY=/Bu_0jrxo JϹAl`6j\w[  X\X`#Woȯ̝]lkKγmab&gׯ#ȩjgf,Vߚk1ҕCreW&T3(d1ޑX0n"f\D.®E3A-f6z7Ȏ. ~C#|[ܗum̘!;%}EKGfu';/MHIaAي5d){t?"Mcb5ͻ&Zp/gؼH*x5i}^ (+pDw +IE=Kq}Ì&OΧ[yf `]`aC?  t7%a唙3 I8[Mz2^^j>W(P~|FoVdWI( 89* s dMC0RQ^gyʐ|nvA1ͯ).OI@u\(|(%̘*ՑN-LaN f |s! կo$"_Ѷƥ"vܼrlL:GݼQh ږВN:lyefWj5Z$@ʉE3=H=g$ĜnO ]CZAqzR;75JN'{D-Q}i-38P$# ag-cj,ZJͫ2u&cjV$/m1!#<%8NN wtYaO8L Eh+=E-$Fw2LW6=gaN7,M~L1[dޘe}KxZPĸCdvg7Gc5*Pz'!1* q'ɗWJG|])Qvc5L{J!΄BFVgVv (|LNڝ˴Z5YCObU R*x)Ikj4jbSi8A0"`bڭ=QGZ` 4;$7*kEv'Ѭ+}^ J$3pgQwCĝ,DQ#jC#e v/ E\!hjfj;(m&;H۹jY>3'<.|"7dƙg*_Y]U[k#׮J#پi{{0 ,Z¤Fhuѱ߬.\T}JE|9o`IrTb,a@ w mC/.%esoʊ]b[qϦݣIUvWFՋկ?{ O9WnR>U:QvsZ)/dk#IY Q;18N6wh'[If 4zRB,mA *~%ڌy0c 5rzuw#bM==S!yS5 ) G2C!l Lj^<_@Njwo7FPZknEeS!z3G퀛 /,Bv9 d'Fs ppt&Rd2uTc%H;-ĉ-ЭXIpkcE#W' VeY%[jfҰ݋I|'yi7QE-I.HCl஡"ڽ#c`0P#!.^¦یI7}0}ڒ!Kq\82-Z\mN ďg~sP(m b y^61DŴ̸'qô7In;[fֈ<"nf4ۺ@@LluR*=x edRktJpmq_D){P46AlmR2Y-5R6|V\pƒ$B3/T*py)N j]Jx n3w, Xs< U2Jb,$àqQi7hV n)O;zٻeX%H)str|0;GY9#iyPL[m9O h+rmY* ʠBXBERx1LGϕsReN{,6J %)FRw& m~:H*;xj̫#T QᖯMӧSÛeSYi|m7E%9"`$@eTB!3^| gH}vf||s |VOmI^\?pr˯8ONK{[)ONN+5M&5f5YXwߟ+מuʊqB}_GP'}T ÉEXl[8V-G峎MxwMgIjy^3,X5r t!ݹN2o o6ɥYw9D^d-۾f'`eCW,vmڷnEn0Nwg}}n&r-#5ܚnVѳY|&ie|p[n@OۄMtQ͊_۷'f[UؤDA~$4¼HԦb$XVU,= 'B '`^ -B1bmcLcOLOxIYqwۦOtsXJ2Q,6#kK`71Ř?qPHpc ^1ع:D:ʑ͍5Q*$3?N1zCϘ"Qr&!&|pa(b TȘQ/; qFXp Tq6 -cBU/j̗훞g>d1P^2|eS2!9c&ս^˓[9㼡XFY^/)k,&xeVtj*KT: qY^_Aޏa#t5[x *kz}QUoGo{uF+ݳ! }f1L1lyНpBJ} HC$uo4 ϋy33 v+*,Gd*pEʪ3@lH冑:׎<2&ኊb;LA-G*5bw@ztb8uzʌ'^gcA PSz+$e9[}H)peu椭ܡxb TAN$P89eft?+黯cݡ X^B$923*Vz .YIѷVN0u@8YؤzI_ '_/B"oeQR lPVnf>0"|($ S[;ℶQX Nka3Fǘ.-˳oMK-3J .! >f1]HÀVߚr_,"a6z]nYymr;-@N4o炤. .I΄& \Js|PA6T>Vmd褜θ J]157}?쾩)nXv&M-:j%fj',Tw!Ɨtl|qKN4'2ssmڷCNFj8i0:YPn}<Ťj#r2ї M ^u`\ NZwWg2(c*B  v`~d%" [m8UtcXt/0dz@bf$Cv)xwBbQk<@c[U35.bQocqdy>^_YKX[X_P^E- 0GmNvrDF"M-y=/8%H$wFVԐrKdU#`M5g`p TVY"|os:ڍD/ęXZR]Ph7E˨GR|KuAJ=ޛ9"J[➏Po&Ϯa aސdh*bF$zs#Ϳ2Pŗ$ws~Q>[|3RXjJqO |iݞ`WLBh(%a%P6tP&Ls HE{Թn@i f h}Q*Lj Pqt4d^9$ҝ*D=$)Z{]{=G¼3J ]ͬaxՒPGcfWf388T BmQGf`8:*Pkye3:#$0b[J<)ib֪u<)v Dֶ֚є; v}qLLX X7$U ⾭=ٰG,wLNDpz2h!K[S+F,?9SU?|vuYm:3r7Y5dwv?O8ڶ/:]ģ?$R~u}be1GL#;KuU Y(q|b|uCj<3&&՛uCGpSQ4[= V9mZg"^0ܵxP~bePJ8:Ŵ!ZJj j鰇D#6K]<%sG[Mjv_DMl EMM88۷ Ң|kD9udžtVJ'w@Q4&Fzٰ|w,"$ Z|fjzR^W:lR^ٝMY>>vklf'kMbIuSegl>G廯aߎםmHy+7}>д?QEz% 6YEg徢|L)J.sVMЀuQ2SS#mTk8nF0z5Ezߛ _El^{H#=W 6l^0Fb=ĭlߺ5PV̌;fvx}ߒ1ѝW;蕩|}g FR<ށ1HЛi]ʠ(Ρ;4%~C!vBV/g =a+|jN1%WKd=;-;.rWJEoXA䀃œs6My$1VsYL!<꫁h|:ʹ#\G&w$0Iah4'#SGl)Nt؂_t8SvtJ X^xs}mW>,fdB \@Ko%|qK+pYca&g؜fnfS^NpEp3~"n%o6PF#W;i1J;qdMfL:_}0fj*_" _>XiѸMOMz]  Ю@J:HIC{w#ry{Y9!IvyϦTTW z?DxA0LkḟåݕTgY%lΘgw,U̕VS;M` Q罖=#+5kl<1v7mтIbFI::4ł¬ÀOOR1ήܹBxdsC}6vz2g.L1-1獜&V0*-_!#uA͏qǃ4\C?$ADsKѯA:/椿yixy?)/Z),ԚnyJ^S̑5[֡hP 6YL-;#ط3FЦkGLZKgsHG->4UBX65qFXN-r(qR{ $n"ss? o { ^9| }+aW'IIvFhGaԮsep{HC4 Cc'H2}7v8zx%I4?hi_LK?1}Ba%N;fr[pH'{D7I1sp.=ܥ.J u=AĐ= odj6nBZHx{!EpCB |NO`qoscX,fӹIaYVM1o:KNx\(z[gEuzBqiHxjEx^ښ !RoEbzrk64H\Hݝ?pdn[S]INԜ֪En;64*26ğq4%3*𜳻$ic;,Tk}5SfP`5y%oE2sd])m-&ç<㾂A'ߕh&iSYAT*Npx8C#(xDn 8gv,8XX÷eQ]]{^_aulo:êbXhH $tg{܊D|~0kEy9f2#Q$,}9.r:WhQP1燨m"wLdwFXL--&411)+ iF1TM 1i̵kjs$Z+Ї)Q, |"i1op"9du;[8% jӦA vBBEI7]\TeUa]$A *mR9 7IrJEiTflÎ+ JtJʑBWƢJ;c ƙX.HLŅe#S 똎Q!:1g+%7(>7 =1TQ|8\ʆP`rxߴo1P1bn0rPd=}Dn*1CȗЫ%zmkCh7y]U&]L"LjH)ރS#.(+6?` TI١3 ӊtP^L1::7ߐV5WeLseш E>ez3P'!.'֖ ^܂N _9d:]%^i.O5oB{艉O T.qVe|w)~[I݂gL%Ujl️Dg_JAjTrD R2㻨д0U1-Tal\'0yG|Kdgk8Ӗ#p!1A[+/kqw5vD܍`0ET@Fäԩ=ď"N>K{J>TkrBG-bSiOFKMPλ}6`%Q!c,w=Ag<¨Q#twȖkriAb6'pW )gkNiO/v'%;f)܁(]cX qyv{wmOn0_]c18-ɕJyTt5 n JTL!@G9v,yo H Rps[-c@Iz$и@0&u(f%E&sW$5:ne&ܷibpd; %ZY)NL664Pb#>=(N2ΑFRG wEwoK4  *Vb3(( MnDmBW*1?#InQCGwYr=3]`AB&|쭷 ,|LN\5?%~NGӴ~aD,&kB; Mlv'+D:^2XPPeg-25-֎;C}`YA@a.[Y@99Lꎪ#P/ r\P CRw%e*MKbU(ɼU}379+焲͏5ф=a@QX*3=*m`k"KLS0v;>]M;:K[Yѻ+5J,$taAV4wlڷ54ΖPoѵ@ݍOTθ!6V PNC:[摂"/pa\%I^p7Y/" #%&]JT,Q*k[vhb|CzXcq{JGt:rdS7M JE 1QhjJ2# *}J`̘^=3Sxt )l : pz/wɿ?-`3hovXڻYBg&/æ}GԳ>@:]993nG9"|>+ʞMios9kpZ!uɺRIz2 pzCOw-֕]I:>Et'̸~S~gz~t͐8J!>WuF#881[*a>ѮBZ3ZM-uCon艖ƾ{R]7$D[pG76-Z*ږ뙪[Yx7H?3!3k=AU":(JCiivVQfȘǏg(9]$g򺌱d6H[D?z׃Æļ'SqoI[GlN0= fV{:^H6MEHL'Mmj&-SڰMd!5B%VS>1@Y̚}JX>n4 v]$9[Z7kggaۓ6> B4K1]G퉻e.RhW7t0ٕ+!JQ "-]]83o>J+:엗w^NoQ'mm\fԡ}W^ \(xxܷ>w ?w=筮#t#S[ ^YA 6+k{HC Gptu[&<:7$e@*ʳOj%KX8` Ns⾍h ~gD`l🟖$!(n0NFwHR|Y!<m}'̤,qy?p+d4z-˙%NBV%/p*! f+߀FR`/k_;= D@kMvQVY5 )<, jOA]w}dg(utv'a y0w֞` `jFJ{UNmWPR[ >16D{&NsqE6* 9wlMN%K^pS}Y'oumiO{aFJ|j@>[]$|+_S0Bɜl9W]4ޭt)~;2M&;t{s{X[u~c1sy,6^,'Ԏ"W4QŬCeol! 1Hp{LBhdj}ED7v&+stfS+HJ# CM5nYI#8?"5\yCCᷜRM'{)`;:@/[ub͏ޭi c(ǣHӯDoQ7]/b+jF`R9oְjݛ^;h0+Y/[SV[3nH1FlO6;# (,bdq |T|!øZ.)3XJRGgFOoQs񾍸P?&5t1X!$0Գ1xA#912<+VV}ְqe|8Bp+=,ؙ֚G:.-Nh_q_RVhpL [)LI=ʮF`]~3k$p|äu_ A#=xR'}%3kzG?t\ |0*'-mG\3-#gsryE OhF Էt*)dS[& 8Tqy7\p0ETf#-!T~d6DuW,؂imfV \r#uۉp=vCJ3:hf8kxy$>f+z@xMgwQ3Uc5=$>O Υ\q|p457gķ|x܌vΦ&0U8~Hiw GR_j1$r.COk"R#}o͓fZ6Mt3ŴP¿ @ŭѤ+C(#)\xəkK#OiЭz6O =+4NM"e5 bbs.z,5iڛDۦg՘M5z~ajwcRLיD"&+sRz%ifo*$r x*-P1EO$1 j"xs3D swFOB_o%!1ޅg"wOWEdVkz;&5U߀Ov~lŠMz x~uOkyS:zu)8~ŷu1m1P^!Ԅ'|m⹃ E)1b\ ߥ(}apNĬ][&#UclRԿW5~kB -nɑV-)ı-bըI>SpN+4+jt +n[d\>-&;%!v59ŒՕ`ȸ&ڼxkSs.8<:!aKXBݺAԞ͡%'UZ>:b[!RF2W%yq-YM$Qp4pmHvQ}o8zA3NlES{Aw Ss$IW~ol "\ZW#5äMYlRL#;A`=b?a522NhB?I%3{t#8,Ý[qb.<s"6"IkTùfkXN`t-Fn@*7#=i\V9-nƩ%5vJ|6(rD;df&sobw|9_ݍ,'75J(XI!>H$ WE)gI3ʹ{s2K%ٕAbܞ\sҹإ;$.k0ZI4Ú{D͕9F d)o RlEbY_̗>|𬈈w:tK$̢Zo5g<}\s!̭WwqέҒħmv" d+zc]JD1kT9(aoI:#͜+'k)̴pȉ673 F'.- X_wAO oWr)5_݄ &0/';+Y$tr|Ѱ,e`3!ZA?kb+uWw wh'P"&^[1دgjeHP4Oboͤz F]%Y"d Skt3M>Q*RUO4ΕE"^۝s>;AOe{S/ \3mOm &Y؈o(,ulۄHXt`$6&sag6GףpFSn9R2$~&.פSmwBuSVCxAԶv̜I=sB%4c'Fk2]Dkܔu~H bXSe+S2\pjoovmJOjYǓx3R? %)<[2#0 ^Ovǽ{TRѣ,ا[<Ϗ!7`|[> 36D1T0U'wJqj4H;&Y1zG'grv<;9U=mx%U鰚?g,J!FE|%2$b9²Z@IGлPָy̑q}}4B᎗bP}c)<HX+2t 8e<3MJ_ءX%)K,cM+ &fgL38NvL"Vb&l9oV [G=~_Sbg3ܷtxo~}JM/Zo5k>/v?7Ů_Wߟ?}rsߘgoP?[n[8Q Sw,NgW6X3m0!צ>^MR)zR]a= \Y/+4t \7;tl8HcklV4ۇ+t`g++S bw{;묬]Χ5>JGSSRfn{e'~X؍?+' [}vmk"|v8l_YVIq+ik;lB[0Z01o g'-pR=V ~aJ3IB'fHbnL,@C/^͓AS,>auf̚[Ռq6ݗexH}?,s>4@(}݃NNDeJ)B'Wk[-`̪\}PA"YR,(WY;z,N(TxF&礯II,W#"rW o67RM.C5X!Dg+I+pp# /n.ZLY=y}mȘ k'&^_ T8+XFjERRzPo-NmLyއzݡprՑkljȑ~ʳ렌(NWBL64l`L+HG W;4-*ǶoeY05ҽ_)I. 4n&++V2n]9kD(A+1iV5_;$+ k!%npj|-lXn%k5 8vV^O*Ql:nHE[15eoDcwLbeZ!f,<1 FkƙYi-m0lǛsގf!4.RiT<>lP;Ok%YMK?W>ʳ!C<"yi50[B9 *&fu^If;*1<=@.t\P<%|@gkDCz",!,M\-C0?.B +Źt`%a55r(6[rYMMZTڈg :׾m|v;+V q:]'(6pWL15@Gbֈ u0&3>U~@a(mBCWR:&Tco%9e@z[eoq9VD%QMВ*6Z!P/$+jtN> g`ɺQv93eF5c6QG;N:[F/X%1Z+[v٫]w";c!Gu*Tz2SH8`T!&P+8Y/I8RPOn?o"z`wUCwH^"{EGYA23V[F!0 RRK,85f4_fޡX_报"/_yAͫ"qCI8TBR2ùRk:d\?Ax_#K-4ymg_E2oÌA“Ѝ蘁DQ<~jl_B"@+ 2ȅg5 &kVw,X(֤F^E}o(io4լ# DeRr3bw1pMnkĀ5=[nZՋ=@djdknZnj78jl;_s>ɳS^kR06*# /pS斑8QhkfB@ ܬT1p2؞F?~;}'x?|h+//zkw\(*:k~!\;t(7:,inaD( cjʩS*{!la'5Zg1ǷFͶ]$M*ؾַCGla>%P]`*dnk'+ =EAm0w@k4P8DKbMd1QSW4uF RkJNbcMI+Y5)s>|o_pvCcPcfȂdzK`P6j&\X?+SJzq@rQ9T)?G B_G+q<)+5I&P.?e=t(웉xG[ӏ}<Ɂ &`5\$ 2ۇ&U HIEyߑ!.;׉[v;Iْ 4,^n 4?9]jQ(0,d>Juyz Ō韻-NeAQ<=n9D3V164N\*]{^ [y F^U80 N 0VG E]-\I$׻M2IPzIE֠VGWV+)r:AaGtnl-V)^}.I٥ZADS{BㅂqfO$_\GIIe$~ľA2[IM>u/-_ WLK2Ȃ=JwE~B^Ȁl(A !UR( }фI;+sA@\T!L]DTN}ebaF *wFnJ&e&\W4,H~[F"v_d RQ[.ٕ*KYJ\jea$;$`~3pmEFSQNĆzGC \f{wd"M/4d9q%xx/ !P\w4T^x,%m=iLQU'#'՝,:gc7S^Y=Q "j37.B./7o$ oh8Xwz= HRG'rW.`*+ebY*a;ƛ]Ѡ3z12Gou?H^YJ8bͅ9VI^˨uQ&]Qvs]!WCD$sy>u@& GS.\$%.\/{Ku*M7Z{H(8/MG֋.v%esd?ޏTV )OXwnOFyY@wM⮛"JvEUh↑:Y/ONLGG,'YѐAO7QҼᘪtaNV79[l.o4ɻ f !;O574kʮXCb&ywV/O[mqxe}uHn6B$z w8U6GS3T's&Z6,㻺hpO#:ȋI[/'MgvS]pEAC%^ܚ`Ǥ{@'"ȀF$ZP^I¬ŪM9QWv$ "<]Ǟ`D۹E[tDNªMw:8Kep>k C.Bp 5_UےeDw˪_ P\k*ON!['$dм߭HN^i޽5 6y1PX̖Ǜ%} !N%PWqN2j#l]uOM+hkAPfj(rRtd6WP~YBY-lxU *zSŅoѯ|ߒ/-DHa7쮪a'0kQsDtdm@p.kT@yx>0rs-ˍ7Lp_)@mF<ă4\>Lj*t TG?5/79qg[ M>|ޣ U^6j7 E[9.]$ ޾$boR@-8!fFݖO= h~˩LH}<1Zӯ9;< nS^*J!N?gVO7Ĵ VER!#q_/7D1'H7iő/GcM>Lk@Pc ٣OJwBa9 ^:o[ecJ'mwC"vr,q.{K',L҈kW].xWbU6xh3jDoQ";æa&0iOC,lJNۆ?9c>(!aiyaW{glX'D!uޡz:D@z_!zFxun]ٳI鴰RuO!x\'m0yapv|rCHufFZwhthm0?H6HzAާ{$8 BiͲȩ =ڡ<2Qn.((w@^~e/wHOާj, )#Qh=unl2ULH/KssOq,ݞpu1=P =BZ76IZ2D;B&nWrN>z5kmnM} y|_#` &{FkOӕM6(,ERO`5gXM`.q de7E>"1s[fzE%,͹_%D]MP׮B`i{r:5x:+%PUzx0ϻJI\Ra xq   Sſ'K-pC-Hcjlh eAkS/q n܂+ }xױWL @bIof|(j!axb2 -_Vy2:wgZ)J:xK?5[)%UBl`sˌ,Vܝ[RD(PuCX/ PӴ6[>2jݶHJd,Y234Gj $DE# ¸?|BKNZӌSϱ{\'喚1s 9f_|ԪRA֛]3,OڷiP4-C8&uy}i 0ƻDlW-?IƟ2DQ!bCzpKA/[nW@F'ZR׵ɷ&Z (~C6NvqY JNJc, GBt&?Ctp'ȗ)@r+$(*@DKǜ oJxCۉ>4v$9+%aC$dݐVեO!x(!=gG¦r}K1~8!,l.n$+ UFqmFĎ_%k*jx2*~<VϞKxoe+Qclfa z 8e㍑;ǗXѾ٥rלH'F-^#P唆M]L/{3=X#5SEh If-ƌEhd]pȎ&~xrGL͜ոM-siF 1۷ѓV7?U'gW(k< L{U& ZH-dBhΕa+rބ +SICkս5U0! eGSx }K>g^voQP0R1!9<52_=mno1}_yze~IU@hrǣPkՌI%7J(pYBP6q),PR]y_fq|*35bIVٕa|(JC\[)Uʌ!,KkBY# 38P_ޥY2pݩf_ q^IIÎR"2 MbN9%ԂFl"1F>DNjJCwO*ľN5}[m›E}O0s3D߄j7AL"Nk!4,}`og>7hԔ{J ?޹%ɒHv+1i{ݻyUY%red~JꦇH< Oڷ5<1v?=?23X#{5++ 6'B6dfpPQkv# ㉊?4h`ʈsR{t#{Rb6)%38}H.jf"0MسE0l/oU4LB^^0=I( #G.*32:\s;OhPm0uss5-ෆj'>X2N޾YbZ{KMo=߂eg8ĭ-MD ?[5ܤ\DZŏH:r Nd'qXyLނ.?])GT$؉^D0cNra`}edwC 1r++~+$ Y‹ K8πs 3[`t!QŘ^*wQMGT@1QhMS]GZ傡ŹÖ+`Tr.ª:O L^Ì SIITBQ.SWv.~웚fEĸ #^Y LxAZȁ(̤<{< .Vr1IFz8S)+Ѥ; ?H\፦,Nfĵ#TjȄkGڣ .2`R"ݚmy}rP>#ңA8HOߜ&llWxåY*psAWA;j-U1k< л\X3gd)A5=/w6e. ‹T' h QQC|=)0r~+JpmlW_Ha4qøl<<'n"R$y '鹱fq3x[ )3^q0|< #z5.z^X(1{,#JED8lHF޾Ę{f AJi'd74UޔoÓ۬vMzQ 9m9K k^)Ih`SCE:6S'RN VFE*O k}OB{H,.˚GdiCL15h_Ukq0B&6$KEv>1h7e$FeǢZo/@b0]F05q\i5?8b>23\'XM[ޞ_ OxpPuN nqyp3ǔ#. ^t\:3.vOVDivA,H+=s%]D@tȩtݲs1S6wԕF~}jVR}[ٷ?_~s߯oן=o§X? N7 i_al/Q_<8 2?1:|A'Zk=wMvu}]XheCj_Du6ryH[~%=ySћpƅ$FuhOgl,GQ䈴gJߜ1k5U#8R C=LSꄍQ5X?+ P]%[).YEo9vM gghz+;aMW3*nm"!zNWE ۷Y_/~ˮ]LnvRڀK_N|w]Srg>9D+ϔe]ܯYCdoJeggڷBN.kڼضo5wdԄ<S f*.6 FΫnHlՎYoE|s.?د}GLjsO{}0+ϪrRx1uj6|^VLk;b /ww7[^=!_>r 魜3c=5qծy(oq}lk5ٹ%;hWݪpO"iW,=8r9C; ѱo('ާfe3)_>s|#]P;2{{R0r&oLbcdU0Bk[D}K糄bh?e$SwkLm )4Nv̚ڇ*G/pB0oFӣ9UJGɮZLZCնBeEFP1n屳B6`ޚvF1rCpDq3$2[+>`jvQ҃6vZ6Alx5ާRFTC~FA 1`˞w@ux:7Lހ%SS ւ+KlC#D"X仏jx0+E)brࢼglZGP<*Ƈv^Mw=gQq`Y:ed[|et|nCjT8=я|#qb+DHV䢃+8kn'<׌ܯde^0_>4HqZKe;7-_, BNϧ,")ݱ&cG}!Q1gW*70hd-X LOMD=gs|+ 6Qk!e5͗ի/]?vQ7XѬ^33PE[DQR=偝v-(=X+ gϛӍFJshp\QBϽ 2F^A~ `O6uh}fX<(N,""Jo%;imSNʽ'ȝݕ[>Y:>o`'@?fjjfs$6Z+D:KEjE$3#Vs·0B܌DnH4sپk m'?I`Dz ?w}匌-@Zn/1ח=p#!OD5ߥy͓l'[ULyRI &nl|o# k|[|NF/-TAl5 cj%K{> BBVƘ 9T&'kR=-aBwdjTDk# 3Ø#nHWv_7Dq`MˌaD2s1_o0Ga&'€;ZXD3gm(؅5F7C5-EuTi2%oR߬.25 iܼQJ}KCuؐKvմ|1CtFejc#uxĢ ) Td5G@iA'eW9̩_ XdϧPM>MifC蚴Hsǯm"mϖ^ jw@ݘu\scE0q]*"c i90n9wJkpd)e\GZ[H񭕏&N`T{Bwl+ᬶSHݢG~{ٶF1o5 H~8g?IK`@fHu{CHzVL'c?뚼eRR<_E` DFNN'sRSG9oI}2ঙeވk6WcǓ,)aJ%lciYnĊiQJ43vc[bJ 1 2 G (3=oOZ/asZw'lV%P%lU>|\6qHҠ+5Ǎq0Fr:5: F 65 dz}m}k+z0LA D%J;-T1p/oxU.lԍ@T߲eNEt\r(%1?qUi{?1Sl0[96;+spqT)Ic1ZCl'-QͷC 1z^}+o9s<1XUbgF(Fp\F@]JY=SBtJlm0q 4@kLPESIZ̊.6qX!ծbj΅5".]@;dq{m;+{'FdA lyzr -F 0A$%}[*X:3WԊӁ0s^0dj@P#bdVt(BcPx9!F~oÕ T++&P.X\NDalM](xx\GqS4 U85Eb (Rb7՚(l ey$&36nDvUNM!h:svzWC w h@c9` >) Z[ET~CT r ?Hn%~kAt뚒LvI3sזe*Qx:3&0x_G(JG6AzB*R;6:WMwozAd͸$_!DȜc}3T%\K'wUFR~0M>|[')z+!*ێ`ޡ]c_M@~A?jtvSKw'NDdpJaS[ȋo*8N}V& HOADi·_b͘=7~!|ʏ;FRj[~{&̧C/Ճ/@ +溽Fp?B /{)Zn vK{USńkn(z5ꢰy :\/=(Ikl1]YG!3hu}Ku-͉%~t,|1UԌ:MꪄsOgE%|Fv+ȡ=Of*/cbX]P.X] > a1x ;cDTVr|oz_ ܝ4r")HSiu!( 38}_Զ3i5Rv[YeM6E{d9Ki1ʹ-sZڥ|죍%xX 8.k.y*]҉$k9C^/^s[uq^Sju+Y{`s1 +b&*q1?6U.BTBZv)lގfS&aEl ")ŚܤšR[VƝ/A{`U '/vlTA`T Hn.\18=F [yars}+-!5C=17omu~*YtxKXIdo{RcSs5i0a_m~Ը!nQ:.S YV%kje͡;!&Goxz5jaԠL* 18t̡ͭ]P2I@2TPQrdSCJ즆|57TWT/f=SUw y{:uۓTpþL-l>g ~3oѩcHSa%Vװw+M3\7~[ǚ`tY6{klX4ͦB<q+ν]dGY37A v6["-BVNJ[BY^V{c32-(7iɆQ5V nL⾕SR5f޻U /Eo?~ATZR-M|7Q&1^ FW_6BQ42\vACRkW,[f#Fjq~Pe:"pnoLȰo$/T}oٰ0)saVa' kUmj5=&bX Q/7ŦFT O>o'"x96 gMM5U3Eh9dUu]Op3Ndg-P07^Ѳ0xՑl'ȯ z*D86)ìD%jto9lmVş3@3_eiڡZF%.7H0Ƈw`MHёH{ SS PbOZgP%,ise1m|r^fĸؚ%@ոyrӼYlrliu5<ϲFR$72ss^ٟ??7Wgqq>cӃV/5.,++cEW+SFH=߭M󟞔C%9J*ɰCtIkc.0)Mی&)f 1jK[Rq} HG9T?TKͳEcuTHS.FE)~Je|KHR|f9+sm™!N /S{s UWL~+FZ?{Vl=Y@KK?&ϮKze vBqѤ.T]ut eTc 3? eqg>}hN7u"5g_2%;u0`7IhپuV|\R*ou@e0sNSѰ/qs.Lt9Ԝ r*/PpHp&H?\4IjE5]̟/0l+&Z}_~yrR-FYp3~Nu=Iо۾Q }1v:maYI+xc^$z+O6Ϣ8/J6;ƺV -4\kYZMhTW^r<8 P^Ky5kϚ^6igz_y88>'!~T7S/pUC紾Y=z;kѱɺ .k2~2-7|s1EGۦηWVw!X$4;btAצ~|sLSksm>~!`R}eZYٌR/^x$v@b=+}K,- ʱ2K2 >tA̓5YA,:uiXxZ>M^=\lNj3窀fγˌ4,$NY򉖃da|..+8iSC͙9B/Y$%.N;I˲\e$Q^N+kBKhvbDaGd|rQWxkWAa'(osqfl:zkbvUäR^L|7Hifms3Nz@|tR-㲶Q:yR P:zNBzٯ? W_O0` oy3&.?I\o`r .0iв}ϼ55_Dв"oңTo\N׫^Psͮeoj/+}6(MIRD#rW"ZrU4LDw[]I}O9-¨nV^Y`aﱟ<ҧlC31v=Ibl 6Q%`qalcx"o_Tt)&S*fCv(oM*Yy g񤖑 .&$A@ (j`D 3BzXn^GF}aUBAҍN6`'1ë'F5Y?p)}1F}тǗKb#QeU W-8:'}*X$Q||I$ +*r38\"(E0s\^j4w' 'mH{&Eg^T85z>lnM2ل I{3y 5-)[eY[b]6/< >guGAQ Yk? IXWq~3YgMj߉2qgP-+BWT Piaⴳ\>ՃB:Lb=pԫl&W:>TM ,7'VSgQÑjQ\#Xxo@Yׄx'..{@F4WjkfĩO>s&_A} U?2h j=IV)pq-(IudGu=' 6T\1Iˈ'< 譔⺏sb"x"[ } TN z}8 ?F$mDQhqDyI$|iZ+GآR{5փe@I;EqJTh+*>m7xEN{Z/_Wo.j!f[P]vJfZ4DZ[n/@ZgsƣT ՛z]4yI:_ q>Wkz+ 3VS#xlCz&\[Ħ.1Wc&Yσ }[Cm0FF.(S *:\˪ "P%ո^]zu0O*JGJB9Z=s%)@cpxd qQeh9g. &'j 7!N'őI}"@ Ѭ<<Ģ}i2Ʌ5uć&f t+{N u㩱o'`j_x͕f|\mmMH>y.txklCwkq1λbOmk:\J9157e0K2U/,)z#)Џǃl/X È PA:=OUى\> m/jn((HPC=" W\ތrL%ֳs]ο|%Y|Pwc3cmo%F(sȥU@랹9l _^s:L;ls5K |Ci,, @*|\mLYubόP7_pXqGeceDb Q+s=3gb/SajhS M:>=XJSWnnXAzIK0nͣTtpݪ Y{(Z0=˗l?=XzQ! StY0i~Vx6wUWB',"nY*׆7HqPRcBfvf3i0^cU'0  | #A3v!+3y DX]E2ҷ"F`뼏뚏 ]Ex)(բ╒ "U( -B3*N*Ҿu+Z/&mv.!Ukv >|5.7n^Gvis yKbUb"6qup YB95Pr3ʥK,&Ynm M[mߴJs$a1<|/fjvI\Dٕ:p1P=貚=ovK]tYL^}tz(G~x ${z@SOPH[-(H[W^` &Cjt_4PvgzR|"%F*v;y޴QNl` ^*tn) c5!/Djs!@ǞVȃe^SxV{pdE^Bj сv~XFĸ|\4Ope:¤RA6{5fu@i;2UW׼c`t eH"bƄ\B)>#S:dqץZ#-#,632U>P4Go^ ב F/.1/ X1L<ᖣ >>"aCj1ZstvSe;@}6ϕ\Gs5][PR%k TOI_ 6ӯJñ3B)h{(&ʹ6 Ou,F7֜6 Hl 'QhjGa8d@,dWrN8\Yow%)D!!4^?℠0N"'B7gOCo6 r4'rސa+>5|3)C\kR@aEfvzai!+a}s\E"[׼NAЦ74=V8D\~Q]TaυǿsjL9 uWjs[! 6׫_F ; z㝹V6 '??;:_| yHR?l{e:hm5FHvM&o{.PSG.e qk׷NӎDq2M!\ YoEI ` W{:٣9H[0%I wYy$Qb'h[QQ*`v>g{@6~xZy5UIX!Ϸ)$XUwϑC<4MZYw+>لO|-1)Oj[Y ̂WB4-}K']dLoW6R;rk%B J#NZZ>Bi.;N/[̭%9|/sxb[xIN;:)vr ?~)ݫ.6'ђ6o+[xT9jM X״7P8+#`MX9/&%ʳ}KMqI认д 3Έbܤwx>dRx13SA:S㸯x3 5w{$9"I`ÎO\gT-ϾQ,]ktdi7_M7F d- DDb$佖 Q03Z줁qI-,఼ۡU엞% = ؤKXI1|BЛ(b[ЏZ\y?549Sd hNֻ}=5BtГƘAD{s1۳(ia92prnšfL/$\37D {>BIIlנq 7Eg#opK9_~X٦>H5fNhFMNʺڎTN7bjgNsz BJf1BiWYr.6Aj:H*L3-LP7&&䫩:&S 7 Y7L b%d6))GbR,蹊/!Csbk[)AGժHj(nU6A.&F=o {[\4JaqۡZhٕ1_Yo oph|Xjn|"&sШgC4cJ6h&^!Fjru\n#<i*PC0 YznhMho)JLqBչ*+bDGփM!ߧ :k£GLZ \8+m=Bk|#fC 1O,/S2j(1Gl_Ƹ{ӟK8Xu@2:knu>=_*q"#eCH jß$ڎ['+D-?eo8'@8֒ಪ>LJakؼ!jDMwN6MUyzMLI_!_Eh @9cc`HKrmI7 v>1ߑAH$I5cZ;wBo{QCrS)%5L4&a QbZVE#8\Sʲo.B*YztŖJn"iSFxm:n^^c54=<["]IHdĥ ?%%W˚ʁ9B<o1X1x/oݹ2f,AnHCU}C΅guԮQG\ۢo2"v}ٟg Wk&ō= o\r_f1Rɯ˸:6Ny)V77 ɡ\ojY $!;D)io>:^0BHaY 77 `z*2=7!%E~p| E-XwPЌ|[ߔY%fcMX17j,/Y`hek1y_-d*a+IoK̝ ?Y6&D(XŸUu5R_vc2=s_v8=LHQI o VF$N|6 />l>+ u0Gaի(g\BJ/$HNBz=b0W4 %jFnsBp(D|{.M+و\ĉgK\Wh [2'1y~޽l^+[v,ϛz1SjW(p#sң_PCd?vI~aQ[&0CghI(6!yeUq3N-q2O 27v"K8j#TI'k O9c ]Mͼ#!Uw@0RrgCp#s){TC5!Hl֋E)ui%^R?L2H!\䌶o?Xqc_R}wr \ .]8#c.q]=TO Ќ0 Z U ɡgt%`#8z?}ɗPai1ީH[P@p sljJ#W *<^ӡ^xsM|'G""5&쑷/Al(@1'z0[`= ݪ?DADNxBpKt/N,k7;;&5VC渜ǿI˗vLr֍HVH%ܚfJx8V9VXbDs(JO9ïCoA2dݸFnʪ},> OJw{dŭ= 6? {Y5jr\ TL!:@D)NSݷ:n dHU#Q#fI~-7e4H%$0cז統O&AD33"бJ)@CF͐ƺ{wÕvMzP)b$R.wbRԴ5Ez/^<@X"rL-Ѿ]vU$h>Ӯ¦^MAŝMx '&TNoDe݇N- ~}+[8h[)_ и!U˾UB#AE̦b757VC`î;OjOhK(uA:ES4 w4]TM[Q $wV"kH`ɡN&f9KM`~{5% d+6弨0WLjh}~. n3)6 Uwd{EDz5;2&YðIH}Jzɑ&Z=dM)a3[1~҃N^Q/ELXfH[.|*,KXIt&onUi<Ilf] 68+RsK#|<Y:@ۄ$+,q;o/{x0`[oEhL$ Fo RQ@)Xz_W2546BaY.{M"R*g!̏]e[Y 5\s ( dwnH^xJM:mx^ Jpq5ᚤT|䍏@ M|[+w\*ڵ+S%3Dm+j's4; ݁\CYC*Cٚc yvut4{1ՙl5 УtGy:l 9RSھ"Df@GPQlM~H{45X@`5*sA0y \B5cD9'>iD!Ie\XXן<ֶM,ag^' bnVJl' K&ܐ7uϊN39 N]`.Wׇj`G~5q?^ڌTc!Q~ È^/^k/ړ__[َ>|ş?dy[DZg> QÅUqV4ʻ g`;7ix=b"qzјu-VTP=ʈ3 [,7``}(r=B̦eµM4gD/QD0ŵ+,do> fe;^"U6طQĸJϵV;u͘y'$VH !-@pxRps!I6aT;A%m|qCևEw<}kڔ>svDς,qV],PtVdn}.VHdݧq|&Tb&Ua6 IDi!vM;ilc_jцo!\ӯ8/c#5nӻֱg훒ion=gw ioJ&N|-^9м7Ek(Bɼ_< [滍筰ˌ4H` DQnvx%ӊ0Z:+-+]\F[~5h8(_(Nn)#긙q)Ç[,|G-†O|x~dq`|.DikuCA{tuVD}C춳mkE8iFsy/[oPliܴ#(}({ `ڶ<IOYtാ=ES $Gc.GѵCNjLrž'{>AׇRBmQ &:!ghlױǷ"FY!{SRt8~+ L,B 5-VnK֓w=Cp߈oɂ}_!ᇾHI3,1+$ʑZX0FHz1L)&柲&1SpMG#l ^c<$P1xS h6F!I܌ <{7DHg^f _ ~v3#bk)=4s$YM=Fג؋pz^˳}9 ^IxٽCeIU#{$!Ii3[h gBlɩx\^q(_6c+t*/dk!{F䎞)i!Yܭ==Ҝ"FA&i>rggb oYw0@]6:Hˍд'T``2R% $F^pDkj-7S46w]J).)Qn%l`Kk:XGzn匯 ƭ)d}"cM;:=.PbؗAB#_m ]T.vyII m5aR1pJ,zU\OY%ŰjB%*'!_\ǨϷb4Iq^AekjZL-}ww(J!۩x we#]\f*cu)h7wɚYz(_a ښ{=T?nw dWE(.w/Xe±faΫi~5!Ҹ* Fk GG\Q-&h#TN*Rk|sh`4wˤ`f<_R/\X P)>cł}q=OWO'p^R3nM7X*co5S4,hNqސ1Ud0WC9n8ZђδvZ1S xTܢxW6*Yq2i~6@aM6}~!G5%v:!)6~fpYhw[|hE2% E. n +bi4oq>&CkqZ7zs.κ.@,7Ti5Wn^Ư-Ed~[>5ȡ cON#ݐ@[_, !.̾(nPtEIu2I[ϫ,|<:RCͨ&2E" :,ڣ.kdF;|{2> "ްCtVv3>%3[㲶70FjfZsնUhڰ9:a O(QcFX.iھܞ-5ÈBq'ʪ>k2X< z[zt7RmVwЌkZ7`I&McIjAtrDuMdtRۄB7'kϩ._D?<_2o;㰅+N<طi5a|w/ylvN7;p!\8^إJ[孈&ox|%2M3K} l !1זTeAb zH.e1z-ơpZo2f,-cÊ7 s ?+P)fgEE`.Jh6>\oLǁ=­XIc{{T;7bp]z:KF:]kSgOO)OF A#d1+Jbc erqfgO]EBً,]m503Dka07MTRi&[:OgrҒ;_ahlp w7*5m(y1)©{hWDEgI~A2599fD vRݯ;Ӑh֝]ufCdi{?R6J?-۳9V2C9o76Rj!Yc/k#j}28װI%_f)4I&KT7ٔo-Z<H?$t&zސ65#.NZW&b&d'Ҍ<+q mM[0Vjq`h1s^bH~_h33M_# ,+ Bn0dRjfOb{g'(:GAkrHK7E`.EtMIv}ƕbmwDx" Hۉ8.[d[uw?/ՄDoJ[Q-KE?!6d& z%_ xvK!se= uRхzzoghCTbZO+!G#}Wqx%r.#"$;M*;}XcNTz+a 9M* 5ύfl܉@c_#|NfԬDTͅx \yƇoӯ4wqR)2D(B,UMxy6qM! *NVV)4](;y+iV9tQX- lMԊݾ(++qt5u\d,- Lu|JbL7e*1H&p^m" "0wvk O-R$X+TЌo9,0WN<ӡXH7k~ˣaj)M2ܥ˭r{@Ճ)18b-|ʂɲw֬1fǢI"@'v/=8m39Q]`WGȖako_?0+m>F 4lE?CL!kٟ럟S2_|Bf/ﯿּ ̂vj ?quq??>o_w$?~}>L y/njO:NYbTLR5 łTt}̗R1hqM[zR5,w]S.ᙻ@UZ?͟kf@S58TMj&t] smλ&ZVY=J*;b7t.>M55[Nڙk jJ YI?_yj{ҮymYm%lHydeV֘ܬ=tݩ'gehI?#(xmtMfZJ-lŮ]d+;'~l7l4ugt[3wY 3JŰBtz}Hوh>gNQ`k ٳIM'id69;k?SvjYXf8:eg}YeoNJ~0kNs!VYYBׇ`Ii fkv: L.Z}gSvA뚵_/|jr9~IPZ&'!_YWk)Ы[MjoXoE kU `0_I [y^&Un䐯o."&'6 Ԫ6XIjF'[!Xys7 ARM7z}쐛K{sև}xVl eFpvxފ1H y+p .6:+(p,[^ |v(A]|2%\ޡx " "ȸ]ZIhI\׬6,=mҋpMc[z~جm ܐ[\&,€8{7) םk@~݂5ͭbj:fp[G9_?`5nI_,-I]Ll<@5MZVsk|kɑ-$&~ y5GG}EϦ.-'XbP7(SC؇g|- Tz< UuQ8l\ y6|L0pIل:Pz6ܮhi~ V`P&ٷ 5Y( 9F 1k{FWY +T+⡟֤ S@G"85V785`fF.._(OګGEtF@l-[w;VI]';{u;7jnDoGpV~25z*ז7BXՃ5imvg_Oh9 *;" ` ?>%kO`mW2g#a$}ţTHk#*ZȣxqBMNYnH\8ugm׏ɎW4pgc-$(GRu] }Wb[vL,&{ C_=7) %Aa4-P=9`U9@?6+bDoߞ_rf@C+CU]/2<শe0׷&uVbAr#MK`y-!wb8#G=T-_F L*IZ﹭mtRFr\m= %PJ w˘;1(Gz˞:{L|GYU| 0J%9+ ƨLAfeeM̎ߒ|U, v%3\ү\{U‘0QшHo遇Tzwnvݒvz]7n6t7o)). V=%68Ru z&!][񚲚h9-xfIb׊^N02 I7g;Zx U-TG9̵tmfU,2!ti |7A~HU,cׂX8ɜ| TdGrLO:H` [oI.yQl⯞UT෩֑/Fm!#xN:殐gܜpl3h] $LfnKn!zLQu[: KY䟻Mq|Öl67=8 n HhkwlUzeFS֩a'Q;=xsŲ]%O1(4ʈDIA~F qD0B( mqgS[0] OxK+JtL jlbpdL12M4pgWljӗ+j37`[ NcB`"԰8j=P={eݽ1Q5S7JEniCg4KFy "ۄCG= t͏]ʅZdPZ}Hݹ=rc F8BqB~rN!VySᚥD0XOp'%m*v#P_N3J)׳ǍJ\wLćޱxJ.1آZT3▷R.̸8jhœŚk:nr{A6`\l 2gɵ^p>^{y*m3:`kx$&[.5XFE/+{lbmX]4+NAUoښӓL5@ 4wx<|h4loZjS<{, Gw[rF;MY{|4U_Id+Xg.ϭZ"$0Yǐa`MӖ)˖`_ڹ(^WY_PóңE8*m#h`-* !xvm}MZy+B|r٘#Y#땡\ eg+)=8aJ9@}tEg`3Z ծc[xF+Yh]$@ݣHMf/~oZ4,8HsԫȤOިGqFɚf)-| ))t"ȹ>a|[(hB ə*T *,¤  vTs-n0HhCWZ8QvRMBUͳ\X4 no /,d t: >"Gd0 jح$& Y}\G,NhN^\*^T*ĭ1&Ҫ wֶ^4\]f.+\ .RD< y]c5%IF"֨C?Rqhk R?TC)peFNOGRJIbX5s0K+2 x=wGe1B${D 6 <~eNr܄[+@ -&RFyGiS#Y?KٲJb4k GJ|'Z5fdU&'c̮P %sk.5H:[:.7V*JdRŚ{I~EFnnG5 YAМlݼMb%֑)Ql"]BJkoKwu, QY(@C(:yR_b/cVWޠ*cOc*JPz،]gTMͥxXP\SelJ=\Bt:/8X36w OmBy BWs!1ZSiX#uRnuَ&&4fzMd-Xx\qN@׵GSL~|\ybsK *[mփc0!3^:Bj`TZh2#p]s2 G8t}e>{kN"t B(l!7KHPh{k~>.%kWT=-^ɑ%m v)`$+DBbk}ϲ[*2 Lr4WVi醱cyIAO7(/U$#<̐9RG\pDqmٽ?:6.:Cc=T/ޯ!_-!ϑ D4aRo_Z5 ?'ʉMW/ddDFΗ@O:hsRvv/FA6B[e|J_lIC?$ '++:rYUQeZ(!1}W$cLUJj)%:^@bՒl!F"$,ڢvy4ERՇID,Zul?鉯LӫHLvhR8?Ty C<M;(*IFYaC#bzbjqaOl5b3DnvB#ǃ; Haimsd\;HbHr. ]n?zSg2I` vkqBe]ײI,ȪI 9")6Aas8 gWRk7EP(Q21ϒH@~_NrbP6XNNF]2B'-Q#S{qtˬ'_n:|yFo%P Y(;LXi2y 92dktyzǻ2s9կ`Cп~2o]fg; wy=<8#Br6BnпbZ/__ZSgw|)G_Ť_W?Ml54o7?O_L-@tDK:罃1;p<UC E<>GnH'9NTe-B>г( -_Smq4:~;9xRa:Q48hP{ZP5γ,VHr,'` V RZ#@: +O~v'Dgb?`N~֣Vb] ޳*a(tE 55sd5e5h/St+"(nh'^]z+) {'ֶ[s7q;k,g *72g" Y4ꁪ'z`5&OO֜UB;W8CqBaD9ȡlzsQ?>Ne;@jL_i% O`sP0a7<`k4!ZB]ײSGY̸ =1譩h*dAfأn剹*0y$q 5O| 4Ў,yHWvx5/yj^8$kdGmb:a/(FhW59Ju唵 '8}xtHt>zxD>k땉 t|Sڷl t$Ho>("+N&ؒhCq/D4oڸY0inQ0Vԁ/A_].2bY2ofeJϒЀfT Z5^mT[%K0=${f2U蛓[S6S}mK X`6E$Pms9x:{N7PӁ sPz'e6Q3\ēsA3؆ir/]No9qy9P@M 1ǡ-ϴ^-ù6sdi2eX q3qW4!ԐDA*hq_?,r͛uYo|@XBヅ;4xHǡ)-@tϥ~cwY8sM A c`PsRv1GX=OMd`q[.<֨SfPi]{ƽt*1TZX̛Ⱦ3ߔNh3ƾ3p%(m nWO<;DP`OJtEpYY"m L.i\Z.ì1Ŷ j$z14 m_:t4;UQTZEC5ߒ)pztFTjjP-DkNK"HZKtVyz(a+bBl1#)-0Q^gv4-Q{#\KZS.q{&OpMOCO\` oH mg.JIVk rAaZ5Szʠ#iD#G"h76=@,ϕ͹אGw^Wxc920O-T8^nIHe*Y1Wvc*l="ﭐ1$XF)VbCiQseXQ͔c ,v@!}!l+!f\ 0JH-Ft89눩av{Ԏ*-ήFKV Jn<$a%lQa2m!ȗBV+0qQBWKGڶwJb{:0Ø ϋ)$P}t@L}~qeKJ+xD[81O'=wb1dTnNI*;H"ʑ1]1'eB+V<ծT'^IɁ@09Ot M| Y`V4m upUD(/֒z"*w\4K##L=%i.Tc3OMgyqRH6:0`au^K^~ BWu ~C)&7C5C< :7XPZ'SQ@VlX}EI%\hgDh3'-J -8_-&3[xo^Y݀N‰"jN9 M=)筦cXT~gOXVV7NP9WC!yZcjT#v/NjI$RpUbkli::$0qA/+-KN2wNj; wGKA v-.R4yN)%2W*.l)IȎo IMKg/C7aQx}~[ }!-|XKw|eԑf~4%)!zr31hc |ƸR%e Q䐪29v#5;;D+/#+}N[!smx rGTur`N`gWS)76nrzdcR)7odǕYKlw<伭õYOsZ-A8Լ;^0s=-."&s \c g/ ][e෌eT&LS4ܕ `] {T;Hg U`?$d`%|qHM{ dpU bT1-yY="{,(i[I&zYl+ n[pDT+ႚ\`UuR2R/24\QCV@ ߪ=& ,qiI+7d?vy*3Q6`ߣ )A?)P4k߹mgKeyShAJ`N #\r*z([q'Rz[ \DQBd"E{8'I= ?-G삠zG6*Ĵt_HXpuЛ&PU4!3W1(R[)˯H= jj Sm.BÊ:-BөϵE++=#,D;)HQhn&eNc[ 2$NjuنzIO]E8CF'!JgZx.jQz" bd<8w=DV˙pKЎm V-I-I3~Q@3KS-yIGMcH rD+%ɣfGꗇ)mqăP'<<3шFjv&X/^ǜ&`'!0zN!_'PCG$+vkOUULcSm X1"Yl'WP= Eú= cyIK*Hv/̈́| Qý+PԋWFr6hanYOp9?VOnx.V <`?R[J9=DZIM1 |AKʵ +7jz "'~主i';#;l嶎9Z;noq@5IlbPd,dtnompūO5>Mx VߏFfBJ .18vc<ћx=ݞgk~*>Jtt"mQUeGmCV FuI\ۮ5?lhۿk%cl4R7 )TQwHdjtmy$X.aK̚eihJO+})郎ӍZԫ uJ 5Tl'jD+H]&('Tw-p)WL5KRm'\vbCZ.ƺ' qF#d J1c&sI[I 8g}8â&/#S.8|D)LSP2jayrK _2Px(ўl|g7 N~OG]EJhRZpo+^ftv2.dyfǵ4ϽZ͗HٺNR$mKn+%'[#cJ*ay].+BqKȱj5A\+We\wb!!ba6hJ)i2к]Pڶ>n!3|"n.}d~EqjhT4H8)d%*L;;'ToGnG|c?VJ(d߿9Zy?<XF^=~B/+?: cJ/޴Gu+]Qލ[|/Q_j=E3 i7no=:q~k(~2zϻɌk<o7=r*X3kuk3_3Eg(~{W'Dx_lfXMgJ~!qcr }AQl/skXi}A靣i&ގeaÜ/+n_ 8R8R5hxsEgi4K}A[sl'Z35YfRx_PUD^IyxL0W[|Qɫ~j$eKl٬[M\9}͸CMzŝm$Có#H Yw:r<; XjTKKsau?Wc{W+\аF'Qqx'bg?5 Ny7P;njXxDJDRd?Jg\[SƼ:X$'R,9wܗR{>2[PTfevgǽٍj[2NN'WTn߬XSrj cxωɌ,6 t*:A 9=E6EX1!¸ HhYE!g, ۖbmȃIN?少;G+s MzD.Fo"YjG~ccPưe55W90Q4 R@g6g˙cO?y%Ƈ-?SF5< dbBOt^Ȓ RMg $q٥6!8XְH^}8s: P)2"?$2ʪ憂qx} b7OEuAjx*==E 2LA(}"w{71+IĠ=\K Hҋ=+*)[?Gbjs a%釸n{wz%|n4b8aͦu-*!lr:7}+^ ya%Ǿ %3~ ~&8쉿*SdIˤ @,24!ϕBŽ1 K/~{!b>Gbt(J3ps5ablBT 2~_Q/lCGJj1]ez-;<.u*B5Z;՗(w]$ !-ńfȈpN.沍\Hf._Pd:vsH} + "i#|[] )TV.^$<*:Zlef5oՖȂ>!WcOO)Vb<ثO8dzcN_S"Z}RݣV.je2i\luB)WF A:bPB<ԻGRsRAb/2P%TiNp!W~pGYGKx"~roW_<_UN.X_E}vԫ<ޞn"$5HLӽOMmMʣY}_}B1RQn BM&qYuIo"y[)}seH T%sH$2-Y<2w_Ąc*vO7-0"j# X@i.% bYLWw˗5uV߇ \>IO&2c;I6x#6t,_v] b?tD6|5)( f|fyF[B5tt\tS]'s5}Fծ(! zlcr*89Hfy mOc3N|=>:ȃnn1g2L#+>53&T e^}J ?toAZrX)z`?bÑ3\ɑssH홫</cVը5n0 &f5 " h1j*G z@ SHőzLZ"}gr8PLN.ȊCͬ߾o}"SсN[)c<>aЈ=: 55M7M;Gݾg_~Fd۔%/e:˄*3[㆘ 'rTpHBvNe6KD|OiqH%eŜZv,E}yOܝVBR@Tr߲gWi9b& ݕ˩W~շ}l ItS=6g¦_;׌ upS\:%)K6XVg | \S? bq藉 N?O}{0.{v%Gnjm3ʗss4xa)sXE6,Kҋs0E& [f >\? )Qs˱/)iaB\;x7,Fc]!(wv7o|əMLO=5e 2\VغabQG>h@qVSH"+Z&[" 4VSF"-TD2tjR⃫~f~ˉf=K׭ \,APoWf.d: xؑQMg/xŨSۅ.U-(. Zf6a3#М;϶YPF~8+WzVY,w8~@QOjPȉ{6lz#fdH \&wg-=80)dtꥀ0kՈL|A59aY,m: yWrKZOŴâUV*PSsezV]$!PP8ظ_HJG.綝C\DA0ĚC)qo{gFaRz[PM>6 \Ivl)$.%ב$)z1Fd$eBQl|NThVMwN%7jtsM 3pc~ρQͿn78kG?bM㹝k_\lYendstream endobj 461 0 obj << /Filter /FlateDecode /Length 518 >> stream x}S˒0:k2[^Mes %Ty̌J%[.@HZ B& Yk͝@jcEӉOsnw(ɴcSL.Uy >t9{g kH/&)Ht&\LHhپqJ%(+ːg1>DRk ]s22B`v2/Ԧ&2 xrY+TU%?d8Bc;N #n&8MO=0d* @ȒkσKK{qS\wiGg_LOWw4~4OlQ{?Kh)AiIK[I&Gt1f@ Q7Nt>{aVj D±y ǝnc t?aS`fG&8xG6kQduA86G|9_#b̞lrq[hoNx7]endstream endobj 462 0 obj << /Filter /FlateDecode /Length 3206 >> stream x\mo#_߲N ߖ/W@r{ӢK%jm*qK{g.wV|Y]j83>|f9 /f/:/-/g{Q\\BULHQ2bR.ZΦR\t:g^ý=Q|_߇_/77U7/c|<Əw^|闢UW0g=XFJ hk1Z#0ZܣXRt" OA)\3E9 ? V$m=%HE[ޕUVۡ-7]q>iD^񽊉Rx/> /F1%xE0`ye1(gBB2[4{l%3ձ=7U/7p0]O/411i1MQ{=.S̃1ݨ` &[.3)ފNVV >HDtfɣFI;'ps_P'>!0`aώPH ǬsEXSJ[&<RGi4LR` q?|LB`;ְ2| YC5`(_Db^[0:^xx<56G&{;ƫ*v: \!s{<\N§1Q 2I{ExNj"' _w DǩyQJtMky@ьw-RblH%Fn^ݤ)H3ed䌌ֿ\ DbUyq_7Zq?i:+Toڥ즕Mo$ VBWnQ1d|I8@D p=dӈ5u7\ŒP"7ɐGV@$F 4YHK+"??g0vׂ[ƁdaB!q lJ d^hjH5V@V1+U?a>bEh\]δl%C}(0Rp]y t#WnZ5 ՟ra"KUdk`fIVZqf=($%j%X^uTҩ&`ٞ{N;VSa z\ >ckES[+R9>FwTM.@Dr!CU$ _ W>g>~_r XZgA2b7g==(-_&Fg[+lC.)d {1JeAT8"9>HXQQ(7H7\I@] Co<x(R LhW#5HMŃ!G h>y7$02KSDՠWzg^7y '`H@b"nÀ%*\{Ì 1>:a7p4(XYCY()# 9yx@,1h5dhݴ0evvlFPRд+ RJL6Q1MBQXלc WP%Ҿ@U }H噭IU;Y4 zȦ:zez PI)>մ7D6qTx8RΕ%ZS.kֻpI[pM?TAj]ĽxQ.q\h,2u-Ұކ-{ `F}gp@wm z9ًw%?!b*VuFa4?V_Tc|{yOlI{(7V|xr>hqa!T#,gn= x1˻U:Xe:Yu_u,S˻U Mx0O=P 9]l|ـT9Ұ]ح6AVx{"niJ K5yG{iTu.PZ]%y~ZE?$z*_f8A^nV\F0]Ċu}WWlߧ0lLdR]Nab%տci uybK(lL>Fc#8CASGfV|ЕCѼ.1YۑTHȝN !Kc?iðFN |ID(:AϾOtV |E]xp W+r0l}bF1Y޴\t堺}wږq@//pEΜU,hB%U -< $\N%'t>Z氍7ZQVq /(n5]kt25N _#3>I6kŖP\~a% V`޸JEdlHdhѰ赽K#&q]yVfpa:x)3ƨ"7VMxtuY/½!Z>Lk tJѢ([)YGFiWV\'-u׼Zk$FmߙxlӪ13P#Vf'04& 3*1XCpb%XG梙@6_ΝϻG~h١N~`Ҩ' |`q{{ے+ 8zG1mKݫV\bC7, ; I Y ?endstream endobj 463 0 obj << /Filter /FlateDecode /Length 4042 >> stream x\Y6~_< /QRyHL.r Iи=do$EI{lX ƖyTŪbf%V_|2_IU׫R*^\~XK{Ӌ>x^4:jis)>G|hk_/U>- 7m]a]aqy8FYi-.Unt}d7LGʱjz ԝQ4~~~^aSX1.so;٢^1Q9_fV0g܄9{6?\PCUeR`Qտx= 1+\mv߻vjPjf3[Vܪ$6S@%j3dk2eWSM| #3I#Ԑ)>eEF1YeUi@,'(C7RRfF E!?ViY4P.~I6j&,oSХZҀK_)YYYTOQDqY_S6=ch 03&顪m~uҜ.Fz[lL#%ֶMGOpO;pK.nu@u(Ǻ@701Ubq2-/s tU Q,7h0)Ͷp[~)6 oqBZ9\g01=g:B"38vaqJ؎gބh&TGѩy$ܫ3O,cs&Po+{-r,H,y5ƫ;-Mڶ`*}CITrn[T)xW,+(͛]T'DNydf{c`߷r}Ό iI>{RUA^Mѷ7[K-Slhv n c d;BZ֒ pݹh:Pějhv?clYpd6 |-_D^G_x£E;u+"h ^C#KpsK he  \ȭ)Wu|YE|Z\q[DZ]sj)#|R!c&<U6 9ͤReYatY]B\E(T>9DSc4U:|>ik3ܩǟ'?L'5tKLJiN.Vž!:*/7kn#:(50t9*0?ۅ%gB뇃b_̬rqB|g)y{:;}xGo:)ģ' g0Đ}wOW@Enפt{^/cpE2ҀIU-<^9s]m9V =SyS"=iLçjUA!UB׷iXE|"/WǛ ^ ҹZ} S.xI']̀nxX!y4ҊDU>Ɵ!T,Ȕu9+8zdlBġSF̙MUd*A91<uq( jwuMNyn{r'^щF9uϋ-CZĂIt璚CEd]A ź=p-v ߒzwmۨbؑ$vť~ W>mk>D8qa Q Wn)HW]-pNN<{ ԉK$B9ޠmJ5Zbzr0C s/^\Ij'uhgu">Na3ΧݢQd@a_If5I\%uϻCn#."9^ x; z5 j۔ۋ薙gBZC"7~#ŸKIhвvW7VԈN=^C20:Iz3~*46uJV;5J#Lp/t8g\u=e vl5GmC*r8F;R e</tg22bʰ&4=أ](+b+U۔Sp n,tqU&둾=>^1gf]]R1wu'/ƴU1  &Ixz]b8Ih9)~"* P#&gH@@Xq-~M_'܊n ܨi{z,qO{- [@r8} VT $v7ճ A;CK|x*7mN/z] tz=6v!gsbSMG'CdIDf %}f:AKK&oށ;;ޝ>a9~HxOy%Y2EJ a\ ?(/,Q0E& hl`HSr]G"ǘ)#ro~SmH2EWxjP"Ю2QEFQ&`Xl&\GHE&`U3Fi(GD&n =.&ѷLn"0 ٚ&0ڬ,l/cl*s$c<ΔT 1x΢xt *gPp ox`g:z `ʬO A88PBV:+ ۧr(G颗ȫG7Vwp/?C+>o%&P3"aeV[1O./ 0)ֺ N&JVlkO ֕gv3 #gf$"YTOD%Cp )9楜%x(񮔙Ex{(3P1k ) ,;@3Po#ֹ(f CqP@is/T` >Hϐ}k`bּ7J;˰v80f$ ,,gEX{V2eX38FMc9&1yH (az.b<1 '@ "{,:u) ,ڃ%8839K 0b-X!V3 p(ră!,es[yyI~7J3䁏!>1c"ƌxEx{yo2K(v>k,;xYÙkc Мa($LV)@kJ+M_īYiͥX^dt)]B6 K?ה&em#ş2ܥ,% ٿ+` mۖKn?aW3z lۛ2'/q J^we>\Rm:)q7ItI-Kayj4l (,SSЋCf] yK*ѻ{~-G'sw({sOˍk5LL)A?ۚ.{.%;Am3łuQfXOl6_~N'0K ѫt(;Q2N%'ʱPwC6)Oe%a(#1k(Q>H퓺j?aly[l Gw B`gA7N^8uG9$ DH}PZ0D7kׇ~ئGzmmH1~]ޙqB iFunT|&~N7u$D:baD96~v 8)j٥>B4͜ A3QXi>= `NldcE:˙ ĢSNq\K};JwC# DVӶٽ ]];'އWNjϷnKfjf5endstream endobj 464 0 obj << /BBox [ 0 0 576 360 ] /FormType 1 /PTEX.FileName (./simulation/figsim0.pdf) /PTEX.InfoDict 396 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 397 0 R /F2 398 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 11363 /Filter /FlateDecode >> stream xͮ$9s}g)/tB ANa>6AOk='yt**x"L?y?Mǒ>_~}w?rOW gS_~lyO ?Vs

7>ٽ>\'T>#t}_KG|3L bx>=b+|3|v+ϚKG_Я:[W>Swwi>=C|^|}~tg׾\_.!%j&vN;S3K;f5|<2'Yvj$CP#{02pn{{~wMyUh_?;S!YfowY\zg?}]lG?;u-#r 8gh=R?^Gyˮ~~kÎ]à}ڲ/vOl٥q_r{K6e7ϼwuz~lwx}֭P;>]6bݬvV7iHxvγl=출W [ègJڵM?ώӼu}->Nm]w{ݥe_-۰;{f~sƜG=-uacxaۺ֚O#2jl?Oc4XFouء>szdfX [xUO=:ᛆ#!(9x;aqs e{=CcjܖakmڞϱjB5cCJ4Ln!rW9]c]Gp #;?bnڷjl1^|l:z<{:"xlc^O>㩴ڊeo߸= x^e#^= 8̡^rY='fhêt{^:Gg8M~9, oF וo91lFo`|WuW{how {z}0|ie1__{T@{R@{R@{R@{T@{R@{R@|g|g|g|c|ouݓ;|c|g|g|ouIIYIIQIII'_ o o o feIQIIIIQII'_o o o o  o o  so sbu9I9QUIUIUQqIqIqIqIqI'_Ho H Ho Ho :o U~bu5I5jkmJ7?y=m/O?MǘG??s0ea-.>maOqhL#@?{ǯ,lc$Rf d3ONkjKi% Q\l46̟6{3sVK6NF6x-XЛqh00Oh5hFCݖ^<5 YZGԃ>[ \yÈ,<w{IkhJ4:Fm^S: 6F{ F04a Ul|XԶ[m\_1ُf0Vjc0WR;י_]f%34cy=;cY6eNJ㴬Ǔ6y֎ַz;ö/oI_4=G4oi;@K}H>*TR'j[VC=QsLݿ6MY q>Ƙ2YGmǍ=8^)v=} m܏-q=:SQ< 2::meH,b]%=|ٚuL;d$-6F@o3?L!aQ7=#FVmޮxgXkd9z{'sZf,,ouWh $1M؜J5l;k NH4˕ǔV ,jsp&+Ŋޞ_Cg NXW)VʱFS]XQO `E?ŊޞC eaEbE-bE;+-LV!gEŠ>H+Xhc|?b%#+]Xa+]OLV __)g{-kaũ+>i+N g;YŠ~9+uv嬸dX b}Xf*Vcb5AX}DdbE(+BdEwUψ+c /#+f=Yy\"e-X]܌KaEY1Rm-"{bEwiXXۅY?Ya~{#+lBXqa5Xч +SiΊ PYQkqV4bELj)_/V޼{uV(sVg/Ɗ X`<A5hXܿ/qs_$j 2 H @"/$*@,n_!.1ˮI3d yFHRaOIn$eHR € P$+ @p @z{HR"@G9@($0B@lbYR.M &vZbHw3 Iē *8 *:@*x o+@*@CR)9@&t`|HS' ^+@bE7I M QD_b{\2^XYdn/4?ir3@ iWH%TM ݡ7&- } 6>f2$\JN@&EHQa % ΀ 7$ $#d YwT]p΂L %ļ> &Hգ&:6i@T@H9&@z3/I KHHjtdUH/d I!rDvO ESHQv @,b_aHhFRRU zZ&>̧͂8X*pHp@3! C8V(BI  @ڜfsM @2 .@T"pd2Dy!C j X>1")[0Xr)uQɚ YF3Bu?3 rj,4@@ln^5ժ8R+tB$`EwVgy"bEoPLHĊ@TH6byeTJ^?3PQVme: "++i"YXa՟uT֬ɗVY_WL_{b늩޾S%f:ҜU-늩B5 VT%;1k.V4T}XwF?YQV$ XQ^LMM}b+GXј5+bEUL+oX+aES=YaXVL`VI`:X* Xєn`u*/+l@vZXaBXQZBN^g6.U`E\XT0XU Ί:c;gX쬨+4 +z~[kV|"jVBVDPQYf)uvPmf[`3&t c8xjp_c%>>>>)>)>*>>>+>)JJJ d>d>d>*H>)H>)>**ߝᣚۭᓚ۝ᣚۭᓚۭO .>)>*>)>>G>)+>)+>>>*>)>)>>)G>*>)>Jo w~8>Io qZ.,].B*o!7 KZW EW K1W k:anB!7 V`/O,Z^.C@"MګE~Z/,X%/B o7ы07؃E_T/Bo+#XT/,_U/q^#^ģ^X{U{U^.o?UګMOT/l{UsWWzS(FV V k17 VՋՋhϗE^ĘT/^t^X^X^X{U^T/b>T/bNo6^X^4֪z zaz֍z zKySz;Iz1ڋꅑzUɒU"Ӣzk}SRѢz[ySU"͗]"͗n\ګꅵWՋd;[-I czaUP^^XU{UHzzzaZU/^mVՋ4wrՋ4{uՋT/  'Ą (_@/  q+y:A# AAx `@0 J) A A€ ha@ ha@0 {`- ' ha@0 Z- A A€ ha@v ha@0 Z!Z Z- A "- '܆ ha@0 Z- A A€ ha@0 Z- A A€ ha@0 Z- A A€ ha8AD oZ"ka Z"ka !;n A A€ A€ ha8A - € a@0 {t} D{A$1 BD1 Y .AAƀ hc@1 SAAȀ (d@2 Rph'2   BA!APpH! ":A39AAPȀ (d@2 "  'qB)d8AD:A1@2   BA!BA!APȀ s (d@rH! " '2 ڄAPȀ (d@2   BA! .N)d8AW "+d BA!APȀ APȀ APȀ (d@2 " , BA!APp(BqBD]!" LA' 9қRDRNQrh'9^D dA3 ]w NLt3 *U~̀ f@t3 pH7 BL,À f@v f@t3 Nf8ADNU 2:A +A7À f@t3 Nі6NH7À f8An AD:A9Gz̀ f@t3 NDUzpH7 m 7 'f !n"f8A f@0 'h78't3 pdPכnD2 nA7Q!À f@t3  nXA8ñ+*=8VcE{3 ` XAA V+hT4 2h8V,XauXAK VP+i8V4 +f`5 XAMXcEcRX)`$i8V4 j`5 XAMVPpT&775 NJ4+*;Va*XAMVP+i4+RpHMñ"5 XAMVP+i4+Rp0Vx`E_ +!jŠ~WV\MCXq5 a4+$`Eji&o j4cP oj`5 ⁿXAMVP+i8VXcEji6+i8VojmJXcE9VXM V+VP+Hj8VJCMUñ+̡i8Vs直Xq,+ɳM] X>Ԏ l8VXQ>XƆcE` ƆcE &7 NJv+hl46JMcV+hl8VXьcEil8V3,Mc;XAcV+hl8VTuHcñ" V0XAcVpWMcñRR{pHcñBv7Škl+!ƆcEJ&{oB6VXoil46 ` NJܤcE` XAcñzcEacEil8V-9Vv;VV46 ` NJ46++hl46 `V+/ 'D6 RphUD:NAPڀ Hm@6 b!r $1#rIn8A[D Aw APހ (o8AAPހ (o@7 NAY7 ԣ 7 9!APހ E (o@7 RpT_DN)o@7 }{Sހ (o@7 Rp@PҘo"+o !"+o8A۷DNBAPހ @7 U DRAyAPހ (o8AQ= " _AyAPހ (o@7 Rpޔ7  $J+)o8A ĕ7  ]A} )қD NFiip@D8 r 2A aDjNJ{1_8 zNq8A9FBL,A q@8 z=DzN$AXw A A q@8 zNq8Az"q !z"q8A|UW} q@8 z=AxpH 5!Nq@J?=AAph "='!j=A 5'Nq8A*sM ]AAX A q8AA q@8 zu= r@`!$!Q*APu q!sD1/A AP s@9 DA AP t@T: *JAA t@T: *JAAPpWαt !J*"t !J*"t JAAP t@T: *Nt8AڲwQ t@T: *JAAX7AP t@T: 4!*JAA t@T: UJAAP t@JAAP t@T: *JT: Aendstream endobj 465 0 obj << /Filter /FlateDecode /Length 1992 >> stream xڽY[7~?bh3]Mst6=EQtab1j{R_//Ҍֹ"H,IHʩUQzqBVYR[!,ѶYoU͵V?ggsnf.fW?ְ!GOf 2~M@e{d~lȻ{݋kiSuD-=2]U}'RY4;[,W_-k sZ8y  ÒH?lx57'扬d7Z6OLM=PFf\_'fQ4_D͗C|\nwq, &uQS=XҚRPAqѶTҬN)yMfl9D6ZXӰ#8 BJڢ` o᲎Szų; nT5%{hu1Dxsf-݃pF A 2|tPaz7@3X)oCwʸwxVwKʦd# &>Z; cIXin6Cӱ.(hߑcT&eB:!e\)RG/Ql]4 _d˒tdٚ`D W#%!mt(U@@Р;o1Hj11UĬh z;%wW$Ϝ.HS ԝѾ I;ܑE`]-⢆U(XD-6=Ɣ'&< ,Pu zxM@ $q0l}Ern1 ֣9 ĬޡQ[D 3k[ tJrfs%6}丰hqE4Dm u!Rr8lU_8Y%ha-ԒJ[ϽOi?r 3OpL`ZFryd <^Bi b*Vyu( tꁋ$01\+T|0ܶ1ʱQ&Zpu*l@ ˈ}E3_D}ulN-]l4ϵxXp, vP/"Z$cSlw0Xltt\a~p:#'pE:-y0,2fe`uLCdE-bψYxA'=SBCF mtuT`c[*枢DI'JiΧ`B8"u4!L0&.y#ď%zQ9QN|̑B X9;-&Nt)2bsŇ`㔓ؐrq>a}}6DɪbCt݇ug#=rD+!صosOk~஁2[WE\}}UJ'̤Цa{vK6u,W"ߕB|4:-j2PC<s7nڝ*}ăLxJŐm^H&QQe tUs7`E`a&0u :>}hE׆'1п0UBn*`1:|F EˬV)^54fQz9X4BK5~Hgk9YFxRdeE]=z+s^OyM$ΈWx7M>C7lqv]=Bc=H{ܧ \Oʇ=qoi>?W &p[7{{ bAz2ac2{yp}kYv{O,CǦzeTMUJ4zH(cCe^]W枺j+l M&y<'%_m(PMǧi|dpOY ECz+TVEIsendstream endobj 466 0 obj << /BBox [ 0 0 576 360 ] /FormType 1 /PTEX.FileName (./simulation/figsim1.pdf) /PTEX.InfoDict 402 0 R /PTEX.PageNumber 1 /Resources << /ExtGState << >> /Font << /F1 403 0 R /F2 404 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 11307 /Filter /FlateDecode >> stream xM:+ri/&-(n 0/`w77>!ӳU8"a)?~sY?|_ǿoӯ>3珒Ͽ|l{\?鷏:?]3~miܯ9|>N?}vBus>ǿj?[uɟK9峞|[Ο>8n:=vyvW~Wu}l_cgܖs7ϷTǟ9|_gמy\p7܇~㣜bwozi35}Lݎ -dq;+'yJ9Șiih7/bn㮷-wYn;zz 0vZ>nQ?RoOvB?T?ּ|eʯ߽h6%?~uviZ?hkt=v/:w:Rz\5el~y֯]X=m~-nS׷}i=jkv{f6;575c^ʼnY_v2u,0 7Koi*ԙK+f#us\4֎& gvĹֽm*]c.TTXcsc6k[?K9b]5k5nsz˩sۡ>R:ZN"c)5rX 9Ie숭w=㘼>b]2{W-kx<գw6@=&jf̅ǖektl- 9-sx[#dj:9HxP3L$#lr-ŬI650eOe2 7LFs0v ǧȯ[ǹSm]rgVH0h `1Ĕcec?::ޟUAZj$TesZ{\1yk9we6zlwu:l62?' 9n?krZ,Mn.7GVG$_;}7;~[[nݪe*Xma'G'h6/?j9鰱кƫ?cKl gnعp#g7索pګ ߛ ߛ ߛ ߫ ߛ ߛ '7'7'7Wg+~WT ?/*~*O~o*O~o*~WTTUTT_UTTTpG7'WG7G7G7G7'WG7G7/ ?: ?: ?: ?: ?9 ?: ?: ?9*~}YMYUuMuMuUMMMMM kojOjojoJr_8~_{t|S{r|U#{r[E|QlW2_~~0dMՂѶusWa{r#NA[W ЭQ,sZoÚ?P^s1}#*G}yZغnZhfCG3T@_& כ}eC6l_Q|[]EfuӾa_ +LR_r5kZ*_}gwM]Nˠxw>zN~mlîrݳ٥'NY*Ǟw_ϧ ij?}ҵ?Rjv*ۻ^z)}Y~ۍsg_wmv㷳Gٵ_r_F.vczPZ,⛝{si;6GrfQb)m}JTmk_[lk/f^tv?x4*;Q~Xeu?OyݏzJǯaBy^KeұrhN?~=p޶Gwu;?;]ۦ~JWEWˠk βOɞ2}h߱YiiwCfo[]Gh6oeo Vv/joAׯ7;ۗ[3?xپfvT-<bVyW+?X/w+J Xq.V~ݰBYBmXĊf6&VdMhfBbEVٺŊ}awV `m7XqZXBR9Ve{ydE/Z\"[HXQzVi"Q`E1m V,++]GV0XhBeuXq|W8+_F.VNXqmXї z߂W4.Vc (qXhj vnׁ/V/V4ԁ'V]ShOe|Ŋr=1Il+N+iv(V +Z$I#+ŏ+X8{bE5>\ 9V9 g/VX,+Es`ũ08aEȊf +NkXqΊScXqΊS,+z{"VdBV\`EKXqZXq/׋{%SZ+6k+6bw"y=aE$Vhd +|ŊSnidE+vXqh\ +Ɲrx+EC8 #+=fٓ`Ů5ɁGb%(޷UyXݺ ( y +Ze%-+,ׁrBo| "VXl bشq$o+Nbř=VŠsKŊf#+_1V*VXV4;].+md}XQ{ȺXzXQW +KׁOwʃau`E=z`EMe~Zt۰a]]a-[`lϋf~"V+4ҀC8yqjŠ bsd `EOO%'"y#=@ްP]i{`Ŧ +o;VaE8MhcH"yH7Š߃:`+G|h`Eո]X?֠ʢ!VUC(YVdX5nʹjj5' =`EU'VX&uŊ+++b38uŊJMLÊf{ R,V.yXa`FVXVNG]v~ e`u`E^UcgE+Ecb_KtJbAgE_=[u`̂}.^yA5"gY\΋} yNk+buXهİbaŪ+h}cŪr;T,+6dXnwH@{aP /;ӟuBd@Vze=DI9I> wF$WLHD rS@vM DeQqJr!dXr@g2I  V)#@(I pb@x9HU TeHT@ZBI|_I:_B@NFȩa@r2)$NeS*Du*CJ}RCiM.3a0euHBRs@N<H0aW:@+ > EIb| Sf0!ٰ9FTuQ@M'ĺPYh%@Z-ntH<dS @Z7%wmb nw i1$V5/ }vb  &1ڟ,'@frz@a k:@<H @ԸH͂;r@4 p _)<Y} @6cF!Iȡb(@ hA$+%$+rR@e#@ HTsǙ #@vU?r:@2$`df@9 gҬr&2@v2@rjVTYLHkC F}Ro3'ZfVHqb#p8@l @N2 "˭Z۽(@}]] <YwHmYadL٨ i@RbflHR$aH$UHd 9FQnժ| Hk֑@U@B2̂} ;@UUۋV̆+b3X")3+qaVXQ9+Xq+vvXA߄E}VT QbEUD(Y2XAl>` 8Ym+Vh_dYa!' 8Y+շ; ;,x,5g!<}w8+#VבEtXQYAYBLbVÕ+}bźf6zfc^;Ů"VlŠ <+6.B6Ŋ, + {!pYjXxV$I,yQl+QԮ=:ljǢŒXa)\1S8( ”G -vlwV$6E+aE+Nf>ĊS3uaE{ ۘWتm`EU^+j`E'pBaZ'%֢kSPXQ\Z$VT/l}iocŮ|FW+nXJ5(2o[;Z^%V0K +X- +bVfŊx:Š$Fc6΂ǸVTf X>Xa!c+Nj`bɬ4f+ÊX Vş8Ƃuc/Vz*ς1I!Vۊ) )˰bʊW#+fExgEXXj#XyEXlgE{ <Ži1:hz&1,b;yVCYV&*v˘W۞716ߜbpv -./6l};j =fѝ;fvXYA:ydaŹgs՛b i`ũI8XQg5hUXQ- 5YOcA%K HVdf͇յf3gE6VvVcoٟrf=2 {^*!}.> :!2Ͻ*9|^"vBq~:!)? IuPHUB! $K5(@db!ջX>}a K0o !1%Mˆ7"iCna/3t ѷ! !ޭ~}I6tl7j<}Mu68?aZY5hOVՂf}Dk`9{&EZSۂ&(Mgirus樵s; 'IJ/{6r?z;ȋ.Tܩ=CM9ԞPD9p4{j]l0wr^*{L9V߅Nm+yjK VO;59Zi y9}e Vy]4ؓߤcɽc5s7gk~:y=}b\ȫYz~9h }ùБ7ߡ,#o}Eiki}'>Q1׭Нe9-}g5x9e]7g)䔽:[fCGꓻɻZ}Pَ;>[9=VwbMh} E=5$Gf9|&ڛt<{cդʇ(J[rΎsJ_KnqutioqL:.ͶJ<֒x׏53W¶`e˭\bݪ!'Oەsz=s8'v0|tkmts΍̱/K_Vn$f$y_n$6h%Hld2J=Jd*$G=HcId߶-$Hl2Jd߅'$HlNq eIبb (A]rMQ$&AA?J(A A$M$&A[%Hlh ٗt } 1{ 1{ m=H#G %H ɾ7 c%HֿF };n${Zn$QQh3JWH$Ht&AA U ZXD2$AѫPAre" h˅ ^u CH AI $I&ID[AJ^AmA @I $` <홂 & H$W͂ & H$"a I  LA& @I $a0 A LA& @6D @I )"a ć zm LA& @I $a0 A LA& @I BI $a0 AA LA& @I $a0 u0 A LA& @I .CI $a0 A DA.{ @.7ar ALAiADNAPD$A @ H@4J ) h dJ ڤ)< R* H$" 9іAɕ@J + H$c h HrQ WA+ ȕ@J r% 8 hS J s\IDr%Aɕ@J r%\ A%A WA+ ȕ@J ʙ + ȕ@J r%A+ ȕ@ ȕ@J r%\ A WAt WAp WA+ ȕ@J r%\ A WA+ ȕ@J r%\ A WA+ ȕ !W"\r%"Hȕ !W"\r%" W^ID%A0Dc 0hHrbɖAEfDY~D%A |/ H$ ;_ID{C$L & 6Ihk H$˜h{ID[mA$bўAA]F1;9QM$" DL "& A$" DL ڃ r 9JA 1 @DL HDp =A$bID"& A bA1 @DL "& A bA1 hB$DLD1ABD $DLD1ABD $DLD1ABD $DLD1ABD $DL "& A bA1 @oDL+R1 cXI`E; L+2 hRR+4 H$IdI`ETM &`])V$EXI`夔Un&`ɏ&mV6 PL+6 H$"iIV$X! +HM &M$BVR`E@V4XQh0 XA mV6+HVx`E&IM &`iŽ`iRߤM+6 o'AD"Sn'AU^}ID3AɟA n(A)AAVAAH| [K`H%" "`DۗA$AA Ƞ@dP A dfP JD2(AɠA]rܑA Ƞ@dP }2(AEWm!vA"2( JDBAɠ !" 2("HȠA  %A AA Ƞ@dP 2(AV  A A@dP 2( A AA Ƞ@dP 2( A챊+dP 2(Y A AA Ƞ@dP 2(RdP A @P R(AiA2vJDr(AA _o(AIA*zכ(JD(Y.Jd A1 F JcM%+G 1Ro(AJ)k@Q G  Q '8J@&AG A2M%"q8 5>@Q H%Q (AA*8("HA"(q8 A AG @Q (q8 A AG @Q (q8 A Aa @Q (d9rG @Q (q8 A AG @Xe& AG @Q (qr@Q ZB7 0 H H$%" dR :)R A*XR cA$7ɔ 9 a]d A2 AL H2%R/)AzºCd A2 ACI@$S )ɔ HB2%M2E $$SDLAB2E ɔ 1")d A2 AL H@$S )d A2 AL H@$S )d A2 AL H@X. AL 7d a]3A2 AL H@$S )d A2 "d)"HH !"d)"HH !")/TZendstream endobj 467 0 obj << /Filter /FlateDecode /Length 911 >> stream x}VKo@Wp)eyDꥏTUTmǪ&:q* ofboju~⨌KU^QWO_eV*Q3BFց=. Z`y$'Xmfh٣`E=E'D[OJ`z*1Y%nEY2qנ~:ʴfgG%ί:}VgUˑZdtp9셼2ETw,8RkT011L@,=[i+VNAMw4H:g$vHٝ};ˍInRc$6 f#`(jy"f+a9;ն8Ǐ Kg[PU]楝n7@IE3_Lޖb5L=vla9f*ey# {}c PH#  Hs2pnj,EEAkߩA¼7 |;;endstream endobj 468 0 obj << /Filter /FlateDecode /Length 4393 >> stream xڵ][s㸱~_ԑ++WL*Jf/yl'5קHX"NMy _ubqo_|B\YHmYt.^/~^w+/rX)`_/Z}r?w9\ 38lh,c^=co.~y|#PuƻfFJq1r #,% u|{ry(><f8xsF5\ɦ.y=H> zGsǟ64ƷO9G,rR<d0m9nCXN״{u$ o. fIf1EmoqcD<<;!ah1X@#="E pû{`vE=]GeOcxrZ-`o,4˸Op-~N5d6^=J8̎|ڙܧq}5lѰqG-ͺj_?rVFy9?F‘|20o+^'<- ~`yˣ*m5_T$MHQ%9mU (5`caq'X~ʀC>/Bf]VIrYs~wKrÚDJF aXZmˆj)dmv}XXǘ6kuWjAzGF%Wې pt8oxxmTO RP̭Ԭ_${{ #cO s0\Q0rf| S^_.)7iҒ(bD"ҺaM/sKem~%idۍ&86]̞ޡraJ8%ޅ+ry&oyF7@oPh*k(sLFi 7o#AH1$.|C M")CS=IZ0#/݀n .pɷpbݰ]?dﶏl#ƺ ϕ ~FZE2_ d! A@pefp>]Ќ~տ_aM%@J4*, ͫk864rplŏъƵ$Odt]^n %$8Gzӎuc^@^S5UzZCynT{LtgO$Qɪdg 92 fHa=GF 9"8>gH6G %lOgT 4o?IJ?{%Ý8YL7gP@T~4ŕh Ъ~CUվk`kl󾐁gCՅ[OT UH5QP~gL&_ xD'pLd2|rpL(m[ *L(CnD[`Q`̰SJ)Lt*pJ`)dTj'RX-̰TJb`[XœVΜdVFdZQ:zzW-,TgZɀk%EZ?Dw! R8Jj*L+9sVXmH+Fy ܚZ`<,L W.~VGSѩdh"B{3$p/"E /Hp5ۚ NV/gSzpVgTn 6)ve!VNw~7h mb*${NBR[ WxN0bJ𖕸+u_LΛz~8G+It!:pO2eQO>0]8S*))5ḏZbe*0]'+&yHN24Vά2WXxb)V*3LǬRE{j]U3dOqVaƫ/e`J oFoh9Y ̑42G )ȈA=G )h!#9:~NJ9X+R!e"))S\$W < :SH5S~- w8TO|D . />'dʪBa2v*d >M9_>At&!z|@>e >dJcH)uGJ.fNX-I x")ӅX-׍Q'@+&$G_*VF|Y(T3duRc;*[]H]*VrVkMVj3ֵZa!(5}bΓp`|[ _uxNFLsd0 ̐ysDp\ΐk 2[tR]uU_#8YL5 6)UNYw| q[7>Kxks͘MNi7g6QH- @c:bƘ_QΛZ~8)UЙT0˾R<<*3lǴREB( 0s\O,|7jUo.֪][ fhITWT3LSVXe LLsLǬREVZԒ1][zX m`&lI=Joֆupz 膍`ulu#סc& ]Hm5)H]iEE%Yed]n\JYTxt-_sSU ƁIzw؈L9ܾ mǰ*v#b,{}.6ʡ_-x4eS\=25kЃ:s^0:4w#Cr܍VJ؈ .GR[nכKgjujx6`iZ|'8$p~pep|p5k6kܠ[&c6oC_B2vh2S-|L˽dK>[и&uǰ@> yxvYhwGa|@q;Q1EPaGMj\S&z,"<\o 2և=ލeڞxJǀY )bPD"cYX4TY2 w)Q"9\S +.^\dž^C LfL&{]iܫz) 2|E, a )Hq SMhXuҧp+en07/luv &0Leendstream endobj 469 0 obj << /Filter /FlateDecode /Length 4138 >> stream xڭ\K6=& 4cۓV;3﷪Ȣ$Mb"X%f31{wwoK3+EъϚrVhݭgϥXqwok1UjUUfQΟ:x9-d=-oc'qA non)RJ*Jlgn8[m3LS3en-DUat;%ѶEmR@ )ȸlRBrVKUY_O %/4j ^_hGT E.ab=Tk2X[x$&J%bh V"4d]:0Qeg%\L#ԅ i+k1RET&Xu݌Y&j> g%G;&D 6("&S s-3nk@u& <yga,*h3qAUunJ*SI=Lx뺌`J<hc !+\,`US |dΰ2nKDp%s+S,#`;,LdJ *Se[FP%s*iTV6ZՉMUmdj? M 6 }ǑXt@,JB!.SHp&B'y LXօ:kb!p{ٸd,9OWd}62odqf߄M$ga8`5QGq>O7M V"ڢɅ)08T\Dj|%o)o%o'SF8V0JݢQӁZ=>fGNe!9={tOO&u,zLf#2p?h:RO#x{?(LmK{skdQiW0sBM_p[Z^1T-<ennkzy@Wkz̓}eqc<.Z*Z0=yCIl0lE:cp[MpMu[#uf.$,/u;R()O*ڢ瑗PhT{4ܻ4W;4@A>7-/;=yo^v/!I{hmY[{;n->w炍G;D>Y'zc^Q(tQ,8rp㬁=di}(;hE m'K7B^Tƙ x*ijcf0 l'z( Aۋb[ 0&ej]5=x7LSAp5ZhMh1y7H/ͯ[˧'q:v'l=ڕۍ=~Y7h [\qQD~ƗC> +q>{K Ôf@ڙ8[ˋO;<=vfȾns\Ocsw[`ol裻nldJv'޽wwP1`*>YqrtHVvI;Q7p"H6bA7Eխ.H#[,8+/Wi)+LPO߄@bmZ=v}3 / 51,`m]ȪWrz*F;Tr$\S<.:v=<\[h@HNlS["V; rxI8 ed]•|ggf~trF <.]WvE4=_ؐOUJ* JJfa;m _| JLqؽlGƻNʡڡcks

R|@A 2rfv/>zGe݊SLc,pW.Ju z1wfYܦG>t+t #-pa.YzF=y-Y!Ǭݭjߩhg6q.ͅȟ-x.IgK;%M \uȥR(Knk+lܤ[|ؤ`Nۖc(ÄU=ڹ9(߸ 0}g؏GOh&ضᖂ$hܼzS> stream xڭKs6sTe< `q9MX9esPlYqEdM>a hiNᄌϣfwvg\Pƚ] Qevov?u?n?{ۇo{5{LXޝy~Wxlyu7?fx߇ñws殻ԫsltښ+=źL B7YE{꧟MyV.w.Ze˿~ T˱>W6Ui# 6i_L J:Jx%S1կo!R{e2/2 k̘Y(x,~/Owu>KIm-!/ϯֱ96Ƥ\֮FY^4%峡o\d _J[1u1oQ._\.$NΠdumzf\JIFkq˙wY 329hpr6wKbR>AM]Hxn810 NcWi0 hG qlK6 P,Sysl@2l`ql@0l/϶_;i|۾42r>yh)gΕSg&J`{Vh !jUjY6,] v'eZ=щyR$9 ы%ĽvXDۗbMC;hnj!SQ.J1%Y OBe lq*'Ğ8P/L`EBR[0R\ 2# uK=|e~d9-!Z\TF!xRW(vmA.e$-"ZXCEB` #u--I:2[Dā- VGD0r7gKos:"*g"|OiG 1LV@80L@sLL0ev8ˤuN_Dֺט"\Nlщ%ھ&}.d#aJoo'6JLЂ+m3uz=m J 1ƧH*X"PO8R!2U8\8:-EFR,&pRhINYgeS, le[m\ lĪĖ uX9[$ā-- 0rl `Z9hRpP4S;d'4C\E;geY:)l`ܓxW_owa)β1;,VTtA;:z-J,BZ," }3ؕ+lHГ?e@td mO.zb%_FSS}F&ގٓIN6n?X_'b\< (=IFRL!EBR[O-"0RP 2b)H#Vk2""`=>&;Y6ز-̃|Ɋ87VlG4=qك:dHyDl?QGg#u""lŝ[;oSZD(5/bMjpc°؀bg٘cJa+c a6xެZt7j)…<3ADr'Pqؖkі Uak#z6JD, Ҷu=m Yh7FAt7zjl') qr38@%2T80av+"xa+2Xj pRdef|н2zhZA>' -"‖ZXbRD@ #u-4 "hśKq@K-Chq*yyW,*2!_lj/0l 86Y6؀e:؀ra^6x.h55J`[ }x"l+#n&ц6\i;Mܧ,]NTf KUi-?tM "؄mv.rLqV,jLb{LpEBRXC`i&.r#Yjq2‖Z/d #usXK:(6 9ƃ/'H~S^Yޠ0aQͲ1U4& pMG+mRj a{"J"nLўoSwPBzoCjJ #mP"O; []&hOm[7QyC oIAr`w lo&2Ai3&|idICS,ٜ2D@I ( - 4#=g2QSڦdld[ 4y+C=IFxLq䉄8!8CT'IDR _[""digb7'wsanF8fpOe\u;|L?tx0OI:>? Iw!^~ diGƆKw龼=.jdz<S}=r8 10䥌a1d@~R_endstream endobj 471 0 obj << /Filter /FlateDecode /Length 2737 >> stream xڭMoGsQ?Cb8Y dsP,ٻ-e-[=ӤzTADKKi{o/vΚf]U+v_bW 9\˫U{ewz߿4]{?}>ߗpewt\0]3|}&p](v~e&x#~ml oI) m!$q>pmc{1} ~nJěO!?qMJոuBw"{~y6k25ކ/78uc:'멮o\dSѤOޕzIf;l1ɦS&/$gPH:gkjТHGwrC3-),b\ܜ4$9[ֻmySJXw.U/<> S3t?59D V{D HbX"T؀٘[bT`+NbJG`g}G|ydܛvl֎=ED/`+_Y˔jVI!ZkZ6ݍi0hcv}zOhGWN,=.b hɅJ\n*ڱ[vv´cA)əPѭJd?*b<et8Pe8+∕Q/^R\Q R- u8|!,*@Q &.*3\NgP q %I.*p!sG5.bB( \Tg≊".6܌Qg `Bli] ?;/L \PXyP@8S2%$#*`[!2}YEsi_ӕ5+?fO He0&-r YCsLm` T?v1$ICDHKlIzl M1Oq("1"D=+80E:dJ"u!1TGq(3U@A,M;He[gв BZm!h#ZFq$u-Yn{RC2ɠEE2ǡE%Zb=.\B/rr @X% BBbj]dcu (Y < ( ZM[գ#*`Sg2BmAErdڲ6vQ;%ӆ>db<ד%Un yKe{ڀ'QМI(zFlFIpgsXG|f !*sk8@%$u@fPN*B  i !݄ ,!seX9e$K$PF stXC82J=g>QkR:Oug ;Hd[gh rDExB q$ !N}E:dJ@e3Um U4ԑ+e|8&ArdKN?3ח5o~]<(}UÇQ97=\/}d> stream xڭMs {\VHUJvU% ˔D:}zf5@J"xA҇}W}hUt1e9Tq_߾q~m76o_smq/Q{S5sP?>oϮQY)#N_F2ˆզǼ.j]X7^lrKuMÜ뗷SzkΕX8o e"q%u$Ϧx_?Z>ގaTvQ,#ZʆMIL-XƜuZ*YJS0sBҕt)7UOR՟QvZWw눓VG2t庞.(]22({_ S`}u+ب\`̶M<]ot_`S+xIGf_plC86 96ZYsL@}2lJ؀a={h.z!/H5XR_/=r>Rbm^xU-c&zmvKxN5k"nDfU :mF,^`eKb qkxb"1#u-hZBPwIlA˾ϠecGK$"hY]2Z$;ZFF-"ZiGEDЂ.hhAR"F:Z\V:z!@Z(lva˾ ϰedg!"lY- 6`xg(|$Ei k VacEBcZG$il X͕d@Rx]?nV?6m%rEBXıD00lh1ʰ+c atCLB^.f{uDqQ"ЍG4э%{7D`Ug-yC7ųxH֊#1#kP& AVNvF T1yȈTFqyw!P᤮AEg;2,k΁x bC씏BP 5%9ѝ"T$NUm}@PEDQT UDxl"""ܨe {SEBe-j*-bcmXiaNT_'=>}}f/plF86 96ZQsL@}2l2؀ja =UЙnv#y6#z::g: ރg&z0#wP".ԝ0QK‡e1ec*eT,.96X6ZplBL Q=vE[En+"ޚJ6 {GcAJx?j&dznX,q@BZ.1-F:KbT S2ITDOlɾd#L'"z;T(Hw1s9?wkl2$kvPAxN:UB $ )0ڗ=RA+6H4ETW> stream xڝZY~`$y!Ob=cc yPFIس>u625!u|UdY$zͻ4_I\'u]/tQe\|qZe??yW&!UjMwMqu4D3k7Yi vcHs2NJDK*qU,xE56(ޗYbi87Z#I}G!E?;2V+,Ӭ=liHe b!I#[2:TD { ҵHr4t诬j Ĺis`BќǏ_-~%M,%y,4J^L^,L+.j)bg*>nߒԐ;@ k+ҩ-^L8v] 19Pa$v7 tA i: o#l .ql4֞E[v=Nf{+AJm{KGÇ҉_HG!oNZKBj*0ycx^*œT,>xDc;ˍ&Zf9g5^թft+~Uq$j4H T͋pVGFb8+PSʐd1'2\QxEழ`Ym=hG%xdNvAq'MY7yu-#a -5݇fVuz•f'i@sm2Bnџ<b{UEĖ*+6/~<M?J k} {FmO׸gyٌ#XXц}1q00c0٬!eƐqGcsGDY`J>Sjwb\ ]}U~Tclȹp0?j#4!ׄЉlMؖyh~YCE\x/;$^Iڝk'5\ }>iA`Kχfb@NFx9\ @ܪ PP&X 7iG phVE vl_$f!%lX;&-au]ogj2~$bA ~YN/Q!ACUNsߔ0uZAimURPpYeYMSqjX| @ꨉ$b["ÿõ!mh{Oї]֒Ô_G?iL]iM>E4Jc%m,g8BQ(۠߅>@NG11+PRx>Ҧїu.%D}% 6A^F;'3;]y'$?Ĵ& LJKu+դy[78W"uL]?|ҬBj*ux6NBP)4:7 l]3VB?'L:凇ϓ6V SaJ]1=! NG|$΃‡ ܨ;v׾t{> pMb"e1DB!"pӊ6O@Ŀs۵0N9N-yPN S쟨=g!lCS "C]CloX tu"S,$ϿY6hA4XaN+7a)x^3_=gV D2$w 8OwFsP>'6w[Q5>q5wB'1.;9_VM`3 Rfvl5uvџ݋Z=|~ 澜iQ0 ?!5ܶF7HmOjt"e4$(ֆL/0o6\ MzĔa|(v=ď~kIZ%aĘ nW:欑֣N_ٺ}]L&Lea!w]va˸I~?8*K tgTH |YP(ᬸD룺h03H]5}f,Z1ϳ])rҦ벚ԌupCz}ôĉ*3"7 9']dl ^e~2_j ;@\;L^ƨF/lm ߅zԳhq =z vhwH$}G acȵMw0/㬔BIoi n<{i4m C4x?RZiT'(0N&- 9uSKۿp}h~P(!o>Os84ֺkjaRrgfXh}V}5\L5aw}wIrSm*˓׾蘜{p΋>%|?9d cLC!{!ΟIF_KO'mwc1I+~G MS|2ۓ>Ih[((0àL((@?5'r%^ЍԲ\Qq+]2@xB |<$&ei}M*> stream xڭeXڶ8i)E ]K8ݭSܵP@q/Rng﮳$?Ƙs\UY dg 2Y %q &NM-6Bl%M`~ 6}8ٸѩv K(N  bfb P2Zm`5Lvf0ԝ fm P+ v;A,@ 1L[tֿ4ٚxe9vt- vvn`_@' v(ف 8q;Fjb 1e8IC U`nb "?gSb }nE? ێ# [/55Al-\GGwt؂nL1+`nׁrsX2R! UXeUqXU?`UCjVSjj!N!^6q|fvְo 9V?0dsvG,jO 0?®R\T[-~xvÒ6=ځ0NE`  w]? tcvHIvvvW}hvn#ffiqr{H3gGG-1{7C` v/~3Jm )*.CbhSցo]9qpIJ@1c¸|f57 92҉(ltL,ݺ8ZEܽaAZ͵JrKݦ䏑rbn!۹Χ1ʹs,j'id8:(n4Ub"Y]ѴAmtlÄM0[C""_$Z,OģQjYzT,o;(g-]D!Q(OjAҝ[hXrl$8b^pDR]̋Y!G4ac@],] 戄XBȼze/{$WXE Ӭ}W6*pV O(>ʺU M9% |b;D51|N03Ň%v#4*RrW:s4QmQqB?c5"+v msZ;gÇ>nQ A+-Ze%ۺ~;S4ngQWgCngL4%'8.)}g@Ʌ-9JRϔiH\}s+&Lqj9CX6(Q8e w T4s]1đnɐ9 SwW/x;ܶ/:k ^5X}vN7bb["VY޶"s~>C"ԑ^` 1{hz s!-t`ί!@R^\{bdD ɛ#amn{-)L/ǃΥ4Vulst.nG@Qc$ЮVVrWYf; )F0?+ݣÈ[K”kAʌ֟q? )ǔFj Q< srLr ]C<Bbּr_^eNc1ǮtWA"8 /Wh69"p ^%qKl2{̅OCGhGZʭ;.4qq^*5\qVZ0Ţl5xZ͒OSsGДe6iĻg6ٹnAjOFTUL"|_ HEIJG -7:soʹ$ q9;O Z9-n#G9"?K SYϯ"\%Q4ѯE xŠi\v 6dR4.oN؈c>;/gө)VO@ބ xa^xBQSlhg_!LuAX߹6r.`2KX]E&G}9ʶ$aJyҶpa: 6fEGG%3*9w9•I0K("jg.R qY﹩@[=dӣXgx^CKAXMb4er?@}c{]s?% ~'c;]tE Qށ~[עV˒x;H/ /<=IGL(0 }ފk7w+ sHt6pxB"ؒ Os +Ƕ=K|SK¯mʣ9N7K(vX|E 8ٔO|UzևH|P`l} 7Vwf, 攣$V[ğdfv 3o dW)V&AȦ)|SJ />1[༊zA\M}UE|OݚVrv5Bf(]ziUQ܈"pnG|j%ENTMd!JPmv 7۸_VD̷%]CKѹykgKy+.}Mٗo{T} inql\>[U3^Yt2~Z’U5J몡b8R5Q/R Q#qj;GTMw|ճ9#5';%xys6 肴BQ{YKA:ÈM}sh\yr}#T,wwDRKFlR6S˟&dks>CL^E16Dn4Ok\ ^~>YTP)d 1V#*I*#K%Wr>#t˶+2s Q~q随`L%9%޴&,xe5/e1~G92xA,49:FxtR/O*z^hys,K.s}Oosdu+eOh6YS-{a]x-kLO B y}'>f\Wj pZ{?Hi y ~_NN(ga=&o&S^6U6^sdzveY/#ow\һU3F]D|=KƋLU M4$(X~u>v@ow_*&݋ōS%F(! 9qCcmP\z=Hcoo*~g 0 pIF>:gjbL_QDUs/`E]y _xmTJ oI,UfS~ow$ˠ%qcϒ;9ATp?nHXƷUu7n9ǑЫz3EOSa%3x <}5?o1nV{?1ɬDD"b gR2a|#>ghŀUKs6z8Z2E:q9W%MA:T-D=E7K]{Mv>4 [a}XiƑhG imBh;: "YW>͎ܼ}굮Z.qQ.i7^0 ~<5 M 0VQP 2y@;CgT[J_A"L ՐV158zp/q; ~ޫ+Bwŭbz$f.R3!&7Y{+K#7 Լۊ.f˕~loT#:@iNu*|Fp1I;zÁxRC1fCn:]e=ZK87x12S#-0,Ψ ]^);jͬ#E2ї

G!-Kk#0Jׁ+*DjŷR'%9. f89o u~ RA3؉n$'_v{6\)O^Xƛ&L(DQ052li:M~nunӈk]*z(wWK 5ʳАD0)l*5Kc[%qk;9N~&D*F4C۸]ﮯ }K.]%oS>ҕ')z'c -X'Y`/H3͛+kre =zΝ^Q3SHK] vlgx> )aa jLl X'<볜Ot>JJOwKMW}^H@ EƗQ> &֐TkPH5cS-$Qh`>~rN閱Á 2-m ,qUа\AqCK3JPfV8붻hb*I_6%}m3~+CsD6$q vBF\}2lg&XG$w!s"2};$<-!j'%iDm `P/ y1'm!/% )ރzsHn7/PhhRU%+}~YAfvyz`Dx!W!/o/Č!Bd;&:WKXWXT7]hiŽ$өfR&5׍}ںЦ %fnV5^91F&2XxJd(s9&#l}LT`$&=7*ʣmBUNq 8j^,Gd~].ƗyčbY*8v;]5x9ã$!AR'WʇqzT5ÎFfz^JD8sT) :|5` h<IVS6orSOP+X>FjMb/-[0y`?ma9#%0ezvcC*`.~ܶMrM@ᓏ0 *yM[W`~OwΝE9ieMTXȫq›fQĚ W>%~f+?>,ۮ:5ex {lS9=}3#) wZ 'pQ=FN*ʯ}uvK.o&~p`|Q5?2`UޥAB-΋8[%6hƛtކ w%TЖ3fsFxÿ6LN&,Q|ĬdEw(˸t ~8KM2/R9.ݝfJ`]p Cv@;OWZ&"}9W(ҟc/X <9q:|BLZK.dTZe&R*kķ_P ۗRgrѕ><+!I z}X+a),*ypIV~yncIǽ_ϓ/F˪\Qm֎9#$[ grvǶbElPf 2m j1|DW]S:JS&x8WNBsr;Ě tAՊx}WYJ+E}U_D]Ne q7VͬI|Yt׳DP01`\dxM}}kJJ:I*U lr^bhU Ș(DM֏(Yoj\؊3q+evH~ fVvJ<]׬+{ݎ35gٚ*ũݞ1asC[?"eb5U`˨/xG4m$v ³PMmPa3{wK&˶n#X漏3&z[vg׃?[@xh- 5ekwyyqaKxEȵopx4:Tf@̆:tT'}hǙ+Bʤa@=/k)uEGX'HI^ ?qAk:J1$:YAǟ_8zr$hqbaMnlBL znX"~ 8a֯Pi 9:w}hl[ ҆´8ݯJ96*"䇦+6JUIØɱ// X C5)ϰc35; cfh1ikx1L:dO.8eiAW"ć *zB*TxCcw4餫ۛ_` c9{ae`^"ӝnOh?`&~9yt;=qf&9Z,7 3(J=C9kϸBAOPm?1Wc>}"q%tf6P?GYc37Y\{u}Ԩ{kyf$aJ1rZIiN | } > i!O͍Jުdm@P´93"#MggNeogJ$E=0}:+YF,XccD*(ܰUK<UX>oN)YPq7rSqnR&Tdm*E,=fRa^0usW$I/µznц9& P-tTt#Z( gkGkSx|)!K ~kmڎ#mI^Ñ@=F^#~NM(;#| CjV?bV:ʬD].{."#87B8k)U d?|SקYLMYhG%1.eHw4[F̏>U.I3̧xF}BPr!#1Yp56rjM^vO]j{FcoO\ԠJDNKN,^^W|qF%㫊VCq;f(7AԲOv52W > uרD5'!߳ }%k^C KMzպ k/r_? kpendstream endobj 475 0 obj << /Filter /FlateDecode /Length1 789 /Length2 1194 /Length3 0 /Length 1739 >> stream xڭRkXSWN Uhc Z"$&*O@y V$c` L ;*  **"b%j "t~{^go C`'!*ijOJE0$FH sͦOyb@t*X Ac`TGaLb&'PX Ap8A-!XFZ^p4,d#CPeQ> r/|_Eii" á8c1E?q+)$;,[:d# J, #U <{4LKL^. N{ b^8RF+`-Sp}KEA>HP@/Ŵ?b"E1 l^'#h[3$A2lXd hARL1 X T(->5P ?O Yؘ؞ a%O"xiK0+ǡf KanOȋ.<44kB7]ڪJRώP$Lߺ$]ݳ ^ 濣:@+wkL|w̤~ëݼW ;oIrsqaCJ5o Y]A'ﵚ n$8T++Mr: VÕYp}ѩҹ?Y9|l4'dDi7 eEL@.ENi )^7>e*1nKlcJF*FYWtcjKAV@msօ];@w,霧yV0zZؘN0c.75}vhʤrֹ9[Ӽi`bb"48ÏR8q%Sڣ:3_]ɻ36eo/dyÈD~HߥAswfItgЪ c/>~x;dUXng_LrGb3~|j29?cjk 7$zzƝMMZh֬gVBgÃgu5/uV۬AKbcBeDwY"ϼtwIsO3usK cin!?grbxb!\!yW#9sn$*km3W$vk~ڮh|8֫7,7VSΔ?"Cjy7#F|*mMIHU&-y7~ :DUtԳ^,ܝO%P *+€ήI}(ߨW.CH,r6Ŷ[%pITJ5diBNOx{F 9y#ic25cg|Zym[[ `u}γea٬s&fJֶ>EOÇ8N`⯒C&.fwR:e;̔~UEAendstream endobj 476 0 obj << /Filter /FlateDecode /Length1 797 /Length2 1236 /Length3 0 /Length 1791 >> stream xڭR{ĂA&@?X|Vh Y1 x41R@(`&(@j h  a0?0rYLa<b<06k8ad&=| tk (] 3v9m"cn< yt$LAA͐9uNk&&w. }S!"~;-\Y&ů:!,M̭8rY/(z Kj"T[[L$KL#{CTJD*lQNX8۝ʬ\jߍ4l7)9^/+oYMkhyY9q*g7$?"mkݸC~}?TG&OrԾdBs4׉{) e%M[U"Q5:\^CXan&.D R"{;~qwbخ²Dk ̬;5o{[CUH-vF.o![X~Q|bcI-w `eN),κ;-~1i)A~޼M֯z^muW%钰gGTeuw'tn/?]˰&ƫ |_}79%QQ\6oDn*(.z*&DV%ZKN4V3\U& j0>FPvDW\H/y>]!\77dk;;ӏ_vu5nv~УfAŽTFRL=Hϖ\Cpt*jf[?6Wstuijj>ԭ*$Z\RD!j;>to@$Ofl/}+U@No1;X8};[c9;V{xJAUn~[Y4s. ˰3?T B3"k+4ƔMA$5^׉_=F{" uHO> /W [ 1 3 1 ] /Info 84 0 R /Root 83 0 R /Size 478 /ID [<1d0f4c8335a1c8f8bf96d00556d49e7d><4006a493eed14e6a311378aeb9eca9b2>] >> stream xcb&F~0 $8J ?Z OGgйWjGc,A%&PH>[iD$[Xv"i`]`qvi,IꍦNgܤk&>Px#3^*CxRAϡ.H P!.1@P< "A$V)`5@J6 ӸLe`3/I&`/etMz Xlo X5 2o3 ` ː3 endstream endobj startxref 410849 %%EOF quantreg/inst/TODO0000644000176200001440000000010513742070343013544 0ustar liggesusers# To Do List 1. Continue forensic investigation of KhmaladzeTest.