¿Cómo comparar dos conjuntos de datos con el gráfico QQ usando ggplot2?


11

Como principiante en estadísticas y R, he tenido un momento realmente difícil tratando de generar qqplots con una relación de aspecto de 1: 1. ggplot2 parece ofrecer mucho más control sobre el trazado que los paquetes de trazado R predeterminados, pero no puedo ver cómo hacer un qqplot en ggplot2 para comparar dos conjuntos de datos.

Entonces mi pregunta, ¿cuál es el equivalente ggplot2 de algo como:

qqplot(datset1,dataset2)

Los documentos de ggplot2 pueden ser útiles: docs.ggplot2.org/current/stat_qq.html
Charlie

Respuestas:


12

Lo más fácil es ver cómo qqplotfunciona. Entonces en tipo 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>

Entonces, para generar la trama solo tenemos que obtener sxy sy, es decir:

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 usando ggplot2


2
ggplot2tiene un stat_qq(), ¿hay alguna forma de usar eso? Parece estar diseñado para comparar un vector con una distribución teórica, no pude ver cómo usarlo para comparar dos vectores diferentes.
Ken Williams

77
Usted puede conseguir realmente qqplot()que hacer todos los sort/ length/ approxcálculos para usted: d <- as.data.frame(qqplot(x, y, plot.it=FALSE)); ggplot(d) + geom_point(aes(x=x, y=y))
Ken Williams

9

Lo uso cuando también quiero una línea normal.

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


0

Si su necesidad original es solo controlar la relación de aspecto, aquí hay una forma de hacerlo:

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)

parcela myqq

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.