Нужны ли qqline z-оценки?

#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))