58 votes

Dans les formules R, pourquoi dois-je utiliser la fonction I() sur les termes de puissance, comme y ~ I(x^3)

J'essaie de me faire une idée de l'utilisation de l'opérateur tilde et des fonctions associées. Ma première question est la suivante : pourquoi I() doivent être utilisées pour spécifier les opérateurs arithmétiques ? Par exemple, ces 2 tracés génèrent des résultats différents (le premier ayant une ligne droite, et le second la courbe attendue)

x <- c(1:100)
y <- seq(0.1,10,0.1)

plot(y~x^3)
plot(y~I(x^3))

En outre, les deux graphiques suivants produisent également le résultat attendu

plot(x^3, y)
plot(I(x^3), y)

Ma deuxième question est la suivante : les exemples que j'ai utilisés sont peut-être trop simples, mais je ne comprends pas où ~ devrait effectivement être utilisé.

8 votes

Toute excellente réponse à cette question s'appuiera largement sur ce qui est contenu dans ?formula .

0 votes

Duplicata ; nous devrions fermer l'un d'entre eux et rendre l'autre canonique : Que signifie la lettre majuscule "I" dans la formule de régression linéaire R ?

0 votes

@smci : Vous avez peut-être raison. Cependant, aucun des deux n'a proposé l'utilisation statistiquement plus correcte de poly jusqu'à ce que je remarque cette omission flagrante dans ma réponse et que je l'inclue. C'est un point de vue tellement différent sur le sujet général des formules dans R que je vais ajouter une réponse séparée.

70voto

BondedDust Points 105234

L'opérateur tilde est en fait une fonction qui renvoie une expression non évaluée, un type d'objet du langage. L'expression est ensuite interprétée par les fonctions de modélisation d'une manière différente de l'interprétation des opérateurs opérant sur des objets numériques.

Le problème ici est comment et plus particulièrement les opérateurs "+", " :" et "^" qu'elles contiennent sont interprétés. (Remarque : la procédure statistique correcte serait d'utiliser la fonction poly lorsqu'on tente de faire des termes d'ordre supérieur dans une formule de régression). Dans les formules R, les opérateurs infixes "+", "*", " :" et "^" ont des significations totalement différentes de celles utilisées dans les calculs avec des vecteurs numériques. Dans une formule, le tilde ( ~ ) sépare le côté gauche du côté droit. Le site ^ y : Les opérateurs sont utilisés pour construire des interactions de sorte que x = x^2 = x^3 plutôt que de devenir des pouvoirs mathématiques peut-être attendus. (Une variable qui interagit avec elle-même est tout simplement la même variable.) Si vous aviez tapé (x+y)^2 l'interpréteur R aurait produit (pour son propre usage interne), pas un mathématique : x^2 +2xy +y^2 mais plutôt un symbole : x + y +x:y donde x:y est un terme d'interaction sans ses effets principaux. (Le ^ vous donne à la fois les effets principaux et les interactions).

?formula

El I() agit pour convertir l'argument en "tel quel", c'est-à-dire ce que vous attendez. Ainsi, I(x^2) renverrait un vecteur de valeurs élevé à la deuxième puissance.

El ~ doit être considéré comme signifiant "est distribué comme" ou "dépend de" dans les fonctions de régression. Le site ~ est une fonction infixe à part entière. Vous pouvez constater que LHS ~ RHS est presque un raccourci pour formula(LHS, RHS) en tapant ceci à la console :

`~`(LHS,RHS)
#LHS ~ RHS

class( `~`(LHS,RHS) )
#[1] "formula"

identical( `~`(LHS,RHS), as.formula("LHS~RHS") )
#[1] TRUE   # cannot use `formula` since it interprets its first argument

Dans les fonctions de régression, le terme d'erreur dans les descriptions de modèles sera sous la forme présumée par la fonction de régression ou spécifiquement demandée dans les paramètres de la fonction de régression. family . La moyenne pour le niveau de base sera généralement étiquetée (Intercept) . Le contexte et les arguments de la fonction peuvent également déterminer une fonction de liaison, telle que log() ou logit(), à partir de l'ensemble des données de la fonction. family et il est également possible d'avoir une combinaison famille/lien non canonique.

Le symbole "+" dans une formule n'ajoute pas vraiment deux variables mais est généralement une demande implicite de calculer un ou plusieurs coefficients de régression pour cette variable dans le contexte du reste des variables qui sont sur la droite de la formule. Les fonctions de régression utilisent `model.matrix et cette fonction reconnaît la présence de facteurs ou de vecteurs de caractères dans la formule et construit une matrice qui développe les niveaux des composants discrets de la formule.

Dans les fonctions de plot()-ting, il s'agit essentiellement d'inverser l'habituel ( x, y ) ordre des arguments que la fonction de traçage prend habituellement. Une méthode plot.formula a été écrite pour que les formules puissent être utilisées comme un mode de communication plus "mathématique" avec R. Dans la méthode graphics::plot.formula , curve et les fonctions "lattice" et "ggplot", elle régit la manière dont les facteurs multiples ou les vecteurs numériques sont affichés et "facettés".

La surcharge de l'opérateur "+" est discutée dans les commentaires ci-dessous et est également effectuée dans les paquets de traçage : ggplot2 et gridExtra où il sépare les fonctions qui fournissent des résultats d'objets. Là, il agit comme un opérateur de passage et de superposition. Certaines fonctions d'agrégation ont une méthode de formule qui utilise "+" comme opérateur d'arrangement et de regroupement.

1 votes

J'avais déjà lu ?formula (bien que cela n'ait pas été clair dans ma question) ; ce qui m'a dérouté, c'est le concept d'opérateurs dans la formulation des modèles. Par exemple, je ne comprends pas du tout comment l'opérateur + Le symbole peut signifier autre chose que l'addition de deux valeurs.

2 votes

Dans une formule au sein d'une fonction de régression, vous demandez implicitement de renvoyer un ensemble de coefficients (estimés) associés à (généralement multipliés par) chacun des termes reliés par des "+".

4 votes

@ChrisW Le + est surchargé dans le contexte d'une formule. Cela est fait pour donner une sensation plus intuitive aux spécifications des formules. Autrement, les appels de régression ressembleraient à lm( formula=formula(y.var,x.var1,x.var2) ) ce qui est moins facile à comprendre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X