plot log transformed variable with Effects package
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
}