6  第六部分:整合與收尾

本部分預計時間:20 分鐘

恭喜你走到最後一個部分!現在我們要把前面學到的所有技能整合成一個完整的分析流程,並做成可重複使用的範本。

請幫我寫一個完整的、可重複使用的 R 臨床研究分析範本,需求如下:

  1. 最上面設定區:可修改的變數(資料檔名、分組變數、連續/類別變數、輸出檔名)
  2. 讀取 patient_data.csv
  3. 用 gtsummary 產出 Table 1(依 treatment 分組,含 p-value,中文標籤)
  4. 用 ggplot2 畫盒狀圖比較兩組 los(含 jitter 資料點)
  5. 做 t-test 和 Wilcoxon test
  6. 用 report 和 broom 套件產出純文字統計報告,存成 report.txt
  7. 把上述報告改寫成英文論文 Result 段落
  8. 把 Table 1 存成 Word、圖存成 PNG
  9. 用 renv::dependencies() 和 sessioninfo::session_info() 記錄套件版本

把整個 script 做成一個「只改最上面設定就能套用到不同資料」的範本,加上中文註解。

6.1 任務 25:完整的分析流程

📋 複製這段話,貼給 AI:

請幫我寫一個完整的 R script,從頭到尾做完以下分析:

  1. 讀取 patient_data.csv
  2. 用 gtsummary 產出 Table 1(依照 treatment 分組,含 p-value)
  3. 用 ggplot2 畫一個比較兩組 los 的盒狀圖
  4. 做統計檢定比較兩組 los
  5. 把表格存成 Word 檔、圖存成 PNG 檔

請把程式碼整理成一個可以從頭跑到尾的 script,並加上註解說明每一步在做什麼。

6.1.1 完整分析腳本

Note

以下程式碼區塊標記為 eval: false,表示它不會在書籍中自動執行。請將程式碼複製到一個新的 .R 檔案中執行,或在 R 終端機中逐行貼上執行。

# ===========================
# 臨床研究統計分析完整腳本
# ===========================

# 載入必要套件
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.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 做臨床研究的統計分析。請推薦我:

  1. 3 個最值得學的 R 技能(以我的需求來說)
  2. 2 個適合初學者的免費學習資源
  3. 當我遇到問題時,除了問你之外,還可以去哪裡找答案

6.6.1 持續學習建議

6.6.1.1 最值得學的 3 個 R 技能

  1. 資料整理(dplyr 套件)
    • filter():篩選資料
    • select():選擇欄位
    • mutate():新增計算欄位
    • group_by() + summarise():分組統計
  2. 統計分析(基礎 R + 專門套件)
    • 基礎統計檢定:t.test(), wilcox.test(), chisq.test()
    • 迴歸分析:lm(), glm()
    • 存活分析:survival 套件
  3. 資料視覺化(ggplot2)
    • 基本圖形:散佈圖、長條圖、盒狀圖
    • 客製化:主題、顏色、標籤
    • 論文品質輸出:高解析度、適當尺寸

6.6.1.2 免費學習資源

  1. R for Data Science (線上免費書)

    • 網址:https://r4ds.had.co.nz/
    • 中文版也有免費線上版本
  2. Swirl 互動式學習套件1

    install.packages("swirl")
    library(swirl)
    swirl()

6.6.1.3 問題解決資源

  1. Stack Overflow
    • 搜尋關鍵字加上 “R”
    • 大部分問題都有人問過
  2. R 官方文件
    • 在 R 中輸入 ?函數名稱 查看說明
    • 例如:?t.test
  3. 統計諮詢
    • 醫院或學校的統計諮詢中心
    • 線上統計論壇(如 Cross Validated)

6.6.2 練習建議

週次 練習重點 建議時間
1 重複今天的內容,用自己的資料 每天 30 分鐘
2 學習 dplyr 資料整理 每天 30 分鐘
3 嘗試不同的統計檢定 每週 2-3 次
4 製作更複雜的圖表 每週 2-3 次

6.7 今天學會的超能力總結

  • ✅ 把問題描述清楚,讓 AI 幫你寫程式
  • ✅ 看懂 AI 給的程式碼大概在做什麼
  • ✅ 當程式出錯,知道怎麼問 AI 修正
  • ✅ 產出可以放進論文的表格和圖表
  • ✅ 有一個可以重複使用的分析範本

你不需要記住任何語法,但要記住如何問對問題!

1.
Kross S, Carchedi N, Bauer B, Grdina G. Swirl: Learn r, in r.; 2020. https://CRAN.R-project.org/package=swirl