[R] normal mixture EM not working?
David Winsemius
dwinsemius at comcast.net
Sat Mar 30 17:31:14 CET 2013
Dear Stat Tistician;
Have you looked at the original distribution graphically? When I use densityplot on that data I am unable to discern even a hint of two separate peaks. Furthermore the density looks peaked versus what I would expect from a "true" normal distribution with those empiric parameters. So I think the algorithm is attempting to estimate the proportions and variances of two distributions with equal means and different standard deviations. That would seem to be a particularly difficult task for a non-deterministic algorithm as this one clearly is. Under these circumstances I thought you might get better results if you constrained the means to be identically zero.
On the other hand my experiments with mixtools::normalmixEM on the clearly separable peaks in the faithful$waiting vector used in that package's help page also gave widely divergent results on estimated mixing proportions as well (even with arbvar=FALSE), so I am now very suspicious about the stability of either the method or possibly the implementation of that method for data of this size:
data(faithful)
> attach(faithful)
> length(waiting)
[1] 272
> system.time(out<-normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03))
> system.time(out2<-normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03))
> out$lambda
[1] 0.4548029 0.5451971
> out2$lambda
[1] 0.998016838 0.001983162
> system.time(out3<-normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03))
number of iterations= 5
user system elapsed
0.019 0.001 0.021
> out3$lambda
[1] 0.3609454 0.6390546
I think I could do a lot better just "drawing a line by eyeball" between the two peaks:
> densityplot(waiting)
> sum(waiting>68)
[1] 171
> sum(waiting<=68)
[1] 101
This makes the observation of implausibly high variation in estimated mixing proportions more reproducible (at least if you are on a Mac):
> set.seed(123)
> out1 <- normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03)
number of iterations= 8
> out1$lambda
[1] 0.3608581 0.6391419
> out2 <- normalmixEM(waiting, arbvar = FALSE, epsilon = 1e-03)
number of iterations= 3
> out2$lambda
[1] 0.08257889 0.91742111
(I'm copying the package maintainer, Derek Young .)
> sessionInfo()
R version 3.0.0 beta (2013-03-22 r62364)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grDevices datasets splines graphics utils stats methods base
other attached packages:
[1] mixtools_0.4.6 segmented_0.2-9.4 boot_1.3-9 car_2.0-16 nnet_7.3-6 MASS_7.3-26
[7] data.table_1.8.8 reshape2_1.2.2 rms_3.6-3 Hmisc_3.10-1 survival_2.37-4 sos_1.3-5
[13] brew_1.0-6 lattice_0.20-14
loaded via a namespace (and not attached):
[1] cluster_1.14.3 colorspace_1.2-1 dichromat_2.0-0 digest_0.6.3 ggplot2_0.9.3.1
[6] grid_3.0.0 gtable_0.1.2 labeling_0.1 munsell_0.4 plyr_1.8
[11] proto_0.3-10 RColorBrewer_1.0-5 scales_0.2.3 stringr_0.6.2 tools_3.0.0
On Mar 30, 2013, at 3:20 AM, Stat Tistician wrote:
> Hi,
> I am currently working on fitting a mixture density to financial data.
>
> I have the following data:
> http://s000.tinyupload.com/?file_id=00083355432555420222
>
> I want to fit a mixture density of two normal distributions.
>
> I have the formula:
> f(l)=πϕ(l;μ1,σ21)+(1−π)ϕ(l;μ2,σ22)
>
> my R code is:
>
> normalmix<-normalmixEM(dat,k=2,fast=TRUE)
>
> pi<-normalmix$lambda[1]
> mu1<-normalmix$mu[1]
> mu2<-normalmix$mu[2]
> sigma1<-normalmix$sigma[1]
> sigma2<-normalmix$sigma[2]
>
> Now I have the problem, that the output is not consistent, i.e. every time
> I run the code, I get different outputs! And they are very different, no
> small differences, which could be due to the precision of the numerical
> procedures.
>
> E.g. sometimes for pi I get
>
> [1] 0.2653939
>
> or
>
> [1] 0.3318069
>
> I already recognized, that sometimes the numbering is changed, so the pi of
> 0.7 would be equal to a pi of 0.3. Okay, I got this, I don't know why the R
> procedures does this, but this would not be a problem. But the problem is,
> that the outputs are way to different, sometimes I even get an error
> message (german): Fehler in while (dl > eps && iter < maxit) { : Fehlender
> Wert, wo TRUE/FALSE nötig ist
>
> Also, the number of iterations is very different, from 29 up to 1000 ......
>
> Anyone can help? Thanks a lot!
>
> [[alternative HTML version deleted]]
>
David Winsemius
Alameda, CA, USA
More information about the R-help
mailing list