Comment comparer deux jeux de données avec un tracé QQ en utilisant ggplot2?

11

En tant que novice en statistiques et en R, j'ai eu beaucoup de mal à essayer de générer des qqplots avec un rapport d'aspect de 1: 1. ggplot2 semble offrir beaucoup plus de contrôle sur le traçage que les packages de traçage R par défaut, mais je ne vois pas comment faire un qqplot dans ggplot2 pour comparer deux jeux de données.

Donc ma question, quel est l'équivalent ggplot2 de quelque chose comme:

qqplot(datset1,dataset2)
psychemedia
la source
Les documents ggplot2 pourraient être utiles: docs.ggplot2.org/current/stat_qq.html
Charlie

Réponses:

12

La chose la plus simple à faire est simplement de regarder comment cela qqplotfonctionne. Donc en type R:

R> qqplot
function (x, y, plot.it = TRUE, xlab = deparse(substitute(x)), 
    ylab = deparse(substitute(y)), ...) 
{
    sx <- sort(x)
    sy <- sort(y)
    lenx <- length(sx)
    leny <- length(sy)
    if (leny < lenx) 
        sx <- approx(1L:lenx, sx, n = leny)$y
    if (leny > lenx) 
        sy <- approx(1L:leny, sy, n = lenx)$y
    if (plot.it) 
        plot(sx, sy, xlab = xlab, ylab = ylab, ...)
    invisible(list(x = sx, y = sy))
}
<environment: namespace:stats>

Donc, pour générer l'intrigue, nous devons simplement obtenir sxet sy, à savoir:

x <- rnorm(10);y <- rnorm(20)

sx <- sort(x); sy <- sort(y)
lenx <- length(sx)
leny <- length(sy)
if (leny < lenx)sx <- approx(1L:lenx, sx, n = leny)$y
if (leny > lenx)sy <- approx(1L:leny, sy, n = lenx)$y

require(ggplot2)
g = ggplot() + geom_point(aes(x=sx, y=sy))
g

qqplot utilisant ggplot2

csgillespie
la source
2
ggplot2a un stat_qq(), est-il possible de l'utiliser? Il semble être conçu pour comparer un vecteur à une distribution théorique, je ne voyais pas comment l'utiliser pour comparer deux vecteurs différents.
Ken Williams
7
Vous pouvez réellement qqplot()faire tous les calculs sort/ length/ approxpour vous: d <- as.data.frame(qqplot(x, y, plot.it=FALSE)); ggplot(d) + geom_point(aes(x=x, y=y))
Ken Williams
9

Je l'utilise quand je veux aussi une ligne normale.

ggplot(data, aes(sample = data$column1)) + stat_qq(color="firebrick2", alpha=1) + geom_abline(intercept = mean(data$column1), slope = sd(data$column1))

KLDavenport
la source
0

Si votre besoin initial est simplement de contrôler le rapport d'aspect, voici une façon de le faire:

x <- rnorm(1000)
y <- rnorm(1500, 2)

myqq <- function(x, y, ...) {
  rg <- range(x, y, na.rm=T)
  qqplot(x, y, xlim=rg, ylim=rg, ...)
}

myqq(x, y)

intrigue myqq

Ken Williams
la source