3  連續性 (Continuity)

學習目標

  • 理解連續函數的直觀意義:「一筆畫完」
  • 掌握連續性的三個數學條件
  • 辨識不同類型的不連續點
  • 理解為什麼機率密度函數必須連續
  • 理解 Kaplan-Meier 曲線的階梯狀特性

3.1 概念說明

想像你在畫一條曲線,如果可以不抬起筆就畫完整條線,這條曲線就是「連續」的。相反地,如果中間有斷點、跳躍、或洞,你就必須抬筆,這就是「不連續」。

3.1.1 連續性的直觀理解

連續函數就像: - 體溫隨時間的變化(不會突然從 36°C 跳到 40°C) - 血壓的連續監測曲線 - 藥物濃度的衰退過程

不連續函數就像: - 階梯(從一階跳到下一階) - 開關的狀態(開/關之間沒有中間值) - 存活狀態(活著 → 死亡,沒有中間狀態)

3.1.2 醫學中的例子

連續

  • 血糖濃度隨時間變化
  • 藥物血中濃度曲線
  • 心跳間隔的變化

不連續

  • 疾病分期(Stage I, II, III, IV)
  • 死亡事件(存活 vs 死亡)
  • 用藥狀態(有用藥 vs 沒用藥)

3.2 視覺化理解

3.2.1 連續 vs 不連續

Code
# 1. 連續函數:平滑曲線
x1 <- seq(-3, 3, by = 0.01)
y1 <- x1^3 - 3*x1

p1 <- ggplot(data.frame(x = x1, y = y1), aes(x, y)) +
  geom_line(color = "#2E86AB", linewidth = 1.5) +
  labs(
    title = "連續函數",
    subtitle = expression(f(x) == x^3 - 3*x),
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 0, y = -5,
           label = "✓ 可以一筆畫完", size = 5, color = "#2E86AB") +
  theme_minimal(base_size = 13)

# 2. 跳躍不連續 (Jump Discontinuity)
x2 <- seq(-3, 3, by = 0.01)
y2 <- ifelse(x2 < 0, x2 + 1, x2 - 1)

df2_left <- data.frame(x = x2[x2 < 0], y = y2[x2 < 0])
df2_right <- data.frame(x = x2[x2 >= 0], y = y2[x2 >= 0])

p2 <- ggplot() +
  geom_line(data = df2_left, aes(x, y),
            color = "#E94F37", linewidth = 1.5) +
  geom_line(data = df2_right, aes(x, y),
            color = "#E94F37", linewidth = 1.5) +
  geom_point(aes(x = 0, y = 1), color = "#E94F37", size = 4) +
  geom_point(aes(x = 0, y = -1), shape = 21, size = 4,
             fill = "white", color = "#E94F37", stroke = 2) +
  labs(
    title = "跳躍不連續",
    subtitle = "在 x = 0 處有跳躍",
    x = "x", y = "f(x)"
  ) +
  annotate("segment", x = -0.5, y = 0.5, xend = -0.5, yend = -0.5,
           arrow = arrow(length = unit(0.3, "cm"), ends = "both"),
           color = "gray30") +
  annotate("text", x = -1, y = 0,
           label = "跳躍", size = 4, color = "gray30") +
  theme_minimal(base_size = 13)

# 3. 空洞不連續 (Removable Discontinuity)
x3 <- seq(-3, 3, by = 0.01)
x3 <- x3[x3 != 1]
y3 <- (x3^2 - 1) / (x3 - 1)  # = x + 1 when x ≠ 1

p3 <- ggplot(data.frame(x = x3, y = y3), aes(x, y)) +
  geom_line(color = "#2E86AB", linewidth = 1.5) +
  # 空洞
  geom_point(aes(x = 1, y = 2), shape = 21, size = 5,
             fill = "white", color = "#E94F37", stroke = 2) +
  # 錯誤的函數值
  geom_point(aes(x = 1, y = 3), color = "#E94F37", size = 4) +
  labs(
    title = "空洞不連續",
    subtitle = "在 x = 1 處有空洞",
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 1.5, y = 2.5,
           label = "定義在錯誤位置", size = 4, color = "#E94F37") +
  theme_minimal(base_size = 13)

# 4. 無窮不連續 (Infinite Discontinuity)
x4 <- seq(-3, 3, by = 0.01)
x4 <- x4[abs(x4) > 0.05]
y4 <- 1 / x4

