2012-03-14 9 views
8

Estoy construyendo una función para muchos tipos de modelo que necesita extraer la fórmula utilizada para hacer el modelo. ¿Hay una manera flexible de hacer esto? Por ejemplo:Extracto de fórmula del modelo en R

x <- rnorm(10) 
y <- rnorm(10) 
z <- rnorm(10) 
equation <- z ~ x + y 
model <- lm(equation) 

Lo que tengo que hacer es extraer el objeto de fórmula "ecuación" una vez que se pasa el modelo.

Respuesta

12

Se podía conseguir lo que quería por:

model$call 
# lm(formula = formula) 

Y si usted quiere ver lo que he encontrado a cabo a continuación, utilizar:

str(model) 

Desde que ha pasado 'fórmula' (mala elección de nombres por cierto) del entorno de llamada que puede necesitar extraer del objeto que pasó:

eval(model$call[[2]]) 
# z ~ x + y 

@JPM ac ofreció un método más compacto: formula(model). También vale la pena mirar el mecanismo utilizado por la función formula.lm. La función llamada formula es genérica y usa methods(formula) para ver qué métodos S3 se han definido. Dado que el método formula.lm tiene un asterisco en su extremo, es necesario que lo envuelve en `getAnywhere:

> getAnywhere(formula.lm) 
A single object matching ‘formula.lm’ was found 
It was found in the following places 
    registered S3 method for formula from namespace stats 
    namespace:stats 
with value 

function (x, ...) 
{ 
    form <- x$formula 
    if (!is.null(form)) { 
     form <- formula(x$terms) 
     environment(form) <- environment(x$formula) 
     form 
    } 
    else formula(x$terms) 
} 
<bytecode: 0x36ff26158> 
<environment: namespace:stats> 

Por lo tanto, está utilizando "$" para extraer el elemento de la lista denominada "fórmula" en lugar de tirar desde la llamada . Si falta el artículo $ formula (que es en su caso), entonces lo reemplaza con formula(x$terms), que sospecho que está llamando al formula.default y al observar el funcionamiento de esa función parece que solo se está ajustando el entorno del objeto.

+0

Gracias por responder, ¿cómo puedo acceder realmente a la "fórmula" del objeto de fórmula? Si intento info <- model $ call, info $ formula solo me da un objeto de símbolo "formula". – mike

+0

Sugiero 'as.list (modelo $ call) $ formula' en lugar de' modelo $ call [[2]] '. – flodel

+0

@mike: No estoy seguro de lo que estás preguntando. Usted es el que decidió llamar a su fórmula, "fórmula", y luego pasó eso como un argumento con nombre a 'lm'. 'fortunes :: fortuna (" perro ")' definitivamente se aplica aquí. –

3

Como se indicó, model$call recibirá la llamada que creó el objeto lm, pero si esa llamada contiene un objeto como la fórmula del modelo, obtendrá el nombre del objeto, no la fórmula.

El objeto evaluado, es decir, la propia fórmula, se puede acceder en model$terms (junto con un montón de información auxiliar sobre cómo se trató). Esto debería funcionar independientemente de los detalles de la llamada al lm.

Cuestiones relacionadas