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 và 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.
::p_load(
pacman# data management and visualization
tidyverse, # special package for combination plots
UpSetR, # special package for combination plots ggupset)
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
<- import("linelist_cleaned.rds") linelist_sym
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 %>%
linelist_sym_1
# convert the "yes" and "no" values into the symptom name itself
mutate(
fever = case_when(
== "yes" ~ "fever", # if old value is "yes", new value is "fever"
fever TRUE ~ NA_character_), # if old value is anything other than "yes", the new value is NA
chills = case_when(
== "yes" ~ "chills",
chills TRUE ~ NA_character_),
cough = case_when(
== "yes" ~ "cough",
cough TRUE ~ NA_character_),
aches = case_when(
== "yes" ~ "aches",
aches TRUE ~ NA_character_),
vomit = case_when(
== "yes" ~ "vomit",
vomit TRUE ~ NA_character_)
)
Bây giờ chúng ta tạo hai cột cuối cùng:
- 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ự)
- 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
::p_load(ggupset) pacman
Vẽ biểu đồ. Chúng ta bắt đầu bằng hàm ggplot()
và 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
::p_load(UpSetR) pacman
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 %>%
linelist_sym_2
# convert the "yes" and "no" values into the symptom name itself
mutate(
fever = case_when(
== "yes" ~ 1, # if old value is "yes", new value is 1
fever TRUE ~ 0), # if old value is anything other than "yes", the new value is 0
chills = case_when(
== "yes" ~ 1,
chills TRUE ~ 0),
cough = case_when(
== "yes" ~ 1,
cough TRUE ~ 0),
aches = case_when(
== "yes" ~ 1,
aches TRUE ~ 0),
vomit = case_when(
== "yes" ~ 1,
vomit TRUE ~ 0)
)
Bạn có thể tham khảo hàm +()
được dùng kết hợp với hàm across()
để thực hiện thay đổi trên nhiều cột cùng lúc (đọc thêm tại chương Các hàm làm sạch dữ liệu).
# Efficiently convert "yes" to 1 and 0
<- linelist_sym %>%
linelist_sym_2
# convert the "yes" and "no" values into 1s and 0s
mutate(across(c(fever, chills, cough, aches, vomit), .fns = ~+(.x == "yes")))
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 =
và order.by = "freq"
để chỉ hiện thị X các sự kết hợp nhiều nhất.
# Make the plot
::upset(
UpSetRselect(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")