73

Come posso dire a R di usare un certo livello come riferimento se uso le variabili esplicative binarie in una regressione?Come forzare R a utilizzare un livello di fattore specificato come riferimento in una regressione?

È solo l'utilizzo di un livello per impostazione predefinita.

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

con b {0, 1, 2, 3, 4}. Diciamo che voglio usare 3 invece dello zero utilizzato da R.

+7

È necessario eseguire il passaggio di elaborazione dati al di fuori della formula/adattamento del modello. Quando crei il fattore da 'b' puoi specificare l'ordine dei livelli usando' factor (b, levels = c (3,1,2,4,5)) '. Facciamo questo in un passo di elaborazione dei dati al di fuori della chiamata 'lm()'. La mia risposta qui sotto usa la funzione 'relevel()' in modo da poter creare un fattore e quindi spostare il livello di riferimento per adattarlo a seconda delle necessità. –

+1

Ho riformulato la tua domanda.In realtà, dopo aver cambiato il livello di riferimento, non ne hai lasciato uno. –

+0

thx per riformulare la mia domanda. In effetti, relevel() era quello che stavo cercando. Thx per la risposta dettagliata e l'esempio però. Non sono sicuro che il tag di regressione lineare sia un po 'fuorviante perché questo si applica a tutti i tipi di regressione che usano gli esplicativi fittizi ... –

risposta

105

Vedere la funzione relevel(). Ecco un esempio:

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) 

Ora alterare il fattore b in DF mediante l'uso della funzione di relevel():

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

I modelli hanno stimato diversi livelli di riferimento.

> 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 
+2

Per presumere la variabile originale, non usare semplicemente 'within', ma' df $ bR = relevel (df $ b, ref = 3) '. – BurninLeo

24

Il comando relevel() è un metodo abbreviato alla tua domanda. Quello che fa è riordinare il fattore in modo che qualunque sia il livello di riferimento è il primo. Pertanto, il riordino dei livelli dei fattori avrà lo stesso effetto ma ti darà un maggiore controllo. Forse volevi avere i livelli 3,4,0,1,2. In tal caso ...

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

preferisco questo metodo perché è più facile per me vedere nel mio codice, non solo ciò che il riferimento era, ma la posizione degli altri valori, come pure (invece di dover guardare il risultati per quello).

NOTA: NON renderlo un fattore ordinato. Un fattore con un ordine specificato e un fattore ordinato non sono la stessa cosa. lm() potrebbe iniziare a pensare di volere contrasti polinomiali se lo fai.

+2

Contrasti polinomiali, non una regressione polinomiale. – hadley

+0

C'è un modo per impostare il livello di riferimento nello stesso momento in cui si definisce il fattore, piuttosto che in una chiamata successiva a relevel? –

28

Altri hanno menzionato il comando relevel che è la soluzione migliore se si desidera modificare il livello di base per tutte le analisi sui dati (o sono disposti a convivere con la modifica dei dati).

Se non si desidera modificare i dati (questa è una modifica una tantum, ma in futuro si desidera nuovamente il comportamento predefinito), quindi è possibile utilizzare una combinazione della funzione C (nota maiuscolo) per impostare i contrasti e i contr.treatmenti funzionano con l'argomento di base per scegliere quale livello vuoi essere la linea di base. Per esempio:

lm(Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris) 
11

È anche possibile contrassegnare manualmente la colonna con un attributo contrasts, che sembra essere rispettati dalle funzioni di regressione:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol), 
    base=which(levels(df$factorcol) == 'RefLevel')) 
3

So che questa è una vecchia questione, ma ho avuto un problema simile e ha rilevato che:

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

fa esattamente quello che hai chiesto.

+0

Questo è stato di grande aiuto! L'unica soluzione che includeva un modo per farlo all'interno del comando lm() che era esattamente quello di cui avevo bisogno. Grazie! – seeellayewhy