[R] trouble automating formula edits when log or * are present; update trouble

Bert Gunter gunter.berton at gene.com
Tue May 29 21:56:47 CEST 2012


or use quote()...

-- Bert

On Tue, May 29, 2012 at 10:48 AM,  <cberry at tajo.ucsd.edu> wrote:
> Paul Johnson <pauljohn32 at gmail.com> writes:
>

>> do.call( substitute, list( frm, list( x = as.name("z") ) ) )

## or using quote()
>>do.call( substitute, list( frm, list( x = quote(z))))



> y ~ log(z) * (w + u)
>
>
> HTH,
>
> Chuck
>
>
>>
>> I have working code to finish that part of the problem, but it fails
>> when the formula is more complicated. If the formula has log(x1) or
>> x1:x2, the update code I'm testing doesn't get right.
>>
>> Here's the test code:
>>
>> ##PJ
>> ## 2012-05-29
>> dat <- data.frame(x1=rnorm(100,m=50), x2=rnorm(100,m=50),
>> x3=rnorm(100,m=50), y=rnorm(100))
>>
>> m1 <- lm(y ~ log(x1) + x1 + sin(x2) + x2 + exp(x3), data=dat)
>> m2 <- lm(y ~ log(x1) + x2*x3, data=dat)
>>
>> suffixX <- function(fmla, x, s){
>>     upform <- as.formula(paste0(". ~ .", "-", x, "+", paste0(x, s)))
>>     update.formula(fmla, upform)
>> }
>>
>> newFmla <- formula(m2)
>> newFmla
>> suffixX(newFmla, "x2", "c")
>> suffixX(newFmla, "x1", "c")
>>
>> The last few lines of the output. See how the update misses x1 inside
>> log(x1) or in the interaction?
>>
>>
>>> newFmla <- formula(m2)
>>> newFmla
>> y ~ log(x1) + x2 * x3
>>> suffixX(newFmla, "x2", "c")
>> y ~ log(x1) + x3 + x2c + x2:x3
>>> suffixX(newFmla, "x1", "c")
>> y ~ log(x1) + x2 + x3 + x1c + x2:x3
>>
>> It gets the target if the target is all by itself, but not otherwise.
>>
>> After messing with this for quite a while, I conclude that update was
>> the wrong way to go because it is geared to replacement of individual
>> bits, not editing all instances of a thing.
>>
>> So I started studying the structure of formula objects.  I noticed
>> this really interesting thing. the newFmla object can be probed
>> recursively to eventually reveal all of the individual pieces:
>>
>>
>>> newFmla
>> y ~ log(x1) + x2 * x3
>>> newFmla[[3]]
>> log(x1) + x2 * x3
>>> newFmla[[3]][[2]]
>> log(x1)
>>> newFmla[[3]][[2]][[2]]
>> x1
>>
>> So, if you could tell me of a general way to "walk" though a formula
>> object, couldn't I use "gsub" or something like that to recognize each
>> instance of "x1" and replace with "x1c"??
>>
>> I just can't figure how to automate the checking of each possible
>> element in a formula, to get the right combination of [[]][[]][[]].
>> See what I mean? I need to avoid this:
>>
>>> newFmla[[3]][[2]][[3]]
>> Error in newFmla[[3]][[2]][[3]] : subscript out of bounds
>>
>> pj
>
> --
> Charles C. Berry                            Dept of Family/Preventive Medicine
> cberry at ucsd edu                          UC San Diego
> http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901
>
> ______________________________________________
> 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.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list