Arhn - архитектура программирования

Функция R Step ищет данные в глобальной среде, а не внутри определенной функции

У меня проблема с пошаговой регрессией, и я понимаю, что я неправильно передаю аргумент 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)

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

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

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

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

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


Ответы:


1

Вы должны понимать, что формулы всегда связаны с окружением, см. 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

(Объявление для общественных служб: пошаговая регрессия - это генератор мусора. Доступны более эффективные статистические методы.)

09.03.2020
  • Сообщение госслужбы: пошаговая регрессия - генератор мусора. Существуют более эффективные статистические методы. - не могли бы вы поделиться? ;) 09.03.2020
  • @dario Лучший метод зависит от вашего варианта использования. Вы можете использовать подходы регуляризованной регрессии (LASSO, эластичная сеть) или подходы машинного обучения. 09.03.2020
  • Спасибо за комментарий @Roland. Я думал о лассо, но у вас вроде было такое четкое мнение, пришлось спросить;)! 09.03.2020
  • @Roland, можете ли вы добавить (или связать) пример вычислений на языке? 09.03.2020
  • @eipi: Это то, что я смог найти быстрее всего: stackoverflow.com/a/59987272/1412059 09.03.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..