Bagaimana menafsirkan plot QQ

173

Saya bekerja dengan dataset kecil (21 pengamatan) dan memiliki plot QQ normal berikut di R:

masukkan deskripsi gambar di sini

Melihat plot tidak mendukung normalitas, apa yang bisa saya simpulkan tentang distribusi yang mendasarinya? Sepertinya bagi saya bahwa distribusi yang lebih condong ke kanan akan lebih cocok, bukan? Juga, kesimpulan apa lagi yang bisa kita ambil dari data?

JohnK
sumber
9
Anda benar bahwa ini menunjukkan kemiringan yang benar. Saya akan mencoba menemukan beberapa posting untuk menafsirkan plot QQ.
Glen_b
3
Anda tidak harus menyimpulkan; Anda hanya perlu memutuskan apa yang akan dicoba selanjutnya. Di sini saya akan mempertimbangkan rooting persegi atau pendataan data.
Nick Cox
11
(1.5,2)(1.5,220)(0,70)
3
@Glen_b Jawaban atas pertanyaan saya memiliki beberapa informasi: stats.stackexchange.com/questions/71065/… dan tautan dalam jawaban memiliki sumber lain yang bagus: stats.stackexchange.com/questions/52212/qq-plot-does-not -match-histogram
tpg2114
Apa ini? Apakah plot QQ menunjukkan data yang didistribusikan secara tidak resmi? ! masukkan deskripsi gambar di sini
David

Jawaban:

293

Jika nilai-nilai terletak di sepanjang garis distribusi memiliki bentuk yang sama (hingga lokasi dan skala) seperti distribusi teoritis yang kami perkirakan.

Perilaku lokal : Ketika melihat nilai sampel yang diurutkan pada sumbu y dan (perkiraan) kuantil yang diharapkan pada sumbu x, kita dapat mengidentifikasi dari bagaimana nilai dalam beberapa bagian plot berbeda secara lokal dari tren linear keseluruhan dengan melihat apakah nilai-nilai lebih atau kurang terkonsentrasi daripada distribusi teoritis kira dalam bagian plot:

bagian dari empat plot QQ

Seperti yang kita lihat, titik yang kurang terkonsentrasi meningkat lebih banyak dan lebih banyak titik terkonsentrasi daripada yang seharusnya meningkat lebih cepat daripada hubungan linear keseluruhan akan menyarankan, dan dalam kasus ekstrim sesuai dengan kesenjangan dalam kepadatan sampel (ditunjukkan sebagai lompatan hampir vertikal) atau lonjakan nilai konstan (nilai selaras secara horizontal). Ini memungkinkan kita untuk menemukan ekor yang berat atau ekor yang ringan dan karenanya, kemiringan lebih besar atau lebih kecil dari distribusi teoretis, dan seterusnya.

Penampilan secara keseluruhan:

Berikut adalah apa yang tampak seperti plot QQ (untuk pilihan distribusi tertentu) rata-rata :

masukkan deskripsi gambar di sini

Tetapi keacakan cenderung mengaburkan hal-hal, terutama dengan sampel kecil:

masukkan deskripsi gambar di sini

n=21

masukkan deskripsi gambar di sini

n=21

Anda juga dapat menemukan saran di sini berguna ketika mencoba memutuskan seberapa banyak Anda harus khawatir tentang jumlah kelengkungan atau kerontokan tertentu.

Panduan yang lebih cocok untuk interpretasi secara umum juga akan mencakup tampilan pada ukuran sampel yang lebih kecil dan lebih besar.

Glen_b
sumber
18
Ini adalah panduan yang sangat praktis, terima kasih banyak telah mengumpulkan semua informasi itu.
JohnK
4
Saya mengerti bahwa itu adalah bentuk dan jenis penyimpangan dari linearitas yang penting di sini, tapi tetap saja terlihat aneh bahwa kedua sumbu diberi label "... kuantil" dan satu sumbu berjalan 0,2 0,4 0,6 dan yang lainnya berjalan sebagai -2 -1 0 1 2. Sekali lagi terlihat ok bahwa beberapa titik data berada di tengah-tengah 40% dari distribusi teoritis, tetapi bagaimana mereka dapat didistribusikan antara 3% dari distribusi mereka sendiri, seperti yang ditunjukkan oleh sumbu y pada plot kanan bawah yang paling Anda sarankan?
Macond
2
@Macond Sumbu-y menunjukkan nilai mentah data, bukan kuantilasinya. Saya setuju bahwa standarisasi sumbu-y akan membuat segalanya lebih jelas, dan saya tidak tahu mengapa R tidak melakukan ini secara default. Bisakah seseorang menjelaskan hal ini?
Gordon Gustafson
4
@GordonGustafson sehubungan dengan komentar pertama Anda ke Macond ada alasan yang sangat bagus mengapa Anda tidak menstandarisasi data - karena plot QQ adalah tampilan data ! Ini dirancang untuk menunjukkan informasi dalam data yang Anda berikan ke fungsi (akan lebih masuk akal untuk menstandarkan data yang Anda berikan ke kotak petak atau histogram). Jika Anda mengubahnya, itu bukan lagi tampilan data (meskipun bentuk dalam plot mungkin sama, Anda tidak lagi menunjukkan lokasi atau skala pada plot). Saya tidak yakin apa yang Anda pikir akan lebih jelas dalam plot standar - dapatkah Anda mengklarifikasi?
Glen_b
2
@ZiyaoWei Tidak, seragam benar-benar memiliki ekor yang sangat ringan - bisa dibilang, tidak ada ekor sama sekali. Semuanya berjarak 2 MAD dari pusat. Paragraf pertama dari jawaban ini memberikan cara yang jelas, umum, untuk berpikir tentang apa arti 'ekor lebih berat'.
Glen_b
63

