Come forzare R per utilizzare un determinato livello di fattore come riferimento in una regressione?

Come posso dire a R uso di un certo livello come riferimento se uso il binario di variabili esplicative in una regressione?

È solo utilizzo di un certo livello per impostazione predefinita.

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

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

  • Si dovrebbe fare il trattamento dei dati passo al di fuori della formula del modello/montaggio. Durante la creazione di un fattore da b è possibile specificare l’ordine dei livelli utilizzando factor(b, levels = c(3,1,2,4,5)). Fare questo in una fase di trasformazione al di fuori del lm() chiamare anche se. La mia risposta qui sotto utilizza il relevel() funzione in modo da poter creare un fattore per poi spostare il livello di riferimento di tutto per soddisfare quanto è necessario.
  • Ho riformulato la domanda. Si sta effettivamente dopo aver cambiato il livello di riferimento, non lasciare fuori.
  • thx per la riformulazione mia domanda. Infatti, relevel() era quello che stavo cercando. Thx per la risposta dettagliata e l’esempio però. Io non sono sicuro se la regressione lineare tag è un po ‘ fuorviante, perché questo vale per tutti i tipi di regressione utilizzando il manichino explanatories…

 

5 Replies
  1. 135

    Vedere il relevel() funzione. Qui è 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 modificare il fattore di b in DF dall’uso del relevel() funzione:

    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
    • Per preseve variabile originale, basta non usare il within, ma df$bR = relevel(df$b, ref=3).
    • È possibile utilizzare relevel() all’interno di una formula, non influenzano il dataset originale…
  2. 33

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

    Se non si desidera modificare i dati (questo è un momento di cambiamento, ma in futuro si desidera che il comportamento predefinito di nuovo), quindi è possibile utilizzare una combinazione di C (nota il maiuscolo) funzione per impostare i contrasti e la contr.treatments funzione con l’argomento base per la scelta di quale livello si vuole essere la linea di base.

    Per esempio:

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

    Il relevel() comando è un metodo più breve alla tua domanda. Ciò che fa è riordinare il fattore di modo che qualunque sia il rif livello di prima. Pertanto, riordinare i vostri livelli di fattore avrà lo stesso effetto, ma ti dà più controllo. Forse si voleva avere livelli 3,4,0,1,2. In questo caso…

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

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

    NOTA: NON fanno un ordinato fattore. Un fattore con un ordine specifico e di un ordinato fattore non sono la stessa cosa. lm() può iniziare a pensare che si desidera che il polinomio di contrasti, se è possibile.

    • Il polinomio di contrasti, non una regressione polinomiale.
    • C’è un modo per impostare il livello di riferimento, al tempo stesso, che si definisce il fattore, piuttosto che in una successiva chiamata relevel?
  4. 24

    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.

    • Questo è stato un grande aiuto! Unica soluzione che comprendeva un modo per farlo all’interno della lm() comando che era esattamente quello di cui avevo bisogno. Grazie!
    • Questo è un modo molto flessibile per lavorare con fattori. Mi piace il fatto che posso combinare con as.factor(), se necessario, per esempio utilizzando ...+relevel(as.factor(mycol), ref = "myref")+...
  5. 11

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

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

Lascia un commento