[R] maximum likelihood estimation in R
Ben Bolker
bbolker at gmail.com
Mon Nov 12 15:23:11 CET 2012
David Winsemius <dwinsemius <at> comcast.net> writes:
>
>
> On Nov 10, 2012, at 9:22 PM, mmosalman wrote:
>
> > I want to find ML estimates of a model using mle2 in bbmle package. When I
> > insert new parameters (for new covariates) in model the log-likelihood value
> > does not change and the estimated value is exactly the initial value that I
> > determined. What's the problem? This is the code and the result:
> Nope. The code is not here. It may be visible in the Nabble universe
> but in the Rhelp universe it is completely missing.
> > As you see the estimated values for b2 , b3 and b4 are the initial values of
> > them. The log-likelihood value did not change!
Copying and pasting the relevant code from Nabble:
library(GB2)
library(bbmle)
lgb1=function(a,b0,b2,b3,b4,p,q){
xb=b0+b2*fsex1[,2]+b3*fvtype1[,2]+b4*fvuse1[,2]
ll=sum(log(dgb2(loss1,a,exp(xb),p,q)))
return(-ll)
}
start=list(a=3.1,b0=2.5,
b2=.2,b3=1,b4=-.5,
p=7.2,q=.3)
mle2(lgb1,start)->fit1
summary(fit1)
Maximum likelihood estimation
Call:
mle2(minuslogl = lgb1, start = start)
Coefficients:
Estimate Std. Error z value Pr(z)
a 3.0747e+00 6.4741e-01 4.7492e+00 2.042e-06 ***
b0 2.5327e+00 4.6887e-01 5.4016e+00 6.605e-08 ***
b2 2.0000e-01 3.9686e-11 5.0396e+09 < 2.2e-16 ***
b3 1.0000e+00 7.6565e-12 1.3061e+11 < 2.2e-16 ***
b4 -5.0000e-01 1.5312e-11 -3.2653e+10 < 2.2e-16 ***
p 7.1281e+00 8.0269e+00 8.8800e-01 0.3745
q 3.5098e-01 8.6902e-02 4.0388e+00 5.372e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
-2 log L: 10137.56
I agree that it looks like the parameters got stuck at
their initial values, but without the data it's really hard to
know what went wrong. I assume you started with reasonable
parameter values and did some sanity checking on the data ... ?
You can use the 'trace' and 'browse_obj' arguments to
get more detail about what's going on.
For what it's worth, with a little more effort you could
use the formula interface to mle2: something like
## set up a "d*" function with a log argument
dgb2B <- function(...,log=FALSE) {
r <- dgb2(...)
if (log) log(r) else r
}
## set up a data frame to hold the data
dframe <- data.frame(loss1,sex=fsex1[,2],type=fvtype1[,2],use=fvuse1[,2])
mle2(loss1~dgb2B(shape1=a,scale=exp(logscale),shape2=p,shape3=q),
parameters=list(logscale~sex+type+use),
data=dframe,
start=...)
[see the help page for the details of how "start" is specified
in this case]
More information about the R-help
mailing list