library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(ggplot2)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(skimr)
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(csv)
## Warning: package 'csv' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(pander)
## Warning: package 'pander' was built under R version 4.3.3
library(formattable)
## Warning: package 'formattable' was built under R version 4.3.3
library(htmltools)
## 
## Attaching package: 'htmltools'
## The following object is masked from 'package:pander':
## 
##     p
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
## 
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
## 
##     AUC, ICC, SD
library(epitools)

1 PHẦN 1. GIỚI THIỆU VỀ BỘ DỮ LIỆU

Bộ dữ liệu này là tập hợp các hồ sơ bệnh nhân COVID-19 tại Đan Mạch, mô phỏng xu hướng lâm sàng và dịch tễ đã quan sát từ tháng 01/2021 đến hết tháng 12/2024. Mỗi hồ sơ phản ánh đầy đủ quá trình nhiễm và hồi phục, bao gồm thông tin nhân khẩu học, tiền sử bệnh nền, chỉ số BMI và thói quen hút thuốc, diễn tiến lâm sàng với các mốc như ngày phát hiện nhiễm, triệu chứng, mức độ nặng nhẹ, tình trạng nhập viện/ICU, hỗ trợ thở máy, cho đến kết quả điều trị, tái nhiễm và hội chứng hậu COVID.

Quy mô của bộ dữ liệu gồm 3.000 quan sát, mỗi quan sát tương ứng với một bệnh nhân, và 26 biến đặc trưng cho phép phân tích toàn diện từ khía cạnh cá nhân (tuổi, giới tính, vùng miền), lối sống (hút thuốc, BMI), đến yếu tố miễn dịch (tình trạng và loại vaccine, số liều, thời gian kể từ liều cuối)

d <- read.csv("C:/Users/ASUS/Downloads/covid_related_disease_data.csv")
str(d)
## '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  "6/21/2022" "2/2/2024" "5/28/2023" "8/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  "1/13/2025" "" "3/7/2025" "" ...
##  $ Hospital_Discharge_Date: chr  "1/26/2025" "" "4/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  "4/19/2023" "" "" "2/9/2025" ...
##  $ Reinfection            : chr  "No" "No" "No" "Yes" ...
##  $ Date_of_Reinfection    : chr  "" "" "" "8/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  "9/22/2022" "" "5/14/2024" "10/31/2024" ...
##  $ Long_COVID_Symptoms    : chr  "None" "None" "None" "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 ...
  • Các biến trong bộ dữ liệu bao gồm:
Tên biến Mô tả
Patient_ID Mã ẩn danh duy nhất của mỗi bệnh nhân
Gender Giới tính của bệnh nhân
Region Khu vực cư trú của bệnh nhân
Preexisting_Condition Các bệnh nền hoặc tình trạng y tế sẵn có trước khi nhiễm COVID-19
Smoking_Status Tình trạng hút thuốc
Occupation Nghề nghiệp hoặc lĩnh vực công tác của bệnh nhân
Date_of_Infection Ngày xét nghiệm hoặc xác nhận dương tính SARS-CoV-2
COVID_Strain Biến chủng virus
Symptoms Danh sách triệu chứng chính khi nhiễm
Severity Mức độ nặng của bệnh
Hospitalized Cho biết bệnh nhân có nhập viện hay không
Hospital_Admission_Date Ngày bệnh nhân nhập viện
Hospital_Discharge_Date Ngày bệnh nhân xuất viện
ICU_Admission Cho biết bệnh nhân có từng vào đơn vị ICU hay không
Ventilator_Support Cho biết bệnh nhân có cần hỗ trợ thở máy hay không
Recovered Cho biết bệnh nhân đã hồi phục hoàn toàn hay chưa
Date_of_Recovery Ngày xác nhận bệnh nhân hồi phục
Reinfection Cho biết bệnh nhân có bị tái nhiễm hay không
Date_of_Reinfection Ngày xác nhận tái nhiễm SARS-CoV-2
Vaccination_Status Tình trạng tiêm chủng COVID-19
Vaccine_Type Loại vaccine đã tiêm
Date_of_Last_Dose Ngày tiêm mũi vaccine cuối cùng
Long_COVID_Symptoms Các triệu chứng kéo dài sau khi khỏi bệnh
Age Tuổi của bệnh nhân tại thời điểm chẩn đoán
BMI Chỉ số khối cơ thể
Doses_Received Tổng số liều vaccine COVID-19 mà bệnh nhân đã nhận

2 PHẦN 2. PHÂN TÍCH MỘT BIẾN ĐỊNH TÍNH

Bộ dữ liệu bao gồm 16 biến định tính

dldt <- c("Gender","Region","Preexisting_Condition","Smoking_Status", "Occupation","COVID_Strain", "Symptoms","Severity","Hospitalized","ICU_Admission","Ventilator_Support","Recovered","Reinfection","Vaccination_Status","Vaccine_Type","Long_COVID_Symptoms")
dldt
##  [1] "Gender"                "Region"                "Preexisting_Condition"
##  [4] "Smoking_Status"        "Occupation"            "COVID_Strain"         
##  [7] "Symptoms"              "Severity"              "Hospitalized"         
## [10] "ICU_Admission"         "Ventilator_Support"    "Recovered"            
## [13] "Reinfection"           "Vaccination_Status"    "Vaccine_Type"         
## [16] "Long_COVID_Symptoms"
dt <- d[, dldt]
dt <- data.frame(lapply(dt, as.factor))

2.1 Biến Gender

Bảng tần số và tần suất

# Bảng tần số của biến Gender
tanso_gender <- table(dt$Gender)
print(tanso_gender)
## 
## Female   Male 
##   1527   1473
# Bảng tần suất (prop.table tự chia cho tổng số quan sát)
tansuat_gender <- prop.table(tanso_gender)
print(round(tansuat_gender, 4)*100)  # làm tròn 4 chữ số thập phân
## 
## Female   Male 
##   50.9   49.1

Biểu đồ

# Tính bảng tần số
tanso_gender <- table(dt$Gender)

# Vẽ barplot tần số
barplot(tanso_gender,
        main = "Phân phối số lượng theo Gender",
        xlab = "Giới tính",
        ylab = "Số lượng bệnh nhân",
        col  = c("steelblue", "salmon"),
        border = NA)

Nhận xét

Trong tổng số 3.000 bệnh nhân, có 1.527 người là nữ (chiếm 50,9%) và 1.473 người là nam (chiếm 49,1%). Chênh lệch giữa hai nhóm chỉ 54 người, tương ứng 1,8% về tỷ lệ, cho thấy số lượng nam và nữ trong mẫu gần như ngang nhau.

2.2 Biến Region

Bảng tần số và tần suất

# 1. Bảng tần số của biến Region
tanso_region <- table(dt$Region)
print(tanso_region)
## 
## Hovedstaden Midtjylland Nordjylland    Sjælland  Syddanmark 
##         612         628         554         609         597
# 2. Bảng tần suất (tỷ lệ) của biến Region
tansuat_region <- prop.table(tanso_region)
print(round(tansuat_region, 4)*100)       # làm tròn 4 chữ số thập phân
## 
## Hovedstaden Midtjylland Nordjylland    Sjælland  Syddanmark 
##       20.40       20.93       18.47       20.30       19.90

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Region, fill = Region)) +
  geom_bar(width = 0.6) +
  labs(title = "Tần số bệnh nhân theo Region",
       x     = "Khu vực",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(legend.position = "none")

Nhận xét

Trong 3.000 bệnh nhân, vùng Midtjylland có số ca cao nhất với 628 người (20,93%), tiếp theo là Hovedstaden 612 ca (20,40%) và Sjælland 609 ca (20,30%). Vùng Syddanmark đứng thứ tư với 597 ca (19,90%) và Nordjylland có số ca thấp nhất 554 người (18,47%). Khoảng cách giữa vùng có tỷ lệ cao nhất và thấp nhất chỉ khoảng 2,46 phần trăm, cho thấy sự phân bố bệnh nhân giữa năm khu vực tương đối đồng đều.

2.3 Biến Preexisting_Condition

Bảng tần số và tần suất

# 1. Bảng tần số của biến Preexisting_Condition
tanso_pre <- table(dt$Preexisting_Condition)
print(tanso_pre)
## 
##         Asthma Cardiovascular       Diabetes   Hypertension           None 
##            483            533            511            493            469 
##        Obesity 
##            511
# 2. Bảng tần suất (tỷ lệ) của biến Preexisting_Condition
tansuat_pre <- prop.table(tanso_pre)
print(round(tansuat_pre, 4)*100)            # tỷ lệ làm tròn 4 chữ số thập phân
## 
##         Asthma Cardiovascular       Diabetes   Hypertension           None 
##          16.10          17.77          17.03          16.43          15.63 
##        Obesity 
##          17.03

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Preexisting_Condition, fill = Preexisting_Condition)) +
  geom_bar(width = 0.7) +
  labs(title = "Tần số các bệnh nền trước khi nhiễm COVID-19",
       x     = "Bệnh nền",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

Nhận xét

Trong 3.000 bệnh nhân, nhóm có bệnh tim mạch chiếm nhiều nhất với 533 người (17,77%). Tiếp theo là hai nhóm tiểu đường và béo phì, mỗi nhóm đều có 511 người (17,03%). Nhóm tăng huyết áp đứng ở vị trí kế tiếp với 493 ca (16,43%), rồi đến nhóm hen suyễn 483 ca (16,10%). Cuối cùng, 469 bệnh nhân (15,63%) không có bất kỳ bệnh nền nào. Khoảng cách tỷ lệ giữa nhóm cao nhất và thấp nhất chỉ khoảng 2,14 phần trăm, cho thấy các loại bệnh nền được phân bố tương đối đồng đều trong mẫu.

2.4 Biến Smoking_Status

Bảng tần số và tần suất

# 1. Bảng tần số của biến Smoking_Status
tanso_smoke <- table(dt$Smoking_Status)
print(tanso_smoke)
## 
## Current  Former   Never 
##    1000     981    1019
# 2. Bảng tần suất (tỷ lệ) của biến Smoking_Status
tansuat_smoke <- prop.table(tanso_smoke)
print(round(tansuat_smoke, 4)*100)            # tỷ lệ làm tròn 4 chữ số thập phân
## 
## Current  Former   Never 
##   33.33   32.70   33.97

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Smoking_Status, fill = Smoking_Status)) +
  geom_bar(width = 0.6) +
  labs(title = "Tần số bệnh nhân theo Smoking_Status",
       x     = "Tình trạng hút thuốc",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(legend.position = "none")

Nhận xét

Trong tổng số 3.000 bệnh nhân, có 1.000 người hiện đang hút thuốc (chiếm 33,33%), 981 người từng hút (32,70%) và 1.019 người chưa từng hút (33,97%). Chênh lệch lớn nhất giữa các nhóm chỉ khoảng 1,27 phần trăm, cho thấy tỷ lệ bệnh nhân theo ba trạng thái hút thuốc phân bố khá đồng đều.

2.5 Biến Occupation

Bảng tần số và tần suất

# 1. Bảng tần số của biến Occupation
tanso_occ <- table(dt$Occupation)
print(tanso_occ)
## 
##        Driver    Healthcare Office Worker       Student       Teacher 
##           492           484           503           533           491 
##    Unemployed 
##           497
# 2. Bảng tần suất (tỷ lệ) của biến Occupation
tansuat_occ <- prop.table(tanso_occ)
print(round(tansuat_occ, 4)*100)           # tỷ lệ làm tròn 4 chữ số thập phân
## 
##        Driver    Healthcare Office Worker       Student       Teacher 
##         16.40         16.13         16.77         17.77         16.37 
##    Unemployed 
##         16.57

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Occupation, fill = Occupation)) +
  geom_bar(width = 0.7) +
  labs(title = "Tần số bệnh nhân theo Occupation",
       x     = "Nghề nghiệp",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

Nhận xét

Trong số 3.000 bệnh nhân, nhóm “Student” chiếm nhiều nhất với 533 người, tương đương 17,77%. Theo sau là “Office Worker” với 503 ca (16,77%) và “Unemployed” với 497 ca (16,57%). Ba nhóm còn lại gồm “Driver” có 492 ca (16,40%), “Teacher” 491 ca (16,37%) và “Healthcare Worker” 484 ca (16,13%). Khoảng cách giữa nhóm cao nhất và thấp nhất chỉ là 1,64 phần trăm, cho thấy các nghề nghiệp trong mẫu được phân bố tương đối đồng đều.

2.6 Biến COVID_Strain

Bảng tần số và tần suất

# 1. Bảng tần số của biến COVID_Strain
tanso_strain <- table(dt$COVID_Strain)
print(tanso_strain)
## 
##   Alpha    Beta   Delta Omicron XBB.1.5 
##     579     622     600     616     583
# 2. Bảng tần suất (tỷ lệ) của biến COVID_Strain
tansuat_strain <- prop.table(tanso_strain)
print(round(tansuat_strain, 4)*100)       # làm tròn 4 chữ số thập phân
## 
##   Alpha    Beta   Delta Omicron XBB.1.5 
##   19.30   20.73   20.00   20.53   19.43

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = COVID_Strain, fill = COVID_Strain)) +
  geom_bar(width = 0.7) +
  labs(title = "Tần số bệnh nhân theo biến COVID_Strain",
       x     = "Chủng SARS-CoV-2",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none")

Nhận xét

Trong tổng số 3.000 bệnh nhân, biến chủng Alpha chiếm 579 ca (19,30%), Beta chiếm 622 ca (20,73%), Delta chiếm 600 ca (20,00%), Omicron chiếm 616 ca (20,53%) và XBB.1.5 chiếm 583 ca (19,43%). Khoảng cách giữa nhóm cao nhất (Omicron, 20,53%) và nhóm thấp nhất (Alpha, 19,30%) chỉ là 1,23 phần trăm, cho thấy các chủng virus được ghi nhận khá đồng đều trong mẫu.

2.7 Biến Symptoms

Bảng tần số và tần suất

# 1. Bảng tần số của biến Symptoms
tanso_symptoms <- table(dt$Symptoms)
print(tanso_symptoms)
## 
##     Mild Moderate   Severe 
##     1010      978     1012
# 2. Bảng tần suất (tỷ lệ) của biến Symptoms
tansuat_symptoms <- prop.table(tanso_symptoms)
print(round(tansuat_symptoms, 4)*100)       # làm tròn 4 chữ số thập phân
## 
##     Mild Moderate   Severe 
##    33.67    32.60    33.73

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Symptoms, fill = Symptoms)) +
  geom_bar(width = 0.7) +
  labs(title = "Tần số bệnh nhân theo Symptoms",
       x     = "Triệu chứng",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )

