rapplylazy-evaluationpoly

R: Problems of wrapping polynomial regression in a function


When I was doing polynomial regression, I tried to put fits with different degree of polynomial into a list, so I wrapped the glm into a function:

library(MASS)

myglm <- function(dop) {
    # dop: degree of polynomial
    glm(nox ~ poly(dis, degree = dop), data = Boston)
}

However, I guess there might be some problem related to lazy evaluation. The degree of the model is parameter dop rather than a specific number.

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

When I do cross-validation using this model, an error occurs:

>>> cv.glm(Boston, myglm(2))
Error in poly(dis, degree = dop) : object 'dop' not found

So how can I solve this problem ?


Solution

  • Quosures, quasiquotation, and tidy evaluation are useful here:

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