J'essaie de créer un ajustement polynomial du second ordre à certaines données que j'ai. Disons que je trace cette correspondance avec ggplot()
:
ggplot(data, aes(foo, bar)) + geom_point() +
geom_smooth(method="lm", formula=y~poly(x, 2))
Je reçois:
Ainsi, un ajustement de deuxième ordre fonctionne assez bien. Je le calcule avec R:
summary(lm(data$bar ~ poly(data$foo, 2)))
Et je reçois:
lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.268162 0.008282 394.623 <2e-16 ***
# poly(data$foo, 2)1 -0.122391 0.096225 -1.272 0.206
# poly(data$foo, 2)2 1.575391 0.096225 16.372 <2e-16 ***
# ....
Maintenant, je suppose que la formule pour mon ajustement est la suivante:
Mais cela ne me donne que de mauvaises valeurs. Par exemple, avec étant 3, je pense que deviendrait quelque chose autour de 3.15. Cependant, en insérant dans la formule ci-dessus, je reçois: bar
Ce qui donne? Est-ce que j'interprète mal les coefficients du modèle?
r
regression
interpretation
regression-coefficients
utilisateur13907
la source
la source
poly
sans taper d'abord?poly
dans R? Cela dit " Calculez les polynômes orthogonaux " en haut en grosses lettres amicales.?poly
pour comprendre la syntaxe. Certes, je ne connais que très peu les concepts qui la sous-tendent Je ne savais pas qu'il y avait autre chose (ou une différence si importante entre les polynômes "normaux" et les polynômes orthogonaux), et les exemples que j'ai vus en ligne étaient tous utiliséspoly()
pour le montage, en particulier avecggplot
- alors pourquoi ne pas simplement utiliser cela et être confus si le résultat était "faux"? Remarquez que je ne suis pas doué en mathématiques - je ne fais que mettre en pratique ce que j'ai vu faire et que j'essaie de comprendre.Réponses:
Ma réponse détaillée est ci-dessous, mais la réponse générale (c'est-à-dire réelle) à ce type de question est la suivante: 1) expérimentez, vissez, regardez les données, vous ne pouvez pas casser l'ordinateur, peu importe ce que vous faites, donc. . . expérience; ou 2) RTFM .
Voici un
R
code qui reproduit plus ou moins le problème identifié dans cette question:Le premier
lm
retourne la réponse attendue:La seconde
lm
retourne quelque chose d'étrange:Puisque
lm
est le même dans les deux appels, il faut que les argumentslm
soient différents. Alors, regardons les arguments. Evidemment,y
c'est pareil. Ce sont les autres parties. Regardons les premières observations sur les variables de droite lors du premier appel delm
. Le retour dehead(cbind(x,x^2))
ressemble à:C'est comme prévu. La première colonne est
x
et la deuxième colonne estx^2
. Que diriez-vous du deuxième appel delm
, celui avec poly? Le retour dehead(poly(x,2))
ressemble à:OK, c'est vraiment différent. La première colonne ne l'est pas
x
et la deuxième colonne ne l'est pasx^2
. Donc, quoipoly(x,2)
qu’il en soit , il ne revient pasx
etx^2
. Si nous voulons savoir ce qui sepoly
passe, nous pourrions commencer par lire son fichier d’aide. Alors on dithelp(poly)
. La description dit:Maintenant, vous savez ce que sont les "polynômes orthogonaux" ou vous ne le savez pas. Si vous ne le faites pas, utilisez alors Wikipedia ou Bing (pas Google, bien sûr, car Google est diabolique - pas aussi grave qu'Apple, bien sûr, mais toujours aussi mauvais). Ou bien, vous pouvez décider que vous ne vous souciez pas de ce que sont les polynômes orthogonaux. Vous remarquerez peut-être l'expression "polynômes bruts" et vous remarquerez peut-être un peu plus loin dans le fichier d'aide qui
poly
a une optionraw
qui est, par défaut, égale àFALSE
. Ces deux considérations peuvent vous inciter à choisir leshead(poly(x, 2, raw=TRUE))
retours:Excité par cette découverte (ça a l'air bien, maintenant, oui?), Vous pouvez continuer d'essayer
summary(lm(y ~ poly(x, 2, raw=TRUE)))
Cela revient:La réponse ci-dessus comporte au moins deux niveaux. Tout d'abord, j'ai répondu à votre question. Deuxièmement, et bien plus important encore, j’ai illustré comment vous êtes censé répondre vous-même à de telles questions. Chaque personne qui "sait programmer" a suivi une séquence semblable à celle décrite plus de soixante millions de fois. Même des gens aussi décevants en matière de programmation que moi parcourent cette séquence tout le temps. Il est normal que le code ne fonctionne pas. Il est normal de mal comprendre ce que font les fonctions. La façon de le gérer consiste à faire le tour, à expérimenter, à regarder les données et à RTFM. Sortez du mode "suivre une recette sans réfléchir" et passez en mode "détective".
la source
Il existe une approche intéressante pour l’interprétation de la régression polynomiale par Stimson et al. (1978) . Cela implique la réécriture
comme
la source
Si vous voulez juste un coup de pouce dans la bonne direction sans autant de jugement:
poly()
créez des polynômes orthogonaux (non corrélés), par opposition àI()
, ce qui ignore complètement la corrélation entre les polynômes résultants. La corrélation entre les variables prédictives peut être un problème dans les modèles linéaires (voir ici pour plus d'informations sur les raisons pour lesquelles la corrélation peut être problématique), il est donc probablement préférable (en général) d'utiliserpoly()
plutôt que d' utiliserI()
. Maintenant, pourquoi les résultats sont-ils si différents? Eh bien, à la foispoly()
etI()
prendre x et le convertir en un nouveau x (dans le casI()
, la nouvelle x est juste x ^ 1 ou x ^ 2, dans le caspoly()
, sont beaucoup plus compliquées sont les nouveaux x (si vous voulez savoir d'où ils viennent (et vous n'avez probablement pas), vous pouvez commencerici ou la page Wikipedia susmentionnée ou un manuel). Le fait est que, lorsque vous calculez (prédisez) y en fonction d'un ensemble particulier de valeurs x, vous devez utiliser les valeurs x converties générées par l'unpoly()
ou l' autreI()
(en fonction de celle qui figurait dans votre modèle linéaire). Alors:Dans ce cas, les deux modèles renvoient la même réponse, ce qui suggère que la corrélation entre les variables de prédicteur n'influence pas vos résultats. Si la corrélation posait problème, les deux méthodes prédiraient des valeurs différentes.
la source
'poly' exécute l'ortho-normalisation de Graham-Schmidt sur les polynômes 1, x, x ^ 2, ..., x ^ deg Par exemple, cette fonction fait la même chose que 'poly' sans renvoyer bien sûr d'attributs 'coef'.
J'ai atterri sur ce fil parce que la forme fonctionnelle m'intéressait. Alors, comment pouvons-nous exprimer le résultat de 'poly' en tant qu'expression? Il suffit d'inverser la procédure Graham-Schmidt. Vous allez vous retrouver avec un désordre!
la source