[R] Minimizing a Function with three Parameters

Sundar Dorai-Raj sundar.dorai-raj at pdf.com
Thu Dec 1 16:01:32 CET 2005



voodooochild at gmx.de wrote:
> Hi,
> 
> I'm trying to get maximum likelihood estimates of \alpha, \beta_0 and 
> \beta_1, this can be achieved by solving the following three equations:
> 
> n / \alpha + \sum\limits_{i=1}^{n} ln(\psihat(i)) - 
> \sum\limits_{i=1}^{n} ( ln(x_i + \psihat(i)) ) = 0
> 
> \alpha \sum\limits_{i=1}^{n} 1/(psihat(i)) - (\alpha+1) 
> \sum\limits_{i=1}^{n} ( 1 / (x_i + \psihat(i)) ) = 0
> 
> \alpha \sum\limits_{i=1}^{n} ( i / \psihat(i) ) - (\alpha + 1) 
> \sum\limits_{i=1}^{n} ( i / (x_i + \psihat(i)) ) = 0
> 
> where \psihat=\beta_0 + \beta_1 * i. Now i want to get iterated values 
> for \alpha, \beta_0 and \beta_1, so i used the following implementation
> 
> # first equation
> l1 <- function(beta0,beta1,alpha,x) {
>   n<-length(x)
>   s2<-length(x)
>     for(i in 1:n) {
>     s2[i]<-log(beta0+beta1*i)-log(x[i]+beta0+beta1*i)
>     }
>   s2<-sum(s2)
>   return((n/alpha)+s2)
> }
> 
> # second equation
> l2 <- function(beta0,beta1,alpha,x) {
>   n<-length(x)
>   s1<-length(x)
>   s2<-length(x)
>     for(i in 1:n) {
>     s1[i]<-1/(beta0+beta1*i)
>     s2[i]<-1/(beta0+beta1*i+x[i])
>     }
>   s1<-sum(s1)
>   s2<-sum(s2)
>   return(alpha*s1-(alpha+1)*s2)
> }
> 
> #third equation
> l3 <- function(beta0,beta1,alpha,x) {
>   n<-length(x)
>   s1<-length(x)
>   s2<-length(x)
>     for(i in 1:n) {
>     s1[i]<-i/(beta0+beta1*i)
>     s2[i]<-i/(x[i]+beta0+beta1*i)
>     }
>   s1<-sum(s1)
>   s2<-sum(s2)
>   return(alpha*s1-(alpha+1)*s2)
> }
> 
> # all equations in one
> gl <- function(beta0,beta1,alpha,x) {
>   l1(beta0,beta1,alpha,x)^2 + l2(beta0,beta1,alpha,x)^2 + 
> l3(beta0,beta1,alpha,x)^2
> }
> 
> #iteration with optim
> optim(c(1,1,1),gl,x)
> 
> i get always an error massage. Is optim anyway the 'right' method to get 
> all three parameters iterated at the same time?
> 
> best regards
> Andreas
> 

Hi, Andreas,

You've misread the help file for ?optim.

  fn: A function to be minimized (or maximized), with first
           argument the vector of parameters over which minimization is
           to take place.  It should return a scalar result.

So, your objective function should look like

gl <- function(beta, x) {
   beta0 <- beta[1]
   beta1 <- beta[2]
   alpha <- beta[3]
   v1 <- l1(beta0, beta1, alpha, x)^2
   v2 <- l2(beta0, beta1, alpha, x)^2
   v3 <- l3(beta0, beta1, alpha, x)^2
   v1 + v2 + v3
}

Also, are you aware of ?mle in the stats4 package?

HTH,

--sundar




More information about the R-help mailing list