QQ grafiği nasıl yorumlanır?


172

Küçük bir veri kümesiyle (21 gözlem) çalışıyorum ve R'de aşağıdaki normal QQ grafiğine sahibim:

görüntü tanımını buraya girin

Arsa’nın normalliği desteklemediğini görünce, altta yatan dağıtım hakkında ne çıkartabilirim? Bana öyle geliyor ki, sağa doğru eğilmiş bir dağılım daha iyi bir seçim olabilir, değil mi? Ayrıca, verilerden başka ne gibi sonuçlar çıkarabiliriz?


9
Doğru çarpıklığı göstermesi konusunda haklısın. QQ parsellerinin yorumlanmasında bazı yayınları bulmaya çalışacağım.
Glen_b

3
Sonuç vermek zorunda değilsiniz; daha sonra ne deneneceğine karar vermen yeterli. Burada verileri köklendirme ya da kaydetmeyi düşünürdüm.
Nick Cox,

11
Tukey Üç Nokta Yöntemi, bir değişkeni yaklaşık olarak normal kılacak şekilde yeniden ifade etmenin yollarını tanımlamanıza yardımcı olmak için QQ grafiklerini kullanmak için çok iyi çalışır. Örneğin son noktaların ve bu grafikteki orta noktanın (ki , ve olduğunu tahmin , karekök onları doğrusallaştırmaya yaklaşır. Böylece, altta yatan dağılımın yaklaşık olarak normal kare kök olduğunu görebilirsiniz. (1.5,2)(1.5,220)(0,70)
whuber

3
@Glen_b Soruma cevabımın bazı bilgileri var: stats.stackexchange.com/questions/71065/… ve cevaptaki bağlantının başka iyi bir kaynağı var: stats.stackexchange.com/questions/52212/qq-plot-does-not
-match

Bu ne? QQ grafiği normal dağılım gösteren veri gösteriyor mu? ! Resim tanımlamasını buraya girin
David

Yanıtlar:


292

Değerler bir çizgi boyunca uzanıyorsa, dağıtım bizim tahmin ettiğimiz teorik dağılımla aynı şekle (konum ve ölçeğe kadar) sahiptir.

Yerel davranış : y eksenindeki sıralanmış örnek değerlerine ve x eksenindeki beklenen yaklaşık değerlere bakarken, arsanın bazı bölümlerindeki değerlerin, genel çizgisel eğilimden yerel olarak nasıl farklılık gösterdiğini belirleyerek belirleyebiliriz. değerler teorik dağılımın bir komploun bu bölümünde tahmin edebileceğinden daha fazla veya daha az konsantredir:

QQ parsellerinden dört bölüm

Gördüğümüz gibi, daha az konsantre noktaları genel doğrusal bir ilişkinin önerdiğinden daha hızlı artması gerekenden daha fazla ve daha konsantre noktaları arttırır ve aşırı durumlarda, numunenin yoğunluğundaki bir boşluğa karşılık gelir (dikey düşey bir sıçrama olarak gösterilir) veya sabit değerlerin yükselmesi (yatay olarak dizilmiş değerler). Bu, ağır bir kuyruk ya da hafif bir kuyruk görmemize ve dolayısıyla teorik dağılımdan daha büyük ya da küçük çarpıklık vb.

Genel görünüm:

Ortalama QQ grafikleri ortalama (özel dağıtım seçenekleri için) şöyle:

görüntü tanımını buraya girin

Ancak rastgelelik, özellikle küçük örneklerle bazı şeyleri gizleme eğilimindedir:

görüntü tanımını buraya girin

En unutmayın altı araziler birkaç tür setleri oluşturulan ve ne tür aynı anda altı parsellerdeki şeklini görebiliyordu nerede 'güzel' set seçti - orada gösterilenden daha sonuçlar çok daha değişken olabilmektedir. Bazen düz ilişkiler kavisli görünür, kavisli ilişkiler düz görünür, ağır kuyruklar sadece eğri durur ve böyle - böyle küçük örneklerle, genellikle durum çok daha az açık olabilir:n=21

görüntü tanımını buraya girin

Onlardan daha fazla özellik ayırt etmek mümkündür (örneğin, örneğin bir gizlilik gibi), ancak ile bu temel özellikleri bile anlamak zor olabilir; Her küçük kıpırdatmayı 'aşırı yorumlama' denememeliyiz. Numune boyutları büyüdükçe, genel olarak, grafikler 'stabilize' olur ve özellikler gürültüyü temsil etmek yerine daha net bir şekilde yorumlanabilir hale gelir. [Bazı çok kuyruklu dağıtımlarda, nadir büyük ana hat, resmin oldukça büyük örneklem boyutlarında bile güzelce dengelenmesini önleyebilir.]n=21

Ayrıca öneriyi bulabilirsiniz burada sen eğrilik veya wiggliness belirli bir miktarda üzülmemesi gerektiğini ne kadar karar vermeye çalışırken faydalıdır.

Genel olarak yorumlama için daha uygun bir rehber aynı zamanda daha küçük ve daha büyük örneklem büyüklüğündeki ekranları da içerecektir.


18
Bu çok pratik bir rehber, tüm bu bilgileri topladığınız için çok teşekkür ederim.
JohnK

4
Burada önemli olan doğrusallıktan sapma şeklinin ve türünün ne anlama geldiğini anlıyorum, ancak yine de her iki eksenin de "... kuantumlar", bir eksenin 0,2 0,6 0,6, diğerinin ise -2 -1 0 olması garip görünüyor. 1 2. Yine de, bazı veri noktalarının teorik bir dağılımın% 40'ının ortalarında olduğu, ancak en sağdaki en sağdaki komplodaki y ekseninin belirttiği gibi, kendi dağılımlarının% 3'ü arasında nasıl dağıtılabileceği anlaşılıyor.
Macond

2
@Makon Y ekseni, verinin ham değerlerini gösterir, miktarlarını değil . Y eksenini standartlaştırmanın işleri daha net hale getireceği konusunda hemfikirim ve R'nin bunu neden varsayılan olarak yapmadığını bilmiyorum. Birisi buna biraz ışık tutabilir mi?
Gordon Gustafson,

4
Macond'a ilk yorumunuz için @GordonGustafson, verileri standart hale getirmemeniz için çok iyi bir neden var - çünkü bir QQ grafiği verilerin gösterimidir ! İşleve verdiğiniz verilerdeki bilgileri göstermek üzere tasarlanmıştır (sağladığınız verileri bir kutu grafiğine veya histograma standart hale getirmek çok mantıklı olur). Dönüştürürseniz, artık verilerin bir görüntüsü değildir (arsadaki şekil benzer olsa da, artık arsa üzerindeki konumu ya da ölçeği göstermezsiniz). Standart bir arsada neyin daha net olacağını düşündüğünüzden emin değilim - netleştirebilir misiniz?
Glen_b

2
@ZiyaoWei Hayır, üniforma gerçekten çok hafif kuyruklara sahip - tartışmalı, hiç kuyruk yok. Her şey merkezin 2 MAD içinde. Bu cevabın ilk paragrafı, 'daha ağır kuyruklu' ne anlama geldiğini düşünmek için net, genel bir yol sunar.
Glen_b

63

Normal QQ grafiğini yorumlamaya yardımcı olmak için parlak bir uygulama yaptım. Bu linki dene .

Bu uygulamada, eğriliği, eğikliği (kurtozis) ve verilerin modalitesini ayarlayabilir ve histogram ve QQ grafiğinin nasıl değiştiğini görebilirsiniz. Tersine, QQ arsa modeli verilen şekilde kullanabilirsiniz, sonra eğriltme vb. Olması gerektiğini kontrol edin.

Daha fazla ayrıntı için belgelere bakın.


Çevrimiçi olarak bu uygulamayı sağlamak için yeterli boş alana sahip olmadığımı fark ettim. : İsteğe olarak, her üç kod parçalarını sağlayacak sample.R, server.Rve ui.Rburada. Bu uygulamayı çalıştırmak isteyenler sadece bu dosyaları Rstudio'ya yükleyebilir ve daha sonra kendi bilgisayarınızda çalıştırabilir.

sample.Rdosya:

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

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

Son olarak, ui.Rdosya:

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
Parlak uygulamanızın kapasitesinin azami olduğu görülüyor. Belki de kodu
girebilirsin

1
@ rsoren eklendi, yardımcı olacağını umuyorum ve işitme önerileri için sabırsızlanıyorum.
Zhanxiong

Çok hoş! Ayrıca örnek boyutunu ve rastgele dereceyi değiştirmek için seçenekler eklemenizi öneririm.
Itamar

Bağlantı mevcut değil !!!! @Zhanxiong
Alireza Sanaee

Her ay sınırlı sayıda tıklamanın ardından bağlantının yanıt vermede başarısız olduğu görülüyor. Kaynak kodunu buraya yapıştırmamın nedeni bu (sizinle aynı sorunla karşılaşan diğer kullanıcılar tarafından talep edildiği gibi). Bunları R stüdyonuza yapıştırabilir ve kendi bilgisayarınızda çalıştırabilirsiniz (gerekli paketler önceden yüklendikten sonra).
Zhanxiong

6

Çok yararlı (ve sezgisel) bir açıklama prof. MIT MOOC kursunda Philippe Rigollet: 18.650 Uygulama İstatistikleri, 2016 Güz - 45 dk.

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

Notlarımda sakladığım diyagramını çok yararlı buldukça kabaca kopyaladım.

QQ arsa kroki diyagramı

Örnek 1'de, sol üstteki diyagramda, sağ kuyrukta ampirik (veya örnek) kuantilin teorik kuantilden daha az olduğunu görüyoruz.

Qe <Qt

Bu olasılık yoğunluk fonksiyonları kullanılarak yorumlanabilir. Aynı için değeri, deneysel miktarsal bu yakın değerlere daha hızlı düşer, yani ampirik dağılım sağ arka teorik dağılımın doğru kuyruk daha "açık" olduğu anlamına gelir, teorik bir dağılım solunda, bir sıfır.α

görüntü tanımını buraya girin


3

Bu iş parçacığının kesin bir "normal qq grafiğinin nasıl yorumlanacağı" StackExchange post olarak kabul edildiğinden, okuyucuları normal qq grafiğiyle aşırı kurtosis istatistiği arasında güzel, kesin bir matematiksel ilişkiye işaret etmek istiyorum.

İşte burada:

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

Kısa (ve çok basitleştirilmiş) bir özet aşağıdaki gibi verilmektedir (daha kesin matematiksel ifadeler için bağlantıya bakınız): Normal qq grafiğindeki fazla kurtozu aslında veri nicelikleri ile karşılık gelen teorik normal nicelikler arasındaki ortalama uzaklık olarak görebilirsiniz. verilerden ortalamaya kadar. Bu nedenle, qq grafiğinin kuyruklarındaki mutlak değerler genellikle aşırı yönlerde büyük ölçüde beklenen normal değerlerden saptığında, pozitif aşırı kurtozunuz olur.

Kurtozis, ortalamadan uzaklığa göre bu sapmaların ortalaması olduğundan, qq grafiğinin merkezine yakın değerler kurtosis üzerinde çok az etkiye sahiptir. Dolayısıyla, fazla kurtosis, "tepe" nin olduğu dağıtımın merkezi ile ilişkili değildir. Aksine, aşırı kurtozis neredeyse tamamen veri dağılımının kuyruklarının normal dağılımla karşılaştırılmasıyla belirlenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.