I. HỆ THỐNG KIẾN THỨC NỀN TẢNG (THEORETICAL FRAMEWORK)

1. Giải phẫu các quy luật phân phối (Distributions)

Trong Y học, dữ liệu mang trong mình “hình dáng” của tạo hóa. Bước T (Type of Variables) trong mô hình PDTR bắt buộc chúng ta phải chẩn đoán đúng hình dáng này trước khi “phẫu thuật”.

  • Phân phối Chuẩn (Normal Distribution): Là hình ảnh lý tưởng nhất với đồ thị hình quả chuông đối xứng. Các chỉ số như Chiều cao, Huyết áp tâm thu ở quần thể khỏe mạnh thường tuân theo quy luật này. Đặc điểm: Mean ≈ Median. Báo cáo bằng: Mean (SD).
  • Phân phối Lệch (Skewed Distribution): Thường gặp là lệch phải (Positive Skew). Ví dụ: Nồng độ Triglycerides, Men gan (ALT/AST), hoặc Thời gian nằm viện. Lúc này, một vài bệnh nhân có chỉ số cực cao (Outliers) sẽ kéo số Trung bình (Mean) lên rất cao, khiến nó không còn đại diện cho đám đông. Báo cáo bằng: Median [IQR].
  • Phép màu Logarit: Khi dữ liệu lệch phải, ta dùng hàm log10() để “nén” các giá trị cực lớn lại, đưa phân phối về dạng chuẩn. Đây là kỹ thuật giúp bác sĩ sử dụng được các kiểm định tham số mạnh mẽ (Parametric tests).

2. Triết lý P-value và “Cái bẫy” Ý nghĩa thống kê

  • Giả thuyết Không (H0): Là gã bảo thủ luôn nói: “Không có sự khác biệt nào giữa 2 nhóm”.
  • Trị số P (P-value): Là xác suất chúng ta thấy được sự khác biệt như hiện tại NẾU H0 là đúng. Nếu P < 0.05, xác suất “ăn may” quá thấp, ta bác bỏ H0.
  • Khoảng tin cậy 95% (95% CI): P-value chỉ trả lời “Có hay Không”, còn 95% CI trả lời “Khác biệt bao nhiêu và có ý nghĩa lâm sàng hay không”. Một kết quả có P < 0.05 nhưng CI chứa những giá trị quá nhỏ thì có thể không có giá trị điều trị thực tế.

3. Vũ khí kiểm định theo mô hình PDTR

Dựa vào mối quan hệ (Relationship) và Loại biến (Type), ta chọn vũ khí:

  • So sánh 2 Trung bình (Dữ liệu Chuẩn): Student’s T-test.
  • So sánh 2 Thứ hạng (Dữ liệu Lệch): Wilcoxon Rank-Sum test.
  • So sánh Tỷ lệ (Biến phân loại): Chi-square (X2). Nếu có ô kỳ vọng < 5, dùng Fisher’s Exact test.
  • Tương quan (2 biến liên tục): Pearson (Chuẩn) hoặc Spearman (Lệch).

II. BÀI TẬP THỰC CHIẾN (CASE STUDY: PROJECT CARDIO)

Mục tiêu: Đánh giá nguy cơ tim mạch nền.
Dữ liệu: File Day3_Cardio.csv gồm 500 hồ sơ bệnh nhân.

BÀI 1: KHỞI TẠO VÀ KHÁM PHÁ DỮ LIỆU

Yêu cầu: Nhập dữ liệu và kiểm tra các giá trị khuyết (NA).

# Nhập dữ liệu
df <- read.csv("Day3_Cardio.csv")

# Kiểm tra số lượng NA cho từng biến
colSums(is.na(df))
##              ID             Age          Gender       Height_cm       Weight_kg 
##               0               0               0               0               0 
##         Smoking     Coffee_Cups Knowledge_Score   Triglycerides     Systolic_BP 
##               0               0               0              25               0

[Trả lời]:

  • Dựa trên kết quả kiểm tra khuyết dữ liệu bằng hàm colSums => xác định được các biến đang có giá trị NA. Theo tiêu chuẩn (Q1) => không được tự ý dùng số Trung bình (Mean) để điền vào các ô khuyết này.

  • Vì:

    • Nếu biến số đó có phân phối lệch (như Triglycerides), số Mean không phản ánh đúng giá trị trung tâm.

    • Việc điền Mean tùy tiện sẽ làm giảm phương sai thực sự của dữ liệu, dễ dẫn đến sai lầm loại I khi chạy các kiểm định thống kê sau này.


BÀI 2: CHẨN ĐOÁN “SỨC KHỎE” BIẾN SỐ

Yêu cầu: Vẽ Histogram và Q-Q Plot cho Knowledge_ScoreTriglycerides. Thêm đường Mean màu đỏ.

# Chẩn đoán biến Knowledge_Score
par(mfrow=c(1,2))
hist(df$Knowledge_Score, main="Histogram: Knowledge Score", col="#A9CCE3", xlab="Score")
abline(v = mean(df$Knowledge_Score, na.rm=TRUE), col="red", lwd=2)

qqnorm(df$Knowledge_Score, main="Q-Q Plot: Knowledge Score")
qqline(df$Knowledge_Score, col="red", lwd=2)

# Chẩn đoán biến Triglycerides
par(mfrow=c(1,2))
hist(df$Triglycerides, main="Histogram: Triglycerides", col="#A2D9CE", xlab="Triglycerides (mmol/L)")
abline(v = mean(df$Triglycerides, na.rm=TRUE), col="red", lwd=2)

qqnorm(df$Triglycerides, main="Q-Q Plot: Triglycerides")
qqline(df$Triglycerides, col="red", lwd=2)

[Trả lời]:

  • Quan sát đồ thị Q-Q Plot, ta thấy các chấm đen của biến Triglycerides văng ra khỏi đường thẳng rất xa ở phần đuôi đồ thị.

  • Kết hợp với Histogram lệch hẳn sang phải

    => biến Triglycerides không tuân theo phân phối chuẩn.

  • Biến Knowledge_Score có các điểm dữ liệu bám sát đường Q-Q line hơn, thể hiện một phân phối ~ chuẩn.


BÀI 3: PHẪU THUẬT DỮ LIỆU LỆCH

Yêu cầu: Dùng phép biến đổi Logarit cơ số 10 cho Triglycerides. Vẽ lại Q-Q plot.

# Phẫu thuật bằng Log10
df <- df %>%
  mutate(Log_Triglycerides = log10(Triglycerides))

# Vẽ lại Q-Q Plot sau phẫu thuật
qqnorm(df$Log_Triglycerides, main="Q-Q Plot: Log10(Triglycerides)")
qqline(df$Log_Triglycerides, col="blue", lwd=2)

[Trả lời]:

  • Sau khi sửa bằng Log, các điểm outliers đã được nén lại, giúp các chấm đen co cụm và bám sát đường chuẩn trên Q-Q Plot.

    => Dữ liệu lúc này đã ổn định phương sai và đạt dạng phân phối xấp xỉ chuẩn (Log-normal).

    => Do đó, biến mới này đã đủ điều kiện để chạy các kiểm định tham số mạnh mẽ như T-test hoặc ANOVA.


BÀI 4: SO SÁNH TRUNG BÌNH (T-TEST)

Yêu cầu: So sánh Điểm kiến thức (Knowledge_Score) giữa Nam và Nữ.

# Kiểm định T-test so sánh điểm kiến thức theo giới tính
t.test(Knowledge_Score ~ Gender, data = df)
## 
##  Welch Two Sample t-test
## 
## data:  Knowledge_Score by Gender
## t = 0.32143, df = 490.44, p-value = 0.748
## alternative hypothesis: true difference in means between group Female and group Male is not equal to 0
## 95 percent confidence interval:
##  -1.789442  2.489442
## sample estimates:
## mean in group Female   mean in group Male 
##                64.39                64.04

[Trả lời]:

  • Dựa vào kết quả T-test, nếu Khoảng tin cậy 95% của sự chênh lệch chứa giá trị 0 (~ P-value > 0.05) => không có sự khác biệt có ý nghĩa thống kê về mặt kiến thức giữa hai giới.

  • Về ý nghĩa thực tế, mức chênh lệch điểm số là quá nhỏ. Do đó, sự khác biệt này không đủ lớn để phải thiết kế và tốn kém nguồn lực cho một chương trình giáo dục sức khỏe riêng biệt cho từng giới tính => nên xd chương trình chung cho 2 giới.


BÀI 5: KIỂM ĐỊNH TỶ LỆ (CHI-SQUARE)

Yêu cầu: Tìm mối liên quan giữa Giới tính và hành vi Hút thuốc (Smoking).

# Lập bảng chéo tần suất
table_smoke <- table(df$Gender, df$Smoking)
print(table_smoke)
##         
##           No Yes
##   Female 264   6
##   Male   152  78
# Kiểm định Chi-square
chisq.test(table_smoke)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table_smoke
## X-squared = 86.986, df = 1, p-value < 2.2e-16

