[R] design matrix construction question

David Winsemius dwinsemius at comcast.net
Tue Nov 3 06:15:15 CET 2009


On Nov 2, 2009, at 10:40 PM, Ben Bolker wrote:

>
>  with the following simple data frame
> dd = structure(list(z = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L
> ), .Label = c("a", "b"), class = "factor"), x = c(0.3, 0.2, 0.1,
> 0, 0, 0, 0.2, 0.3)), .Names = c("z", "x"), row.names = c(NA,
> -8L), class = "data.frame")
>
>  I would like know if it's possible to use model.matrix()
> to construct the following design matrix in some sensible way:
>
>  za zb
> 1  1  0
> 2  1  0
> 3  1  0
> 4  0  0
> 5  0  0
> 6  0  0
> 7  0  1
> 8  0  1
>
>  In other words, I want column 1 to be (z=="a" & x>0) and
> column 2 to be (z=="b" & x>0).  I can construct this matrix
> using
>
> sweep(model.matrix(~z-1,dd),1,dd$x>0,"*")
>
> and then stick it into lm.fit -- but is there a more
> elegant way to do this in general?

Elegance? You decide. But at least more economical from a keystroke  
perspective:

model.matrix(~z-1,dd)*(dd$x>0)
#------
   za zb
1  1  0
2  1  0
3  1  0
4  0  0
5  0  0
6  0  0
7  0  1
8  0  1
attr(,"assign")
[1] 1 1
attr(,"contrasts")
attr(,"contrasts")$z
[1] "contr.treatment


> I haven't found a formula combining
> (z-1) and I(x>0) that works, although I can imagine there is one.
>
> thanks
>  Ben Bolker
>
>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list