[R] Estimating parameters of 3 parameters lognormal distribution

Frede Aakmann Tøgersen frtog at vestas.com
Sat Jan 18 10:06:10 CET 2014


It has to do with setting a to large upper bound for the gamma parameter. However, we are estimating the value of gamma because we do not know it so how can we set an upper bound for gamma??

Perhaps other optimization algorithms in optim() can be used (Nelder-Mead works for this x at least).

Here is my findings:

> N <- 100
> mu <-  1
> sigma <- 2 
> gamma <- 3
> 
> set.seed(42)
> x <- rlnorm(N, mu, sigma) + gamma
> 
> min(x)
[1] 3.006832
> 
> foo <- function(x, mu, sigma, gamma)
+                 {dlnorm(x - gamma, mu, sigma)}
> 
> ## min(x) is not the right upper bound to use for gamma
> fit  <- fitdistr(x, densfun = foo,
+                 start = list(mu = 0.9, sigma = 1.9, gamma = 2.9),
+                 lower = c(-Inf, 0, -Inf),
+                 upper=c(Inf, Inf, min(x)))
Error in stats::optim(x = c(45.178764955739, 3.87862565957867, 8.61957940802123,  : 
  L-BFGS-B needs finite values of 'fn'
> 
> ## now upper bound for gamma is not to large
> fit  <- fitdistr(x, densfun = foo,
+                 start = list(mu = 0.9, sigma = 1.9, gamma = 2.9),
+                 lower = c(-Inf, 0, -Inf),
+                 upper=c(Inf, Inf, 3))
> fit
       mu         sigma        gamma   
  1.08694600   2.02546254   2.99393215 
 (0.20902998) (0.17736860) (0.01663611)
> 
> ## now upper bound for gamma is not to large
> ## still able to find correct estimates for parameters for other start values
> fit  <- fitdistr(x, densfun = foo,
+                 start = list(mu = 0, sigma = 1, gamma = 0),
+                 lower = c(-Inf, 0.0001, -Inf),
+                 upper=c(Inf, Inf, 3))
> fit
       mu         sigma        gamma   
  1.08671881   2.02579806   2.99394094 
 (0.20907178) (0.17745706) (0.01663591)
> 
> ## Nelder-Mead method seems to do the job
> fit  <- fitdistr(x, densfun = foo, method = "Nelder-Mead",
>                start = list(mu = 0, sigma = 1, gamma = 0))
> fit
       mu         sigma        gamma   
  1.08678997   2.02571374   2.99393924 
 (0.20906041) (0.17743258) (0.01663503)
> 
> ## these two functions are defined and used in the code for fitdistr
> ## myfn is the objective function to be optimized in optim()
> dens <- function(parm, ...) foo(x, parm, ...)
> myfn <- function(parm, ...) -sum(log(dens(parm, ...)))
> 
> ## for gamma > 3. Here min(x) = 3.006832
> ## have at least one illegal value of log-normal
> table(dens(1, 2, min(x)) > 0)

FALSE  TRUE 
    1    99 
>  
> ## resulting in
> myfn(0.9, 1.9, min(x))
[1] Inf
> ## but for gamma = 3 we get finite likelihood
> myfn(0.9, 1.9, 3.000000)
[1] 322.4375
> ## also finite likelihood
> myfn(0.9, 1.9, -3.000000)
[1] 456.7857
>

Yours sincerely / Med venlig hilsen


Frede Aakmann Tøgersen
Specialist, M.Sc., Ph.D.
Plant Performance & Modeling

Technology & Service Solutions
T +45 9730 5135
M +45 2547 6050
frtog at vestas.com
http://www.vestas.com

Company reg. name: Vestas Wind Systems A/S
This e-mail is subject to our e-mail disclaimer statement.
Please refer to www.vestas.com/legal/notice
If you have received this e-mail in error please contact the sender. 


> -----Original Message-----
> From: Rolf Turner [mailto:r.turner at auckland.ac.nz]
> Sent: 17. januar 2014 22:47
> To: Vito Ricci
> Cc: Frede Aakmann Tøgersen; Göran Broström; r-help at stat.math.ethz.ch
> Subject: Re: [R] Estimating parameters of 3 parameters lognormal
> distribution
> 
> 
> Can you please tell us (me!) how you chose starting values?
> 
> Out of curiosity I tried the following:
> 
> set.seed(42)
> x <- rlnorm(100,1,2) + 3
> require(MASS)
> strt <- list(mu=1,sigma=2,gamma=3)
> fit  <- fitdistr(x,densfun=function(x,mu,sigma,gamma)
>                                    {dlnorm(x-gamma,mu,sigma)
>                            },
>                 start=strt,lower=c(0,0,-Inf),
>                 upper=c(Inf,Inf,min(x)))
> 
> and it ran just fine and gave sensible answers.  But when I took:
> 
> strt <- list(mu=0.9,sigma=1.9,gamma=2.9)
> 
> (not very different from the previous starting values)
> 
> I got an error:
> 
> > Error in stats::optim(x = c(45.178764955739, 3.87862565957867,
> 8.61957940802123,  :
> >   L-BFGS-B needs finite values of 'fn'
> 
> 
> On 18/01/14 01:00, Vito Ricci wrote:
> > OK. It runs fine! Many thanks Frede.
> > Regards.
> > Vito
> >
> >
> >
> > Se non ora, quando?
> > Se non qui, dove?
> > Se non tu, chi?
> >
> >
> >
> > Il Venerdì 17 Gennaio 2014 12:38, Frede Aakmann Tøgersen
> <frtog at vestas.com> ha scritto:
> >
> >
> >> In package MASS there is the fitdistr function using maximum likelihood
> estimation to infer on the parameters of distributions based on observed
> data.
> >>
> >>
> >> One of the arguments of fitdistr () allows you to specify the probability
> density function.
> >>
> >>
> >> You only know how the parametrization of your three parameters
> lognormal distribution is defined since you really haven't told us much.
> >>
> >>
> >> Please have a look at fitdistr() and tell us if fit your needs.




More information about the R-help mailing list