A colleague asked me if there is a way to specify with a ***variable*** (say ``cflag'') whether there is an intercept in a linear model. She had in mind something like lm(y ~ x - cflag) where cflag could be 0 or 1; if it's 0 an intercept should be fitted, if it's 1 then no intercept. This doesn't work ``of course''. The cflag just gets treated as another predictor and because it is of the wrong length an error is generated. The best I could come up with was lm(as.formula(paste("y ~ x -",cflag))) Which is kludgy. It (of course!) also be done using an if statement. Is there a sexier way? cheers, Rolf Turner
You can use update to modify a formula: fo <- y ~ x fo <- update(fo, . ~ . -1) willl remove the intercept. See ?update.formula On 3/23/06, Rolf Turner <rolf at math.unb.ca> wrote:> A colleague asked me if there is a way to specify with a > ***variable*** (say ``cflag'') whether there is an intercept in a > linear model. > > She had in mind something like > > lm(y ~ x - cflag) > > where cflag could be 0 or 1; if it's 0 an intercept should > be fitted, if it's 1 then no intercept. > > This doesn't work ``of course''. The cflag just gets treated > as another predictor and because it is of the wrong length > an error is generated. > > The best I could come up with was > > lm(as.formula(paste("y ~ x -",cflag))) > > Which is kludgy. It (of course!) also be done using an > if statement. > > Is there a sexier way? > > cheers, > > Rolf Turner > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
update() simply calls the model fitting function again using the new arguments, which means one redundant model fit. What I would do is construct the formula beforehand, e.g., myformula <- if (cflag) y ~ x else y ~ x - 1 or something like that. Andy From: Gabor Grothendieck> > You can use update to modify a formula: > > fo <- y ~ x > fo <- update(fo, . ~ . -1) > > willl remove the intercept. See ?update.formula > > On 3/23/06, Rolf Turner <rolf at math.unb.ca> wrote: > > A colleague asked me if there is a way to specify with a > > ***variable*** (say ``cflag'') whether there is an intercept in a > > linear model. > > > > She had in mind something like > > > > lm(y ~ x - cflag) > > > > where cflag could be 0 or 1; if it's 0 an intercept should > > be fitted, if it's 1 then no intercept. > > > > This doesn't work ``of course''. The cflag just gets treated as > > another predictor and because it is of the wrong length an error is > > generated. > > > > The best I could come up with was > > > > lm(as.formula(paste("y ~ x -",cflag))) > > > > Which is kludgy. It (of course!) also be done using an > > if statement. > > > > Is there a sexier way? > > > > cheers, > > > > Rolf Turner > > > > ______________________________________________ > > R-help at stat.math.ethz.ch mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide! > > http://www.R-project.org/posting-guide.html > > > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html > >
Rolf Turner wrote:> A colleague asked me if there is a way to specify with a > ***variable*** (say ``cflag'') whether there is an intercept in a > linear model. > > She had in mind something like > > lm(y ~ x - cflag)something like lm( if (cflag) y ~ x-0 else y ~ x, ... Kjetil> > where cflag could be 0 or 1; if it's 0 an intercept should > be fitted, if it's 1 then no intercept. > > This doesn't work ``of course''. The cflag just gets treated > as another predictor and because it is of the wrong length > an error is generated. > > The best I could come up with was > > lm(as.formula(paste("y ~ x -",cflag))) > > Which is kludgy. It (of course!) also be done using an > if statement. > > Is there a sexier way? > > cheers, > > Rolf Turner > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >