วิธีการเปรียบเทียบสองชุดข้อมูลกับพล็อต QQ โดยใช้ ggplot2?


11

ในฐานะที่เป็นทั้งสถิติและสามเณร R ฉันมีช่วงเวลาที่ยากลำบากมากที่พยายามสร้าง qqplots ด้วยอัตราส่วนกว้างยาว 1: 1 ggplot2 ดูเหมือนว่าจะให้การควบคุมการวางแผนมากกว่าแพ็คเกจการวางแผน R เริ่มต้น แต่ฉันไม่เห็นวิธีทำ qqplot ใน ggplot2 เพื่อเปรียบเทียบชุดข้อมูลสองชุด

ดังนั้นคำถามของฉัน ggplot2 เทียบเท่ากับอะไรเช่น:

qqplot(datset1,dataset2)

เอกสาร ggplot2 อาจมีประโยชน์: docs.ggplot2.org/current/stat_qq.html
Charlie

คำตอบ:


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>

ดังนั้นเพื่อสร้างพล็อตที่เราต้องได้รับsxและsyเช่น:

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 ใช้ ggplot2


2
ggplot2มี a stat_qq(), มีวิธีใช้ไหม? ดูเหมือนว่าจะได้รับการออกแบบมาเพื่อเปรียบเทียบเวกเตอร์หนึ่งตัวกับการกระจายเชิงทฤษฎีฉันไม่เห็นวิธีใช้เพื่อเปรียบเทียบเวกเตอร์สองตัวที่แตกต่างกัน
Ken Williams

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.