Dear Eik, Thanks for your answer. I think indeed I was not to clear of what I want to achieve. So let me rephrase:
In case that there are aliased predictors in my model, I will see them via the alias function: d <- expand.grid(a = 0:1, b=0:1) d$c <- (d$a + d$b) %% 2 d$y <- rnorm(4) d <- within(d, {a <- factor(a); b <- factor(b); c <- factor(c)}) l <- lm(y ~ a * b + c, d) alias(l) Model : y ~ a * b + c Complete : (Intercept) a1 b1 c1 a1:b1 0 1/2 1/2 -1/2 I see from alias that the _coefficient_ a1:b1 is aliased and can thus not be estimated. Hence, I want to remove the _term_ a:b from the model. While this is a straight forward thing if we were talking about continuous predictors, it is not that easy to do so if we have aliased quantitative predictors (i.e. factors), because a _term_ like a:b (i.e. an interaction between two 2-level factors) will yield 1 _coefficient_ a1:b1. But in order to use the update function I have to translate the output of aliased (which gives aliased _coefficients_) back to _terms_. Something like update(l, . ~ . - a1:b1) would not work for apparent reasons and I have to use update(l, . ~ . - a:b), which means I have to translate a1:b1 somehow to a:b. Overall, I want to remove any continuous/quantitative predictor if any associated coefficient cannot be estimated. Is that clearer now? KR, -Thorn -----Original Message----- From: Eik Vettorazzi [mailto:e.vettora...@uke.de] Sent: Dienstag, 29. Oktober 2013 21:47 To: Thaler,Thorn,LAUSANNE,Applied Mathematics; R-Help Mailing List (r-help@r-project.org) Subject: Re: [R] Automatically Remove Aliased Terms from a Model Hi Thorn, it is not entirely clear (at least for me) what you want to accomplish. an easy and fail safe way of extracting used terms in a (g)lm-object is names(model.frame(l)) if you want to extract terms to finally select a model, have a look at drop1 and/or MASS::dropterm Hth Am 28.10.2013 17:19, schrieb Thaler,Thorn,LAUSANNE,Applied Mathematics: > Dear all, > > I am trying to implement a function which removes aliased terms from a model. > The challenge I am facing is that with "alias" I get the aliased coefficients > of the model, which I have to translate into the terms from the model > formula. What I have tried so far: > > ------------------8<------------------ > d <- expand.grid(a = 0:1, b=0:1) > d$c <- (d$a + d$b) %% 2 > d$y <- rnorm(4) > d <- within(d, {a <- factor(a); b <- factor(b); c <- factor(c)}) l <- > lm(y ~ a * b + c, d) > > removeAliased <- function(mod) { > ## Retrieve all terms in the model > X <- attr(mod$terms, "term.label") > ## Get the aliased coefficients > rn <- rownames(alias(mod)$Complete) > ## remove factor levels from coefficient names to retrieve the terms > regex.base <- unique(unlist(lapply(mod$model[, sapply(mod$model, > is.factor)], levels))) > aliased <- gsub(paste(regex.base, "$", sep = "", collapse = "|"), "", > gsub(paste(regex.base, ":", sep = "", collapse = "|"), ":", rn)) > uF <- formula(paste(". ~ .", paste(aliased, collapse = "-"), sep = "-")) > update(mod, uF) > } > > removeAliased(l) > ------------------>8------------------ > > This function works in principle, but this workaround with removing the > factor levels is just, well, a workaround which could cause problems in some > circumstances (when the name of a level matches the end of another variable, > when I use a different contrast and R names the coefficients differently etc. > - and I am not sure which other cases I am overlooking). > > So my question is whether there are some more intelligent ways of doing what > I want to achieve? Is there a function to translate a coefficient of a LM > back to the term, something like: > > termFromCoef("a1") ## a1 > termFromCoef("a1:b1") ## a:b > > With this I could simply translate the rownames from alias into the terms > needed for the model update. > > Thanks for your help. > > Kind Regards, > > Thorn Thaler > NRC Lausanne > Applied Mathematics > > ______________________________________________ > 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. > -- Eik Vettorazzi Department of Medical Biometry and Epidemiology University Medical Center Hamburg-Eppendorf Martinistr. 52 20246 Hamburg T ++49/40/7410-58243 F ++49/40/7410-57790 -- Besuchen Sie uns auf: www.uke.de _____________________________________________________________________ Universitätsklinikum Hamburg-Eppendorf; Körperschaft des öffentlichen Rechts; Gerichtsstand: Hamburg Vorstandsmitglieder: Prof. Dr. Martin Zeitz (Vorsitzender), Prof. Dr. Dr. Uwe Koch-Gromus, Joachim Prölß, Rainer Schoppik _____________________________________________________________________ SAVE PAPER - THINK BEFORE PRINTING ______________________________________________ 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.