【问题标题】:Looping over variables for multilevel regression produces type error [duplicate]循环多级回归的变量会产生类型错误[重复]
【发布时间】:2019-10-10 13:05:26
【问题描述】:

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

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

【问题讨论】:

标签: r multilevel-analysis


【解决方案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)

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

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2017-09-11
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多