2012-03-06 16 views
6

Nell'esempio seguente, si supponga di avere un modello in cui supp è una variabile fattore.Formule R e nomi dei coefficienti risultanti

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

ma desidero utilizzare un livello di base diverso per il fattore. I specificarlo direttamente nella formula:

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

e l'output sarà:

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

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

È molto conveniente fare trasformazioni direttamente nella formula, e non formare gruppi di dati intermedia o alterare il esistente. Un esempio è quando si usa scale per standardizzare le variabili dove è essenziale tenere conto delle perdite in altre variabili incluse nel modello finale. Spesso, tuttavia, i nomi dei coefficienti risultanti nell'output diventano piuttosto brutti.

La mia domanda è: è possibile specificare il nome di una variabile risultante da un'espressione quando si lavora con la formula? Qualcosa come

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

(che non funziona).

EDIT: Mentre la soluzione proposta da G. Grothendieck è bella, in realtà produce il risultato sbagliato. Il seguente esempio illustra questo:

# 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))) 

Il problema è che quando avvilente x2, utilizza osservazioni che non sono nel modello finale perché x1 ha missings.

Quindi per me rimane la domanda, se esiste un modo per l'interfaccia di formula per gestire questo caso senza il fastidioso passaggio intermedio di usare una formula extra ed estrarre un frame del modello, che può quindi essere "trasformato".

Spero che la domanda sia chiara.

risposta

7

modificarlo nell'argomento data= piuttosto che nella discussione formula=:

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

Nizza, grazie mille! – Stefan

+1

Se ti piace e risolve il tuo problema, devi fare clic per accettarlo ... –

+0

Ciao, GG, mentre la tua risposta è carina e funziona in molti casi, può comunque dare risultati indesiderati. Ho fatto un esempio in una modifica alla domanda. – Stefan

Problemi correlati