[R] question on "optim"

Ravi Varadhan rvaradhan at jhmi.edu
Tue Sep 7 17:43:14 CEST 2010


Hi,

I do not see how `data' is used in your objective function.

The objective function is not even evaluable at the initial guess.  

> myfunc1(guess, mydata)
[1] NaN

I also think that some of the parameters may have to be constrained, for example, par[1] < 0.  At a minimum, make sure that the obj fn is correctly specified before we can start tackling other issues.

Ravi.
____________________________________________________________________

Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619
email: rvaradhan at jhmi.edu


----- Original Message -----
From: Hey Sky <heyskywalker at yahoo.com>
Date: Tuesday, September 7, 2010 10:40 am
Subject: [R] question on "optim"
To: R <r-help at r-project.org>


> Hey, R users
>  
>  I do not know how to describe my question. I am a new user for R and 
> write the 
>  following code for a dynamic labor economics model and use OPTIM to 
> get 
>  optimizations and parameter values. the following code does not work 
> due to 
>  the equation:
>  
>     wden[,i]<-dnorm((1-regw[,i])/w[5])/w[5]
>  
>  where w[5] is one of the parameters (together with vector a, b and 
> other 
>  elements in vector w) need to be estimated. if I delete the w[5] from 
> the upper 
>  equation. that is:
>  
>   wden[,i]<-dnorm(1-regw[,i])
>  
>  optim will give me the estimated parameters. but the paramter w[5] is 
> a key one 
>  for me. 
>  
>  
>  now my questions is: what reason lead to the first equation does not 
> work and 
>  the way to correct it to make it work?
>  
>   I wish I made the queston clear and thanks for any suggestion.
>  
>  Nan
>  from Montreal
>  
>  
>  
>  
>  
>  
>  
>  
>  #the function 
>  myfunc1<-function(par,data) {
>  
>  # define the parameter matrix used in following part
>  vbar2<-matrix(0,n,nt)
>  vbar3<-matrix(0,n,nt)
>  v8 <-matrix(0,n,nt)
>  regw<-matrix(0,n,nt)
>  wden<-matrix(0,n,nt)
>  lia<-matrix(0,n,nt)
>  ccl<-matrix(1,n,ns)
>  eta<-c(0,0)
>  
>  # setup the parts for loglikelihood
>  q1<-exp(par[1])
>  pr1<-q1/(1+q1)
>  pr2<-1-pr1
>  
>  eta[2]<-par[2]
>  a<-par[3:6]
>  b<-par[7:11]
>  w<-par[12:npar]
>  
>  for(m in 1:ns){
>   for(i in 1:nt){
>     regw[,i]<-w[1]+ w[2]*eta[m]+exp(w[3]+w[4]*eta[m])*actr[,i]+w[5]*acwrk[,i]
>      vbar2[,i]=a[1]+     eta[m]+regw[,i]*a[2]+acwrk[,i]*a[3]+actr[,i]*a[4]
>      vbar3[,i]=b[1]+b[2]*eta[m]+regw[,i]*b[3]+acwrk[,i]*b[4]+actr[,i]*b[5]
>      v8[,i]=1+exp(vbar2[,i])+exp(vbar3[,i])
>       
>     for(j in 1:n){
>      if (home[j,i]==1) lia[j,i]=1/v8[j,i]
>        if (wrk[j,i]==1) lia[j,i]=exp(vbar2[j,i])/v8[j,i]
>          if (tr[j,i]==1) lia[j,i]=exp(vbar3[j,i])/v8[j,i]
>       }
>  
>     wden[,i]<-dnorm((1-regw[,i])/w[5])/w[5]
>     ccl[,m]<-lia[,i]*ccl[,m]*wden[,i]
>   }
>  }
>  
>  func<-pr1*ccl[,1]+pr2*ccl[,2]
>  f<-sum(log(func))
>  return(-f)
>  }
>  
>  
>  #*******************
>  # main program ** gen random data and get the optimization **
>  
>  nt<<-16    # number of periods
>  ns<<-2     # number of person type
>  n<<-50     # number of people
>  npar<<-17 # number of parameters
>  
>  tr<-matrix(0,n,nt)
>  wrk<-matrix(0,n,nt)
>  home<-matrix(0,n,nt)
>  actr<-matrix(0,n,nt)
>  acwrk<-matrix(0,n,nt)
>  
>  for(i in 1:nt){
>    tr[,i]<-round(runif(n))
>    home[,i]<-round(runif(n))
>  }
>  
>  for(i in 1:nt){
>   for(k in 1:n){
>    if(tr[k,i]==1 & home[k,i]==1) home[k,i]=0
>    wrk[k,i]<- 1-tr[k,i]-home[k,i]
>   }
>  }
>  
>  actr[,1]<-tr[,1]
>  acwrk[,1]<-wrk[,1]
>  for(j in 2:nt){
>  actr[,j]<-actr[,j-1]+tr[,j]
>  acwrk[,j]<-acwrk[,j-1]+wrk[,j]
>  }
>  
>  mydata<-cbind(tr,wrk,home,actr,acwrk)
>  
>  guess<-rep(0,times=npar)
>  system.time(r1<-optim(guess,myfunc1,data=mydata, method="BFGS",hessian=T))
>  r1$par
>  
>  
>  
>  
>  ______________________________________________
>  R-help at r-project.org mailing list
>  
>  PLEASE do read the posting guide 
>  and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list