0

我正在编写一个多级回归模型,在该模型中,我从一个预测变量数据框(来自第一级的系数)和一个预测变量数据框开始第二个级别。两个数据框具有相同数量的观察值。我希望遍历预测变量(第一个数据帧中的列)并使用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')

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

4

1 回答 1

1

请注意, 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)

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

于 2019-10-10T13:17:55.787 回答