A. Giới thiệu bộ dữ liệu về sức khỏe và tái nhiễm Covid-19

1. Tổng quan bộ dữ liệu

Bộ dữ liệu COVID-19 Reinfection and Health Dataset mô phỏng hồ sơ của các bệnh nhân Covid-19 ở Đan Mạch giai đoạn 2020 - 2024. Bộ dữ liệu được thu thập và công bố tại https://www.kaggle.com/datasets/khushikyad001/covid-19-reinfection-and-health-dataset/data

# Tải và đọc file dữ liệu
tk <- read.csv("D:/AnhThu/DATA_DT/covid_related_disease_data.csv")

# Xem cấu trúc của bộ dữ liệu
str(tk)
## 'data.frame':    3000 obs. of  26 variables:
##  $ Patient_ID             : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Age                    : int  69 38 41 81 50 66 76 77 79 72 ...
##  $ Gender                 : chr  "Male" "Male" "Female" "Female" ...
##  $ Region                 : chr  "Hovedstaden" "Sjælland" "Syddanmark" "Hovedstaden" ...
##  $ Preexisting_Condition  : chr  "Obesity" "Asthma" "Hypertension" "Asthma" ...
##  $ Date_of_Infection      : chr  "06/21/2022" "02/02/2024" "05/28/2023" "08/13/2023" ...
##  $ COVID_Strain           : chr  "Delta" "XBB.1.5" "Beta" "Delta" ...
##  $ Symptoms               : chr  "Mild" "Mild" "Mild" "Severe" ...
##  $ Severity               : chr  "Moderate" "Moderate" "High" "High" ...
##  $ Hospitalized           : chr  "Yes" "No" "Yes" "No" ...
##  $ Hospital_Admission_Date: chr  "01/13/2025" "" "03/07/2025" "" ...
##  $ Hospital_Discharge_Date: chr  "01/26/2025" "" "04/26/2025" "" ...
##  $ ICU_Admission          : chr  "No" "No" "Yes" "No" ...
##  $ Ventilator_Support     : chr  "No" "No" "Yes" "No" ...
##  $ Recovered              : chr  "Yes" "No" "No" "Yes" ...
##  $ Date_of_Recovery       : chr  "04/19/2023" "" "" "02/09/2025" ...
##  $ Reinfection            : chr  "No" "No" "No" "Yes" ...
##  $ Date_of_Reinfection    : chr  "" "" "" "08/24/2024" ...
##  $ Vaccination_Status     : chr  "Yes" "No" "Yes" "Yes" ...
##  $ Vaccine_Type           : chr  "None" "None" "Janssen" "AstraZeneca" ...
##  $ Doses_Received         : int  1 0 3 1 2 3 0 3 0 1 ...
##  $ Date_of_Last_Dose      : chr  "09/22/2022" "" "05/14/2024" "10/31/2024" ...
##  $ Long_COVID_Symptoms    : chr  "None" "None" "Fatigue" "None" ...
##  $ Occupation             : chr  "Healthcare" "Healthcare" "Unemployed" "Office Worker" ...
##  $ Smoking_Status         : chr  "Never" "Never" "Never" "Never" ...
##  $ BMI                    : num  27.7 21.9 22.7 27.7 11.9 29.8 22.3 24.4 26.1 21.2 ...

Bộ dữ liệu là data frame, bao gồm 3000 quan sát và 26 biến. Bộ dữ liệu bao gồm các biến sau:

  • Patient_ID: Mã bệnh nhân

  • Age: Tuổi của bệnh nhân

  • Gender: Giới tính của bệnh nhân

  • Region: Khu vực cư trú của khách hàng

  • Pressxisting_Condition: Các bệnh nền của bệnh nhân

  • Date_of_Infection: Ngày bị nhiễm Covid-19

  • COVID_Strain: Biến thể Covid-19

  • Symptoms: Mức độ triệu chứng Covid

  • Severity: Mức độ nghiêm trọng Covid

  • Hospitalized: Khả năng nhập viện của bệnh nhân (Yes/No)

  • Hospital_Admission_Date: Ngày bệnh nhân nhập viện

  • Hospital_Discharge_Date: Ngày xuất viện

  • ICU_Admission: Bệnh nhân có vào phòng ICU hay không (Yes/No)

  • Ventilator_Support: Có sử dụng máy thở hay không (Yes/No)

  • Recovered: Tình trạng phục hồi sức khỏe (Yes/No)

  • Date_of_Recovery: Ngày phục hồi sức khỏe

  • Reinfection: Có tái nhiễm Covid hay không (Yes/No)

  • Date_of_Reinfection: Ngày tái nhiễm

  • Vaccination_Status: Tình trạng tiêm chủng

  • Vaccine_Type: Loại vắc xin

  • Doses_Received: Số liều vắc xin

  • Date_of_Last_Dose: Ngày tiêm vắc xin lần cuối

  • Long_COVID_Symptoms: Triệu chứng hậu Covid

  • Occupation: Nghề nghiệp của bệnh nhân

  • Smoking_Status: Tình trạng hút thuốc: Never (chưa bao giờ), Former(đã từng), Current (đang hút)

  • BMI: Chỉ số khối cơ thể

Ở bài này, các biến định tính được lựa chọn để phân tích, bao gồm: Symptoms, Hospitalized, Recovered, Long_COVID_Symptoms. Ta tiến hành kiểm tra xem có giá trị bị thiếu (NA) trong các biến định tính.

# Rút trích các dữ liệu định tính
a <- select(tk, c("Symptoms", "Hospitalized", "Recovered", "Long_COVID_Symptoms"))

# Kiểm tra số lượng giá trị bị thiếu (NA)
sum(is.na(a))
## [1] 0
  • Kết quả hàm is.na() tạo ra một bảng giá trị TRUE nếu giá trị bị thiếu (NA), FALSE nếu không bị NA. Kết quả sum() cho biết số lượng TRUE, tức là đếm số ô bị thiếu dữ liệu.

Dựa vào kết quả kiểm tra = 0, cho thấy không có giá trị bị thiếu (NA) trong các biến định tính của bộ dữ liệu.

2. Phân tích bộ dữ liệu

2.1. Biến Symptom

Bảng tần số mức độ triệu chứng:

