Как интерпретировать сюжет QQ


173

Я работаю с небольшим набором данных (21 наблюдение) и имею следующий нормальный график QQ в R:

введите описание изображения здесь

Видя, что сюжет не поддерживает нормальность, что я могу сделать вывод о базовом распределении? Мне кажется, что распределение, более искаженное вправо, было бы лучше, верно? Кроме того, какие еще выводы мы можем сделать из данных?


9
Вы правы, что это указывает на правильную асимметрию. Я постараюсь найти некоторые посты по интерпретации сюжетов QQ.
Glen_b

3
Вам не нужно делать вывод; вам просто нужно решить, что попробовать дальше. Здесь я рассмотрел бы квадратное укоренение или регистрацию данных.
Ник Кокс

11
(1.5,2)(1.5,220)(0,70)

3
@Glen_b Ответ на мой вопрос содержит некоторую информацию: stats.stackexchange.com/questions/71065/… а ссылка в ответе имеет другой хороший источник: stats.stackexchange.com/questions/52212/qq-plot-does-not -match-гистограмма
tpg2114

Что из этого? Показывает ли график QQ ненормально распределенные данные? ! введите описание изображения здесь
Дэвид

Ответы:


293

Если значения лежат вдоль линии, распределение имеет ту же форму (вплоть до местоположения и масштаба), что и теоретическое распределение, которое мы предположили.

Локальное поведение : при просмотре отсортированных выборочных значений на оси Y и (приблизительных) ожидаемых квантилей на оси X мы можем определить, насколько локально отличаются значения в некотором разделе графика от общего линейного тренда, посмотрев, значения более или менее сконцентрированы, чем теоретическое распределение предположило бы в этом разделе графика:

разделы из четырех QQ участков

Как мы видим, менее сконцентрированные точки увеличивают больше и более концентрированные точки, чем предполагаемое, увеличиваются менее быстро, чем можно предположить по общей линейной зависимости, и в крайних случаях соответствуют разрыву в плотности образца (показан как почти вертикальный скачок) или всплеск постоянных значений (значения выровнены по горизонтали). Это позволяет нам определить тяжелый хвост или легкий хвост и, следовательно, асимметрию, большую или меньшую, чем теоретическое распределение, и так далее.

Общий вид:

Вот как в среднем выглядят QQ-графики (для конкретных вариантов распределения) :

введите описание изображения здесь

Но случайность имеет тенденцию запутывать вещи, особенно с небольшими выборками:

введите описание изображения здесь

n=21

введите описание изображения здесь

n=21

Вы также можете найти предложения здесь полезно при попытке решить , сколько вы должны беспокоиться о конкретной сумме кривизны или wiggliness.

Более подходящее руководство для интерпретации в целом также включало бы дисплеи с меньшим и большим размерами выборки.


18
Это очень практическое руководство, большое спасибо за сбор всей этой информации.
JohnK

4
Я понимаю, что здесь имеет значение форма и тип отклонения от линейности, но все же выглядит странным, что обе оси помечены как "... квантили", и одна ось имеет значение 0,2 0,4 0,6, а другая - -2 -1 0 1 2. Опять же, выглядит хорошо, что некоторые точки данных находятся в пределах 40% от теоретического распределения, но как они могут быть распределены между 3% их собственного распределения, как показывает ось Y на вашем нижнем правом углу графика?
Macond

2
@Macond По оси Y показаны необработанные значения данных, а не их квантили. Я согласен с тем, что стандартизация оси Y сделает вещи намного понятнее, и я понятия не имею, почему R не делает этого по умолчанию. Может ли кто-то пролить свет на это?
Гордон Густафсон

4
@GordonGustafson в отношении вашего первого комментария к Macond, есть очень веская причина, почему вы не стандартизируете данные - потому что график QQ - это отображение данных ! Он предназначен для отображения информации в данных, которые вы предоставляете функции (было бы разумно стандартизировать данные, которые вы предоставляете для коробочного графика или гистограммы). Если вы преобразуете его, он больше не будет отображать данные (хотя форма на графике может быть похожей, вы больше не будете отображать местоположение или масштаб на графике). Я не уверен, что, по вашему мнению, будет более понятным в стандартизированном сюжете - вы можете уточнить?
Glen_b

2
@ZiyaoWei Нет, у униформы действительно очень легкие хвосты - возможно, вообще никаких. Все в 2 MADs центра. Первый абзац этого ответа дает ясный, общий способ думать о том, что означает «тяжелый хвост».
Glen_b

63

Я сделал блестящее приложение, чтобы помочь интерпретировать нормальный сюжет QQ. Попробуйте эту ссылку.

В этом приложении вы можете настроить асимметрию, хвостик (куртоз) и модальность данных, а также увидеть, как меняются гистограмма и график QQ. И наоборот, вы можете использовать его так, как указано в графике QQ, а затем проверить, какой должна быть асимметрия и т. Д.

Для получения дополнительной информации см. Документацию в нем.


Я понял, что у меня недостаточно свободного места, чтобы предоставить это приложение онлайн. По желанию, я предоставлю все три куски кода: sample.R, server.Rи ui.Rздесь. Те, кто заинтересован в запуске этого приложения, могут просто загрузить эти файлы в Rstudio и запустить его на своем ПК.

sample.RФайл:

# Compute the positive part of a real number x, which is $\max(x, 0)$.
positive_part <- function(x) {ifelse(x > 0, x, 0)}

# This function generates n data points from some unimodal population.
# Input: ----------------------------------------------------
# n: sample size;
# mu: the mode of the population, default value is 0.
# skewness: the parameter that reflects the skewness of the distribution, note it is not
#           the exact skewness defined in statistics textbook, the default value is 0.
# tailedness: the parameter that reflects the tailedness of the distribution, note it is
#             not the exact kurtosis defined in textbook, the default value is 0.

# When all arguments take their default values, the data will be generated from standard 
# normal distribution.

random_sample <- function(n, mu = 0, skewness = 0, tailedness = 0){
  sigma = 1

  # The sampling scheme resembles the rejection sampling. For each step, an initial data point
  # was proposed, and it will be rejected or accepted based on the weights determined by the
  # skewness and tailedness of input. 
  reject_skewness <- function(x){
      scale = 1
      # if `skewness` > 0 (means data are right-skewed), then small values of x will be rejected
      # with higher probability.
      l <- exp(-scale * skewness * x)
      l/(1 + l)
  }

  reject_tailedness <- function(x){
      scale = 1
      # if `tailedness` < 0 (means data are lightly-tailed), then big values of x will be rejected with
      # higher probability.
      l <- exp(-scale * tailedness * abs(x))
      l/(1 + l)
  }

  # w is another layer option to control the tailedness, the higher the w is, the data will be
  # more heavily-tailed. 
  w = positive_part((1 - exp(-0.5 * tailedness)))/(1 + exp(-0.5 * tailedness))

  filter <- function(x){
    # The proposed data points will be accepted only if it satified the following condition, 
    # in which way we controlled the skewness and tailedness of data. (For example, the 
    # proposed data point will be rejected more frequently if it has higher skewness or
    # tailedness.)
    accept <- runif(length(x)) > reject_tailedness(x) * reject_skewness(x)
    x[accept]
  }

  result <- filter(mu + sigma * ((1 - w) * rnorm(n) + w * rt(n, 5)))
  # Keep generating data points until the length of data vector reaches n.
  while (length(result) < n) {
    result <- c(result, filter(mu + sigma * ((1 - w) * rnorm(n) + w * rt(n, 5))))
  }
  result[1:n]
}

multimodal <- function(n, Mu, skewness = 0, tailedness = 0) {
  # Deal with the bimodal case.
  mumu <- as.numeric(Mu %*% rmultinom(n, 1, rep(1, length(Mu))))
  mumu + random_sample(n, skewness = skewness, tailedness = tailedness)
}

server.RФайл:

library(shiny)
# Need 'ggplot2' package to get a better aesthetic effect.
library(ggplot2)

# The 'sample.R' source code is used to generate data to be plotted, based on the input skewness, 
# tailedness and modality. For more information, see the source code in 'sample.R' code.
source("sample.R")

shinyServer(function(input, output) {
  # We generate 10000 data points from the distribution which reflects the specification of skewness,
  # tailedness and modality. 
  n = 10000

  # 'scale' is a parameter that controls the skewness and tailedness.
  scale = 1000

  # The `reactive` function is a trick to accelerate the app, which enables us only generate the data
  # once to plot two plots. The generated sample was stored in the `data` object to be called later.
  data <- reactive({
    # For `Unimodal` choice, we fix the mode at 0.
    if (input$modality == "Unimodal") {mu = 0}

    # For `Bimodal` choice, we fix the two modes at -2 and 2.
    if (input$modality == "Bimodal") {mu = c(-2, 2)}

    # Details will be explained in `sample.R` file.
    sample1 <- multimodal(n, mu, skewness = scale * input$skewness, tailedness = scale * input$kurtosis)
    data.frame(x = sample1)})

  output$histogram <- renderPlot({
    # Plot the histogram.
    ggplot(data(), aes(x = x)) + 
      geom_histogram(aes(y = ..density..), binwidth = .5, colour = "black", fill = "white") + 
      xlim(-6, 6) +
      # Overlay the density curve.
      geom_density(alpha = .5, fill = "blue") + ggtitle("Histogram of Data") + 
      theme(plot.title = element_text(lineheight = .8, face = "bold"))
  })

  output$qqplot <- renderPlot({
    # Plot the QQ plot.
    ggplot(data(), aes(sample = x)) + stat_qq() + ggtitle("QQplot of Data") + 
      theme(plot.title = element_text(lineheight=.8, face = "bold"))
    })
})

Наконец, ui.Rфайл:

library(shiny)

