Komplexes Regressionsdiagramm in R.

10

Ich muss eine komplexe Grafik für die visuelle Datenanalyse zeichnen. Ich habe 2 Variablen und eine große Anzahl von Fällen (> 1000). Zum Beispiel (die Zahl ist 100, wenn die Dispersion weniger "normal" sein soll):

x <- rnorm(100,mean=95,sd=50)
y <- rnorm(100,mean=35,sd=20)
d <- data.frame(x=x,y=y)

1) Ich muss Rohdaten mit Punktgröße zeichnen, die der relativen Häufigkeit von Zufällen entspricht, plot(x,y)ist also keine Option - ich benötige Punktgrößen. Was ist zu tun, um dies zu erreichen?

2) Auf demselben Plot muss ich eine 95% -Konfidenzintervallellipse und eine Linie zeichnen, die die Änderung der Korrelation darstellt (ich weiß nicht, wie ich sie richtig benennen soll) - so etwas wie das:

library(corrgram)
corrgram(d, order=TRUE, lower.panel=panel.ellipse, upper.panel=panel.pts)

Korrelogramm

aber mit beiden Graphen auf einem Plot.

3) Schließlich muss ich darüber hinaus ein resultierendes lineares Regressionsmodell zeichnen:

r<-lm(y~x, data=d)
abline(r,col=2,lwd=2)

aber mit Fehlerbereich ... so etwas wie auf QQ-Plot:

QQ-Plot

aber für Anpassungsfehler, wenn es möglich ist.

Die Frage ist also:

Wie erreicht man all dies in einem Diagramm?

Yuriy Petrovskiy
quelle

Antworten:

29

Sieht das Bild unten so aus, wie Sie es erreichen möchten?

Geben Sie hier die Bildbeschreibung ein

Hier ist der aktualisierte R-Code, der Ihren Kommentaren folgt:

do.it <- function(df, type="confidence", ...) {
  require(ellipse)
  lm0 <- lm(y ~ x, data=df)
  xc <- with(df, xyTable(x, y))
  df.new <- data.frame(x=seq(min(df$x), max(df$x), 0.1))
  pred.ulb <- predict(lm0, df.new, interval=type)
  pred.lo <- predict(loess(y ~ x, data=df), df.new)
  plot(xc$x, xc$y, cex=xc$number*2/3, xlab="x", ylab="y", ...)
  abline(lm0, col="red")
  lines(df.new$x, pred.lo, col="green", lwd=1.5)
  lines(df.new$x, pred.ulb[,"lwr"], lty=2, col="red")
  lines(df.new$x, pred.ulb[,"upr"], lty=2, col="red")    
  lines(ellipse(cor(df$x, df$y), scale=c(sd(df$x),sd(df$y)), 
        centre=c(mean(df$x),mean(df$y))), lwd=1.5, col="green")
  invisible(lm0)
}

set.seed(101)
n <- 1000
x <- rnorm(n, mean=2)
y <- 1.5 + 0.4*x + rnorm(n)
df <- data.frame(x=x, y=y)

# take a bootstrap sample
df <- df[sample(nrow(df), nrow(df), rep=TRUE),]

do.it(df, pch=19, col=rgb(0,0,.7,.5))

Und hier ist die ggplotisierte Version

Geben Sie hier die Bildbeschreibung ein

produziert mit folgendem Code:

xc <- with(df, xyTable(x, y))
df2 <- cbind.data.frame(x=xc$x, y=xc$y, n=xc$number)
df.ell <- as.data.frame(with(df, ellipse(cor(x, y), 
                                         scale=c(sd(x),sd(y)), 
                                         centre=c(mean(x),mean(y)))))
library(ggplot2)

ggplot(data=df2, aes(x=x, y=y)) + 
  geom_point(aes(size=n), alpha=.6) + 
  stat_smooth(data=df, method="loess", se=FALSE, color="green") + 
  stat_smooth(data=df, method="lm") +
  geom_path(data=df.ell, colour="green", size=1.2)

Es könnte ein wenig mehr angepasst werden, indem Modellanpassungsindizes wie Cooks Abstand mit einem Farbschattierungseffekt hinzugefügt werden.

chl
quelle
1
@chl +1, schönes Diagramm und Funktionscode.
mpiktas
@mpiktas Danke. Dies führte mich zu der Erkenntnis, dass ich nicht mit der richtigen Probe gearbeitet habe :-)
chl
Sieht fast so aus wie die, die ich brauche, aber mit reellen Zahlen hatte ich folgende Probleme: 1) df.new <- data.frame(x = seq(min(x), max(x), 0.1))ist besser. 2) Ellipse wird an der Position 0; 0 gezeichnet, was nicht korrekt ist, und es werden s size is also strange (too small). Also tryed Bibliotheks- (Auto-) DatenEllipse (df y, Ebenen = 0,95: 1, lty = 2) `, aber es werden alle gelöscht. 3) Die Kurve (wie im Korrelogramm) fehlt. Ich habe es fast durch einen Anruf reproduziert, aber der Datenbereich ist falsch. Verwenden Sie zum Reproduzieren die ersten 2 Zeilen aus meinem Code anstelle Ihrer. x,dflibrary(car) cr.plots(m0)
Yuriy Petrovskiy
@Yuriy Ok, ich werde meinen Code aktualisieren (in der Zwischenzeit müssen keine Änderungen vorgenommen werden), aber ich kann nicht sehen, wie wir mit Ihrer -Einstellung Überlappungen mit reellen Zufallsvariablen erzielen können . Dies ist der Grund, warum ich Boostrap mit Ersatz verwende (dies stellt sicher, dass ~ 2/3 der ursprünglichen Einheiten vorhanden sind). bietet zwar die gleichen Funktionen wie im Paket, ist jedoch wahrscheinlich weniger einfach anzupassen. Ich denke, die überlagerte Kurve ist nur ein Löss , daher ist es nicht schwierig, sie hinzuzufügen. (x,y)car::dataEllipseellipse
Chl
2
@Tal Die Interpretation der Ellipse ist dieselbe wie im corrgramPaket: Sie zeigt einen paarweisen Konfidenzbereich von 95% unter der Annahme einer bivariaten Normalverteilung, die auf dem Mittelwert zentriert und mit SD (x) und SD (y) skaliert ist. Ich bin jedoch kein großer Fan davon, wenn ich es in einem Streudiagramm verwende. Aber siehe Murdoch & Chow, Eine grafische Darstellung großer Korrelationsmatrizen , Am Stat (1996) 50: 178, oder Friendly, Corrgrams: Exploratory Displays for Correlation Matrices , Am Stat (2002) 56: 316.
Chl
2

Verwenden Sie für Punkt 1 einfach den cexParameter im Diagramm, um die Punktgröße festzulegen.

Zum Beispiel

x = rnorm(100)
plot(x, pch=20, cex=abs(x))

Um mehrere Diagramme in einem Diagramm par(mfrow=c(numrows, numcols))zu haben, müssen Sie ein gleichmäßig verteiltes Layout verwenden oder layoutkomplexere erstellen.

nico
quelle
1
+1 für den Tipp cex, aber ich denke, das OP möchte, dass sich alle Dinge in derselben Plotregion befinden, nicht in separaten.
Chl
Ahh ... jetzt verstehe ich die Frage. Nun, dann kann er einfach die drei Graphen verwenden curveoder pointsüberzeichnen;)
nico