df4 <- data.frame(x = x4, y = y4)
df4 <- df4[abs(df4$y) < 10, ]  # 限制 y 範圍以便顯示

p4 <- ggplot(df4, aes(x, y)) +
  geom_line(color = "#E94F37", linewidth = 1.5) +
  geom_vline(xintercept = 0, linetype = "dashed",
             color = "gray50", alpha = 0.7) +
  labs(
    title = "無窮不連續",
    subtitle = expression(f(x) == 1/x ~ "在 x = 0 處"),
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 1, y = 8,
           label = "垂直漸近線", size = 4, color = "gray30") +
  coord_cartesian(ylim = c(-10, 10)) +
  theme_minimal(base_size = 13)

# 組合圖形
(p1 | p2) / (p3 | p4) +
  plot_annotation(
    title = "連續與不連續的四種情況",
    theme = theme(
      plot.title = element_text(size = 18, face = "bold")
    )
  )
Figure 3.1: 連續與不連續函數的對比

3.2.2 連續性的三個條件

一個函數 \(f(x)\)\(x = a\) 處連續,必須同時滿足三個條件:

Code
# 建立三個違反不同條件的例子

# 條件 1:f(a) 必須有定義
x_c1 <- seq(-2, 2, by = 0.01)
x_c1_plot <- x_c1[x_c1 != 0]
y_c1 <- x_c1_plot^2

p_c1 <- ggplot(data.frame(x = x_c1_plot, y = y_c1), aes(x, y)) +
  geom_line(color = "#2E86AB", linewidth = 1.2) +
  geom_point(aes(x = 0, y = 0), shape = 21, size = 5,
             fill = "white", color = "#E94F37", stroke = 2) +
  labs(
    title = "條件 1 失敗",
    subtitle = "f(0) 未定義",
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 0.5, y = 0.5,
           label = "❌ f(a) 不存在", color = "#E94F37", size = 4) +
  theme_minimal(base_size = 12)

# 條件 2:極限必須存在
x_c2 <- seq(-2, 2, by = 0.01)
y_c2 <- ifelse(x_c2 < 0, -1, 1)

df_c2_left <- data.frame(x = x_c2[x_c2 < 0], y = y_c2[x_c2 < 0])
df_c2_right <- data.frame(x = x_c2[x_c2 >= 0], y = y_c2[x_c2 >= 0])

p_c2 <- ggplot() +
  geom_line(data = df_c2_left, aes(x, y),
            color = "#2E86AB", linewidth = 1.2) +
  geom_line(data = df_c2_right, aes(x, y),
            color = "#2E86AB", linewidth = 1.2) +
  geom_point(aes(x = 0, y = 1), color = "#2E86AB", size = 4) +
  labs(
    title = "條件 2 失敗",
    subtitle = "極限不存在(左右不等)",
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 0.5, y = 0,
           label = "❌ 左極限 ≠ 右極限", color = "#E94F37", size = 4) +
  theme_minimal(base_size = 12)

# 條件 3:極限值 = 函數值
x_c3 <- seq(-2, 2, by = 0.01)
y_c3 <- x_c3^2

p_c3 <- ggplot(data.frame(x = x_c3, y = y_c3), aes(x, y)) +
  geom_line(color = "#2E86AB", linewidth = 1.2) +
  geom_point(aes(x = 0, y = 0), shape = 21, size = 5,
             fill = "white", color = "#E94F37", stroke = 2) +
  geom_point(aes(x = 0, y = 1), color = "#E94F37", size = 4) +
  labs(
    title = "條件 3 失敗",
    subtitle = "f(0) = 1, 但極限 = 0",
    x = "x", y = "f(x)"
  ) +
  annotate("text", x = 0.5, y = 0.5,
           label = "❌ lim f(x) ≠ f(0)", color = "#E94F37", size = 4) +
  theme_minimal(base_size = 12)

p_c1 | p_c2 | p_c3
Figure 3.2: 連續性的三個條件視覺化

3.3 數學定義

3.3.1 連續性的正式定義

Note連續函數的定義

函數 \(f(x)\)\(x = a\)連續,當且僅當同時滿足:

  1. \(f(a)\) 有定義(函數在該點存在)
  2. \(\lim_{x \to a} f(x)\) 存在(極限存在)
  3. \(\lim_{x \to a} f(x) = f(a)\)(極限值等於函數值)

簡單記法: \[\lim_{x \to a} f(x) = f(a)\]

3.3.2 單側連續

  • 右連續\(\lim_{x \to a^+} f(x) = f(a)\)
  • 左連續\(\lim_{x \to a^-} f(x) = f(a)\)

在某區間連續,必須在區間內每一點都連續。

3.3.3 連續函數的性質

如果 \(f(x)\)\(g(x)\)\(x = a\) 處都連續,則:

  1. \(f(x) + g(x)\) 連續
  2. \(f(x) \cdot g(x)\) 連續
  3. \(\frac{f(x)}{g(x)}\) 連續(當 \(g(a) \neq 0\)
  4. \(f(g(x))\) 連續(合成函數)

3.3.4 不連續的類型

  1. 可去除不連續 (Removable):有空洞,但可以重新定義函數值來修復
  2. 跳躍不連續 (Jump):左極限 ≠ 右極限
  3. 無窮不連續 (Infinite):函數趨近於無窮大

3.4 練習題

3.4.1 觀念題

  1. 判斷題:所有的多項式函數(如 \(x^2 + 3x - 5\))都是連續的。(O / X)

答案:O(正確)。多項式函數在實數範圍內處處連續,因為它們只涉及加法、減法和乘法運算,這些運算都保持連續性。多項式沒有分母、根號或其他可能造成不連續的運算。

  1. 判斷題:如果 \(\lim_{x \to a} f(x)\) 存在,則 \(f(x)\)\(x = a\) 處一定連續。(O / X)

答案:X(錯誤)。連續需要滿足三個條件,極限存在只是其中之一。還需要:(1) \(f(a)\) 有定義,以及 (2) 極限值等於函數值。例如「空洞不連續」中,極限存在但函數在該點未定義或定義在錯誤位置。

  1. 選擇題:下列哪個函數在 \(x = 0\) 處不連續?
    • A:\(f(x) = x^2\)
    • B:\(f(x) = |x|\)
    • C:\(f(x) = \frac{1}{x}\)
    • D:\(f(x) = \sin(x)\)

答案:C\(f(x) = \frac{1}{x}\)\(x = 0\) 處未定義(分母為零),且當 \(x \to 0\) 時函數趨近於無窮大,屬於「無窮不連續」。其他選項在 \(x = 0\) 處都連續:\(x^2\)\(\sin(x)\) 都是平滑函數,\(|x|\) 雖然在 \(x = 0\) 處不可微分,但仍然連續。

  1. 問答題:解釋為什麼「體溫」可以用連續函數表示,但「存活狀態」不行。

體溫是連續變化的物理量,可以取任意實數值(如 36.5°C, 36.51°C, 36.512°C…),中間沒有跳躍。存活狀態則是二元變數(活著或死亡),從「活著」到「死亡」是瞬間發生的跳躍,沒有中間狀態,因此必須用不連續的階梯函數表示。這也是為什麼 Kaplan-Meier 存活曲線是階梯狀的。

3.4.2 計算題

  1. 判斷下列函數在 \(x = 2\) 處是否連續:

\[f(x) = \begin{cases} x^2 & \text{if } x < 2 \\ 4 & \text{if } x = 2 \\ 2x & \text{if } x > 2 \end{cases}\]

(提示:檢查三個條件)

連續。檢查三個條件: 1. \(f(2) = 4\) ✓(有定義) 2. 左極限:\(\lim_{x \to 2^-} f(x) = \lim_{x \to 2^-} x^2 = 4\);右極限:\(\lim_{x \to 2^+} f(x) = \lim_{x \to 2^+} 2x = 4\),所以極限存在且 \(\lim_{x \to 2} f(x) = 4\) ✓ 3. \(\lim_{x \to 2} f(x) = 4 = f(2)\)

三個條件都滿足,因此函數在 \(x = 2\) 處連續。

  1. 找出 \(k\) 的值,使得下列函數在 \(x = 1\) 處連續:

\[g(x) = \begin{cases} x^2 + 1 & \text{if } x \leq 1 \\ kx & \text{if } x > 1 \end{cases}\]

答案:\(k = 2\)。為了連續,需要 \(\lim_{x \to 1} g(x) = g(1)\)。 - 左極限:\(\lim_{x \to 1^-} g(x) = 1^2 + 1 = 2\) - 函數值:\(g(1) = 1^2 + 1 = 2\) - 右極限:\(\lim_{x \to 1^+} g(x) = k \cdot 1 = k\)

要連續,需要右極限等於左極限和函數值,因此 \(k = 2\)

3.4.3 R 操作題

  1. 視覺化練習:修改下列程式碼,畫出一個在 \(x = 0\) 處有跳躍不連續的函數。
x <- seq(-2, 2, by = 0.01)

# 在 x = 0 處跳躍
y <- ifelse(x < 0, ___, ___)

ggplot(data.frame(x, y), aes(x, y)) +
  geom_line(color = "#2E86AB") +
  labs(title = "跳躍不連續範例")

填入任意不同的常數或函數即可,例如:y <- ifelse(x < 0, -1, 1)(階梯函數)或 y <- ifelse(x < 0, x - 1, x + 1)(分段線性)。執行後會看到在 \(x = 0\) 處有明顯的跳躍,左極限 ≠ 右極限。這種跳躍不連續類似於存活狀態或 Kaplan-Meier 曲線的特性。

  1. 絕對值函數:用 R 畫出 \(f(x) = |x|\),並驗證它在 \(x = 0\) 處是否連續(提示:它是連續的,但不可微分)。

程式碼:ggplot(data.frame(x = seq(-2, 2, 0.01)), aes(x, abs(x))) + geom_line()。觀察:圖形在 \(x = 0\) 處呈 V 字型,沒有斷點或跳躍,可以一筆畫完,因此連續。左極限 = 右極限 = 0 = \(f(0)\),三個條件都滿足。但注意在 \(x = 0\) 處有尖角,表示不可微分(這是下一章的主題)。

3.5 統計應用

3.5.1 連續型隨機變數的機率密度函數

在統計學中,連續型隨機變數的機率密度函數 (PDF) 必須是連續函數1

Code
x <- seq(-4, 4, by = 0.01)
y_normal <- dnorm(x, mean = 0, sd = 1)

ggplot(data.frame(x, y = y_normal), aes(x, y)) +
  geom_area(fill = "#2E86AB", alpha = 0.3) +
  geom_line(color = "#2E86AB", linewidth = 1.5) +
  # 標記任意一點的連續性
  geom_point(aes(x = 0, y = dnorm(0)), color = "#E94F37", size = 4) +
  geom_segment(aes(x = -0.5, xend = 0.5, y = dnorm(0), yend = dnorm(0)),
               linetype = "dashed", color = "#E94F37") +
  labs(
    title = "常態分布的機率密度函數",
    subtitle = "PDF 必須是連續函數(可以一筆畫完)",
    x = "x",
    y = "f(x)"
  ) +
  annotate("text", x = 1, y = dnorm(0) + 0.05,
           label = "在每一點都連續", color = "#E94F37", size = 5) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"))
Figure 3.3: 常態分布的 PDF:連續且平滑
Important為什麼 PDF 必須連續?

因為機率是透過積分(面積)計算的: \[P(a \leq X \leq b) = \int_a^b f(x) dx\]

如果 PDF 不連續,積分的定義會出問題。更重要的是,累積分布函數 (CDF) 定義為: \[F(x) = \int_{-\infty}^x f(t) dt\]

如果 \(f(x)\) 連續,則 \(F(x)\) 也會連續且可微分。

3.5.2 離散型隨機變數:不連續也可以

相對地,離散型隨機變數的機率質量函數 (PMF) 是不連續的:

Code
x_discrete <- 0:10
y_binom <- dbinom(x_discrete, size = 10, prob = 0.5)

ggplot(data.frame(x = x_discrete, y = y_binom), aes(x, y)) +
  geom_col(fill = "#E94F37", alpha = 0.7, width = 0.6) +
  geom_point(color = "#E94F37", size = 3) +
  labs(
    title = "二項分布的機率質量函數",
    subtitle = "離散型隨機變數:只在整數點有值",
    x = "x (成功次數)",
    y = "P(X = x)"
  ) +
  scale_x_continuous(breaks = 0:10) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"))
Figure 3.4: 二項分布的 PMF:不連續的階梯函數

3.5.3 Kaplan-Meier 存活曲線:有意義的不連續

在存活分析中,Kaplan-Meier 曲線是右連續的階梯函數2

Code
# 模擬簡單的存活資料
set.seed(123)
event_times <- c(0, 5, 10, 15, 20, 30, 40, 50)
survival_prob <- c(1.0, 0.9, 0.75, 0.6, 0.5, 0.3, 0.15, 0.05)

df_km <- data.frame(time = event_times, surv = survival_prob)

ggplot(df_km, aes(x = time, y = surv)) +
  geom_step(color = "#2E86AB", linewidth = 1.5, direction = "hv") +
  geom_point(color = "#E94F37", size = 3) +
  # 標記跳躍處
  annotate("segment", x = 10, xend = 10, y = 0.75, yend = 0.9,
           arrow = arrow(length = unit(0.3, "cm"), ends = "both"),
           color = "gray30", linetype = "dashed") +
  annotate("text", x = 12, y = 0.825,
           label = "死亡事件發生\n→ 存活率下降", size = 4, hjust = 0) +
  labs(
    title = "Kaplan-Meier 存活曲線",
    subtitle = "階梯函數:在每個死亡事件處跳躍(右連續)",
    x = "時間 (月)",
    y = "存活率 S(t)"
  ) +
  scale_y_continuous(limits = c(0, 1), labels = scales::percent) +
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(face = "bold"))
Figure 3.5: Kaplan-Meier 存活曲線:階梯狀但右連續
TipKaplan-Meier 的右連續性

Kaplan-Meier 曲線在每個死亡事件時間點 \(t\) 處:

  • 左極限\(S(t^-) =\) 死亡前的存活率
  • 函數值\(S(t) =\) 死亡後的存活率
  • 右極限\(S(t^+) = S(t)\)

因此它是右連續的:\(\lim_{s \to t^+} S(s) = S(t)\),但不是左連續的。

3.5.4 累積分布函數 (CDF) 一定連續嗎?

  • 連續型隨機變數:CDF 是連續函數
  • 離散型隨機變數:CDF 是階梯函數(右連續)3
Code
# 連續型:常態分布的 CDF
x_cont <- seq(-4, 4, by = 0.01)
y_cdf_cont <- pnorm(x_cont)

p_cont <- ggplot(data.frame(x = x_cont, y = y_cdf_cont), aes(x, y)) +
  geom_line(color = "#2E86AB", linewidth = 1.5) +
  labs(
    title = "連續型 CDF",
    subtitle = "平滑連續(常態分布)",
    x = "x", y = "F(x)"
  ) +
  theme_minimal(base_size = 13)

# 離散型:二項分布的 CDF
x_disc <- seq(0, 10, by = 0.01)
y_cdf_disc <- pbinom(floor(x_disc), size = 10, prob = 0.5)