# Define UI for application that helps students interpret the pattern of (normal) QQ plots. 
# By using this app, we can show students the different patterns of QQ plots (and the histograms,
# for completeness) for different type of data distributions. For example, left skewed heavy tailed
# data, etc. 

# This app can be (and is encouraged to be) used in a reversed way, namely, show the QQ plot to the 
# students first, then tell them based on the pattern of the QQ plot, the data is right skewed, bimodal,
# heavy-tailed, etc.


shinyUI(fluidPage(
  # Application title
  titlePanel("Interpreting Normal QQ Plots"),

  sidebarLayout(
    sidebarPanel(
      # The first slider can control the skewness of input data. "-1" indicates the most left-skewed 
      # case while "1" indicates the most right-skewed case.
      sliderInput("skewness", "Skewness", min = -1, max = 1, value = 0, step = 0.1, ticks = FALSE),

      # The second slider can control the skewness of input data. "-1" indicates the most light tail
      # case while "1" indicates the most heavy tail case.
      sliderInput("kurtosis", "Tailedness", min = -1, max = 1, value = 0, step = 0.1, ticks = FALSE),

      # This selectbox allows user to choose the number of modes of data, two options are provided:
      # "Unimodal" and "Bimodal".
      selectInput("modality", label = "Modality", 
                  choices = c("Unimodal" = "Unimodal", "Bimodal" = "Bimodal"),
                  selected = "Unimodal"),
      br(),
      # The following helper information will be shown on the user interface to give necessary
      # information to help users understand sliders.
      helpText(p("The skewness of data is controlled by moving the", strong("Skewness"), "slider,", 
               "the left side means left skewed while the right side means right skewed."), 
               p("The tailedness of data is controlled by moving the", strong("Tailedness"), "slider,", 
                 "the left side means light tailed while the right side means heavy tailedd."),
               p("The modality of data is controlledy by selecting the modality from", strong("Modality"),
                 "select box.")
               )
  ),

  # The main panel outputs two plots. One plot is the histogram of data (with the nonparamteric density
  # curve overlaid), to get a better visualization, we restricted the range of x-axis to -6 to 6 so 
  # that part of the data will not be shown when heavy-tailed input is chosen. The other plot is the 
  # QQ plot of data, as convention, the x-axis is the theoretical quantiles for standard normal distri-
  # bution and the y-axis is the sample quantiles of data. 
  mainPanel(
    plotOutput("histogram"),
    plotOutput("qqplot")
  )
)
)
)

1
Похоже, емкость вашего приложения Shiny исчерпана. Может быть, вы могли бы просто предоставить код
rsoren

1
@rsoren добавил, надеюсь, это поможет, и я с нетерпением жду предложений.
Zhanxiong

Очень хорошо! Я бы предложил также добавить опции для изменения размера выборки и степени случайности.
Итамар

Ссылка не доступна !!!! @Zhanxiong
Алиреза Сана

Кажется, что ссылка не отвечает после ограниченного числа нажатий каждый месяц. По этой причине я вставил сюда исходный код (по запросу других пользователей, которые столкнулись с той же проблемой, что и вы). Вы можете вставить их в свою R studio и запустить на своем ПК (после предварительной загрузки необходимых пакетов).
Zhanxiong

6

Очень полезное (и интуитивное) объяснение дает проф. Филипп Риголле на курсе MIT MOOC: 18.650 Статистика по приложениям, осень 2016 г. - смотрите видео за 45 минут

https://www.youtube.com/watch?v=vMaKx9fmJHE

Я грубо скопировал его схему, которую я храню в своих заметках, так как считаю ее очень полезной.

QQ сюжетная схема

В примере 1 на верхнем левом графике мы видим, что в правом хвосте эмпирический (или выборочный) квантиль меньше теоретического квантиля

Qe <Qt

α

введите описание изображения здесь


3

Так как эта тема считается окончательной статьей StackExchange «как интерпретировать нормальный график qq», я хотел бы указать читателям на приятную, точную математическую связь между нормальным графиком qq и статистикой избыточного эксцесса.

Вот:

https://stats.stackexchange.com/a/354076/102879

Краткое (и слишком упрощенное) резюме приводится ниже (см. Ссылку для более точных математических утверждений): вы можете фактически увидеть избыточный эксцесс в нормальном графике qq как среднее расстояние между квантилями данных и соответствующими теоретическими нормальными квантилями, взвешенными по расстоянию от данных до среднего. Таким образом, когда абсолютные значения в хвостах графика qq обычно сильно отклоняются от ожидаемых нормальных значений в экстремальных направлениях, вы получаете положительный избыточный эксцесс.

Поскольку эксцесс является средним из этих отклонений, взвешенных по расстояниям от среднего значения, значения вблизи центра графика qq мало влияют на эксцесс. Следовательно, избыточный эксцесс не связан с центром распределения, где находится «пик». Скорее избыточный эксцесс почти полностью определяется сравнением хвостов распределения данных с нормальным распределением.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.