# ===========================
# 臨床研究統計分析完整腳本
# ===========================
# 載入必要套件
library(gtsummary)
library(ggplot2)
library(dplyr)
# 安裝並載入 flextable(如果需要)
if (!require(flextable, quietly = TRUE)) {
install.packages("flextable", repos = "https://cloud.r-project.org/")
library(flextable)
}
# 1. 讀取資料
# ---------------------------
my_data <- read.csv("patient_data.csv")
print("資料讀取成功!")
print(paste("共有", nrow(my_data), "筆資料"))
# 2. 建立 Table 1
# ---------------------------
table1 <- my_data %>%
select(treatment, age, gender, los) %>%
tbl_summary(
by = treatment,
label = list(
age ~ "年齡(歲)",
gender ~ "性別",
los ~ "住院天數(天)"
),
statistic = list(
all_continuous() ~ "{mean} ± {sd}",
all_categorical() ~ "{n} ({p}%)"
)
) %>%
add_p() %>%
bold_p(t = 0.05) %>%
modify_header(label ~ "**變項**") %>%
modify_spanning_header(c("stat_1", "stat_2") ~ "**治療組別**")
# 顯示 Table 1
print(table1)
# 3. 繪製盒狀圖(字型已由 _common.R 全域設定)
# ---------------------------
p <- ggplot(my_data, aes(x = treatment, y = los, fill = treatment)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.2, alpha = 0.5, size = 2) +
scale_fill_manual(values = c("A" = "steelblue", "B" = "darkorange")) +
labs(
title = "兩組治療的住院天數比較",
x = "治療組別",
y = "住院天數(天)"
) +
theme(legend.position = "none")
# 顯示圖表
print(p)
# 4. 統計檢定
# ---------------------------
# t-test
t_test <- t.test(los ~ treatment, data = my_data)
print("獨立樣本 t 檢定結果:")
print(t_test)
# Wilcoxon test(無母數替代方法)
wilcox_test <- wilcox.test(los ~ treatment, data = my_data)
print("Wilcoxon rank-sum 檢定結果:")
print(wilcox_test)
# 5. 儲存輸出
# ---------------------------
# 儲存 Table 1 為 Word 檔
table1 %>%
as_flex_table() %>%
save_as_docx(path = "Table1_output.docx")
print("Table 1 已儲存為 Table1_output.docx")
# 儲存盒狀圖為 PNG 檔
ggsave(
filename = "boxplot_los_comparison.png",
plot = p,
width = 8,
height = 6,
dpi = 300,
units = "in"
)
print("盒狀圖已儲存為 boxplot_los_comparison.png")
print("===== 分析完成!=====")6 第六部分:整合與收尾
本部分預計時間:20 分鐘
恭喜你走到最後一個部分!現在我們要把前面學到的所有技能整合成一個完整的分析流程,並做成可重複使用的範本。
請幫我寫一個完整的、可重複使用的 R 臨床研究分析範本,需求如下:
- 最上面設定區:可修改的變數(資料檔名、分組變數、連續/類別變數、輸出檔名)
- 讀取 patient_data.csv
- 用 gtsummary 產出 Table 1(依 treatment 分組,含 p-value,中文標籤)
- 用 ggplot2 畫盒狀圖比較兩組 los(含 jitter 資料點)
- 做 t-test 和 Wilcoxon test
- 用 report 和 broom 套件產出純文字統計報告,存成 report.txt
- 把上述報告改寫成英文論文 Result 段落
- 把 Table 1 存成 Word、圖存成 PNG
- 用 renv::dependencies() 和 sessioninfo::session_info() 記錄套件版本
把整個 script 做成一個「只改最上面設定就能套用到不同資料」的範本,加上中文註解。
6.1 任務 25:完整的分析流程
📋 複製這段話,貼給 AI:
請幫我寫一個完整的 R script,從頭到尾做完以下分析:
- 讀取 patient_data.csv
- 用 gtsummary 產出 Table 1(依照 treatment 分組,含 p-value)
- 用 ggplot2 畫一個比較兩組 los 的盒狀圖
- 做統計檢定比較兩組 los
- 把表格存成 Word 檔、圖存成 PNG 檔
請把程式碼整理成一個可以從頭跑到尾的 script,並加上註解說明每一步在做什麼。
6.1.1 完整分析腳本
以下程式碼區塊標記為 eval: false,表示它不會在書籍中自動執行。請將程式碼複製到一個新的 .R 檔案中執行,或在 R 終端機中逐行貼上執行。
6.2 任務 26:R 生成文字報告
📋 複製這段話,貼給 AI:
所有統計分析結果必須以純文字形式輸出,使用 capture.output() 或 sink() 將結果儲存至 report.txt。優先使用 report 和 broom 套件產生可讀的摘要。
6.2.1 產出純文字報告
# 使用 report 和 broom 套件產生報告
library(report)
library(broom)
# 假設已有一個模型
model <- t.test(los ~ treatment, data = my_data)
# 方法一:使用 sink() 儲存報告
sink("report.txt")
print(summary(model))
print(report::report(model))
print(broom::tidy(model))
sink()
print("報告已儲存至 report.txt")6.3 任務 27:改寫成 Result 段落
📋 複製這段話,貼給 AI:
請將以下結構化的報告,用英文改寫成我的研究中 Result 的一個描述段落
6.3.1 範例輸出
將 R 產生的統計摘要,轉換成適合論文的敘述文字,例如:
The mean length of stay was significantly shorter in Treatment A (4.58 ± 2.1 days) compared to Treatment B (11.56 ± 3.2 days), with a statistically significant difference (p < 0.001, Wilcoxon rank-sum test).
6.4 任務 28:做成你的範本
📋 複製這段話,貼給 AI:
請把剛剛的 script 改成一個「範本」,把檔案名稱、分組變數、要分析的變數都用清楚的變數名稱標示在最上面,這樣我以後只要改最上面的設定,就可以套用到不同的資料。
6.4.1 可重複使用的分析範本
# ========================================
# 臨床研究統計分析範本
# 使用說明:修改下方設定區的參數即可
# ========================================
# ========== 設定區 ==========
# 請根據您的資料修改以下參數
# 檔案設定
DATA_FILE <- "patient_data.csv" # 資料檔案名稱
OUTPUT_TABLE <- "Table1_results.docx" # 輸出表格檔名
OUTPUT_FIGURE <- "comparison_plot.png" # 輸出圖檔名
# 變數設定
GROUP_VAR <- "treatment" # 分組變數
CONTINUOUS_VARS <- c("age", "los") # 連續變數
CATEGORICAL_VARS <- c("gender") # 類別變數
OUTCOME_VAR <- "los" # 主要結果變數(用於畫圖)
# 標籤設定(中文名稱)
LABELS <- list(
age = "年齡(歲)",
gender = "性別",
los = "住院天數(天)",
treatment = "治療組別"
)
# 圖表設定
PLOT_TITLE <- "兩組治療的住院天數比較"
GROUP_COLORS <- c("steelblue", "darkorange") # 兩組的顏色
# ========== 分析程式(通常不需修改)==========
# 載入套件
required_packages <- c("gtsummary", "ggplot2", "dplyr", "flextable")
for (pkg in required_packages) {
if (!require(pkg, character.only = TRUE, quietly = TRUE)) {
install.packages(pkg, repos = "https://cloud.r-project.org/")
library(pkg, character.only = TRUE)
}
}
# 讀取資料
data <- read.csv(DATA_FILE)
print(paste("成功讀取", nrow(data), "筆資料"))
# 建立變數清單
all_vars <- c(GROUP_VAR, CONTINUOUS_VARS, CATEGORICAL_VARS)
# 產生 Table 1
table_result <- data %>%
select(all_of(all_vars)) %>%
tbl_summary(
by = all_of(GROUP_VAR),
label = LABELS,
statistic = list(
all_continuous() ~ "{mean} ± {sd}",
all_categorical() ~ "{n} ({p}%)"
)
) %>%
add_p() %>%
bold_p(t = 0.05)
print(table_result)
# 繪製比較圖(字型已由 _common.R 全域設定)
plot_formula <- as.formula(paste(OUTCOME_VAR, "~", GROUP_VAR))
comparison_plot <- ggplot(data,
aes_string(x = GROUP_VAR,
y = OUTCOME_VAR,
fill = GROUP_VAR)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.2, alpha = 0.5, size = 2) +
scale_fill_manual(values = GROUP_COLORS) +
labs(
title = PLOT_TITLE,
x = LABELS[[GROUP_VAR]],
y = LABELS[[OUTCOME_VAR]]
) +
theme(legend.position = "none")
print(comparison_plot)
# 統計檢定
test_result <- t.test(plot_formula, data = data)
print(test_result)
# 儲存結果
table_result %>%
as_flex_table() %>%
save_as_docx(path = OUTPUT_TABLE)
ggsave(
filename = OUTPUT_FIGURE,
plot = comparison_plot,
width = 8,
height = 6,
dpi = 300
)
print(paste("分析完成!結果已儲存至", OUTPUT_TABLE, "和", OUTPUT_FIGURE))6.5 任務 29:保存環境
📋 複製這段話,貼給 AI:
先用 renv::dependencies() 靜態掃描專案抓出所有第三方套件名稱,再用 packageVersion()(或 sessioninfo::session_info())對這些套件逐一展開並記錄完整的版本號與環境資訊。請給我完整的程式碼。
6.5.1 記錄套件版本
# 安裝 renv 和 sessioninfo(如果還沒安裝)
if (!require(renv, quietly = TRUE)) install.packages("renv")
if (!require(sessioninfo, quietly = TRUE)) install.packages("sessioninfo")
# 掃描專案中使用的套件
deps <- renv::dependencies()
packages_used <- unique(deps$Package)
# 取得版本資訊
pkg_versions <- sapply(packages_used, function(pkg) {
tryCatch(as.character(packageVersion(pkg)), error = function(e) NA)
})
# 整理成表格
version_table <- data.frame(
Package = names(pkg_versions),
Version = pkg_versions,
row.names = NULL
)
print(version_table)
# 完整的 session info
sessioninfo::session_info()6.5.2 論文中的環境描述範例
所有統計分析與資料處理皆使用 R 軟體(R version 4.5.1)。分析程式碼之套件相依性以 renv 套件掃描整個專案目錄而得;除 base/recommended 套件外,本研究主要使用 dplyr(資料前處理)、ggplot2(資料視覺化)、gtsummary(統計表格)、survival(生存分析)等套件。完整之套件列表與版本資訊依 sessioninfo::session_info() 輸出,附於補充資料。
6.6 任務 30:當你離開這個教室之後
📋 複製這段話,貼給 AI:
我是一個剛學 R 的醫護人員,主要想用 R 做臨床研究的統計分析。請推薦我:
- 3 個最值得學的 R 技能(以我的需求來說)
- 2 個適合初學者的免費學習資源
- 當我遇到問題時,除了問你之外,還可以去哪裡找答案
6.6.1 持續學習建議
6.6.1.1 最值得學的 3 個 R 技能
- 資料整理(dplyr 套件)
filter():篩選資料select():選擇欄位mutate():新增計算欄位group_by()+summarise():分組統計
- 統計分析(基礎 R + 專門套件)
- 基礎統計檢定:
t.test(),wilcox.test(),chisq.test() - 迴歸分析:
lm(),glm() - 存活分析:
survival套件
- 基礎統計檢定:
- 資料視覺化(ggplot2)
- 基本圖形:散佈圖、長條圖、盒狀圖
- 客製化:主題、顏色、標籤
- 論文品質輸出:高解析度、適當尺寸
6.6.1.2 免費學習資源
R for Data Science (線上免費書)
- 網址:https://r4ds.had.co.nz/
- 中文版也有免費線上版本
Swirl 互動式學習套件1
install.packages("swirl") library(swirl) swirl()
6.6.1.3 問題解決資源
- Stack Overflow
- 搜尋關鍵字加上 “R”
- 大部分問題都有人問過
- R 官方文件
- 在 R 中輸入
?函數名稱查看說明 - 例如:
?t.test
- 在 R 中輸入
- 統計諮詢
- 醫院或學校的統計諮詢中心
- 線上統計論壇(如 Cross Validated)
6.6.2 練習建議
| 週次 | 練習重點 | 建議時間 |
|---|---|---|
| 1 | 重複今天的內容,用自己的資料 | 每天 30 分鐘 |
| 2 | 學習 dplyr 資料整理 | 每天 30 分鐘 |
| 3 | 嘗試不同的統計檢定 | 每週 2-3 次 |
| 4 | 製作更複雜的圖表 | 每週 2-3 次 |
6.7 今天學會的超能力總結
- ✅ 把問題描述清楚,讓 AI 幫你寫程式
- ✅ 看懂 AI 給的程式碼大概在做什麼
- ✅ 當程式出錯,知道怎麼問 AI 修正
- ✅ 產出可以放進論文的表格和圖表
- ✅ 有一個可以重複使用的分析範本
你不需要記住任何語法,但要記住如何問對問題!