循环遍历data.frame以使用不同的DV和权重运行相同的回归

问题描述 投票:0回答:1

嗨,我无法通过lapply获取lm来循环浏览不同的DV,我已经在data.frame中预先确定了相应的权重列。

这是一个有效的例子:

require(dplyr)


df <- mtcars %>% mutate_at(
  vars(mpg:drat),
  funs(wt=rnorm(n()))
  )
dvs <- names(select(df,mpg:drat))
res <- list()
res <- lapply(dvs, function(x) {
  formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
  lm(formula,df)
})

但这会返回“找不到对象'mpg_wt'”

res <- lapply(dvs, function(x) {
  formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
  weightvars <- paste0(x,"_wt")
  lm(formula,weights=as.formula(weightvars),df)
})

并返回“变量长度不同(找到'(权重)')”

res <- lapply(dvs, function(x) {
  formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
  weightvars <- paste0(x,"_wt")
  lm(formula,weights=eval(weightvars),df)
})
r lm
1个回答
1
投票

只需使用解析并传递weightvars作为text的值。

我希望这有帮助:


res <- lapply(dvs, function(x) {
  formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
  weightvars <- paste0(x,"_wt")
  lm(formula,weights=eval(parse(text=weightvars)),df)
})

或者在as.name中使用eval函数,如下所示:

res <- lapply(dvs, function(x) {
  formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
  weightvars <- paste0(x,"_wt")
  lm(formula,weights=eval(as.name(weightvars)),data=df)
})
© www.soinside.com 2019 - 2024. All rights reserved.