RE: [R] Monotonic regression

From: Ted Harding <Ted.Harding_at_nessie.mcc.ac.uk>
Date: Mon 09 May 2005 - 07:13:41 EST


On 08-May-05 Scott Briggs wrote:
> Hi, I'm trying to find an implementation of monotonic regression in R
> and I haven't been able to find anything that's really related to
> this. isoMDS in the MASS package uses monotonic regression, however,
> I was wondering if there is any standalone function for monotonic
> regression?
>
> Basically what I'm trying to do is implement monotonic regression
> where I can see not just the results of each iteration but also be
> able to tweak the input in order to test for or "kick" the regression
> out of a local minimum so that I can make sure I have the global
> minimum.
>
> Any help would be much appreciated. Thanks!
>
> Scott

You may probably find PAVA ("Pool Adjacent Violators Algorithm") useful. Below is code for a simple version which I have been using for a few years. I forget where I found it!

An R site search comes up with code for a version with more complex functionality at

  http://finzi.psych.upenn.edu/R/Rhelp02a/archive/9807.html

(contributed to r-help by Jan de Leeuw on 01 Jul 2004). I have not tested this code.

pava<-function(x,wt=rep(1,length(x)))
{
  n<-length(x)
  if(n<=1) return(x)
  if(any(is.na(x)) || any(is.na(wt))) {
    stop("Missing values in 'x' or 'wt' not allowed")   }
  lvlsets<-(1:n)
  repeat {
    viol<-(as.vector(diff(x))<0)
    if(!(any(viol))) break
    i<-min( (1:(n-1))[viol])

    lvl1<-lvlsets[i]
    lvl2<-lvlsets[i+1]
    ilvl<-(lvlsets==lvl1 | lvlsets==lvl2)
    x[ilvl]<-sum(x[ilvl]*wt[ilvl])/sum(wt[ilvl])     lvlsets[ilvl]<-lvl1
  }
  x
}
# Examples:
# > x<-c(1,0,1,0,0,1,0,1,1,0,1,0)
# > x
# [1] 1 0 1 0 0 1 0 1 1 0 1 0
# > pava(x)
#  [1] 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.6 0.6 0.6 0.6 0.6
# > 
# > pava(c(0,0,2/4,1/5,2/4,1/2,4/5,5/8,7/11,10/11),
#        c(5,4,4,5,4,2,5,8,11,11))
# [1] 0.0000000 0.0000000 0.3333333 0.3333333 0.5000000
# [6] 0.5000000 0.6666667 0.6666667 0.6666667 0.9090909
# (example where data are {ri,ni} so x={ri/ni} and w={ni})


Best wishes,
Ted.



E-Mail: (Ted Harding) <Ted.Harding@nessie.mcc.ac.uk> Fax-to-email: +44 (0)870 094 0861
Date: 08-May-05                                       Time: 20:56:28
------------------------------ XFMail ------------------------------

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Mon May 09 07:41:11 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:31:39 EST