我的数据集非常大,渲染生成的 QQ图很慢,有时甚至会冻结我的浏览器。我知道我有一个选项就是下采样数据向量。但是,我想尝试 hex binning 技术而不是下采样。不幸的是,我无法使它工作(我的几次尝试中有两次显示如下)。如果下采样可以实现使用十六进制分箱(我怀疑是,因为它类似于直方图),我很感激,如果有人可以告诉我如何做到这一点。我使用ggplot2
。谢谢!
g <- ggplot(df, aes(x=var)) + stat_qq(aes(x = var), geom = "hex")
g <- ggplot(df, aes(x = var, y = ..density..)) +
geom_hex(aes(sample = var), stat = "qq")
print (g)
第一次调用会导致以下错误消息:
Error: stat_qq requires the following missing aesthetics: sample
第二次调用会产生以下消息:
Error in eval(expr, envir, enclos) : object 'density' not found
更新:我认为更正确的变体是这个,但我不确定应该是什么参数:
g <- ggplot(df, aes(??, ??)) + stat_binhex()
答案 0 :(得分:1)
不确定这是否正是您正在寻找的,但我提供了几种方法来进行六边形分级。首先使用ggplot,因为你正在尝试使用ggplot,第二个使用包hexbin,这看起来对我来说更好,但只是我的偏好。
library(ggplot2)
x <- rgamma(1000,8,2)
y <- rnorm(1000,4,1.5)
binFrame <- data.frame(x,y)
qplot(x,y,data=binFrame, geom='bin2d') # with ggplot...rectangular binning actually
library(hexbin)
hexbinplot(y~x, data=binFrame) # with hexbin...actually hexagonal binning
编辑:
所以我在午餐时想到了这个问题,我认为基本问题是hexbining是一种多维数据缩减技术,看起来你试图在真正大样本上做单变量的QQ图,但是用hexbin在ggplot中。无论如何,我可以想到用ggplot做一个hex bin图的方法,但我想出的最好的方法是从头开始并手动构造理论分位数(x)和样本分位数(y)。所以这就是我想出来的。
手动基本QQ图
# setting up manual QQ plot used to plot with and with out hexbins
xSamp <- rgamma(1000,8,.5) # sample data
len <- 1000
i <- seq(1,len,by=1)
probSeq <- (i-.5)/len # probability grid
invCDF <- qnorm(probSeq,0,1) # theoretical quantiles for standard normal, but you could compare your sample to any distribution
orderGam <- xSamp[order(xSamp)] # ordered sampe
df <- data.frame(invCDF,orderGam)
plot(invCDF,orderGam,xlab="Standard Normal Theoretical Quantiles",ylab="Standardized Data Quantiles",main="QQ-Plot")
abline(lm(orderGam~invCDF),col="red",lwd=2)
ggplot中使用Hexbins的QQ图:
ggplot(df, aes(invCDF, orderGam)) + stat_binhex() + geom_smooth(method="lm")
![QQ情节与ggplot] [2]
因此,在一天结束时,这可能无法轻易扩大,但如果您希望对正态性进行真正的多维测试,您可能会考虑多元正态性的卡方图。欢呼声