r цикл по data.frame для запуска одной и той же регрессии с разными DV и весами - PullRequest
0 голосов
/ 09 марта 2019

Привет, у меня проблемы с получением lm в laply, чтобы перебрать различные 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)
})

1 Ответ

1 голос
/ 09 марта 2019

Просто используйте 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)
})

или используйте функцию 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)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...