Comment présenter le gain de variance expliquée grâce à la corrélation de Y et X?


11

Je cherche à expliquer (visuellement) la corrélation linéaire simple aux étudiants de première année.

La manière classique de visualiser serait de donner un nuage de points Y ~ X avec une droite de régression.

Récemment, j'ai eu l'idée d'étendre ce type de graphisme en ajoutant à l'intrigue 3 images supplémentaires, me laissant avec: l'intrigue de y ~ 1, puis de y ~ x, resid (y ~ x) ~ x et enfin des résidus (y ~ x) ~ 1 (centré sur la moyenne)

Voici un exemple d'une telle visualisation: texte alternatif

Et le code R pour le produire:

set.seed(345)
x <- runif(50) * 10
y <- x +rnorm(50)


layout(matrix(c(1,2,2,2,2,3 ,3,3,3,4), 1,10))
plot(y~rep(1, length(y)), axes = F, xlab = "", ylim = range(y))
points(1,mean(y), col = 2, pch = 19, cex = 2)
plot(y~x, ylab = "", )
abline(lm(y~x), col = 2, lwd = 2)

plot(c(residuals(lm(y~x)) + mean(y))~x, ylab = "", ylim = range(y))
abline(h =mean(y), col = 2, lwd = 2)

plot(c(residuals(lm(y~x)) + mean(y))~rep(1, length(y)), axes = F, xlab = "", ylab = "", ylim = range(y))
points(1,mean(y), col = 2, pch = 19, cex = 2)

Ce qui m'amène à ma question: j'apprécierais toute suggestion sur la façon dont ce graphique peut être amélioré (soit avec du texte, des marques ou tout autre type de visualisations pertinentes). Ajouter du code R pertinent sera également une bonne chose.

Une direction consiste à ajouter des informations sur le R ^ 2 (soit par texte, soit en ajoutant des lignes présentant l'ampleur de la variance avant et après l'introduction de x) Une autre option consiste à mettre en évidence un point et à montrer comment il est "meilleur expliqué "grâce à la droite de régression. Toute contribution sera appréciée.


1
En même temps, vous montrez à quel point la régression linéaire peut être bonne, veuillez également montrer à votre public comment elle échoue dans des situations où les relations ne sont pas bien décrites par des lignes droites:require(mlbench) ; cor( mlbench.smiley()$x ); plot(mlbench.smiley()$x)
DWin

Va faire Dwin ... :-)
Tal Galili

Réponses:


4

Voici quelques suggestions (sur votre intrigue, pas sur la façon dont j'illustrerais l'analyse de corrélation / régression):

  • Les deux tracés univariés que vous montrez dans les marges droite et gauche peuvent être simplifiés avec un appel à rug();
  • Je trouve plus informatif de montrer un tracé de densité de et ou un boxplot, au risque d'être évocateur de l'idée d'une hypothèse de bi-normalité qui n'a aucun sens dans ce contexte;YXY
  • En plus de la droite de régression, il convient de montrer une estimation non paramétrique de la tendance, comme un lœss (c'est une bonne pratique et très informative sur les non-linéarités locales possibles);
  • Les points peuvent être mis en évidence (avec des couleurs ou des tailles variables) en fonction de l'effet de levier ou des distances de cuisson, c'est-à-dire n'importe laquelle de ces mesures qui montrent l'influence des valeurs individuelles sur la ligne de régression estimée. Je vais appuyer le commentaire de @ DWin et je pense qu'il vaut mieux souligner comment les points individuels "dégradent" la qualité de l'ajustement ou induisent une sorte de dérogation à l'hypothèse de linéarité.

À noter, ce graphique suppose que X et Y sont des données non appariées, sinon je m'en tiendrai à un tracé de Bland-Altman ( contre ), en plus du nuage de points.( X + Y ) / 2(XY)(X+Y)/2


1

Ne répondant pas à votre question exacte, mais les éléments suivants pourraient être intéressants en visualisant un écueil possible de corrélations linéaires basé sur une réponse de stackoveflow :

par(mfrow=c(2,1))

set.seed(1)
x <- rnorm(1000)
y <- rnorm(1000)
plot(y~x, ylab = "", main=paste('1000 random values (r=', round(cor(x,y), 4), ')',  sep=''))
abline(lm(y~x), col = 2, lwd = 2)

x <- c(x, 500)
y <- c(y, 500)
cor(x,y)
plot(y~x, ylab = "", main=paste('1000 random values and (500, 500) (r=', round(cor(x,y), 4), ')',  sep=''))
abline(lm(y~x), col = 2, lwd = 2)

texte alternatif

La réponse de @Gavin Simpson et @ bill_080 comprend également de jolis tracés de corrélation dans le même sujet.


1

J'aurais deux graphiques à deux panneaux, les deux ont le graphique xy à gauche et un histogramme à droite. Dans le premier tracé, une ligne horizontale est placée à la moyenne de y et les lignes s'étendent de ce point à chaque point, représentant les résidus des valeurs y de la moyenne. L'histogramme avec cela trace simplement ces résidus. Ensuite, dans la paire suivante, le tracé xy contient une ligne représentant l'ajustement linéaire et à nouveau des lignes verticales représentant les résidus, qui sont représentés dans un histogramme à droite. Gardez l'axe x des histogrammes constant pour mettre en évidence le passage à des valeurs inférieures dans l'ajustement linéaire par rapport à l'ajustement moyen.


1

Je pense que ce que vous proposez est bon, mais je le ferais dans trois exemples différents

1) X et Y sont complètement indépendants. Supprimez simplement "x" du code r qui génère y (y1 <-rnorm (50))

2) L'exemple que vous avez publié (y2 <- x + rnorm (50))

3) Les X sont Y sont la même variable. Supprimez simplement "rnorm (50)" du code r qui génère y (y3 <-x)

Cela montrerait plus explicitement comment l'augmentation de la corrélation diminue la variabilité des résidus. Il vous suffit de vous assurer que l'axe vertical ne change pas avec chaque tracé, ce qui peut se produire si vous utilisez la mise à l'échelle par défaut.

Vous pouvez donc comparer trois graphiques r1 vs x, r2 vs x et r3 vs x. J'utilise "r" pour indiquer les résidus de l'ajustement en utilisant respectivement y1, y2 et y3.

Mes compétences R en traçage sont assez désespérées, donc je ne peux pas offrir beaucoup d'aide ici.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.