在线性模型中结合cbind和paste

时间:2016-02-01 11:19:42

标签: r string formula lm cbind

我想知道如何才能提出lm公式语法,这样我就可以将pastecbind一起用于多元多元回归。

实施例

在我的模型中,我有一组变量,对应于下面的原始示例:

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

问题

我想创建一个包含depVarsindepVars的模型。手动输入的模型看起来像这样:

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

我有兴趣生成相同的公式而不引用变量名称,只使用上面定义的depVarsindepVars向量。

尝试1

例如,我想到的就是:

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

尝试2

我也尝试了这个:

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

旁注

  • 我发现了一些good examples关于如何使用公式的paste,但我想知道如何与cbind结合使用。
  • 这主要是一种语法问题;在我的真实数据中,我想要向模型引入一些变量,并且使用先前生成的向量更加简约,并使代码更具可呈现性。实际上,我只对创建一个公式对象感兴趣,该公式对象包含cbind,其变量名对应于一个向量,其余变量对应另一个向量。
  • 总之,我想在modExample 中找到公式,而不必输入变量名称。

2 个答案:

答案 0 :(得分:5)

认为它有效。

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

lm(formula(paste('cbind(',
                 paste(depVars, collapse = ','),
                 ') ~ ',
                 paste(indepVars, collapse = '+'))), data = mtcars)

答案 1 :(得分:3)

以下所有解决方案都使用以下定义:

depVars <- c("mpg", "disp")
indepVars <- c("qsec", "wt", "drat")

1)字符串公式创建表示公式的字符串,然后使用lm运行do.call。请注意,输出中显示的公式会正确显示并被写出。

fo <- sprintf("cbind(%s) ~ %s", toString(depVars), paste(indepVars, collapse = "+"))
do.call("lm", list(fo, quote(mtcars)))

,并提供:

Call:
lm(formula = "cbind(mpg, disp) ~ qsec+wt+drat", data = mtcars)

Coefficients:
             mpg       disp    
(Intercept)   11.3945  452.3407
qsec           0.9462  -20.3504
wt            -4.3978   89.9782
drat           1.6561  -41.1148

1a)这也有效:

fo <- sprintf("cbind(%s) ~.", toString(depVars))
do.call("lm", list(fo, quote(mtcars[c(depVars, indepVars)])))

,并提供:

Call:
lm(formula = cbind(mpg, disp) ~ qsec + wt + drat, data = mtcars[c(depVars, 
    indepVars)])

Coefficients:
             mpg       disp    
(Intercept)   11.3945  452.3407
qsec           0.9462  -20.3504
wt            -4.3978   89.9782
drat           1.6561  -41.1148

2)重新制定 @akrun和@Konrad,在下面的评论中建议使用reformulate。这种方法产生一个"formula"对象,而上面的产生一个字符串作为公式。 (如果上面的解决方案需要这个,那么可以使用fo <- formula(fo)。)请注意,reformulate的响应参数必须是调用对象而不是字符串,否则reformulate 1}}将字符串解释为单个变量的名称。

fo <- reformulate(indepVars, parse(text = sprintf("cbind(%s)", toString(depVars)))[[1]])
do.call("lm", list(fo, quote(mtcars)))

,并提供:

Call:
lm(formula = cbind(mpg, disp) ~ qsec + wt + drat, data = mtcars)

Coefficients:
             mpg       disp    
(Intercept)   11.3945  452.3407
qsec           0.9462  -20.3504
wt            -4.3978   89.9782
drat           1.6561  -41.1148

3)lm.fit 另一种根本不使用公式的方法是:

m <- as.matrix(mtcars)
fit <- lm.fit(cbind(1, m[, indepVars]), m[, depVars])

输出是包含以下组件的列表:

> names(fit)
[1] "coefficients"  "residuals"     "effects"       "rank"         
[5] "fitted.values" "assign"        "qr"            "df.residual"