[R] Gamma mixture models with flexmix

Wittner, Ben, Ph.D. Wittner.Ben at mgh.harvard.edu
Tue Mar 1 00:04:18 CET 2011


I've been trying with no success to model mixtures of Gamma distributions using
the package flexmix (see examples below). Can anyone help me get it to model
better? Thanks very much.

-Ben

##
##  Please help me get flexmix to correctly model mixtures of
##  Gamma distributions. See examples below.
##
library('flexmix')

##
##  Plot a histogram of dat and the Gamma mixture model given by
##  shapes, rates and pis that is intended as a model of the
##  distribution from which dat was drawn.
##
plotGammaMixture <- function(dat, shapes, rates, pis) {

  KK <- length(pis)
  stopifnot(KK == length(shapes))
  stopifnot(KK == length(rates))

  ho <- hist(dat, plot=FALSE)
  x <- seq(ho$breaks[1], ho$breaks[length(ho$breaks)],
           length.out=1000)
  y <- list()
  for (ii in 1:KK) {
    y[[ii]] <- pis[ii]*dgamma(x, shape=shapes[ii],
                              rate=rates[ii])
  }

  uy <- unlist(y)
  ylim <- if (any(uy == Inf)) {
    c(0, 2*max(ho$intensities))
  } else {
    c(0, max(c(ho$intensities, uy)))
  }
  plot(ho, col='lightgray', freq=FALSE, ylim=ylim,
       main=paste(KK, 'component(s) in model\nmodel prior(s) =',
         paste(round(pis, 2), collapse=', ')))
  cols <- rainbow(KK)
  for (ii in 1:KK) {
    lines(x, y[[ii]], col=cols[ii])
  }
}

##
##  Model dat as a mixture of Gammas then plot.
##
modelGammas <- function(dat, which='BIC') {
  set.seed(939458)
  fmo <- stepFlexmix(dat ~ 1, k=1:3,
                     model=FLXMRglm(family='Gamma'))
  mdl <- getModel(fmo, which=which)
  print(smry <- summary(mdl))
  print(prm <- parameters(mdl))
  plotGammaMixture(dat, prm['shape', ],
                   prm['shape', ]*prm['coef.(Intercept)', ],
                   smry at comptab[, 'prior'])
}

##
##  Works well for a single Gamma distribution.
##
set.seed(78483)
dat1 <- rgamma(6000, shape=2, rate=0.5)
modelGammas(dat1)

set.seed(78483)
dat2 <- rgamma(6000, shape=5, rate=0.3)
modelGammas(dat2)

##
##  Please help me get it to work for mixtures of
##  two Gamma distributions.
##
set.seed(78483)
dat3 <- c(rgamma(6000, shape=3, rate=.5),
          rgamma(4000, shape=5, rate=.1))
modelGammas(dat3)

## Even telling it that there are two components
## does not help. I get two nearly identical distributions,
modelGammas(dat3, which=2)

## whereas what I want to see is something like this.
plotGammaMixture(dat3, shapes=c(3, 5), rates=c(.5, .1),
                 pis=c(.6, .4))

###############################
Here's the output of sessionInfo()
R version 2.12.1 (2010-12-16)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=C              LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     



The information in this e-mail is intended only for the ...{{dropped:11}}



More information about the R-help mailing list