[R] Fwd: Finding local maxima on a loess surface

David Winsemius dwinsemius at comcast.net
Thu May 10 10:49:12 CEST 2012


On May 10, 2012, at 12:10 AM, Diego Rojas wrote:

> ---------- Forwarded message ----------
> From: Diego Rojas <dirojasb at gmail.com>
> Date: Wed, May 9, 2012 at 3:05 PM
> Subject: Re: [R] Finding local maxima on a loess surface
> To: David Winsemius <dwinsemius at comcast.net>
>
>
> Thanks again, would you please try to ilustrate further your point  
> with
> this example code. How would you find the coordinates for the maxima  
> on the
> surface. Consider that in the surface I'm dealing with there are at  
> least
> 35 maxima.
>
> require(MASS)
> topo.lo <- loess(z ~ x * y, topo, degree = 1, span = 0.25,
>                 normalize = FALSE)
> topo.mar <- list(x = seq(0, 6.5, 0.1), y = seq(0, 6.5, 0.1))
> new.dat <- expand.grid(topo.mar)
> topo.pred <- predict(topo.lo, new.dat)
> ## draw the contour map based on loess predictions
>
> library(rgl)
>
> persp3d(topo.mar$x, topo.mar$y, topo.pred, shade=0.5, col="blue")

hasmax <- function(mtx, x, y)  if(  (mtx[x,y] > mtx[x,y-1]) &
  (mtx[x,y] > mtx[x,y+1]) &
  (mtx[x,y] > mtx[x-1,y]) &
  (mtx[x,y] > mtx[x+1,y]) ) {return(TRUE ) } else {return(FALSE)}

for(x in 3:(dim(topo.pred)[1] -4)) {
  for(y in 3:(dim(topo.pred)[2]-4) )  {
  if( hasmax(topo.pred, x , y) ){print(c(x,y))}  }}
#
[1] 40  7

Note: that topo.pred has a border of two and three row/columns of NA's  
that made this very annoying to debug. A proper function would  
probably need to pre-qualify the index ranges.


I tried a sign change approach but generalizing to 2d created  
conceptual difficulties I could not resolve, so I just checked in both  
directions for the local point being greater than its neighbors.  You  
obviously could do something other than printing coordinates at a  
maximum

-- 
David.

>
> Thanks fot your help
>
> On Sat, May 5, 2012 at 9:34 AM, David Winsemius <dwinsemius at comcast.net 
> >wrote:
>
>>
>> On May 4, 2012, at 3:00 PM, Diego Rojas wrote:
>>
>> Thanks, I know about it but i wat to find several local maxima, so in
>>> other words I need a way to identify the places in the surface  
>>> where both
>>> slopes are equal to 0 and the second derivative is negative.
>>>
>>
>> There is no way that I know that will produce a mathematical  
>> function that
>> would support symbolic manipulations of that sort for the results
>> obtainable from a loess-object. I was expecting that you would be
>> approaching this numerically and doing evaluations on a grid.  
>> Testing for
>> equality to 0 is not a good practice if following that route. Sign  
>> reversal
>> would be a more sensible criterion. ( And you _would_ be using
>> predict.loess(). )
>>
>> Still no data example or code offered, so not pursuing further  
>> efforts at
>> illustration.
>>
>>
>>
>>> On Fri, May 4, 2012 at 9:28 AM, David Winsemius <dwinsemius at comcast.net 
>>> >
>>> wrote:
>>>
>>> On May 3, 2012, at 6:09 PM, Diego Rojas wrote:
>>>
>>> If a run a LOESS model and then produce a smoothed surface: Is  
>>> there any
>>> way to determine the coordinates of the local maxima on the surface?
>>>
>>> ?predict    # it has a loess method.
>


David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list