---
title: "連續性 (Continuity)"
---
```{r}
#| include: false
source(here::here("R/_common.R"))
library(dplyr)
```
## 學習目標 {.unnumbered}
- 理解連續函數的直觀意義:「一筆畫完」
- 掌握連續性的三個數學條件
- 辨識不同類型的不連續點
- 理解為什麼機率密度函數必須連續
- 理解 Kaplan-Meier 曲線的階梯狀特性
## 概念說明
想像你在畫一條曲線,如果可以**不抬起筆**就畫完整條線,這條曲線就是「連續」的。相反地,如果中間有斷點、跳躍、或洞,你就必須抬筆,這就是「不連續」。
### 連續性的直觀理解
**連續函數**就像:
- 體溫隨時間的變化(不會突然從 36°C 跳到 40°C)
- 血壓的連續監測曲線
- 藥物濃度的衰退過程
**不連續函數**就像:
- 階梯(從一階跳到下一階)
- 開關的狀態(開/關之間沒有中間值)
- 存活狀態(活著 → 死亡,沒有中間狀態)
### 醫學中的例子
**連續**:
- 血糖濃度隨時間變化
- 藥物血中濃度曲線
- 心跳間隔的變化
**不連續**:
- 疾病分期(Stage I, II, III, IV)
- 死亡事件(存活 vs 死亡)
- 用藥狀態(有用藥 vs 沒用藥)
## 視覺化理解
### 連續 vs 不連續
```{r}
#| label: fig-continuous-vs-discontinuous
#| fig-cap: "連續與不連續函數的對比"
#| fig-width: 10
#| fig-height: 8
# 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")
)
)
```
### 連續性的三個條件
一個函數 $f(x)$ 在 $x = a$ 處連續,必須同時滿足三個條件:
```{r}
#| label: fig-three-conditions
#| fig-cap: "連續性的三個條件視覺化"
#| fig-width: 10
#| fig-height: 4
# 建立三個違反不同條件的例子
# 條件 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
```
## 數學定義
### 連續性的正式定義
::: {.callout-note icon="false"}
## 連續函數的定義
函數 $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)$$
:::
### 單側連續
- **右連續**:$\lim_{x \to a^+} f(x) = f(a)$
- **左連續**:$\lim_{x \to a^-} f(x) = f(a)$
在某區間連續,必須在區間內每一點都連續。
### 連續函數的性質
如果 $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))$ 連續(合成函數)
### 不連續的類型
1. **可去除不連續 (Removable)**:有空洞,但可以重新定義函數值來修復
2. **跳躍不連續 (Jump)**:左極限 ≠ 右極限
3. **無窮不連續 (Infinite)**:函數趨近於無窮大
## 練習題
### 觀念題
1. **判斷題**:所有的多項式函數(如 $x^2 + 3x - 5$)都是連續的。(O / X)
::: {.callout-tip collapse="true" title="參考答案"}
**答案:O(正確)**。多項式函數在實數範圍內處處連續,因為它們只涉及加法、減法和乘法運算,這些運算都保持連續性。多項式沒有分母、根號或其他可能造成不連續的運算。
:::
2. **判斷題**:如果 $\lim_{x \to a} f(x)$ 存在,則 $f(x)$ 在 $x = a$ 處一定連續。(O / X)
::: {.callout-tip collapse="true" title="參考答案"}
**答案:X(錯誤)**。連續需要滿足三個條件,極限存在只是其中之一。還需要:(1) $f(a)$ 有定義,以及 (2) 極限值等於函數值。例如「空洞不連續」中,極限存在但函數在該點未定義或定義在錯誤位置。
:::
3. **選擇題**:下列哪個函數在 $x = 0$ 處不連續?
- A:$f(x) = x^2$
- B:$f(x) = |x|$
- C:$f(x) = \frac{1}{x}$
- D:$f(x) = \sin(x)$
::: {.callout-tip collapse="true" title="參考答案"}
**答案:C**。$f(x) = \frac{1}{x}$ 在 $x = 0$ 處未定義(分母為零),且當 $x \to 0$ 時函數趨近於無窮大,屬於「無窮不連續」。其他選項在 $x = 0$ 處都連續:$x^2$ 和 $\sin(x)$ 都是平滑函數,$|x|$ 雖然在 $x = 0$ 處不可微分,但仍然連續。
:::
4. **問答題**:解釋為什麼「體溫」可以用連續函數表示,但「存活狀態」不行。
::: {.callout-tip collapse="true" title="參考答案"}
體溫是連續變化的物理量,可以取任意實數值(如 36.5°C, 36.51°C, 36.512°C...),中間沒有跳躍。存活狀態則是二元變數(活著或死亡),從「活著」到「死亡」是瞬間發生的跳躍,沒有中間狀態,因此必須用不連續的階梯函數表示。這也是為什麼 Kaplan-Meier 存活曲線是階梯狀的。
:::
### 計算題
5. 判斷下列函數在 $x = 2$ 處是否連續:
$$f(x) = \begin{cases}
x^2 & \text{if } x < 2 \\
4 & \text{if } x = 2 \\
2x & \text{if } x > 2
\end{cases}$$
(提示:檢查三個條件)
::: {.callout-tip collapse="true" title="參考答案"}
**連續**。檢查三個條件:
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$ 處連續。
:::
6. 找出 $k$ 的值,使得下列函數在 $x = 1$ 處連續:
$$g(x) = \begin{cases}
x^2 + 1 & \text{if } x \leq 1 \\
kx & \text{if } x > 1
\end{cases}$$
::: {.callout-tip collapse="true" title="參考答案"}
**答案:$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$。
:::
### R 操作題
7. **視覺化練習**:修改下列程式碼,畫出一個在 $x = 0$ 處有跳躍不連續的函數。
```r
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 = "跳躍不連續範例")
```
::: {.callout-tip collapse="true" title="參考答案"}
填入任意不同的常數或函數即可,例如:`y <- ifelse(x < 0, -1, 1)`(階梯函數)或 `y <- ifelse(x < 0, x - 1, x + 1)`(分段線性)。執行後會看到在 $x = 0$ 處有明顯的跳躍,左極限 ≠ 右極限。這種跳躍不連續類似於存活狀態或 Kaplan-Meier 曲線的特性。
:::
8. **絕對值函數**:用 R 畫出 $f(x) = |x|$,並驗證它在 $x = 0$ 處是否連續(提示:它是連續的,但不可微分)。
::: {.callout-tip collapse="true" title="參考答案"}
程式碼:`ggplot(data.frame(x = seq(-2, 2, 0.01)), aes(x, abs(x))) + geom_line()`。觀察:圖形在 $x = 0$ 處呈 V 字型,沒有斷點或跳躍,可以一筆畫完,因此**連續**。左極限 = 右極限 = 0 = $f(0)$,三個條件都滿足。但注意在 $x = 0$ 處有尖角,表示不可微分(這是下一章的主題)。
:::
## 統計應用
### 連續型隨機變數的機率密度函數
在統計學中,**連續型隨機變數**的機率密度函數 (PDF) 必須是連續函數 [@mood1974introduction]。
```{r}
#| label: fig-continuous-pdf
#| fig-cap: "常態分布的 PDF:連續且平滑"
#| fig-width: 9
#| fig-height: 5
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"))
```
::: {.callout-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)$ 也會連續且可微分。
:::
### 離散型隨機變數:不連續也可以
相對地,**離散型隨機變數**的機率質量函數 (PMF) 是不連續的:
```{r}
#| label: fig-discrete-pmf
#| fig-cap: "二項分布的 PMF:不連續的階梯函數"
#| fig-width: 9
#| fig-height: 5
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"))
```
### Kaplan-Meier 存活曲線:有意義的不連續
在存活分析中,Kaplan-Meier 曲線是**右連續**的階梯函數 [@kaplan1958nonparametric]:
```{r}
#| label: fig-kaplan-meier
#| fig-cap: "Kaplan-Meier 存活曲線:階梯狀但右連續"
#| fig-width: 9
#| fig-height: 5
# 模擬簡單的存活資料
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"))
```
::: {.callout-tip}
## Kaplan-Meier 的右連續性
Kaplan-Meier 曲線在每個死亡事件時間點 $t$ 處:
- **左極限**:$S(t^-) =$ 死亡前的存活率
- **函數值**:$S(t) =$ 死亡後的存活率
- **右極限**:$S(t^+) = S(t)$
因此它是**右連續**的:$\lim_{s \to t^+} S(s) = S(t)$,但不是左連續的。
:::
### 累積分布函數 (CDF) 一定連續嗎?
- **連續型隨機變數**:CDF 是連續函數
- **離散型隨機變數**:CDF 是階梯函數(右連續)[@degroot2012probability]
```{r}
#| label: fig-cdf-comparison
#| fig-cap: "CDF 的連續性:連續型 vs 離散型"
#| fig-width: 10
#| fig-height: 5
# 連續型:常態分布的 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
```
## 本章重點整理 {.unnumbered}
::: {.callout-tip icon="false"}
## 核心概念
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 曲線是右連續的
:::
::: {.callout-note}
## 下一章預告
理解了極限與連續性後,我們即將進入微積分的核心:**微分**。我們將學習如何計算**瞬時變化率**,這是理解統計學中 hazard rate、score function、gradient descent 的基礎。
:::