¿Cómo forzar a R a usar un nivel de factor especificado como referencia en una regresión?


¿Cómo puedo decirle a R que use un cierto nivel como referencia si uso variables explicativas binarias en una regresión?

Solo está usando algún nivel por defecto.

lm(x ~ y + as.factor(b)) 

Con b {0, 1, 2, 3, 4}. Digamos que quiero usar 3 en lugar del cero que es usado por R.

Author: An economist, 2010-10-06

5 answers

Vea la función relevel(). He aquí un ejemplo:

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

Ahora altere el factor b en DF mediante el uso de la función relevel():

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

Los modelos han estimado diferentes niveles de referencia.

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759
 120
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 12:05:52

Otros han mencionado el comando relevel que es la mejor solución si desea cambiar el nivel base para todos los análisis de sus datos (o está dispuesto a vivir con el cambio de los datos).

Si no desea cambiar los datos (este es un cambio de una sola vez, pero en el futuro desea el comportamiento predeterminado de nuevo), entonces puede usar una combinación de la función C (nota en mayúsculas) para establecer contrastes y el contr.los tratamientos funcionan con el argumento base para elegir el nivel que desea para ser la línea de base. Por ejemplo:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
 32
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 15:24:55

El comando relevel() es un método abreviado para su pregunta. Lo que hace es reordenar el factor para que lo que sea que sea el nivel de referencia sea el primero. Por lo tanto, reordenar los niveles de factores también tendrá el mismo efecto, pero le dará más control. Tal vez usted quería tener niveles 3,4,0,1,2. En ese caso...

bFactor <- factor(b, levels = c(3,4,0,1,2))

Prefiero este método porque es más fácil para mí ver en mi código no solo cuál era la referencia, sino también la posición de los otros valores (en lugar de tener que mirar en los resultados para eso).

NOTA: NO lo hagas un factor ordenado. Un factor con un orden especificado y un factor ordenado no son lo mismo. lm() puede empezar a pensar que desea contrastes polinómicos si lo hace.

 25
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-17 19:16:00

Sé que esta es una vieja pregunta, pero tuve un problema similar y encontré que:

lm(x ~ y + relevel(b, ref = "3")) 

Hace exactamente lo que pidió.

 15
Author: Yan Alperovych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 14:27:23

También puede etiquetar manualmente la columna con un atributo contrasts, que parece ser respetado por las funciones de regresión:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))
 11
Author: Harlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 15:25:15