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

  1. 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>


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow