06 · 生物统计与实验数据分析

数据科学⭐⭐⭐⭐⭐核心必修|约 17 分钟17 节1 图
本章目标

掌握从数据到结论的完整统计流程——数据类型判断 → 正态性/方差齐性检验 → 选择合适的检验方法 → 多重比较校正 → 结果报告。这是判断"你的实验结论是否可信"的核心能力。

本章路线
06 · 生物统计与实验数据分析

0. 小白导读:统计到底在干什么?

🍚生活化比喻

先听懂:统计就是帮你在"有数据"和"有结论"之间搭一座桥。你做了实验,得到两组数据(比如对照组和模型组的小鼠行为学时间),它们看起来有差别——但这个差别是真实的,还是纯属运气(随机波动)? 统计就是回答这个问题的"裁判"。

本章最重要的 4 个比喻(学完本章再回来看,会恍然大悟):

  • P 值 = "冤枉好人的概率"。P 值越小,说明"这两组其实没差别"这个说法越站不住脚,越可能是真有差别。

  • 正态分布 = "全班身高的分布"。大多数人集中在中间,特别高和特别矮的都少——很多生物数据都长这样。

  • 置信区间 = "用网捞鱼"。95% 置信区间就是"捞 100 网,约 95 网能捞到真实值"。

  • 样本量 = "尝汤判断咸淡"。只尝一勺(样本少)可能判断错,多尝几勺(样本多)判断更稳。

下面每一节,我们都会用这类比喻帮你"先听懂,再学会"。


1. 统计基础概念

1.1 总体与样本

  • 总体(Population):你关心的所有个体。例如"所有 MCAO 模型小鼠"。
  • 样本(Sample):实际测量的那一部分。例如"随机选取的 8 只 MCAO 模型小鼠"。
  • 统计推断:用样本数据推断总体特征。样本量越大,推断越可靠

1.2 描述统计 vs 推断统计

类型 作用 指标
描述统计 描述数据本身 均值、中位数、标准差、四分位数
推断统计 从样本推断总体 P 值、置信区间、效应量

1.3 均值、中位数与标准差

python
import numpy as np
from scipy import stats

data = np.array([3.2, 5.8, 1.5, 7.1, 2.4, 4.6, 3.9, 6.2])

data.mean()          # 均值
np.median(data)      # 中位数
data.std(ddof=1)     # 样本标准差(ddof=1 是科研标准!)
data.var(ddof=1)     # 样本方差
注意

ddof=1 的坑:NumPy 默认 ddof=0(除以 n),但科研中报告的是样本标准差(除以 n-1)。Pandas 的 std() 默认就是 ddof=1,而 NumPy 需要手动指定。科研报告一律用 ddof=1

1.4 置信区间

🍚生活化比喻

先听懂:置信区间就像用网捞鱼。你永远不知道湖里(总体)那条"真实的鱼"(真实均值)在哪,但你可以撒网(抽样)——95% 置信区间就是"撒 100 次网,约 95 次能捞到那条真鱼"。区间越窄,说明你越确定。

置信区间(Confidence Interval, CI)表示总体参数可能落在的范围。95% CI 的含义:重复抽样 100 次,约 95 次的区间会包含真实总体均值。

python
def mean_ci(data, confidence=0.95):
    n = len(data)
    mean = np.mean(data)
    se = stats.sem(data)                     # 标准误 = std / sqrt(n)
    t_crit = stats.t.ppf((1 + confidence) / 2, df=n - 1)
    margin = t_crit * se
    return mean - margin, mean + margin

print(mean_ci(data))   # (2.83, 5.57)

1.5 P 值与假设检验

🍚生活化比喻

先听懂:假设检验就像法庭判案

  • 零假设 H₀ = "被告无罪"(默认假设两组没差别)。

  • 证据 = 你的实验数据。

  • P 值 = "如果被告真的无罪,出现眼前这些证据(或更极端证据)的概率"。

  • 如果 P 值很小(< 0.05),说明"在无罪的前提下,这些证据几乎不可能出现"——那就推翻无罪假设,判定"有差别"。

所以 P 值不是"差异有多大",而是"这个差异有多不像巧合"。

假设检验流程

  1. 提出零假设 H₀(通常为"无差异")和备择假设 H₁("有差异")。
  2. 计算检验统计量(t、F、U 等)。
  3. 得到 P 值:在 H₀ 为真的前提下,观察到当前数据(或更极端)的概率。
  4. 判断:P < 0.05 则拒绝 H₀,认为差异有统计学意义。
注意

P 值的常见误解

  • ❌ "P < 0.05 说明差异很大"——P 值不反映差异大小,只反映"是否可信"。

  • ❌ "P > 0.05 说明没有差异"——可能只是样本量不够(功效不足)。

  • ✅ 正确表述:"差异有统计学意义(P < 0.05)",同时报告效应量

1.6 α 错误与 β 错误

H₀ 为真 H₀ 为假
拒绝 H₀ Ⅰ类错误(α):假阳性 正确
不拒绝 H₀ 正确 Ⅱ类错误(β):假阴性
  • α(显著性水平)通常取 0.05。
  • β 通常取 0.20,统计功效 = 1 - β = 0.80(即 80% 概率能检测出真实差异)。

2. 数据类型与分布

2.1 数据类型

类型 说明 例子 常用检验
连续变量 可测量、有小数 浓度、粒径、行为学时间 t 检验、ANOVA、相关
分类变量 类别 性别、分组、是否死亡 卡方检验
有序变量 有顺序的类别 神经功能评分 0-4 非参数检验

2.2 正态分布

🍚生活化比喻

先听懂:正态分布就是"全班身高的分布"——大多数人集中在中间(平均身高附近),特别高和特别矮的都是少数。画成图就是一座中间高、两边对称的钟形山丘。很多生物测量数据(体重、浓度、行为学时间)都近似这个形状。

正态分布是统计学的基石——很多参数检验(t 检验、ANOVA)都要求数据近似正态

python
import matplotlib.pyplot as plt

# 生成正态分布数据并画直方图
data = np.random.normal(loc=5, scale=1, size=1000)
plt.hist(data, bins=30, density=True, alpha=0.7, color="teal")
# 叠加理论正态曲线
x = np.linspace(2, 8, 200)
plt.plot(x, stats.norm.pdf(x, 5, 1), color="orange", linewidth=2)
plt.show()

2.3 偏态分布

当数据不对称(如大多数值小、少数值很大)时称为偏态分布。常见于:浓度、时间、费用等只能为正且右偏的数据。

python
# 右偏数据示例(对数正态分布)
data_skewed = np.random.lognormal(mean=0, sigma=0.5, size=1000)
print(f"均值: {data_skewed.mean():.2f}, 中位数: {np.median(data_skewed):.2f}")
# 均值 > 中位数 → 右偏
💡提示

判断偏态:均值 > 中位数 → 右偏;均值 < 中位数 → 左偏。偏态数据要么用非参数检验,要么先做对数转换。


3. 正态性检验

为什么先做正态性检验? 因为后续选择参数检验还是非参数检验,取决于数据是否正态。

3.1 Shapiro-Wilk 检验(小样本首选,n < 50)

python
data = np.random.normal(5, 1, 30)

stat, p = stats.shapiro(data)
print(f"Shapiro-Wilk: W = {stat:.4f}, p = {p:.4f}")

if p > 0.05:
    print("数据符合正态分布(P > 0.05)")
else:
    print("数据不符合正态分布(P < 0.05)")

3.2 Kolmogorov-Smirnov 检验(大样本)

python
stat, p = stats.kstest(data, "norm", args=(data.mean(), data.std(ddof=1)))
print(f"K-S: D = {stat:.4f}, p = {p:.4f}")

3.3 Q-Q 图(直观判断)

python
import scipy.stats as stats
import matplotlib.pyplot as plt

stats.probplot(data, dist="norm", plot=plt)
plt.title("Q-Q 图")
plt.show()
# 点越贴近对角线,越接近正态分布
💡提示

判断原则:P > 0.05 认为符合正态。但样本量很小时(n < 10)检验功效低,可结合 Q-Q 图判断。科研中通常 n ≥ 6 每组即可用参数检验(中心极限定理)。


4. 方差齐性检验

为什么做方差齐性检验? t 检验和 ANOVA 假设各组方差大致相等。若方差不齐,需用校正版本(Welch 检验)。

4.1 Levene 检验(推荐,对非正态稳健)

python
group1 = np.random.normal(5, 1, 20)
group2 = np.random.normal(6, 1.5, 20)

stat, p = stats.levene(group1, group2)
print(f"Levene: W = {stat:.4f}, p = {p:.4f}")
# P > 0.05 → 方差齐

4.2 Bartlett 检验(对正态敏感)

python
stat, p = stats.bartlett(group1, group2)
💡提示

数据正态时两者皆可;数据非正态时用 Levene。方差不齐时:

  • 两组比较 → 用 Welch's t 检验ttest_ind(equal_var=False)

  • 多组比较 → 用 Welch's ANOVA 或非参数检验


5. 参数检验:t 检验与方差分析

5.1 独立样本 t 检验(两组独立数据)

适用:比较两个独立组的均值,如"对照组 vs 模型组"的梗死体积。

python
control = np.random.normal(5, 1, 12)
model   = np.random.normal(7, 1, 12)

# 默认 equal_var=True(方差齐);方差不齐时 equal_var=False
t_stat, p_val = stats.ttest_ind(control, model, equal_var=True)
print(f"t = {t_stat:.4f}, p = {p_val:.4f}")

# 同时报告均值±SD
print(f"对照组: {control.mean():.2f} ± {control.std(ddof=1):.2f}")
print(f"模型组: {model.mean():.2f} ± {model.std(ddof=1):.2f}")

5.2 配对样本 t 检验(同一批对象前后比较)

适用:同一批小鼠给药前后、同一细胞系处理前后。

python
before = np.random.normal(6, 1, 12)
after  = before + np.random.normal(-1.5, 0.5, 12)  # 处理后下降

t_stat, p_val = stats.ttest_rel(before, after)
print(f"配对 t = {t_stat:.4f}, p = {p_val:.4f}")

5.3 单因素方差分析(One-way ANOVA,≥3 组)

适用:比较 ≥3 组的均值,如"对照组 / 低剂量 / 高剂量"。

python
group_a = np.random.normal(5, 1, 10)
group_b = np.random.normal(6, 1, 10)
group_c = np.random.normal(7, 1, 10)

f_stat, p_val = stats.f_oneway(group_a, group_b, group_c)
print(f"F = {f_stat:.4f}, p = {p_val:.4f}")
注意

ANOVA 显著 ≠ 知道哪两组有差异。ANOVA 只告诉你"至少有一组不同",具体哪两组不同需要事后多重比较(见第 7 节)。

5.4 双因素方差分析(Two-way ANOVA)

适用:两个因素(如"药物 × 时间")对结果的影响。

python
import statsmodels.api as sm
from statsmodels.formula.api import ols
import pandas as pd

# 构造数据:药物(drug)× 剂量(dose)
df = pd.DataFrame({
    "drug": np.repeat(["A", "B"], 20),
    "dose": np.tile(np.repeat(["low", "high"], 10), 2),
    "value": np.random.normal(5, 1, 40)
})

model = ols("value ~ C(drug) * C(dose)", data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)
# 看 drug、dose、drug:dose(交互项)各自的 F 和 P 值

5.5 重复测量方差分析(Repeated Measures ANOVA)

适用:同一批对象在多个时间点测量(如 0/24/48/72h 的释放率)。

python
from statsmodels.stats.anova import AnovaRM

# df 需为长格式:subject, time, value
df_long = pd.DataFrame({
    "subject": np.repeat(range(10), 4),
    "time": np.tile(["t0", "t24", "t48", "t72"], 10),
    "value": np.random.normal(5, 1, 40)
})

result = AnovaRM(df_long, "value", "subject", within=["time"]).fit()
print(result)

6. 非参数检验

何时用非参数检验? - 数据不满足正态分布(且样本量小,无法依赖中心极限定理) - 数据是等级/有序数据(如神经功能评分) - 存在明显离群值

6.1 Mann-Whitney U 检验(两组独立,非参数)

python
group1 = np.random.normal(5, 1, 12)
group2 = np.random.normal(7, 1.5, 12)

u_stat, p_val = stats.mannwhitneyu(group1, group2, alternative="two-sided")
print(f"U = {u_stat:.4f}, p = {p_val:.4f}")

6.2 Wilcoxon 符号秩检验(配对,非参数)

python
before = np.random.normal(6, 1, 12)
after  = before + np.random.normal(-1.5, 0.5, 12)

w_stat, p_val = stats.wilcoxon(before, after)
print(f"W = {w_stat:.4f}, p = {p_val:.4f}")

6.3 Kruskal-Wallis 检验(≥3 组,非参数)

python
group_a = np.random.normal(5, 1, 10)
group_b = np.random.normal(6, 1.5, 10)
group_c = np.random.normal(7, 2, 10)

h_stat, p_val = stats.kruskal(group_a, group_b, group_c)
print(f"H = {h_stat:.4f}, p = {p_val:.4f}")

6.4 Friedman 检验(重复测量,非参数)

python
# 同一批对象多个时间点
data_matrix = np.random.randn(10, 4)  # 10个对象 × 4个时间点
stat, p_val = stats.friedmanchisquare(*[data_matrix[:, i] for i in range(4)])
print(f"χ² = {stat:.4f}, p = {p_val:.4f}")

6.5 卡方检验(分类变量)

适用:两个分类变量的关联,如"是否给药 × 是否存活"。

python
# 2×2 列联表
table = np.array([[30, 10],   # 给药组:存活30,死亡10
                  [15, 25]])  # 对照组:存活15,死亡25

chi2, p_val, dof, expected = stats.chi2_contingency(table)
print(f"χ² = {chi2:.4f}, p = {p_val:.4f}")

7. 多重比较校正

🍚生活化比喻

先听懂:多重比较就像连续抽奖。单次中奖概率 5%(α=0.05),听起来很低;但如果你抽 20 次,几乎肯定至少中一次——这就是"假阳性"。做很多次检验却不校正,就像抽了很多次奖还假装只抽了一次。校正就是"提高中奖门槛",把假阳性压回 5%

问题:做 10 次检验,即使全部无差异,也有约 40% 概率出现至少一次假阳性(0.05 × 10)。比较次数越多,假阳性风险越大

7.1 常用校正方法

方法 原理 适用场景
Bonferroni P × 比较次数 比较次数少(<10),最严格
Tukey HSD 两两比较专用 ANOVA 后的事后比较(推荐)
Dunnett 各处理组 vs 对照组 只需与对照组比较
Games-Howell 方差不齐时 方差不齐的两两比较
FDR (BH) 控制假发现率 组学数据(成千上万次检验)

7.2 Tukey HSD(ANOVA 后的事后比较)

python
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# 长格式数据
df = pd.DataFrame({
    "group": np.repeat(["control", "low", "high"], 10),
    "value": np.concatenate([np.random.normal(5, 1, 10),
                             np.random.normal(6, 1, 10),
                             np.random.normal(7, 1, 10)])
})

result = pairwise_tukeyhsd(df["value"], df["group"], alpha=0.05)
print(result)
# 看 reject 列:True 表示该对差异显著

7.3 多重比较校正(P 值校正)

python
from statsmodels.stats.multitest import multipletests

p_values = [0.01, 0.04, 0.06, 0.2, 0.5]

# Bonferroni
bonf = multipletests(p_values, method="bonferroni")
print(bonf[1])   # 校正后的 P 值

# FDR (Benjamini-Hochberg)
fdr = multipletests(p_values, method="fdr_bh")
print(fdr[1])
💡提示

组学数据(转录组、蛋白组)用 FDR,因为检验次数成千上万,Bonferroni 会过于严格。


8. 相关分析

适用:两个连续变量之间的关联强度,如"炎症因子水平 × 抑郁行为评分"。

8.1 Pearson 相关(数据正态时)

python
x = np.random.normal(0, 1, 50)
y = 0.8 * x + np.random.normal(0, 0.5, 50)

r, p_val = stats.pearsonr(x, y)
print(f"r = {r:.4f}, p = {p_val:.4f}")

8.2 Spearman 相关(数据非正态或有序数据)

python
r, p_val = stats.spearmanr(x, y)
print(f"ρ = {r:.4f}, p = {p_val:.4f}")

8.3 相关系数解读

r 的绝对值 相关强度
0.00–0.19 极弱相关
0.20–0.39 弱相关
0.40–0.59 中等相关
0.60–0.79 强相关
0.80–1.00 极强相关
注意

相关 ≠ 因果。两变量相关可能因为共同原因(混杂因素)。且相关系数对离群值敏感,画散点图确认线性关系。


9. 回归分析

9.1 简单线性回归(一个自变量)

python
import statsmodels.api as sm

x = np.random.normal(0, 1, 100)
y = 2 + 1.5 * x + np.random.normal(0, 0.5, 100)

X = sm.add_constant(x)          # 加截距
model = sm.OLS(y, X).fit()
print(model.summary())
# 关键输出:coef(系数)、P>|t|(P值)、R-squared(R²)

9.2 多元线性回归(多个自变量)

