2015-08-03 11 views
7

Ich möchte die Annahmen der linearen (und später anderen Typ) Regression grafisch darstellen. Wie kann ich mein Grundstück kleinen Gaußschen Dichten (oder irgendeine Art von Dichten) auf einer Regressionslinie hinzufügen wie in dieser Figur:ggplot2: Wie kurbelt man kleine Gaußsche Dichten auf einer Regressionsgeraden?

enter image description here

+0

Sie etwas Hilfe von https://stats.stackexchange.com/ bekommen könnte zu – lispHK01

+1

[Diese Frage] (http://stackoverflow.com/a/13334294/903061) ist ziemlich verwandt. Wenn Sie das 'hist' in meiner Antwort so geändert haben, dass' 'dnorm'' anstelle von Daten verwendet wird, kann es sein, dass Sie mit Grunddiagrammen ein bisschen schließen. – Gregor

+0

Möchten Sie, dass es auf den zugrunde liegenden Daten basiert (auch wenn simuliert)? Oder begnügen Sie sich, in regelmäßigen Abständen perfekte kleine 'dnorm's zu zeichnen? – Gregor

Antwort

9

Sie können die empirischen Dichten der Residuen für die Abschnitte entlang eines Einbaus berechnen Linie. Dann ist es nur eine Frage der Zeichnung der Linien an den Positionen Ihrer Wahl in jedem Intervall mit geom_path. Um eine theoretische Verteilung hinzuzufügen, erzeugen Sie einige Dichten entlang des Bereichs der Residuen für jeden Abschnitt (hier unter Verwendung der normalen Dichte). Für die Normal Densities unten wird für jeden Abschnitt die Standardabweichung aus den Residuen bestimmt, aber Sie können für alle eine Standardabweichung wählen und diese stattdessen verwenden.

## Sample data 
set.seed(0) 
dat <- data.frame(x=(x=runif(100, 0, 50)), 
        y=rnorm(100, 10*x, 100)) 

## breaks: where you want to compute densities 
breaks <- seq(0, max(dat$x), len=5) 
dat$section <- cut(dat$x, breaks) 

## Get the residuals 
dat$res <- residuals(lm(y ~ x, data=dat)) 

## Compute densities for each section, and flip the axes, and add means of sections 
## Note: the densities need to be scaled in relation to the section size (2000 here) 
dens <- do.call(rbind, lapply(split(dat, dat$section), function(x) { 
    d <- density(x$res, n=50) 
    res <- data.frame(x=max(x$x)- d$y*2000, y=d$x+mean(x$y)) 
    res <- res[order(res$y), ] 
    ## Get some data for normal lines as well 
    xs <- seq(min(x$res), max(x$res), len=50) 
    res <- rbind(res, data.frame(y=xs + mean(x$y), 
           x=max(x$x) - 2000*dnorm(xs, 0, sd(x$res)))) 
    res$type <- rep(c("empirical", "normal"), each=50) 
    res 
})) 
dens$section <- rep(levels(dat$section), each=100) 

## Plot both empirical and theoretical 
ggplot(dat, aes(x, y)) + 
    geom_point() + 
    geom_smooth(method="lm", fill=NA, lwd=2) + 
    geom_path(data=dens, aes(x, y, group=interaction(section,type), color=type), lwd=1.1) + 
    theme_bw() + 
    geom_vline(xintercept=breaks, lty=2) 

enter image description here

Oder nur Gaußschen Kurven

enter image description here

Verwandte Themen