[R] update.lm question

Duncan Murdoch murdoch at stats.uwo.ca
Sun Nov 15 17:28:59 CET 2009


On 15/11/2009 9:23 AM, Karsten Weinert wrote:
> Hello,
> at the Rgui command line I can easily remove a term from a fitted lm
> object, like
> 
> fit <- lm(y~x1+x2+x3, data=myData)
> update(fit, .~.-x1)
> 
> However, I would like to do this in a function with term given as string, like
> 
> removeTerm <- function(linModel, termName) { ??? }
> removeTerm(fit, "x1")
> 
> but I can not fill the ???. I already tried
> 
> removeTerm <- function(linModel, termName) { update(linModel, .~. - termName },
> removeTerm <- function(linModel, termName) { update(linModel, .~. -
> as.name(termName) },
> removeTerm <- function(linModel, termName) { update(linModel, .~. -
> eval(termName) },
> removeTerm <- function(linModel, termName) { update(linModel, .~. -
> eval.parent(termName) },
> removeTerm <- function(linModel, termName) { update(linModel, .~. -
> get(termName) },
> 
> but these attempts produce error messages.
> 
> Can you advise me here?

There are two problems:

1. ".~." is different from ". ~ .".

2.  You need to construct the formula ". ~ . - x1", and none of your 
expressions do that.  You need to use substitute() or bquote() to edit a 
formula. For example, I think both of these should work:

removeTerm <- function(linModel, termName)
    update(linModel, bquote(. ~ . - .(as.name(termName))))


removeTerm <- function(linModel, termName)
    update(linModel, substitute(. ~ . - x, list(x=as.name(termName))))

Duncan Murdoch




More information about the R-help mailing list