p_disc <- ggplot(data.frame(x = x_disc, y = y_cdf_disc), aes(x, y)) +
  geom_line(color = "#E94F37", linewidth = 1.5) +
  geom_point(data = data.frame(x = 0:10, y = pbinom(0:10, 10, 0.5)),
             color = "#E94F37", size = 3) +
  labs(
    title = "離散型 CDF",
    subtitle = "階梯函數(二項分布)",
    x = "x", y = "F(x)"
  ) +
  theme_minimal(base_size = 13)

p_cont | p_disc
Figure 3.6: CDF 的連續性:連續型 vs 離散型

本章重點整理

Tip核心概念
  1. 連續 = 一筆畫完:函數圖形沒有斷點、跳躍、或洞

  2. 連續的三個條件

    • \(f(a)\) 有定義
    • \(\lim_{x \to a} f(x)\) 存在
    • \(\lim_{x \to a} f(x) = f(a)\)
  3. 不連續的類型

    • 可去除(空洞)
    • 跳躍(左右極限不等)
    • 無窮(趨近無窮大)
  4. 統計應用

    • 連續型隨機變數:PDF 必須連續
    • 離散型隨機變數:PMF 不連續也可以
    • 存活分析:Kaplan-Meier 是右連續階梯函數
    • CDF:連續型的 CDF 連續,離散型的 CDF 是階梯函數
  5. 右連續 vs 左連續

    • 右連續:\(\lim_{x \to a^+} f(x) = f(a)\)
    • Kaplan-Meier 曲線是右連續的
Note下一章預告

理解了極限與連續性後,我們即將進入微積分的核心:微分。我們將學習如何計算瞬時變化率,這是理解統計學中 hazard rate、score function、gradient descent 的基礎。

1.
Mood AM, Graybill FA, Boes DC. Introduction to the Theory of Statistics. 3rd ed. McGraw-Hill; 1974.
2.
Kaplan EL, Meier P. Nonparametric estimation from incomplete observations. Journal of the American Statistical Association. 1958;53(282):457-481.
3.
DeGroot MH, Schervish MJ. Probability and Statistics. 4th ed. Pearson; 2012.