如何使用ggplot2将两个数据集与QQ图进行比较?


11

作为统计人员和R新手,我一直很难尝试生成纵横比为1:1的qqplots。ggplot2似乎比默认的R绘图包提供了更多的绘图控制,但是我看不到如何在ggplot2中执行qqplot来比较两个数据集。

所以我的问题是,ggplot2等价于什么?

qqplot(datset1,dataset2)

ggplot2文档可能会有所帮助:docs.ggplot2.org/current/stat_qq.html
Charlie

Answers:


12

最简单的事情就是看qqplot工作原理。因此在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>

因此,要生成图,我们只需获取sxsy,即:

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

使用ggplot2的qqplot


2
ggplot2确实有stat_qq(),有没有办法使用它?它似乎旨在将一个向量与理论分布进行比较,但我看不到如何使用它来比较两个不同的向量。
肯·威廉姆斯

7
您实际上可以qqplot()为您完成所有sort/ length/ approx计算: d <- as.data.frame(qqplot(x, y, plot.it=FALSE)); ggplot(d) + geom_point(aes(x=x, y=y))
Ken Williams

9

当我也想要一条正常的线时,我会用它。

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


0

如果您最初的需求只是控制宽高比,则可以采用以下一种方法:

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)

myqq情节

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.