[R] A Tip: lm, glm, and retained cases

Prof Brian Ripley ripley at stats.ox.ac.uk
Thu Aug 28 13:44:25 CEST 2008


In R-devel

> na.action(GLM)

will work as the extractor.  The problem with attr(GLM$model, "na.action")
is that the 'model' component is optional, and with 
model.frame(ModelObject) that if the 'model' component has been omitted it 
will try to recreate the model frame from the currently visible objects of 
the name originally used.  (Because that is error-prone, we switched to 
model=TRUE as the default.)

In earlier versions of R, GLM$na.action is the copy you want.

However, I think if you care about omitted rows, you should use 
na.action=na.exclude, for then most auxiliary functions will give you 
results for all the rows.


On Tue, 26 Aug 2008, Marc Schwartz wrote:

> on 08/26/2008 07:31 PM (Ted Harding) wrote:
>> On 26-Aug-08 23:49:37, hadley wickham wrote:
>>> On Tue, Aug 26, 2008 at 6:45 PM, Ted Harding
>>> <Ted.Harding at manchester.ac.uk> wrote:
>>>> Hi Folks,
>>>> This tip is probably lurking somewhere already, but I've just
>>>> discovered it the hard way, so it is probably worth passing
>>>> on for the benefit of those who might otherwise hack their
>>>> way along the same path.
>>>>
>>>> Say (for example) you want to do a logistic regression of a
>>>> binary response Y on variables X1, X2, X3, X4:
>>>>
>>>>  GLM <- glm(Y ~ X1 + X2 + X3 + X4)
>>>>
>>>> Say there are 1000 cases in the data. Because of missing values
>>>> (NAs) in the variables, the number of complete cases retained
>>>> for the regression is, say, 600. glm() does this automatically.
>>>>
>>>> QUESTION: Which cases are they?
>>>>
>>>> You can of course find out "by hand" on the lines of
>>>>
>>>>  ix <- which( (!is.na(Y))&(!is.na(X1))&...&(!is.na(X4)) )
>>>>
>>>> but one feels that GLM already knows -- so how to get it to talk?
>>>>
>>>> ANSWER: (e.g.)
>>>>
>>>>  ix <- as.integer(names(GLM$fit))

This is a partial match to 'fitted', and will only work if default row 
names were used.

>>> Alternatively, you can use:
>>>
>>> attr(GLM$model, "na.action")
>>>
>>> Hadley
>>
>> Thanks! I can see that it works -- though understanding how
>> requires a deeper knowledge of "R internals". However, since
>> you've approached it from that direction, simply
>>
>>   GLM$model
>>
>> is a dataframe of the retained cases (with corresponding
>> row-names), all variables at once, and that is possibly an
>> even simpler approach!
>
> Or just use:
>
>   model.frame(ModelObject)
>
> as the extractor function...  :-)
>
> Another 'a priori' approach would be to use na.omit() or one of its
> brethren on the data frame before creating the model. Which function is
> used depends upon how 'na.action' is set.
>
> The returned value, or more specifically the 'na.action' attribute as
> appropriate, would yield information similar to Hadley's approach
> relative to which records were excluded.
>
> For example, using the simple data frame in ?na.omit:
>
> DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA))
>
>> DF
>  x  y
> 1 1  0
> 2 2 10
> 3 3 NA
>
> DF.na <- na.omit(DF)
>
>> DF.na
>  x  y
> 1 1  0
> 2 2 10
>
>> attr(DF.na, "na.action")
> 3
> 3
> attr(,"class")
> [1] "omit"
>
>
> So you can see that record 3 was removed from the original data frame
> due to the NA for 'y'.
>
> HTH,
>
> Marc Schwartz
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list