s-news
[Top] [All Lists]

Re: [S] SUMMARY: reference category in factors (was contr.treatment

To: V.Moreno@ico.scs.es
Subject: Re: [S] SUMMARY: reference category in factors (was contr.treatment
From: Prof Brian Ripley <ripley@stats.ox.ac.uk>
Date: Wed, 27 May 1998 11:14:15 +0100 (BST)
Cc: s-news@wubios.wustl.edu
Reply-to: Prof Brian Ripley <ripley@stats.ox.ac.uk>
Sender: owner-s-news@wubios.wustl.edu
> From: Victor Moreno <V.Moreno@ico.scs.es>
> 
> After some thought, this is a quick solution to changing the 
> reference category of a factor in a model. I have done minimal 
> testing and some bugs may remain, so please use with caution. 
> 
> Thanks to Prof. Ripley, and S.D.Byers for answering previous query.

This is not what I suggested, seems needlessly complicated and gives
ugly (IMHO) output.  Compare this with

> library(MASS)
> options(contrasts=c("contr.treatment", "contr.poly"))
> summary(glm(Days ~ Age, family=poisson, data=quine))

Coefficients:
                 Value Std. Error    t value 
(Intercept)  2.6981275 0.04987727  54.095333
      AgeF1 -0.2864900 0.06657498  -4.303268
      AgeF2  0.3487780 0.06059414   5.755970
      AgeF3  0.2777121 0.06349276   4.373918

Quine <- quine
Quine$Age <- factor(quine$Age, levels=c("F3", "F0", "F1", "F2"))
summary(glm(Days ~ Age, family=poisson, data=Quine))

> Coefficients:
                  Value Std. Error    t value 
(Intercept)  2.97583958 0.03928853  75.743220
      AgeF0 -0.27771209 0.06349276  -4.373918
      AgeF1 -0.56420205 0.05905992  -9.553044
      AgeF2  0.07106596 0.05222543   1.360754

You could use

relevel <- function(x, ref, ...) UseMethod("relevel")
relevel.default <- function(x, ref, ...) stop("relevel only for factors")
relevel.ordered <- function(x, ref, ...) stop("relevel only for factors")
relevel.factor <- function(x, ref, ...)
{
  lev <- levels(x); nlev <- length(lev)
  if(is.character(ref)) ref <- match(ref, lev)
  if(is.na(ref)) stop("ref must be an existing level")
  lev <- levels(x); nlev <- length(x)
  if(ref < 1 || ref > nlev) stop(paste("ref =", ref, "must be in 1 :", nlev))
  factor(x, levels = lev[c(ref, seq(along=lev)[-ref])] )
}

Quine <- quine
Quine$Age <- relevel(quine$Age, "F3") # or relevel(quine$Age, 4)

You could even use
summary(glm(Days ~ relevel(Age, "F3"), family=poisson, data=quine))


-- 
Brian D. Ripley,                  ripley@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 272860 (secr)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

-----------------------------------------------------------------------
This message was distributed by s-news@wubios.wustl.edu.  To unsubscribe
send e-mail to s-news-request@wubios.wustl.edu with the BODY of the
message:  unsubscribe s-news

<Prev in Thread] Current Thread [Next in Thread>