r - R:将多项式回归包装在函数中的问题
问题描述
当我进行多项式回归时,我尝试将具有不同多项式次数的拟合放入一个列表中,因此我将glm包装到一个函数中:
library(MASS)
myglm <- function(dop) {
# dop: degree of polynomial
glm(nox ~ poly(dis, degree = dop), data = Boston)
}
但是,我想可能存在一些与惰性评估有关的问题。模型的度数是参数dop,而不是一个具体的数字。
r$> myglm(2)
Call: glm(formula = nox ~ poly(dis, degree = dop), data = Boston)
Coefficients:
(Intercept) poly(dis, degree = dop)1 poly(dis, degree = dop)2
0.5547 -2.0031 0.8563
Degrees of Freedom: 505 Total (i.e. Null); 503 Residual
Null Deviance: 6.781
Residual Deviance: 2.035 AIC: -1347
当我使用此模型进行交叉验证时,会发生错误:
>>> cv.glm(Boston, myglm(2))
Error in poly(dis, degree = dop) : object 'dop' not found
那么我该如何解决这个问题呢?
解决方案
Quosures、quasiquotation 和 tidy 评估在这里很有用:
library(MASS)
library(boot)
library(rlang)
myglm <- function(dop) {
eval_tidy(quo(glm(nox ~ poly(dis, degree = !! dop), data = Boston)))
}
cv.glm(Boston, myglm(2))
推荐阅读
- python - 使用 BeautifulSoup 过滤 h1 HTML
- c# - PowerShell 设置驱动器标签在重启前保持不变
- perl - 从 CSV 格式的单行文本文件中读取单行
- java - 如何在 Java 中四舍五入到 3 个小数位,以便 .000 应该出现在值的末尾,即使它是单个数字
- python - 将int格式化为带有0x前缀的大写十六进制字符串?
- r - 如何使用 MatchIt 在 R 中为倾向得分匹配准备变量?
- python - 递归如何找到最大值?
- c# - 在 ServiceProvider 中使用 Entity Framework Core 3.1 和 UseInMemoryDatabase 选项(作用域生命周期)
- c# - 尝试在 .NET CORE Web 应用程序中创建控制器时出错
- javascript - Python - 从类似于 JavaScript ES6 解构的数组中提取元素