web-dev-qa-db-fra.com

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

J'essaie de me familiariser avec l'utilisation de l'opérateur tilde et des fonctions associées. Ma 1ère question est la suivante: pourquoi I() doit-il être utilisé pour spécifier des opérateurs arithmétiques? Par exemple, ces 2 graphiques 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 génèrent également le résultat escompté

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

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

41
ChrisW

Le problème ici est de savoir comment les formules sont interprétées. Les opérateurs d'infixe "+", "*", ":" et "^" ont des significations entièrement différentes que lorsqu'ils sont utilisés avec des vecteurs numériques. Dans une formule, le tilde sépare le côté gauche du côté droit. Dans les formules, l'opérateur ^ Sert à construire des interactions de sorte que x = x^2 = x^3 Plutôt que la puissance mathématique attendue. (Une variable interagissant avec elle-même est exactement la même variable.) Si vous aviez tapé (x+y)^2, L'interpréteur R aurait produit (pour son propre usage interne), pas une mathématique: x^2 +2xy +y^2, Mais plutôt symbolique: x + y +x:yx:y est un terme d'interaction.

?formula

La fonction I() agit pour convertir l'argument en "as.is", c'est-à-dire ce que vous attendez. Donc I (x ^ 2) retournerait un vecteur de valeurs élevées à la deuxième puissance.

Le ~ Doit être considéré comme disant "est distribué comme" ou "dépend de" lorsqu'il est vu dans les fonctions de régression. Cela implique un terme d'erreur dans les descriptions de modèle qui sera généralement étiqueté "(Intercept)" et le contexte de la fonction et les arguments peuvent également déterminer davantage une fonction de lien telle que log () ou logit ().

Le symbole "+" dans une formule n'ajoute pas vraiment deux variables mais est généralement une demande implicite de calculer un ou des coefficients de régression pour cette variable dans le contexte des autres variables qui se trouvent sur l'ERS d'une formule. Les fonctions de régression utilisent `model.matrix et cette fonction reconnaîtra la présence de facteurs ou de vecteurs de caractères dans la formule et construira une matrice qui augmentera les niveaux des composants discrets de la formule.

Dans les fonctions plot () - ting, il inverse fondamentalement l'ordre habituel ( x, y ) Des arguments que la fonction plot prend habituellement. Il y avait une méthode plot.formula écrite pour que les formules puissent être utilisées comme un mode de communication plus "mathématique" avec R. Dans graphics::plot.formula, curve, et 'lattice' et 'ggplot' fonctions, il régit la façon dont plusieurs facteurs ou vecteurs numériques sont affichés et "facettés".

J'ai appris plus tard que ~ Est en fait une fonction primitive infixe (ou préfixe) qui crée un R 'appel' auquel on peut accéder avec les opérateurs d'extraction de liste. Tout cela est caché à l'utilisateur type, mais il peut s'agir d'une fonctionnalité utilisée par des auteurs de fonctions plus avancés.

La surcharge de l'opérateur "+" est discutée dans les commentaires ci-dessous et se fait également dans les packages de traçage: ggplot2 et gridExtra où se trouve-t-il les fonctions de séparation qui fournissent des résultats d'objet, de sorte qu'il agit et en tant qu'opérateur d'intercommunication et de superposition. Les fonctions d'agrégation qui ont une méthode de formule utilisent "+" comme un "arrangement" et un opérateur de regroupement.

48
42-