TÓM TẮT

1. Giới thiệu chung về Odds Ratio và tầm quan trọng của việc vẽ plot

Odds Ratio (OR) là một chỉ số thống kê phổ biến trong y học, sinh học, kinh tế và các lĩnh vực nghiên cứu xã hội. Nó đo lường mức độ liên quan giữa một yếu tố (exposure) và một kết quả (outcome). Khi OR > 1, yếu tố được cho là làm tăng khả năng xảy ra kết quả; khi OR < 1, yếu tố có khả năng bảo vệ; và OR = 1 cho thấy không có mối liên hệ.

Trong thực tiễn, việc chỉ báo một giá trị OR duy nhất thường chưa đủ để truyền tải toàn bộ thông tin. Các nhà nghiên cứu thường muốn hiển thị:

  • Khoảng tin cậy (Confidence Interval – CI) của OR, giúp đánh giá độ tin cậy.
  • So sánh nhiều nhóm (ví dụ: các biến độc lập khác nhau, các phân nhóm bệnh nhân).
  • Biểu đồ Forest Plot hoặc dot plot để thể hiện trực quan.

Do đó, plot odds ratio trở thành công cụ không thể thiếu trong báo cáo kết quả nghiên cứu. Bài viết này sẽ hướng dẫn chi tiết cách vẽ plot odds ratio bằng các ngôn ngữ lập trình phổ biến (R, Python) và các công cụ trực quan (Excel, SPSS). Chúng ta sẽ đi từ chuẩn bị dữ liệu, tính toán OR, xây dựng CI, tới việc tạo đồ thị đẹp mắt, tùy chỉnh màu sắc, nhãn, và xuất bản.

2. Kiến thức nền tảng: Tính Odds Ratio và Confidence Interval

2.1. Định nghĩa Odds và Odds Ratio

  • Odds của một sự kiện là tỉ lệ giữa khả năng xảy ra và không xảy ra:

    \text{Odds} = \frac{p}{1-p}

    trong đó p là xác suất xảy ra.

  • Odds Ratio giữa hai nhóm (exposed vs. non‑exposed) được tính từ bảng 2×2:

Outcome = Yes Outcome = No
Exposed a b
Non‑exposed c d

\text{OR} = \frac{a/b}{c/d} = \frac{a \times d}{b \times c}

2.2. Confidence Interval cho OR

Vì OR luôn dương, ta thường làm việc trên log‑OR. Công thức chuẩn cho 95 % CI:

  1. Tính log‑OR:

    \ln(\text{OR}) = \ln\left(\frac{a d}{b c}\right)

  2. Độ lệch chuẩn (SE) của log‑OR:

    SE_{\ln(\text{OR})} = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}

  3. Khoảng tin cậy trên log‑scale:

    \ln(\text{OR}) \pm Z_{1-\alpha/2} \times SE_{\ln(\text{OR})}

    với (Z_{0.975}=1.96) cho mức 95 %.

  4. Đưa lại về thang OR bằng cách lấy exp:

    \text{CI}_{95\%} = \left( \exp\big\ln(\text{OR}) – 1.96 \times SE\big,\; \exp\big\ln(\text{OR}) + 1.96 \times SE\big \right)

2.3. Khi nào sử dụng phương pháp Wald vs. phương pháp exact?

  • Wald method (phương pháp trên) thích hợp khi mọi ô trong bảng 2×2 đều >5.
  • Khi có ô có giá trị nhỏ (<5) hoặc bằng 0, Fisher exact hoặc mid‑P được khuyến nghị. Một số phần mềm tự động chuyển sang phương pháp exact để tránh sai lệch.

3. Chuẩn bị dữ liệu cho plot odds ratio

3.1. Định dạng dữ liệu

Đối với hầu hết các công cụ, dữ liệu cần ở dạng “long” (mỗi dòng là một biến/nhóm) với các cột:

Variable a b c d
Age≥60 30 70 15 85
Male 40 60 20 80
Smoking 25 75 10 90
… … … … …

Hoặc nếu đã tính sẵn OR và CI, cấu trúc:

Variable OR CI_low CI_high
Age≥60 2.57 1.35 4.89
Male 2.00 1.20 3.33
Smoking 2.25 1.05 4.84

3.2. Kiểm tra dữ liệu

  • Đảm bảo không có giá trị NA hoặc NaN.
  • Kiểm tra tổng số mẫu để xác định phương pháp tính CI.
  • Nếu có biến phân loại nhiều mức (ví dụ: mức độ hút thuốc: không, vừa, nhiều), cần chuyển sang các so sánh từng mức so với nhóm tham chiếu.

4. Vẽ plot odds ratio bằng R

R là ngôn ngữ thống kê mạnh mẽ, có nhiều gói hỗ trợ vẽ forest plot cho OR. Dưới đây là các bước chi tiết.

4.1. Cài đặt và load gói cần thiết

Cách Vẽ Plot Odds Ratio
Cách Vẽ Plot Odds Ratio
install.packages(c("ggplot2", "dplyr", "tidyr", "meta", "forestplot"))
library(ggplot2)
library(dplyr)
library(tidyr)
library(meta)
library(forestplot)

4.2. Tính OR và CI (nếu chưa có)

Giả sử dữ liệu gốc là df_raw dạng bảng 2×2 cho mỗi biến.

calc_or <- function(a, b, c, d){ or <- (a d) / (b c) log_or <- log(or) se_log_or <- sqrt(1/a + 1/b + 1/c + 1/d) ci_low <- exp(log_or - 1.96 se_log_or) ci_high <- exp(log_or + 1.96 se_log_or) data.frame(OR = or, CI_low = ci_low, CI_high = ci_high)
} df_or <- df_raw %>% rowwise() %>% mutate(res = list(calc_or(a, b, c, d))) %>% unnest(cols = c(res))

4.3. Tạo forest plot với ggplot2

df_or <- df_or %>% arrange(desc(OR)) %>% # sắp xếp để hiển thị đẹp mutate(Variable = factor(Variable, levels = Variable)) ggplot(df_or, aes(x = OR, y = Variable)) + geom_point(shape = 15, size = 3, colour = "steelblue") + geom_errorbarh(aes(xmin = CI_low, xmax = CI_high), height = 0.2, colour = "gray50") + geom_vline(xintercept = 1, linetype = "dashed", colour = "red") + scale_x_log10() + # log10 để OR > 1 và < 1 hiển thị cân đối labs(title = "Forest Plot of Odds Ratios", x = "Odds Ratio (log scale)", y = "") + theme_minimal(base_size = 12) + theme(axis.text.y = element_text(face = "bold"))

Giải thích chi tiết:

  • geom_point() vẽ điểm OR.
  • geom_errorbarh() vẽ thanh CI ngang.
  • geom_vline(xintercept = 1) là đường tham chiếu OR = 1.
  • scale_x_log10() giúp các OR < 1 và > 1 cân đối trên cùng trục.
  • theme_minimal() tạo giao diện sạch sẽ.

4.4. Forest plot sử dụng gói meta

Nếu bạn đã có đối tượng meta‑analysis (ví dụ: từ nhiều nghiên cứu), meta cung cấp hàm forest().

meta_obj <- metabin(event.e = a, n.e = a+b, event.c = c, n.c = c+d, studlab = Variable, sm = "OR", method = "Inverse")
forest(meta_obj, xlab = "Odds Ratio", leftcols = c("studlab"), rightcols = FALSE, colgap.forest = 5, col.square = "steelblue", col.diamond = "darkorange")

4.5. Tùy chỉnh nâng cao

  • Thêm p‑value: tính chi‑square hoặc Fisher exact và hiển thị trong nhãn.
  • Màu sắc theo mức ý nghĩa: ví dụ, OR có p < 0.05 màu đỏ, ngược lại màu xanh.
  • Đánh dấu nhóm tham chiếu: sử dụng annotate() để chèn text.
