首页 > 解决方案 > 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

那么我该如何解决这个问题呢?

标签: rapplylazy-evaluationpoly

解决方案


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))

推荐阅读