[R] A question about pairs()

Ian Sue Wing isw at bu.edu
Thu Oct 30 23:11:46 CET 2008


Greetings R users,

I am an R graphics newbie trying to produce a custom trellis plot using 
pairs() with R 2.7.2.

I have spatial data on which I run a geographically weighted regression 
(gwr, using the -spgwr- package). I want to check the gwr coefficients 
for multicollinearity and spatial association, following Wheeler and 
Tiefelsdorf (2005), and I would like to summarize the results of this 
exercise using -pairs-.

My problem is that I want to generate figures for two groups of 
variables and then assemble them into a panel display. The first set of 
variables is the gwr coefficients, for which I want to generate x-y 
scatterplots. This is straightforward, and works fine. The second set of 
variables is the local correlation between the gwr coefficient 
estimates, which I want to plot as kernel densities. Is there any way to 
do this? I can do one or the other, but not both together.

For example:

data(columbus)
# compute gwr bandwidth
col.bw <- gwr.sel(crime ~ income + housing, data=columbus, 
coords=cbind(columbus$x, columbus$y))
# estimate gwr
col.gauss <- gwr(crime ~ income + housing, data=columbus, 
coords=cbind(columbus$x, columbus$y), bandwidth=col.bw, hatmatrix=TRUE)
# summarize gwr results
col.gauss
# compute local correlation matrix among gwr coefs
col.cor <- gw.cov(col.gauss$SDF,vars=2:4,bw=col.bw,cor=T,longlat=F)
# extract gwr coefficients and local correlations
col.gauss.mat <- as(col.gauss$SDF, "data.frame")[,2:4]
col.cor.mat <- as(col.cor$SDF, "data.frame")[,16:18]
# define correlation function for use by -pairs-
panel.cor <- function(x,y,digits=4)
{
    r = (cor(x,y,use="pairwise"))
    txt <- format(c(r, 0.123456789), digits=digits)[1]
    text(0.5, 0.5, txt)
}
# show gwr results: works fine, except that text positioning is screwed up
pairs(col.gauss.mat,
    upper.panel=panel.smooth,
    lower.panel=panel.cor,
    labels=c("Intercept","Income","Housing"))
# show gwr local correlations: works fine, except that text positioning 
is screwed up
pairs(col.cor.mat,
    upper.panel=panel.smooth,
    lower.panel=panel.cor,
    labels=c("Intercept","Income","Housing"))

# My problem is with the following function...

panel.dis <- function(...)
{
    if(panel.number()==4) dist <- lines(density(col.cor.mat[,1]))
    if(panel.number()==7) dist <- lines(density(col.cor.mat[,2]))
    if(panel.number()==8) dist <- lines(density(col.cor.mat[,3]))
}

pairs(col.gauss.mat,
    upper.panel=panel.smooth,
    lower.panel=panel.dis,
    labels=c("Intercept","Income","Housing"))


The last -pairs- call terminates with the following error:

Error in if (panel.number() == 4) dist <- lines(density(col.cor.mat[,  :
  argument is of length zero

I thought I could address panels in this way using the panel.number() 
function. I would very much appreciate it if someone could let me know 
what I am doing wrong. Should I not use -pairs- at all? The problem is 
that I'd like the plots to line up nicely.

-i

-- 
Ian Sue Wing                      675 Commonwealth Ave., Boston MA 02215
Associate Professor               Tel: (617) 353-5741
Dept. of Geography & Environment  Fax: (617) 353-5986
Boston University                 Web: http://people.bu.edu/isw



More information about the R-help mailing list