[R] Automatic formula creation
peter dalgaard
pdalgd at gmail.com
Fri Aug 9 19:18:23 CEST 2013
On Aug 9, 2013, at 18:24 , Alex van der Spek wrote:
> Thanks much to both Peter and Rui,
>
> I am afraid that after 5 years with R I am still not able to understand your method Peter. Will stick with Rui's method for now...
>
Oh, come on! How about reading the first case in example(Reduce)?
-pd
> Alex
> On 08/09/2013 04:00 PM, peter dalgaard wrote:
>> On Aug 9, 2013, at 13:26 , Rui Barradas wrote:
>>
>>> Hello,
>>>
>>> Maybe the following gives you some idea on how to vary the terms.
>>>
>>> idx <- 1:5 # or any other indexes
>>> ftext <- paste(terms[idx], collapse = ' * ')
>>
>> You're not the first to use this sort of technique - it is happening in various parts of R's own internals too, but handling R expressions via their textual representation is really not a good principle (see fortune("rethink")) and it _does_ give rise to problems.
>>
>> I much prefer techniques like this:
>>
>>> nm <- lapply(letters[1:6], as.name)
>>> Reduce(function(a,b) bquote(.(a)*.(b)), nm)
>> a * b * c * d * e * f
>>
>>
>> Similarly, use
>>
>>> trm <- Reduce(function(a,b) bquote(.(a)*.(b)), nm)
>>> formula(bquote(I(1 - Pass149) ~ .(trm) - 1))
>> I(1 - Pass149) ~ a * b * c * d * e * f - 1
>>
>>
>>>
>>> Hope this helps,
>>>
>>> Rui Barradas
>>>
>>>
>>> Em 09-08-2013 11:40, Alex van der Spek escreveu:
>>>> Say I want to compare all 5 term models from a choice of 28 different
>>>> predictors and one known. All possible combinations of 5 out of 28 is
>>>> easy to form by combn(). With some string manipulation it is also easy
>>>> to make a text representation of a formula which is easy to convert by
>>>> as.formula() for use in lm().
>>>>
>>>> The primitive part however is pasting together the terms which I do
>>>> explicitly for 5 terms, like so:
>>>>
>>>>
>>>> ftext <- paste(terms[1], terms[2], terms[3], terms[4], terms[5],
>>>> sep = ' * ')
>>>>
>>>>
>>>> Works but is not great as I now need to edit this formula when the
>>>> number of terms changes. There ought to be a better way but I can't find
>>>> it.
>>>>
>>>> Any help much appreciated! The full block of relevant code follows:
>>>> Alex van der Spek
>>>>
>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>
>>>>
>>>> #Try all 3 band models
>>>> nbands <- 5
>>>> freqs <- c('4', '5', '6_3', '8', '10', '12_7', '16', '20', '25', '32',
>>>> '40', '51', '64', '81', '102', '128',
>>>> '161', '203', '256', '323', '406', '512', '645', '813',
>>>> '1024', '1290', '1625', '2048')
>>>> bands <- paste(rep('kHz', 28), freqs, rep('_ave', 28), sep = '')
>>>> nc <- choose(28, nbands)
>>>> combs <- t(combn(bands, nbands))
>>>>
>>>> models <- vector("list", nc)
>>>> for (ic in 1:nc) {
>>>> terms <- c()
>>>> for (jc in 1:nbands) {
>>>> t <- paste('log10(', combs[ic, jc], ')', sep = '')
>>>> terms <- append(terms, t)
>>>> }
>>>>
>>>> ftext <- paste(terms[1], terms[2], terms[3], terms[4], terms[5],
>>>> sep = ' * ')
>>>>
>>>> ftext <- paste('I(1 - Pass149) ~ ', ftext, ' - 1', sep = '')
>>>> forml <- as.formula(ftext)
>>>>
>>>> plus100.lm <- lm(forml, data = sd, subset = Use == 'Cal')
>>>> plus100.sm <- step(plus100.lm, trace = 0)
>>>> }
>>>>
>>>> ______________________________________________
>>>> 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.
>>> ______________________________________________
>>> 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.
>
--
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
More information about the R-help
mailing list