From ken.knoblauch at inserm.fr  Wed Feb 25 14:10:43 2009
From: ken.knoblauch at inserm.fr (Kenneth Knoblauch)
Date: Wed, 25 Feb 2009 14:10:43 +0100
Subject: [Rd] [R] length 1 offset in glm (& lm)
In-Reply-To: <49A53E1B.4090004@warwick.ac.uk>
References: <49A53E1B.4090004@warwick.ac.uk>
Message-ID: <20090225141043.nbuf8d5pts0s0wgk@imp.inserm.fr>

Hi,

Thanks for responding/noticing.  I was going to wait a few more days
while contemplating how to get more notice for the post.
It occurred to me later that it should have gone to R-devel as you
have forwarded it.  I'll include my example (with a fix) for refresher

c1 <- structure(list(Contr = c(0.028, 0.043, 0.064, 0.097, 0.146, 0.219
  ), Correct = c(34L, 57L, 94L, 152L, 160L, 160L), Incorrect = c(126L,
  103L, 66L, 8L, 0L, 0L)), .Names = c("Contr", "Correct", "Incorrect"
  ), row.names = c(NA, 6L), class = "data.frame")

glm(cbind(Correct, Incorrect) ~ Contr - 1, binomial,
         data = c1, offset = qlogis(0.25))

Error in model.frame.default(formula = cbind(Correct, Incorrect) ~ Contr -  :
    variable lengths differ (found for '(offset)')

lm(cbind(Correct, Incorrect) ~ Contr - 1, binomial,
         data = c1, offset = rep(qlogis(0.25), nrow(c1))) ## which works

The line which throws the error is:

mf <- eval(mf, parent.frame())

I must have done something additional of which I did not keep a record,
but if I change the nrow(Y) in the code fragment to nrow(data),
that works, as in

if (!is.null(offset)) {
          if (length(offset) == 1)
              offset <- rep(offset, NROW(data))
          else if (length(offset) != NROW(data))
              stop(gettextf("number of offsets is %d should equal %d
(number of observations)",
                  length(offset), NROW(data)), domain = NA)
      }
     mf$offset <- offset
     mf <- eval(mf, parent.frame())

Thank you.

Ken



Quoting Heather Turner <Heather.Turner at warwick.ac.uk>:

> This post about length 1 offsets on R help seems to have been ignored
> (sorry deleted original email - is there a way to continue thread in
> this case?)
>
> https://stat.ethz.ch/pipermail/r-help/2009-February/189352.html
>
> It does seem to be a bug, in that glm does not behave as documented. In
> fact the same bug applies to lm as well.
>
> I don't think the suggested fix works though - Y isn't available until
> the model frame is evaluated. Moreover you would want to evaluate the
> offset as part of the model frame, to take care of the search path,
> subset and na.action.
>
> One possibility would be to modify model.frame to recycle variables of
> length one. This would be a potentially useful feature from my point of
> view as offset(constant) could replace Const(constant) in gnm, which is
> basically a work around for this problem in the case of specifying a
> constant in a nonlinear term. However, this solution may have undesired
> side-effects and I don't feel too strongly about it as there are various
>  work-arounds. Perhaps the simplest solution would be to modify the docs
> so that offsets of length one are disallowed - it is easy enough for the
> user to create a vector of the right length as necessary.
>
> Best regards,
>
> Heather
>



-- 
Ken Knoblauch
Inserm U846
Stem-cell and Brain Research Institute
Department of Integrative Neurosciences
18 avenue du Doyen L?pine
69500 Bron
France
tel: +33 (0)4 72 91 34 77
fax: +33 (0)4 72 91 34 61
portable: +33 (0)6 84 10 64 10
http://www.sbri.fr/members/kenneth-knoblauch.html



[Rd] [R] length 1 offset in glm (& lm)
Kenneth Knoblauch