python
X_multi = np.random.randn(100, 3)
y = 1 + 0.5*X_multi[:,0] - 0.3*X_multi[:,1] + 0.2*X_multi[:,2] + np.random.randn(100)*0.2

X_multi = sm.add_constant(X_multi)
model = sm.OLS(y, X_multi).fit()
print(model.summary())

9.3 Logistic 回归(因变量是分类)

python
import statsmodels.api as sm

X = np.random.randn(200, 3)
y = (X[:, 0] + X[:, 1] > 0).astype(int)

X = sm.add_constant(X)
model = sm.Logit(y, X).fit()
print(model.summary())
# 关注 OR 值(优势比)和 P 值

9.4 回归结果报告要点

  • :自变量解释因变量变异的比例。
  • 回归系数 β:自变量每增加 1 个单位,因变量平均变化多少。
  • P 值:系数是否显著(≠0)。
  • 置信区间:系数的 95% CI。

10. 生存分析(可选)

适用:关注"事件发生时间"的数据,如小鼠存活时间、复发时间。特点是存在删失数据(实验结束时未发生事件)。

10.1 Kaplan-Meier 曲线

python
from lifelines import KaplanMeierFitter

# 模拟数据:时间 + 是否发生事件(1=事件,0=删失)+ 分组
durations = np.random.exponential(10, 40)
events = np.random.binomial(1, 0.7, 40)
groups = np.repeat(["control", "drug"], 20)

kmf = KaplanMeierFitter()
for g in ["control", "drug"]:
    mask = groups == g
    kmf.fit(durations[mask], event_observed=events[mask], label=g)
    kmf.plot_survival_function()

plt.xlabel("Time (days)")
plt.ylabel("Survival probability")
plt.show()

10.2 log-rank 检验(比较两组生存曲线)

python
from lifelines.statistics import logrank_test

mask_c = groups == "control"
mask_d = groups == "drug"
result = logrank_test(durations[mask_c], durations[mask_d],
                      event_observed_A=events[mask_c],
                      event_observed_B=events[mask_d])
print(f"log-rank p = {result.p_value:.4f}")

11. 样本量估算与统计功效

11.1 为什么需要样本量估算?

🍚生活化比喻

先听懂:样本量就像尝汤判断咸淡。只尝一小勺(样本太少),可能碰巧尝到淡的部分,误判整锅汤;多尝几勺(样本足够),判断才靠谱。样本量太小 → 检验"没力气"(功效不足,可能漏掉真实差异);样本量太大 → 浪费动物和时间。所以实验设计阶段就要算好需要多少只

样本量太小 → 检验功效不足(可能漏掉真实差异);样本量太大 → 浪费资源。实验设计阶段就要估算样本量,这是 SCI 审稿人常问的问题。

11.2 关键参数

