Re: [R] update.formula() to add interaction terms

2014-02-04 Thread Marie-Pierre Sylvestre
Many thanks, that is exactly what I was looking for. I did not know about
bquote, interesting!
MP


On Mon, Feb 3, 2014 at 6:29 PM, William Dunlap wdun...@tibco.com wrote:

 Is this the sort of thing you are looking for?
 fm - y ~ x1 + x2 + x3 + log(x4)
 # Use terms() instead of just all.vars() to keep log(x4) as log(x4)
 xVars - with(attributes(terms(fm)),
 as.list(variables)[-c(1,response+1)])
 str(xVars)
List of 4
 $ : symbol x1
 $ : symbol x2
 $ : symbol x3
 $ : language log(x4)
 # use bquote to make the addition to the formula
 update(fm, bquote( ~ . + .(xVars[[1]]) * .(xVars[[length(xVars)]])))
y ~ x1 + x2 + x3 + log(x4) + x1:log(x4)

 As a function it would be
addInteraction - function(formula){
   xVars - with(attributes(terms(formula)),
 as.list(variables)[-c(1,response+1)])
  update(formula, bquote( ~ . + .(xVars[[1]]) *
 .(xVars[[length(xVars)]])))
}
 used as
 addInteraction(y~x1+x2+sqrt(x3))
y ~ x1 + x2 + sqrt(x3) + x1:sqrt(x3)

 If the last 'term' in the formula is a compound like x4:x5 and you
 want x1:x4:x5 added you will need to do more work (look at the
 'factors' attribute of terms()'s output) - currently it adds x1:x5.


 Bill Dunlap
 TIBCO Software
 wdunlap tibco.com


  -Original Message-
  From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
 On Behalf
  Of Marie-Pierre Sylvestre
  Sent: Monday, February 03, 2014 12:54 PM
  To: r-help@r-project.org
  Subject: [R] update.formula() to add interaction terms
 
  Hi,
  I have a list of formulae that I need to modify. For each formula, I need
  to add an interaction term between the first independent variable and the
  last one. I want to write a function to achieve that because the list of
  formulae to modify is long.
 
  For example, if the formula is y ~ x1 + x2 + x3 + x4, then I need to turn
  it either into
 
  y ~ x1*x4 + x2 + x3
 
  or
 
  y ~ x1 + x2 + x3 + x4 + x4:x1
 
  (I know they are the same, but one may be easier to work with than the
  other).
 
 
  Suppose I have the formula a which is defined as a - formula(y ~
  x1+x2+x3+x4)
 
  I know how to access to the first and last independent variables of my
  formula:
 
  firstvar - all.vars(a[[3]])[1]
  lastvar - all.vars(a[[3]])[length( all.vars(a[[3]]))]
 
 
  What I can't figure out is how to use update.formula() to include my
  interaction term in order to get y ~ x1+x2+x3+x4 + x1:x4. Specifically,
 
  update.formula(a, ~ . + paste(all.vars(a[[3]])[1],firstvar, lastvar, sep
 =
  ':'))
 
  is not producing y ~ x1+x2+x3+x4 + x1:x4.
 
  Any idea?
 
  Thanks in advance,
  MP
 
[[alternative HTML version deleted]]
 
  __
  R-help@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.


[[alternative HTML version deleted]]

__
R-help@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] update.formula() to add interaction terms

2014-02-03 Thread Marie-Pierre Sylvestre
Hi,
I have a list of formulae that I need to modify. For each formula, I need
to add an interaction term between the first independent variable and the
last one. I want to write a function to achieve that because the list of
formulae to modify is long.

For example, if the formula is y ~ x1 + x2 + x3 + x4, then I need to turn
it either into

y ~ x1*x4 + x2 + x3

or

y ~ x1 + x2 + x3 + x4 + x4:x1

(I know they are the same, but one may be easier to work with than the
other).


Suppose I have the formula a which is defined as a - formula(y ~
x1+x2+x3+x4)

I know how to access to the first and last independent variables of my
formula:

firstvar - all.vars(a[[3]])[1]
lastvar - all.vars(a[[3]])[length( all.vars(a[[3]]))]


What I can't figure out is how to use update.formula() to include my
interaction term in order to get y ~ x1+x2+x3+x4 + x1:x4. Specifically,

update.formula(a, ~ . + paste(all.vars(a[[3]])[1],firstvar, lastvar, sep =
':'))

is not producing y ~ x1+x2+x3+x4 + x1:x4.

Any idea?

Thanks in advance,
MP

[[alternative HTML version deleted]]

__
R-help@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.


Re: [R] update.formula() to add interaction terms

2014-02-03 Thread William Dunlap
Is this the sort of thing you are looking for?
fm - y ~ x1 + x2 + x3 + log(x4)
# Use terms() instead of just all.vars() to keep log(x4) as log(x4)
xVars - with(attributes(terms(fm)), as.list(variables)[-c(1,response+1)])
str(xVars)
   List of 4
$ : symbol x1
$ : symbol x2
$ : symbol x3
$ : language log(x4)
# use bquote to make the addition to the formula
update(fm, bquote( ~ . + .(xVars[[1]]) * .(xVars[[length(xVars)]])))
   y ~ x1 + x2 + x3 + log(x4) + x1:log(x4)

As a function it would be
   addInteraction - function(formula){
  xVars - with(attributes(terms(formula)), 
as.list(variables)[-c(1,response+1)]) 
 update(formula, bquote( ~ . + .(xVars[[1]]) * .(xVars[[length(xVars)]])))
   }
used as
addInteraction(y~x1+x2+sqrt(x3))
   y ~ x1 + x2 + sqrt(x3) + x1:sqrt(x3)

If the last 'term' in the formula is a compound like x4:x5 and you
want x1:x4:x5 added you will need to do more work (look at the
'factors' attribute of terms()'s output) - currently it adds x1:x5.


Bill Dunlap
TIBCO Software
wdunlap tibco.com


 -Original Message-
 From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
 Behalf
 Of Marie-Pierre Sylvestre
 Sent: Monday, February 03, 2014 12:54 PM
 To: r-help@r-project.org
 Subject: [R] update.formula() to add interaction terms
 
 Hi,
 I have a list of formulae that I need to modify. For each formula, I need
 to add an interaction term between the first independent variable and the
 last one. I want to write a function to achieve that because the list of
 formulae to modify is long.
 
 For example, if the formula is y ~ x1 + x2 + x3 + x4, then I need to turn
 it either into
 
 y ~ x1*x4 + x2 + x3
 
 or
 
 y ~ x1 + x2 + x3 + x4 + x4:x1
 
 (I know they are the same, but one may be easier to work with than the
 other).
 
 
 Suppose I have the formula a which is defined as a - formula(y ~
 x1+x2+x3+x4)
 
 I know how to access to the first and last independent variables of my
 formula:
 
 firstvar - all.vars(a[[3]])[1]
 lastvar - all.vars(a[[3]])[length( all.vars(a[[3]]))]
 
 
 What I can't figure out is how to use update.formula() to include my
 interaction term in order to get y ~ x1+x2+x3+x4 + x1:x4. Specifically,
 
 update.formula(a, ~ . + paste(all.vars(a[[3]])[1],firstvar, lastvar, sep =
 ':'))
 
 is not producing y ~ x1+x2+x3+x4 + x1:x4.
 
 Any idea?
 
 Thanks in advance,
 MP
 
   [[alternative HTML version deleted]]
 
 __
 R-help@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@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.