Làm thế nào để giải thích một âm mưu QQ


173

Tôi đang làm việc với một bộ dữ liệu nhỏ (21 quan sát) và có cốt truyện QQ bình thường sau trong R:

nhập mô tả hình ảnh ở đây

Thấy rằng cốt truyện không hỗ trợ tính quy phạm, tôi có thể suy luận gì về phân phối cơ bản? Dường như với tôi rằng một phân phối lệch hơn về bên phải sẽ phù hợp hơn, đúng không? Ngoài ra, chúng ta có thể rút ra kết luận nào khác từ dữ liệu?


9
Bạn đã đúng rằng nó chỉ ra sự sai lệch. Tôi sẽ cố gắng xác định vị trí của một số bài đăng về diễn giải các lô QQ.
Glen_b

3
Bạn không cần phải kết luận; bạn chỉ cần quyết định những gì để thử tiếp theo. Ở đây tôi sẽ xem xét root vuông hoặc đăng nhập dữ liệu.
Nick Cox

11
Phương pháp ba điểm của Tukey hoạt động rất tốt trong việc sử dụng các ô QQ để giúp bạn xác định các cách thể hiện lại một biến theo cách làm cho nó gần như bình thường. Chẳng hạn, chọn các điểm áp chót ở đuôi và điểm giữa trong đồ họa này (mà tôi ước tính là , và ), bạn sẽ dễ dàng thấy rằng căn bậc hai đến gần để tuyến tính hóa chúng. Do đó, bạn có thể suy ra rằng phân phối cơ bản là xấp xỉ căn bậc hai bình thường. (1.5,2)(1.5,220)(0,70)
whuber

3
@Glen_b Câu trả lời cho câu hỏi của tôi có một số thông tin: stats.stackexchange.com/questions/71065/ và liên kết trong câu trả lời có một nguồn tốt khác: stats.stackexchange.com/questions/52212/qq-plot-does-not -match-histogram
tpg2114

Cái gì đây Liệu cốt truyện QQ hiển thị dữ liệu phân phối không chính thức? ! nhập mô tả hình ảnh ở đây
David

Câu trả lời:


293

Nếu các giá trị nằm dọc theo một dòng, phân phối có hình dạng tương tự (lên đến vị trí và tỷ lệ) như phân phối lý thuyết mà chúng ta đã giả định.

Hành vi cục bộ : Khi xem xét các giá trị mẫu được sắp xếp trên trục y và lượng tử dự kiến ​​(gần đúng) trên trục x, chúng ta có thể xác định cách các giá trị trong một số phần của biểu đồ khác nhau cục bộ với xu hướng tuyến tính tổng thể bằng cách xem liệu các giá trị tập trung nhiều hơn hoặc ít hơn so với phân phối lý thuyết sẽ cho rằng trong phần đó của một âm mưu:

phần trong bốn lô QQ

Như chúng ta thấy, các điểm tập trung ít hơn tăng nhiều hơn và nhiều điểm tập trung hơn so với mức tăng nhanh hơn so với mối quan hệ tuyến tính tổng thể sẽ đề xuất, và trong các trường hợp cực đoan tương ứng với khoảng cách về mật độ của mẫu (thể hiện là bước nhảy gần dọc) hoặc tăng đột biến của các giá trị không đổi (các giá trị được sắp xếp theo chiều ngang). Điều này cho phép chúng ta phát hiện ra một cái đuôi nặng hoặc một cái đuôi nhẹ và do đó, độ lệch lớn hơn hoặc nhỏ hơn so với phân bố lý thuyết, v.v.

Tổng thể xuất hiện:

Dưới đây là những gì QQ-lô trông giống như (đối với các lựa chọn phân phối cụ thể) trung bình :

nhập mô tả hình ảnh ở đây

Nhưng tính ngẫu nhiên có xu hướng che khuất mọi thứ, đặc biệt là với các mẫu nhỏ:

nhập mô tả hình ảnh ở đây

Lưu ý rằng tại , kết quả có thể thay đổi nhiều hơn so với hiển thị ở đó - Tôi đã tạo ra một số sáu ô như vậy và chọn một bộ 'đẹp' trong đó bạn có thể nhìn thấy hình dạng trong tất cả sáu ô cùng một lúc. Đôi khi các mối quan hệ thẳng trông cong, mối quan hệ cong trông thẳng, đuôi nặng chỉ nhìn lệch, v.v. - với các mẫu nhỏ như vậy, thường thì tình huống có thể ít rõ ràng hơn nhiều:n=21

nhập mô tả hình ảnh ở đây

Bạn có thể phân biệt nhiều tính năng hơn các tính năng (chẳng hạn như tính riêng biệt), nhưng với , ngay cả các tính năng cơ bản như vậy có thể khó phát hiện; chúng ta không nên cố gắng 'diễn giải quá mức' mỗi lần ngọ nguậy. Khi kích thước mẫu trở nên lớn hơn, nói chung, các ô 'ổn định' và các tính năng trở nên dễ hiểu hơn thay vì biểu thị tiếng ồn. [Với một số phân phối có đuôi rất nặng, ngoại lệ lớn hiếm có có thể ngăn hình ảnh ổn định độc đáo ngay cả ở kích thước mẫu khá lớn.]n=21

Bạn cũng có thể thấy gợi ý ở đây hữu ích khi cố gắng quyết định mức độ bạn nên lo lắng về một độ cong hoặc độ cong cụ thể.

Một hướng dẫn phù hợp hơn để diễn giải nói chung cũng sẽ bao gồm các màn hình ở cỡ mẫu nhỏ hơn và lớn hơn.


18
Đây là một hướng dẫn rất thiết thực, cảm ơn bạn rất nhiều vì đã thu thập tất cả thông tin đó.
JohnK

4
Tôi hiểu rằng đó là hình dạng và loại sai lệch so với tuyến tính, điều quan trọng ở đây, nhưng điều kỳ lạ là cả hai trục đều được gắn nhãn "... lượng tử" và một trục đi là 0,2 0,4 0,6 và trục kia là -2 -1 0 1 2. Một lần nữa có vẻ ổn khi một số điểm dữ liệu nằm trong khoảng 40% phân phối lý thuyết, nhưng làm thế nào chúng có thể được phân phối giữa 3% phân phối của chính chúng, như trục y trên biểu đồ phía dưới bên phải của bạn cho thấy?
Macond

2
@Macond Trục y hiển thị các giá trị thô của dữ liệu, không phải là lượng tử của chúng. Tôi đồng ý rằng tiêu chuẩn hóa các trục y sẽ làm cho mọi việc nhiều rõ ràng hơn, và tôi không có ý tưởng tại sao R không làm điều này theo mặc định. Ai đó có thể làm sáng tỏ về điều này?
Gordon Gustafson

4
@GordonGustafson đối với nhận xét đầu tiên của bạn cho Macond có một lý do rất chính đáng tại sao bạn không chuẩn hóa dữ liệu - bởi vì một lô QQ là hiển thị dữ liệu ! Nó được thiết kế để hiển thị thông tin trong dữ liệu bạn cung cấp cho hàm (việc chuẩn hóa dữ liệu bạn cung cấp cho boxplot hoặc biểu đồ sẽ có ý nghĩa nhiều như vậy. Nếu bạn chuyển đổi nó, nó không còn hiển thị dữ liệu nữa (mặc dù hình dạng trong ô có thể giống nhau, bạn không còn hiển thị vị trí hoặc tỷ lệ trên ô). Tôi không chắc những gì bạn nghĩ sẽ rõ ràng hơn trong một cốt truyện được tiêu chuẩn hóa - bạn có thể làm rõ không?
Glen_b 23/2/2015

2
@ZiyaoWei Không, một bộ đồng phục thực sự có đuôi rất nhẹ - có thể nói, không có đuôi nào cả. Tất cả mọi thứ trong vòng 2 MAD của trung tâm. Đoạn đầu tiên của câu trả lời này đưa ra một cách rõ ràng, chung chung, để suy nghĩ về "cái đuôi nặng hơn" nghĩa là gì.
Glen_b

63

Tôi đã tạo ra một ứng dụng sáng bóng để giúp diễn giải cốt truyện QQ bình thường. Hãy thử liên kết này .

Trong ứng dụng này, bạn có thể điều chỉnh độ lệch, độ dốc (kurtosis) và phương thức của dữ liệu và bạn có thể thấy biểu đồ và biểu đồ QQ thay đổi như thế nào. Ngược lại, bạn có thể sử dụng nó theo cách đưa ra mô hình của cốt truyện QQ, sau đó kiểm tra xem độ lệch v.v.

Để biết thêm chi tiết, xem tài liệu trong đó.


Tôi nhận ra rằng tôi không có đủ không gian trống để cung cấp ứng dụng này trực tuyến. Theo yêu cầu, tôi sẽ cung cấp tất cả ba khối mã: sample.R, server.Rui.Rở đây. Những người quan tâm đến việc chạy ứng dụng này có thể chỉ cần tải các tệp này vào Rstudio sau đó chạy nó trên PC của chính bạn.

Các sample.Rtập tin:

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

Các server.Rtập tin:

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

Cuối cùng, ui.Rtập tin:

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
Có vẻ như dung lượng ứng dụng Shiny của bạn đã đạt mức tối đa. Có lẽ bạn chỉ có thể cung cấp mã
rupten

1
@rsoren đã thêm, hy vọng nó có ích và tôi mong được nghe đề xuất.
Zhanxiong 17/2/2016

Rất đẹp! Tôi cũng đề nghị thêm các tùy chọn để thay đổi kích thước mẫu và mức độ ngẫu nhiên.
Itamar

Liên kết không có sẵn !!!! @Zhanxiong
Alireza Sanaee

Có vẻ như liên kết không phản hồi sau một số lần nhấp hạn chế mỗi tháng. Đó là lý do tôi dán mã nguồn ở đây (theo yêu cầu của những người dùng khác gặp phải vấn đề tương tự như bạn). Bạn có thể dán chúng vào studio R của bạn và chạy chúng trên PC của riêng bạn (sau khi các gói yêu cầu được tải trước).
Zhanxiong

6

Một lời giải thích rất hữu ích (và trực quan) được đưa ra bởi prof. Philippe Rigollet trong khóa học MIT MOOC: 18.650 Thống kê cho các ứng dụng, mùa thu 2016 - xem video sau 45 phút

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

Tôi đã sao chép sơ đồ của anh ấy một cách thô bạo mà tôi giữ trong các ghi chú của mình vì tôi thấy nó rất hữu ích.

Sơ đồ phác họa QQ

Trong ví dụ 1, trong sơ đồ trên cùng bên trái, chúng ta thấy rằng ở phần đuôi bên phải, lượng tử thực nghiệm (hoặc mẫu) nhỏ hơn lượng tử lý thuyết

Qe <Qt

Điều này có thể được giải thích bằng cách sử dụng các hàm mật độ xác suất. Với cùng một giá trị , lượng tử thực nghiệm nằm ở bên trái của lượng tử lý thuyết, có nghĩa là đuôi bên phải của phân bố thực nghiệm "nhẹ hơn" đuôi phải của phân bố lý thuyết, tức là nó rơi nhanh hơn các giá trị gần với số không.α

nhập mô tả hình ảnh ở đây


3

Vì chủ đề này đã được coi là "cách diễn giải cốt truyện qq bình thường" bài đăng StackExchange, tôi muốn hướng người đọc đến một mối quan hệ toán học chính xác, tốt đẹp giữa âm mưu qq bình thường và thống kê kurtosis dư thừa.

Đây là:

https://stats.stackexchange.com/a3534076/102879

Một bản tóm tắt ngắn gọn (và quá đơn giản) được đưa ra như sau (xem liên kết để biết các báo cáo toán học chính xác hơn): Bạn thực sự có thể thấy sự kurtosis dư thừa trong biểu đồ qq bình thường là khoảng cách trung bình giữa các lượng tử dữ liệu và lượng tử bình thường theo lý thuyết tương ứng, có trọng số theo khoảng cách từ dữ liệu đến giá trị trung bình. Do đó, khi các giá trị tuyệt đối trong các đuôi của biểu đồ qq thường lệch khỏi các giá trị bình thường dự kiến ​​rất nhiều theo các hướng cực đoan, bạn có hiện tượng dư thừa dương.

Bởi vì kurtosis là trung bình của các độ lệch này có trọng số bởi khoảng cách từ giá trị trung bình, các giá trị gần trung tâm của biểu đồ qq ít có tác động đến kurtosis. Do đó, kurtosis dư thừa không liên quan đến trung tâm phân phối, nơi "đỉnh" là. Thay vào đó, sự suy yếu quá mức gần như hoàn toàn được xác định bằng cách so sánh các đuôi của phân phối dữ liệu với phân phối bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.