Como interpretar um gráfico QQ

173

Estou trabalhando com um pequeno conjunto de dados (21 observações) e tenho o seguinte gráfico QQ normal em R:

insira a descrição da imagem aqui

Visto que o enredo não suporta a normalidade, o que eu poderia deduzir sobre a distribuição subjacente? Parece-me que uma distribuição mais inclinada para a direita seria mais adequada, certo? Além disso, que outras conclusões podemos tirar dos dados?

JohnK
fonte
9
Você está correto ao indicar que a inclinação é correta. Vou tentar localizar algumas das postagens na interpretação de gráficos de QQ.
Glen_b
3
Você não precisa concluir; você só precisa decidir o que tentar em seguida. Aqui eu consideraria o enraizamento quadrado ou o registro dos dados.
Nick Cox
11
O método de três pontos de Tukey funciona muito bem para usar gráficos de QQ para ajudar a identificar maneiras de re-expressar uma variável de uma maneira que a torne aproximadamente normal. Por exemplo, escolhendo os penúltimos pontos nas caudas e o ponto intermediário neste gráfico (que eu serem , e ), você encontrará facilmente que o raiz quadrada chega perto de linearizá-los. Assim, você pode deduzir que a distribuição subjacente é aproximadamente raiz quadrada normal. ( 1,5 , 220 ) ( 0 , 70 )(-1.5,2)(1.5,220)(0 0,70)
whuber
3
@Glen_b A resposta à minha pergunta tem algumas informações: stats.stackexchange.com/questions/71065/… e o link na resposta tem outra boa fonte: stats.stackexchange.com/questions/52212/qq-plot-does-not Você está em
Home
O que é isso? O gráfico QQ mostra dados notoriamente distribuídos? ! Digite a descrição da imagem aqui
David

Respostas:

293

Se os valores estiverem ao longo de uma linha, a distribuição terá a mesma forma (até a localização e a escala) da distribuição teórica que supomos.

Comportamento local : ao examinar valores de amostra classificados no eixo y e quantis esperados (aproximados) no eixo x, podemos identificar de que forma os valores em alguma seção do gráfico diferem localmente de uma tendência linear geral, verificando se o valor os valores são mais ou menos concentrados do que a distribuição teórica suporia nessa seção de um gráfico:

seções de quatro gráficos QQ

Como vemos, os pontos menos concentrados aumentam mais e mais pontos concentrados do que supostamente aumentam menos rapidamente do que uma relação linear geral sugeriria e, nos casos extremos, correspondem a uma lacuna na densidade da amostra (mostra como um salto quase vertical) ou um pico de valores constantes (valores alinhados horizontalmente). Isso nos permite identificar uma cauda pesada ou leve e, portanto, assimetria maior ou menor que a distribuição teórica, e assim por diante.

Aparência geral:

Veja como são os gráficos de QQ (para escolhas específicas de distribuição) em média :

insira a descrição da imagem aqui

Mas a aleatoriedade tende a obscurecer as coisas, especialmente com pequenas amostras:

insira a descrição da imagem aqui

Observe que, em os resultados podem ser muito mais variáveis ​​do que os mostrados lá - eu gerei vários conjuntos de seis gráficos e escolhi um conjunto 'agradável' onde você pode ver a forma em todos os seis gráficos ao mesmo tempo. Às vezes, os relacionamentos retos parecem curvos, os relacionamentos curvos parecem retos, as caudas pesadas parecem distorcidas e assim por diante - com amostras tão pequenas, muitas vezes a situação pode ser muito menos clara:n=21

insira a descrição da imagem aqui

É possível discernir mais recursos do que aqueles (como discrição, por exemplo), mas com , mesmo esses recursos básicos podem ser difíceis de detectar; não devemos tentar "interpretar demais" cada pequeno movimento. À medida que o tamanho das amostras se torna maior, geralmente os gráficos 'estabilizam' e os recursos se tornam mais claramente interpretáveis, em vez de representar ruído. [Com algumas distribuições de cauda muito pesada, o grande e raro outlier pode impedir que a imagem se estabilize bem, mesmo em tamanhos de amostra bastante grandes.]n=21

Você também pode achar útil a sugestão aqui ao tentar decidir o quanto você deve se preocupar com uma determinada quantidade de curvatura ou ondulação.

Um guia mais adequado para interpretação em geral também incluiria telas em tamanhos de amostra menores e maiores.

Glen_b
fonte
18
Este é um guia muito prático, muito obrigado por reunir todas essas informações.
JohnK
4
Eu entendo que é a forma e o tipo de desvio da linearidade o que importa aqui, mas ainda parece estranho que ambos os eixos sejam rotulados como "... quantis" e um eixo seja 0,2 0,4 0,6 e o ​​outro seja -2 -1 0 1 2. Novamente, parece aceitável que alguns pontos de dados estejam dentro do meio de 40% de uma distribuição teórica, mas como eles podem ser distribuídos entre 3% de sua própria distribuição, como sugere o eixo y no gráfico inferior à direita?
Macond
2
@ Macond O eixo y mostra os valores brutos dos dados, não seus quantis. Concordo que a padronização do eixo y tornaria as coisas muito mais claras, e não tenho idéia do por que R não faz isso por padrão. Alguém poderia lançar alguma luz sobre isso?
Gordon Gustafson 22/02
4
@GordonGustafson em relação ao seu primeiro comentário a Macond, há uma boa razão para você não padronizar os dados - porque um gráfico QQ é uma exibição dos dados ! Ele foi projetado para mostrar informações nos dados que você fornece para a função (faria muito sentido padronizar os dados que você fornece para um boxplot ou um histograma). Se você transformá-lo, não será mais uma exibição dos dados (embora a forma no gráfico possa ser semelhante, você não mostrará mais o local ou a escala no gráfico). Não tenho certeza do que você acha que seria mais claro em uma trama padronizada - você pode esclarecer?
Glen_b 23/02
2
@ZiyaoWei Não, um uniforme realmente tem caudas muito leves - sem dúvida nenhuma. Tudo está dentro de 2 MADs do centro. O primeiro parágrafo desta resposta fornece uma maneira clara e geral de pensar sobre o que significa 'cauda mais pesada'.
Glen_b
63

Eu fiz um aplicativo brilhante para ajudar a interpretar o gráfico QQ normal. Experimente este link.

Neste aplicativo, você pode ajustar a assimetria, a cauda (curtose) e a modalidade de dados e pode ver como o histograma e o gráfico de QQ mudam. Por outro lado, você pode usá-lo de uma maneira que, considerando o padrão da plotagem de QQ, verifique como deve ser a assimetria, etc.

Para mais detalhes, consulte a documentação.


Percebi que não tenho espaço livre suficiente para fornecer este aplicativo online. Como pedido, eu irá fornecer todos os três pedaços de código: sample.R, server.Re ui.Raqui. Quem estiver interessado em executar este aplicativo pode simplesmente carregar esses arquivos no Rstudio e executá-lo no seu próprio PC.

O sample.Rarquivo:

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

O server.Rarquivo:

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

Por fim, o ui.Rarquivo:

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
fonte
1
Parece que a capacidade do seu aplicativo brilhante chegou ao limite. Talvez você poderia apenas fornecer o código
rsoren
1
@rsoren adicionou, espero que ajude e estou ansioso para ouvir sugestões.
Zhanxiong 17/02
Muito agradável! Eu sugeriria também adicionar opções para alterar o tamanho da amostra e um grau de aleatoriedade.
Itamar
O link não está disponível !!!! @Zhanxiong
Alireza Sanaee
Parece que o link não responde após um número limitado de cliques todos os meses. Foi por isso que colei o código fonte aqui (conforme solicitado por outros usuários que encontraram o mesmo problema que você). Você pode colá-los no seu estúdio R e executá-los no seu próprio PC (depois que os pacotes necessários forem carregados com antecedência).
Zhanxiong 01/09
6

Uma explicação muito útil (e intuitiva) é dada pelo prof. Philippe Rigollet no curso do MIT MOOC: 18.650 Statistics for Applications, outono de 2016 - veja o vídeo em 45 mins

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

Copiei grosseiramente o diagrama que guardo em minhas anotações, pois acho muito útil.

Diagrama de esboço de plotagem QQ

No exemplo 1, no diagrama superior esquerdo, vemos que na cauda direita o quantil empírico (ou amostra) é menor que o quantil teórico

Qe <Qt

α

insira a descrição da imagem aqui

Xavier Bourret Sicotte
fonte
3

Como esse segmento foi considerado um definitivo "como interpretar o gráfico qq normal" no StackExchange, gostaria de apontar os leitores para uma boa e precisa relação matemática entre o gráfico qq normal e a estatística de excesso de curtose.

Aqui está:

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

Um resumo breve (e muito simplificado) é fornecido da seguinte forma (consulte o link para obter instruções matemáticas mais precisas): Na verdade, você pode ver excesso de curtose no gráfico qq normal como a distância média entre os quantis de dados e os correspondentes quantis normais teóricos, ponderados pela distância dos dados à média. Assim, quando os valores absolutos nas caudas do gráfico qq geralmente se desviam dos valores normais esperados em direções extremas, você tem uma curtose em excesso positiva.

Como a curtose é a média desses desvios ponderados pelas distâncias da média, os valores próximos ao centro do gráfico qq têm pouco impacto na curtose. Portanto, o excesso de curtose não está relacionado ao centro da distribuição, onde está o "pico". Em vez disso, a curtose excessiva é quase inteiramente determinada pela comparação das caudas da distribuição de dados com a distribuição normal.

Peter Westfall
fonte