在R函数内调用predict()

Adr*_*ian 6 r

我想在R中的函数中调用predict(...).我遇到了一些与范围有关的问题,但我无法弄清楚什么是错的或如何解决它.有人可以帮忙吗?例:

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()
Run Code Online (Sandbox Code Playgroud)

最后一行失败了:

错误$<-.data.frame(*tmp*,"概率",值= c(0.274,0.282,:替换有20行,数据有50个另外:警告消息:'newdata'有50行但找到的变量有20行

如果我正确理解错误消息,它看起来像我传递给预测的df对象(...)被评估为父/全局环境中的df.那一行有20行,用于训练.但我希望调用预测(...)在另一个 df数据框上进行评估- 我在PredictOnNewData函数中创建的数据框.如何实现(不更改数据框的名称)?

[现在我重读了这篇文章 - 我向后看了吗?在行中(df $ probability < - ...),其中一个dfs正在以错误的方式进行评估,但是它是哪个?

我也试过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()
Run Code Online (Sandbox Code Playgroud)

...返回与上次相同的错误.

请帮忙!


绝对可以在大于用作训练数据的数据帧上调用预测.一个例子(正确运行):

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
Run Code Online (Sandbox Code Playgroud)

这正是我想做的 - 除了我希望第二个df由一个函数创建.我怎样才能做到这一点?

42-*_*42- 8

如果要predict正常工作,应该正确使用数据和公式参数.data参数是数据框,公式参数由列名和(公式)运算符组成.我也不喜欢开发域范围之外的隐式外推法,但我们暂时忽略它.试试这个小修改:

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()
Run Code Online (Sandbox Code Playgroud)