Функция R Step ищет данные в глобальной среде, а не внутри определенной функции. - PullRequest
1 голос
/ 09 марта 2020

У меня проблема с регрессом на шаг вперед, и я понимаю, что я неправильно передаю аргумент Data.

У меня есть функция:

ForwardStep <- function(df,yName, Xs, XsMin) {
    Data <- df[, c(yName,Xs)]
    fit <- glm(formula = paste(yName, " ~ ", paste0(XsMin, collapse = " + ")),
               data = Data, family = binomial(link = "logit") )
    ScopeFormula <- list(lower = paste(yName, " ~ ", paste0(XsMin, collapse = " + ")), 
                         upper = paste(yName, " ~ ", paste0(Xs, collapse = " + ")))
    result <- step(fit, direction = "forward", scope = ScopeFormula, trace = 1 )

    return(result)
}

Когда я пытаюсь запустить его со следующими аргументами

df <- data.frame(Y= rep(c(0,1),25),time = rpois(50,2), x1 = rnorm(50, 0,1),
                 x2 = rnorm(50,.5,2), x3 = rnorm(50,0,1))
yName = "Y"
Xs <- c("x1","x2","x3")
XsMin <- 1

res <- ForwardStep(df,Yname,Xs,XsMin)

Я получаю сообщение об ошибке: Ошибка в .data.frame (data): объект 'Data' не найден

Но если я сначала определю Data в Global Env, он будет работать отлично.

Data <- df[, c(yName,Xs)]

res <- ForwardStep(df,Yname,Xs,XsMin)

Я думаю, что у меня неправильная реализация шага функции, однако я точно не знаю, как сделать это правильно.

1 Ответ

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

Вы должны понимать, что формулы всегда имеют связанную среду, см. help("formula"). Никогда не следует передавать текст в параметр formula функций модели, никогда. Если вы это сделаете, рано или поздно вы столкнетесь с проблемами с областями видимости. Обычно я рекомендую вместо этого работать на языке, но вы также можете создавать формулы из текста в правильной области:

ForwardStep <- function(df,Yname, Xs, XsMin) {
  Data <- df[, c(Yname,Xs)]
  f1 <- as.formula(paste(Yname, " ~ ", paste0(XsMin, collapse = " + ")))

  fit <- glm(formula = f1,
             data = Data, family = binomial(link = "logit") )
  f2 <- as.formula(paste(Yname, " ~ ", paste0(XsMin, collapse = " + ")))
  f3 <- as.formula(paste(Yname, " ~ ", paste0(Xs, collapse = " + ")))

  ScopeFormula <- list(lower = f2, 
                       upper = f3)
   step(fit, direction = "forward", scope = ScopeFormula, trace = 1)
}

df <- data.frame(Y= rep(c(0,1),25),time = rpois(50,2), x1 = rnorm(50, 0,1),
                 x2 = rnorm(50,.5,2), x3 = rnorm(50,0,1))
YName = "Y"
Xs <- c("x1","x2","x3")
XsMin <- 1

res <- ForwardStep(df,YName,Xs,XsMin)
#Start:  AIC=71.31
#Y ~ 1
#
#       Df Deviance    AIC
#<none>      69.315 71.315
#+ x1    1   68.661 72.661
#+ x3    1   68.797 72.797
#+ x2    1   69.277 73.277

(Publi c служебное объявление: пошаговая регрессия является генератором мусора . Доступны лучшие статистические методы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...