06 · 生物统计与实验数据分析
掌握从数据到结论的完整统计流程——数据类型判断 → 正态性/方差齐性检验 → 选择合适的检验方法 → 多重比较校正 → 结果报告。这是判断"你的实验结论是否可信"的核心能力。
0. 小白导读:统计到底在干什么?
1. 统计基础概念
1.1 总体与样本
- 总体(Population):你关心的所有个体。例如"所有 MCAO 模型小鼠"。
- 样本(Sample):实际测量的那一部分。例如"随机选取的 8 只 MCAO 模型小鼠"。
- 统计推断:用样本数据推断总体特征。样本量越大,推断越可靠。
1.2 描述统计 vs 推断统计
| 类型 | 作用 | 指标 |
|---|---|---|
| 描述统计 | 描述数据本身 | 均值、中位数、标准差、四分位数 |
| 推断统计 | 从样本推断总体 | P 值、置信区间、效应量 |
1.3 均值、中位数与标准差
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 置信区间
置信区间(Confidence Interval, CI)表示总体参数可能落在的范围。95% CI 的含义:重复抽样 100 次,约 95 次的区间会包含真实总体均值。
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₀(通常为"无差异")和备择假设 H₁("有差异")。
- 计算检验统计量(t、F、U 等)。
- 得到 P 值:在 H₀ 为真的前提下,观察到当前数据(或更极端)的概率。
- 判断: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)都要求数据近似正态。
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 偏态分布
当数据不对称(如大多数值小、少数值很大)时称为偏态分布。常见于:浓度、时间、费用等只能为正且右偏的数据。
# 右偏数据示例(对数正态分布) 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)
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 检验(大样本)
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 图(直观判断)
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 检验(推荐,对非正态稳健)
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 检验(对正态敏感)
stat, p = stats.bartlett(group1, group2)
数据正态时两者皆可;数据非正态时用 Levene。方差不齐时:
-
两组比较 → 用 Welch's t 检验(
ttest_ind(equal_var=False)) -
多组比较 → 用 Welch's ANOVA 或非参数检验
5. 参数检验:t 检验与方差分析
5.1 独立样本 t 检验(两组独立数据)
适用:比较两个独立组的均值,如"对照组 vs 模型组"的梗死体积。
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 检验(同一批对象前后比较)
适用:同一批小鼠给药前后、同一细胞系处理前后。
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 组的均值,如"对照组 / 低剂量 / 高剂量"。
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)
适用:两个因素(如"药物 × 时间")对结果的影响。
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 的释放率)。
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 检验(两组独立,非参数)
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 符号秩检验(配对,非参数)
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 组,非参数)
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 检验(重复测量,非参数)
# 同一批对象多个时间点 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 卡方检验(分类变量)
适用:两个分类变量的关联,如"是否给药 × 是否存活"。
# 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. 多重比较校正
问题:做 10 次检验,即使全部无差异,也有约 40% 概率出现至少一次假阳性(0.05 × 10)。比较次数越多,假阳性风险越大。
7.1 常用校正方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| Bonferroni | P × 比较次数 | 比较次数少(<10),最严格 |
| Tukey HSD | 两两比较专用 | ANOVA 后的事后比较(推荐) |
| Dunnett | 各处理组 vs 对照组 | 只需与对照组比较 |
| Games-Howell | 方差不齐时 | 方差不齐的两两比较 |
| FDR (BH) | 控制假发现率 | 组学数据(成千上万次检验) |
7.2 Tukey HSD(ANOVA 后的事后比较)
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 值校正)
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 相关(数据正态时)
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 相关(数据非正态或有序数据)
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 简单线性回归(一个自变量)
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 多元线性回归(多个自变量)
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 回归(因变量是分类)
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 回归结果报告要点
- R²:自变量解释因变量变异的比例。
- 回归系数 β:自变量每增加 1 个单位,因变量平均变化多少。
- P 值:系数是否显著(≠0)。
- 置信区间:系数的 95% CI。
10. 生存分析(可选)
适用:关注"事件发生时间"的数据,如小鼠存活时间、复发时间。特点是存在删失数据(实验结束时未发生事件)。
10.1 Kaplan-Meier 曲线
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 检验(比较两组生存曲线)
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 效应量
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 估算样本量
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 论文中样本量估算的"标准答案":
- 打开 G*Power,Test family 选
t tests,Statistical test 选Means: Difference between two independent means (two groups)。 - 输入:α = 0.05,Power = 0.80,Effect size d(从预实验算)。
- 点击 Calculate,得到每组所需样本量。
- 截图保存,写进论文方法部分。
报告模板:"样本量基于 G*Power 计算(t 检验,α=0.05,功效 0.80,效应量 d=0.8),每组需要 n=26 只小鼠。"
12. 统计检验选择决策图
拿到数据 │ ├─ 因变量是连续变量? │ ├─ 否 → 分类变量 → 卡方检验 / 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 风格图
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),完成:
- 描述统计:计算每组均值 ± 标准差。
- 正态性检验:每组做 Shapiro-Wilk 检验。
- 方差齐性检验:Levene 检验。
- 组间比较:根据检验结果选择 One-way ANOVA(或 Kruskal-Wallis)。
- 事后比较:Tukey HSD(或 Dunn)。
- SCI 风格图:箱线图 + 散点 + 显著性标注。
- 统计方法描述:写 300 字统计方法段落。
- 样本量估算:用 G*Power 估算(含参数和结果截图)。
进阶练习
- 对同一组数据分别做参数检验和非参数检验,比较 P 值差异并解释原因。
- 模拟 1000 次"两组无差异"的数据,各做一次 t 检验,统计 P < 0.05 的比例——验证假阳性率约为 5%。
- 用 Pearson 和 Spearman 分别计算同一组数据的相关系数,观察差异。
- 用 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