# 1. 載入 ggplot2 繪圖套件
library(ggplot2)
# 2. 輸入 15 位病患的收縮壓數據 (mmHg)
set.seed(42)
sbp_data <- c(125, 138, 130, 142, 120, 135, 145, 128, 132, 140, 122, 134, 148, 118, 126)
# 3. 設定檢定基準值 H0: mu = 120
mu_0 <- 120
n <- length(sbp_data)
mean_sbp <- mean(sbp_data)
sd_sbp <- sd(sbp_data)
sem_sbp <- sd_sbp / sqrt(n)
# 4. 手動計算 t 統計量與 p 值
t_stat <- (mean_sbp - mu_0) / sem_sbp
df_val <- n - 1
p_val_manual <- 2 * (1 - pt(abs(t_stat), df = df_val)) # 雙尾檢定 p 值
# 5. 使用 R 內建 t.test() 函數進行驗證
t_test_res <- t.test(sbp_data, mu = mu_0)
# 印出檢定結果
cat("--- 單樣本 t 檢定手動計算結果 ---\n")
cat("樣本平均數 (Mean) :", round(mean_sbp, 3), "mmHg\n")
cat("樣本標準差 (SD) :", round(sd_sbp, 3), "mmHg\n")
cat("平均數標準誤 (SEM) :", round(sem_sbp, 3), "mmHg\n")
cat("t 檢定統計量 (t-statistic):", round(t_stat, 3), "\n")
cat("自由度 (df) :", df_val, "\n")
cat("雙尾 p 值 (p-value) :", round(p_val_manual, 6), "\n")
cat("---------------------------------\n\n")
print(t_test_res)
# =======================================================
# 6. 使用 ggplot2 繪製 t 分布圖,標出拒絕域與我們的 t 統計量位置
# =======================================================
x_vals <- seq(-6, 6, length.out = 1000)
y_vals <- dt(x_vals, df = df_val)
t_df <- data.frame(t_val = x_vals, Density = y_vals)
# 計算 alpha = 0.05 雙尾檢定的 t 臨界值
alpha <- 0.05
t_crit <- qt(1 - alpha/2, df = df_val)
# 篩選左右兩側拒絕域以利塗色
df_rej_left <- subset(t_df, t_val < -t_crit)
df_rej_right <- subset(t_df, t_val > t_crit)
p_hypo <- ggplot(t_df, aes(x = t_val, y = Density)) +
geom_line(color = "#4a5568", linewidth = 1) +
# 塗色左、右拒絕域 (紅色)
geom_area(data = df_rej_left, aes(y = Density), fill = "#e53e3e", alpha = 0.5) +
geom_area(data = df_rej_right, aes(y = Density), fill = "#e53e3e", alpha = 0.5) +
# 畫出臨界值虛線
geom_vline(xintercept = c(-t_crit, t_crit), linetype = "dashed", color = "#e53e3e", linewidth = 0.8) +
# 畫出我們的樣本 t 統計量位置 (藍色實線)
geom_vline(xintercept = t_stat, color = "#2b6cb0", linewidth = 1.2) +
annotate("text", x = t_stat - 1.2, y = 0.25,
label = paste0("樣本統計量\nt = ", round(t_stat, 2)),
size = 4.0, color = "#2b6cb0", family = "Noto Sans CJK TC", fontface = "bold") +
annotate("text", x = t_crit + 1.1, y = 0.05,
label = paste0("右側拒絕域\nt > ", round(t_crit, 2)),
size = 3.8, color = "#9b2c2c", family = "Noto Sans CJK TC") +
annotate("text", x = -t_crit - 1.1, y = 0.05,
label = paste0("左側拒絕域\nt < -", round(t_crit, 2)),
size = 3.8, color = "#9b2c2c", family = "Noto Sans CJK TC") +
labs(
title = "單樣本 t 檢定之拒絕域與檢定統計量位置",
subtitle = paste0("自由度 df = ", df_val, ", 顯著水準 alpha = 0.05 (雙尾檢定)"),
x = "t 值 (t-value)",
y = "機率密度 Probability Density"
) +
theme_minimal(base_family = "Noto Sans CJK TC", base_size = 12) + # Windows 請更換為 Microsoft JhengHei
theme(
plot.title = element_text(size = 15, hjust = 0.5, color = "#2d3748", lineheight = 1.1),
plot.subtitle = element_text(size = 11, hjust = 0.5, color = "#718096"),
axis.title = element_text(size = 12, color = "#4a5568"),
axis.title.x = element_text(margin = margin(t = 10)),
axis.title.y = element_text(margin = margin(r = 12)),
axis.text = element_text(size = 11, color = "#2d3748"),
panel.background = element_rect(fill = "#f7fafc", color = NA),
plot.background = element_rect(fill = "white", color = NA),
plot.margin = margin(20, 28, 20, 54)
)
# 顯示圖表
print(p_hypo)