Search code examples
rstringformulalmcbind

Combining cbind and paste in linear model


I would like to know how can I come up with a lm formula syntax that would enable me to use paste together with cbind for multiple multivariate regression.

Example

In my model I have a set of variables, which corresponds to the primitive example below:

data(mtcars)
depVars <- paste("mpg", "disp")
indepVars <- paste("qsec", "wt", "drat")

Problem

I would like to create a model with my depVars and indepVars. The model, typed by hand, would look like that:

modExmple <- lm(formula = cbind(mpg, disp) ~ qsec + wt + drat, data = mtcars)

I'm interested in generating the same formula without referring to variable names and only using depVars and indepVars vectors defined above.


Attempt 1

For example, what I had on mind would correspond to:

mod1 <- lm(formula = formula(paste(cbind(paste(depVars, collapse = ",")), " ~ ",
                                   indepVars)), data = mtcars)

Attempt 2

I tried this as well:

mod2 <- lm(formula = formula(cbind(depVars), paste(" ~ ",
                                                   paste(indepVars, 
                                                         collapse = " + "))),
           data = mtcars)

Side notes

  • I found a number of good examples on how to use paste with formula but I would like to know how I can combine with cbind.
  • This is mostly a syntax a question; in my real data I've a number of variables I would like to introduce to the model and making use of the previously generated vector is more parsimonious and makes the code more presentable. In effect, I'm only interested in creating a formula object that would contain cbind with variable names corresponding to one vector and the remaining variables corresponding to another vector.
  • In a word, I want to arrive at the formula in modExample without having to type variable names.

Solution

  • Think it works.

    data(mtcars)
    depVars <- c("mpg", "disp")
    indepVars <- c("qsec", "wt", "drat")
    
    lm(formula(paste('cbind(',
                     paste(depVars, collapse = ','),
                     ') ~ ',
                     paste(indepVars, collapse = '+'))), data = mtcars)