Як інтерпретувати сюжет QQ


172

Я працюю з невеликим набором даних (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-histogram
tpg2114

Що з цього? Чи показує графік QQ неформально розподілені дані? ! введіть тут опис зображень
David

Відповіді:


292

Якщо значення лежать уздовж лінії, розподіл має таку ж форму (до місця розташування та масштабу), як і припущений нами теоретичний розподіл.

Місцева поведінка : Переглядаючи відсортовані значення вибірки на осі y та (приблизні) очікувані кванти на осі x, ми можемо визначити, як значення в деякому розділі ділянки локально відрізняються від загальної лінійної тенденції, бачачи, чи значення більш-менш концентровані, ніж теоретичний розподіл передбачав би в цьому розділі сюжету:

розділи з чотирьох сюжетів QQ

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

Загальний показ:

Ось як у середньому виглядають QQ-сюжети (для конкретних варіантів розподілу) :

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

Але випадковість має тенденцію до незрозумілих речей, особливо з невеликими зразками:

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

н=21

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

н=21 навіть такі основні ознаки можуть бути важко помітити; ми не повинні намагатися «надмірно інтерпретувати» кожне маленьке хитання. Коли розміри зразків збільшуються, загалом кажучи, сюжети «стабілізуються», а функції стають зрозумілішими для інтерпретації, а не представляють шум. [З деякими дуже важкими дистрибутивами, рідкісна велика накладка може запобігти гарній стабілізації зображення навіть при досить великих розмірах зразка.]

Ви також можете знайти тут пропозицію корисною, намагаючись вирішити, як сильно вас турбує певна кількість викривлення або хитрощі.

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


18
Це дуже практичний посібник, дуже дякую, що зібрали всю цю інформацію.
JohnK

4
Я розумію, що тут важлива форма та тип відхилень від лінійності, але все ж дивно, що обидві осі мають позначку "... квантили", а одна вісь має 0,2 0,4 0,6, а інша - -2 -1 0 1 2. Знову здається, що деякі точки даних знаходяться в межах 40% від теоретичного розподілу, але як вони можуть бути розподілені між 3% власного розподілу, як підказує вісь y на вашому нижньому правому ділянці?
Макон

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, а потім запустити його на своєму ПК.

The 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)
}

The 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
Схоже, вміст вашого блискучого додатка зменшився. Можливо, ви могли просто надати код
rsoren

1
@rsoren додав, сподіваюся, що це допоможе, і я з нетерпінням чекаю слухання пропозицій.
Zhanxiong

Дуже хороша! Я б запропонував також додати варіанти зміни розміру вибірки та ступеня випадковості.
Ітамар

Посилання недоступне !!!! @Zhanxiong
Alireza Sanaee

Схоже, що посилання не відповідає після обмеженої кількості кліків щомісяця. Ось чому я тут вставив вихідний код (як цього вимагають інші користувачі, які зіткнулися з тією ж проблемою, що і ви). Ви можете вставити їх у свою R-студію та запустити їх на своєму ПК (після того, як необхідні пакунки завантажуються заздалегідь).
Zhanxiong

6

Дуже корисне (та інтуїтивно зрозуміле) пояснення дає проф. Філіп Ріголет в курсі MIT MOOC: 18.650 Статистика для заявок, осінь 2016 - дивіться відео за 45 хвилин

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

Я грубо скопіював його діаграму, яку я зберігаю у своїх записках, оскільки вважаю це дуже корисним.

QQ діаграма схеми сюжету

У прикладі 1 на верхній лівій діаграмі ми бачимо, що в правому хвості емпіричний (або зразок) квантил менший, ніж теоретичний квантил

Qe <Qt

α

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


3

Оскільки цей потік вважається остаточним "як інтерпретувати нормальний сюжет qq" StackExchange post, я хотів би вказати читачам на приємну, точну математичну залежність між нормальним сюжетним qq та статистикою надмірного куртозу.

Ось:

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

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

Оскільки куртоз - це середнє значення цих відхилень, зважене на відстані від середнього, значення поблизу центру ділянки qq мало впливають на куртоз. Отже, надлишковий куртоз не пов'язаний з центром поширення, де є «пік». Швидше за все, надлишок куртозу майже повністю визначається порівнянням хвостів розподілу даних із нормальним розподілом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.