leverage.plots <<- function(model=NULL, X=NULL, y=NULL, extra=.1, cex=.5, cex.ident=.7, cex.axis=.8, cex.lab=.8, win.ncol=5, frame.sz=3.0, ident=F, label.sel=NULL,...) { y.lab <- "Y" if(!is.null(model)) { X <- model.matrix(model)[,-1] # assume intercept y <- model.frame(model)[,1] y.lab <- colnames(model.frame(model))[[1]] } else { if(is.null(X) | is.null(y)) stop("function 'leverage.plots': if no model is given, give both X and y") } row.lab <- rownames(X) npred <- ncol(X) win.ncol <- min(npred, win.ncol) win.nrow <- ceiling(npred/win.ncol) windows(width=frame.sz*(win.ncol), height=frame.sz*(win.nrow)) par(mfrow=c(win.nrow,win.ncol), mgp=c(1.5,0.5,0), mar=c(3,3,1,1)) for(i in 1:npred) { xi.adj <- resid(lm(X[,i] ~ X[,-i])) y.adj <- resid(lm(y ~ X[,-i])) x.rg <- range(xi.adj); xlim <- x.rg + c(-1,1)*diff(x.rg)*extra y.rg <- range(y.adj); ylim <- y.rg + c(-1,1)*diff(y.rg)*extra plot(x=xi.adj, y=y.adj, pch=16, xlim=xlim, ylim=ylim, xlab=paste(colnames(X)[i],"(adj)"), ylab=y.lab, cex=cex, ...) abline(lm(y.adj ~ xi.adj), col="gray70") if(!is.null(label.sel)) text(x=xi.adj[label.sel], y=y.adj[label.sel], lab=row.lab[label.sel]) if(i %in% ident) { cat("Identify by clicking near points; stop with R-click.\n") identify(x=xi.adj, y=y.adj, lab=row.lab, cex=cex.ident) } } } # Examples: # leverage.plots(lm(MEDV ~ ., data=boston)) # leverage.plots(lm(MEDV ~ ., data=boston), ident=c(4,5)) # identify points for variables 4 and 5 # leverage.plots(lm(MEDV ~ ., data=boston), label.sel=369:372) # label these cases # Instead of a model one can also give X and y arguments with model matrix X and response y.