Tuyến Trần, MD
Lập trình & Phân tích

5 thao tác R thay thế SPSS bác sĩ thường làm hằng ngày

Mỗi click trong SPSS map sang 1 dòng R. 5 thao tác phổ biến nhất kèm code thực dùng cho phân tích lâm sàng.

Lần đầu mình mở SPSS chạy thống kê mô tả cho một paper, mỗi bảng kết quả phải copy thủ công vào Word. Mỗi hình phải lưu dạng emf rồi dán, lệch font, sửa lại nhãn. Một paper retrospective tốn 2 ngày chỉ để làm bảng và hình.

Sau khi chuyển sang R, cùng quy trình đó còn ~3 giờ. Không phải vì R "nhanh hơn" theo nghĩa tính toán. Mà vì 5 thao tác thống kê mô tả bác sĩ làm hằng ngày trong SPSS có thể tạo ra bảng và hình đạt chuẩn xuất bản bằng một đoạn code, chạy lại trong 3 giây mỗi khi dữ liệu cập nhật.

Bài này đối chiếu 5 thao tác phổ biến nhất từ SPSS sang R. Code copy-paste được. Bạn chỉ sửa tên cột thành tên cột dữ liệu của bạn.

1. Bảng 1 (thống kê mô tả theo nhóm)

Quy trình SPSS: Analyze → Descriptive → Frequencies / Descriptives, chạy từng cột, copy kết quả vào Word, sửa định dạng. Hoặc Crosstabs nếu chia theo nhóm. 30-45 phút cho 1 Bảng 1 đầy đủ.

Quy trình R:

library(gtsummary)
data %>%
 tbl_summary(by = outcome,
 statistic = list(all_continuous() ~ "{median} ({p25}, {p75})",
 all_categorical() ~ "{n} ({p}%)")) %>%
 add_p()

Kết quả: Bảng 1 chia theo outcome có/không, mỗi biến tự chọn median + IQR (cho biến liên tục) hoặc n (%) (cho biến phân loại), thêm cột p-value cuối. Định dạng sẵn sàng cho Q1.

Tôi dùng đúng đoạn này cho Bảng 1 trong một paper retrospective. Reviewer không hỏi gì về format Bảng 1.

2. So sánh 2 nhóm (t-test hoặc Mann-Whitney)

Quy trình SPSS: Analyze → Compare Means → Independent t-test, hoặc Nonparametric Tests → Legacy Dialogs → 2 Independent Samples cho Mann-Whitney. Chọn biến, click qua hộp thoại, copy kết quả.

Quy trình R:

t.test(age ~ outcome, data = data)
wilcox.test(age ~ outcome, data = data)

Một dòng cho t-test, một dòng cho Mann-Whitney. Kết quả có mean, CI, p-value. Đủ để viết "age was lower in group A vs B (median 4.0 vs 6.5, p = 0.012)".

Lưu ý: trước khi chạy t-test, kiểm tra phân bố. R có sẵn:

shapiro.test(data$age[data$outcome == "yes"])
shapiro.test(data$age[data$outcome == "no"])

Nếu cả hai p > 0.05, dùng t-test. Nếu không, dùng Wilcoxon. Hai dòng quyết định.

3. So sánh nhiều nhóm (ANOVA hoặc Kruskal-Wallis)

Quy trình SPSS: Analyze → Compare Means → One-Way ANOVA, hoặc Nonparametric Tests → K Independent Samples cho Kruskal-Wallis.

Quy trình R:

aov_result <- aov(age ~ stage, data = data)
summary(aov_result)
TukeyHSD(aov_result)

Hoặc nếu phi tham số:

kruskal.test(age ~ stage, data = data)

ANOVA Tukey post-hoc một dòng TukeyHSD() ra luôn p-value cho từng cặp nhóm. SPSS bắt bạn tick "Post Hoc" trong hộp thoại rồi chọn Tukey/Bonferroni qua danh sách xổ xuống. R gọn hơn 1 click.

4. Logistic regression

Quy trình SPSS: Analyze → Regression → Binary Logistic, chọn dependent + covariates, tick "CI for exp(B)", chạy. Kết quả có odds ratio, CI, p-value nhưng phải cuộn qua nhiều bảng.

Quy trình R:

model <- glm(outcome ~ age + sex + stage + comorbidity,
 data = data, family = binomial)
summary(model)

Để tạo bảng OR + CI + p đạt chuẩn xuất bản trong 1 lệnh:

library(gtsummary)
tbl_regression(model, exponentiate = TRUE)

Kết quả: Bảng OR (95% CI) + p-value cho từng biến. Định dạng đẹp, dán thẳng vào Word hoặc xuất PNG.

Tôi dùng combo glm cộng tbl_regression cho bảng regression trong một paper. Khi reviewer yêu cầu thêm một biến hiệp biến (ví dụ BMI), mình chỉnh một ký tự trong code, chạy lại, bảng mới sẵn sàng. Nếu là SPSS, phải click toàn bộ hộp thoại lại từ đầu.

5. Vẽ hình đạt chuẩn xuất bản

Quy trình SPSS: Graphs → Chart Builder, kéo thả, sửa trục, sửa màu, xuất. Mỗi hình 15-30 phút.

Quy trình R (ggplot):

Boxplot age theo nhóm:

library(ggplot2)
ggplot(data, aes(x = outcome, y = age, fill = outcome)) +
 geom_boxplot() +
 labs(x = "Outcome", y = "Age (years)") +
 theme_classic()

Kaplan-Meier survival:

library(survival)
library(survminer)
fit <- survfit(Surv(time, event) ~ stage, data = data)
ggsurvplot(fit, pval = TRUE, risk.table = TRUE)

Forest plot cho meta-analysis:

library(metafor)
forest(rma_result)

Tất cả đạt chuẩn xuất bản ở mức 300 dpi. Một meta-analysis có thể tạo forest plot bằng vài dòng metafor, hình đạt chuẩn Q1, gần như không cần chỉnh tay.

Quy trình tiết kiệm thực

Đo theo một paper đoàn hệ hồi cứu cỡ trung bình:

Việc SPSS R
Bảng 1 chia nhóm 45 phút 5 phút
4 t-test + 4 chi-square 20 phút 2 phút
Logistic regression Table 3 30 phút 5 phút
6 hình 90 phút 30 phút
Tổng 3 giờ 5 phút 42 phút

Tiết kiệm rõ nhất ở chạy lại. Mỗi lần bộ dữ liệu được bổ sung thêm ca mới, SPSS phải click lại từ đầu. R chạy lại một lệnh source("analysis.R"), bảng và hình cập nhật ngay.

Khi nào đoạn này không có ý nghĩa

Nếu bạn viết 1 paper retrospective một năm, không cập nhật dữ liệu sau IRB lock, không cần hình tùy chỉnh, đừng tốn 30-40 giờ học R. Tôi đã viết kỹ trong bài so sánh khi nào SPSS đủ và khi nào nên đổi sang R. Đọc trước.

Nếu bạn đang chạy cohort prospective với dữ liệu cập nhật hằng tháng, hoặc bắt đầu viết SR/MA, 5 thao tác trên tiết kiệm hàng chục giờ mỗi paper. Đó là lúc đầu tư R có ROI rõ ràng.


Học 5 thao tác này có hệ thống: khoá R-stats trên tuyentranmd.com thiết kế 8 tuần đi từ nạp dữ liệu đến tạo Bảng 1 cộng forest plot đạt chuẩn xuất bản. Mỗi bài kèm dữ liệu lâm sàng VN, code mẫu paste-được, không phải ví dụ minh hoạ chung chung.