#r
#r
Вопрос:
У меня есть эти переменные:
v1 <- c(1,1,2,2,2,3,3,3,3,6,6,6,9,9,9)
v2 <- c(1,1,1,1,2,2,3,3,3,5,5,7,7,7,7)
и я пытаюсь создать QQplot с QQline. Итак, я пишу:
qqplot(v1,v2)
qqline(v1,v2)
и я получаю эту картинку:
Как вы можете видеть, QQline находится в странном месте.
Я трансформирую v1
и v2
их z-баллы:
zv1 <- (v1-mean(v1))/sd(v1)
zv2 <- (v2-mean(v2))/sd(v2)
и я рисую QQplot и QQline:
qqplot(zv1,zv2)
qqline(zv1,zv2)
итак, я получаю это изображение:
где QQline находится в значимом месте.
Что происходит не так с QQline из v1
и v2
?
Заранее спасибо!
Ответ №1:
Всякий раз, когда вы сомневаетесь или у вас плохая документация, проверьте код функции напрямую (доступ к qqplot и qqline, как если бы они были объектами):
qqplot
# function (x, y, plot.it = TRUE, xlab = deparse1(substitute(x)),
# ylab = deparse1(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))
# }
# <bytecode: 0x000001efc320e5b0>
# <environment: namespace:stats>
qqline
# function (y, datax = FALSE, distribution = qnorm, probs = c(0.25,
# 0.75), qtype = 7, ...)
# {
# stopifnot(length(probs) == 2, is.function(distribution))
# y <- quantile(y, probs, names = FALSE, type = qtype, na.rm = TRUE)
# x <- distribution(probs)
# if (datax) {
# slope <- diff(x)/diff(y)
# int <- x[1L] - slope * y[1L]
# }
# else {
# slope <- diff(y)/diff(x)
# int <- y[1L] - slope * x[1L]
# }
# abline(int, slope, ...)
# }
# <bytecode: 0x000001efc32c5290>
# <environment: namespace:stats>
По сути, qqline не делает того, что вы думали (он получает не два вектора, а вектор и целевое распределение). В заключение, чтобы решить вашу проблему, просто сделайте:
sx <- sort(v1)
sy <- sort(v2)
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
plot(sx, sy)
abline(lm(sy ~ sx))