Recherche…


Les bases de la formule

Les fonctions statistiques dans R utilisent largement la formule dite de Wilkinson-Rogers 1 .

Lorsqu'elles exécutent des fonctions de modèle telles que lm pour les régressions linéaires , elles ont besoin d'une formula . Cette formula spécifie les coefficients de régression à estimer.

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 

Sur le côté gauche du ~ (LHS), la variable dépendante est spécifiée, tandis que le côté droit (RHS) contient les variables indépendantes. Techniquement, l’appel de formula ci-dessus est redondant car l’opérateur tilde est une fonction infixe qui renvoie un objet avec une classe de formule:

form <- mpg ~ wt
class(form)
#[1] "formula"

L'avantage de la fonction de formula sur ~ est qu'elle permet également de spécifier un environnement d'évaluation:

form_mt <- formula(mpg ~ wt, env = mtcars)

Dans ce cas, la sortie montre qu'un coefficient de régression pour wt est estimé, ainsi que (par défaut) un paramètre d'interception. L'interception peut être exclue / forcée pour être 0 en incluant 0 ou -1 dans la formula :

coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))

Les interactions entre les variables a et b peuvent être ajoutées par a:b inclus à la formula :

 coef(lm(mpg ~ wt:vs, data = mtcars))

Comme il est (d'un point de vue statistique) généralement conseillé de ne pas avoir d'interactions dans le modèle sans les effets principaux, l'approche naïve consisterait à étendre la formula à a + b + a:b . Cela fonctionne mais peut être simplifié en écrivant a*b , où l'opérateur * indique un facteur de croisement (entre deux colonnes de facteurs) ou une multiplication lorsque l'une ou les deux colonnes sont 'numériques':

coef(lm(mpg ~ wt*vs, data = mtcars))

L'utilisation de la notation * étend un terme pour inclure tous les effets d'ordre inférieur, tels que:

coef(lm(mpg ~ wt*vs*hp, data = mtcars))

donnera, en plus de l'interception, 7 coefficients de régression. Un pour l'interaction à trois, trois pour les interactions à deux voies et trois pour les effets principaux.

Si l'on veut, par exemple, exclure l'interaction à trois voies, tout en conservant toutes les interactions bidirectionnelles, il existe deux raccourcis. Premièrement, en utilisant - nous pouvons soustraire tout terme particulier:

coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))

Ou, nous pouvons utiliser la notation ^ pour spécifier le niveau d'interaction requis:

coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))

Ces deux spécifications de formule devraient créer la même matrice de modèle.

Enfin, . est un raccourci pour utiliser toutes les variables disponibles comme principaux effets. Dans ce cas, l'argument data est utilisé pour obtenir les variables disponibles (qui ne figurent pas sur le LHS). Donc:

coef(lm(mpg ~ ., data = mtcars))

donne des coefficients pour l'interception et 10 variables indépendantes. Cette notation est fréquemment utilisée dans les packages d’apprentissage automatique, où l’on souhaite utiliser toutes les variables pour la prédiction ou la classification. Notez que le sens de . dépend du contexte (voir par exemple ?update.formula pour une signification différente).

  1. GN Wilkinson et CE Rogers. Journal de la Royal Statistical Society. Série C (Statistiques appliquées) Vol. 22, n ° 3 (1973), pp. 392-399

Créer des termes d'interaction linéaire, quadratique et de second ordre

y ~ . : Ici . est interprété comme toutes les variables sauf y dans le bloc de données utilisé pour ajuster le modèle. Il est équivalent aux combinaisons linéaires de variables prédictives. Par exemple y ~ var1 + var2 + var3+...+var15

y ~ . ^ 2 donnera tous les termes d'interaction linéaire (effets principaux) et de second ordre des variables dans le bloc de données. Il est équivalent à 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) : Ici I(var^2) indique un polynôme quadratique d'une variable dans la trame de données.

y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)

ou

y ~ poly(var1, var2, var3, ....var15, degree = 2) sera équivalent à l'expression ci-dessus.

poly(var1, degree = 2) est équivalent à var1 + I(var1^2) .

Pour obtenir des polynômes cubiques, utilisez degree = 3 dans poly() .

Il y a un inconvénient à utiliser poly versus I(var, 2) , qui après ajustement du modèle, chacun produira des coefficients différents, mais les valeurs ajustées sont équivalentes, car elles représentent des paramétrisations différentes du même modèle. Il est recommandé d'utiliser I(var, 2) sur poly() pour éviter l'effet de résumé vu dans poly() .

En résumé, pour obtenir des termes d’interaction linéaires, quadratiques et de second ordre, vous aurez une expression comme

y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)

Démo pour quatre variables:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow