Wie man einen QQ-Plot interpretiert

172

Ich arbeite mit einem kleinen Datensatz (21 Beobachtungen) und habe den folgenden normalen QQ-Plot in R:

Bildbeschreibung hier eingeben

Was kann ich angesichts der Tatsache, dass die Darstellung keine Normalität unterstützt, auf die zugrunde liegende Verteilung schließen? Es scheint mir, dass eine Verteilung, die mehr nach rechts geneigt ist, besser passt, stimmt das? Welche weiteren Schlussfolgerungen können wir aus den Daten ziehen?

JohnK
quelle
9
Du hast Recht, dass es die richtige Schiefe anzeigt. Ich werde versuchen, einige der Beiträge zur Interpretation von QQ-Plots zu finden.
Glen_b
3
Sie müssen nicht schließen; Sie müssen nur entscheiden, was Sie als nächstes versuchen möchten. Hier würde ich Quadratwurzel oder Protokollierung der Daten in Betracht ziehen.
Nick Cox
11
(1.5,2)(1.5,220)(0,70)
3
@ Glen_b Die Antwort auf meine Frage enthält einige Informationen: stats.stackexchange.com/questions/71065/… und der Link in der Antwort enthält eine weitere gute Quelle: stats.stackexchange.com/questions/52212/qq-plot-does-not -Match-Histogramm
tpg2114
Was ist damit? Zeigt der QQ-Plot nicht gleichmäßig verteilte Daten? ! Bildbeschreibung hier eingeben
David

Antworten:

293

Wenn die Werte entlang einer Linie liegen, hat die Verteilung die gleiche Form (bis zu Ort und Maßstab) wie die theoretische Verteilung, die wir angenommen haben.

Lokales Verhalten : Wenn wir sortierte Stichprobenwerte auf der y-Achse und (ungefähre) erwartete Quantile auf der x-Achse betrachten, können wir feststellen, wie sich die Werte in einigen Abschnitten des Diagramms lokal von einem linearen Gesamttrend unterscheiden Die Werte sind mehr oder weniger konzentriert als die theoretische Verteilung in diesem Abschnitt eines Diagramms annehmen würde:

Abschnitte aus vier QQ-Plots

Wie wir sehen, nehmen weniger konzentrierte Punkte mehr und mehr zu, als angenommen, dass sie weniger schnell zunehmen, als es eine lineare Beziehung insgesamt vermuten lässt, und entsprechen im Extremfall einer Lücke in der Dichte der Probe (zeigt sich als nahezu vertikaler Sprung). oder eine Spitze konstanter Werte (horizontal ausgerichtete Werte). Dies ermöglicht es uns, einen schweren Schwanz oder einen leichten Schwanz zu erkennen, und daher eine Schiefe, die größer oder kleiner als die theoretische Verteilung ist, und so weiter.

Gesamterscheinung:

So sehen QQ-Diagramme (für bestimmte Verteilungsoptionen) im Durchschnitt aus :

Bildbeschreibung hier eingeben

Aber Zufälligkeit macht die Dinge eher undeutlich, besonders bei kleinen Stichproben:

Bildbeschreibung hier eingeben

n=21

Bildbeschreibung hier eingeben

n=21

Möglicherweise ist der Vorschlag hier auch hilfreich, wenn Sie entscheiden möchten, wie sehr Sie sich über eine bestimmte Krümmung oder Verwackelung Gedanken machen sollen.

Ein geeigneterer Leitfaden für die Interpretation im Allgemeinen würde auch Anzeigen bei kleineren und größeren Stichprobengrößen einschließen.

Glen_b
quelle
18
Dies ist ein sehr praktischer Leitfaden. Vielen Dank, dass Sie all diese Informationen gesammelt haben.
JohnK
4
Ich verstehe, dass es auf Form und Art der Abweichung von der Linearität ankommt, aber es sieht dennoch seltsam aus, dass beide Achsen als "... Quantile" bezeichnet sind und eine Achse als 0,2 0,4 0,6 und die andere als -2 -1 0 1 2. Wiederum scheint es in Ordnung zu sein, dass einige Datenpunkte innerhalb der Mitte von 40% einer theoretischen Verteilung liegen, aber wie können sie zwischen 3% ihrer eigenen Verteilung verteilt werden, wie die y-Achse in der Darstellung ganz unten rechts nahelegt?
Macond
2
@Macond Die y-Achse zeigt die Rohwerte der Daten, nicht deren Quantile. Ich stimme zu, dass die Vereinheitlichung der y-Achse die Dinge viel klarer machen würde , und ich habe keine Ahnung, warum R dies nicht standardmäßig tut. Könnte jemand etwas Licht ins Dunkel bringen?
Gordon Gustafson
4
@GordonGustafson In Bezug auf Ihren ersten Kommentar zu Macond gibt es einen sehr guten Grund, warum Sie die Daten nicht standardisieren - denn ein QQ-Plot ist eine Anzeige der Daten ! Es soll Informationen in den Daten anzeigen, die Sie für die Funktion bereitstellen (es wäre genauso sinnvoll, die Daten, die Sie für einen Boxplot oder ein Histogramm bereitstellen, zu standardisieren). Wenn Sie es transformieren, werden die Daten nicht mehr angezeigt (obwohl die Form im Diagramm möglicherweise ähnlich ist, wird die Position oder der Maßstab im Diagramm nicht mehr angezeigt). Ich bin mir nicht sicher, was Ihrer Meinung nach in einer standardisierten Handlung klarer sein würde - können Sie das klären?
Glen_b
2
@ZiyaoWei Nein, eine Uniform hat wirklich sehr leichte Schwänze - wohl überhaupt keine Schwänze. Alles ist innerhalb von 2 MADs vom Zentrum entfernt. Der erste Absatz dieser Antwort bietet eine klare, allgemeine Möglichkeit, darüber nachzudenken, was "schwerer" bedeutet.
Glen_b
63

