[R-sig-ME] plot log transformed variable with Effects package
Ben Bolker
bbolker at gmail.com
Thu Oct 10 00:16:43 CEST 2013
Ben Bolker <bbolker at ...> writes:
>
> <John.Morrongiello <at> ...> writes:
>
> >
> > Hi list
> >
> > I'm having trouble plotting a mixed model that includes log transformed
> (or any transformed) terms.
> >
> library(lme4)
> library(effects)
> data(cake, package="lme4")
> >
> > ###this works
> fm1 <- lmer(angle ~ recipe * temperature
> + (1|recipe:replicate),
> cake, REML = FALSE)
>
> plot(Effect(c('recipe','temperature'), fm1))
> ##but this doesn't (log transformed angle)
>
> fm2 <- lmer(log(angle) ~ recipe * temperature + (1|recipe:replicate),
> cake, REML = FALSE)
>
> plot(Effect(c('recipe','temperature'), fm2))
> This is probably something to take up with the maintainer of
> the 'effects' package, who in turn might have to consult the lme4
> maintainers. The proximal problem occurs in
>
> plot -> Effect -> Effect.merMod -> Effect.mer -> Effect ->
> mer.to.glm
>
> There is a 'data' object that appears to be coming from the
> model.frame() of the original object, but I haven't tracked its
> source down yet -- but the problem is that it has log(angle) rather
> than angle as a column ...
>
>
with a bit more work, I have come up with a way to
hack the effects package to make this work. The function below
needs to be defined, then the arguments of the effects:::mer.to.glm
function have to be changed from
function(mod, data=model.frame(mod))
to
function(mod, data=xdata(mod))
You can hack the package yourself and/or request the maintainer
to add this capability ...
## modeled after stats::expand.model.frame
## expand the model frame to include any variables present
## in the original 'data' object but missing from the model frame
## potentially fragile:
## * depends on 'data' still being present in the original environment
## * doesn't check for any potential mishaps
xdata <- function(model, envir=environment(formula(model))) {
fr <- model.frame(model)
data <- eval(getCall(model)$data,envir)
## find missing variables
newvars <- setdiff(all.vars(formula(model)),names(fr))
if (length(newvars)>0) {
fr <- data.frame(fr,data[newvars],check.names=FALSE)
}
fr
}
More information about the R-sig-mixed-models
mailing list