# [R] Fitting distributions

kjetil halvorsen kjetilh at umsanet.edu.bo
Thu Sep 6 19:24:24 CEST 2001

```Hola!

I think some of this is avaliable as fit.dist in Jim Lindsays
package gnlm.

Kjetil Halvorsen

Prof Brian Ripley wrote:
>
> This has come up a couple of times recently.  MASS4 will have a
> general-purpose function for maximum-likelihood fitting and a set of
> wrappers for common distributions.
>
> Here's a preview of the R version (rapidly converted this morning).
> You can do things like
>
> fitdist(x, dnorm, list(mean = 0, sd = 1))
> fitdist(x, dnorm, list(sd = 1), mean=0.5)
>
> the latter fixing the mean.
>
> This is not much tested (in R and much of it had to be changed for R) but
> should give a flavour of what is possible.  Eventually there will be
> a much more comprehensive interface.
>
> fitdist <- function(x, dist, start, ...)
> {
>     myfn <- function(parm, ...) -sum(log(dens(parm, ...)))
>
>     dens1 <- function(parm, x, ...) dist(x, parm, ...)
>     dens2 <- function(parm, x, ...) dist(x, parm[1], parm[2], ...)
>     dens3 <- function(parm, x, ...) dist(x, parm[1], parm[2], parm[3], ...)
>     dens4 <- function(parm, x, ...)
>         dist(x, parm[1], parm[2], parm[3], , parm[4], ...)
>
>     if(missing(x) || length(x) == 0 || mode(x) != "numeric")
>         stop("`x' must be a non-empty numeric vector")
>     if(missing(dist) || !is.function(dist))
>         stop("`dist' must be supplied as a function")
>     if(missing(start) || !is.list(start))
>         stop("`start' must be a named list")
>     nm <- names(start)
>     ## reorder arguments to dist
>     f <- formals(dist)
>     args <- names(f)
>     m <- match(nm, args)
>     if(any(is.na(m)))
>         stop("`start' specifies names which are not arguments to `dist'")
>     formals(dist) <- c(f[c(1, m)], f[-c(1, m)])
>     ## try to be somewhat efficient
>     switch(length(nm),
>            "1" = {dens <- dens1},
>            "2" = {dens <- dens2},
>            "3" = {dens <- dens3},
>            "4" = {dens <- dens3},
>            stop("only handle 1:4 variable parms"))
>     res <- optim(start, myfn, x=x, ...)
>     if(res\$convergence > 0) stop("optimization failed")
>     res\$par
> }
>
> --
> 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 272860 (secr)
> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```