Sürüm 2'den beri.0, ggplot2 uzantısı için iyi belgelenmiş bir arayüze sahiptir; (Iyileştirmeler welcome böylece, ilk kez yaptık) bu yüzden artık kolayca kendiliğinden qqline için yeni bir stat yazabilirsiniz:
qq.line <- function(data, qf, na.rm) {
# from stackoverflow.com/a/4357932/1346276
q.sample <- quantile(data, c(0.25, 0.75), na.rm = na.rm)
q.theory <- qf(c(0.25, 0.75))
slope <- diff(q.sample)/diff(q.theory)
intercept <- q.sample[1] - slope * q.theory[1]
list(slope = slope, intercept = intercept)
}
StatQQLine <- ggproto("StatQQLine", Stat,
# http://docs.ggplot2.org/current/vignettes/extending-ggplot2.html
# https://github.com/hadley/ggplot2/blob/master/R/stat-qq.r
required_aes = c('sample'),
compute_group = function(data, scales,
distribution = stats::qnorm,
dparams = list(),
na.rm = FALSE) {
qf <- function(p) do.call(distribution, c(list(p = p), dparams))
n <- length(data$sample)
theoretical <- qf(stats::ppoints(n))
qq <- qq.line(data$sample, qf = qf, na.rm = na.rm)
line <- qq$intercept + theoretical * qq$slope
data.frame(x = theoretical, y = line)
}
)
stat_qqline <- function(mapping = NULL, data = NULL, geom = "line",
position = "identity", ...,
distribution = stats::qnorm,
dparams = list(),
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE) {
layer(stat = StatQQLine, data = data, mapping = mapping, geom = geom,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(distribution = distribution,
dparams = dparams,
na.rm = na.rm, ...))
}
Bu aynı zamanda dağıtım üzerinde genelleştirildiğinde (tam olarak böyle stat_qq
yapar) aşağıdaki gibi ve kullanılabilir:
> test.data <- data.frame(sample=rnorm(100, 10, 2)) # normal distribution
> test.data.2 <- data.frame(sample=rt(100, df=2)) # t distribution
> ggplot(test.data, aes(sample=sample)) + stat_qq() + stat_qqline()
> ggplot(test.data.2, aes(sample=sample)) + stat_qq(distribution=qt, dparams=list(df=2)) +
+ stat_qqline(distribution=qt, dparams=list(df=2))
(qqline ayrı katmanda olduğu için maalesef ben dağıtım parametreleri "yeniden" için bir yol bulamadık, ama bu sadece küçük bir sorun olmalı .)
Works gibi geom_abline() ile eklenebilir düşündürmektedir! Vektörü direkt olarak doğrusal bir modelden çıkarmak için kodu biraz değiştirmenin özgürlüğünü aldım. Elbette çözümünüz doğrusal bir modelde olmayan verilerle çalışacaktır, ancak bir başkasının bir LM'den bir qqplot oluşturmak için bir kolaylık fonksiyonu isteyebileceğini düşündüm. – Peter