[R] forcing a zero level in contr.sum

Charles C. Berry cberry at tajo.ucsd.edu
Thu Jul 8 04:55:22 CEST 2010


If I surmise correctly, you want something like contr.sum but with the 
option to select the level with the row of '-1' and no column. Here '3' is 
that level:

> contr.sum(3)
   [,1] [,2]
1    1    0
2    0    1
3   -1   -1
>

relevel() and contr.sum()  generally will not do what you want without 
some awful twists and turns, I think.

Better to roll your own contrast function like this:

contr.mysum <- 
function (n, contrasts = TRUE, sparse = FALSE, base=length(levels))
{
     if (length(n) <= 1L) {
         if (is.numeric(n) && length(n) == 1L && n > 1L)
             levels <- seq_len(n)
         else stop("not enough degrees of freedom to define contrasts")
     }
     else levels <- n
     levels <- as.character(levels)
     cont <- .Diag(levels, sparse = sparse)
     if (contrasts) {
         cont <- cont[, -base, drop = FALSE]
         cont[base, ] <- -1
         colnames(cont) <- NULL
     }
     cont
}

# now pick the base you want:

# Here is a reproducible example

lm(weight~C(Diet,contr.mysum),ChickWeight) # default like contr.sum
lm(weight~C(Diet,contr.mysum,base=1),ChickWeight)
lm(weight~C(Diet,contr.mysum,base=2),ChickWeight)
lm(weight~C(Diet,contr.mysum,base=3),ChickWeight)
lm(weight~C(Diet,contr.mysum,base=4),ChickWeight)

Next time, please do set up code others can run as David W. requested.

See
 	library(help='datasets')

for good example datasets or see the posting guide for details on how to 
include your own data sets.

Chuck

p.s. I have never noticed that posters on this list stop answering a 
question just because others have already answered it. Try asking a 
question like 'How do I use a regex to solve this problem?' and start 
counting the responses. ;-)


On Wed, 7 Jul 2010, David Winsemius wrote:

> Please do not post with ambiguous questions lacking sufficient R code and 
> data to represent the problem.
>
> On Jul 7, 2010, at 4:41 PM, Bond, Stephen wrote:
>
>> Please, do not post if you do not know the answer. People will see this has 
>> answers and skip.
>
> More likely people will see that it has insufficient detail to answer ,,, and 
> then also skip. You still have not provided any insight into the structure of 
> "fixw".
>
>> 
>> I tried with
>> mat1=contrasts(fixw$snconv)
>> mat1=mat1[,-2]
>> summary(frm2sum <- glm(resp.frm ~ 
>> C(snconv,contr=mat1)+mprime+mshape,data=fixw,family="quasibinomial"))
>> 
>> the unwanted level is still there.
>
> But did you try:
>
> summary(frm2sum <- glm(resp.frm ~ relevel(snconv, ref="03") + mprime +
>                           mshape, data=fixw, family="quasibinomial"))
>
> (The above obviously not tested on "fixw"  in the absence of a reproducible 
> example, but was an analog modulo the minimal information offered was tested 
> on the quasipoisson example in help page of "family".)
>
> -- 
> David.
>
>>  Unbelievable.
>
> <snarky comment deleted>
>
>> 
>> Stephen Bond
>> 
>> -----Original Message-----
>> From: David Winsemius [mailto:dwinsemius at comcast.net]
>> Sent: Wednesday, July 07, 2010 4:15 PM
>> To: Bond, Stephen
>> Cc: r-help at r-project.org
>> Subject: Re: [R] forcing a zero level in contr.sum
>> 
>> 
>> On Jul 7, 2010, at 4:04 PM, Bond, Stephen wrote:
>> 
>> > Clarifying my question:
>> > 
>> > options(contrasts = c("contr.sum", "contr.poly"))
>> > > contrasts()
>> > [,1] [,2] [,3] [,4] [,5]
>> > 01    1    0    0    0    0
>> > 03    0    1    0    0    0
>> > 05    0    0    1    0    0
>> > 06    0    0    0    1    0
>> > 07    0    0    0    0    1
>> > 09   -1   -1   -1   -1   -1
>> > 
>> > I need to force the coefficient on level 03 to be zero.
>> 
>> ?factor
>> ?relevel
>> 
>> 
>> Perhaps worth a try:
>> 
>> fixw$snconv <- relevel(fixw$snconv, ref="03")
>> 
>> 
>> (But I wonder if using contr.sum will ever generally satisfy that
>> goal, since contr.sum calculates the difference from a grand mean and
>> this will only work if a) the GM=0 and b) there is only one term on
>> the RHS of the model, and c) probably a bunch of other restrictions.)
>> 
>> -- 
>> David.
>> > 
>> > Thank you.
>> > 
>> > Stephen Bond
>> > -----Original Message-----
>> > From: David Winsemius [mailto:dwinsemius at comcast.net]
>> > Sent: Wednesday, July 07, 2010 3:44 PM
>> > To: Bond, Stephen
>> > Cc: r-help at r-project.org
>> > Subject: Re: [R] forcing a zero level in contr.sum
>> > 
>> > 
>> > On Jul 7, 2010, at 3:13 PM, Bond, Stephen wrote:
>> > 
>> > > I need to use contr.sum and observe that some levels are not
>> > > statistically different from the overall mean of zero.
>> > > What is the proper way of forcing the zero estimate? It seems the
>> > > column corresponding to that level should become a column of zeros.
>> > > Is there a way to achieve that without me constructing the design
>> > > matrix?
>> > > Thank you.
>> > 
>> > lm( formula = z ~ x + y + 0,   ...)  _might_ do something close to
>> > what you want.
>> > 
>> > 
>> > 
>> > 
>> > David Winsemius, MD
>> > West Hartford, CT
>> > 
>> 
>> David Winsemius, MD
>> West Hartford, CT
>> 
>> ______________________________________________
>> 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.
>
> David Winsemius, MD
> West Hartford, CT
>
> ______________________________________________
> 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.
>

Charles C. Berry                            (858) 534-2098
                                             Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu	            UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901



More information about the R-help mailing list