Re: R-beta: Help accessing variable from a formula

Thomas Lumley (thomas@biostat.washington.edu)
Mon, 3 Nov 1997 09:21:16 -0800 (PST)


Date: Mon, 3 Nov 1997 09:21:16 -0800 (PST)
From: Thomas Lumley <thomas@biostat.washington.edu>
To: Murray Keir <mjk@maths.uq.edu.au>
Subject: Re: R-beta: Help accessing variable from a formula
In-Reply-To: <Pine.SUN.3.91.971101130233.27510A-100000@axiom.maths.uq.edu.au>

On Sat, 1 Nov 1997, Murray Keir wrote:
> 
> I have a program which is being feed a formula.  One of the terms in 
> the formula is going to be r(variablename).  r just returns the 
> original variable.
> 
> r <- function(x) x
> 
> The formula is something like 
> 
> rglm(y ~ x + r(Subject))
> 
> What I want to do is get access to the variable Subject directly.  Can 
> anyone give me any suggestions for doing this?

The terms() command contains some magic for doing this 
If you type
	R> Terms<-terms(y ~ x + r(Subject),specials="r")
the resulting terms object has an attribute "specials" 
	R> attr(Terms,"specials")$r
	[1] 3
which says that the third column of the model frame will contain the r()
term. Multiple terms are possible
        R> Terms<-terms(y ~ x + r(Subject)+r(Object),specials="r")
        R> attr(Terms,"specials")$r
	[1] 3 4

You may then want to remove the r() from the formula before calling
model.matrix().  This is a bit harder, but there is code in the survival4
package to do it.  The function untangle.specials() gives the position of
the r() in the right-hand side of the formula object, and the survival4
package contains a "[.terms" method that allows terms to be removed
	R> untangle.specials(Terms,"r")
	$vars
	[1] "r(Subject)" "r(Object)" 

	$terms
	[1] 2 3
	R> Terms<-Terms[-c(2,3)]
	R> Terms
	y ~ x
	attr(,"variables")
	list(y, x)
	attr(,"factors")
	  x
	y 0
	x 1
  and so on...

If you want to include the code for untangle.specials() in your own
package you should probably ask Terry Therneau for permission -- the
survival4 code is not GPL -- but I imagine he would be happy for it to be
used with acknowledgement. I wrote the "[.terms" method, so there's no
problem there. 


Thomas Lumley
------------------------------------------------------+------
Biostatistics		: "Never attribute to malice what  :
Uni of Washington	:  can be adequately explained by  :
Box 357232		:  incompetence" - Hanlon's Razor  :
Seattle WA 98195-7232	:				   :
------------------------------------------------------------


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=