2012-03-06 13 views
6

En el ejemplo siguiente, supongamos que tiene un modelo en el que supp es una variable de factor.Fórmulas R y nombres de coeficientes resultantes

lm(len ~ dose + supp, data = ToothGrowth) 

pero quiero usar un nivel de base diferente para el factor. I podría especificar esto directamente en la fórmula:

lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

y la salida sería:

Call: 
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

Coefficients: 
     (Intercept)     dose relevel(supp, "VC")OJ 
      5.573     9.764     3.700 

Es muy conveniente de hacer transformaciones directamente en la fórmula, y no hacer conjuntos de datos intermedia o alterar el uno existente. Un ejemplo es cuando usa scale para estandarizar variables donde es esencial tener en cuenta las pérdidas en otras variables incluidas en el modelo final. A menudo, sin embargo, los nombres de los coeficientes resultantes en la salida se vuelven bastante feos.

Mi pregunta es: ¿es posible especificar el nombre de una variable que resulta de una expresión cuando se trabaja con la fórmula? Algo así como

lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth) 

(que no funciona).

EDITAR: Si bien la solución propuesta por G. Grothendieck es buena, en realidad produce un resultado incorrecto. El siguiente ejemplo muestra esto:

# Create some data: 
df <- data.frame(x1 = runif(10), x2=runif(10)) 
df <- transform(df, y = x1 + x2 + rnorm(10)) 

# Introduce some missings. 
df$x1[2:3] <- NA 

# The wrong result: 
lm(formula = y ~ z1 + z2, 
    data = transform(df, z1 = scale(x1), z2=scale(x2))) 

# extract a model frame. 
df2 <- model.frame(y ~ x1 + x2, df) 

# The right result: 
lm(formula = y ~ scale(x1) + scale(x2), 
    data = df2) 

# or: 
lm(formula = y ~ z1 + z2, 
    data = transform(model.frame(y ~ x1 + x2, df), 
      z1 = scale(x1), z2 = scale(x2))) 

La cuestión es que cuando degradante x2, utiliza observaciones que no están en el modelo final porque x1 tiene missings.

Me queda la pregunta de si la interfaz de fórmula puede manejar este caso sin tener el molesto paso intermedio de usar una fórmula extra y extraer un modelo de marco, que luego puede "transformarse".

Espero que la pregunta sea clara.

Respuesta

7

modificarla en el argumento data= en lugar de en el argumento formula=:

lm(len ~ dose + OJ, data = transform(ToothGrowth, OJ = relevel(supp, "VC"))) 
+0

Niza, muchas gracias! – Stefan

+1

Si te gusta y soluciona tu problema, debes hacer clic para aceptarlo ... –

+0

Hola, GG, aunque tu respuesta es buena y funciona en muchos casos, todavía puede dar resultados no deseados. Hice un ejemplo en una edición de la pregunta. – Stefan

Cuestiones relacionadas