36 Biểu đồ kết hợp

Phân tích này vẽ biểu đồ tần suất của các kết hợp giá trị/phản hồi khác nhau. Trong ví dụ này, chúng ta sẽ vẽ biểu đồ tần suất các trường hợp có biểu hiện kết hợp nhiều triệu chứng khác nhau.

Phân tích này còn thường được gọi bằng những tên khác như:

  • “Phân tích nhiều lựa chọn”
  • “Phân tích các bộ (sets)”
  • “Phân tích kết hợp”

Trong biểu đồ minh họa bên trên, năm triệu chứng được trình bày. Bên dưới mỗi thanh dọc là một đường và dấu chấm biểu thị sự kết hợp của các triệu chứng được phản ánh bởi thanh ở trên. Ở bên trái, các thanh ngang phản ánh tần suất của từng triệu chứng riêng lẻ.

Phương pháp đầu tiên chúng tôi sẽ trình bày sử dụng package ggupset, phương pháp thứ hai sử dụng package UpSetR.

36.1 Chuẩn bị

Gọi package

Đoạn code này hiển thị việc gọi các gói cần thiết cho các phân tích. Trong cuốn sách này, chúng tôi nhấn mạnh việc sử dụng hàm p_load() từ package pacman, giúp cài đặt các package nếu cần thiết gọi chúng ra để sử dụng. Bạn cũng có thể gọi các packages đã cài đặt với hàm library() của base R. Xem thêm chương R cơ bản để có thêm thông tin về các packages trong R.

pacman::p_load(
  tidyverse,     # data management and visualization
  UpSetR,        # special package for combination plots
  ggupset)       # special package for combination plots

Nhập dữ liệu

Để bắt đầu, chúng ta nhập bộ dữ liệu có tên linelist đã làm sạch bao gồm các trường hợp từ vụ dịch Ebola mô phỏng. Để tiện theo dõi, bấm để tải dữ liệu linelist “đã được làm sạch” (dưới dạng tệp .rds). Nhập dữ liệu bằng hàm import() từ package rio (nó xử lý nhiều loại tệp như .xlsx, .csv, .rds - xem thêm chương Nhập xuất dữ liệu để biết thêm chi tiết.

# import case linelist 
linelist_sym <- import("linelist_cleaned.rds")

Bộ số liệu linelist bao gồm năm biến “có/không” về các triệu chứng được ghi nhận. Chúng ta sẽ cần phải biến đổi các biến số này một chút trước khi sử dụng package ggupset để tạo biểu đồ. Xem dữ liệu (cuộn sang phải để xem các biến triệu chứng).

Định dạng lại giá trị

Để tương đồng với định dạng của package ggupset, chúng ta cần đổi giá trị “yes” và “no” thành tên các triệu chứng thực tế, sử dụng hàm case_when() từ package dplyr. Nếu giá trị là “no”, chúng ta sẽ bỏ trống, nghĩa là biến mới sẽ có giá trị hoặc là NA hoặc là triệu chứng.

# create column with the symptoms named, separated by semicolons
linelist_sym_1 <- linelist_sym %>% 
  
  # convert the "yes" and "no" values into the symptom name itself
  mutate(
    fever = case_when(
      fever == "yes" ~ "fever",          # if old value is "yes", new value is "fever"
      TRUE           ~ NA_character_),   # if old value is anything other than "yes", the new value is NA
         
    chills = case_when(
       chills == "yes" ~ "chills",
       TRUE           ~ NA_character_),
    
    cough = case_when(
      cough == "yes" ~ "cough",
      TRUE           ~ NA_character_),
         
    aches = case_when(
      aches == "yes" ~ "aches",
      TRUE           ~ NA_character_),
         
    vomit = case_when(
      vomit == "yes" ~ "vomit",
      TRUE           ~ NA_character_)
    )

Bây giờ chúng ta tạo hai cột cuối cùng:

  1. Kết hợp (ghép lại với nhau) tất cả các triệu chứng của bệnh nhân (thành một cột ký tự)
  2. Chuyển đổi định dạng cột bên trên thành kiểu danh sách để được chấp nhận bởi package ggupset khi vẽ biểu đồ

Xem thêm chương Ký tự và chuỗi để biết thêm về hàm unite() trong package stringr

linelist_sym_1 <- linelist_sym_1 %>% 
  unite(col = "all_symptoms",
        c(fever, chills, cough, aches, vomit), 
        sep = "; ",
        remove = TRUE,
        na.rm = TRUE) %>% 
  mutate(
    # make a copy of all_symptoms column, but of class "list" (which is required to use ggupset() in next step)
    all_symptoms_list = as.list(strsplit(all_symptoms, "; "))
    )

Bây giờ chúng ta cùng xem dữ liệu mới. Lưu ý hai cột ở cuối bên phải - các giá trị kết hợp được ghép và danh sách

36.2 ggupset

Gọi package

pacman::p_load(ggupset)

Vẽ biểu đồ. Chúng ta bắt đầu bằng hàm ggplot()geom_bar(), nhưng sau đó chúng ta thêm hàm đặc biệt scale_x_upset() từ package ggupset.

ggplot(
  data = linelist_sym_1,
  mapping = aes(x = all_symptoms_list)) +
geom_bar() +
scale_x_upset(
  reverse = FALSE,
  n_intersections = 10,
  sets = c("fever", "chills", "cough", "aches", "vomit"))+
labs(
  title = "Signs & symptoms",
  subtitle = "10 most frequent combinations of signs and symptoms",
  caption = "Caption here.",
  x = "Symptom combination",
  y = "Frequency in dataset")

Bạn có thể đọc thêm về package ggupset ở tài liệu online này hoặc trong tài liệu trợ giúp của package bằng cách gõ vào cửa RStudio Help lệnh ?ggupset.

36.3 UpSetR

Package UpSetR cho phép tùy chỉnh biểu đồ sâu hơn, nhưng nó cũng khó thực hiện hơn:

Gọi package

pacman::p_load(UpSetR)

Làm sạch dữ liệu

Chúng ta phải chuyển đổi các triệu chứng trong bộ dữ liệu linelist thành các giá trị 1 / 0.

# Make using upSetR

linelist_sym_2 <- linelist_sym %>% 
  
  # convert the "yes" and "no" values into the symptom name itself
  mutate(
    fever = case_when(
      fever == "yes" ~ 1,    # if old value is "yes", new value is 1
      TRUE           ~ 0),   # if old value is anything other than "yes", the new value is 0
         
    chills = case_when(
      chills == "yes" ~ 1,
      TRUE           ~ 0),
         
    cough = case_when(
      cough == "yes" ~ 1,
      TRUE           ~ 0),
         
    aches = case_when(
      aches == "yes" ~ 1,
      TRUE           ~ 0),
         
    vomit = case_when(
      vomit == "yes" ~ 1,
      TRUE           ~ 0)
    )

Bây giờ chúng ta hãy vẽ biểu đồ bằng hàm tùy chỉnh upset() - chỉ sử dụng các cột triệu chứng. Bạn phải chỉ định “bộ” nào để so sánh (tên của các cột triệu chứng). Một cách khác, sử dụng nsets =order.by = "freq" để chỉ hiện thị X các sự kết hợp nhiều nhất.

# Make the plot
UpSetR::upset(
  select(linelist_sym_2, fever, chills, cough, aches, vomit),
  sets = c("fever", "chills", "cough", "aches", "vomit"),
  order.by = "freq",
  sets.bar.color = c("blue", "red", "yellow", "darkgreen", "orange"), # optional colors
  empty.intersections = "on",
  # nsets = 3,
  number.angles = 0,
  point.size = 3.5,
  line.size = 2, 
  mainbar.y.label = "Symptoms Combinations",
  sets.x.label = "Patients with Symptom")