Làm cách nào để so sánh hai bộ dữ liệu với cốt truyện QQ bằng ggplot2?


11

Là cả một số liệu thống kê và R người mới, tôi đã có một thời gian thực sự khó khăn khi cố gắng tạo qqplots với tỷ lệ khung hình là 1: 1. ggplot2 dường như cung cấp nhiều quyền kiểm soát hơn đối với âm mưu so với các gói vẽ R mặc định, nhưng tôi không thể xem cách thực hiện một qqplot trong ggplot2 để so sánh hai bộ dữ liệu.

Vì vậy, câu hỏi của tôi, ggplot2 tương đương với cái gì đó như:

qqplot(datset1,dataset2)

Các tài liệu ggplot2
Charlie

Câu trả lời:


12

Điều dễ nhất để làm là chỉ cần nhìn vào cách làm qqplotviệc. Vì vậy, trong loại 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>

Vì vậy, để tạo ra cốt truyện, chúng ta chỉ cần có sxsy, tức là:

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 sử dụng ggplot2


2
ggplot2Có một stat_qq(), có một số cách để sử dụng đó? Nó dường như được thiết kế để so sánh một vectơ với phân phối lý thuyết, tôi không thể thấy cách sử dụng nó để so sánh hai vectơ khác nhau.
Ken Williams

7
Bạn thực sự có thể thực qqplot()hiện tất cả các sort/ length/ approxphép tính cho bạn: d <- as.data.frame(qqplot(x, y, plot.it=FALSE)); ggplot(d) + geom_point(aes(x=x, y=y))
Ken Williams

9

Tôi sử dụng điều này khi tôi cũng muốn một dòng bình thường.

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


0

Nếu nhu cầu ban đầu của bạn chỉ là kiểm soát tỷ lệ khung hình, đây là một cách để làm điều đó:

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)

lô myqq

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.