Yang, Richard
2003-Jul-28 15:12 UTC
[R] Optimization failed in fitting mixture 3-parameter Weibull distri bution using fitdistr()
Dear All;
I tried to use fitdistr() in the MASS library to fit a mixture
distribution of the 3-parameter Weibull, but the optimization failed.
Looking at the source code, it seems to indicate the error occurs at
if (res$convergence > 0)
stop("optimization failed").
The procedures I tested are as following:
>w3den <- function(x, a,b,c) {c/b*((x -a)/b)^(c-1)*exp(-((x-a)/b)^c)} #
define 3-parameter Weibull density>w3den <- function(x, a,b,c) {c/b*((x -a)/b)^(c-1)*exp(-((x-a)/b)^c)}
>set.seed(123)
> x3 <- rweibull(100, shape = 4, scale = 100)
#
Distribution 1> fitdistr(x3, w3den, start= list(a = 8.8, b = 90.77, c = 3.678)) #
Fitting 3-parameter
a b c
8.9487415 90.6667712 3.6722124
(15.1462445) (16.0657103) ( 0.7582376)
Warning messages:
1: NaNs produced in: log(x)
2: NaNs produced in: log(x)> x4 <- rweibull(50, shape = 3, scale = 90)
#
Distribution 2> fitdistr(x4, w3den, start=list(a = 5.0, b = 90, c = 3))
a b c
-67.572244 159.020786 5.835588
(105.975870) (107.842846) ( 4.288019)
Warning messages:
1: NaNs produced in: log(x)
2: NaNs produced in: log(x)
> mweib <- function(x, p, a,b,c,a1, b1, c1) {p*(c/b*((x -
a)/b)^(c-1)*exp(-((x-a)/b)^c))+
+ +(1-p)*(c1/b1*((x -a1)/b1)^(c1-1)*exp(-((x-a1)/b1)^c1))}
# define mixture distribution> x5 <- c(x3, x4)
> fitdistr(x5, mweib, start=list(p = 0.7, a = 8.9, b=90.77, c = 3.68, a1
-67.57, b1 = 159.02, c1 = 5.83))
Error in fitdistr(x5, mweib, start = list(p = 0.7, a = 8.9, b = 90.77, :
optimization failed
In addition: There were 14 warnings (use warnings() to see them).
I tested the same procedures with a mixture 2-parameter Weibull
distribution without problems. With a limited experience with the
fitdistr(), it seems to me, similar to all nonlinear or optimization
procedures, the starting values are critical for convergence. Any
suggestions for solving the optimization problem?
TIA
Richard Yang
Northern Forestry Centre / Centre de foresterie du Nord
Canadian Forest Service / Service canadien des for?ts
Natural Resources Canada / Ressources naturelles Canada
5320-122 Street / 5320, rue 122
Edmonton (Alberta) Canada
T6H 3S5
Prof Brian Ripley
2003-Jul-28 15:21 UTC
[R] Optimization failed in fitting mixture 3-parameter Weibull distri bution using fitdistr()
I don't think that is the right density: haven't you forgotten I(x > a)? So you need a constraint on a in the optimization, or at least to return density 0 if a >= min(x_i) (but I suspect the mle may well occur at the boundary). Without that constraint you don't have a valid optimization problem. On Mon, 28 Jul 2003, Yang, Richard wrote:> Dear All; > > I tried to use fitdistr() in the MASS library to fit a mixture > distribution of the 3-parameter Weibull, but the optimization failed. > Looking at the source code, it seems to indicate the error occurs at > if (res$convergence > 0) > stop("optimization failed"). > > The procedures I tested are as following: > > >w3den <- function(x, a,b,c) {c/b*((x -a)/b)^(c-1)*exp(-((x-a)/b)^c)} # > define 3-parameter Weibull density > >w3den <- function(x, a,b,c) {c/b*((x -a)/b)^(c-1)*exp(-((x-a)/b)^c)} > >set.seed(123) > > x3 <- rweibull(100, shape = 4, scale = 100) # > Distribution 1 > > fitdistr(x3, w3den, start= list(a = 8.8, b = 90.77, c = 3.678)) # > Fitting 3-parameter > > a b c > 8.9487415 90.6667712 3.6722124 > (15.1462445) (16.0657103) ( 0.7582376) > Warning messages: > 1: NaNs produced in: log(x) > 2: NaNs produced in: log(x) > > x4 <- rweibull(50, shape = 3, scale = 90) # > Distribution 2 > > fitdistr(x4, w3den, start=list(a = 5.0, b = 90, c = 3)) > a b c > -67.572244 159.020786 5.835588 > (105.975870) (107.842846) ( 4.288019) > Warning messages: > 1: NaNs produced in: log(x) > 2: NaNs produced in: log(x) > > > mweib <- function(x, p, a,b,c,a1, b1, c1) {p*(c/b*((x - > a)/b)^(c-1)*exp(-((x-a)/b)^c))+ > + +(1-p)*(c1/b1*((x -a1)/b1)^(c1-1)*exp(-((x-a1)/b1)^c1))} > # define mixture distribution > > x5 <- c(x3, x4) > > fitdistr(x5, mweib, start=list(p = 0.7, a = 8.9, b=90.77, c = 3.68, a1 > -67.57, b1 = 159.02, c1 = 5.83)) > Error in fitdistr(x5, mweib, start = list(p = 0.7, a = 8.9, b = 90.77, : > optimization failed > In addition: There were 14 warnings (use warnings() to see them). > > I tested the same procedures with a mixture 2-parameter Weibull > distribution without problems. With a limited experience with the > fitdistr(), it seems to me, similar to all nonlinear or optimization > procedures, the starting values are critical for convergence. Any > suggestions for solving the optimization problem? > > TIA > > Richard Yang > > > Northern Forestry Centre / Centre de foresterie du Nord > Canadian Forest Service / Service canadien des for?ts > Natural Resources Canada / Ressources naturelles Canada > 5320-122 Street / 5320, rue 122 > > Edmonton (Alberta) Canada > T6H 3S5 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help > >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595