为多级回归循环变量会产生类型错误

Looping over variables for multilevel regression produces type error

我正在编写一个多级回归模型,其中我从预测数据(第一级的系数)数据框和预测变量数据框开始第二级。两个数据框具有相同数量的观察值。 我希望遍历预测变量(第一个数据帧中的列)并使用 lm() 将它们回归到整个第二个预测变量数据帧。但是,当我这样做时,我得到了一个我无法弄清楚的错误。

示例:

data(iris)
iris1 <- iris[-5] # remove the categories
iris2 <- iris[-5] * 6

for (col in names(iris1)) {
    lm(iris1[col] ~ iris2)
}

## Error in model.frame.default(formula = iris1[col] ~ iris2, drop.unused.levels = TRUE) : 
##   invalid type (list) for variable 'iris1[col]'

我只是不明白这意味着什么或者为什么 R 认为 iris1[col]list。 为了简单起见,我尝试合并它们:

for (col in names(iris1)) {
  tmp_df <- cbind(iris1[col], iris2)
  colnames(tmp_df) <- letters[1:5]  # to avoid duplicate names
  lm(1 ~ ., tmp_df)
}

## Error in model.frame.default(formula = 1 ~ ., data = tmp_df, drop.unused.levels = TRUE) : 
##   variable lengths differ (found for 'a')

这个特别令人沮丧,因为它们的长度显然相同。

请注意,lm 可以接受公式左侧的矩阵,因此我们可以这样做:

lm(as.matrix(iris1) ~., iris2)

或者如果我们想要为 iris1 的每一列单独的 lm 对象:

regr <- function(y) lm(y ~., iris2))
Map(regr, iris1)

regr2 <- function(nm) {
  fo <- as.formula(sprintf("iris2$%s ~.", nm))
  do.call("lm", list(fo, quote(iris2)))
}
Map(regr2, names(iris1))

lm.fit:

regr.fit <- function(y) lm.fit(cbind(1, as.matrix(iris2)), y)
Map(regr.fit, iris1)

请注意,结果的组件名称将是 iris1 中的 y 列名称。