# Số lượng các mức độ
table(a$Symptoms)
## 
##     Mild Moderate   Severe 
##     1010      978     1012
# Trực quan hóa dữ liệu
a %>% group_by(Symptoms) %>% summarise(n = n()) %>% 
  mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>% 
  ggplot(aes(x = "", y = n, fill = Symptoms)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn thể hiện tần suất mức độ triệu chứng") +
  theme_void()

Nhận xét: Phân bổ mức độ triệu chứng khá đồng đều, trong đó 33,67% là triệu chứng nhẹ (1010/3000 đối với Mild), 32,6% là triệu chứng trung bình (978/3000 đối với Moderate) và 33,73% là triệu chứng nguy hiểm (Severe).

Ước lượng khoảng tin cậy

Với độ tin cậy 95%, tỷ lệ của triệu chứng “Severe” trong tổng thể được thể hiện như sau:

# Số lượng mức độ nguy hiểm
se <- sum(a$Symptoms == "Severe")

# Số lượng bệnh nhân
total <- nrow(a)

# Ước lượng khoảng tin cậy 95%
prop.test(se, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  se out of total, null probability 0.5
## X-squared = 316.88, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3204679 0.3546189
## sample estimates:
##         p 
## 0.3373333
  • Ý nghĩa: Tỷ lệ mức độ là là Severe trong tập bệnh nhân là 33,73%. Với độ tin cậy 95%, tỷ lệ Severe trong toàn bộ mức độ nằm trong khoảng 32,05% đến 35,46%.

Kiểm định giả thuyết:

Đặt giả thuyết:

  • H0: p = 0.5

  • H1: p ≠ 0.5

Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 2.2e - 16 < 0.05. Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Severe không phải là 50% mà là nằm trong khoảng tin cậy [32,05%;35,62%].

2.2. Biến Hospitalized

Bảng tần số khả năng nhập viện:

# Số lượng các khả năng nhập viện
table(a$Hospitalized)
## 
##   No  Yes 
## 2124  876
# Trực quan hóa dữ liệu
a %>% group_by(Hospitalized) %>% summarise(n = n()) %>% 
  mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>% 
  ggplot(aes(x = "", y = n, fill = Hospitalized)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn thể hiện tần suất khả năng nhập viện") +
  theme_void()

Nhận xét:

Bảng tần số thể hiện, trong 3000 bệnh nhân có 2124 bệnh nhân không có khả năng nhập viện và 876 bệnh nhân nhập viện.

Biểu đồ tròn thể hiện tần suất khả năng nhập viện của bệnh nhân. Biểu đồ hình tròn với màu cam thể hiện tỷ lệ không nhập viện và màu xanh thể hiện tỷ lệ nhập viện. Có thể thấy trong bộ dữ liệu này có 70,8% không nhập viện và 29,2% nhập viện.

Ước lượng khoảng tin cậy

Với độ tin cậy 95%, tỷ lệ của khả năng có nhập viện trong tổng thể được thể hiện như sau:

# Số lượng mức độ nguy hiểm
hp <- sum(a$Hospitalized == "Yes")

# Ước lượng khoảng tin cậy 95%
prop.test(hp, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  hp out of total, null probability 0.5
## X-squared = 518.34, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2758402 0.3086972
## sample estimates:
##     p 
## 0.292
  • Ý nghĩa: Tỷ lệ nhập viện trong tập bệnh nhân là 29,2%. Với độ tin cậy 95%, tỷ lệ nhập viện trong toàn bộ khả năng nằm trong khoảng 27,58% đến 30,87%.

Kiểm định giả thuyết:

Đặt giả thuyết:

  • H0: p = 0.5

  • H1: p ≠ 0.5

Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 2.2e - 16 < 0.05. Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Severe không phải là 50% mà là nằm trong khoảng tin cậy [27,58%;30,87%].

2.3. Biến Recovered

Bảng tần số tình trạng phục hồi sức khỏe:

# Bảng tần số phục hồi sức khỏe
table(a$Recovered)
## 
##   No  Yes 
## 1492 1508
# Trực quan hóa dữ liệu
a %>% group_by(Recovered) %>% summarise(n = n()) %>% 
  mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>% 
  ggplot(aes(x = "", y = n, fill = Recovered)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn thể hiện tần suất phục hồi sức khỏe") +
  theme_void()

Nhận xét:

Bảng tần suất thể hiện, trong 3000 bệnh nhân, có 1508 bệnh nhân đã phục hồi sức khỏe và 1492 bệnh nhân chưa phục hồi.

Biểu đồ tròn thể hiện tần suất thể hiện tình trạng phục hồi sức khỏe. Biểu đồ hình tròn với màu cam thể hiện tỷ lệ chưa phục hồi và màu xanh thể hiện tỷ lệ đã phục hồi sức khỏe của bệnh nhân. Có thể thấy, số lượng phân bổ khá đồng đều. Vậy trong bộ dữ liệu này có 49,73% bệnh nhân chưa phục hồi và 50,27% bệnh nhân đã khỏe mạnh.

2.4. Biến Long_COVID_Symstoms

Bảng tần số triệu chứng hậu Covid:

# Số lượng triệu chứng hậu Covid
table(a$Long_COVID_Symptoms)
## 
##           Brain Fog          Chest Pain             Fatigue                None 
##                  99                  65                  79                2682 
## Shortness of Breath 
##                  75

Nhận xét: Trong 3000 bệnh nhân đã từng bị Covid-19, có 2682 bệnh nhân không có triệu chứng hậu Covid (None) và các bệnh nhân còn lại đều bị hậu Covid lần lượt là: 99 người có triệu chứng Brain Fog (suy giảm trí nhớ), 65 người bị Chest Pain (đau ngực), 79 người bị Fatigue (mệt mỏi kéo dài) và 74 người bị Shortness of Breath (khó thở).

Ước lượng khoảng tin cậy

Với độ tin cậy 95%, tỷ lệ của triệu chứng “Brain Fog” trong tổng thể được thể hiện như sau:

# Số lượng bệnh nền hen suyễn
al <- sum(a$Long_COVID_Symptoms == "Brain Fog")

# Ước lượng khoảng tin cậy 95%
prop.test(al, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  al out of total, null probability 0.5
## X-squared = 2615.2, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.02703021 0.04019522
## sample estimates:
##     p 
## 0.033

Ý nghĩa: Tỷ lệ triệu chứng hậu Covid là Brain Fog trong tập bệnh nhân là 3,3%%. Với độ tin cậy 95%, tỷ lệ Brian Fog trong toàn bộ triệu chứng hậu Covid nằm trong khoảng 2,7% đến 4,02%.

Kiểm định giả thuyết:

Đặt giả thuyết:

  • H0: p = 0.5

  • H1: p ≠ 0.5

Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 2.2e - 16 < 0.05 . Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Asthma không phải là 50% mà là nằm trong khoảng tin cậy [2,7%;4,02%].

B. Phân tích mối quan hệ giữa hai biến định tính

1. Phân tích mối quan hệ giữa Recovered và Long_COVID_Symstoms

Hai biến Recovered và Long_COVID_Symstoms được lựa chọn để trả lời câu hỏi những bệnh nhân chưa phục hồi sức khỏe có nguy cơ mắc những triệu chứng hậu Covid cao hơn so với những người đã khỏe mạnh hay không?

1.1. Thống kê mô tả 2 biến

Bảng tần suất thể hiện tỷ lệ phần trăm triệu chứng hậu COVID theo từng nhóm hồi phục sức khỏe

# Bảng tần số tái nhiễm và bệnh nền
table_rec_long <- table(a$Recovered, a$Long_COVID_Symptoms)

# Tính tỷ lệ % theo từng bệnh nền
tyle <- round(prop.table(table_rec_long, margin = 1)*100,2)
tyle
##      
##       Brain Fog Chest Pain Fatigue  None Shortness of Breath
##   No       1.07       0.34    0.87 96.38                1.34
##   Yes      5.50       3.98    4.38 82.49                3.65

Biểu đồ thể hiện tỷ lệ Recovered với Long_COVID_Symptoms

ggplot(a, aes(x = Recovered, fill = Long_COVID_Symptoms)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(title = "Tỷ lệ hậu Covid theo tình trạng hồi phục sức khỏe", x = "Tình trạng hồi phục", y = "Tỷ lệ phần trăm")

Diễn giải kết quả: Bảng tần suất cho biết, tại mỗi nhóm tình trạng hồi phục sức khỏe (Yes/No) có bao nhiêu % người gặp các triệu chứng hậu Covid. Cụ thể, đối với nhóm đã hồi phục, khoảng 82,49% bệnh nhân hoàn toàn hồi phục không gặp các triệu chứng, còn lại là những người vẫn gặp các triệu chứng kéo dài như mệt mỏi (4,38%), suy giảm trí nhớ (5,5%), đau ngực (3,98%) và khó thở (3,65%). Ngược lại, trong nhóm chưa hồi phục, toàn bộ bệnh nhân (100%) chưa ghi nhận triệu chứng hậu Covid-19.

1.2. Kiểm tra tính độc lập của 2 biến

Để kiểm tra mối quan hệ giữa Recovered và Long_COVID_Symptoms, ta sử dụng kiểm định Chi-square test để khẳng định mối quan hệ này.

Đặt giả thuyết:

  • H0: Recovered và Long_COVID_Symptoms độc lập,

  • H1: Recovered và Long_COVID_Symptoms có liên quan

chisq.test(table_rec_long)
## 
##  Pearson's Chi-squared test
## 
## data:  table_rec_long
## X-squared = 157.72, df = 4, p-value < 2.2e-16

Kết luận thống kê: Giá trị p_value < 2.2e - 16 < 0.05 nên ta bác bỏ giả thuyết H0. Vậy tình trạng phục hồi sức khỏe Recovered và triệu chứng hậu Covid Long_COVID_Symptoms có mối liên hệ với nhau.

1.3. Relative Risk

Vì Relative Risk chỉ thực hiện được cho 2 biến định tính nhị phân, hay dữ liệu bảng 2x2. Do đó, ta tiến hành mã hóa các triệu chứng sau Covid thành 2 nhóm: Nhóm không gặp triệu chứng (False) và nhóm gặp triệu chứng (True)

# Mã hóa dữ liệu Long_COVID_Symptoms thành biến Long_COVID_Symptoms1
a$Long_COVID_Symptoms1 <- recode(a$Long_COVID_Symptoms, None = 'False', .default = 'True')

# Bảng tần số chéo
table_rec_long1 <- table(a$Recovered, a$Long_COVID_Symptoms1)
table_rec_long1
##      
##       False True
##   No   1438   54
##   Yes  1244  264
# Tính rủi ro tương đối 
RelRisk(table_rec_long1)
## [1] 1.168345

Diễn giải: Kết quả tính toán Relative Risk (RR) giữa 2 tình trạng hồi phục Yes/No và 2 triệu chứng hậu Covid True/False cho thấy RR = 1,1683. Kết quả tính toán cho thấy những người chưa hồi phục sức khỏe không có nguy cơ gặp triệu chứng hậu Covid cao hơn khoảng 1,1683 lần so với nhóm bệnh nhân đã phục hồi sức khỏe.

# Tính Relative Risk 
riskratio(table_rec_long1, rev = 'c')
## $data
##        
##         True False Total
##   No      54  1438  1492
##   Yes    264  1244  1508
##   Total  318  2682  3000
## 
## $measure
##      risk ratio with 95% C.I.
##        estimate    lower     upper
##   No  1.0000000       NA        NA
##   Yes 0.8559117 0.834575 0.8777939
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact   chi.square
##   No          NA           NA           NA
##   Yes          0 1.616839e-37 4.612154e-35
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Kết quả RR = 0,8559 cho thấy rằng những bệnh nhân đã phục hồi sức khỏe không mắc cái triệu chứng hậu Covid khoảng 0,856 lần so với những bệnh nhân chưa phục hồi sức khỏe.

1.4. Odds Ratio

oddsratio(table_rec_long1, rev = 'c')
## $data
##        
##         True False Total
##   No      54  1438  1492
##   Yes    264  1244  1508
##   Total  318  2682  3000
## 
## $measure
##      odds ratio with 95% C.I.
##        estimate     lower     upper
##   No  1.0000000        NA        NA
##   Yes 0.1774478 0.1298802 0.2381877
## 
## $p.value
##      two-sided
##       midp.exact fisher.exact   chi.square
##   No          NA           NA           NA
##   Yes          0 1.616839e-37 4.612154e-35
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả:

  • Tỷ lệ chênh Odds Ratio = 0,1774, tức là tỷ lệ mắc triệu chứng hậu Covid (so với không có hậu Covid) ở nhóm bệnh nhân chưa hồi phục sức khỏe thấp hơn 0,1774 ở nhóm đã hồi phục. Kết quả Odds Ratio chỉ ra rằng nhóm đã hồi phục có khả năng mắc triệu chứng hậu COVID cao hơn nhóm chưa hồi phục.

2. Phân tích mối quan hệ giữa Symptoms và Hospitalized

Hai biến SymptomS và Hospitalized được lựa chọn để trả lời câu hỏi mức độ nghiêm trọng của triệu chứng Covid-19 có liên quan đến khả năng nhập viện của bệnh nhân hay không?

2.1. Thống kê mô tả 2 biến

Bảng tần suất thể hiện tỷ lệ mức độ triệu chứng với khả năng nhập viện

Ta tiến hành quy ước khả năng nhập viện thành 2 biểu hiện là “Nhập viện” và “Không nhập viện”

a$Hospi1 <- recode(a$Hospitalized,Yes = 'Nhập viện', No = 'Không nhập viện')
# Bảng tần số mức độ và khả năng nhập viện
table_sym_hos <- table(a$Symptoms, a$Hospi1)

# Tính tỷ lệ % theo từng bệnh nền
tyle1 <- round(prop.table(table_sym_hos, margin = 1)*100,2)
tyle1
##           
##            Không nhập viện Nhập viện
##   Mild               67.62     32.38
##   Moderate           73.11     26.89
##   Severe             71.74     28.26

Biểu đồ tình trạng nhập viện theo mức độ triệu chứng:

ggplot(a, aes(x = Symptoms, fill = Hospitalized)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(title = "Tình trạng nhập viện theo mức độ triệu chứng ", x = "Mức độ nghiêm trọng", y = "Tỷ lệ phần trăm")

Diễn giải kết quả: Bảng tần suất cho biết, tại mỗi mức độ cụ thể có bao nhiêu % bệnh nhân nhập viện (hoặc không). Dựa vào bảng tần suất có sự khác biệt giữa các mức độ. Tại mức độ Moderate (Trung bình) có 73,11% bệnh nhân không nhập viện , trong khi đó bệnh nhân với mức độ Mild có tỷ lệ nhập viện là 32,38%.

2.2. Kiểm tra tính độc lập của 2 biến

chisq.test(table_sym_hos)
## 
##  Pearson's Chi-squared test
## 
## data:  table_sym_hos
## X-squared = 7.8812, df = 2, p-value = 0.01944

Kết luận thống kê: Giá trị p_value = 0.01944 < 0.05 nên ta bác bỏ giả thuyết H0. Vậy SymptomS và Hospitalized có mối liên hệ với nhau.

2.3. Relative Risk

Vì Relative Risk chỉ thực hiện được cho 2 biến định tính nhị phân, hay dữ liệu bảng 2x2. Do đó, ta tiến hành xét 2 biểu hiện của mức độ là Mild đại diện cho triệu chứng nhẹ và Severe đại diện cho các triệu chứng nguy hiểm

# Lọc dữ liệu
Mucdo <- a %>% filter(Symptoms == "Mild"| Symptoms == "Severe")

Tính Relative Risk:

# Tạo bảng tần số chéo
table_md <- table(Mucdo$Symptoms, Mucdo$Hospi1)
table_md
##         
##          Không nhập viện Nhập viện
##   Mild               683       327
##   Severe             726       286
# Tính Relative Risk
RelRisk(table_md)
## [1] 0.9426343

Diễn giải: Kết quả tính toán Relative Risk (RR) giữa 2 mức độ Mild/Severe và 2 khả năng nhập viện Yes/No cho thấy RR = 0,9426. Kết quả tính toán khả năng không nhập viện của bệnh nhân mắc triệu chứng nhẹ thấp hơn khoảng 0,943 lần so với bệnh nhân mắc triệu chứng nguy hiểm.

riskratio(table_md)
## $data
##         
##          Không nhập viện Nhập viện Total
##   Mild               683       327  1010
##   Severe             726       286  1012
##   Total             1409       613  2022
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate    lower     upper
##   Mild   1.0000000       NA        NA
##   Severe 0.8728892 0.764498 0.9966483
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Mild           NA           NA         NA
##   Severe  0.0443084    0.0472765 0.04410454
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét:

Kết quả RR = 0.8729 cho thấy rằng rủi ro nhập viện đối với bệnh nhân Covid nguy hiểm thấp hơn nhóm bệnh nhân có triệu chứng nhẹ khoảng 0,8729 lần.

2.4. Odds Ratio

oddsratio(table_md, rev = 'c')
## $data
##         
##          Nhập viện Không nhập viện Total
##   Mild         327             683  1010
##   Severe       286             726  1012
##   Total        613            1409  2022
## 
## $measure
##         odds ratio with 95% C.I.
##          estimate    lower    upper
##   Mild   1.000000       NA       NA
##   Severe 1.215171 1.004972 1.469925
## 
## $p.value
##         two-sided
##          midp.exact fisher.exact chi.square
##   Mild           NA           NA         NA
##   Severe  0.0443084    0.0472765 0.04410454
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Diễn giải

Tỷ lệ chênh Odds Ratio = 1,215, tức là tỷ lệ khả năng nhập viện (so với không nhập viện) ở triệu chứng nhẹ (Mild) cao hơn khả năng nhập viện (so với không nhập viện) ở triệu chứng nguy hiểm (Severe) 1,215 lần.

C. Ước lượng hồi quy cho dữ liệu nhị phân

1. Hồi quy Logit

Thực hiện hồi quy logit giữa biến phụ thuộc “Tình trạng phục hồi sức khỏe” và biến độc lập là “Các triệu chứng hậu Covid”. Để thực hiện hồi quy logit, biến phụ thuộc và độc lập phải là biến nhị phân. Vì vậy, ta tiến hành chuyển đổi các biến thành factor

# Chuyển đổi các biến thành factor
a$Recovered <- factor(a$Recovered, levels = c('Yes','No'))
a$Long_COVID_Symptoms1 <- factor(a$Long_COVID_Symptoms1, levels = c('False','True'))

# Hồi quy logit
logit_model <- glm(Recovered ~ Long_COVID_Symptoms1, data = a, family = binomial(link = 'logit'))
summary(logit_model)
## 
## Call:
## glm(formula = Recovered ~ Long_COVID_Symptoms1, family = binomial(link = "logit"), 
##     data = a)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               0.14492    0.03872   3.743 0.000182 ***
## Long_COVID_Symptoms1True -1.73189    0.15429 -11.225  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4158.8  on 2999  degrees of freedom
## Residual deviance: 3993.7  on 2998  degrees of freedom
## AIC: 3997.7
## 
## Number of Fisher Scoring iterations: 3

Kết quả hồi quy như sau:

\[ \ln\left(\frac{p}{1 - p}\right) = 0.14492 - 1.73189 \times \mathit{LongCovidSymstom_{True}} \]

  • Hệ số chặn là 0.14492, có giá trị p_value < mức ý nghĩa 0.05. Hệ số này có ý nghĩa là đối với bệnh nhân đã phục hồi sức khỏe thì log(odd) không mắc các triệu chứng hậu Covid là 0.144492.

  • Hệ số \(\hat{\beta}_1 = -1.73189\) cho thấy log(odd) mắc các triệu chứng hậu Covid của bệnh nhân đã phục hồi sức khỏe thấp hơn khoảng 1.73189 so với không mắc hậu Covid

2. Hồi quy Probit

probit_model <- glm(Recovered ~ Long_COVID_Symptoms1, data = a, family = binomial(link = 'probit'))
summary(probit_model)
## 
## Call:
## glm(formula = Recovered ~ Long_COVID_Symptoms1, family = binomial(link = "probit"), 
##     data = a)
## 
## Coefficients:
##                          Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               0.09078    0.02424   3.746  0.00018 ***
## Long_COVID_Symptoms1True -1.04569    0.08672 -12.059  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4158.8  on 2999  degrees of freedom
## Residual deviance: 3993.7  on 2998  degrees of freedom
## AIC: 3997.7
## 
## Number of Fisher Scoring iterations: 3

Kết quả hồi quy như sau:

\[ \pi = \Phi(0.09078 - 1.04569 \times \mathit{LongCovidSymstom_{True}}) \]

  • Hệ số chặn là 0.09078, nghĩa là xác suất là bệnh nhân đã phục hồi sức khỏe không mắc các triệu chứng hậu Covid là 0.09078.

  • Hệ số \(\hat{\beta}_1 = -1.04569\) cho thấy xác suất mắc các triệu chứng hậu Covid của bệnh nhân đã phục hồi sức khỏe thấp hơn khoảng 1.04569 so với không mắc hậu Covid

3. Dự báo từ mô hinh

Từ kết quả hồi quy, ta dự báo xác suất cho khách hàng đã hồi phục sức khỏe theo khả năng mắc hậu Covid hay không. Kết quả dự báo như sau:

# Tạo dữ liệu mới với từng khả năng mắc hậu Covid
dubao <- data.frame(Long_COVID_Symptoms1 = c("False", "True"))

# Ước lượng xác suất hồi phục sức khỏe cho khả năng
predict(logit_model, newdata = dubao, type = "response")
##         1         2 
## 0.5361670 0.1698113

Kết quả dự báo như sau:

  • Xác suất những bệnh nhân đã hồi phục không mắc các triệu chứng hậu Covid là 53,62%.

  • Xác suất những bệnh nhân đã hồi phục mắc các triệu chứng hậu Covid là 16,98%.