Cómo interpretar una trama QQ

173

Estoy trabajando con un pequeño conjunto de datos (21 observaciones) y tengo el siguiente gráfico QQ normal en R:

ingrese la descripción de la imagen aquí

Al ver que la trama no admite la normalidad, ¿qué podría inferir sobre la distribución subyacente? Me parece que una distribución más sesgada a la derecha encajaría mejor, ¿no es así? Además, ¿qué otras conclusiones podemos sacar de los datos?

JohnK
fuente
99
Tienes razón en que indica un sesgo correcto. Trataré de localizar algunas de las publicaciones sobre la interpretación de los gráficos QQ
Glen_b
3
No tienes que concluir; solo necesita decidir qué probar a continuación. Aquí consideraría el enraizamiento cuadrado o el registro de los datos.
Nick Cox
11
(1.5,2)( 0 , 70 )(1.5,220)(0,70)
3
@Glen_b La respuesta a mi pregunta tiene información: stats.stackexchange.com/questions/71065/… y el enlace en la respuesta tiene otra buena fuente: stats.stackexchange.com/questions/52212/qq-plot-does-not -match-histogram
tpg2114
¿Qué hay de esto? ¿El gráfico QQ muestra datos distribuidos normalmente? ! ingrese la descripción de la imagen aquí
David

Respuestas:

293

Si los valores se encuentran a lo largo de una línea, la distribución tiene la misma forma (hasta la ubicación y la escala) que la distribución teórica que hemos supuesto.

Comportamiento local : al observar los valores de muestra ordenados en el eje yy los cuantiles esperados (aproximados) en el eje x, podemos identificar cómo los valores en alguna sección del gráfico difieren localmente de una tendencia lineal general al ver si los valores están más o menos concentrados de lo que supondría la distribución teórica en esa sección de una gráfica:

secciones de cuatro parcelas QQ

Como vemos, los puntos menos concentrados aumentan más y más puntos concentrados de lo que se supone aumentan menos rápidamente de lo que sugeriría una relación lineal general, y en los casos extremos corresponden a una brecha en la densidad de la muestra (se muestra como un salto casi vertical) o un pico de valores constantes (valores alineados horizontalmente). Esto nos permite detectar una cola pesada o una cola ligera y, por lo tanto, un sesgo mayor o menor que la distribución teórica, y así sucesivamente.

Apariencia general:

Así es como se ven los gráficos QQ (para elecciones particulares de distribución) en promedio :

ingrese la descripción de la imagen aquí

Pero la aleatoriedad tiende a oscurecer las cosas, especialmente con muestras pequeñas:

ingrese la descripción de la imagen aquí

Tenga en cuenta que en los resultados pueden ser mucho más variables de lo que se muestra allí: generé varios conjuntos de seis parcelas y elegí un conjunto 'agradable' donde podría ver la forma en las seis parcelas al mismo tiempo. A veces, las relaciones rectas se ven curvas, las relaciones curvas se ven rectas, las colas pesadas solo se ven sesgadas, y así sucesivamente, con muestras tan pequeñas, a menudo la situación puede ser mucho menos clara:n=21

ingrese la descripción de la imagen aquí

Es posible discernir más características que aquellas (como la discreción, por ejemplo), pero con , incluso esas características básicas pueden ser difíciles de detectar; no deberíamos tratar de 'sobreinterpretar' cada pequeño meneo. A medida que los tamaños de muestra se hacen más grandes, en general, las parcelas se 'estabilizan' y las características se vuelven más claramente interpretables en lugar de representar ruido. [Con algunas distribuciones de cola muy pesada, el valor atípico grande y raro podría evitar que la imagen se estabilice bien incluso con tamaños de muestra bastante grandes.]n=21

También puede encontrar la sugerencia aquí útil cuando intente decidir cuánto debe preocuparse por una cantidad particular de curvatura o ondulación.

Una guía más adecuada para la interpretación en general también incluiría pantallas con tamaños de muestra cada vez más pequeños.

