我想在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由一个函数创建.我怎样才能做到这一点?
如果要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)