Saya membuat aplikasi yang mengkilap untuk membantu menafsirkan plot QQ yang normal. Coba tautan ini .

Dalam aplikasi ini, Anda dapat menyesuaikan kemiringan, kekeliruan (kurtosis) dan modalitas data dan Anda dapat melihat bagaimana histogram dan perubahan plot QQ. Sebaliknya, Anda dapat menggunakannya dengan cara yang diberi pola plot QQ, lalu periksa bagaimana kemiringan dll.

Untuk perincian lebih lanjut, lihat dokumentasi di dalamnya.


Saya menyadari bahwa saya tidak memiliki cukup ruang kosong untuk menyediakan aplikasi ini secara online. Sebagai permintaan, saya akan memberikan semua tiga potongan kode: sample.R, server.Rdan ui.Rdi sini. Mereka yang tertarik menjalankan aplikasi ini mungkin hanya memuat file-file ini ke dalam Rstudio kemudian menjalankannya di PC Anda sendiri.

The sample.RFile:

# 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.RFile:

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

Akhirnya, ui.Rfile:

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")
  )
)
)
)
Zhanxiong
sumber
1
Sepertinya kapasitas aplikasi Shiny Anda sudah maksimal. Mungkin Anda bisa memberikan kode
rsoren
1
@rsoren menambahkan, semoga membantu dan saya menantikan saran.
Zhanxiong
Sangat bagus! Saya juga menyarankan menambahkan opsi untuk mengubah ukuran sampel dan tingkat keacakan.
Itamar
Tautan tidak tersedia !!!! @Zhanxiong
Alireza Sanaee
Tampaknya tautan gagal merespons setelah jumlah klik terbatas setiap bulan. Itulah alasan saya menempelkan kode sumber di sini (seperti yang diminta oleh pengguna lain yang mengalami masalah yang sama dengan Anda). Anda dapat menempelkannya ke R studio Anda dan menjalankannya di PC Anda sendiri (setelah paket yang diperlukan dimuat di muka).
Zhanxiong
6

Penjelasan yang sangat membantu (dan intuitif) diberikan oleh Prof. Philippe Rigollet dalam kursus MIT MOOC: 18.650 Statistik untuk Aplikasi, Musim Gugur 2016 - lihat video pada 45 menit

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

Saya dengan kasar menyalin diagramnya yang saya simpan di catatan saya karena saya merasa sangat berguna.

Diagram sketsa plot QQ

Dalam contoh 1, pada diagram kiri atas, kita melihat bahwa pada ekor kanan kuantil empiris (atau sampel) kurang dari kuantil teoretis

Qe <Qt

α

masukkan deskripsi gambar di sini

Xavier Bourret Sicotte
sumber
3

Karena utas ini telah dianggap sebagai definitif "bagaimana menafsirkan plot qq normal" posting StackExchange, saya ingin mengarahkan pembaca ke hubungan matematis yang bagus dan tepat antara plot qq normal dan statistik kurtosis berlebih.

Ini dia:

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

Ringkasan singkat (dan terlalu disederhanakan) diberikan sebagai berikut (lihat tautan untuk pernyataan matematis yang lebih tepat): Anda benar-benar dapat melihat kelebihan kurtosis dalam plot qq normal sebagai jarak rata-rata antara kuantil data dan kuantil normal teoretis yang sesuai, tertimbang dengan jarak dari data ke rata-rata. Jadi, ketika nilai absolut di ekor plot qq umumnya menyimpang dari nilai normal yang diharapkan sangat ke arah ekstrim, Anda memiliki kelebihan kurtosis positif.

Karena kurtosis adalah rata-rata dari penyimpangan ini yang ditimbang oleh jarak dari rata-rata, nilai-nilai di dekat pusat plot qq berdampak kecil pada kurtosis. Oleh karena itu, kelebihan kurtosis tidak terkait dengan pusat distribusi, di mana "puncak" berada. Sebaliknya, kelebihan kurtosis hampir seluruhnya ditentukan oleh perbandingan ekor distribusi data dengan distribusi normal.

Peter Westfall
sumber