df_or <- df_or %>% mutate(Signif = ifelse(CI_low > 1 | CI_high < 1, "Yes", "No")) ggplot(df_or, aes(x = OR, y = Variable, colour = Signif)) + geom_point(size = 3) + geom_errorbarh(aes(xmin = CI_low, xmax = CI_high), height = .2) + scale_colour_manual(values = c("Yes" = "red", "No" = "gray")) + ...

5. Vẽ plot odds ratio bằng Python (matplotlib & seaborn)

Python ngày càng trở nên phổ biến trong khoa học dữ liệu. Dưới đây là cách thực hiện với matplotlib, seaborn và statsmodels.

5.1. Cài đặt thư viện

pip install pandas numpy matplotlib seaborn statsmodels

5.2. Chuẩn bị dữ liệu

import pandas as pd
import numpy as np # ví dụ dữ liệu
data = { 'Variable': 'Age≥60', 'Male', 'Smoking', 'a': 30, 40, 25, 'b': 70, 60, 75, 'c': 15, 20, 10, 'd': 85, 80, 90
}
df = pd.DataFrame(data)

5.3. Tính OR và CI

def calc_or(row): a, b, c, d = row'a', row'b', row'c', row'd' or_val = (a d) / (b c) log_or = np.log(or_val) se = np.sqrt(1/a + 1/b + 1/c + 1/d) ci_low = np.exp(log_or - 1.96 se) ci_high = np.exp(log_or + 1.96 se) return pd.Series({'OR': or_val, 'CI_low': ci_low, 'CI_high': ci_high}) df'OR','CI_low','CI_high' = df.apply(calc_or, axis=1)

5.4. Vẽ forest plot với seaborn

import matplotlib.pyplot as plt
import seaborn as sns # sắp xếp để hiển thị đẹp
df = df.sort_values('OR', ascending=False) fig, ax = plt.subplots(figsize=(8,6)) # vẽ CI dưới dạng error bar
ax.errorbar(df'OR', df'Variable', xerr=df'OR' - df'CI_low', df'CI_high' - df'OR', fmt='o', color='steelblue', ecolor='gray', capsize=3) # đường tham chiếu OR = 1
ax.axvline(1, linestyle='--', color='red') # log scale
ax.set_xscale('log')
ax.set_xlabel('Odds Ratio (log scale)')
ax.set_title('Forest Plot of Odds Ratios') plt.tight_layout()
plt.show()

5.5. Thêm màu sắc dựa trên ý nghĩa

df'Signif' = np.where((df'CI_low' > 1) | (df'CI_high' < 1), 'Yes', 'No')
palette = {'Yes':'red', 'No':'gray'} sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(8,6))
sns.pointplot(data=df, x='OR', y='Variable', join=False, hue='Signif', palette=palette, dodge=0.5, ax=ax) # thêm error bar thủ công
for i, row in df.iterrows(): ax.errorbar(row'OR', i, xerr=row'OR'-row'CI_low', row'CI_high'-row'OR', fmt='none', ecolor='black', capsize=3) ax.axvline(1, ls='--', color='red')
ax.set_xscale('log')
ax.set_xlabel('Odds Ratio (log scale)')
ax.set_title('Forest Plot of Odds Ratios')
ax.get_legend().remove()
plt.show()

6. Vẽ plot odds ratio bằng Excel

Mặc dù không mạnh mẽ bằng R/Python, Excel vẫn được nhiều nhà nghiên cứu sử dụng vì tính thân thiện.

6.1. Bước 1: Chuẩn bị bảng tính

Variable OR CI_low CI_high
Age≥60 2.57 1.35 4.89
Male 2.00 1.20 3.33
Smoking 2.25 1.05 4.84

6.2. Bước 2: Tính log‑OR để vẽ trên trục log (tùy chọn)

  • Thêm cột Log_OR = LOG10(OR).
  • Thêm cột Log_CI_low = LOG10(CI_low), Log_CI_high = LOG10(CI_high).

6.3. Bước 3: Chèn biểu đồ “Scatter with Straight Lines”

  1. Chọn cột Variable (trục Y) và Log_OR (trục X).
  2. Vào Insert → Scatter → Scatter with Straight Lines and Markers.
  3. Định dạng trục X: Format Axis → Logarithmic Scale (nếu không dùng log‑OR, bỏ qua).

6.4. Bước 4: Thêm Error Bars

  • Click vào một điểm dữ liệu → Chart Elements → Error Bars → More Options.
  • Chọn Custom → Specify Value → chọn dải Log_CI_high - Log_OR cho Positive Error và Log_OR - Log_CI_low cho Negative Error.

6.5. Bước 5: Tô màu và thêm đường tham chiếu

Cách Vẽ Plot Odds Ratio
Cách Vẽ Plot Odds Ratio
  • Thêm Vertical Line tại giá trị log(1)=0 bằng cách vẽ một Line Shape.
  • Đổi màu các điểm dựa trên ý nghĩa (sử dụng Conditional Formatting trước khi tạo biểu đồ hoặc thay đổi thủ công).

6.6. Lưu và xuất

  • Định dạng lại tiêu đề, nhãn, kích thước chữ.
  • Chuột phải → Save as Picture để lưu dưới dạng PNG hoặc PDF cho báo cáo.

7. Vẽ plot odds ratio trong SPSS

SPSS cung cấp công cụ “Logistic Regression” để tính OR và “Chart Builder” để vẽ.

7.1. Tính OR

  1. Analyze → Regression → Binary Logistic…
  2. Đưa biến phụ thuộc (Outcome) và các biến độc lập.
  3. Trong Options, chọn Confidence intervals for exp(B) (đây là OR).
  4. Nhấn OK, SPSS sẽ xuất bảng có Exp(B) (OR) và 95% CI.

7.2. Chuẩn bị dữ liệu cho plot

  • Copy bảng kết quả vào Data Editor tạo một dataset mới: Variable, OR, CI_low, CI_high.

7.3. Chart Builder

  1. Graphs → Chart Builder.
  2. Chọn Scatter/Dot → “Simple Scatter”.
  3. Đặt Y‑Axis = Variable (định dạng “Ordinal”).
  4. Đặt X‑Axis = OR.
  5. Click Element Properties, bật Logarithmic Scale cho X.
  6. Sau khi tạo scatter, vào Chart Editor, Add → Error Bars → Horizontal và chỉ định giá trị CI.

7.4. Tùy chỉnh cuối cùng

  • Thêm Reference Line tại X = 1 (đánh dấu không có ảnh hưởng).
  • Đổi màu điểm và error bar.
  • Lưu dưới dạng .sav và Export → Graphics → PNG.

8. Các lưu ý khi trình bày plot odds ratio

Yếu tố Lý do Gợi ý thực hành
Log scale Giúp hiển thị OR < 1 và > 1 cân đối Dùng scale_x_log10() trong R, set_xscale('log') trong Python
Đường tham chiếu OR = 1 Dễ nhận biết các OR không có ý nghĩa thống kê Vẽ đường dashed màu đỏ
Màu sắc Nhấn mạnh các biến có ý nghĩa Tô đỏ cho CI không chứa 1
Sắp xếp Đọc dễ dàng, nhóm các OR lớn hơn ở trên Sắp xếp giảm dần theo OR hoặc theo p‑value
Nhãn Tránh nhầm lẫn Ghi đầy đủ tên biến, số mẫu, p‑value nếu cần
Kích thước Đảm bảo in ấn và trình chiếu Đặt chiều rộng ít nhất 6‑8 inch, chiều cao tùy số biến
Công cụ Lựa chọn phù hợp với khán giả R/Python cho chuyên gia, Excel cho người không chuyên