Glen_b
fuente
18
Esta es una guía muy práctica, muchas gracias por reunir toda esa información.
JohnK
44
Entiendo que es la forma y el tipo de desviación de la linealidad lo que importa aquí, pero aún parece extraño que ambos ejes estén etiquetados como "... cuantiles" y un eje va como 0.2 0.4 0.6 y el otro va como -2 -1 0 1 2. Una vez más, parece correcto que algunos puntos de datos se encuentren dentro del 40% medio de una distribución teórica, pero ¿cómo pueden distribuirse entre el 3% de su propia distribución, como sugiere el eje y en la gráfica de la esquina inferior derecha?
Macond
2
@Macond El eje y muestra los valores brutos de los datos, no sus cuantiles. Estoy de acuerdo en que estandarizar el eje y haría las cosas mucho más claras, y no tengo idea de por qué R no hace esto por defecto. ¿Alguien podría arrojar algo de luz sobre esto?
Gordon Gustafson
44
@GordonGustafson con respecto a su primer comentario a Macond, hay una muy buena razón por la que no estandariza los datos, ¡porque un gráfico QQ es una visualización de los datos ! Está diseñado para mostrar información en los datos que proporciona a la función (tendría mucho sentido estandarizar los datos que proporciona a un diagrama de caja o un histograma). Si lo transforma, ya no es una visualización de los datos (aunque la forma en el diagrama puede ser similar, ya no muestra la ubicación o la escala en el diagrama). No estoy seguro de qué crees que sería más claro en una trama estandarizada, ¿puedes aclararlo?
Glen_b
2
@ ZiyaoWei No, un uniforme realmente tiene colas muy ligeras, posiblemente sin colas. Todo está a 2 MAD del centro. El primer párrafo de esta respuesta ofrece una forma clara y general de pensar sobre lo que significa "cola más gruesa".
Glen_b
63

Hice una aplicación brillante para ayudar a interpretar la trama QQ normal. Prueba este enlace.

En esta aplicación, puede ajustar la asimetría, la cola (curtosis) y la modalidad de datos y puede ver cómo cambian el histograma y la trama QQ. Por el contrario, puede usarlo de una manera que, dado el patrón del gráfico QQ, luego verifique cómo debería ser la asimetría, etc.

Para más detalles, consulte la documentación en el mismo.


Me di cuenta de que no tengo suficiente espacio libre para proporcionar esta aplicación en línea. Como petición, proporcionaré los tres trozos de código: sample.R, server.Ry ui.Raquí. Aquellos que estén interesados ​​en ejecutar esta aplicación pueden cargar estos archivos en Rstudio y luego ejecutarlos en su propia PC.

El sample.Rarchivo:

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

El server.Rarchivo:

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

Finalmente, el ui.Rarchivo:

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
fuente
1
Parece que la capacidad de su aplicación Shiny se ha agotado. Tal vez podría proporcionar el código
rsoren
1
@rsoren agregó, espero que ayude y espero escuchar sugerencias.
Zhanxiong
¡Muy agradable! Sugeriría también agregar opciones para cambiar el tamaño de la muestra y un grado de aleatoriedad.
Itamar
¡El enlace no está disponible! @Zhanxiong
Alireza Sanaee
Parece que el enlace no responde después de un número limitado de clics cada mes. Esa es la razón por la que pegué el código fuente aquí (según lo solicitado por otros usuarios que encontraron el mismo problema que usted). Puede pegarlos en su estudio R y ejecutarlos en su propia PC (después de que los paquetes necesarios se carguen por adelantado).
Zhanxiong
6

El profesor ofrece una explicación muy útil (e intuitiva). Philippe Rigollet en el curso MIT MOOC: 18.650 estadísticas para aplicaciones, otoño de 2016 - ver video en 45 minutos

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

Copié groseramente su diagrama que guardo en mis notas, ya que me parece muy útil.

Diagrama de bosquejo QQ plot

En el ejemplo 1, en el diagrama superior izquierdo, vemos que en la cola derecha el cuantil empírico (o muestra) es menor que el cuantil teórico

Qe <Qt

α

ingrese la descripción de la imagen aquí

Xavier Bourret Sicotte
fuente
3

Dado que este hilo se ha considerado como una publicación definitiva de StackExchange "cómo interpretar el diagrama qq normal", me gustaría señalar a los lectores una relación matemática precisa y agradable entre el diagrama qq normal y el exceso de estadística de curtosis.

Aquí está:

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

A continuación se ofrece un resumen breve (y demasiado simplificado) (consulte el enlace para ver enunciados matemáticos más precisos): en realidad puede ver el exceso de curtosis en el gráfico qq normal como la distancia promedio entre los cuantiles de datos y los cuantiles normales teóricos correspondientes, ponderados por distancia de los datos a la media. Por lo tanto, cuando los valores absolutos en las colas de la gráfica qq generalmente se desvían de los valores normales esperados en las direcciones extremas, tiene un exceso positivo de curtosis.

Debido a que la curtosis es el promedio de estas desviaciones ponderadas por las distancias de la media, los valores cerca del centro de la gráfica qq tienen poco impacto en la curtosis. Por lo tanto, el exceso de curtosis no está relacionado con el centro de la distribución, donde está el "pico". Más bien, el exceso de curtosis está determinado casi por completo por la comparación de las colas de la distribución de datos con la distribución normal.

Peter Westfall
fuente