R Language
Formula
Ricerca…
Le basi della formula
Le funzioni statistiche in R fanno un uso pesante della cosiddetta notazione formula 1 di Wilkinson-Rogers.
Quando eseguono funzioni di modello come lm
per le regressioni lineari , hanno bisogno di una formula
. Questa formula
specifica quali coefficienti di regressione devono essere stimati.
my_formula1 <- formula(mpg ~ wt)
class(my_formula1)
# gives "formula"
mod1 <- lm(my_formula1, data = mtcars)
coef(mod1)
# gives (Intercept) wt
# 37.285126 -5.344472
Sul lato sinistro del ~
(LHS) viene specificata la variabile dipendente, mentre il lato destro (RHS) contiene le variabili indipendenti. Tecnicamente la chiamata alla formula
sopra è ridondante perché l'operatore tilde è una funzione infisso che restituisce un oggetto con la classe formula:
form <- mpg ~ wt
class(form)
#[1] "formula"
Il vantaggio della funzione formula
su ~
è che consente anche di specificare un ambiente per la valutazione:
form_mt <- formula(mpg ~ wt, env = mtcars)
In questo caso, l'output mostra che un coefficiente di regressione per wt
è stimato, così come (per impostazione predefinita) un parametro di intercettazione. L'intercettazione può essere esclusa / forzata per essere 0 includendo 0
o -1
nella formula
:
coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))
Le interazioni tra le variabili a
e b
possono essere aggiunte includendo a:b
alla formula
:
coef(lm(mpg ~ wt:vs, data = mtcars))
Come è generalmente (da un punto di vista statistico) generalmente consigliabile non avere interazioni nel modello senza gli effetti principali, l'approccio ingenuo sarebbe quello di espandere la formula
a a + b + a:b
. Questo funziona ma può essere semplificato scrivendo a*b
, dove l'operatore *
indica il passaggio del fattore (quando tra due colonne di fattori) o la moltiplicazione quando una o entrambe le colonne sono "numeriche":
coef(lm(mpg ~ wt*vs, data = mtcars))
L'uso della notazione *
espande un termine per includere tutti gli effetti di ordine inferiore, in modo tale che:
coef(lm(mpg ~ wt*vs*hp, data = mtcars))
fornirà, oltre all'intercetta, 7 coefficienti di regressione. Uno per l'interazione a tre, tre per le interazioni a doppio senso e tre per gli effetti principali.
Se si desidera, ad esempio, escludere l'interazione a tre, ma mantenere tutte le interazioni a due vie, ci sono due stenografie. Innanzitutto, usando -
possiamo sottrarre qualsiasi termine particolare:
coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))
Oppure, possiamo usare la notazione ^
per specificare il livello di interazione che richiediamo:
coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))
Queste due specifiche della formula dovrebbero creare la stessa matrice del modello.
Infine, .
è una scorciatoia per usare tutte le variabili disponibili come effetti principali. In questo caso, l'argomento data
viene utilizzato per ottenere le variabili disponibili (che non sono nell'LHS). Perciò:
coef(lm(mpg ~ ., data = mtcars))
fornisce coefficienti per l'intercetta e 10 variabili indipendenti. Questa notazione è frequentemente usata nei pacchetti di machine learning, dove si vorrebbe usare tutte le variabili per la previsione o la classificazione. Si noti che il significato di .
dipende dal contesto (vedi ad esempio ?update.formula
per un significato diverso).
- GN Wilkinson e CE Rogers. Ufficiale della Royal Statistical Society. Serie C (statistica applicata) vol. 22, n. 3 (1973), pp. 392-399
Creare termini di interazione lineare, quadratica e secondo ordine
y ~ .
: Qui .
viene interpretato come tutte le variabili tranne y
nel frame di dati utilizzato per il fitting del modello. È equivalente alle combinazioni lineari di variabili predittive. Ad esempio y ~ var1 + var2 + var3+...+var15
y ~ . ^ 2
fornirà tutti i termini di interazione lineare (effetti principali) e del secondo ordine delle variabili nel frame di dati. È equivalente a y ~ var1 + var2 + ...+var15 + var1:var2 + var1:var3 + var1:var4...and so on
y ~ var1 + var2 + ...+var15 + I(var1^2) + I(var2^2) + I(var3^2)...+I(var15^2)
: Qui I(var^2)
indica il polinomio quadratico di una variabile nel frame di dati.
y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)
o
y ~ poly(var1, var2, var3, ....var15, degree = 2)
sarà equivalente all'espressione precedente.
poly(var1, degree = 2)
è equivalente a var1 + I(var1^2)
.
Per ottenere polinomi cubici, utilizzare degree = 3
in poly()
.
C'è un avvertimento nell'uso di poly
versus I(var, 2)
, che è dopo aver montato il modello, ognuno di essi produrrà coefficienti diversi, ma i valori adattati sono equivalenti, perché rappresentano diverse parametrizzazioni dello stesso modello. Si raccomanda di usare I(var, 2)
su poly()
per evitare l'effetto di riepilogo visto in poly()
.
In breve, per ottenere termini di interazione lineare, quadratica e di secondo ordine, avrai un'espressione simile
y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)
Demo per quattro variabili:
old <- reformulate( 'y ~ x1+x2+x3+x4' )
new <- reformulate( " y ~ .^2 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) ")
tmp <- .Call(stats:::C_updateform, old, new)
terms.formula(tmp, simplify = TRUE )
# ~y ~ x1 + x2 + x3 + x4 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) +
# x1:x2 + x1:x3 + x1:x4 + x2:x3 + x2:x4 + x3:x4
# attr(,"variables")
# list(~y, x1, x2, x3, x4, I(x1^2), I(x2^2), I(x3^2), I(x4^2))
# attr(,"factors")
# x1 x2 x3 x4 I(x1^2) I(x2^2) I(x3^2) I(x4^2) x1:x2 x1:x3 x1:x4 x2:x3 x2:x4 x3:x4
# ~y 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# x1 1 0 0 0 0 0 0 0 1 1 1 0 0 0
# x2 0 1 0 0 0 0 0 0 1 0 0 1 1 0
# x3 0 0 1 0 0 0 0 0 0 1 0 1 0 1
# x4 0 0 0 1 0 0 0 0 0 0 1 0 1 1
# I(x1^2) 0 0 0 0 1 0 0 0 0 0 0 0 0 0
# I(x2^2) 0 0 0 0 0 1 0 0 0 0 0 0 0 0
# I(x3^2) 0 0 0 0 0 0 1 0 0 0 0 0 0 0
# I(x4^2) 0 0 0 0 0 0 0 1 0 0 0 0 0 0
# attr(,"term.labels")
# [1] "x1" "x2" "x3" "x4" "I(x1^2)" "I(x2^2)" "I(x3^2)" "I(x4^2)"
# [9] "x1:x2" "x1:x3" "x1:x4" "x2:x3" "x2:x4" "x3:x4"
# attr(,"order")
# [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2
# attr(,"intercept")
# [1] 1
# attr(,"response")
# [1] 1
# attr(,".Environment")
# <environment: R_GlobalEnv>