[R-sig-ME] Accessing and updating lmer objects

Ben Bolker bbolker at gmail.com
Thu May 8 20:01:44 CEST 2014

On 14-05-08 01:30 PM, Vincent Dorie wrote:

> After you install new random effect covariance parameters into a
  merMod object, you need to propagate the changes to the various
  dependent matrix decompositions. For a lmm, it looks something like:

> newTheta <- c(1, 0, 1)
> fm at pp$setTheta(newTheta)
> fm at pp$updateDecomp()
> fm at resp$updateMu(fm at pp$linPred(0.0))
> fm at pp$updateRes(fm at resp$wtres);
> fm at pp$solve()
> fm at resp$updateMu(fm at pp$linPred(1.0))

> And then to get the deviance for the object,
> fm at resp$objective(fm at pp$ldL2(), fm at pp$ldRX2(), fm at pp$sqrL(1.0))

>  That's the R equivalent of what the C++ code does for each
> optimization step. If you're working with a glmm, the process is
> similar but you can see how to do it much more easily by calling
> glmer with devFunOnly = TRUE and examining the resulting function.

> In fact, if all you want to do is install the parameters, you can
  grab the deviance function for a lmm/glmm and simply call that with
  your desired parameters to get an updated object. However, if you
  want to interject modifications you will need to modify the above

  Thanks, Vince.  I think Asaf was trying to follow the step-by-step
procedure (not just calculate the deviance for a new set of procedures),
so this is exactly what he needs -- although it *might* be somewhat
higher-level than the description in the Bates manual referred to
previously. (If you look at the code in src/predModule.cpp::setTheta,
the payload is

	int    *lipt = d_Lind.data();
	double *LamX = d_Lambdat.valuePtr(), *thpt = d_theta.data();
	for (int i = 0; i < d_Lind.size(); ++i) {
	    LamX[i] = thpt[lipt[i] - 1];

which is more or less equivalent to the R code referenced earlier.)

  I really would recommend that people interested in following the
details check out https://github.com/lme4/lme4pureR ... especially
https://github.com/lme4/lme4pureR/blob/master/R/JSS.R ...


> Vince
> On May 6, 2014, at 3:27 PM, Ben Bolker wrote:
>> On 14-05-06 12:11 AM, Asaf Weinstein wrote:
>>> Hi,
>>> I am trying to follow the lme4 manual (Bates) where objects returned by
>>> lmer() are accessed in the following way (for example):
>>> fm08 at re@Lambda at x[] <- c(1,0,1)[fm08 at re@Lind]
>>> If I understand correctly, accessing with "@" no longer works, and to
>>> obtain, eg, Lambda, I'll need to use
>>> getME(fm08, 'Lambda')
>>> instead.
>>> But how do I update an object (not just view it)? In other words, what
>>> command replaces
>>> fm08 at re@Lambda at x[] <- c(1,0,1)[fm08 at re@Lind] ?
>>   I *believe* (without much testing) that if m is a merMod object this
>> would be something like
>> m at pp$Lambdat at x[] <- c(1,0,1)[m at pp$Lind]
>> but I'm afraid that you might run into a _lot_ of roadblocks if you try
>> to work your way through the old manual with the new lme4.  We are
>> working on updated documentation ... it might make more sense to work
>> either with lme4.0, or with the lme4pureR package from Github ...
>>  Ben Bolker
>> _______________________________________________
>> R-sig-mixed-models at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models

More information about the R-sig-mixed-models mailing list