我想知道如何才能提出lm
公式语法,这样我就可以将paste
和cbind
一起用于多元多元回归。
在我的模型中,我有一组变量,对应于下面的原始示例:
data(mtcars)
depVars <- paste("mpg", "disp")
indepVars <- paste("qsec", "wt", "drat")
我想创建一个包含depVars
和indepVars
的模型。手动输入的模型看起来像这样:
modExmple <- lm(formula = cbind(mpg, disp) ~ qsec + wt + drat, data = mtcars)
我有兴趣生成相同的公式而不引用变量名称,只使用上面定义的depVars
和indepVars
向量。
例如,我想到的就是:
mod1 <- lm(formula = formula(paste(cbind(paste(depVars, collapse = ",")), " ~ ",
indepVars)), data = mtcars)
我也尝试了这个:
mod2 <- lm(formula = formula(cbind(depVars), paste(" ~ ",
paste(indepVars,
collapse = " + "))),
data = mtcars)
paste
,但我想知道如何与cbind
结合使用。cbind
,其变量名对应于一个向量,其余变量对应另一个向量。modExample
中找到公式,而不必输入变量名称。答案 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"