[ADMB Users] promoting the admb software

Anders Nielsen anders at nielsensweb.org
Sun Mar 1 10:35:09 PST 2009


Hi Dave, 

I agree that the random effects part of ADMB is quite unique. At the 
course in Santa Barbara a week from now we will make sure to show how 
great the random effects part is. It is a two days introductory course,
so I think that example is a little too advanced to show there, but we 
should keep it in mind for later courses. 

I have not followed the discussion on the R-list, but am convinced that 
R has nothing with similar generality for random effect. You could post 
the example on the R-list, but when we have tried that in the past we 
have not always gotten a fair response (I remember some BS response 
about an outdated spam filter and what that shows about being careful). 
I think this example is important enough to publish in for instance 
'journal of statistical software'. I think there you would get a 
chance to reach approximately the same correct audience, it would be 
peer review so it would carry more weight.  What do you think about 
that?

Cheers,

Anders. 

 


On Sat, 2009-02-28 at 16:29 -0800, dave fournier wrote:
> Oops I sent that unfinished by mistake.
> It seems to me that r has only rudimentry support for nonlinear mixed
> models and that there are many r users with needs that could be filled
> with ADMB. See for example the recent discussion on R help aboutthe grat
> difficulty (apparently)  in incorporating random effects into
> the type of beta regression model as described in Smithson and Verkilon.
> I built a proof of concept version with nested data and
> random effects on both parameters (mean and dispersion), mu and phi in
> the language of the above paper. It sems to work well without even
> bothering to get good initial estimates for the parameters.
> I built a simulator to verify this.
> The code for the analyzer is
> 
> 
> DATA_SECTION
>   init_int nobs
>   init_int m
>   init_matrix obs(1,nobs,0,m+1)
>   int nplots
>  !! nplots=max(column(obs,m+1));
>   ivector iswitch(1,nplots)
> PARAMETER_SECTION
>   objective_function_value f
>   init_vector bet(1,m)
>   init_vector delta(1,m)
>   init_bounded_number sigma1(.01,2.0,2)
>   init_bounded_number sigma2(.01,2.0,2)
>   random_effects_vector u(1,2*nplots,2)
>   //random_effects_vector v(1,nplots,2)
> PROCEDURE_SECTION
>   int i;
>   iswitch.initialize();
>   for (i=1;i<=nobs;i++)
>   {
>     int offset=2*(obs(i,m+1)-1)+1;
>     f1(i,bet,delta,u(offset),u(offset+1),sigma1,sigma2);
>   }
> 
> SEPARABLE_FUNCTION void f1(int i,const dvar_vector& bet,const
> dvar_vector& delta, const prevariable& ui,const prevariable& vi,const
> prevariable& sigma1,const prevariable& sigma2)
> 
>     dvariable mu;
>     dvariable phi;
>     double y=obs(i,0);
>     dvariable bx=bet*obs(i)(1,m)+sigma1*ui;
>     if (value(bx)<10)
>     {
>       dvariable ebx=exp(bx);
>       mu=ebx/(1.0+ebx);
>     }
>     else
>     {
>       dvariable ebx=exp(-bx);
>       mu=1.0/(1.0+ebx);
>     }
>     phi=exp(-delta*obs(i)(1,m)+sigma2*vi);
>     f-=ln_beta_density(y,mu,phi);
>     if (iswitch(obs(i,m+1))==0)  // so that the prior only gets added once
>     {
>       f+=0.5*square(ui);
>       f+=0.5*square(vi);
>       iswitch(obs(i,m+1))=1;
>     }
> 
> REPORT_SECTION
>   //report << sqrt(norm2(u)/u.indexmax())*sigma1 << endl;
>   //report << sqrt(norm2(v)/v.indexmax())*sigma2 << endl;
> 
> GLOBALS_SECTION
> 
>   #include <admodel.h>
>   #include <df1b2fun.h>
> 
>   dvariable betaln(const prevariable& a,const prevariable& b )
>   {
>     return gammln(a)+gammln(b)-gammln(a+b);
>   }
> 
> 
>   dvariable ln_beta_density(double y,const prevariable & mu,
>     const prevariable& phi)
>   {
>     dvariable omega=mu*phi;
>     dvariable tau=phi-mu*phi;
>     dvariable lb=betaln(omega,tau);
>     dvariable d=(omega-1)*log(y)+(tau-1)*log(1.0-y)-lb;
>     return d;
>   }
> 
>   df1b2variable betaln(const df1b2variable& a,const df1b2variable& b )
>   {
>     return gammln(a)+gammln(b)-gammln(a+b);
>   }
> 
>   df1b2variable ln_beta_density(double y,const df1b2variable & mu,
>     const df1b2variable& phi)
>   {
>     df1b2variable omega=mu*phi;
>     df1b2variable tau=phi-mu*phi;
>     df1b2variable lb=betaln(omega,tau);
>     df1b2variable d=(omega-1)*log(y)+(tau-1)*log(1.0-y)-lb;
>     return d;
>   }
> 
> and the code for the simulator is
> 
> DATA_SECTION
>   init_int nplots
>   init_int nreps
>   init_int m
>   int nobs
>   init_vector bet(1,m)
>   init_vector delta(1,m)
>   init_number sigma1
>   init_number sigma2
>  !! nobs=nplots*nreps;
>   matrix obs(1,nobs,0,m+1)
>   vector u(1,nplots)
>   vector v(1,nplots)
>   matrix w(1,nplots,1,nreps)
>  LOC_CALCS
>   random_number_generator rng(921);
>   u.fill_randn(rng);
>   v.fill_randn(rng);
>   w.fill_randu(rng);
> 
>   int i=0;
>   for (int ii=1;ii<=nplots;ii++)
>   {
>     double mu;
>     double phi;
>     for (int j=1;j<=nreps;j++)
>     {
>       i++;
>       obs(i)(2,m).fill_randu(rng); // get some radnom observations
>       obs(i,1)=1; // for the mean
>       obs(i,m+1)=ii; // for the mean
>       double bx=bet*obs(i)(1,m)+sigma1*u(ii);
>       if (bx<10)
>       {
>         double ebx=exp(bx);
>         mu=ebx/(1.0+ebx);
>       }
>       else
>       {
>         double ebx=exp(-bx);
>         mu=1.0/(1.0+ebx);
>       }
>       phi=exp(-delta*obs(i)(1,m)-sigma2*v(ii));
>       double omega=mu*phi;
>       double tau=phi-mu*phi;
>       obs(i,0)=inv_cumd_beta_stable(omega,tau,w(ii,j),1.e-8);
>     }
>   }
>   ofstream ofs("output.dat");
>   ofs << "#n    m" << endl;
>   ofs << " " << nobs << "  " << m << endl;
>   ofs << "# obs " << endl;
>   ofs << obs << endl;
> 
>   ad_exit(1);
> PARAMETER_SECTION
>   objective_function_value f
>   init_vector bet(1,m)
>   init_vector delta(1,m)
> PROCEDURE_SECTION
>   int i;
>   dvariable mu;
>   dvariable phi;
>   for (i=1;i<=nobs;i++)
>   {
>     double y=obs(i,0);
>     dvariable bx=bet*obs(i)(1,m);
>     if (value(bx)<10)
>     {
>       dvariable ebx=exp(bx);
>       mu=ebx/(1.0+ebx);
>     }
>     else
>     {
>       dvariable ebx=exp(-bx);
>       mu=1.0/(1.0+ebx);
>     }
>     phi=exp(-delta*obs(i)(1,m));
>     f-=ln_beta_density(y,mu,phi);
>   }
> 
> GLOBALS_SECTION
> 
>   #include <admodel.h>
> 
>   dvariable betaln(const prevariable& a,const prevariable& b )
>   {
>     return gammln(a)+gammln(b)-gammln(a+b);
>   }
> 
> 
>   dvariable ln_beta_density(double y,const prevariable & mu,
>     const prevariable& phi)
>   {
>     dvariable omega=mu*phi;
>     dvariable tau=phi-mu*phi;
>     dvariable lb=betaln(omega,tau);
>     dvariable d=(omega-1)*log(y)+(tau-1)*log(1.0-y)-lb;
>     return d;
>   }
> 
> Finally input file for the simulator is
> 
> # nplots  nreps  m
>    50     25    2
> # bet
>    3.0  -5.0
> #delt
>   -4.0  3.0
> # sigma1  sigma2
>   .2       .5
> 
> and The parameter estimates from the model were
> # Number of parameters = 6  Objective function value = -1303.87  Maximum
> gradient component = 6.49673e-05
> # bet:
>  2.92653 -4.99330
> # delta:
>  -3.99151 2.94916
> # sigma1:
> 0.181131822789
> # sigma2:
> 0.522257834073
> # u:
> 
> The model first does a beta regression without the random effects
> in the first phase. these are the outputs One can see that adding the
> random effects  improved the parameter estimates considerably and also
> led to a big increase in the log-likelihood
> 
> # Number of parameters = 4  Objective function value = -1136.36  Maximum
> gradient component = 2.75648e-06
> # bet:
>  2.91619 -4.96991
> # delta:
>  -3.62180 2.67383
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 




More information about the Users mailing list