[R] Likelihood optimization numerically

Mohammad Ehsanul Karim wildscop at yahoo.com
Sun Jan 27 10:11:18 CET 2008


Dear List,

Probably i am missing something important in optimize:

llk.1st <- function(alpha){
x <-  c(20.0, 23.9, 20.9, 23.8, 25.0, 24.0, 21.7, 23.8, 22.8, 23.1, 23.1, 23.5, 23.0, 23.0)
n <- length(x)
llk1 <- -n*log(gamma(alpha)) - n*alpha*log(sum(x)/(n*alpha)) + (alpha - 1)*(sum(log(x))) - (sum(x))/(sum(x)/(n*alpha))
return(llk1)
} 

plot(llk.1st, 1,1000)
optimize(f=llk.1st, interval =c(0,1000), tol = 0.0001)


Reported result is approximately -
alpha = 500
beta = 0.05

But i get -
$minimum
[1] 1000 ## whatever the upper bound is!!
$objective
[1] -Inf
There were 50 or more warnings (use warnings() to see the first 50)

also,
> optim(par = 500, fn = llk.1st)
Error in optim(par = 500, fn = llk.1st) : 
  function cannot be evaluated at initial parameters
In addition: Warning messages:
1: In optim(par = 500, fn = llk.1st) :
  one-diml optimization by Nelder-Mead is unreliable: use optimize
2: In fn(par, ...) : value out of range in 'gammafn'


Can 
anyone 
provide 
me 
hint?
Thank 
you 
for 
your 
time.

Ehsan
http://www.youtube.com/profile_play_list?user=wildsc0p


----- Original Message ----
From: Mohammad Ehsanul Karim <wildscop at yahoo.com>
To: r-help at r-project.org
Sent: Sunday, January 27, 2008 12:47:40 AM
Subject: Likelihood optimization numerically


Dear 
List,

I 
am 
not 
sure 
how 
should 
i 
optimize 
a 
log-likelihood 
numerically:
Here 
is 
a 
Text 
book 
example 
from 
Statistical 
Inference 
by 
George 
Casella, 
2nd
Edition 
Casella 
and 
Berger, 
Roger 
L. 
Berger 
(2002, 
pp. 
355, 
ex. 
7.4 
# 
7.2.b):

data 
= 
x 
=  
c(20.0, 
23.9, 
20.9, 
23.8, 
25.0, 
24.0, 
21.7, 
23.8, 
22.8, 
23.1, 
23.1, 
23.5, 
23.0, 
23.0)
n 
<- 
length(x)

# 
likelihood 
from 
a 
2 
parameter 
Gamma(alpha, 
beta), 
both 
unknown
llk 
= 
-n*log(gamma(alpha)) 
- 
n*alpha*log(beta) 
+ 
(alpha 
- 
1)*(sum(log(x))) 
- 
(sum(x))/beta

# 
analytic 
1st 
derivative 
solution 
w.r.t 
alpha, 
assuming 
beta 
known
# 
by 
putting 
MLE 
of 
beta 
= 
sum(x)/(n*alpha) 
# 
(to 
simplify 
as 
far 
as 
possible 
analytically)
llk.1st 
= 
- 
n*digamma(alpha) 
-n*(log(sum(x)/(n*alpha))+1) 
+ 
(sum(log(x))) 

It 
feels 
like 
i 
should 
use 
nls(... 
,  
trace=T, 
start=c(alpha=...),nls.control(maxiter=100,tol=.1))
but 
not 
sure 
"how".

> 
R.Version()
$platform
[1] 
"i386-pc-mingw32"
$arch
[1] 
"i386"
$os
[1] 
"mingw32"
$system
[1] 
"i386, 
mingw32"
$status
[1] 
""
$major
[1] 
"2"
$minor
[1] 
"6.1"
$year
[1] 
"2007"
$month
[1] 
"11"
$day
[1] 
"26"
$`svn 
rev`
[1] 
"43537"
$language
[1] 
"R"
$version.string
[1] 
"R 
version 
2.6.1 
(2007-11-26)"





      ____________________________________________________________________________________
Never miss a thing.  Make Yahoo your home page.



More information about the R-help mailing list