Nhận xét

Trong tổng số 3.000 bệnh nhân, có 1.010 người (33,67%) thuộc nhóm triệu chứng nhẹ, 978 người (32,60%) ở nhóm trung bình và 1.012 người (33,73%) ở nhóm nặng. Chênh lệch giữa nhóm nhiều nhất và ít nhất chỉ khoảng 1,13 phần trăm, cho thấy mức độ biểu hiện triệu chứng được phân phối khá đồng đều.

2.8 Biến Severity

Bảng tần số và tần suất

# 1. Bảng tần số của biến Severity
tanso_severity <- table(dt$Severity)
print(tanso_severity)
## 
## Critical     High      Low Moderate 
##      711      766      732      791
# 2. Bảng tần suất (tỷ lệ) của biến Severity
tansuat_severity <- prop.table(tanso_severity)
print(round(tansuat_severity, 4)*100)            # làm tròn 4 chữ số thập phân
## 
## Critical     High      Low Moderate 
##    23.70    25.53    24.40    26.37

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Severity, fill = Severity)) +
  geom_bar(width = 0.6) +
  labs(title = "Tần số bệnh nhân theo mức độ nghiêm trọng",
       x     = "Severity",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(legend.position = "none")

Nhận xét

Trong 3.000 bệnh nhân, nhóm mức độ “Moderate” nhiều nhất với 791 ca (26,37%), tiếp theo là “High” với 766 ca (25,53%), “Low” với 732 ca (24,40%) và cuối cùng là “Critical” với 711 ca (23,70%). Khoảng cách giữa nhóm cao nhất và thấp nhất chỉ khoảng 2,67 phần trăm, cho thấy mức độ nghiêm trọng của ca bệnh phân bố tương đối đồng đều trong mẫu.

2.9 Biến Hospitalized

Bảng tần số và tần suất

# 1. Bảng tần số của biến Hospitalized
tanso_hosp <- table(dt$Hospitalized)
print(tanso_hosp)
## 
##   No  Yes 
## 2124  876
# 2. Bảng tần suất (tỷ lệ) của biến Hospitalized
tansuat_hosp <- prop.table(tanso_hosp)
print(round(tansuat_hosp, 4)*100)            # làm tròn 4 chữ số thập phân
## 
##   No  Yes 
## 70.8 29.2

Biểu đồ

# 1. Tính bảng tần số và tần suất
tanso_hosp   <- table(dt$Hospitalized)
tansuat_hosp <- prop.table(tanso_hosp)

# 2. Màu cho từng lát
cols <- c("pink", "green")

# 3. Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_hosp * 100, 1), "%")

# 4. Vẽ pie chart không nhãn ngay trên lát
pie(
  tansuat_hosp,
  labels = NA,               
  main   = "Tần suất bệnh nhân nhập viện",
  col    = cols,
  border = "white"
)

# 5. Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_hosp), nhalabels),
  fill   = cols
)

Nhận xét

Trong số 3.000 bệnh nhân, có 2.124 người (chiếm 70,8%) không phải nhập viện và 876 người (29,2%) phải nhập viện. Tỷ lệ nhập viện gần 30% cho thấy khoảng 3 trên 10 ca nhiễm COVID-19 trong mẫu này cần được điều trị tại bệnh viện.

2.10 Biến ICU_Admission

Bảng tần số và tần suất

# 1. Bảng tần số của biến ICU_Admission
tanso_icu <- table(dt$ICU_Admission)
print(tanso_icu)
## 
##   No  Yes 
## 2838  162
# 2. Bảng tần suất (tỷ lệ) của biến ICU_Admission
tansuat_icu <- prop.table(tanso_icu)
print(round(tansuat_icu, 4)*100)            # làm tròn 4 chữ số thập phân
## 
##   No  Yes 
## 94.6  5.4

Biểu đồ

# 1. Tính bảng tần số và tần suất cho biến ICU_Admission
tanso_icu   <- table(dt$ICU_Admission)
tansuat_icu <- prop.table(tanso_icu)

# 2. Màu cho từng lát (Yes / No)
cols <- c("red", "blue")

# 3. Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_icu * 100, 1), "%")

# 4. Vẽ pie chart không nhãn ngay trên lát
pie(
  tansuat_icu,
  labels = NA,
  main   = "Tần suất bệnh nhân nhập ICU",
  col    = cols,
  border = "white"
)

# 5. Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_icu), nhalabels),
  fill   = cols
)

Nhận xét

Trong số 3.000 bệnh nhân, chỉ có 162 người (5,4%) phải nhập ICU, trong khi 2.838 người (94,6%) không cần, cho thấy chỉ khoảng 1 trong 20 ca COVID-19 trong mẫu này diễn tiến nặng đến mức phải điều trị tích cực.

2.11 Ventilator_Support

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_vs <- table(dt$Ventilator_Support)
print(tanso_vs)
## 
##   No  Yes 
## 2912   88
# 2. Bảng tần suất (tỷ lệ)
tansuat_vs <- prop.table(tanso_vs)
print(round(tansuat_vs, 4)*100)  # làm tròn 4 chữ số thập phân
## 
##    No   Yes 
## 97.07  2.93

Biểu đồ

# 1. Tính bảng tần số và tần suất cho biến Ventilator_Support
tanso_vs    <- table(dt$Ventilator_Support)
tansuat_vs  <- prop.table(tanso_vs)

# 2. Màu cho từng lát (Yes / No)
cols <- c("green","yellow")

# 3. Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_vs * 100, 1), "%")

# 4. Vẽ pie chart không nhãn ngay trên lát
pie(
  tansuat_vs,
  labels = NA,
  main   = "Tần suất hỗ trợ thở máy (Ventilator_Support)",
  col    = cols,
  border = "white"
)

# 5. Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_vs), nhalabels),
  fill   = cols
)

Nhận xét

Trong tổng số 3.000 bệnh nhân, có 2.912 người (97,07%) không cần hỗ trợ thở máy, chỉ 88 người (2,93%) phải sử dụng máy thở.

2.12 Biến Recovered

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_rec <- table(dt$Recovered)
print(tanso_rec)
## 
##   No  Yes 
## 1492 1508
# 2. Bảng tần suất (tỷ lệ)
tansuat_rec <- prop.table(tanso_rec)
print(round(tansuat_rec, 4)*100)   # làm tròn 4 chữ số thập phân
## 
##    No   Yes 
## 49.73 50.27

Biểu đồ

# Màu cho từng lát (Yes / No)
cols <- c("lightblue", "orange")

# Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_rec * 100, 1), "%")

# Vẽ pie chart
pie(
  tansuat_rec,
  labels = NA,
  main   = "Tỷ lệ bệnh nhân hồi phục (Recovered)",
  col    = cols,
  border = "white"
)

# Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_rec), nhalabels),
  fill   = cols,
  bty    = "n"
)

Nhận xét

Trong số 3.000 bệnh nhân, 1.508 người (50,27%) đã phục hồi và 1.492 người (49,73%) chưa phục hồi. Tỷ lệ hồi phục nhỉnh hơn chỉ 0,54 phần trăm, cho thấy sức khỏe của những người từng nhiễm COVID-19 trong mẫu này được cải thiện ở mức gần như cân bằng.

2.13 Biến Reinfection

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_reinf <- table(dt$Reinfection)
print(tanso_reinf)
## 
##   No  Yes 
## 2715  285
# 2. Bảng tần suất (tỷ lệ)
tansuat_reinf <- prop.table(tanso_reinf)
print(round(tansuat_reinf, 4)*100)   # làm tròn 4 chữ số thập phân
## 
##   No  Yes 
## 90.5  9.5

Biểu đồ

# Màu cho từng lát (Yes / No)
cols <- c("lightblue","pink")

# Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_reinf * 100, 1), "%")

# Vẽ pie chart không nhãn ngay trên lát
pie(
  tansuat_reinf,
  labels = NA,
  main   = "Tỷ lệ tái nhiễm (Reinfection)",
  col    = cols,
  border = "white"
)

# Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_reinf), nhalabels),
  fill   = cols,
  bty    = "n"
)

Nhận xét

Trong 3.000 bệnh nhân, 285 người (9,5%) tái nhiễm COVID-19, còn lại 2.715 người (90,5%) không tái nhiễm. Điều này cho thấy tỷ lệ tái nhiễm trong mẫu vào khoảng 1 trên 10 ca.

2.14 Biến Vaccination_Status

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_vacc <- table(dt$Vaccination_Status)
print(tanso_vacc)
## 
##   No  Yes 
## 1528 1472
# 2. Bảng tần suất (tỷ lệ)
tansuat_vacc <- prop.table(tanso_vacc)
print(round(tansuat_vacc, 4)*100)   # làm tròn 4 chữ số thập phân
## 
##    No   Yes 
## 50.93 49.07

Biểu đồ

# Màu cho từng lát (Vaccinated / Unvaccinated)
cols <- c("lightpink", "purple")

# Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_vacc * 100, 1), "%")

# Vẽ pie chart không nhãn ngay trên lát
pie(
  tansuat_vacc,
  labels = NA,
  main   = "Tỷ lệ tiêm chủng (Vaccination_Status)",
  col    = cols,
  border = "white"
)

# Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_vacc), nhalabels),
  fill   = cols,
  bty    = "n"
)

Nhận xét

Trong 3.000 bệnh nhân, 1.472 người đã tiêm vắc-xin (49,1%) và 1.528 người chưa tiêm (50,9%). Chênh lệch giữa hai nhóm chỉ 1,8 phần trăm, cho thấy tỷ lệ tiêm chủng trong mẫu gần như cân bằng.

2.15 Biến Vaccine_Type

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_vtype <- table(dt$Vaccine_Type)
print(tanso_vtype)
## 
## AstraZeneca     Janssen     Moderna        None      Pfizer 
##         295         293         292        1809         311
# 2. Bảng tần suất (tỷ lệ)
tansuat_vtype <- prop.table(tanso_vtype)
print(round(tansuat_vtype, 4)*100)   # làm tròn 4 chữ số thập phân
## 
## AstraZeneca     Janssen     Moderna        None      Pfizer 
##        9.83        9.77        9.73       60.30       10.37

Biểu đồ

# 3. Chuẩn bị màu cho từng loại vaccine
cols <- rainbow(length(tanso_vtype))

# 4. Nhãn phần trăm cho legend
nhalabels <- paste0(round(tansuat_vtype * 100, 1), "%")

# 5. Vẽ pie chart không hiển thị nhãn trên lát
pie(
  tansuat_vtype,
  labels = NA,
  main   = "Tỷ lệ các loại vaccine (Vaccine_Type)",
  col    = cols,
  border = "white"
)

# 6. Thêm legend bên ngoài góc phải
legend(
  x      = "topright",
  legend = paste(names(tansuat_vtype), nhalabels),
  fill   = cols,
  cex    = 0.5,
  bty    = "n"
)

Nhận xét

Trong 3.000 bệnh nhân, 1.809 người (60,30%) chưa tiêm loại vaccine nào, chiếm đa số, trong khi các loại vaccine còn lại có số ca gần như nhau: AstraZeneca 295 ca (9,83%), Janssen 293 ca (9,77%), Moderna 292 ca (9,73%) và Pfizer 311 ca (10,37%). Sự chênh lệch giữa các loại vaccine đã tiêm (ngoại trừ “None”) chỉ dao động từ 9,73% đến 10,37%, cho thấy không có loại nào chiếm ưu thế tuyệt đối trong nhóm đã tiêm.

2.16 Biến Long_COVID_Symptoms

Bảng tần số và tần suất

# 1. Bảng tần số
tanso_long <- table(dt$Long_COVID_Symptoms)
print(tanso_long)
## 
##           Brain Fog          Chest Pain             Fatigue                None 
##                  59                  52                  62                2780 
## Shortness of Breath 
##                  47
# 2. Bảng tần suất (tỷ lệ)
tansuat_long <- prop.table(tanso_long)
print(round(tansuat_long, 4)*100)   # làm tròn 4 chữ số thập phân
## 
##           Brain Fog          Chest Pain             Fatigue                None 
##                1.97                1.73                2.07               92.67 
## Shortness of Breath 
##                1.57

Biểu đồ

library(ggplot2)

ggplot(dt, aes(x = Long_COVID_Symptoms, fill = Long_COVID_Symptoms)) +
  geom_bar(width = 0.6) +
  labs(title = "Tần số bệnh nhân theo hội chứng hậu COVID",
       x     = "Hội chứng hậu COVID (Long_COVID_Symptoms)",
       y     = "Số bệnh nhân") +
  theme_minimal() +
  theme(
    legend.position = "none",
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Nhận xét

Trong số 3.000 bệnh nhân, chỉ có 220 người (tổng các nhóm hội chứng hậu COVID) ghi nhận triệu chứng kéo dài, tương đương 7,33%, trong khi 2.780 người (92,67%) không có triệu chứng hậu COVID. Cụ thể:

  • Fatigue (mệt mỏi): 62 ca (2,07%)

  • Brain Fog (suy giảm nhận thức): 59 ca (1,97%)

  • Chest Pain (đau ngực): 52 ca (1,73%)

  • Shortness of Breath (khó thở kéo dài): 47 ca (1,57%)

Tỷ lệ các triệu chứng đều rất thấp, đều dưới 3%, với mệt mỏi là phổ biến nhất (2,07%).

3 PHẦN 3. ƯỚC LƯỢNG KHOẢNG TIN CẬY

3.1 Hospitalized (Nhập viện = “Yes”)

Giả thuyết kiểm định

  • H₀: Tỷ lệ bệnh nhân phải nhập viện trong dân số là 50 % (p = 0.5).

  • H₁: Tỷ lệ bệnh nhân phải nhập viện khác 50 % (p ≠ 0.5).

n_hosp      <- sum(dt$Hospitalized == "Yes")
n_total     <- nrow(dt)
ci_hosp     <- prop.test(n_hosp, n_total, conf.level = 0.95, correct = FALSE)
print(ci_hosp)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_hosp out of n_total, null probability 0.5
## X-squared = 519.17, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.2760039 0.3085281
## sample estimates:
##     p 
## 0.292

Nhận xét

  • Thống kê kiểm định: \(X^2=519.17\) , df=1

  • p-value < 2.2 × 10⁻¹⁶.

  • Khoảng tin cậy 95 % cho p: [0.2760, 0.3085] (27.60 % – 30.85 %).

Với mức ý nghĩa α = 0.05 và p-value rất nhỏ (< 2.2 × 10⁻¹⁶), bác bỏ H₀. Điều này có nghĩa tỷ lệ nhập viện thực sự không phải 50 % mà xấp xỉ 29.2 %, và với 95 % độ tin cậy, tỷ lệ này nằm trong khoảng [27.6 %, 30.9 %]. Kết quả cho thấy tỷ lệ nhập viện trong mẫu có sự khác biệt rõ rệt so với giả thiết 50 %.

3.2 ICU_Admission (Nhập ICU = “Yes”)

Giả thuyết kiểm định

  • H₀:Tỷ lệ bệnh nhân phải nhập ICU trong dân số là 50 % (p = 0.5).

  • H₁:Tỷ lệ bệnh nhân phải nhập ICU khác 50 % (p ≠ 0.5).

n_icu       <- sum(dt$ICU_Admission == "Yes")
ci_icu      <- prop.test(n_icu, n_total, conf.level = 0.95, correct = FALSE)
print(ci_icu)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_icu out of n_total, null probability 0.5
## X-squared = 2387, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.04646765 0.06267308
## sample estimates:
##     p 
## 0.054

Nhận xét

  • Thống kê kiểm định: \(X^2=2387\) , df=1

  • p-value < 2.2 × 10⁻¹⁶.

  • Khoảng tin cậy 95 % cho p: [0.0465, 0.0627] (4.65 % – 6.27 %).

Với mức ý nghĩa α = 0.05 và p-value rất nhỏ (< 2.2 × 10⁻¹⁶), bác bỏ H₀. Điều này chứng tỏ tỷ lệ nhập ICU thực sự không phải 50 % mà chỉ khoảng 5.4 %, và với 95 % độ tin cậy, tỷ lệ này nằm trong khoảng [4.65 %, 6.27 %]. Kết quả phản ánh rõ ràng sự khác biệt có ý nghĩa giữa tỷ lệ quan sát và giá trị giả thuyết 50 %.

3.3 Reinfection (Tái nhiễm = “Yes”)

Giả thuyết kiểm định

  • H₀: Tỷ lệ bệnh nhân tái nhiễm trong dân số là 50 % (p = 0.5).

  • H₁: Tỷ lệ bệnh nhân tái nhiễm khác 50 % (p ≠ 0.5).

n_reinf     <- sum(dt$Reinfection == "Yes")
ci_reinf    <- prop.test(n_reinf, n_total, conf.level = 0.95, correct = FALSE)
print(ci_reinf)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_reinf out of n_total, null probability 0.5
## X-squared = 1968.3, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.08501949 0.10601638
## sample estimates:
##     p 
## 0.095

Nhận xét

  • Thống kê kiểm định: \(X^2=1968.3\) , df=1

  • p-value < 2.2 × 10⁻¹⁶.

  • Khoảng tin cậy 95 % cho p: [0.0850, 0.1060] (8.50 % – 10.60 %).

Với mức ý nghĩa α = 0.05 và p-value rất nhỏ (< 2.2 × 10⁻¹⁶, bác bỏ H₀. Điều này chứng tỏ tỷ lệ tái nhiễm thực sự không bằng 50 % mà chỉ khoảng 9.5 %, và với 95 % độ tin cậy, tỷ lệ này nằm trong khoảng [8.50 %, 10.60 %]. Kết quả cho thấy tỷ lệ tái nhiễm trong mẫu khác biệt rất rõ rệt so với giả thiết 50 %.

3.4 Ventilator_Support (Hỗ trợ thở máy = “Yes”)

Giả thuyết kiểm định

  • H₀: Tỷ lệ bệnh nhân phải hỗ trợ thở máy trong dân số là 50 % (p = 0.5).

  • H₁: Tỷ lệ bệnh nhân phải hỗ trợ thở máy khác 50 % (p ≠ 0.5).

n_vent      <- sum(dt$Ventilator_Support == "Yes")
ci_vent     <- prop.test(n_vent, n_total, conf.level = 0.95, correct = FALSE)
print(ci_vent)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_vent out of n_total, null probability 0.5
## X-squared = 2658.3, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.02387102 0.03599947
## sample estimates:
##          p 
## 0.02933333

Nhận xét

  • Thống kê kiểm định: \(X^2=2658.3\) , df=1

  • p-value < 2.2 × 10⁻¹⁶.

  • Khoảng tin cậy 95 % cho p: [0.02387, 0.03599] (2.39 % – 3.60 %).

Với mức ý nghĩa α=0.05 và p-value cực kỳ nhỏ (< 2.2 × 10⁻¹⁶), bác bỏ H₀. Điều này có nghĩa tỷ lệ bệnh nhân cần hỗ trợ thở máy thực sự không phải 50 % mà chỉ khoảng 2.93 %, và với 95 % độ tin cậy, tỷ lệ này nằm trong khoảng [2.39 %, 3.60 %]. Kết quả cho thấy tỷ lệ hỗ trợ thở máy trong mẫu rất khác biệt so với giả thiết 50 %.

3.5 Vaccination_Status (Đã tiêm = “Yes”)

Giả thuyết kiểm định

  • H₀: Tỷ lệ bệnh nhân đã tiêm trong dân số là 50 % (p = 0.5).

  • H₁: Tỷ lệ bệnh nhân đã tiêm khác 50 % (p ≠ 0.5).

n_vac       <- sum(dt$Vaccination_Status == "Yes")
ci_vac      <- prop.test(n_vac, n_total, conf.level = 0.95, correct = FALSE)
print(ci_vac)
## 
##  1-sample proportions test without continuity correction
## 
## data:  n_vac out of n_total, null probability 0.5
## X-squared = 1.0453, df = 1, p-value = 0.3066
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4728012 0.5085560
## sample estimates:
##         p 
## 0.4906667

Nhận xét

  • Thống kê kiểm định: \(X^2=1.0453\) , df=1

  • p-value = 0.3066.

  • Khoảng tin cậy 95 % cho p: [0.4728, 0.5086] (47.28 % – 50.86 %).

Với mức ý nghĩa α=0.05 và p-value = 0.3066 > 0.05, ta không đủ cơ sở để bác bỏ H₀. Điều này có nghĩa tỷ lệ bệnh nhân đã tiêm vắc-xin trong dân số không khác biệt có ý nghĩa so với 50 %; với 95 % độ tin cậy, tỷ lệ này nằm trong khoảng [47.3 %, 50.9 %].

4 PHẦN 4. PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

Chọn biến HospitalizedReinfection làm biến phụ thuộc để phân tích các yếu tố ảnh hưởng đến việc bệnh nhân có phải nhập viện và có bị tái nhiễm COVID-19 hay không.

# Đảm bảo R dùng UTF-8
options(encoding = "UTF-8")
Sys.setlocale("LC_CTYPE", "en_US.UTF-8")  # hoặc "Vietnamese_Vietnam.1258" trên Windows
## [1] "en_US.UTF-8"

4.1 Hospitalized và Vaccination_Status

4.1.1 Bảng tần số và tần suất

# Gán nhãn rõ ràng cho hai biến
dt$Hospitalized <- factor(dt$Hospitalized,
                          levels = c("No", "Yes"),
                          labels = c("Chưa nhập viện", "Nhập viện"))
dt$Vaccination_Status <- factor(dt$Vaccination_Status,
                                levels = c("No", "Yes"),
                                labels = c("Chưa tiêm", "Đã tiêm"))

# Lập bảng tần số chéo giữa Hospitalized và Vaccination_Status
hv_tab <- table(dt$Hospitalized, dt$Vaccination_Status)

# Thêm tổng hàng và tổng cột
hv_tab1 <- addmargins(hv_tab)

# Hiển thị bảng với nhãn rõ ràng
print(hv_tab1)
##                 
##                  Chưa tiêm Đã tiêm  Sum
##   Chưa nhập viện      1088    1036 2124
##   Nhập viện            440     436  876
##   Sum                 1528    1472 3000
# Bảng tần suất theo hàng (trong mỗi nhóm Hospitalized)
hv_prop <- prop.table(hv_tab, margin = 1)
hv_prop_rounded <- round(hv_prop, 4)
print(hv_prop_rounded)
##                 
##                  Chưa tiêm Đã tiêm
##   Chưa nhập viện    0.5122  0.4878
##   Nhập viện         0.5023  0.4977

Đồ thị

# Chuyển bảng tần số sang dạng data frame
hv_df <- as.data.frame(hv_tab)
colnames(hv_df) <- c("Hospitalized", "Vaccination_Status", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(hv_df, aes(x = Vaccination_Status, y = Count, fill = Hospitalized)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân nhập viện theo tình trạng tiêm vắc xin",
    x     = "Tình trạng tiêm chủng",
    y     = "Số bệnh nhân",
    fill  = "Tình trạng nhập viện"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Chưa nhập viện" = "lightblue",  # xanh dương
    "Nhập viện"       = "lightpink"   # cam
  ))

Nhận xét

Trong mẫu 3.000 bệnh nhân, có 1.528 người chưa tiêm vắc-xin và 1.472 người đã tiêm. Trong nhóm chưa tiêm, 440 ca (28,8 %) phải nhập viện và 1.088 ca (71,2 %) không nhập viện. Ngược lại, nhóm đã tiêm ghi nhận 436 ca nhập viện (29,6 %) và 1.036 ca không nhập viện (70,4 %). Như vậy, nhóm chưa tiêm có nhiều ca nhập viện hơn 4 ca.

4.1.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng nhập viện và tình trạng tiêm chủng là hai biến độc lập.

  • H₁:Có mối liên hệ giữa tình trạng nhập viện và tình trạng tiêm chủng.

# Thực hiện kiểm định Chi bình phương
chi_hv <- chisq.test(hv_tab)
print(chi_hv)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  hv_tab
## X-squared = 0.20785, df = 1, p-value = 0.6485

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 0.20785

  • Bậc tự do (df) = 1

  • p-value = 0.6485

Với α = 0.05, p-value (0.6485) > 0.05, không đủ cơ sở để bác bỏ H₀. Nói cách khác, trong mẫu dữ liệu này, không có mối liên hệ có ý nghĩa thống kê giữa việc tiêm vắc-xin và khả năng phải nhập viện.

Vậy trong mẫu gồm 3.000 bệnh nhân này, tỷ lệ nhập viện ở nhóm chưa tiêm (440/1.528 = 28,8 %) và nhóm đã tiêm (436/1.472 = 29,6 %) không khác biệt một cách có ý nghĩa thống kê. Sự chênh lệch dưới 1 % cho thấy việc tiêm vắc-xin không ảnh hưởng rõ rệt đến khả năng phải nhập viện tại bệnh viện trong dữ liệu hiện tại.

4.1.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định:

  • H₀: p₁ − p₂ = 0 (Tỷ lệ nhập viện ở nhóm chưa tiêm bằng tỷ lệ nhập viện ở nhóm đã tiêm)

  • H₁: p₁ − p₂ ≠ 0 (Có sự khác biệt về tỷ lệ nhập viện giữa hai nhóm)

# Số ca "Nhập viện" trong từng nhóm tiêm chủng
counts_hv <- c(hv_tab["Nhập viện", "Chưa tiêm"],
               hv_tab["Nhập viện", "Đã tiêm"])

# Tổng số bệnh nhân mỗi nhóm
totals_hv <- c(sum(hv_tab[, "Chưa tiêm"]),
               sum(hv_tab[, "Đã tiêm"]))

# Kiểm định hiệu hai tỷ lệ
rd_test_hv <- prop.test(counts_hv, totals_hv, correct = FALSE)
print(rd_test_hv)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_hv out of totals_hv
## X-squared = 0.24609, df = 1, p-value = 0.6198
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.04078750  0.02431243
## sample estimates:
##    prop 1    prop 2 
## 0.2879581 0.2961957

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 0.24609

  • Bậc tự do (df) = 1

  • p-value = 0.6198

  • Khoảng tin cậy 95% cho p₂ − p₁: [–0.04079, 0.02431]

  • Ước lượng tỷ lệ: p₁ = 0.28796 (nhóm chưa tiêm), p₂ = 0.29620 (nhóm đã tiêm)

  • Hiệu tỷ lệ p₂ − p₁ ≈ 0.00824 (khoảng 0,8%)

Với α = 0.05 và p-value = 0.6198 > 0.05 cùng khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Điều này có nghĩa là hiệu chênh tỷ lệ nhập viện (khoảng 0,8%) giữa nhóm đã tiêm và nhóm chưa tiêm không có ý nghĩa thống kê. Nói cách khác, trong mẫu 3.000 bệnh nhân này, tình trạng tiêm vắc-xin không ảnh hưởng rõ rệt đến khả năng phải nhập viện.

4.1.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về đã tiêm vaccin ở nhóm chưa nhập viện và nhập viện).

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Có sự khác biệt về đã tiêm vaccin ở nhóm chưa nhập viện và nhập viện).

library(epitools)

rr_hv <- riskratio(hv_tab, method = "wald")
print(rr_hv)
## $data
##                 
##                  Chưa tiêm Đã tiêm Total
##   Chưa nhập viện      1088    1036  2124
##   Nhập viện            440     436   876
##   Total               1528    1472  3000
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate     lower    upper
##   Chưa nhập viện 1.000000        NA       NA
##   Nhập viện      1.020416 0.9424064 1.104882
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.6200843    0.6299791   0.619844
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

  • Ước lượng Tỷ số Nguy cơ (RR) là 1.0204.

  • Khoảng tin cậy 95% của RR: [0.9424, 1.1049], bao gồm giá trị 1.

  • p-value = 0.6208 > α (0.05).

Vì p-value lớn hơn 0.05 và khoảng tin cậy chứa 1, chúng ta không đủ cơ sở để bác bỏ giả thuyết H₀.Vậy Không có sự khác biệt về đã tiêm vaccin ở nhóm chưa nhập viện và nhập viện

4.1.5 Tỷ số Chênh (Odds Ratio - OR):

H₀: Không có sự chênh lệch odds nhập viện giữa hai nhóm

# Tính Odds Ratio
or_hv <- oddsratio(hv_tab)
print(or_hv)
## $data
##                 
##                  Chưa tiêm Đã tiêm Total
##   Chưa nhập viện      1088    1036  2124
##   Nhập viện            440     436   876
##   Total               1528    1472  3000
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate     lower    upper
##   Chưa nhập viện 1.000000        NA       NA
##   Nhập viện      1.040632 0.8889857 1.218148
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.6200843    0.6299791   0.619844
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Nhập viện” ở nhóm đã tiêm so với nhóm chưa tiêm là 1.0406, cho thấy xu hướng odds nhập viện ở nhóm đã tiêm cao hơn khoảng 4.1%.

  • Khoảng tin cậy 95% cho OR: [0.8889, 1.2181], bao gồm giá trị 1.

  • p-value ≈ 0.6201 > 0.05.

Với α = 0.05, p-value = 0.6201 > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này chỉ ra trong mẫu 3.000 bệnh nhân, odds phải nhập viện không khác biệt có ý nghĩa thống kê giữa nhóm đã tiêm và nhóm chưa tiêm.

4.2 Hospitalized và Recovered

4.2.1 Bảng tần số và tần suất

# Gán nhãn rõ ràng cho hai biến
dt$Recovered <- factor(
  dt$Recovered,
  levels = c("No", "Yes"),
  labels = c("Chưa hồi phục", "Hồi phục")
)

# Lập bảng tần số chéo
hr_tab2  <- table(dt$Hospitalized, dt$Recovered)
hr_tab2a <- addmargins(hr_tab2)
print(hr_tab2a)
##                 
##                  Chưa hồi phục Hồi phục  Sum
##   Chưa nhập viện          1050     1074 2124
##   Nhập viện                442      434  876
##   Sum                     1492     1508 3000
# Bảng tần suất theo hàng (trong mỗi nhóm Hospitalized)
hr_prop2         <- prop.table(hr_tab2, margin = 1)
hr_prop2_rounded <- round(hr_prop2, 4)
print(hr_prop2_rounded)
##                 
##                  Chưa hồi phục Hồi phục
##   Chưa nhập viện        0.4944   0.5056
##   Nhập viện             0.5046   0.4954

Đồ thị

# Chuyển bảng tần số sang dạng data frame
hr_df2 <- as.data.frame(hr_tab2)
colnames(hr_df2) <- c("Hospitalized", "Recovered", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(hr_df2, aes(x = Recovered, y = Count, fill = Hospitalized)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân nhập viện theo tình trạng hồi phục",
    x     = "Tình trạng hồi phục",
    y     = "Số bệnh nhân",
    fill  = "Tình trạng nhập viện"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Chưa nhập viện" = "steelblue",
    "Nhập viện"       = "salmon"
  ))

Nhận xét

Trong số 3.000 bệnh nhân, có 1.508 người đã hồi phục và 1.492 người vẫn chưa hồi phục. Xét nhóm không nhập viện (2.124 ca), 1.074 người (50,56 %) đã hồi phục và 1.050 người (49,44 %) chưa hồi phục. Ngược lại, trong 876 ca phải nhập viện, chỉ có 434 người (49,54 %) hồi phục và 442 người (50,46 %) chưa hồi phục. Như vậy, dù nhóm không nhập viện có số ca hồi phục cao hơn (1.074 so với 434), tỷ lệ hồi phục giữa hai nhóm cũng rất gần nhau, chỉ chênh lệch khoảng 1 phần trăm, cho thấy việc nhập viện không dẫn đến khác biệt lớn về khả năng hồi phục trong mẫu này.

4.2.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng nhập viện và khả năng hồi phục là hai biến độc lập.

  • H₁:Có mối liên hệ giữa nhập viện và hồi phục.

chi_hr2 <- chisq.test(hr_tab2)
print(chi_hr2)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  hr_tab2
## X-squared = 0.21967, df = 1, p-value = 0.6393

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 0.21967

  • Bậc tự do (df) = 1

  • p-value = 0.6393

Với α = 0.05, p-value (0.6393) > 0.05, không đủ cơ sở để bác bỏ H₀.Vậy tình trạng nhập viện và khả năng hồi phục là hai biến độc lập.

Nói cách khác, trong mẫu 3.000 bệnh nhân này, tỷ lệ hồi phục ở nhóm không nhập viện (1.074/2.124 ≈ 50,6 %) và nhóm nhập viện (434/876 ≈ 49,5 %) không khác biệt một cách có ý nghĩa thống kê. Sự chênh lệch chỉ khoảng 1,1 % cho thấy việc phải nhập viện không ảnh hưởng rõ rệt đến khả năng hồi phục của bệnh nhân.

4.2.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định

  • H₀: p₁ − p₂ = 0 (Tỷ lệ hồi phục ở nhóm chưa nhập viện bằng tỷ lệ hồi phục ở nhóm nhập viện)

  • H₁: p₁ − p₂ ≠ 0 (Có sự khác biệt về tỷ lệ hồi phục giữa hai nhóm)

# Số ca "Hồi phục" trong mỗi nhóm Hospitalized
counts_hr2 <- c(
  hr_tab2["Chưa nhập viện", "Hồi phục"],
  hr_tab2["Nhập viện",       "Hồi phục"]
)

# Tổng số bệnh nhân mỗi nhóm
totals_hr2 <- c(
  sum(hr_tab2["Chưa nhập viện", ]),
  sum(hr_tab2["Nhập viện",       ])
)

# Kiểm định hiệu hai tỷ lệ
rd_test_hr2 <- prop.test(counts_hr2, totals_hr2, correct = FALSE)
print(rd_test_hr2)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_hr2 out of totals_hr2
## X-squared = 0.25892, df = 1, p-value = 0.6109
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.02913260  0.04956446
## sample estimates:
##    prop 1    prop 2 
## 0.5056497 0.4954338

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 0.25892

  • Bậc tự do (df) = 1

  • p-value = 0.6109

  • Khoảng tin cậy 95% cho p₂ − p₁: [-0.02913, 0.04956]

  • Ước lượng tỷ lệ: p₁ = 0.50565 (nhóm chưa tiêm), p₂ = 0.49543 (nhóm đã tiêm)

  • Hiệu tỷ lệ p₂ − p₁ ≈-0.01021 (khoảng -1,0%)

Với α = 0.05, p-value (0.6109) > 0.05 và khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Nói cách khác, hiệu chênh tỷ lệ hồi phục giữa nhóm chưa nhập viện và nhóm nhập viện (khoảng 1,0%) không có ý nghĩa thống kê. Điều này cho thấy trong mẫu 3.000 bệnh nhân, việc phải nhập viện không ảnh hưởng rõ rệt đến khả năng hồi phục.

4.2.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về khả năng hồi phục giữa nhóm chưa nhập viện và nhóm nhập viện.)

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Có sự khác biệt về khả năng hồi phục giữa hai nhóm.)

library(epitools)

rr_hr2 <- riskratio(hr_tab2, method = "wald")
print(rr_hr2)
## $data
##                 
##                  Chưa hồi phục Hồi phục Total
##   Chưa nhập viện          1050     1074  2124
##   Nhập viện                442      434   876
##   Total                   1492     1508  3000
## 
## $measure
##                 risk ratio with 95% C.I.
##                   estimate     lower    upper
##   Chưa nhập viện 1.0000000        NA       NA
##   Nhập viện      0.9797964 0.9054098 1.060295
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.6111487    0.6299499  0.6108632
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

  • Ước lượng Tỷ số Nguy cơ (RR) của nhóm nhập viện so với nhóm chưa nhập viện là 0.9798.

  • Khoảng tin cậy 95% của RR: [0.9055, 1.0603], bao gồm giá trị 1.

  • p-value = 0.6111 > 0.05.

Vì p-value lớn hơn 0.05 và khoảng tin cậy chứa 1, chúng ta không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, khả năng hồi phục không khác biệt có ý nghĩa thống kê giữa những người đã nhập viện và những người không nhập viện.

4.2.5 Tỷ số Chênh (Odds Ratio - OR):

or_hr2 <- oddsratio(hr_tab2)
print(or_hr2)
## $data
##                 
##                  Chưa hồi phục Hồi phục Total
##   Chưa nhập viện          1050     1074  2124
##   Nhập viện                442      434   876
##   Total                   1492     1508  3000
## 
## $measure
##                 odds ratio with 95% C.I.
##                   estimate     lower    upper
##   Chưa nhập viện 1.0000000        NA       NA
##   Nhập viện      0.9599776 0.8200695 1.123696
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.6111487    0.6299499  0.6108632
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Hồi phục” ở nhóm nhập viện so với nhóm chưa nhập viện là 0.95998, cho thấy xu hướng odds hồi phục ở nhóm nhập viện thấp hơn khoảng 4.0%.

  • Khoảng tin cậy 95% cho OR: [0.8201, 1.1237], bao gồm giá trị 1.

  • p-value ≈ 0.6111 > 0.05.

Với α = 0.05, vì p-value = 0.6111 > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, odds hồi phục không khác biệt có ý nghĩa thống kê giữa những người đã nhập viện và chưa nhập viện.

4.3 Hospitalized và Gender

4.3.1 Bảng tần số và tần suất

dt$Gender <- factor(
  dt$Gender,
  levels = c("Male", "Female"),
  labels = c("Nam", "Nữ")
)

# Lập bảng tần số chéo giữa Hospitalized và Gender
hg_tab  <- table(dt$Hospitalized, dt$Gender)

# Thêm tổng hàng và tổng cột
hg_tab1 <- addmargins(hg_tab)

# Hiển thị bảng với nhãn rõ ràng
print(hg_tab1)
##                 
##                   Nam   Nữ  Sum
##   Chưa nhập viện 1034 1090 2124
##   Nhập viện       439  437  876
##   Sum            1473 1527 3000
# Bảng tần suất theo hàng (trong mỗi nhóm Hospitalized)
hg_prop         <- prop.table(hg_tab, margin = 1)
hg_prop_rounded <- round(hg_prop, 4)
print(hg_prop_rounded)
##                 
##                     Nam     Nữ
##   Chưa nhập viện 0.4868 0.5132
##   Nhập viện      0.5011 0.4989

Đồ thị

# Chuyển bảng tần số sang dạng data frame
hg_df <- as.data.frame(hg_tab)
colnames(hg_df) <- c("Hospitalized", "Gender", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(hg_df, aes(x = Gender, y = Count, fill = Hospitalized)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân nhập viện theo tình trạng giới tính",
    x     = "Giới tính",
    y     = "Số bệnh nhân",
    fill  = "Tình trạng nhập viện"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Chưa nhập viện" = "red",
    "Nhập viện"       = "green"
  ))

Nhận xét

Trong 1.473 bệnh nhân nam, có 439 ca (29,8 %) phải nhập viện và 1.034 ca (70,2 %) không nhập viện; trong 1.527 bệnh nhân nữ, có 437 ca (28,6 %) nhập viện và 1.090 ca (71,4 %) không nhập viện. Như vậy, tỷ lệ nhập viện ở nhóm nam cao hơn nhóm nữ khoảng 1,2 phần trăm, nhưng sự chênh lệch rất nhỏ, cho thấy về giới tính không có khác biệt đáng kể trong nguy cơ phải nhập viện.

4.3.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng nhập viện và giới tính là hai biến độc lập.

  • H₁:Có mối liên hệ giữa tình trạng nhập viện và giới tính.

# Thực hiện kiểm định Chi bình phương
chi_hg <- chisq.test(hg_tab)
print(chi_hg)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  hg_tab
## X-squared = 0.45349, df = 1, p-value = 0.5007

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 0.45349

  • Bậc tự do (df) = 1

  • p-value = 0.5007

Với α = 0.05, p-value (0.5007) > 0.05, không đủ cơ sở để bác bỏ H₀.Vậy tình trạng nhập viện và giới tính là hai biến độc lập.

Nói cách khác, trong mẫu 3.000 bệnh nhân này, tỷ lệ nhập viện giữa nam (439/1.473 ≈ 29,8 %) và nữ (437/1.527 ≈ 28,6 %) không chênh lệch một cách có ý nghĩa thống kê. Sự khác biệt dưới 1,2 % cho thấy giới tính không ảnh hưởng rõ rệt đến khả năng phải nhập viện.

4.3.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định

  • H₀: p₁ − p₂ = 0 (Tỷ lệ nhập viện ở nam bằng tỷ lệ nhập viện ở nữ)

  • H₁: p₁ − p₂ ≠ 0 (Có khác biệt về tỷ lệ nhập viện giữa nam và nữ)

# Số ca "Nhập viện" trong từng nhóm giới tính
counts_hg <- c(
  hg_tab["Nhập viện", "Nam"],
  hg_tab["Nhập viện", "Nữ"]
)

# Tổng số bệnh nhân mỗi nhóm
totals_hg <- c(
  sum(hg_tab[, "Nam"]),
  sum(hg_tab[, "Nữ"])
)

# Kiểm định hiệu hai tỷ lệ
rd_test_hg <- prop.test(counts_hg, totals_hg, correct = FALSE)
print(rd_test_hg)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_hg out of totals_hg
## X-squared = 0.50919, df = 1, p-value = 0.4755
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.02070092  0.04439926
## sample estimates:
##    prop 1    prop 2 
## 0.2980312 0.2861821

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 0.50919

  • Bậc tự do (df) = 1

  • p-value = 0.4755

  • Khoảng tin cậy 95% cho p₁ − p₂: [−0.02071, 0.04440]

  • Ước lượng tỷ lệ: p₁ = 0.29803 (nam), p₂ = 0.28618 (nữ)

  • Hiệu tỷ lệ p₁ − p₂ ≈ 0.01185 (khoảng +1,19%)

Với α = 0.05, p-value (0.4755) > 0.05 và khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Nói cách khác, mức chênh khoảng 1,19% giữa tỷ lệ nhập viện ở nam và nữ không có ý nghĩa thống kê. Điều này cho thấy trong mẫu dữ liệu 3.000 bệnh nhân, giới tính không ảnh hưởng rõ rệt đến khả năng phải nhập viện.

4.3.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về giới tính nữ giữa nhóm chưa nhập viện và nhóm nhập viện.)

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Có sự khác biệt về giới tính nữ giữa nhóm chưa nhập viện và nhóm nhập viện.)

library(epitools)

rr_hg <- riskratio(hg_tab, method = "wald")
print(rr_hg)
## $data
##                 
##                   Nam   Nữ Total
##   Chưa nhập viện 1034 1090  2124
##   Nhập viện       439  437   876
##   Total          1473 1527  3000
## 
## $measure
##                 risk ratio with 95% C.I.
##                   estimate     lower    upper
##   Chưa nhập viện 1.0000000        NA       NA
##   Nhập viện      0.9720875 0.8989336 1.051195
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.4758258    0.4948054  0.4754894
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

  • Ước lượng Tỷ số Nguy cơ (RR) của nhóm “Nhập viện” (so với nhóm “Chưa nhập viện”) giữa nam và nữ là 0.9721.

  • Khoảng tin cậy 95% của RR: [0.8989, 1.0512], bao gồm giá trị 1.

  • p-value ≈ 0.4759 > 0.05.

Vì p-value lớn hơn 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀.Vậy không có sự khác biệt về giới tính nữ giữa nhóm chưa nhập viện và nhóm nhập viện.

4.3.5 Tỷ số Chênh (Odds Ratio - OR):

# Tính Odds Ratio
or_hg <- oddsratio(hg_tab)
print(or_hg)
## $data
##                 
##                   Nam   Nữ Total
##   Chưa nhập viện 1034 1090  2124
##   Nhập viện       439  437   876
##   Total          1473 1527  3000
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate     lower   upper
##   Chưa nhập viện 1.000000        NA      NA
##   Nhập viện      0.944335 0.8066945 1.10539
## 
## $p.value
##                 two-sided
##                  midp.exact fisher.exact chi.square
##   Chưa nhập viện         NA           NA         NA
##   Nhập viện       0.4758258    0.4948054  0.4754894
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Nhập viện” ở nhóm Nữ so với nhóm Nam là 0.9443, tức odds nhập viện ở nữ thấp hơn khoảng 5.6%.

  • Khoảng tin cậy 95% cho OR: [0.8067, 1.1054], bao gồm giá trị 1.

  • p-value ≈ 0.4753 > 0.05.

Với α = 0.05, vì p-value = 0.4753 lớn hơn 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, odds phải nhập viện không khác biệt có ý nghĩa thống kê giữa Nam và Nữ.

4.4 Reinfection và Vaccination_Status

4.4.1 Bảng tần số và tần suất

# 1. Gán nhãn rõ ràng cho hai biến
dt$Reinfection <- factor(dt$Reinfection,
                         levels = c("No", "Yes"),
                         labels = c("Không tái nhiễm", "Tái nhiễm"))

# 2. Lập bảng tần số chéo
rv_tab  <- table(dt$Reinfection, dt$Vaccination_Status)
rv_tab1 <- addmargins(rv_tab)
print(rv_tab1)
##                  
##                   Chưa tiêm Đã tiêm  Sum
##   Không tái nhiễm      1398    1317 2715
##   Tái nhiễm             130     155  285
##   Sum                  1528    1472 3000
# 3. Bảng tần suất theo hàng (trong mỗi nhóm Reinfection)
rv_prop         <- prop.table(rv_tab, margin = 1)
rv_prop_rounded <- round(rv_prop, 4)
print(rv_prop_rounded)
##                  
##                   Chưa tiêm Đã tiêm
##   Không tái nhiễm    0.5149  0.4851
##   Tái nhiễm          0.4561  0.5439

Đồ thị

# Chuyển bảng tần số sang dạng data frame
rv_df <- as.data.frame(rv_tab)
colnames(rv_df) <- c("Reinfection", "Vaccination_Status", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(rv_df, aes(x = Vaccination_Status, y = Count, fill = Reinfection)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân tái nhiễm theo tình trạng tiêm vắc xin",
    x     = "Tình trạng tiêm chủng",
    y     = "Số bệnh nhân",
    fill  = "Tái nhiễm"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Không tái nhiễm" = "orange",
    "Tái nhiễm"       = "purple"
  ))

Nhận xét

Trong tổng số 285 ca tái nhiễm, có 155 người đã tiêm vắc-xin (chiếm 54,39% các ca tái nhiễm) và 130 người chưa tiêm (45,61%). Ngược lại, trong 2.715 bệnh nhân không tái nhiễm, 1.317 người đã tiêm (48,51%) và 1.398 người chưa tiêm (51,49%). Khi tính tỷ lệ tái nhiễm trong mỗi nhóm, 155/1.472 (10,53%) bệnh nhân đã tiêm tái nhiễm, so với 130/1.528 (8,51%) ở nhóm chưa tiêm. Như vậy, tỷ lệ tái nhiễm ở nhóm đã tiêm cao hơn khoảng 2 phần trăm so với nhóm chưa tiêm, cho thấy trong mẫu này những người đã tiêm vắc-xin có xu hướng tái nhiễm hơi cao hơn.

4.4.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng tái nhiễm và tình trạng tiêm chủng là hai biến độc lập.

  • H₁:Có mối liên hệ giữa tình trạng tái nhiễm và tình trạng tiêm chủng.

# Thực hiện kiểm định Chi bình phương
chi_rv <- chisq.test(rv_tab)
print(chi_rv)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rv_tab
## X-squared = 3.3342, df = 1, p-value = 0.06786

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 3.3342

  • Bậc tự do (df) = 1

  • p-value = 0.06786

Với α = 0.05, p-value (0.06786) > 0.05, không đủ cơ sở để bác bỏ H₀.Vậy tình trạng tái nhiễm và tình trạng tiêm chủng là hai biến độc lập.

Nói cách khác, trong mẫu 3.000 bệnh nhân, tỷ lệ tái nhiễm ở nhóm chưa tiêm (130/1.528 ≈ 8,51 %) và nhóm đã tiêm (155/1.472 ≈ 10,53 %) không khác biệt có ý nghĩa thống kê. Mặc dù nhóm đã tiêm có tỷ lệ tái nhiễm cao hơn khoảng 2 % so với nhóm chưa tiêm, sự chênh lệch này không đủ lớn để khẳng định có mối liên hệ rõ ràng giữa tiêm chủng và nguy cơ tái nhiễm.

4.4.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định

  • H₀: p₁ − p₂ = 0 (Tỷ lệ tái nhiễm ở nhóm chưa tiêm bằng tỷ lệ tái nhiễm ở nhóm đã tiêm)

  • H₁: p₁ − p₂ ≠ 0 (Có sự khác biệt về tỷ lệ tái nhiễm giữa hai nhóm)

# Số ca "Tái nhiễm" trong mỗi nhóm tiêm chủng
counts_rv <- c(
  rv_tab["Tái nhiễm", "Chưa tiêm"],
  rv_tab["Tái nhiễm", "Đã tiêm"]
)

# Tổng số bệnh nhân mỗi nhóm
totals_rv <- c(
  sum(rv_tab[ , "Chưa tiêm"]),
  sum(rv_tab[ , "Đã tiêm"])
)

# Kiểm định hiệu hai tỷ lệ
rd_test_rv <- prop.test(counts_rv, totals_rv, correct = FALSE)
print(rd_test_rv)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_rv out of totals_rv
## X-squared = 3.5655, df = 1, p-value = 0.05899
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.0412335877  0.0007928297
## sample estimates:
##     prop 1     prop 2 
## 0.08507853 0.10529891

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 3.5655

  • Bậc tự do (df) = 1

  • p-value = 0.05899

  • Khoảng tin cậy 95% cho p₂ − p₁: [−0.04124, 0.00079]

  • Ước lượng tỷ lệ: p₁ = 0.08508 (nhóm chưa tiêm), p₂ = 0.10530 (nhóm đã tiêm)

  • Hiệu tỷ lệ p₂ − p₁ ≈ 0.02022 (khoảng +2,02%)

Với α = 0.05, p-value (0.05899) > 0.05 và khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Mặc dù tỷ lệ tái nhiễm ở nhóm đã tiêm cao hơn nhóm chưa tiêm khoảng 2,02%, sự khác biệt này không có ý nghĩa thống kê trong mẫu dữ liệu hiện tại.

4.4.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về đã tiêm vaccin ở nhóm không tái nhiễm và nhóm tái nhiễm)

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Không có sự khác biệt về đã tiêm vaccin ở nhóm không tái nhiễm và nhóm tái nhiễm)

library(epitools)

rr_rv <- riskratio(rv_tab, method = "wald")
print(rr_rv)
## $data
##                  
##                   Chưa tiêm Đã tiêm Total
##   Không tái nhiễm      1398    1317  2715
##   Tái nhiễm             130     155   285
##   Total                1528    1472  3000
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate    lower    upper
##   Không tái nhiễm 1.000000       NA       NA
##   Tái nhiễm       1.121169 1.001205 1.255505
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm       0.05943728   0.06179783 0.05899318
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

  • Ước lượng Tỷ số Nguy cơ (RR) là 1.1212.

  • Khoảng tin cậy 95% của RR: [1.0012, 1.2555], hoàn toàn nằm trên 1.

  • p-value ≈ 0.0594 > 0.05.

với p-value = 0.0594 > 0.05 chưa đủ cơ sở để bác bỏ H₀ ở mức ý nghĩa 5%. Vậy không có sự khác biệt về đã tiêm vaccin ở nhóm không tái nhiễm và nhóm tái nhiễm

4.4.5 Tỷ số Chênh (Odds Ratio - OR):

# Tính Odds Ratio
or_rv <- oddsratio(rv_tab)
print(or_rv)
## $data
##                  
##                   Chưa tiêm Đã tiêm Total
##   Không tái nhiễm      1398    1317  2715
##   Tái nhiễm             130     155   285
##   Total                1528    1472  3000
## 
## $measure
##                  odds ratio with 95% C.I.
##                   estimate     lower    upper
##   Không tái nhiễm 1.000000        NA       NA
##   Tái nhiễm       1.265329 0.9906896 1.618385
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm       0.05943728   0.06179783 0.05899318
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Tái nhiễm” ở nhóm đã tiêm so với nhóm chưa tiêm là 1.2653, nghĩa là odds tái nhiễm ở nhóm đã tiêm cao hơn khoảng 26.5%.

  • Khoảng tin cậy 95% cho OR: [0.9907, 1.6184], bao gồm giá trị 1.

  • p-value ≈ 0.05944 > 0.05.

Với α = 0.05, do p-value = 0.05944 > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, việc đã tiêm vắc-xin không liên quan có ý nghĩa thống kê đến odds tái nhiễm COVID-19.

4.5 Reinfection và Gender

4.5.1 Bảng tần số và tần suất

# 2. Lập bảng tần số chéo
rg_tab  <- table(dt$Reinfection, dt$Gender)
rg_tab1 <- addmargins(rg_tab)
print(rg_tab1)
##                  
##                    Nam   Nữ  Sum
##   Không tái nhiễm 1341 1374 2715
##   Tái nhiễm        132  153  285
##   Sum             1473 1527 3000
# 3. Bảng tần suất theo hàng (trong mỗi nhóm Reinfection)
rg_prop         <- prop.table(rg_tab, margin = 1)
rg_prop_rounded <- round(rg_prop, 4)
print(rg_prop_rounded)
##                  
##                      Nam     Nữ
##   Không tái nhiễm 0.4939 0.5061
##   Tái nhiễm       0.4632 0.5368

Đồ thị

# Chuyển bảng tần số sang dạng data frame
rg_df <- as.data.frame(rg_tab)
colnames(rg_df) <- c("Reinfection", "Gender", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(rg_df, aes(x = Gender, y = Count, fill = Reinfection)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân tái nhiễm theo giới tính",
    x     = "Giới tính",
    y     = "Số bệnh nhân",
    fill  = "Tái nhiễm"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Không tái nhiễm" = "pink",
    "Tái nhiễm"       = "green"
  ))

Nhận xét

Trong 1.473 bệnh nhân nam, có 132 ca tái nhiễm (8,97%) và 1.341 ca không tái nhiễm (91,03%). Trong 1.527 bệnh nhân nữ, có 153 ca tái nhiễm (10,02%) và 1.374 ca không tái nhiễm (89,98%). Như vậy, tỷ lệ tái nhiễm ở nữ cao hơn nam khoảng 1,05 phần trăm, cho thấy phụ nữ trong mẫu này có xu hướng tái nhiễm nhẹ hơn so với nam giới.

4.5.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng tái nhiễm và giới tính là độc lập.

  • H₁:Có mối liên hệ giữa tái nhiễm và giới tính.

# Thực hiện kiểm định Chi bình phương
chi_rg <- chisq.test(rg_tab)
print(chi_rg)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rg_tab
## X-squared = 0.85757, df = 1, p-value = 0.3544

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 0.85757

  • Bậc tự do (df) = 1

  • p-value = 0.3544

Với α = 0.05, p-value (0.3544) > 0.05, không đủ cơ sở để bác bỏ H₀.Vậy tình trạng tái nhiễm và giới tính là độc lập.

Nói cách khác, trong mẫu 3.000 bệnh nhân này, tỷ lệ tái nhiễm ở nam (132/1.473 ≈ 8,97 %) và nữ (153/1.527 ≈ 10,02 %) không khác biệt một cách có ý nghĩa thống kê. Sự chênh lệch khoảng 1,05 % là khá nhỏ, cho thấy giới tính không ảnh hưởng rõ rệt đến nguy cơ tái nhiễm.

4.5.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định

  • H₀: p₁ − p₂ = 0 (Tỷ lệ tái nhiễm ở nam bằng tỷ lệ tái nhiễm ở nữ)

  • H₁: p₁ − p₂ ≠ 0 (Có khác biệt về tỷ lệ tái nhiễm giữa nam và nữ)

# Số ca "Tái nhiễm" theo giới tính
counts_rg <- c(
  rg_tab["Tái nhiễm", "Nam"],
  rg_tab["Tái nhiễm", "Nữ"]
)

# Tổng số bệnh nhân mỗi giới tính
totals_rg <- c(
  sum(rg_tab[ , "Nam"]),
  sum(rg_tab[ , "Nữ"])
)

# Kiểm định hiệu hai tỷ lệ
rd_test_rg <- prop.test(counts_rg, totals_rg, correct = FALSE)
print(rd_test_rg)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_rg out of totals_rg
## X-squared = 0.97679, df = 1, p-value = 0.323
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.03154930  0.01038244
## sample estimates:
##     prop 1     prop 2 
## 0.08961303 0.10019646

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 0.97679

  • Bậc tự do (df) = 1

  • p-value = 0.3230

  • Khoảng tin cậy 95% cho p₁ − p₂: [−0.03155, 0.01038]

  • Ước lượng tỷ lệ: p₁ = 0.08961 (nam), p₂ = 0.10020 (nữ)

  • Hiệu tỷ lệ p₁ − p₂ ≈ −0.01059 (khoảng −1,06%)

Với α = 0.05, p-value (0.3230) > 0.05 và khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Điều này có nghĩa là tỷ lệ tái nhiễm giữa nam và nữ trong mẫu dữ liệu này không khác biệt một cách có ý nghĩa thống kê.

4.5.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về giới tính nữ ở nhóm không tái nhiễm và nhóm tái nhiễm)

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Có sự khác biệt về giới tính nữ ở nhóm không tái nhiễm và nhóm tái nhiễm)

library(epitools)

rr_rg <- riskratio(rg_tab, method = "wald")
print(rr_rg)
## $data
##                  
##                    Nam   Nữ Total
##   Không tái nhiễm 1341 1374  2715
##   Tái nhiễm        132  153   285
##   Total           1473 1527  3000
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate     lower    upper
##   Không tái nhiễm 1.000000        NA       NA
##   Tái nhiễm       1.060791 0.9464421 1.188955
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm        0.3239372     0.350262  0.3229926
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

NHận xét

  • Ước lượng Tỷ số Nguy cơ (RR) của nhóm “Tái nhiễm” ở nữ so với nam là 1.0608, cho thấy xu hướng tỷ lệ tái nhiễm ở nữ cao hơn khoảng 6 % so với nam.

  • Khoảng tin cậy 95 % của RR: [0.9464, 1.1889], bao gồm giá trị 1.

  • p-value ≈ 0.3239 > 0.05.

Với mức ý nghĩa α = 0.05, p-value = 0.3239 lớn hơn 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀.Vậy không có sự khác biệt về giới tính nữ ở nhóm không tái nhiễm và nhóm tái nhiễm

4.5.5 Tỷ số Chênh (Odds Ratio - OR):

# Tính Odds Ratio
or_rg <- oddsratio(rg_tab)
print(or_rg)
## $data
##                  
##                    Nam   Nữ Total
##   Không tái nhiễm 1341 1374  2715
##   Tái nhiễm        132  153   285
##   Total           1473 1527  3000
## 
## $measure
##                  odds ratio with 95% C.I.
##                   estimate     lower   upper
##   Không tái nhiễm  1.00000        NA      NA
##   Tái nhiễm        1.13103 0.8856823 1.44609
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm        0.3239372     0.350262  0.3229926
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Tái nhiễm” ở nhóm nữ so với nhóm nam là 1.1310, nghĩa là odds tái nhiễm ở nữ cao hơn khoảng 13.1%.

  • Khoảng tin cậy 95% cho OR: [0.8856, 1.4461], bao gồm giá trị 1.

  • p-value ≈ 0.3239 > 0.05.

Với α = 0.05, do p-value (0.3239) > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, giới tính không có mối liên hệ có ý nghĩa thống kê với odds tái nhiễm COVID-19.

4.6 Reinfection và Smoking_Status

4.6.1 Bảng tần số và tần suất

dt$Smoker <- factor(
  ifelse(dt$Smoking_Status == "Current", "Có hút thuốc", "Không hút thuốc"),
  levels = c("Không hút thuốc", "Có hút thuốc")
)

# 2. Lập bảng tần số chéo
rs_tab <- table(dt$Reinfection, dt$Smoker)
rs_tab1 <- addmargins(rs_tab)
print(rs_tab1)
##                  
##                   Không hút thuốc Có hút thuốc  Sum
##   Không tái nhiễm            1802          913 2715
##   Tái nhiễm                   198           87  285
##   Sum                        2000         1000 3000
# 3. Bảng tần suất theo hàng (trong mỗi nhóm Reinfection)
rs_prop         <- prop.table(rs_tab, margin = 1)
rs_prop_rounded <- round(rs_prop, 4)
print(rs_prop_rounded)
##                  
##                   Không hút thuốc Có hút thuốc
##   Không tái nhiễm          0.6637       0.3363
##   Tái nhiễm                0.6947       0.3053

Đồ thị

# Chuyển bảng tần số sang dạng data frame
rs_df <- as.data.frame(rs_tab)
colnames(rs_df) <- c("Reinfection", "Smoking_Status", "Count")

# Vẽ biểu đồ cột nhóm
library(ggplot2)

ggplot(rs_df, aes(x = Smoking_Status, y = Count, fill = Reinfection)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  labs(
    title = "Số bệnh nhân tái nhiễm theo tình trạng hút thuốc",
    x     = "Tình trạng hút thuốc",
    y     = "Số bệnh nhân",
    fill  = "Tái nhiễm"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c(
    "Không tái nhiễm" = "lightblue",
    "Tái nhiễm"       = "orange"
  ))

Nhận xét

Trong 2.000 bệnh nhân không hút thuốc, có 198 ca tái nhiễm (9,9 %) và 1.802 ca không tái nhiễm (90,1 %). Ngược lại, trong 1.000 bệnh nhân có hút thuốc, chỉ có 87 ca tái nhiễm (8,7 %) và 913 ca không tái nhiễm (91,3 %). Tỷ lệ tái nhiễm ở nhóm không hút thuốc (198/2.000 = 9,9 %) cao hơn nhóm có hút thuốc (87/1.000 = 8,7 %) khoảng 1,2 phần trăm. Như vậy, trong mẫu này, người không hút thuốc có xu hướng tái nhiễm COVID-19 nhỉnh hơn so với người đang hút thuốc.

4.6.2 Kiểm định Thống kê

Giả thuyết kiểm định:

  • H₀:Tình trạng tái nhiễm và việc hút thuốc là hai biến độc lập.

  • H₁:Có mối liên hệ giữa tái nhiễm và việc hút thuốc.

# Thực hiện kiểm định Chi bình phương
chi_rs <- chisq.test(rs_tab)
print(chi_rs)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rs_tab
## X-squared = 0.98139, df = 1, p-value = 0.3219

Nhận xét

  • Giá trị thống kê Chi bình phương: X² = 0.98139

  • Bậc tự do (df) = 1

  • p-value = 0.3219

Với α = 0.05, p-value (0.3219) > 0.05, không đủ cơ sở để bác bỏ H₀.Vậy tình trạng tái nhiễm và việc hút thuốc là hai biến độc lập.

Nói cách khác, trong mẫu 3.000 bệnh nhân này, tỷ lệ tái nhiễm ở nhóm không hút thuốc (198/2.000 ≈ 9,9 %) và nhóm có hút thuốc (87/1.000 ≈ 8,7 %) không khác biệt có ý nghĩa thống kê. Sự chênh lệch khoảng 1,2 % khá nhỏ, cho thấy việc hút thuốc không ảnh hưởng rõ rệt đến nguy cơ tái nhiễm COVID-19.

4.6.3 Hiệu tỷ lệ (Risk Difference - RD)

Giả thuyết kiểm định

  • H₀: p₁ − p₂ = 0 (Tỷ lệ tái nhiễm ở nhóm không hút thuốc bằng tỷ lệ tái nhiễm ở nhóm có hút thuốc)

  • H₁: p₁ − p₂ ≠ 0 (Có khác biệt về tỷ lệ tái nhiễm giữa hai nhóm)

# Số ca "Tái nhiễm" trong nhóm Không hút thuốc và Có hút thuốc
counts_rs <- c(
  rs_tab["Tái nhiễm", "Không hút thuốc"],
  rs_tab["Tái nhiễm", "Có hút thuốc"]
)
totals_rs <- c(
  sum(rs_tab[ , "Không hút thuốc"]),
  sum(rs_tab[ , "Có hút thuốc"])
)

rd_test_rs <- prop.test(counts_rs, totals_rs, correct = FALSE)
print(rd_test_rs)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_rs out of totals_rs
## X-squared = 1.1166, df = 1, p-value = 0.2907
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.009827919  0.033827919
## sample estimates:
## prop 1 prop 2 
##  0.099  0.087

Nhận xét

  • Giá trị thống kê Chi-bình phương: X² = 1.1166

  • Bậc tự do (df) = 1

  • p-value = 0.2907

  • Khoảng tin cậy 95% cho p₁ − p₂: [−0.00983, 0.03383]

  • Ước lượng tỷ lệ: p₁ = 0.099 (nhóm không hút thuốc), p₂ = 0.087 (nhóm có hút thuốc)

  • Hiệu tỷ lệ p₁ − p₂ ≈ 0.012 (khoảng +1,2%)

Với α = 0.05, p-value (0.2907) > 0.05 và khoảng tin cậy bao gồm 0, chúng ta không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, tỷ lệ tái nhiễm không khác biệt có ý nghĩa giữa những người hút thuốc và không hút thuốc.

4.6.4 Rủi ro tương đối (Relative Risk - RR):

Giả thuyết kiểm định

  • H₀: Tỷ số nguy cơ (RR) = 1 (Không có sự khác biệt về có hút thuốc ở nhóm không tái nhiễm và nhóm tái nhiễm.)

  • H₁: Tỷ số nguy cơ (RR) ≠ 1 (Có sự khác biệt về có hút thuốc ở nhóm không tái nhiễm và nhóm tái nhiễm.)

library(epitools)

rr_rs <- riskratio(rs_tab, method = "wald")
print(rr_rs)
## $data
##                  
##                   Không hút thuốc Có hút thuốc Total
##   Không tái nhiễm            1802          913  2715
##   Tái nhiễm                   198           87   285
##   Total                      2000         1000  3000
## 
## $measure
##                  risk ratio with 95% C.I.
##                   estimate     lower    upper
##   Không tái nhiễm 1.000000        NA       NA
##   Tái nhiễm       0.907765 0.7560001 1.089996
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm        0.2913579    0.3218342   0.290651
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

  • Ước lượng Tỷ số Nguy cơ (RR) là 0.907765

  • Khoảng tin cậy 95 % của RR: [0.7560, 1.0899], bao gồm giá trị 1.

  • p-value ≈ 0.2914 > 0.05.

Với α = 0.05, p-value = 0.2914 > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀.VậykKhông có sự khác biệt về có hút thuốc ở nhóm không tái nhiễm và nhóm tái nhiễm

4.6.5 Tỷ số Chênh (Odds Ratio - OR):

# Tính Odds Ratio
or_rs <- oddsratio(rs_tab)
print(or_rs)
## $data
##                  
##                   Không hút thuốc Có hút thuốc Total
##   Không tái nhiễm            1802          913  2715
##   Tái nhiễm                   198           87   285
##   Total                      2000         1000  3000
## 
## $measure
##                  odds ratio with 95% C.I.
##                    estimate     lower    upper
##   Không tái nhiễm 1.0000000        NA       NA
##   Tái nhiễm       0.8681157 0.6635586 1.127251
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   Không tái nhiễm         NA           NA         NA
##   Tái nhiễm        0.2913579    0.3218342   0.290651
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

  • Ước lượng Odds Ratio (OR) cho “Tái nhiễm” ở nhóm có hút thuốc so với nhóm không hút thuốc là 0.8688, nghĩa là odds tái nhiễm ở nhóm có hút thuốc thấp hơn khoảng 13.1%.

  • Khoảng tin cậy 95% cho OR: [0.6636, 1.1273], bao gồm giá trị 1.

  • p-value ≈ 0.2914 > 0.05.

Với α = 0.05, do p-value (0.2914) > 0.05 và khoảng tin cậy chứa 1, không đủ cơ sở để bác bỏ H₀. Điều này cho thấy trong mẫu 3.000 bệnh nhân, việc có hút thuốc hay không không ảnh hưởng có ý nghĩa thống kê đến odds tái nhiễm COVID-19.

5 PHẦN 5. PHƯƠNG PHÁP ƯỚC LƯỢNG MAXIMUM LIKELIHOOD (MLE)

5.1 Mục đích và ý tưởng cơ bản

  • Vấn đề đặt ra: Khi có dữ liệu thực tế, chúng ta muốn tìm tham số \(\theta\) của mô hình sao cho mô hình đó giải thích dữ liệu tốt nhất.

  • Ý tưởng cốt lõi: Chọn \(\theta\) để xác suất mà mô hình tạo ra đúng dữ liệu quan sát được là lớn nhất.

    • Cho mẫu dữ liệu \(X=(x_1, x_2, \dots, x_n)\) giả sử i.i.d.
    • Hàm mật độ (hoặc xác suất) của mỗi điểm \(x_i\)\(f(x_i\mid\theta)\).
    • Kết hợp từng quan sát, độ hợp lý (likelihood) của toàn mẫu là tích: \[ L(\theta; X) = \prod_{i=1}^n f(x_i\mid \theta). \]
    • Ta tìm \(\hat\theta\) sao cho \(L(\theta;X)\) đạt giá trị tối đa.

5.2 Hàm log-likelihood và tại sao cần dùng

  • Tính tích nhiều giá trị có thể dẫn đến số quá nhỏ/khó tính đạo hàm. Do đó, ta chuyển tích thành tổng bằng log:

    \[ \ell(\theta) = \log L(\theta; X) = \sum_{i=1}^n \log f(x_i\mid \theta). \]

  • Việc tối đa hóa \(L(\theta)\) tương đương tối đa \(\ell(\theta)\), nhưng với \(\ell\) ta dễ dàng:

    • Tính đạo hàm: \(\frac{\partial \ell}{\partial \theta}\).
    • Giải \(\frac{\partial \ell}{\partial \theta} = 0\) để tìm nghiệm.

5.3 Quy trình thực hiện MLE

  1. Chọn phân phối phù hợp với bản chất dữ liệu (ví dụ Normal, Bernoulli, Poisson, v.v.).
  2. Xây dựng hàm log-likelihood \(\ell(\theta)\).
  3. Tính đạo hàm \(\nabla_\theta \ell(\theta)\).
  4. Giải phương trình \(\nabla_\theta \ell(\theta) = 0\) để tìm \(\hat\theta\).
  5. Kiểm tra Hessian (ma trận đạo hàm bậc hai) tại \(\hat\theta\) phải âm xác định để đảm bảo điểm cực đại.

5.4 Một số công thức tổng quát

  • Với tham số đơn \(\theta\), nghiệm phải thỏa mãn: \[ \frac{d}{d\theta} \ell(\theta) = 0. \]

  • Với vector tham số \(\theta=(\theta_1,\dots,\theta_p)\), giải hệ: \[ \frac{\partial \ell}{\partial \theta_j} = 0, \quad j=1,\dots,p. \]

  • Kiểm tra Hessian: \[ H(\theta) = \frac{\partial^2 \ell}{\partial \theta \partial \theta^T}, \] tại \(\hat\theta\): nếu \(H(\hat\theta)\) là âm xác định, \(\hat\theta\) là cực đại.

5.5 Ví dụ minh họa

5.5.1 Bernoulli (tham số \(p\))

  • Log-likelihood: \[ \ell(p) = \sum_{i=1}^n \bigl[x_i\ln p + (1-x_i)\ln(1-p)\bigr]. \]
  • Đạo hàm: \[ \frac{d\ell}{dp} = \frac{\sum x_i}{p} - \frac{n-\sum x_i}{1-p} = 0. \]
  • Nghiệm: \[ \hat p = \frac{1}{n}\sum_{i=1}^n x_i. \]

5.5.2 Poisson (tham số \(\lambda\))

  • Log-likelihood: \[ \ell(\lambda) = -n\lambda + \Bigl(\sum_{i=1}^n x_i\Bigr)\ln \lambda - \sum_{i=1}^n \ln(x_i!). \]
  • Đạo hàm: \[ \frac{d\ell}{d\lambda} = -n + \frac{\sum x_i}{\lambda} = 0. \]
  • Nghiệm: \[ \hat \lambda = \frac{1}{n}\sum_{i=1}^n x_i. \]

5.5.3 Categorical (tham số \(\theta=(\theta_1,\dots,\theta_K)\))

  • Log-likelihood: \[ \ell(\theta) = \sum_{k=1}^K n_k \ln \theta_k, \] với \(n_k\) là số quan sát loại \(k\).
  • Nghiệm (thêm ràng buộc \(\sum_k \theta_k=1\)): \[ \hat \theta_k = \frac{n_k}{n}. \]

5.6 Tính chất quan trọng

  • Không chệch (asymptotic unbiased): \(E[\hat\theta]\to\theta\) khi \(n\to\infty\).
  • Hiệu quả (asymptotic efficient): Đạt cận Cramér–Rao.
  • Phân phối xấp xỉ chuẩn: \[ \sqrt{n}(\hat\theta-\theta) \xrightarrow{d} N\bigl(0, I(\theta)^{-1}\bigr), \] với \(I(\theta)=-E[\nabla^2_\theta \ell(\theta)]\).