Вызов предиката () внутри функции R - PullRequest
6 голосов
/ 10 февраля 2011

Я бы хотел вызвать предикат (...) внутри функции в R. У меня возникли некоторые проблемы, связанные с областью видимости, но я не могу понять, что не так или как это исправить. Кто-нибудь может помочь? Пример:

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60))
summary(df)
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df)
summary(logit.model)

PredictOnNewData <- function() {
  df <- data.frame(x=51:100)
  df$probability <- round(predict(logit.model, df, type="response"), digits=3)
  return(df)
}

PredictOnNewData()

Последняя строка завершается с:

Ошибка в $<-.data.frame (*tmp*, «вероятность», значение = с (0,274, 0,282, : замена имеет 20 строк, данные имеют 50 Дополнительно: предупреждающее сообщение: В 'newdata' было 50 строк, но переменная (и) найдено 20 строк

Если я правильно понимаю сообщение об ошибке, похоже, что объект df, который я передаю для предсказания (...), оценивается как df в родительской / глобальной среде. Тот имеет 20 рядов и был использован для обучения. Но я хочу, чтобы вызов предиката (...) оценивался во фрейме данных other df - который я создаю внутри функции PredictOnNewData. Как я могу это сделать (не меняя имен фреймов данных)?

[Теперь, когда я перечитал это - я получаю это назад? В строке (df $ вероятность <- ...) один из dfs оценивается неправильно, но что это?] </p>

Я также пытался получить get ("df", envir = sys.frame ()), чтобы явно указать объект df, определенный в текущем фрейме функции:

PredictOnNewData <- function() {
  df <- data.frame(x=51:100)
  # df$probability <- round(predict(logit.model, df, type="response"), digits=3)
  df$probability <- round(predict(logit.model, get("df", envir=sys.frame()), type="response"), digits=3)
  return(df)
}

PredictOnNewData()

... возвращает ту же ошибку, что и в прошлый раз.

Пожалуйста, помогите!


Определенно можно вызвать прогнозирование для фрейма данных, большего, чем тот, который использовался в качестве обучающих данных. Пример (работает правильно):

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60))
summary(df)
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df)
summary(logit.model)
df <- data.frame(x=1:100)
df$probability <- round(predict(logit.model, df, type="response"), digits=3)
df

Это именно то, что я хочу сделать, за исключением того, что я хочу, чтобы второй df создавался функцией. Как я могу это сделать?

1 Ответ

8 голосов
/ 10 февраля 2011

Вы должны правильно использовать аргументы данных и формул, если хотите, чтобы predict работал правильно. Аргумент данных представляет собой фрейм данных, а аргумент формулы состоит из имен столбцов и операторов (формул). Мне также не нравится неявная дикая экстраполяция за пределами области разработки, но мы пока проигнорируем это. Попробуйте эту небольшую модификацию:

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60))
summary(df)
logit.model <- glm( binary.outcome ~ x, family=binomial("logit"), data=df)
summary(logit.model)

PredictOnNewData <- function() {
  df <- data.frame(x=51:100)
  df$probability <- round(predict( logit.model, newdata=df, type="response"), digits=3)
  return(df)
}

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