Я бы хотел вызвать предикат (...) внутри функции в 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 создавался функцией. Как я могу это сделать?