参数 含义 常用值
α 显著性水平 0.05
功效 1-β 检测出真实差异的概率 0.80
效应量 差异的大小(Cohen's d、η²) 由预实验/文献确定
标准差 数据的变异程度 由预实验/文献确定

11.3 效应量

python
def cohens_d(group1, group2):
    n1, n2 = len(group1), len(group2)
    s1, s2 = group1.std(ddof=1), group2.std(ddof=1)
    sp = np.sqrt(((n1-1)*s1**2 + (n2-1)*s2**2) / (n1+n2-2))  # 合并标准差
    return (group1.mean() - group2.mean()) / sp

d = cohens_d(np.random.normal(5,1,20), np.random.normal(6,1,20))
print(f"Cohen's d = {d:.3f}")
Cohen's d 效应大小
0.2 小效应
0.5 中等效应
0.8 大效应

11.4 用 Python 估算样本量

python
from statsmodels.stats.power import TTestIndPower

# 独立样本 t 检验样本量估算
analysis = TTestIndPower()
n = analysis.solve_power(effect_size=0.8,   # Cohen's d
                         alpha=0.05,
                         power=0.80,
                         alternative="two-sided")
print(f"每组需要样本量: {np.ceil(n)}")

11.5 用 G*Power 估算(科研标准工具)

G*Power 是免费软件,SCI 论文中样本量估算的"标准答案":

  1. 打开 G*Power,Test family 选 t tests,Statistical test 选 Means: Difference between two independent means (two groups)
  2. 输入:α = 0.05,Power = 0.80,Effect size d(从预实验算)。
  3. 点击 Calculate,得到每组所需样本量。
  4. 截图保存,写进论文方法部分。
💡提示

报告模板:"样本量基于 G*Power 计算(t 检验,α=0.05,功效 0.80,效应量 d=0.8),每组需要 n=26 只小鼠。"


12. 统计检验选择决策图

统计检验选择决策流程图
图 06-1统计检验选择决策流程图
text
拿到数据
│
├─ 因变量是连续变量?
│   ├─ 否 → 分类变量 → 卡方检验 / Fisher 精确检验
│   └─ 是 ↓
│
├─ 比较几组?
│   ├─ 两组 → 数据正态?
│   │   ├─ 是 → 方差齐?
│   │   │   ├─ 是 → 独立样本 t 检验
│   │   │   └─ 否 → Welch's t 检验
│   │   └─ 否 → Mann-Whitney U 检验
│   │
│   └─ ≥3 组 → 数据正态?
│       ├─ 是 → 方差齐?
│       │   ├─ 是 → One-way ANOVA → Tukey HSD 事后比较
│       │   └─ 否 → Welch's ANOVA → Games-Howell
│       └─ 否 → Kruskal-Wallis → Dunn 事后比较
│
├─ 配对/重复测量?
│   ├─ 两组配对 → 正态?→ 配对 t 检验 / Wilcoxon 符号秩检验
│   └─ 多时间点 → 重复测量 ANOVA / Friedman 检验
│
├─ 两个连续变量关系 → 相关分析(Pearson / Spearman)
├─ 预测/影响因素 → 回归分析(线性 / Logistic)
└─ 生存时间 → Kaplan-Meier + log-rank

13. 统计结果报告规范

13.1 数值报告格式

内容 规范写法
均值±标准差 5.32 ± 0.87
P 值 P < 0.05 / P < 0.01 / P < 0.001;精确值保留 3 位(如 P = 0.032)
检验统计量 t(22) = 3.45(括号内是自由度)
效应量 Cohen's d = 0.8
置信区间 95% CI: 0.32–1.28

13.2 显著性标记惯例

标记 含义
ns 不显著(P ≥ 0.05)
* P < 0.05
** P < 0.01
*** P < 0.001

13.3 300 字统计方法描述模板

笔记

数据以均值 ± 标准差(mean ± SD)表示。采用 Shapiro-Wilk 检验评估数据正态性,Levene 检验评估方差齐性。两组间比较采用独立样本 t 检验(方差不齐时采用 Welch's t 检验)或 Mann-Whitney U 检验(非正态数据)。多组间比较采用单因素方差分析(One-way ANOVA),组间两两比较采用 Tukey HSD 事后检验;非正态数据采用 Kruskal-Wallis 检验。相关性分析采用 Pearson 或 Spearman 相关。P < 0.05 认为差异具有统计学意义。统计分析使用 Python 3.13(scipy 1.15、statsmodels 0.14)完成。

13.4 SCI 风格图

python
import matplotlib.pyplot as plt
import seaborn as sns

# 两组比较图(箱线图 + 散点 + 显著性标注)
plt.figure(figsize=(5, 5))
sns.boxplot(data=df, x="group", y="value", width=0.4, palette="Set2")
sns.stripplot(data=df, x="group", y="value", color="black", alpha=0.5, size=6)

# 添加显著性标注
x1, x2 = 0, 1
y_max = df["value"].max() + 1
plt.plot([x1, x1, x2, x2], [y_max, y_max+0.3, y_max+0.3, y_max], color="black", lw=1.5)
plt.text((x1+x2)/2, y_max+0.4, "**", ha="center", fontsize=14)

plt.ylim(df["value"].min()-1, y_max+1.5)
plt.show()

14. 常见坑

说明 正确做法
不做正态性检验直接 t 检验 数据偏态时结果不可靠 先 Shapiro-Wilk
忘记 ddof=1 标准差算错 NumPy 用 std(ddof=1)
ANOVA 后不做事后比较 不知道哪两组有差异 Tukey HSD
多重比较不校正 假阳性爆炸 Bonferroni / FDR
P 值当效应量 P 小≠差异大 同时报告 Cohen's d
相关当因果 有混杂因素 谨慎解释
样本量不足 功效低 实验前 G*Power 估算
报告 P 值格式错误 审稿人挑刺 按规范格式报告

15. 练习与交付物

交付物(必做)

笔记

多组实验统计分析报告:模拟"对照组 / 模型组 / 给药组"三组数据(每组 n=10),完成:

  1. 描述统计:计算每组均值 ± 标准差。
  2. 正态性检验:每组做 Shapiro-Wilk 检验。
  3. 方差齐性检验:Levene 检验。
  4. 组间比较:根据检验结果选择 One-way ANOVA(或 Kruskal-Wallis)。
  5. 事后比较:Tukey HSD(或 Dunn)。
  6. SCI 风格图:箱线图 + 散点 + 显著性标注。
  7. 统计方法描述:写 300 字统计方法段落。
  8. 样本量估算:用 G*Power 估算(含参数和结果截图)。

进阶练习

  1. 对同一组数据分别做参数检验和非参数检验,比较 P 值差异并解释原因。
  2. 模拟 1000 次"两组无差异"的数据,各做一次 t 检验,统计 P < 0.05 的比例——验证假阳性率约为 5%。
  3. 用 Pearson 和 Spearman 分别计算同一组数据的相关系数,观察差异。
  4. 用 lifelines 绘制 Kaplan-Meier 曲线并做 log-rank 检验。

16. 速查表

场景 检验方法 Python 代码
正态性 Shapiro-Wilk stats.shapiro(data)
方差齐性 Levene stats.levene(g1, g2)
两组独立 独立 t 检验 stats.ttest_ind(g1, g2)
两组独立(方差不齐) Welch's t stats.ttest_ind(g1, g2, equal_var=False)
两组配对 配对 t 检验 stats.ttest_rel(b, a)
≥3 组 One-way ANOVA stats.f_oneway(g1, g2, g3)
≥3 组事后比较 Tukey HSD pairwise_tukeyhsd(v, g)
两组独立(非正态) Mann-Whitney U stats.mannwhitneyu(g1, g2)
两组配对(非正态) Wilcoxon stats.wilcoxon(b, a)
≥3 组(非正态) Kruskal-Wallis stats.kruskal(g1, g2, g3)
重复测量(非正态) Friedman stats.friedmanchisquare(...)
分类变量 卡方检验 stats.chi2_contingency(table)
相关 Pearson / Spearman stats.pearsonr(x, y) / stats.spearmanr(x, y)
回归 OLS / Logit sm.OLS(y, X).fit()
生存分析 KM + log-rank lifelines.KaplanMeierFitter()
样本量 G*Power / statsmodels TTestIndPower().solve_power()

上一章:05 · 课题常用工具包与语法概览 | 模块一结束,下一模块见知识书 README

配套学习资源

共 28 条 · 点击跳转
B站中山大学《医学统计学》94 课 / 17 小时 · 国家精品课程B站北京大学《医学统计学与 SPSS 软件》名校课程B站梨米特《概率论与数理统计》全解析置信区间 · 中心极限定理B站点估计、区间估计和置信区间专项网页SPSSAU 数据分析系列视频t 检验 / 方差分析 / 卡方检验网页丁香园:正态性检验方法与操作图文教程B站SPSS 独立样本 t 检验实战含 Levene 方差齐性拆解B站《医学统计学》第 8 版人卫版 · t 检验教材配套B站单因素方差分析(人话版)含 SPSS 操作与解读B站SPSS 双因素重复测量方差分析实操含球形度检验B站主效应不显著别慌!交互显著怎么解简单效应拆分B站SPSS 非参数检验视频案例汇总陈老师 SPSSB站非参数检验思路总结Wilcoxon / Kruskal-WallisB站Origin 单因素方差分析Tukey / Bonferroni 方法对比网页Tukey HSD Post-Hoc Test After ANOVA英文 · 含实例B站卫生统计学——线性相关Pearson / Spearman 秩相关网页丁香园:Pearson 与 Spearman 相关规范实践医学案例B站《医学统计学》logistic 回归分析教材配套B站SPSS Logistic 回归实操多分类 + OR 值解读B站SPSS 实战|Kaplan-Meier 生存分析保姆级教程B站GraphPad Prism 绘制 Kaplan-Meier 曲线含 Log-rank 检验B站通过 G*Power 如何计算样本量实操B站GPower——如何测算实验所需样本量系列B站IBM SPSS 四格表卡方检验操作步骤解析操作解析B站SPSS 卡方检验案例含三线表及报告撰写B站GraphPad Prism 视频教程51 课时 · 作图+统计B站GraphPad 中文教程——剂量反应曲线IC50 与非线性回归B站GraphPad 柱状图与热图发表级图表