Ich habe eine glänzende App erstellt, um die Interpretation eines normalen QQ-Diagramms zu erleichtern. Versuchen Sie diesen Link.

In dieser App können Sie die Skewness, Tailedness (Kurtosis) und Modalität der Daten anpassen und sehen, wie sich das Histogramm und der QQ-Plot ändern. Umgekehrt können Sie es auf eine Weise verwenden, die dem Muster des QQ-Diagramms entspricht, und dann überprüfen, wie die Schiefe usw. sein sollte.

Weitere Einzelheiten finden Sie in der Dokumentation.


Ich habe festgestellt, dass ich nicht genügend Speicherplatz habe, um diese App online bereitzustellen. Als Anforderung, stelle ich alle drei Code Brocken: sample.R, server.Rund ui.Rhier. Diejenigen, die daran interessiert sind, diese App auszuführen, können diese Dateien einfach in Rstudio laden und dann auf Ihrem eigenen PC ausführen.

Die sample.RDatei:

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

Die server.RDatei:

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

Zum Schluss die ui.RDatei:

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
quelle
1
Die Kapazität Ihrer Shiny-App ist anscheinend voll. Vielleicht könnten Sie einfach den Code eingeben
rsoren
1
@rsoren fügte hinzu, hoffe es hilft und ich freue mich auf Vorschläge zu hören.
Zhanxiong
Sehr schön! Ich würde auch vorschlagen, Optionen zum Ändern der Stichprobengröße und des Grads der Zufälligkeit hinzuzufügen.
Itamar
Link ist nicht verfügbar !!!! @ Zhanxiong
Alireza Sanaee
Es scheint, dass der Link nach einer begrenzten Anzahl von Klicks pro Monat nicht mehr reagiert. Aus diesem Grund habe ich den Quellcode hier eingefügt (wie von anderen Benutzern angefordert, die auf dasselbe Problem gestoßen sind wie Sie). Sie können sie in Ihr R-Studio einfügen und auf Ihrem eigenen PC ausführen (nachdem die erforderlichen Pakete im Voraus geladen wurden).
Zhanxiong
6

Eine sehr hilfreiche (und intuitive) Erklärung gibt prof. Philippe Rigollet im MIT MOOC Kurs: 18.650 Statistics for Applications, Herbst 2016 - siehe Video in 45 Minuten

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

Ich habe sein Diagramm grob kopiert, das ich in meinen Notizen aufbewahre, da ich es sehr nützlich finde.

QQ-Plotskizzendiagramm

In Beispiel 1 im oberen linken Diagramm sehen wir, dass das empirische (oder Stichproben-) Quantil im rechten Ende kleiner als das theoretische Quantil ist

Qe <Qt

α

Bildbeschreibung hier eingeben

Xavier Bourret Sicotte
quelle
3

Da dieser Thread als endgültiges "Wie interpretiere ich den normalen QQ-Plot?" - StackExchange-Post angesehen wurde, möchte ich die Leser auf eine nette, präzise mathematische Beziehung zwischen dem normalen QQ-Plot und der Statistik über die überschüssige Kurtosis hinweisen.

Hier ist es:

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

Eine kurze (und zu vereinfachte) Zusammenfassung lautet wie folgt (genauere mathematische Aussagen finden Sie unter dem Link): Tatsächlich können Sie die überschüssige Kurtosis im normalen qq-Diagramm als den durchschnittlichen Abstand zwischen den Datenquantilen und den entsprechenden theoretischen Normalquantilen, gewichtet, sehen nach Entfernung von Daten zum Mittelwert. Wenn die absoluten Werte in den Schwänzen des qq-Diagramms im Allgemeinen stark von den erwarteten Normalwerten in den extremen Richtungen abweichen, liegt eine positive Kurtosisüberschreitung vor.

Da Kurtosis der Durchschnitt dieser Abweichungen ist, gewichtet nach Abständen vom Mittelwert, haben die Werte in der Nähe der Mitte des qq-Diagramms nur geringen Einfluss auf die Kurtosis. Daher ist eine übermäßige Kurtosis nicht mit dem Verteilungszentrum verbunden, in dem sich der "Peak" befindet. Vielmehr wird eine überschüssige Kurtosis fast ausschließlich durch den Vergleich der Schwänze der Datenverteilung mit der Normalverteilung bestimmt.

Peter Westfall
quelle