为多级回归循环变量会产生类型错误
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
列名称。
我正在编写一个多级回归模型,其中我从预测数据(第一级的系数)数据框和预测变量数据框开始第二级。两个数据框具有相同数量的观察值。
我希望遍历预测变量(第一个数据帧中的列)并使用 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
列名称。