es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de evaluación no estándar de alcance en la fórmula glm en una función en R.

Tengo una función que calcula una tabla y un modelo (y más…):

fun <- function(x, y, formula = y ~ x, data = NULL) {
  out <- list()
  out$tab <- table(x, y)
  out$mod <- glm(formula = formula,
                 family = binomial,
                 data = data)
  out
}

En la fórmula, necesito utilizar x e y tal como se proporcionan en la llamada a la función (por ejemplo, x = DF1$x e y = DF1$y) y variables de otro marco de datos (por ejemplo, a y b de DF2). Falla con mi función ingenua:

fun(x = DF1$x,
    y = DF1$y,
    formula = y ~ x + a + b,
    data = DF2)
# Error in eval(predvars, data, env) : object 'y' not found

¿Cómo puedo hacer que glm busque x e y en el entorno de la función? Supongo que este problema está relacionado con la evaluación no estándar y / o el ámbito, pero no tengo idea de cómo solucionarlo.

Datos para el ejemplo:

smp <- function(x = c(TRUE, FALSE),
                size = 1e2) {
  sample(x = x,
         size = size,
         replace = TRUE)
}

DF1 <- data.frame(x = smp(),
                  y = smp())

DF2 <- data.frame(a = smp(x = LETTERS),
                  b = smp(x = LETTERS))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que glm() busque x e y en el entorno de la función, podemos utilizar una evaluación no estándar con la función substitute(). Necesitamos sustituir los nombres de los símbolos en la fórmula con sus valores en el entorno de la función antes de pasar la fórmula a glm(). Aquí está el código de la función actualizado:

    “`{r}
    fun <- function(x, y, formula = y ~ x, data = NULL) {
    out <- list()
    out$tab <- table(x, y)

    # sustituir x e y en la fórmula con sus valores en el entorno de la función
    formula <- substitute(formula)
    formula[[2]] <- as.name(deparse(substitute(y)))
    formula[[3]] <- as.name(deparse(substitute(x)))

    out$mod <- glm(formula = formula,
    family = binomial,
    data = data)
    out
    }


    Con esta actualización, ahora podemos llamar a la función como antes: ```{r} fun(x = DF1$x, y = DF1$y, formula = y ~ x + a + b, data = DF2)

    La salida debe ser una lista que contenga una tabla y un modelo de regresión logística.

Comments are closed.