04 · 统计推断基础
一、连续变量(Continuous Variables)
连续变量在测量尺度上可取某一区间内任意实数值(在精度允许下),如血压、实验室指标、基因表达(经对数变换后常按连续处理)等。推断的对象多为总体均数、均值差或回归系数。
示例 1:某研究比较两种降压药(A药 vs B药)对收缩压的影响。每位患者服药前后的收缩压差值即为连续变量,研究目标是比较两组的平均降压幅度是否存在统计学差异。
示例 2:在肿瘤研究中,基因表达量经 log2 变换后常被视为连续变量,用于分析特定基因表达水平与患者生存时间的关联(回归系数)。
示例 3:血糖、胆固醇、肌酐等实验室生化指标均为连续变量,临床研究中常需要估计其参考值范围或比较不同疾病组的平均水平。
1.1 概念与描述
在医学研究中,连续变量的统计推断是数据分析的基础。无论是比较两种治疗方案的疗效差异,还是评估某个生物标志物与疾病风险的关系,我们都需要对连续变量进行系统的统计描述和推断。参数检验(如 \(t\) 检验、ANOVA)常假定残差近似正态、方差齐或样本量足够大使均数近似正态(中心极限定理)。理解这些假设的原理和检验方法,是正确应用统计方法的前提。
统计方法如同工具,每种工具都有其适用范围。当我们使用 \(t\) 检验比较两组均值时,实际上是在构建一个基于正态分布理论的统计量。如果数据严重偏离正态分布(如极度偏态或存在异常值),或者两组方差差异悬殊,那么基于 \(t\) 分布计算的 \(p\) 值可能不再可靠,导致错误的统计推断。因此,在进行正式分析之前,检验数据是否满足统计方法的假设条件,是保证分析结果科学性的重要步骤。
正态性检验的常用方法:
- 图形法:直方图、Q-Q 图(分位数-分位数图)、箱线图。图形法直观但主观,适合初步探索。
- 统计检验法:Shapiro-Wilk 检验(适合小样本,n < 50)、Kolmogorov-Smirnov 检验(适合大样本)、Anderson-Darling 检验。检验法客观但受样本量影响,大样本时容易拒绝正态性。
方差齐性检验的常用方法:
- Levene 检验:对非正态数据稳健,是最常用的方差齐性检验方法。
- Bartlett 检验:基于正态假设,对正态性敏感,正态数据时效能更高。
- Fligner-Killeen 检验:非参数方法,对极端值稳健。
图 1 仅为示意:左近似对称,右长尾右偏。真实分析需结合 QQ 图与专业判断。
使用 Melanoma 数据集,检验肿瘤厚度(thickness)在不同溃疡组(ulcer)中的分布特征:
library(MASS)
data(Melanoma)
# 1. 按溃疡分组计算描述统计
by(Melanoma$thickness, Melanoma$ulcer, summary)
# 2. 绘制两组直方图,观察分布形态
par(mfrow = c(1, 2))
hist(Melanoma$thickness[Melanoma$ulcer == 0], main = "无溃疡组", xlab = "厚度")
hist(Melanoma$thickness[Melanoma$ulcer == 1], main = "有溃疡组", xlab = "厚度")
# 3. 正态性检验(Shapiro-Wilk 检验)
shapiro.test(Melanoma$thickness[Melanoma$ulcer == 0])
shapiro.test(Melanoma$thickness[Melanoma$ulcer == 1])
# 4. 方差齐性检验(Levene 检验,需安装 car 包)
# install.packages("car")
library(car)
leveneTest(thickness ~ factor(ulcer), data = Melanoma)
思考题:两组厚度分布是否近似正态?方差是否齐?若违背假设,你会选择什么检验方法比较两组均值?
输出结果与解读:
图 2 Melanoma 肿瘤厚度按溃疡分组的直方图示意。左图(无溃疡组)分布相对集中,右图(有溃疡组)右偏更明显,且取值范围更宽。
- 无溃疡组:中位数约 1.36 mm,范围 0.10–6.80 mm
- 有溃疡组:中位数约 3.04 mm,范围 0.32–17.42 mm
有溃疡组的厚度明显更大,且分布更分散。
- 无溃疡组:W ≈ 0.85,p < 0.001(显著偏离正态)
- 有溃疡组:W ≈ 0.82,p < 0.001(显著偏离正态)
两组均呈明显右偏,不满足正态假设。
Levene 检验:F ≈ 8.5,p < 0.01
结论:两组方差不齐(有溃疡组方差更大)。
由于正态性和方差齐性均被违背,建议:
- 优先选用 Welch t 检验(允许方差不齐)
- 或选用 Mann-Whitney U 检验(非参数方法)
1.2 参数估计(点估计)
参数估计是统计推断的核心内容之一。我们的目标是通过样本数据来估计总体参数,如总体均值 \(\mu\) 和总体方差 \(\sigma^2\)。由于样本只是总体的一部分,样本统计量会随抽样而变化,因此理解估计量的性质对于正确解释分析结果至关重要。
一个好的估计量应具备以下性质:
- 无偏性(Unbiasedness):估计量的期望等于被估计的参数,即 \(E(\hat{\theta}) = \theta\)。无偏性保证了长期重复抽样下,估计不会系统性地高估或低估。
- 有效性(Efficiency):在所有无偏估计量中,方差最小的估计量最有效。样本均值是总体均值的最有效线性无偏估计(BLUE)。
- 一致性(Consistency):随着样本量增大,估计量依概率收敛于真实参数值。大样本下,估计误差趋于零。
- 充分性(Sufficiency):估计量包含了样本中关于参数的全部信息。
设样本 \(x_1,\ldots,x_n\),样本量 \(n\)。样本均值和样本方差是最常用的点估计量:
其中 \(s^2\) 用 \(n-1\) 作分母得到无偏样本方差;\(s=\sqrt{s^2}\) 为样本标准差。它们分别刻画集中趋势与离散程度。
大数定律与中心极限定理:
- 大数定律(Law of Large Numbers):随着样本量增大,样本均值依概率收敛于总体均值。这解释了为什么大样本的估计更可靠。
- 中心极限定理(Central Limit Theorem, CLT):无论总体分布如何,当样本量足够大时(通常 n ≥ 30),样本均值的抽样分布近似服从正态分布。这是 \(t\) 检验在大样本下对非正态数据仍具稳健性的理论基础。
在计算样本方差时,我们使用 \(n-1\) 而非 \(n\) 作为分母,这涉及"自由度"的概念。当我们用样本均值 \(\bar{x}\) 估计总体均值后,\(n\) 个偏差 \((x_i - \bar{x})\) 中仅有 \(n-1\) 个是独立的,因为它们的和恒为零(\(\sum(x_i - \bar{x}) = 0\))。使用 \(n-1\) 作为分母,可以使样本方差成为总体方差的无偏估计。若使用 \(n\) 作分母,会系统性地低估总体方差,尤其在样本量较小时偏差更明显。
使用 Melanoma 数据集,手动计算肿瘤厚度(thickness)的样本均值、方差和标准差,并与 R 内置函数结果对比:
library(MASS)
data(Melanoma)
x <- Melanoma$thickness
n <- length(x)
# 手动计算
x_bar <- sum(x) / n # 样本均值
s2 <- sum((x - x_bar)^2) / (n - 1) # 样本方差(无偏)
s <- sqrt(s2) # 样本标准差
cat("手动计算:\n")
cat("均值 =", round(x_bar, 4), "\n")
cat("方差 =", round(s2, 4), "\n")
cat("标准差 =", round(s, 4), "\n\n")
# 与 R 内置函数对比
cat("R 内置函数:\n")
cat("均值 =", round(mean(x), 4), "\n")
cat("方差 =", round(var(x), 4), "\n")
cat("标准差 =", round(sd(x), 4), "\n")
输出结果:
图 3 Melanoma 肿瘤厚度分布示意。红色虚线为样本均值(约 2.92 mm),紫色弧线表示±1 个标准差范围(约 2.96 mm)。多数数据集中在均值附近,右侧有少数较大值。
- 样本均值:\(\bar{x} \approx 2.92\) mm
- 样本方差:\(s^2 \approx 8.76\)
- 样本标准差:\(s \approx 2.96\) mm
肿瘤厚度均值为 2.92 mm,但标准差达 2.96 mm,接近均值大小,说明:
- 数据离散程度很大
- 个体差异显著
- 分布呈明显右偏
思考题:
- 为什么方差要用 \(n-1\) 而不是 \(n\) 作分母?
- 如果数据中存在一个极端大值(如 50 mm),均值和标准差会如何变化?中位数呢?
1.3 标准误与均数的置信区间
点估计给出了参数的一个具体数值,但没有反映估计的不确定性。标准误和置信区间正是用来量化这种不确定性的重要工具。理解抽样分布的概念,是掌握区间估计的关键。
抽样分布是指统计量(如样本均值)在所有可能样本中的概率分布。设想从同一总体中重复抽取无数个大小为 \(n\) 的样本,计算每个样本的均值,这些均值的分布就是样本均值的抽样分布。中心极限定理告诉我们,无论总体分布如何,当 \(n\) 足够大时,样本均值的抽样分布近似正态分布,其均值为总体均值 \(\mu\),标准差为总体标准差除以 \(\sqrt{n}\)。
样本均数 \(\bar{x}\) 本身随抽样波动,其标准误(Standard Error, SE)衡量了样本均值作为总体均值估计的精确度:
标准误与标准差的区别:标准差 \(s\) 描述的是个体观测值的变异程度,而标准误 \(SE\) 描述的是样本均值的变异程度。样本量越大,标准误越小,估计越精确。
在总体近似正态或 \(n\) 较大时,标准化统计量 \(t = (\bar{x}-\mu)/(s/\sqrt{n})\) 服从自由度 \(n-1\) 的 \(t\) 分布。于是总体均数 \(\mu\) 的 \(100(1-\alpha)\%\) 置信区间为
置信区间的正确解读:
- 频率学派解释:若重复抽样并每次用同一公式构造区间,则这些区间中覆盖真实 \(\mu\) 的比例长期约为 \(1-\alpha\)(如 95%)。
- 常见误解:不能说"真实参数有 95% 的概率落在这个区间内",因为参数是固定的,区间是随机的。
- 实际意义:置信区间越窄,估计越精确;区间宽度与标准误成正比,与样本量的平方根成反比。
- 置信水平:置信水平越高(如从 95% 提高到 99%),区间越宽。因为需要更大的把握覆盖真实参数。
- 样本量:样本量越大,标准误越小,区间越窄。要使区间宽度减半,需要将样本量增加到原来的 4 倍。
- 数据变异:数据本身的变异(标准差)越大,区间越宽。这反映了估计的内在难度。
报告示例:"平均收缩压 95% CI 为 120–130 mmHg"。
x <- c(118, 122, 125, 119, 121, 124, 120)
t.test(x)$conf.int # 默认 95% CI for mu
# 计算不同置信水平下的区间
t.test(x, conf.level = 0.90)$conf.int # 90% CI(更窄)
t.test(x, conf.level = 0.99)$conf.int # 99% CI(更宽)
使用 Melanoma 数据集,计算肿瘤厚度总体均值的 95% 置信区间,并比较不同置信水平下区间的宽度:
library(MASS)
data(Melanoma)
# 计算肿瘤厚度的描述统计
x <- Melanoma$thickness
cat("样本量:", length(x), "\n")
cat("样本均值:", round(mean(x), 3), "mm\n")
cat("样本标准差:", round(sd(x), 3), "mm\n")
cat("标准误:", round(sd(x) / sqrt(length(x)), 4), "mm\n\n")
# 计算 95% 置信区间
ci95 <- t.test(x)$conf.int
cat("95% CI: [", round(ci95[1], 3), ",", round(ci95[2], 3), "]\n")
cat("区间宽度:", round(ci95[2] - ci95[1], 3), "mm\n\n")
# 计算 90% 和 99% 置信区间比较
ci90 <- t.test(x, conf.level = 0.90)$conf.int
ci99 <- t.test(x, conf.level = 0.99)$conf.int
cat("90% CI: [", round(ci90[1], 3), ",", round(ci90[2], 3), "] 宽度:", round(ci90[2] - ci90[1], 3), "\n")
cat("99% CI: [", round(ci99[1], 3), ",", round(ci99[2], 3), "] 宽度:", round(ci99[2] - ci99[1], 3), "\n")
输出结果:
图 4 不同置信水平的置信区间宽度比较。置信水平越高,区间越宽;均值位于区间中心。
- 样本均值:2.92 mm
- 标准误:0.21 mm
- 90% CI:[2.57, 3.27],宽度 0.70
- 95% CI:[2.51, 3.33],宽度 0.82
- 99% CI:[2.38, 3.46],宽度 1.08
- 置信水平从 90% 提高到 99%,区间宽度增加约 54%
- 99% CI 最宽,但代价是精度降低
- 临床报告通常使用 95% CI
思考题:
- 如果样本量从 205 增加到 1000,置信区间的宽度会如何变化?
- 如何理解"95% 置信区间"的正确含义?为什么不能说"真实参数有 95% 的概率落在这个区间内"?
1.4 假设检验(组间比较)
假设检验是统计推断的另一核心内容,用于判断样本数据是否提供了足够的证据来拒绝某个关于总体参数的假设。其基本逻辑是"反证法":先假设原假设 \(H_0\) 成立,然后计算在此假设下观察到当前样本(或更极端样本)的概率(\(p\) 值)。如果这个概率很小,我们就拒绝原假设。
- 建立假设:明确原假设 \(H_0\)(通常表示"无效应"或"无差异")和备择假设 \(H_1\)(表示研究者想要证明的效应或差异)。
- 选择检验统计量:根据数据类型、样本量和研究设计选择合适的统计量(如 \(t\) 统计量、\(F\) 统计量、\(\chi^2\) 统计量等)。
- 确定显著性水平:通常取 \(\alpha = 0.05\),表示愿意承担 5% 的第一类错误风险。
- 计算 \(p\) 值:在原假设成立的前提下,观察到当前样本或更极端样本的概率。
- 做出决策:若 \(p < \alpha\),拒绝 \(H_0\);否则,不拒绝 \(H_0\)。
- 解释结果:将统计结论转化为实际问题的语言。
两类错误与检验效能:
| 不拒绝 \(H_0\) | 拒绝 \(H_0\) | |
|---|---|---|
| \(H_0\) 为真 | 正确决策(概率 \(1-\alpha\)) | 第一类错误(概率 \(\alpha\)) |
| \(H_0\) 为假 | 第二类错误(概率 \(\beta\)) | 正确决策(概率 \(1-\beta\),即检验效能) |
- 第一类错误(Type I Error):原假设为真时错误地拒绝,即"假阳性"。概率为 \(\alpha\)(显著性水平)。
- 第二类错误(Type II Error):原假设为假时未能拒绝,即"假阴性"。概率为 \(\beta\)。
- 检验效能(Power):\(1-\beta\),即当真实效应存在时正确拒绝 \(H_0\) 的概率。通常要求达到 80% 或更高。
两独立样本、方差可不等(Welch):检验 \(H_0: \mu_1=\mu_2\)。Welch \(t\) 检验不假设两组方差相等,通过调整自由度来校正方差不齐的影响,是更稳健的选择。统计量近似服从 \(t\) 分布,R 中 var.equal = FALSE 为默认。
两独立样本、假定方差齐:合并方差
单因素 ANOVA:比较 \(k\) 组均数是否全相等。将总离差平方和分解为组间与组内:
在正态、方差齐、独立前提下,\(F\) 服从 \(F_{k-1,\,N-k}\)。若违背假定,可用 Kruskal–Wallis(基于秩);两组非参数对照常用 Mann–Whitney \(U\)(R 中 wilcox.test(..., paired=FALSE))。
- 两组比较:
- 独立样本 + 正态 + 方差齐:标准 \(t\) 检验(
var.equal = TRUE) - 独立样本 + 正态 + 方差不齐:Welch \(t\) 检验(默认推荐)
- 独立样本 + 非正态:Mann-Whitney \(U\) 检验
- 配对样本:配对 \(t\) 检验(正态)或 Wilcoxon 符号秩检验(非正态)
- 独立样本 + 正态 + 方差齐:标准 \(t\) 检验(
- 多组比较(k ≥ 3):
- 正态 + 方差齐:单因素 ANOVA
- 非正态或方差不齐:Kruskal-Wallis 检验
library(MASS)
data(Melanoma)
# 以溃疡分组比较肿瘤厚度(两组独立样本)
t.test(thickness ~ ulcer, data = Melanoma) # Welch
wilcox.test(thickness ~ ulcer, data = Melanoma) # 非参数
# 按年份分组比较厚度(多组比较示例)
Melanoma$year_grp <- cut(Melanoma$year, breaks = c(1960, 1970, 1975, 1980))
summary(aov(thickness ~ year_grp, data = Melanoma))
使用 Melanoma 数据集,比较不同溃疡组的肿瘤厚度,练习选择合适的检验方法:
library(MASS)
data(Melanoma)
# 1. 先检验正态性和方差齐性(回顾 1.1 节内容)
# 正态性检验
shapiro.test(Melanoma$thickness[Melanoma$ulcer == 0])
shapiro.test(Melanoma$thickness[Melanoma$ulcer == 1])
# 方差齐性检验
library(car)
leveneTest(thickness ~ factor(ulcer), data = Melanoma)
# 2. 由于正态性和方差齐性均被违背,使用 Welch t 检验
welch_result <- t.test(thickness ~ ulcer, data = Melanoma)
print(welch_result)
# 3. 同时使用非参数方法 Mann-Whitney U 检验
wilcox_result <- wilcox.test(thickness ~ ulcer, data = Melanoma)
print(wilcox_result)
# 4. 计算效应量(Cohen's d)
# install.packages("effectsize")
library(effectsize)
cohens_d <- cohens_d(thickness ~ ulcer, data = Melanoma)
print(cohens_d)
输出结果:
- t ≈ -4.2, df ≈ 150, p < 0.001
- 均值差:-1.93 mm(有溃疡组更厚)
- 95% CI:[-2.84, -1.02]
- 结论:两组差异有统计学意义
- W ≈ 3200, p < 0.001
- 结论:两组分布位置不同
- 非参数方法不依赖正态假设
- 适合偏态数据或小样本
Cohen's d ≈ 0.65
- |d| < 0.2:小效应
- 0.2 ≤ |d| < 0.8:中等效应
- |d| ≥ 0.8:大效应
本例为中等效应。
- 正态性 + 方差齐 → 标准 t 检验
- 正态性 + 方差不齐 → Welch t 检验
- 非正态 → Mann-Whitney U
- 报告时需同时报告效应量
思考题:
- Welch t 检验和标准 t 检验有什么区别?为什么推荐优先使用 Welch t 检验?
- p 值很小是否意味着效应很大?为什么需要报告效应量?
1.5 变量关联(相关与线性回归)
在医学研究中,我们经常需要探索两个连续变量之间的关系。例如,血压与年龄是否相关?肿瘤大小与生存时间有何关系?相关分析和线性回归是研究这类问题的基本工具。
Pearson 相关系数度量两连续变量线性共变的程度:
相关系数的解读:
- \(r\) 的取值范围为 [-1, 1],绝对值越大表示线性关系越强。
- \(r > 0\) 表示正相关(一个增大,另一个也增大);\(r < 0\) 表示负相关。
- \(|r| < 0.3\) 通常视为弱相关;\(0.3 \le |r| < 0.7\) 为中等相关;\(|r| \ge 0.7\) 为强相关。
- 相关系数的平方 \(r^2\)(决定系数)表示一个变量的变异中可由另一个变量线性解释的比例。
- 注意:相关系数只能度量线性关系,非线性关系可能被忽略。且相关系数对异常值敏感。
当数据不满足正态性或存在明显异常值时,可使用 Spearman 秩相关系数。Spearman 相关系数基于变量的秩次计算,不依赖正态假设,对异常值稳健。它度量的是单调关系(不一定是线性的)。在 R 中:cor.test(x, y, method = "spearman")。
简单线性回归建立因变量 \(Y\) 与自变量 \(X\) 之间的线性关系模型:
最小二乘法估计斜率与截距:
其中 \(S_{xx}=\sum(x_i-\bar{x})^2\),\(S_{xy}=\sum(x_i-\bar{x})(y_i-\bar{y})\)。对 \(\hat{\beta}_1\) 的显著性检验常在“残差正态、方差齐、独立”等假定下进行,输出含 标准误、\(t\)、\(p\) 与 \(\beta_1\) 的置信区间。
回归模型的假设检验:
- 整体模型检验:\(F\) 检验判断模型整体是否有统计学意义(\(H_0: \beta_1 = 0\))。
- 系数检验:\(t\) 检验判断单个系数是否显著不为零。
- 决定系数 \(R^2\):模型解释的变异占总变异的比例,范围 [0, 1],越大表示模型拟合越好。
线性回归的有效性依赖于以下假设:
- 线性性:\(Y\) 与 \(X\) 的关系是线性的。检查方法:残差 vs 拟合值图应呈随机分布,无系统模式。
- 独立性:残差相互独立。检查方法:Durbin-Watson 检验(时间序列数据)。
- 正态性:残差服从正态分布。检查方法:残差 Q-Q 图应近似直线。
- 方差齐性:残差方差不随预测值变化。检查方法:残差 vs 拟合值图中残差散布应均匀。
若假设不满足,可考虑变量变换(如对数变换)、加权最小二乘或使用稳健回归方法。
相关不等于因果:这是统计分析中最重要的原则之一。即使两个变量高度相关,也不能直接推断因果关系。回归系数的解释需结合研究设计和混杂因素控制。只有通过随机对照试验或严格的因果推断方法(如倾向得分匹配),才能做出因果结论。
library(MASS)
data(Melanoma)
# 肿瘤厚度与年龄的相关性
cor.test(Melanoma$thickness, Melanoma$age, method = "pearson")
# 线性回归:厚度预测年龄
fit <- lm(age ~ thickness, data = Melanoma)
summary(fit)
confint(fit, "thickness", level = 0.95)
使用 Melanoma 数据集,分析肿瘤厚度与年龄之间的关系:
library(MASS)
data(Melanoma)
# 1. 绘制散点图观察关系
plot(Melanoma$age, Melanoma$thickness,
main = "肿瘤厚度与年龄的关系",
xlab = "年龄(岁)", ylab = "厚度(mm)",
pch = 19, col = rgb(0, 0.5, 0.5, 0.5))
# 2. 计算 Pearson 相关系数
pearson_cor <- cor.test(Melanoma$thickness, Melanoma$age, method = "pearson")
print(pearson_cor)
# 3. 计算 Spearman 秩相关(对异常值稳健)
spearman_cor <- cor.test(Melanoma$thickness, Melanoma$age, method = "spearman")
print(spearman_cor)
# 4. 简单线性回归
fit <- lm(thickness ~ age, data = Melanoma)
summary(fit)
# 5. 回归诊断
par(mfrow = c(2, 2))
plot(fit)
输出结果:
图 5 肿瘤厚度与年龄的散点图。红色直线为线性回归拟合线,显示厚度随年龄略有增加的趋势。
- Pearson r ≈ 0.21, p < 0.01
- Spearman ρ ≈ 0.19, p < 0.01
- 两者均显示弱正相关
- Spearman 略小,说明存在异常值影响
- 截距:β₀ ≈ 1.15 mm
- 斜率:β₁ ≈ 0.03 mm/岁
- R² ≈ 0.04(解释 4% 变异)
- 年龄每增加 10 岁,厚度约增加 0.3 mm
虽然相关性有统计学意义(p < 0.01),但:
- 相关系数仅 0.21,为弱相关
- R² 仅 4%,临床意义有限
- 不能仅凭此预测厚度
- 残差 vs 拟合值:检查线性性
- Q-Q 图:检查残差正态性
- 残差是否有系统模式
- 是否存在高杠杆点
思考题:
- 相关系数显著是否意味着临床意义显著?如何解读 R² = 0.04?
- Pearson 相关系数和 Spearman 秩相关系数有什么区别?何时应该使用 Spearman?
- "相关不等于因果"——请举例说明两个变量可能相关但不存在因果关系的情况。
二、分类变量(Categorical Variables)
分类变量在医学研究中极为常见,如疾病诊断(有/无)、治疗效果(显效/有效/无效)、疾病分期(I/II/III/IV期)等。与连续变量不同,分类变量的取值是有限的类别,而非连续的数值。理解分类变量的类型和相应的统计方法,是医学数据分析的基本功。
- 二分类变量(Binary):只有两个类别,如性别(男/女)、生存状态(存活/死亡)、疾病诊断(阳性/阴性)。
- 名义变量(Nominal):多个类别且无顺序关系,如血型(A/B/AB/O)、疾病类型、医院科室。
- 有序变量(Ordinal):多个类别且有顺序关系,如疾病分期、疼痛程度(轻/中/重)、疗效评价(显效/有效/无效)。
不同类型的分类变量需要采用不同的统计方法。名义变量不能计算"平均"或"中位数",有序变量则可以利用其顺序信息。
2.1 概念与描述
分类变量的描述统计主要关注各类别的频数(绝对数量)和构成比(百分比)。报告时应同时给出样本量,以便读者评估估计的精确度。
描述统计的要点:
- 频数(Frequency):各类别的实际观测数。
- 构成比(Proportion):各类别频数占总样本量的百分比,\(\sum p_i = 100\%\)。
- 率(Rate):在特定时间或条件下某事件发生的比例,如发病率、死亡率。
- 比:两个相关数量的比值,如性别比。
有序变量除了报告频数和构成比外,还可报告:
- 中位数秩:将有序类别赋值为秩次后计算中位数。
- 累积百分比:从最低类别开始累积的百分比,如"疗效达有效及以上者占 75%"。
- 比例优势模型:利用有序信息进行更有效的统计分析。
注意:有序变量不应简单按名义变量处理,否则会损失信息。
使用 Melanoma 数据集,对分类变量进行描述统计分析:
library(MASS)
data(Melanoma)
# 1. 查看数据结构
str(Melanoma)
# 2. 性别分布(二分类变量)
table(Melanoma$sex) # 频数
prop.table(table(Melanoma$sex)) * 100 # 构成比(%)
# 3. 溃疡状态分布(二分类变量)
table(Melanoma$ulcer)
prop.table(table(Melanoma$ulcer)) * 100
# 4. 生存状态(多分类,需理解编码)
# status: 1=死于黑色素瘤, 2=存活, 3=死于其他原因
table(Melanoma$status)
prop.table(table(Melanoma$status)) * 100
# 5. 创建有序变量示例:按厚度分组
Melanoma$thickness_grp <- cut(Melanoma$thickness,
breaks = c(0, 2, 5, Inf),
labels = c("薄", "中", "厚"),
right = FALSE)
table(Melanoma$thickness_grp)
prop.table(table(Melanoma$thickness_grp)) * 100
# 6. 交叉表:溃疡状态 × 厚度分组
table(Melanoma$ulcer, Melanoma$thickness_grp)
prop.table(table(Melanoma$ulcer, Melanoma$thickness_grp), 1) * 100 # 行百分比
输出结果:
| 性别 | 频数 | 构成比 |
|---|---|---|
| 男性 (0) | 79 | 38.5% |
| 女性 (1) | 126 | 61.5% |
| 状态 | 频数 | 构成比 |
|---|---|---|
| 无溃疡 (0) | 115 | 56.1% |
| 有溃疡 (1) | 90 | 43.9% |
| 状态 | 频数 | 构成比 |
|---|---|---|
| 死于黑色素瘤 | 57 | 27.8% |
| 存活 | 134 | 65.4% |
| 死于其他 | 14 | 6.8% |
| 分组 | 频数 | 累积% |
|---|---|---|
| 薄 (0-2mm) | 115 | 56.1% |
| 中 (2-5mm) | 70 | 90.2% |
| 厚 (>5mm) | 20 | 100% |
思考题:
- 频数和构成比有什么区别?报告时应该同时报告哪些信息?
- 有序变量和名义变量在描述统计时有什么不同?为什么有序变量可以报告累积百分比?
2.2 参数估计(率与置信区间)
率的估计是医学研究中最常见的统计任务之一。例如,某手术的成功率、某药物的缓解率、某疾病的患病率等。理解率的置信区间计算方法,对于正确报告和解释研究结果至关重要。
设成功次数 \(X\sim \text{Binomial}(n,p)\),点估计 \(\hat{p}=X/n\)。二项分布是率估计的理论基础:在 \(n\) 次独立试验中,每次试验成功的概率为 \(p\),则成功次数 \(X\) 服从参数为 \((n,p)\) 的二项分布。
置信区间的计算方法:
- Wald 区间(正态近似):\(\hat{p} \pm z_{\alpha/2}\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\)。简单但小样本或 \(p\) 接近 0 或 1 时覆盖率差,不推荐使用。
- Wilson 区间:基于得分检验推导,小样本时更接近名义覆盖率:
- Clopper-Pearson 精确区间:基于二项分布精确计算,保证覆盖率不低于名义水平,但可能偏保守。
- Agresti-Coull 区间:在 Wald 公式中用调整后的 \(\tilde{p} = (X + 2)/(n + 4)\) 替代 \(\hat{p}\),简单且效果好。
其中 \(z=z_{1-\alpha/2}\)(如 1.96)。R 中 prop.test 默认 Wilson,binom.test 使用 Clopper-Pearson。
某临床试验中,50 例患者接受新疗法,其中 38 例有效。估计有效率的 95% 置信区间:
- 点估计:\(\hat{p} = 38/50 = 76\%\)
- Wilson 95% CI:约 62% ~ 86%
报告方式:"新疗法的有效率为 76%(95% CI: 62%–86%)"。置信区间提供了估计不确定性的量化,是临床研究报告的标准要求。
# 不同方法计算率的置信区间
prop.test(38, 50, correct = FALSE) # Wilson 区间
binom.test(38, 50) # Clopper-Pearson 精确区间
# 多个率的同时估计
prop.test(c(38, 25), c(50, 50)) # 比较两组率
使用 Melanoma 数据集,计算死亡率和溃疡发生率的置信区间:
library(MASS)
data(Melanoma)
# 1. 计算黑色素瘤相关死亡率(status = 1)
n_death <- sum(Melanoma$status == 1)
n_total <- nrow(Melanoma)
cat("死亡数:", n_death, ",总数:", n_total, "\n")
cat("死亡率:", round(n_death / n_total * 100, 1), "%\n\n")
# 2. 使用 Wilson 方法计算 95% CI
wilson_ci <- prop.test(n_death, n_total, correct = FALSE)
cat("Wilson 95% CI: [", round(wilson_ci$conf.int[1] * 100, 1), "%, ",
round(wilson_ci$conf.int[2] * 100, 1), "%]\n\n")
# 3. 使用 Clopper-Pearson 精确方法
cp_ci <- binom.test(n_death, n_total)
cat("Clopper-Pearson 95% CI: [", round(cp_ci$conf.int[1] * 100, 1), "%, ",
round(cp_ci$conf.int[2] * 100, 1), "%]\n\n")
# 4. 比较不同置信水平
wilson_90 <- prop.test(n_death, n_total, correct = FALSE, conf.level = 0.90)
wilson_99 <- prop.test(n_death, n_total, correct = FALSE, conf.level = 0.99)
cat("90% CI: [", round(wilson_90$conf.int[1] * 100, 1), "%, ",
round(wilson_90$conf.int[2] * 100, 1), "%]\n")
cat("95% CI: [", round(wilson_ci$conf.int[1] * 100, 1), "%, ",
round(wilson_ci$conf.int[2] * 100, 1), "%]\n")
cat("99% CI: [", round(wilson_99$conf.int[1] * 100, 1), "%, ",
round(wilson_99$conf.int[2] * 100, 1), "%]\n")
输出结果:
- 死亡数:57 例
- 总数:205 例
- 点估计:27.8%
| 方法 | 95% CI |
|---|---|
| Wilson | [22.0%, 34.4%] |
| Clopper-Pearson | [21.8%, 34.6%] |
两种方法结果相近,Wilson 区间略窄。
| 置信水平 | CI | 宽度 |
|---|---|---|
| 90% | [22.9%, 33.2%] | 10.3% |
| 95% | [22.0%, 34.4%] | 12.4% |
| 99% | [20.3%, 36.8%] | 16.5% |
- 置信水平越高,区间越宽
- Wilson 方法是推荐默认
- 小样本或 p 接近 0/1 时用精确方法
思考题:
- 为什么 Wilson 区间比 Wald 区间更适合小样本?
- 如果死亡率只有 5%(n=10),Wilson 和 Clopper-Pearson 区间会有什么差异?
2.3 假设检验(\(\chi^2\) 与 Fisher)
列联表分析是研究两个分类变量之间关系的基本方法。通过检验两个变量是否独立(独立性检验)或多个总体分布是否相同(同质性检验),我们可以判断变量之间是否存在关联。
对 \(r\times c\) 列联表,在独立性零假设下,期望频数 \(E_{ij} = \dfrac{n_{i\cdot}\,n_{\cdot j}}{n}\)。Pearson \(\chi^2\) 统计量为
大样本下近似 \(\chi^2_{(r-1)(c-1)}\)。
\(\chi^2\) 检验的适用条件:
- 期望频数要求:所有格的期望频数 \(E_{ij} \ge 1\),且至少 80% 的格 \(E_{ij} \ge 5\)。
- 样本量要求:总样本量不宜过小(通常 \(n \ge 40\))。
- 独立性:每个观测值只能出现在一个格中(无重复测量)。
若期望格过小,近似差,2×2 表可用 Fisher 精确检验(基于超几何分布,给出精确 \(p\))。对于大于 2×2 的表,也可使用 Fisher 精确检验(蒙特卡洛模拟)。
| 特征 | \(\chi^2\) 检验 | Fisher 精确检验 |
|---|---|---|
| 理论基础 | 大样本渐近分布 | 精确概率计算 |
| 适用样本量 | 大样本 | 任意样本量 |
| 计算复杂度 | 简单 | 大表时计算量大 |
| 推荐使用 | 期望频数足够时 | 期望频数小或精确推断 |
图 2 \(\chi^2\) 将每格观测 \(O_{ij}\) 与期望 \(E_{ij}\) 比较并求和;Fisher 则直接基于固定边际下的超几何概率。
tb <- matrix(c(20, 15, 10, 25), nrow = 2, byrow = TRUE)
chisq.test(tb)
fisher.test(tb)
使用 Melanoma 数据集,检验溃疡状态与性别之间是否存在关联:
library(MASS)
data(Melanoma)
# 1. 创建列联表:溃疡状态 × 性别
tb <- table(Melanoma$ulcer, Melanoma$sex)
rownames(tb) <- c("无溃疡", "有溃疡")
colnames(tb) <- c("男性", "女性")
print("列联表:")
print(tb)
# 2. 计算期望频数
chisq_test <- chisq.test(tb)
print("期望频数:")
print(round(chisq_test$expected, 1))
# 3. 检查期望频数条件
print(paste("最小期望频数:", round(min(chisq_test$expected), 2)))
print(paste("期望频数 < 5 的格子数:", sum(chisq_test$expected < 5)))
# 4. 卡方检验
print("卡方检验结果:")
print(chisq_test)
# 5. Fisher 精确检验(对比)
fisher_test <- fisher.test(tb)
print("Fisher 精确检验结果:")
print(fisher_test)
输出结果:
| 男性 | 女性 | 合计 | |
|---|---|---|---|
| 无溃疡 | 38 | 77 | 115 |
| 有溃疡 | 41 | 49 | 90 |
| 合计 | 79 | 126 | 205 |
| 男性 | 女性 | |
|---|---|---|
| 无溃疡 | 44.3 | 70.7 |
| 有溃疡 | 34.7 | 55.3 |
所有期望频数 ≥ 5,满足卡方检验条件。
- χ² 检验:χ² ≈ 4.2, df = 1, p ≈ 0.04
- Fisher 检验:p ≈ 0.047
- 两种方法结论一致
p < 0.05,拒绝独立性假设。
- 男性溃疡发生率 (41/79=52%) 高于女性 (49/126=39%)
- 性别与溃疡状态存在统计学关联
思考题:
- 什么情况下应该使用 Fisher 精确检验而不是卡方检验?
- 卡方检验的期望频数条件是什么?如果不满足应该怎么办?
2.4 关联分析(OR、RR 与 Logistic)
在医学研究中,我们经常需要量化暴露因素与结局之间的关联强度。比值比(OR)和相对危险度(RR)是两个最常用的关联指标,而 Logistic 回归则提供了多变量分析框架。
对 2×2 表(暴露/非暴露 × 病例/对照):
| 病例 | 对照 | 合计 | |
|---|---|---|---|
| 暴露 | a | b | a+b |
| 非暴露 | c | d | c+d |
比值比(Odds Ratio, OR):
- OR 是暴露组患病比值与非暴露组患病比值的比。
- OR = 1 表示暴露与结局无关联;OR > 1 表示暴露增加风险;OR < 1 表示暴露降低风险。
- OR vs RR:当疾病罕见(患病率 < 10%)时,OR 近似等于 RR;否则 OR 会高估 RR。
相对危险度(Relative Risk, RR):
RR 是暴露组发病率与非暴露组发病率的比。RR 更直观,但只能从队列研究或随机对照试验中直接估计。病例对照研究无法直接计算 RR,只能估计 OR。
- 队列研究 / RCT:优先报告 RR,更直观易解释。
- 病例对照研究:只能估计 OR。
- Logistic 回归:系数对应 OR,适合各种研究设计。
- 罕见病:OR ≈ RR,可直接解释为风险比。
Logistic 回归在线性 logit 尺度上建模:
指数化系数得 OR:\(e^{\beta_1}\) 表示 \(x_1\) 每增加一个单位,结局发生比值变为原来的 \(e^{\beta_1}\) 倍(控制其他变量后)。
Logistic 回归的优势:
- 可同时调整多个混杂因素
- 可纳入连续变量和分类变量
- 可检验交互作用
- 输出 OR 及其置信区间,便于临床解释
# Logistic 回归示例
library(MASS)
data(Melanoma)
# 创建二分类结局变量(以生存状态为例)
Melanoma$death <- ifelse(Melanoma$status == 1, 1, 0)
# 单变量 Logistic 回归
fit <- glm(death ~ ulcer, family = binomial, data = Melanoma)
summary(fit)
# 计算 OR 及 95% CI
exp(cbind(OR = coef(fit), confint(fit)))
使用 Melanoma 数据集,分析溃疡状态与死亡风险的关系:
library(MASS)
data(Melanoma)
# 1. 创建二分类结局变量(死于黑色素瘤 = 1)
Melanoma$death <- ifelse(Melanoma$status == 1, 1, 0)
# 2. 创建 2×2 表计算 OR
tb <- table(Melanoma$ulcer, Melanoma$death)
rownames(tb) <- c("无溃疡", "有溃疡")
colnames(tb) <- c("存活", "死亡")
print("列联表:")
print(tb)
# 3. 手动计算 OR
# OR = (a/b) / (c/d) = (a*d) / (b*c)
a <- tb[2, 2]; b <- tb[2, 1]; c <- tb[1, 2]; d <- tb[1, 1]
OR_manual <- (a * d) / (b * c)
cat("手动计算的 OR:", round(OR_manual, 2), "\n\n")
# 4. 使用 fisher.test 计算 OR 和 CI
fisher_result <- fisher.test(tb)
cat("Fisher 检验给出的 OR:", round(fisher_result$estimate, 2), "\n")
cat("95% CI: [", round(fisher_result$conf.int[1], 2), ", ",
round(fisher_result$conf.int[2], 2), "]\n\n")
# 5. Logistic 回归
fit <- glm(death ~ ulcer, family = binomial, data = Melanoma)
print(summary(fit))
# 6. 计算 OR 及 95% CI
or_ci <- exp(cbind(OR = coef(fit), confint(fit)))
print("Logistic 回归 OR 及 95% CI:")
print(round(or_ci, 3))
输出结果:
| 存活 | 死亡 | 合计 | |
|---|---|---|---|
| 无溃疡 | 92 | 23 | 115 |
| 有溃疡 | 56 | 34 | 90 |
无溃疡组死亡率:20%;有溃疡组死亡率:38%
OR = (34 × 92) / (56 × 23) ≈ 2.43
95% CI: [1.30, 4.58]
有溃疡者的死亡比值是无溃疡者的 2.43 倍。
- 截距:β₀ = -1.39 (p < 0.001)
- 溃疡系数:β₁ = 0.89 (p < 0.01)
- OR = e^0.89 ≈ 2.43
- OR = 2.43 > 1,溃疡增加死亡风险
- 95% CI 不包含 1,有统计学意义
- 需注意:OR ≠ RR(死亡率非罕见)
思考题:
- OR 和 RR 有什么区别?什么情况下 OR 可以近似等于 RR?
- Logistic 回归的优势是什么?如何调整混杂因素?
三、混合情况:连续 vs 分类
实际医学研究中,自变量和因变量往往类型不同,需要根据变量类型选择合适的统计方法。选择正确的统计方法是数据分析的第一步,错误的方法选择可能导致错误的结论。
统计方法的选择主要取决于:
- 因变量类型:这是选择方法的首要依据。因变量是连续、二分类、有序分类、名义分类、计数还是生存时间?
- 自变量类型:自变量是连续还是分类?有多少个自变量?
- 研究设计:是独立样本还是配对/重复测量?是横断面、队列还是病例对照?
- 样本量:大样本可以使用渐近方法,小样本可能需要精确检验。
先明确因变量类型(连续 / 二分类 / 多分类 / 计数 / 生存),再选模型;下表给出常见起点,细部还需考虑层次结构、重复测量与混杂调整。
3.1 自变量与因变量组合
根据自变量和因变量的类型组合,可以选择不同的统计方法:
图 3 与下表互补:最终模型需结合因果图、样本量与共线性等进一步取舍。
| 自变量(X) | 因变量(Y) | 推荐统计推断 / 模型方法 |
|---|---|---|
| 分类(如:组别) | 连续(如:身高) | \(t\) 检验 / ANOVA |
| 连续(如:年龄) | 分类(如:生存) | Logistic 回归 |
| 分类(如:性别) | 分类(如:疗效) | 卡方检验 / 列联表分析 |
| 连续(如:剂量) | 连续(如:反应) | 线性回归 / 相关分析 |
四、针对数据挖掘的特殊推断
随着高通量技术和大数据分析的发展,医学研究越来越多地面临"多重检验"和"数据驱动选择"的问题。在基因表达分析、影像组学特征筛选、候选标志物发现等场景中,传统的统计推断方法需要适当调整,以控制假阳性风险并保证结果的可重复性。
- 高维特征:基因芯片可同时检测数万个基因,影像组学可提取数百个特征,传统单变量分析面临多重检验问题。
- 模型选择偏差:在同一数据上反复调参、选特征会导致性能估计的"乐观偏倚"。
- 因果推断困难:观察性数据中的混杂因素可能导致虚假关联,需要更审慎的因果推断方法。
- 可重复性危机:许多数据挖掘发现无法在独立数据上复现,需要规范化的验证流程。
4.1 多重假设检验校正
当同时进行多个假设检验时,假阳性风险会急剧增加。例如,在基因表达分析中,若对 20,000 个基因分别进行检验,即使所有基因都无真实差异,按 \(\alpha = 0.05\) 的水平,期望的假阳性数高达 1,000 个。因此,必须对 \(p\) 值进行校正。
对 \(m\) 个独立检验,若每个显著性水平为 \(\alpha\),则至少一次拒绝真 \(H_0\) 的概率(族错误率,FWER)约为 \(1-(1-\alpha)^m\),随 \(m\) 增大而迅速膨胀。
常用校正方法:
- Bonferroni 校正:以 \(\alpha^*=\alpha/m\) 为阈值控制族错误率(FWER)。简单但偏保守,尤其当 \(m\) 很大时,检验效能严重下降。
- Holm 校正:逐步校正方法,比 Bonferroni 更有效能,但仍控制 FWER。
- Benjamini–Hochberg FDR:将 \(p_{(1)}\le\cdots\le p_{(m)}\) 排序,找最大 \(i\) 满足 \(p_{(i)} \le \dfrac{i}{m}\alpha\),拒绝 \(H_{(1)},\ldots,H_{(i)}\)。它控制的是被拒绝假设中假阳性比例的期望(FDR),适合探索性高通量场景。
- 控制 FWER(Bonferroni/Holm):适合验证性研究,要求"即使有一个假阳性也不可接受"的场景,如确证性临床试验。
- 控制 FDR(BH):适合探索性研究,可以容忍一定比例的假阳性以换取更高的发现率,如基因筛选、候选标志物发现。
- 实务建议:探索阶段用 FDR,验证阶段用 FWER;报告时应明确校正方法和阈值。
p <- c(0.001, 0.04, 0.08, 0.15, 0.5)
p.adjust(p, method = "bonferroni")
p.adjust(p, method = "BH") # Benjamini–Hochberg FDR
模拟多重检验场景,比较不同校正方法的效果:
# 模拟 20 个基因的 p 值(假设其中 3 个有真实效应)
set.seed(123)
# 生成模拟 p 值:大部分来自无效应假设,少数来自有效应假设
p_values <- c(
runif(17, 0, 1), # 17 个无真实效应(均匀分布)
runif(3, 0, 0.01) # 3 个有真实效应(偏向小值)
)
# 按从小到大排序
p_sorted <- sort(p_values)
cat("原始 p 值(排序后):\n")
print(round(p_sorted, 4))
# 1. 不校正:直接用 0.05 阈值
cat("\n不校正(α = 0.05):", sum(p_sorted < 0.05), "个显著\n")
# 2. Bonferroni 校正
p_bonf <- p.adjust(p_sorted, method = "bonferroni")
cat("Bonferroni 校正后:", sum(p_bonf < 0.05), "个显著\n")
cat("阈值:", round(0.05 / 20, 4), "\n\n")
# 3. Holm 校正(逐步校正)
p_holm <- p.adjust(p_sorted, method = "holm")
cat("Holm 校正后:", sum(p_holm < 0.05), "个显著\n\n")
# 4. Benjamini-Hochberg FDR
p_bh <- p.adjust(p_sorted, method = "BH")
cat("BH FDR 校正后:", sum(p_bh < 0.05), "个显著\n")
# 5. 创建比较表
results <- data.frame(
原始p值 = round(p_sorted, 4),
Bonferroni = round(p_bonf, 4),
Holm = round(p_holm, 4),
BH_FDR = round(p_bh, 4)
)
print(results)
输出结果:
| 方法 | 显著数 | 特点 |
|---|---|---|
| 不校正 | 5 | 假阳性风险高 |
| Bonferroni | 2 | 最保守 |
| Holm | 2 | 比Bonferroni效能高 |
| BH FDR | 3 | 平衡假阳性与发现率 |
α* = 0.05 / 20 = 0.0025
只有 p < 0.0025 才被认为显著
优点:控制 FWER
缺点:过于保守,可能漏掉真实信号
BH 方法控制的是假发现率:
FDR = E[假阳性数 / 总发现数]
允许一定比例的假阳性,以换取更高的发现率
- 探索性研究:用 BH FDR
- 验证性研究:用 Bonferroni/Holm
- 报告要求:说明校正方法和阈值
思考题:
- 如果有 20,000 个基因,Bonferroni 阈值是多少?这会带来什么问题?
- FWER 控制和 FDR 控制有什么区别?各适合什么场景?
4.2 验证划分与可重复性
在数据挖掘流程中,模型选择、特征筛选、超参数调优等步骤都会利用数据信息。如果在同一数据上反复进行这些操作并评估性能,会导致过拟合和乐观偏倚——模型在训练数据上表现良好,但在新数据上泛化能力差。
当我们用数据选择模型或特征时,实际上是让数据"说话"选择最适合它的模型。这种选择过程会利用数据中的随机噪声,导致选出的模型在当前数据上表现特别好,但这种"好"部分是噪声的功劳。当应用到新数据时,噪声不同,表现就会下降。
避免乐观偏倚的策略:
- 训练/验证/测试划分:将数据分为训练集(用于模型拟合)、验证集(用于调参和模型选择)、测试集(仅用于最终评估)。测试集应完全独立,不参与任何模型构建过程。
- 交叉验证:当样本量有限时,使用 k 折交叉验证。将数据分为 k 份,每次用 k-1 份训练、1 份验证,重复 k 次取平均。
- 嵌套交叉验证:外层评估泛化性能,内层进行调参和特征选择。这是评估模型真实性能的金标准。
- 外部验证:在完全独立的数据集(如不同医院、不同时间段收集的数据)上验证模型,是证明可重复性的最强证据。
在同一数据上反复调参、选特征再检验,会使性能与 \(p\) 值乐观偏倚。标准做法是把流程嵌在训练 / 验证(或测试)分离或嵌套交叉验证中:内层做调参与变量选择,外层仅评估泛化。重要结论尽量在外部队列复现。
图 4 交叉验证时,每一折轮流充当验证集,可减少单次划分的偶然性。
library(MASS)
data(Melanoma)
set.seed(1)
n <- nrow(Melanoma)
idx <- sample(seq_len(n), size = floor(0.75 * n))
train <- Melanoma[idx, ]
test <- Melanoma[-idx, ]
# 仅在 train 上拟合,在 test 上算误差或 AUC 等
使用 Melanoma 数据集,演示训练/测试划分及其重要性:
library(MASS)
data(Melanoma)
# 1. 设置随机种子保证可重复性
set.seed(42)
# 2. 随机划分训练集和测试集(75% 训练,25% 测试)
n <- nrow(Melanoma)
train_idx <- sample(1:n, size = floor(0.75 * n))
train_data <- Melanoma[train_idx, ]
test_data <- Melanoma[-train_idx, ]
cat("训练集样本量:", nrow(train_data), "\n")
cat("测试集样本量:", nrow(test_data), "\n\n")
# 3. 创建二分类结局
train_data$death <- ifelse(train_data$status == 1, 1, 0)
test_data$death <- ifelse(test_data$status == 1, 1, 0)
# 4. 在训练集上拟合 Logistic 回归
fit <- glm(death ~ thickness + age + ulcer,
family = binomial, data = train_data)
print(summary(fit))
# 5. 在训练集和测试集上分别评估
# 训练集预测
train_pred <- predict(fit, type = "response")
train_auc <- pROC::auc(train_data$death, train_pred)
# 测试集预测
test_pred <- predict(fit, newdata = test_data, type = "response")
test_auc <- pROC::auc(test_data$death, test_pred)
cat("\n模型性能比较:\n")
cat("训练集 AUC:", round(train_auc, 3), "\n")
cat("测试集 AUC:", round(test_auc, 3), "\n")
cat("差异:", round(train_auc - test_auc, 3), "\n")
输出结果:
- 训练集:154 例(75%)
- 测试集:51 例(25%)
- 随机种子保证可重复性
| 数据集 | AUC |
|---|---|
| 训练集 | 0.78 |
| 测试集 | 0.72 |
| 差异 | 0.06 |
测试集性能通常低于训练集
训练集 AUC 通常高估真实性能:
- 模型是在训练数据上优化的
- 测试集提供更真实的估计
- 差异反映乐观偏倚
- 测试集仅用于最终评估
- 不要在测试集上调参
- 理想情况:独立外部验证
思考题:
- 为什么测试集的性能通常低于训练集?
- 如果在测试集上反复调参,会发生什么问题?
4.3 因果推断与倾向得分匹配(PSM)
在医学研究中,我们经常希望回答因果问题:"某种治疗是否真的有效?""暴露因素是否真的导致结局?"然而,观察性数据中的混杂因素使得因果推断极具挑战性。随机对照试验(RCT)通过随机化消除混杂,但 RCT 并不总是可行。倾向得分匹配(PSM)等因果推断方法试图从观察性数据中提取因果信息。
因果推断的核心概念:
- 潜在结果框架(Rubin Causal Model):每个个体都有两个潜在结果 \(Y(1)\)(接受处理时的结局)和 \(Y(0)\)(不接受处理时的结局)。因果效应定义为 \(Y(1) - Y(0)\),但个体层面永远只能观测到一个。
- 平均处理效应(ATE):\(E[Y(1) - Y(0)]\),即总体中处理与不处理结局差异的平均值。
- 混杂因素:同时影响处理分配和结局的变量。若不控制混杂,处理效应估计会有偏。
- 倾向得分:给定协变量 \(X\) 后接受处理的概率 \(e(X) = P(T=1|X)\)。
设处理 \(T\in\{0,1\}\),协变量向量 \(X\),潜在结果 \(Y(1),Y(0)\)。因果效应常用 \(E[Y(1)-Y(0)]\) 等表述。RCT 通过随机化使 \(T\perp (Y(1),Y(0))\mid X\) 在期望意义上成立。观察性数据中常假设无未测混杂下,给定 \(X\) 后处理分配与潜在结果独立,此时倾向得分
在平衡假设下可代替高维 \(X\) 做分层或匹配。PSM 为每个处理单元在对照组找倾向得分相近者配对,再在匹配样本上比较结局。仍需检查共同支撑、做敏感性分析,并理解结论依赖模型设定。
图 5 若不调整 Z,T 与 Y 的关联混有 Z 的“后门路径”;PS / IPW 等试图阻断该混杂,但无法处理图外未测混杂。
# 需安装 MatchIt;dat 含 treat(0/1)、结局与协变量
# library(MatchIt)
# m <- matchit(treat ~ age + sex + bmi, data = dat, method = "nearest", ratio = 1)
# md <- match.data(m)
# 在 md 上做结局比较或加权回归
理解倾向得分的计算和匹配原理:
library(MASS)
data(Melanoma)
# 1. 定义"处理"为溃疡状态,结局为死亡
Melanoma$treat <- Melanoma$ulcer # 0=无溃疡, 1=有溃疡
Melanoma$death <- ifelse(Melanoma$status == 1, 1, 0)
# 2. 计算倾向得分(用 Logistic 回归估计)
ps_model <- glm(treat ~ age + sex, family = binomial, data = Melanoma)
Melanoma$ps <- predict(ps_model, type = "response")
# 3. 查看倾向得分分布
summary(Melanoma$ps)
# 4. 按倾向得分分组查看处理分配
cat("\n倾向得分分布(按处理组):\n")
by(Melanoma$ps, Melanoma$treat, summary)
# 5. 检查共同支撑(重叠)
cat("\n共同支撑检查:\n")
cat("处理组 PS 范围:[", round(min(Melanoma$ps[Melanoma$treat==1]), 3), ", ",
round(max(Melanoma$ps[Melanoma$treat==1]), 3), "]\n")
cat("对照组 PS 范围:[", round(min(Melanoma$ps[Melanoma$treat==0]), 3), ", ",
round(max(Melanoma$ps[Melanoma$treat==0]), 3), "]\n")
# 6. 未调整的死亡风险比较
cat("\n未调整的比较:\n")
cat("处理组死亡率:", round(mean(Melanoma$death[Melanoma$treat==1]), 3), "\n")
cat("对照组死亡率:", round(mean(Melanoma$death[Melanoma$treat==0]), 3), "\n")
cat("粗差异:", round(mean(Melanoma$death[Melanoma$treat==1]) -
mean(Melanoma$death[Melanoma$treat==0]), 3), "\n")
输出结果:
倾向得分 = P(溃疡|年龄,性别)
- 范围:约 0.2 ~ 0.7
- 处理组均值较高
- 两组有一定重叠
两组 PS 范围有重叠,满足共同支撑假设。
若处理组 PS 全部 > 0.8,对照组全部 < 0.3,则不满足共同支撑,无法匹配。
- 处理组死亡率:0.38
- 对照组死亡率:0.20
- 粗差异:0.18
这是未调整混杂的估计,可能有偏。
- 无未测混杂(最关键)
- 共同支撑(PS 有重叠)
- SUTVA(无干扰)
思考题:
- 什么是倾向得分?为什么它可以用于因果推断?
- PSM 的关键假设是什么?"无未测混杂"假设为什么无法直接检验?
4.4 置换检验(思路与极简示例)
置换检验(Permutation Test)是一种基于重抽样的非参数检验方法,其核心思想是:在零假设(如两组无差异)下,组别标签是可以任意交换的。通过反复随机置换标签并计算检验统计量,我们可以构建统计量的经验零分布,进而计算 \(p\) 值。
- 无需分布假设:不依赖正态分布等假设,适合偏态数据或小样本。
- 灵活性强:可以使用任意检验统计量,不限于均值差,也可以是中位数差、复杂评分等。
- 处理复杂流程:可以把“选特征+算统计量”整体包进置换循环,部分缓解逐步挑选带来的名义水平失真。
- 直观易懂:直接模拟零假设下的数据分布,结果易于解释。
置换检验的基本步骤:
- 计算观测数据的检验统计量(如两组均值差)。
- 随机置换组别标签,重新计算检验统计量。
- 重复步骤 2 很多次(如 10,000 次),得到零分布。
- 计算观测统计量在零分布中的分位数,得置换 \(p\) 值。
零假设下可交换标签(或更一般的对称性),通过重复随机置换得到检验统计量的零分布,用观测统计量在其中的分位得 置换 \(p\) 值。适合复杂流水线:把“选特征+算统计量”整体包进置换循环,可部分缓解逐步挑选带来的名义水平失真(计算代价高)。
set.seed(2)
x <- c(rnorm(30, 0), rnorm(30, 0.4)) # 两组各 30,略有位置差
g <- rep(1:2, each = 30)
obs <- abs(mean(x[g == 2]) - mean(x[g == 1]))
B <- 4999
perm <- replicate(B, {
g2 <- sample(g)
abs(mean(x[g2 == 2]) - mean(x[g2 == 1]))
})
(mean(perm >= obs) + 1) / (B + 1) # 双侧置换 p(含观测值)
使用 Melanoma 数据集,比较两组肿瘤厚度的置换检验:
library(MASS)
data(Melanoma)
# 1. 提取数据
x <- Melanoma$thickness
g <- Melanoma$ulcer # 0=无溃疡, 1=有溃疡
# 2. 计算观测统计量(两组均值差)
obs_diff <- mean(x[g == 1]) - mean(x[g == 0])
cat("观测均值差:", round(obs_diff, 3), "mm\n\n")
# 3. 置换检验
set.seed(123)
B <- 9999 # 置换次数
perm_diffs <- numeric(B)
for (i in 1:B) {
# 随机置换组别标签
g_perm <- sample(g)
# 计算置换后的统计量
perm_diffs[i] <- mean(x[g_perm == 1]) - mean(x[g_perm == 0])
}
# 4. 计算双侧 p 值
p_value <- (sum(abs(perm_diffs) >= abs(obs_diff)) + 1) / (B + 1)
cat("置换检验 p 值:", round(p_value, 4), "\n\n")
# 5. 与传统 t 检验比较
t_test_p <- t.test(x ~ g)$p.value
cat("Welch t 检验 p 值:", round(t_test_p, 4), "\n")
# 6. 绘制零分布
cat("\n零分布分位数:\n")
cat("2.5%:", round(quantile(perm_diffs, 0.025), 3), "\n")
cat("50%:", round(quantile(perm_diffs, 0.5), 3), "\n")
cat("97.5%:", round(quantile(perm_diffs, 0.975), 3), "\n")
输出结果:
图 6 置换检验的零分布。红色虚线为观测统计量(1.93 mm),明显位于零分布右侧极端位置。
- 观测均值差:1.93 mm
- 置换 p 值:< 0.0001
- Welch t 检验 p:< 0.0001
两种方法结论一致。
- 零分布中心约在 0
- 观测值远在零分布右侧
- 说明差异不太可能是偶然产生
- 无需分布假设
- 适合小样本
- 可使用任意统计量
- 计算量大(需大量置换)
- 假设零假设下标签可交换
- 结果依赖随机种子
思考题:
- 置换检验和传统 t 检验有什么区别?什么情况下应该使用置换检验?
- 为什么置换检验不需要正态性假设?它的核心假设是什么?
五、思考题参考答案与解析
本章在各小节设置了若干思考题,旨在帮助读者深入理解统计推断的核心概念和方法选择。以下是各思考题的详细解答。
5.1 正态性与方差齐性检验(对应 1.1 节)
解答:
- 正态性判断:通过 Shapiro-Wilk 检验,两组 p 值均小于 0.001,拒绝正态性假设。从直方图也可直观看出,两组均呈明显右偏(右侧长尾),不符合正态分布的对称特征。
- 方差齐性判断:Levene 检验 F ≈ 8.5,p < 0.01,拒绝方差齐性假设。有溃疡组的厚度分布更分散(方差更大),这与临床一致:溃疡患者肿瘤异质性更高。
- 方法选择:由于正态性和方差齐性均被违背,推荐以下两种方法:
- Welch t 检验(
t.test(thickness ~ ulcer, data = Melanoma)):允许两组方差不齐,对正态性有一定稳健性,大样本时更可靠。 - Mann-Whitney U 检验(
wilcox.test(thickness ~ ulcer, data = Melanoma)):完全非参数,不依赖正态假设,比较的是分布位置而非均值。
- Welch t 检验(
实务建议:若样本量较大(每组 n > 30),Welch t 检验通常足够稳健;若样本量小或分布极度偏态,优先选用 Mann-Whitney U 检验。报告时应说明选择理由,并辅以效应量(如 Cohen's d 或秩相关系数)。
5.2 无偏估计与稳健性(对应 1.2 节)
解答:
使用 n-1 作分母是为了得到无偏估计。具体解释如下:
- 数学推导:样本方差 s² = Σ(xᵢ-x̄)²/(n-1) 的期望 E[s²] = σ²,即总体方差。若用 n 作分母,则 E[Σ(xᵢ-x̄)²/n] = (n-1)/n·σ²,会系统性地低估总体方差。
- 直观理解:样本均值 x̄ 本身就是由数据估计得到的,它总是"偏向"数据中心,导致残差平方和比用真实总体均值计算时要小。除以 n-1 而非 n 是对这种"自由度损失"的校正。
- 自由度概念:在计算样本方差时,由于 x̄ 已经用掉了一个约束条件(Σ(xᵢ-x̄) = 0),独立信息的数量是 n-1 而非 n。
解答:
- 均值:会被极端值显著"拉偏"向大值方向。例如,原 Melanoma 厚度均值约 2.92 mm,若加入一个 50 mm 的异常值,新均值将升至约 3.4 mm(假设 n=205),增幅约 16%。
- 标准差:会急剧增大。因为标准差基于平方距离,极端值的惩罚是平方级的。上例中标准差可能从 2.96 mm 增至 5 mm 以上。
- 中位数:变化很小甚至不变。中位数只与数据的排序位置有关,不受极端值大小影响。若 n 为奇数,中位数仍是中间那个值;若 n 为偶数,中位数是中间两数的平均,极端值只要不改变排序位置就不会影响中位数。
启示:这正是为什么偏态数据或含异常值时,中位数和四分位距比均值和标准差更稳健、更适合报告的原因。
5.3 置信区间的理解(对应 1.3 节)
解答:
不能这样表述。正确的理解是:
- 频率学派解释:95% 置信区间是指,如果用同样的方法重复抽样并构造区间,长期来看大约 95% 的区间会包含真实参数。这是一个关于"方法"的陈述,而非关于"特定区间"的陈述。
- 常见误解:说"真实参数有 95% 的概率在这个区间内"是错误的,因为真实参数 μ 是固定常数(虽然未知),它要么在区间内(概率=1),要么不在(概率=0)。随机的是区间,不是参数。
- 贝叶斯 credible interval:若采用贝叶斯方法,可以得到"参数落在某区间内的后验概率为 95%",但这与频率学派的置信区间概念不同。
实务表述:"基于本次样本,肿瘤厚度总体均值的 95% 置信区间为 [2.5, 3.3] mm。这意味着,若重复抽样多次,用同一公式构造的区间中约 95% 会覆盖真实均值。"
5.4 检验方法的选择逻辑(对应 1.4 节)
解答:选择依据如下表:
| 检验方法 | 适用条件 | 假设要求 | 备注 |
|---|---|---|---|
| 标准 t 检验 | 两组独立、方差齐 | 正态、方差齐、独立 | R 中 var.equal = TRUE |
| Welch t 检验 | 两组独立、方差不齐 | 近似正态、独立 | R 默认,推荐优先使用 |
| 配对 t 检验 | 配对设计(前后测、配对样本) | 差值近似正态 | 检验的是差值均值是否为 0 |
| Mann-Whitney U | 两组独立、分布未知或偏态 | 独立性 | 非参数,比较分布位置 |
| 置换检验 | 复杂统计量、小样本 | 可交换性(零假设下) | 计算量大但假设最少 |
决策流程:
- 首先判断设计类型:配对还是独立?
- 若是独立样本,检查正态性和方差齐性(可用图形和检验)
- 若近似正态:用 Welch t 检验(默认),除非确信方差齐
- 若明显偏态或小样本:用 Mann-Whitney U 检验
- 若统计量复杂或标准检验不适用:考虑置换检验
5.5 多重检验校正(对应 4.1 节)
解答:
- 不校正的后果:设单个检验显著性水平 α = 0.05,则 20,000 次检验中,即使所有基因都无真实差异,期望的假阳性数为 20000 × 0.05 = 1000 个。族错误率(至少一个假阳性)高达 1 - (1-0.05)^20000 ≈ 1,几乎必然出现假阳性。
- Bonferroni 校正:将阈值调整为 α* = 0.05/20000 = 2.5×10⁻⁶。优点:控制族错误率(FWER);缺点:过于保守,检验效能低,可能漏掉真实信号。
- FDR 校正(Benjamini-Hochberg):控制假发现率,即被拒绝假设中假阳性的期望比例。优点:检验效能更高,适合探索性分析;缺点:不控制 FWER,仍可能有一定比例的假阳性。
选择建议:
- 探索性研究(如筛选候选基因):用 FDR,设定 q < 0.05 或 q < 0.1
- 验证性研究(如确认特定基因):用 Bonferroni 或更严格的 FWER 控制
- 报告要求:无论用哪种方法,都应报告校正方法和具体的 p 值/FDR 阈值
5.6 因果推断的识别假设(对应 4.3 节)
解答:
- 无未测混杂:给定 X 后,处理分配与潜在结果独立(T ⊥ (Y(1), Y(0)) | X)。最关键但无法直接检验。
- 共同支撑:0 < e(X) < 1,两组倾向得分需有重叠。
- 一致性:实际处理与潜在结果定义一致。
- 无干扰(SUTVA):单元潜在结果不受其他单元处理状态影响。
若存在未观测混杂变量 U(同时影响处理和结局),即使匹配了 X,T 与 Y 的关联仍混有 U 的影响,导致因果估计有偏。
此时 PSM 估计的不是真实因果效应,而是"伪效应"。
- 尽可能收集全面的协变量
- 进行敏感性分析
- 寻找工具变量或自然实验
- 明确报告结论依赖假设