r通过数据循环.框架以不同的DV和权重运行相同的回归



嗨,我在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)
})

返回"可变长度不同(针对'(strige)')

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)
})

只需使用parse即可将 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)
})

或在eval内使用as.name功能,如下所示:

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)
})

最新更新