【问题标题】:looping over regression, treating a constant as a variable. ERROR: variable lengths differ循环回归,将常数视为变量。错误:可变长度不同
【发布时间】:2017-06-14 13:43:33
【问题描述】:

我想循环包含/排除某些变量,但我遇到了错误。这是一些示例数据的问题。

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,则回归会失败?

【问题讨论】:

  • 我正在测试不同的滞后(例如:lag(cyl, i),以及某些变量的存在/不存在。所以在上面的例子中,当i0 时,drat 将从回归。

标签: r regression lm


【解决方案1】:

尝试使用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) 
    }

您也可以使用purrr::map 代替循环,如下所示:

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  

【讨论】:

  • 如果我在回归中有多个.xmap 是否会遍历所有可能的组合?或者我需要一个map 来处理我想要替换的每一个不同的地方?
  • .x 这里对应 c(0,1)。超过 .x 是什么意思?要排除/包含多个变量?
【解决方案2】:

这有点小技巧,但您可以尝试以下形式

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() 函数在看到 * 字符时寻找交互,就像您在使用数字时发现的那样。

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2016-06-28
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多