R 循环回归,将常数视为变量。错误:可变长度不同
我想循环包含/排除某些变量,但我遇到了一个错误。下面是一些示例数据的问题R 循环回归,将常数视为变量。错误:可变长度不同,r,regression,lm,R,Regression,Lm,我想循环包含/排除某些变量,但我遇到了一个错误。下面是一些示例数据的问题 mtcars = data('mtcars') for(i in 0:1) { fitlm = lm(mpg ~ cyl + i * drat, data = mtcars) } Error in model.frame.default(formula = mpg ~ cyl + i * drat, data = mtcars, : variable lengths differ (found for 'i')
mtcars = data('mtcars')
for(i in 0:1) {
fitlm = lm(mpg ~ cyl + i * drat, data = mtcars)
}
Error in model.frame.default(formula = mpg ~ cyl + i * drat, data = mtcars, : variable lengths differ (found for 'i')
但这样运行时不会出现问题:
fitlm = lm(mpg ~ cyl + 0 * drat, data = mtcars)
fitlm = lm(mpg ~ cyl + 1 * drat, data = mtcars)
如果变量有一个数字乘数,为什么回归会起作用,但如果是
i
,回归会失败?尝试使用as.formula
,如下所示:
# create an empty list to store the results
fitlm <- list()
# loop, fit the model and assign the result to a new list in fitlm
for(i in 0:1) {
fitlm[[i+1]] <- lm(as.formula(paste("mpg ~ cyl +", i, "* drat")), data = mtcars)
}
fitlm <- purrr::map(c(0,1), ~lm(as.formula(paste("mpg ~ cyl +", .x, "* drat")), data = mtcars))
结果将是:
> fitlm
[[1]]
Call:
lm(formula = as.formula(paste("mpg ~ cyl +", i, "* drat")),
data = mtcars)
Coefficients:
cyl
2.79
[[2]]
Call:
lm(formula = as.formula(paste("mpg ~ cyl +", i, "* drat")),
data = mtcars)
Coefficients:
(Intercept) cyl
37.885 -2.876
这有点像黑客,但你可以试试这种形式
fitlm = list()
for(i in 0:1) {
idrat = i*mtcars$drat
fitlm[[i+1]] = lm(mpg ~ cyl + idrat, data = mtcars)
}
结果是什么
fitlm
## [[1]]
##
## Call:
## lm(formula = mpg ~ cyl + idrat, data = mtcars)
##
## Coefficients:
## (Intercept) cyl idrat
## 37.885 -2.876 NA
##
##
## [[2]]
##
## Call:
## lm(formula = mpg ~ cyl + idrat, data = mtcars)
##
## Coefficients:
## (Intercept) cyl idrat
## 28.725 -2.484 1.872
这绕过了
lm()
函数,当它看到*
字符时,它会寻找交互,正如您在使用数字时发现的那样。我正在测试不同的滞后(例如:滞后(cyl,I)
,以及某些变量的存在/不存在。因此,在上面的示例中,当i
为0
时,将从回归中删除drat。如果我在回归中有多个.x
,是否迭代所有可能的组合?或者我是否需要为我想要的每个不同的变量设置map
这里的替代?.x对应于c(0,1)。大于.x是什么意思?要排除/包括的多个变量?