Skip to main content

How can I fit a distribution to a dataset while forcing it through an exact point in r?

This code was kindly recommended to me in my original question. It returned the same parameter estimates as the software called CRAFT by Aon Benfield. I have also managed to replicate it for the Weibull distribution.
I was wondering if anyone could help me replicate if for Pareto? Based on CRAFT, I would expect a shape of ~0.59 and scale of ~55.15 (b~93 and q~1.7). Finally, I would also like to do the same but using the SSQ method instead of MLE?

My data = c(28.744, 385.714, 20.595, 99.350,31.864, 77.713, 264.408, 21.204, 31.937, 0.900, 18.762, 173.276, 23.707) 

constrained_mle <- function(x, p, q) {
  lnL <- function(shape) {
    # Solving q = qgamma(p, shape)*scale for the necssary scale
    scale <- q/qgamma(p, shape)
    sum(dgamma(x, shape, scale=scale, log=TRUE))
  }
  res <- optimise(lnL, lower=0, upper=1e+3, maximum=TRUE, tol=1e-8)
  scale <- q/qgamma(p, res$maximum)
  c(scale=scale, shape=res$maximum)
}
par <- constrained_mle(x, .95, 500.912)
par
#>       scale       shape 
#> 231.0561574   0.6038756
# checking that the solution is correct
qgamma(.95, scale=par[1], shape=par[2])
#> [1] 500.912 ```
Tom
  • 41
  • 3