[R] Fitting a Tweedie distribution
David Winsemius
dwinsemius at comcast.net
Fri Jan 2 23:16:37 CET 2015
On Jan 2, 2015, at 12:04 PM, Ben Bolker wrote:
> Ben Bolker <bbolker <at> gmail.com> writes:
>
>>
>> Paul Hudson <paulhudson028 <at> gmail.com> writes:
>>
>
> [snip]
>
>> library("tweedie")
>> set.seed(1001)
>> r <- rtweedie(1000,1.5,mu=2,phi=2)
>> library("bbmle")
>> dtweedie2 <- function(x,power,mu,phi,log=FALSE,debug=FALSE) {
>> if (debug) cat(power,mu,phi,"\n")
>> res <- dtweedie(y=x,xi=power,mu=mu,phi=phi)
>> if (log) log(res) else res
>> }
>> m <- mle2(r~dtweedie2(power=exp(logpower),
>> mu=exp(logmu),
>> phi=exp(logphi)),
>> ## don't start with logpower=0 (power=1)
>> start=list(logpower=0.1,logmu=0,logphi=0),
>> data=data.frame(r),
>> method="Nelder-Mead")
>>
>> dtweedie2(r,xi=exp(0.1),mu=1,phi=1)
That threw an error.
>>
>> In principle MASS::fitdistr could be made to work too.
>
> PS in hindsight, you're better off with the built-in tweedie.power()
> recommended by another poster. Estimating the power parameter for
> Tweedie distributions is known to be difficult, and the naive approach I show
> above may only work in best-case scenarios.
I did try fitdistr in the ftdistrplus package multiple errors due to estiamating power parameters less than 1.00 before I noticed the tweedie.profile function. (Your implementation via a transformation effectively sidestepped that possibility.) And then I kicked myself for not reading the documentation more thoroughly.
Comparing the two methods:
> exp( m at coef )
logpower logmu logphi
1.516015 1.935660 2.089286
> tweedie.profile(r~1)[c('xi.max', 'phi.max')]
1.2 1.3 1.4 1.5 1.6 1.7 1.8
.......Done.
$xi.max
[1] 1.514286
$phi.max
[1] 2.085714
The bbmle::mle2 approach is about 25 times faster than 'tweedie.profile'.
--
David Winsemius
Alameda, CA, USA
More information about the R-help
mailing list