[R-sig-ME] reference category in varIdent function (once again)

James Pustejovsky jepu@to @end|ng |rom gm@||@com
Mon Dec 30 15:50:01 CET 2024


Regarding your P.S., I've added a callout to the post noting that the bug
has been squashed.
https://jepusto.com/posts/bug-in-nlme-getVarCov/

Kind Regards,
James

On Sun, Dec 29, 2024 at 5:23 PM Sebastian Meyer <seb.meyer using fau.de> wrote:

> Glad to hear that helped. Your exemplification of current varIdent
> behaviour is also helpful, thanks. I'll revisit the bug with a closer
> look next year.
>
> In principle, it would be better for the reference level to be based on
> the factor levels, but as you say, nlme's code base is very old, which
> means many publications (implicitly) rely on the current behaviour, so
> semantics or defaults won't be changed easily. Still, bugs should be
> fixed -- and it should be possible to choose the reference level.
>
> Best regards,
>
>         Sebastian Meyer
>
> PS: The getVarCov() bug that is linked in your report (to another post)
> was fixed a while ago in 2020 (nlme version 3.1-150), i.e., the
> `all.equal(V_raw, V_sorted)` tests now give TRUE. It might be worth
> noting this somewhere.
>
>
> Am 29.12.24 um 22:40 schrieb James Pustejovsky:
> > Hi Sebastian,
> >
> > Thanks for your reply. This helped me figure out how to control the
> > reference level for the particular model I'm working on. I wrote up what
> > I've learned (in an excessive degree of detail) here:
> > https://jepusto.com/posts/varIdent-function-in-nlme/
> > <https://jepusto.com/posts/varIdent-function-in-nlme/>
> >
> > James
> >
> > On Mon, Dec 23, 2024 at 10:40 AM Sebastian Meyer <seb.meyer using fau.de
> > <mailto:seb.meyer using fau.de>> wrote:
> >
> >     I think it is unfortunate that varIdent() selects the reference
> >     category
> >     based on how the data is sorted (using the first level that occurs).
> >     There is also a corresponding bug report
> >     <https://bugs.r-project.org/show_bug.cgi?id=18505
> >     <https://bugs.r-project.org/show_bug.cgi?id=18505>>.
> >
> >     Your example illustrates an additional issue with this behaviour,
> >     because lme() internally reorders the data by the grouping factor(s)
> >     before initialization, so the order of that factor ('Subject' in your
> >     example, with first level "M16", so male) will indirectly determine
> the
> >     reference level of varIdent(), regardless of how your data or strata
> >     levels are ordered originally.
> >
> >     It seems that only if there are more than two strata, the reference
> >     level for varIdent() can be chosen via a named initial parameter
> >     'value', leaving out the desired reference level, but I haven't
> tested
> >     if this works as intended with both gls() and lme(). It would then
> make
> >     sense to support such a choice also in the case of only two strata,
> so
> >     for a single parameter.
> >
> >     Best wishes,
> >
> >              Sebastian Meyer
> >
> >
> >     Am 20.12.24 um 20:39 schrieb James Pustejovsky:
> >      > Greetings,
> >      >
> >      > I'm trying to fit a linear mixed effect model using nlme::lme()
> that
> >      > includes heteroskedastic variances by group, where the variance
> >     for one
> >      > group is fixed to a specific value. I *think* I can do this using
> >      > varIdent() and setting lmeControl(sigma = x) for a specified
> value x.
> >      > However, I've run into what is evidently an old problem: that
> >     there doesn't
> >      > appear to be any way to control the reference level of varIdent().
> >      >
> >      > As was noted in a very old post to R-SIG-mixed-models (
> >      >
> >     https://stat.ethz.ch/pipermail/r-sig-mixed-models/2013q3/020582.html
> >     <
> https://stat.ethz.ch/pipermail/r-sig-mixed-models/2013q3/020582.html>),
> the
> >      > reference level of varIdent() within an lme() call is set to the
> most
> >      > common level of the grouping factor. For reasons that are too
> >     involved to
> >      > get into, I need to set the reference level to something else (in
> >     fact, the
> >      > least frequently occurring level), so it seems I'm stuck.
> >      >
> >      > Curiously, the behavior of varIdent() within a gls() call is a bit
> >      > different. As documented in this StackOverflow (
> >      >
> >
> https://stackoverflow.com/questions/75929847/reference-category-in-varident-function-nlme-package-depends-on-data-order
> <
> https://stackoverflow.com/questions/75929847/reference-category-in-varident-function-nlme-package-depends-on-data-order
> >),
> >      > the reference level used within gls() depends on the sort order
> >     of the
> >      > data. I've included below a minimal working example that
> >     demonstrates the
> >      > difference in behavior.
> >      >
> >      > Does anyone know of any work-around for setting the reference
> >     level of
> >      > varIdent() within an lme() call? I'd be grateful for any
> >     leads/suggestions
> >      > on what I could do (up to and including to just use a different
> >     package
> >      > already).
> >      >
> >      > Thanks,
> >      > James
> >      >
> >      >
> >      >
> >
>  ----------------------------------------------------------------------------
> >      > library(nlme)
> >      >
> >      > # Make reversed factor
> >      > table(Orthodont$Sex)
> >      > Orthodont$Sex_rev <- Orthodont$Sex
> >      > levels(Orthodont$Sex_rev) <- rev(levels(Orthodont$Sex))
> >      > table(Orthodont$Sex_rev)
> >      >
> >      > Ortho_male_first <- Orthodont[order(Orthodont$Sex),]
> >      > Ortho_female_first <- Orthodont[order(Orthodont$Sex, decreasing =
> >     TRUE),]
> >      >
> >      > # Fit gls models with heteroskedastic variance
> >      > gls1 <- gls(
> >      >    distance ~ age + Sex,
> >      >    weights = varIdent(form = ~ 1 | Sex),
> >      >    data = Ortho_male_first
> >      > )
> >      > gls2 <- update(gls1, data = Ortho_female_first)
> >      > gls3 <- update(gls1, weights = varIdent(form = ~ 1 |Sex_rev))
> >      > gls4 <- update(gls3, data = Ortho_female_first)
> >      >
> >      > # Parameterization depends on sort order
> >      > coef(gls1$modelStruct$varStruct)
> >      > coef(gls2$modelStruct$varStruct)
> >      > # But not on factor level order
> >      > coef(gls3$modelStruct$varStruct)
> >      > coef(gls4$modelStruct$varStruct)
> >      >
> >      > # Fit lme models with heteroskedastic level-1 variance
> >      >
> >      > lme1 <- lme(
> >      >    distance ~ age + Sex,
> >      >    random = ~ 1,
> >      >    weights = varIdent(form = ~ 1 | Sex),
> >      >    data = Ortho_male_first
> >      > )
> >      > lme2 <- update(lme1, data = Ortho_female_first)
> >      > lme3 <- update(lme1, weights = varIdent(form = ~ 1 |Sex_rev))
> >      > lme4 <- update(lme3, data = Ortho_female_first)
> >      >
> >      > # Parameterization depends neither on sort order nor on factor
> >     level order
> >      > coef(lme1$modelStruct$varStruct)
> >      > coef(lme2$modelStruct$varStruct)
> >      > coef(lme3$modelStruct$varStruct)
> >      > coef(lme4$modelStruct$varStruct)
> >      >
> >      >       [[alternative HTML version deleted]]
> >      >
> >      > _______________________________________________
> >      > R-sig-mixed-models using r-project.org
> >     <mailto:R-sig-mixed-models using r-project.org> mailing list
> >      > https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models
> >     <https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models>
> >
>

	[[alternative HTML version deleted]]



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