# [R] Name for factor's levels with contr.sum

Christoph Buser buser at stat.math.ethz.ch
Thu Jul 14 12:28:15 CEST 2005

```This is exactly what I've been looking for (without success)
when I was speaking about a more elegant and general solution.

Nevertheless if a user is aware what contr.sum calculates, it is
practical to have an annotation.

Thank you very much for the solution.

Regards,

Christoph Buser

--------------------------------------------------------------
Christoph Buser <buser at stat.math.ethz.ch>
Seminar fuer Statistik, LEO C13
ETH (Federal Inst. Technology)	8092 Zurich	 SWITZERLAND
phone: x-41-44-632-4673		fax: 632-1228
http://stat.ethz.ch/~buser/
--------------------------------------------------------------

Prof Brian Ripley writes:
> One way to do this generally is to make a copy of contr.sum, rename it,
> and set the dimnames appropriately.
>
> I think contr.treatment is misleading (it labels contrasts of two levels
> by just one of them), and Christoph's labels are informative but
> impractically long.  But if you want to label each contrast by the level
> it contrasts with the rest,
>
>  	cont <- array(0, c(lenglev, lenglev - 1),
>                        list(levels, levels[-lenglev]))
>
> in a modified contr.sum will do it. E.g.
>
> > z <- factor(letters[1:3])
> > contr.treatment(z)
>    b c
> a 0 0
> b 1 0
> c 0 1
> > contr.sum(z)
>    [,1] [,2]
> a    1    0
> b    0    1
> c   -1   -1
> > mycontr.sum(z)
>     a  b
> a  1  0
> b  0  1
> c -1 -1
>
>
>
>
> On Wed, 13 Jul 2005, Christoph Buser wrote:
>
> > Dear Ghislain
> >
> > I do not know a general elegant solution, but for some
> > applications the following example may be helpful:
> >
> > ## Artificial data for demonstration: group is fixed, species is random
> > dat <- data.frame(group = c(rep("A",20),rep("B",17),rep("C",24)),
> >                  species = c(rep("sp1", 4), rep("sp2",5),   rep("sp3",5),
> >                    rep("sp4",6),  rep("sp5",2),  rep("sp6",5),  rep("sp7",3),
> >                    rep("sp8",3), rep("sp9",4), rep("sp10",6),  rep("sp11",6),
> >                    rep("sp12",6), rep("sp13",6)),
> >                  area = rnorm(61))
> >
> > ## You can attach a contrast at your fixed factor of interest "group"
> > ## Create the contrast you like to test (in our case contr.sum for 3
> > ## levels)
> > mat <- contr.sum(3)
> > ## You can add the names you want to see in the output
> > ## Be carefull that you give the correct names to the concerned
> > ## column. Otherwise there is the big danger of misinterpretation.
> > colnames(mat) <- c(": A against rest", ": B against rest")
> > ## Attatch the contrast at your factor "group"
> > dat[,"group"] <- C(dat[,"group"],mat)
> > ## Now calculate the lme
> > library(nlme)
> > reg.lme <- lme(area ~ group, data = dat, random = ~ 1|species)
> > summary(reg.lme)
> >
> > Maybe someone has a better idea how to do it generally.
> >
> > Hope this helps
> >
> > Christoph Buser
> >
> > --------------------------------------------------------------
> > Christoph Buser <buser at stat.math.ethz.ch>
> > Seminar fuer Statistik, LEO C13
> > ETH (Federal Inst. Technology)	8092 Zurich	 SWITZERLAND
> > phone: x-41-44-632-4673		fax: 632-1228
> > http://stat.ethz.ch/~buser/
> > --------------------------------------------------------------
> >
> >
> > Ghislain Vieilledent writes:
> > > Good morning,
> > >
> > > I used in R contr.sum for the contrast in a lme model:
> > >
> > > > options(contrasts=c("contr.sum","contr.poly"))
> > > > Septo5.lme<-lme(Septo~Variete+DateSemi,Data4.Iso,random=~1|LieuDit)
> > > > intervals(Septo5.lme)\$fixed
> > > lower est. upper
> > > (Intercept) 17.0644033 23.106110 29.147816
> > > Variete1 9.5819873 17.335324 25.088661
> > > Variete2 -3.3794907 6.816101 17.011692
> > > Variete3 -0.5636915 8.452890 17.469472
> > > Variete4 -22.8923812 -10.914912 1.062558
> > > Variete5 -10.7152821 -1.865884 6.983515
> > > Variete6 0.2743390 9.492175 18.710012
> > > Variete7 -23.7943250 -15.070737 -6.347148
> > > Variete8 -21.7310554 -12.380475 -3.029895
> > > Variete9 -27.9782575 -17.480555 -6.982852
> > > DateSemi1 -5.7903419 -1.547875 2.694592
> > > DateSemi2 3.6571596 8.428417 13.199675
> > > attr(,"label")
> > > [1] "Fixed effects:"
> > >
> > > How is it possible to obtain a return with the name of my factor's levels as
> > > with contr.treatment ?
> > >
> > > Thanks for you help.
> > >
> > > --
> > > Ghislain Vieilledent
> > > 30, rue Bernard Ortet 31 500 TOULOUSE
> > > 06 24 62 65 07
> > >
> > > 	[[alternative HTML version deleted]]
> > >
> > > ______________________________________________
> > > R-help at stat.math.ethz.ch mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> >
>
> --
> 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

```