[R] lmer and mixed effects logistic regression
Spencer Graves
spencer.graves at pdf.com
Sat Jun 17 18:46:41 CEST 2006
'lmer' RETURNS AN ERROR WHEN SAS NLMIXED RETURNS AN ANSWER
Like you, I would expect lmer to return an answer when SAS
NLMIXED does, and I'm concerned that it returns an error message instead.
Your example is not self contained, and I've been unable to
get the result you got. This could occur for several reasons. First,
what do you get for "sessionInfo()"? I got the following:
sessionInfo()
Version 2.3.1 (2006-06-01)
i386-pc-mingw32
attached base packages:
[1] "methods" "stats" "graphics" "grDevices" "utils" "datasets"
[7] "base"
other attached packages:
lme4 lattice Matrix
"0.995-2" "0.13-8" "0.995-10"
If you are using different versions of lmer, lattice and / or
Matrix, please update.packages and try again. If that does not fix the
problem, could you please try to find a self-contained example that is
as simple as possible and still generates the same error message? Then
send that to this list.
When I ran your example limited only to the observations you
listed, I got a different result:
Warning messages:
1: fitted probabilities numerically 0 or 1 occurred in: glm.fit(X, Y,
weights = weights, offset = offset, family = family,
2: IRLS iterations for PQL did not converge
We get this these "Warning messages" because all the values
of "response" are constant within each level of "id". With data like
this, the likelihood will be maximized by sending Std.Dev.(id) to Inf;
when 'lmer' quit, Std.Dev.(id) was already at 58779, which
computationally is moderately close to Inf for the current "lmer"
algorithm.
How many different patterns of "response" by "id" do you have?
With all 0's, the random adjustment to "(Intercept)" for that "id",
ignoring the Bayesian shrinkage, is "-Inf". With all 1's, this random
adjustment would be "+Inf". With two observations for a subject, if
they are different, this random adjustment would exactly cancel the
estimate of the fixed-effect for "(Intercept"). Do you have only these
three patterns, all 0's, all 1's, and half 0's, half 1's? If yes, that
might explain why Std.Dev.(id) wants to go to Inf.
I don't know exactly how many different patterns you need, but
you should be able to have some levels of "id" with all 0's or all 1's
as long as those did not dominate, as they do in this cut down example.
If this is the problem, then SAS NLMIXED could be achieving false
convergence and either not telling you about it or reporting it so
quietly you have not reported it here.
CREATING A REPRODUCIBLE EXAMPLE
I'm not eager to experiment with a large complicated example.
You could help us help you by trying to produce a simpler,
self-contained example. For example, do you get the same answer when
you delete 'age' from the model:
lmer(response~(1|id),data=gdx,family=binomial)
If yes, then you could easily just count the number of levels of "id"
that have all 0's, all 1's, (0, 1) = (1, 0), etc. Then write one or two
lines that would generate that special case and submit that to this
listserve. Before you do, however, I encourage you to experiment to
find small numbers of replicates that reproduce the error you get. Then
submit that to this list.
STARTING VALUES?
The help page for "lmer" describes the following argument:
start: a list of relative precision matrices for the random effects.
This has the same form as the slot '"Omega"' in a fitted
model. Only the upper triangle of these symmetric matrices
should be stored.
To understand this, it might help to experiment with one of
the examples on this help page:
> fm1 <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
> fm1 at Omega
$Subject
2 x 2 Matrix of class "dpoMatrix"
(Intercept) Days
(Intercept) 1.0746247 -0.2942832
Days -0.2942832 18.7549595
Just taking a guess, I tried the following:
fm1. <- lmer(Reaction ~ Days+(Days|Subject), sleepstudy,
start=list(Subject=diag(1:2)))
fm1.c <- lmer(Reaction ~ Days+(Days|Subject), sleepstudy,
start=list(Subject=array(1, .1, .1, 2),
dim=c(2,2)))
Both of these returned the same answer. Starting values are
only required for the random effects, because these models are all
"plinear" in the sense described in the "nls" documentation.
For "glmmPQL", I was able to get the "update" function to work.
Thus, if you can get an answer with one model, you can use that as an
input to "update". I would expect "update" to try to use the parameter
estimates from one model fit as starting values for the modification,
where it can find a way to do that.
Hope this helps.
Spencer Graves
Rick Bilonick wrote:
> I'm using FC4 and R 2.3.1 to fit a mixed effects logistic regression.
> The response is 0/1 and both the response and the age are the same for
> each pair of observations for each subject (some observations are not
> paired). For example:
>
> id response age
> 1 0 30
> 1 0 30
>
> 2 1 55
> 2 1 55
>
> 3 0 37
>
> 4 1 52
>
> 5 0 39
> 5 0 39
>
> etc.
>
> I get the following error:
>
>> (lmer(response~(1|id)+age,data=gdx,family=binomial))
> Error in deviance(.Call("mer_coefGets", x, pars, 2, PACKAGE =
> "Matrix")) :
> Leading minor of order 2 in downdated X'X is not positive
> definite
>
> Similar problem if I use quasibinomial.
>
> If I use glm, of course it thinks I have roughly twice the number of
> subjects so the standard errors would be smaller than they should be.
>
> I used SAS's NLMIXED and it converged without problems giving me
> parameter estimates close to what glm gives, but with larger standard
> errors. glmmPQL(MASS) gives very different parameter estimates.
>
> Is it reasonable to fit a mixed effects model in this situation?
>
> Is there some way to give starting values for lmer and/or glmmPQL?
>
> Rick B.
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
More information about the R-help
mailing list