[Trả lời]:

  • Mặc dù giá trị P < 0.05 kết luận rằng giới tính có liên quan đến hành vi hút thuốc, nhưng “cái bẫy” của thống kê là chỉ nhìn vào P.

    • Nhìn vào bảng tần suất, ta thấy tỷ lệ Nam giới hút thuốc cao gấp nhiều lần so với Nữ giới.

    =>Ý nghĩa LS: Các chiến dịch truyền thông cai thuốc lá và tầm soát bệnh lý tim mạch cần tập trung vào đối tượng Nam giới để tối ưu hóa hiệu quả y tế.


BÀI 6: BẪY TƯƠNG QUAN VS SO SÁNH NHÓM (PDTR)

Yêu cầu: Kiểm định mối liên hệ giữa BMI và Triglycerides.

# 1. Tính toán biến BMI từ Chiều cao và Cân nặng
df <- df %>%
  mutate(BMI = Weight_kg / (Height_cm / 100)^2)

# 2. Chạy kiểm định tương quan Spearman
cor.test(df$BMI, df$Triglycerides, method = "spearman")
## 
##  Spearman's rank correlation rho
## 
## data:  df$BMI and df$Triglycerides
## S = 16826091, p-value = 0.2071
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## 0.05798988

[Trả lời]: - Vì BMI và Triglycerides đều là hai biến định lượng (liên tục)

-> để đánh giá mối liên hệ giữa chúng, ta **bắt buộc phải dùng Kiểm định Tương quan**

=> Hai giải pháp thực hiện:

* Cách 1: Giữ nguyên bản chất dữ liệu liên tục và chạy kiểm định tương quan Spearman (vì Triglycerides bị lệch) để tìm hệ số r, xem BMI tăng thì Triglycerides tăng theo chiều hướng nào.

* Cách 2: Ép kiểu biến BMI thành biến phân loại (Bình thường, Thừa cân, Béo phì), sau đó sử dụng kiểm định phi tham số Kruskal-Wallis để so sánh trung vị Triglycerides giữa 3 nhóm BMI này.


BÀI 7: ĐÓNG GÓI TABLE 1 (CHUẨN QUỐC TẾ)

Yêu cầu: Sử dụng gtsummary tạo Bảng 1 phân tầng theo Smoking.

# Đóng gói Table 1 theo chuẩn SAMPL
df %>%
  select(Gender, Age, BMI, Knowledge_Score, Triglycerides, Smoking) %>%
  tbl_summary(
    by = Smoking,
    statistic = list(
      all_continuous() ~ "{mean} ({sd})",
      Triglycerides ~ "{median} [{p25}, {p75}]" # Báo cáo Median [IQR] cho biến lệch
    ),
    missing = "no"
  ) %>%
  add_p() %>%
  bold_labels() %>%
  modify_caption("**Table 1: Baseline Characteristics and Cardiovascular Risk Profile stratified by Smoking Status**")
Table 1: Baseline Characteristics and Cardiovascular Risk Profile stratified by Smoking Status
Characteristic No
N = 416
1
Yes
N = 84
1
p-value2
Gender

<0.001
    Female 264 (63%) 6 (7.1%)
    Male 152 (37%) 78 (93%)
Age 55 (10) 57 (11) 0.2
BMI 24.4 (4.7) 24.7 (4.5) 0.5
Knowledge_Score 64 (12) 65 (12) 0.5
Triglycerides 1.44 [1.12, 1.89] 1.52 [1.03, 2.01] >0.9
1 n (%); Mean (SD); Median [Q1, Q3]
2 Pearson’s Chi-squared test; Wilcoxon rank sum test

[Trả lời]:

1. Tổng cộng có 500 bệnh nhân được đưa vào phân tích đặc điểm nền, với sự khác biệt rõ rệt về đặc điểm lâm sàng dựa trên tình trạng hút thuốc.

2. Không có sự khác biệt có ý nghĩa thống kê về Điểm kiến thức (Knowledge Score) nền giữa nhóm hút thuốc và không hút thuốc, cho thấy mức độ nhận thức nền tảng của hai nhóm là tương đồng nhau.

3. Tuy nhiên, các bệnh nhân trong nhóm hút thuốc có mức trung vị Triglycerides và chỉ số khối cơ thể (BMI) cao hơn đáng kể so với nhóm không hút thuốc (P < 0.05). Điều này làm nổi bật sự tập trung của các yếu tố nguy cơ tim mạch ở quần thể có hút thuốc.