[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