Come interpretare un diagramma QQ


173

Sto lavorando con un piccolo set di dati (21 osservazioni) e ho il seguente diagramma QQ normale in R:

inserisci qui la descrizione dell'immagine

Visto che la trama non supporta la normalità, cosa potrei dedurre sulla distribuzione sottostante? Mi sembra che una distribuzione più inclinata a destra sarebbe più adatta, giusto? Inoltre, quali altre conclusioni possiamo trarre dai dati?


9
Hai ragione nel dire che indica l'asimmetria giusta. Cercherò di individuare alcuni dei post sull'interpretazione dei grafici QQ.
Glen_b,

3
Non devi concludere; devi solo decidere cosa provare dopo. Qui prenderei in considerazione il rooting quadrato o la registrazione dei dati.
Nick Cox,

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

3
@Glen_b La risposta alla mia domanda ha alcune informazioni: stats.stackexchange.com/questions/71065/… e il link nella risposta ha un'altra buona fonte: stats.stackexchange.com/questions/52212/qq-plot-does-not -match-histogram
tpg2114

E questo? Il diagramma QQ mostra dati non distribuiti? ! inserisci qui la descrizione dell'immagine
David

Risposte:


293

Se i valori si trovano lungo una linea, la distribuzione ha la stessa forma (fino alla posizione e alla scala) della distribuzione teorica che abbiamo supposto.

Comportamento locale : osservando i valori di campionamento ordinati sull'asse y e i quantili attesi (approssimativi) sull'asse x, possiamo identificare da come i valori in alcune sezioni del grafico differiscono localmente da una tendenza lineare globale, vedendo se il i valori sono più o meno concentrati di quanto la distribuzione teorica supponga in quella sezione di un diagramma:

sezioni su quattro grafici QQ

Come vediamo, i punti meno concentrati aumentano sempre più i punti concentrati di quelli che si suppone aumentino meno rapidamente di quanto suggerirebbe una relazione lineare complessiva e, in casi estremi, corrispondono a un gap nella densità del campione (mostrato come un salto quasi verticale) o un picco di valori costanti (valori allineati orizzontalmente). Questo ci consente di individuare una coda pesante o una coda leggera e, quindi, l'asimmetria maggiore o minore della distribuzione teorica e così via.

Aspetto generale:

Ecco come appaiono in media i QQ (per particolari scelte di distribuzione) :

inserisci qui la descrizione dell'immagine

Ma la casualità tende a oscurare le cose, specialmente con piccoli campioni:

inserisci qui la descrizione dell'immagine

n=21

inserisci qui la descrizione dell'immagine

n=21

Puoi anche trovare utile il suggerimento qui quando cerchi di decidere quanto dovresti preoccuparti di una particolare quantità di curvatura o oscillazione.

Una guida più adatta per l'interpretazione in generale includerebbe anche display di dimensioni campione sempre più piccole.


18
Questa è una guida molto pratica, grazie mille per aver raccolto tutte queste informazioni.
JohnK,

4
Capisco che è la forma e il tipo di deviazione dalla linearità ciò che conta qui, ma sembra ancora strano che entrambi gli assi siano etichettati "... quantili" e un asse va come 0,2 0,4 0,6 e l'altro va come -2 -1 0 1 2. Ancora una volta sembra giusto che alcuni punti dati si trovino nel 40% medio di una distribuzione teorica, ma come possono essere distribuiti tra il 3% della propria distribuzione, come suggerisce l'asse y sulla trama più in basso a destra?
Macond,

2
@Macond L'asse y mostra i valori grezzi dei dati, non i loro quantili. Concordo sul fatto che la standardizzazione dell'asse y renderebbe le cose molto più chiare e non ho idea del perché R non lo faccia per impostazione predefinita. Qualcuno potrebbe far luce su questo?
Gordon Gustafson,

4
@GordonGustafson riguardo al tuo primo commento a Macond c'è un'ottima ragione per non standardizzare i dati - perché un diagramma QQ è una visualizzazione dei dati ! È progettato per mostrare le informazioni nei dati forniti alla funzione (sarebbe altrettanto sensato standardizzare i dati forniti a un diagramma a scatole o un istogramma). Se lo trasformi, non è più una visualizzazione dei dati (sebbene la forma nella trama possa essere simile, non mostri più la posizione o la scala sulla trama). Non sono sicuro di cosa pensi che sarebbe più chiaro in una trama standardizzata - puoi chiarire?
Glen_b,

2
@ZiyaoWei No, un'uniforme ha davvero code molto leggere - probabilmente, nessuna coda. Tutto è a 2 MAD dal centro. Il primo paragrafo di questa risposta fornisce un modo chiaro e generale di pensare a cosa significhi "dalla coda più pesante".
Glen_b

63

Ho realizzato un'app brillante per aiutare a interpretare la normale trama QQ. Prova questo link.

In questa app, puoi regolare l'asimmetria, la coda (kurtosi) e la modalità dei dati e puoi vedere come cambiano l'istogramma e la trama QQ. Viceversa, puoi usarlo in un modo che sia dato lo schema della trama QQ, quindi controlla come dovrebbe essere l'asimmetria ecc.

Per ulteriori dettagli, consultare la relativa documentazione.


Mi sono reso conto che non ho abbastanza spazio libero per fornire questa app online. Come richiesta, fornirò tutti e tre i pezzi di codice: sample.R, server.Re ui.Rqui. Coloro che sono interessati a eseguire questa app possono semplicemente caricare questi file in Rstudio e quindi eseguirlo sul proprio PC.

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

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

Infine, il 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")
  )
)
)
)

1
Sembra che la capacità della tua app Shiny sia al massimo. Forse potresti semplicemente fornire il codice
rsoren

1
@rsoren ha aggiunto, spero che sia d'aiuto e non vedo l'ora di ricevere suggerimenti.
Zhanxiong,

Molto bella! Suggerirei anche di aggiungere opzioni per modificare la dimensione del campione e un grado di casualità.
Itamar,

Il link non è disponibile !!!! @Zhanxiong
Alireza Sanaee

Sembra che il collegamento non risponda dopo un numero limitato di clic ogni mese. Questo è il motivo per cui ho incollato il codice sorgente qui (come richiesto da altri utenti che hanno riscontrato lo stesso problema). Puoi incollarli sul tuo R studio ed eseguirli sul tuo PC (dopo che i pacchetti richiesti sono stati caricati in anticipo).
Zhanxiong,

6

Una spiegazione molto utile (e intuitiva) è data dal prof. Philippe Rigollet nel corso MIT MOOC: 18.650 Statistics for Applications, autunno 2016 - guarda il video a 45 minuti

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

Ho copiato rozzamente il suo diagramma che tengo nei miei appunti perché lo trovo molto utile.

Diagramma di schizzo della trama QQ

Nell'esempio 1, nel diagramma in alto a sinistra, vediamo che nella coda destra il quantile empirico (o campione) è inferiore al quantile teorico

Qe <Qt

α

inserisci qui la descrizione dell'immagine


3

Dato che questo thread è stato considerato un post definitivo su "come interpretare la normale trama qq" StackExchange, vorrei indicare ai lettori una relazione matematica precisa e precisa tra la normale trama qq e la statistica della curtosi in eccesso.

Ecco qui:

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

Viene fornito un breve riassunto (e troppo semplificato) come segue (vedere il collegamento per dichiarazioni matematiche più precise): è possibile vedere l'eccesso di curtosi nel diagramma qq normale come la distanza media tra i quantili di dati e i corrispondenti quantili normali teorici, ponderata dalla distanza dai dati alla media. Pertanto, quando i valori assoluti nelle code del diagramma qq generalmente si discostano notevolmente dai valori normali previsti nelle direzioni estreme, si ha una curtosi in eccesso positiva.

Poiché la curtosi è la media di queste deviazioni ponderata dalle distanze dalla media, i valori vicino al centro del diagramma qq hanno un impatto limitato sulla curtosi. Quindi, l'eccesso di curtosi non è correlato al centro della distribuzione, dove si trova il "picco". Piuttosto, la curtosi in eccesso è quasi interamente determinata dal confronto delle code della distribuzione dei dati con la distribuzione normale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.