# Re: [R] Smoothing z-values according to their x, y positions

From: Emmanuel Levy <emmanuel.levy_at_gmail.com>
Date: Wed, 19 Mar 2008 22:54:01 +0000

Thanks for your reply - I indeed saw a lot of functions using: help.search("smooth")

The problem is that most seem to not be very appropriate to what I'd like, or they seem extremely complicated (e.g. gma). I am probably missing something as I don't
see how to use Loess. From my poor understanding, it seems to be for 2D data. Here I want to smooth the third "z" component.

In the meantime I adapted a function from Greg Warnes, which sort of does the job (although the smoothing is not very nice). So I'd be very happy to learn how do do something similar with loess!

```x = runif(1000)
y = runif(1000)
z = x+y
```

hist2d.el(x,y,z, nbins=10)

## -- This function was adapted from Greg Warnes hist2d.el <- function( x,y=NULL, z=NULL, nbins=200, my.cuts = NULL, same.scale=FALSE, na.rm=TRUE, show=TRUE, col=c("black", heat.colors(12)), ... )
{
if(is.null(y))
{

```        if(ncol(x) != 2) stop("If y is ommitted, x must be a 2 column matirx")
y <- x[,2]
x <- x[,1]
}

if(length(nbins)==1)
nbins <- rep(nbins,2)

```

nas <- is.na(x) | is.na(y)

if(na.rm)
{

```        x <- x[!nas]
y <- y[!nas]
}
else
stop("missinig values not permitted if na.rm=FALSE")

```

if(!is.null(my.cuts)){

```      nbins = rep(length(my.cuts)-1,2)
x.cuts=my.cuts
y.cuts=my.cuts

```

} else {

```      if(same.scale)
{
x.cuts <- seq( from=min(x,y), to=max(x,y), length=nbins+1)
y.cuts <- seq( from=min(x,y), to=max(x,y), length=nbins+1)
}
else
{
x.cuts <- seq( from=min(x), to=max(x), length=nbins+1)
y.cuts <- seq( from=min(y), to=max(y), length=nbins+1)
}
```

}

print(nbins)

index.x <- cut( x, x.cuts, include.lowest=TRUE)     index.y <- cut( y, y.cuts, include.lowest=TRUE)

m <- matrix( 0, nrow=nbins, ncol=nbins,

```                dimnames=list( levels(index.x),
levels(index.y) ) )

m.sum <- matrix( 0, nrow=nbins, ncol=nbins,
dimnames=list( levels(index.x),
levels(index.y) ) )

for( i in 1:length(index.x) )
m[ index.x[i], index.y[i] ] <-  m[ index.x[i], index.y[i] ] + 1

for( i in 1:length(index.x) )
m.sum[ index.x[i], index.y[i] ] <-  m.sum[ index.x[i], index.y[i] ] + z[i]

```

m[which(m==0)]=1
m = m.sum/(m)

xvals <- x.cuts[1:nbins]
yvals <- y.cuts[1:nbins]

if(show)
image( xvals,yvals, m, col=col,...)

```                                        #
```
invisible(list(counts=m,x=xvals,y=yvals))

invisible(m)
}

On 19/03/2008, Bert Gunter <gunter.berton_at_gene.com> wrote:

```> There are dozens of functions within R and contributed packages that do
>  this. The spatial statistics packages (see the "spatial" task view on CRAN)
>  is certainly where most are concentrated, but thin plate splines (in splines
>  packages, I believe), tensor product splines (in mgcv package), local
>  likelihood (in locfit package) etc. are also available for spatial
>  smoothing.  Perhaps the most basic place to look is the ?loess function in
>  the base distribution, which will do exactly what you requested.
>
>
>  Bert Gunter
>  Genentech Nonclinical Statistics
>
>
>
>  -----Original Message-----
>  From: r-help-bounces_at_r-project.org [mailto:r-help-bounces_at_r-project.org] On
>  Behalf Of Emmanuel Levy
>  Sent: Wednesday, March 19, 2008 12:42 PM
>  To: r-help_at_r-project.org
>  Subject: [R] Smoothing z-values according to their x, y positions
>
>  Dear All,
>
>  I'm sure this is not the first time this question comes up but I
>  couldn't find the keywords that would point me out to it - so
>  apologies if this is a re-post.
>
>  Basically I've got thousands of points, each depending on three variables:
>  x, y, and z.
>
>  if I do a plot(x,y, col=z), I get something very messy.
>
>  So I would like to smooth the values of z according to the values of
>  their neighbors (given by x and y).
>
>  Could you please point me out to the function(s) I should look into
>  for the smothing, and
>  possibly for the plotting?
>
>  Many thanks for your help,
>
>  Emmanuel
>
>
> ______________________________________________
>  R-help_at_r-project.org mailing list
>  https://stat.ethz.ch/mailman/listinfo/r-help