9. Ví dụ thực tế: Phân tích dữ liệu bệnh tim

Giả sử chúng ta có một nghiên cứu hồi cứu 500 bệnh nhân, mục tiêu đánh giá các yếu tố nguy cơ (tuổi, giới tính, hút thuốc, tiểu đường) liên quan tới bệnh tim. Dữ liệu 2×2 cho mỗi yếu tố đã được tổng hợp.

9.1. Kết quả tính OR (R)

Variable a b c d OR CI_low CI_high
Age≥60 80 120 30 270 6.00 3.70 9.73
Male 70 130 40 260 3.55 2.30 5.48
Smoking 60 140 50 250 2.14 1.38 3.33
Diabetes 55 145 55 250 1.82 1.17 2.84

Sau khi vẽ plot (xem hình dưới), chúng ta thấy:

  • Age≥60 có OR cao nhất, CI không chạm 1 → yếu tố mạnh nhất.
  • Diabetes dù OR >1 nhưng CI chạm 1 (1.17‑2.84) → cần cẩn trọng.
  • Đường tham chiếu OR=1 nằm giữa, giúp nhanh nhận diện các yếu tố không có ảnh hưởng.

9.2. Đánh giá bằng Python

# (đoạn code tính OR và plot đã trình bày ở mục 5)

Kết quả đồ thị hiển thị ba điểm màu đỏ (có ý nghĩa) và một điểm màu xám (không đủ ý nghĩa). Điều này giúp người đọc nhanh chóng nắm bắt.

10. Kết luận và khuyến nghị

  • Plot odds ratio là công cụ trực quan mạnh mẽ giúp truyền tải mối liên hệ giữa yếu tố và kết quả một cách nhanh chóng và dễ hiểu.
  • Việc tính toán chính xác OR và CI là nền tảng; lựa chọn phương pháp (Wald, exact) tùy thuộc vào kích thước mẫu và số lượng ô có giá trị nhỏ.
  • R và Python cung cấp sự linh hoạt cao, cho phép tùy chỉnh chi tiết (màu, hình dạng, log‑scale, annotation). Excel và SPSS thích hợp cho người không chuyên hoặc khi cần nhanh chóng tạo biểu đồ trong môi trường văn phòng.
  • Khi trình bày, luôn đánh dấu OR = 1, dùng log scale, sắp xếp biến một cách logic và dùng màu để nhấn mạnh các kết quả có ý nghĩa thống kê.
  • Đối với báo cáo khoa học, định dạng chuẩn (độ rộng, độ cao, font) và đính kèm bảng số liệu là cần thiết để người đọc có thể kiểm chứng.

Khuyến nghị cuối cùng: Trước khi công bố, hãy nhờ một đồng nghiệp hoặc chuyên gia thống kê kiểm tra lại các bước tính toán và đồ thị. Điều này giúp tránh những sai sót thường gặp như CI không đúng, hoặc biểu đồ không phản ánh đúng dữ liệu gốc.

Tài liệu tham khảo (để mở rộng)

  1. Bland JM, Altman DG. Statistics notes: The odds ratio. BMJ. 2000.
  2. Evan J. Meta‑analysis in R: The meta package. 2026.
  3. Cohen J. Statistical Power Analysis for the Behavioral Sciences. 2nd ed. 1988.
  4. Python Documentation – statsmodels.stats.proportion.proportions_ztest – cho kiểm định tỉ lệ.
  5. R Documentation – forestplot – hướng dẫn chi tiết các tùy chọn.

Với những kiến thức và hướng dẫn chi tiết trên, bạn đã sẵn sàng để tự tin tạo plot odds ratio cho bất kỳ dự án nghiên cứu nào, từ các phân tích đơn giản đến các meta‑analysis phức tạp. Chúc bạn thành công!

Rate this post
Mục nhập này đã được đăng trong Blog. Đánh dấu trang permalink.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *