生信面试统计学概念题精选¶
一句话概述:生信面试中统计学题集中在假设检验(p值/FDR)、概率分布、回归分析、降维(PCA)和实验设计五个方向,理解"为什么要做统计"比"怎么跑命令"更重要。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| p值 | 假设"没差异"时,观察到当前结果(或更极端)的概率 |
| FDR | 假发现率,你宣称显著的结果中有多少是假的 |
| 效应量 | 差异有多大(p值只说有没有,效应量说大不大) |
| 正态分布 | 钟形曲线,自然界最常见的分布 |
| 统计功效 | 如果真有差异,你能检测到的概率(1-β) |
| 置信区间 | 真实值可能在的范围(如95% CI) |
| PCA | 主成分分析,高维数据降维可视化 |
| 过拟合 | 模型学了噪声而不是规律 |
一、假设检验(最高频考点)¶
p值是什么?¶
面试回答模板:
p值 = 在零假设(H0: 没有差异)为真的前提下,
观察到当前结果或更极端结果的概率。
例子(白话版):
假设一枚硬币是公平的(H0),你抛了10次得到9次正面。
p值 = 公平硬币抛10次得到>=9次正面的概率
= P(X≥9 | 公平) = 0.011 (约1.1%)
p < 0.05 → 如果真是公平的,这种极端结果发生概率<5%
→ "不太可能是巧合" → 拒绝H0 → 认为硬币不公平
p值的常见误解(面试陷阱):
× p值不是"H0为真的概率"
× p值不是"效应大小"(p很小但效应可能很小)
× p<0.05不是"结果一定是真的"(还有5%概率犯错)
× p>0.05不是"没有差异"(可能是统计功效不够)
多重检验校正¶
# ========== 为什么需要多重检验校正? ==========
# 问题:同时检验20000个基因是否差异表达
# 即使没有真正的差异,纯靠随机也会有:
# 20000 × 0.05 = 1000 个"假阳性"!
# Bonferroni校正(最保守)
# 校正后阈值 = 0.05 / 检验次数
# 例:0.05 / 20000 = 0.0000025
# 优点:严格控制FWER(家族错误率)
# 缺点:太保守,容易漏掉真差异
# BH校正(Benjamini-Hochberg,最常用)
# 控制FDR(假发现率)
import numpy as np
def bh_correction(pvalues):
"""BH多重检验校正(计算adjusted p-value)"""
n = len(pvalues) # 检验次数
# 按p值排序
sorted_idx = np.argsort(pvalues) # 排序索引
sorted_p = np.array(pvalues)[sorted_idx] # 排序后的p值
# BH公式:adjusted_p = p × n / rank
adjusted = np.zeros(n)
for i in range(n-1, -1, -1): # 从大到小
rank = i + 1
if i == n - 1:
adjusted[sorted_idx[i]] = sorted_p[i]
else:
adjusted[sorted_idx[i]] = min(
sorted_p[i] * n / rank, # BH公式
adjusted[sorted_idx[i+1]] # 不能超过后面的
)
return adjusted
# 示例
raw_p = [0.001, 0.04, 0.03, 0.0001, 0.06, 0.02]
adj_p = bh_correction(raw_p)
for i, (raw, adj) in enumerate(zip(raw_p, adj_p)):
sig = "***" if adj < 0.05 else "ns"
print(f"Gene{i+1}: raw_p={raw:.4f}, padj={adj:.4f} {sig}")
# 面试关键:
# padj < 0.05 意味着:在所有你宣称"显著"的基因中,
# 预期最多5%是假阳性。比如你说有100个基因显著差异,
# 其中大约最多5个是假的。这在生信中是可以接受的。
二、概率分布(基础但重要)¶
# ========== 生信常见的概率分布 ==========
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 1. 正态分布(连续型,最常见)
# 用途:基因表达量(log转换后)、身高体重等连续数据
# 参数:均值μ,标准差σ
# 特征:对称的钟形曲线,68-95-99.7法则
normal_data = np.random.normal(loc=0, scale=1, size=1000) # 标准正态
# 2. 泊松分布(离散型,计数数据)
# 用途:read counts、突变数、罕见事件
# 参数:λ(平均发生率)
# 特征:均值=方差=λ
poisson_data = np.random.poisson(lam=5, size=1000) # λ=5
# 3. 负二项分布(离散型,过离散计数数据)
# 用途:RNA-seq counts数据(比泊松更灵活)
# 特征:方差>均值(过离散),DESeq2/edgeR的核心假设
# 为什么RNA-seq不用泊松?因为生物学重复间的变异使得方差>均值
nbinom_data = np.random.negative_binomial(n=5, p=0.5, size=1000)
# 4. 二项分布(离散型,是/否的计数)
# 用途:SNP的等位基因计数、变异检测中的reads支持数
# 参数:n(试验次数), p(成功概率)
binom_data = np.random.binomial(n=100, p=0.5, size=1000)
# 5. 均匀分布(连续型)
# 用途:p值在零假设下应该服从均匀分布(QQ图检验用)
uniform_data = np.random.uniform(0, 1, size=1000)
# 面试要点:
# - RNA-seq用负二项分布,不用泊松(过离散)
# - 正态分布是很多参数检验的前提假设
# - p值在H0下均匀分布 → QQ图应该是对角线
三、回归分析¶
# ========== 线性回归和逻辑回归 ==========
from sklearn.linear_model import LinearRegression, LogisticRegression
import numpy as np
# 线性回归(预测连续值)
# 用途:基因表达量与表型的关系、药物剂量与反应
# y = β0 + β1×x1 + β2×x2 + ... + ε
X = np.array([[1], [2], [3], [4], [5]]) # 自变量
y = np.array([2.1, 4.0, 5.8, 8.1, 9.9]) # 因变量
model = LinearRegression()
model.fit(X, y) # 拟合
print(f"斜率: {model.coef_[0]:.2f}") # β1
print(f"截距: {model.intercept_:.2f}") # β0
print(f"R²: {model.score(X, y):.3f}") # 决定系数(0-1,越大越好)
# R²解读:
# R²=0.95 → 模型解释了95%的数据变异
# R²=0.30 → 模型解释了30%的数据变异(较弱)
# 逻辑回归(预测分类/概率)
# 用途:疾病预测、变异致病性预测
# P(y=1) = 1 / (1 + e^-(β0 + β1×x1 + ...))
# OR(Odds Ratio) = e^β
# OR > 1 → 正相关(风险因子)
# OR < 1 → 负相关(保护因子)
# OR = 1 → 无关
# 面试要点:
# - 线性回归假设:残差正态分布、方差齐性、自变量间无多重共线性
# - 逻辑回归输出概率(0-1),经过sigmoid函数转换
# - Cox回归用于生存分析(考虑时间因素),输出HR(Hazard Ratio)
四、降维与聚类¶
# ========== PCA 主成分分析 ==========
from sklearn.decomposition import PCA
import numpy as np
# PCA 的本质(白话版):
# 把高维数据投影到低维空间,同时保留尽可能多的信息(方差)
# 就像把3D物体拍照变成2D,选择最好的拍摄角度
# 模拟基因表达数据(100个基因 × 20个样本)
np.random.seed(42)
expression = np.random.randn(20, 100) # 20个样本,100个基因
# 运行PCA
pca = PCA(n_components=10) # 提取前10个主成分
pc_scores = pca.fit_transform(expression) # 转换
# 查看每个PC解释的方差比例
for i, var in enumerate(pca.explained_variance_ratio_[:5]):
print(f"PC{i+1}: {var*100:.1f}%") # 每个PC解释的方差%
# 总方差解释比例
cumvar = np.cumsum(pca.explained_variance_ratio_)
print(f"前2个PC累计解释: {cumvar[1]*100:.1f}%")
print(f"前5个PC累计解释: {cumvar[4]*100:.1f}%")
# 面试要点:
# 1. PCA图上的距离代表样本间的相似度
# 2. PC1解释最多变异,PC2次之
# 3. 如果PC1把分组分开 → 分组是最大的变异来源
# 4. 如果批次在PC1分开 → 批次效应是主要变异(需要校正)
# 5. PCA是无监督方法(不用标签信息)
# 6. PCA前通常要做标准化(Z-score)
# ========== 聚类方法 ==========
# 层次聚类(Hierarchical clustering)
# 用途:热图中的行/列排序、样本/基因分组
# 方法:自底向上不断合并最相似的簇
# 距离:欧氏距离、相关系数距离
# 链接方式:ward(最小方差)、complete(最远距离)、average(平均距离)
# K-means聚类
# 用途:基因表达模式分组
# 需要预设K值(簇数)
# 确定K值的方法:肘部法(Elbow method)、轮廓系数(Silhouette)
# t-SNE / UMAP
# 用途:单细胞数据可视化(非线性降维)
# t-SNE:保留局部结构,计算慢
# UMAP:保留全局+局部结构,更快
# 注意:t-SNE/UMAP上的距离不代表真实距离,不能比较簇间距离
五、实验设计与统计功效¶
# ========== 样本量和统计功效 ==========
# 统计功效(Power) = 如果真有差异,你能检测到的概率
# Power = 1 - β(β是假阴性率/II型错误)
# 一般要求 Power ≥ 0.8(80%)
# 影响统计功效的因素:
# 1. 样本量(n) ↑ → Power ↑(最重要!)
# 2. 效应量(d) ↑ → Power ↑(差异越大越容易检测)
# 3. 显著性水平(α) ↑ → Power ↑(但假阳性也增加)
# 4. 数据变异性(σ) ↓ → Power ↓(噪声大难以检测)
from scipy.stats import norm
import numpy as np
def sample_size_ttest(effect_size, alpha=0.05, power=0.8):
"""
计算t检验需要的最小样本量
effect_size: Cohen's d = (μ1-μ2) / σ(差异/标准差)
"""
z_alpha = norm.ppf(1 - alpha/2) # α对应的z值
z_beta = norm.ppf(power) # Power对应的z值
n = 2 * ((z_alpha + z_beta) / effect_size) ** 2 # 每组样本量
return int(np.ceil(n)) # 向上取整
# 不同效应量需要的样本量
for d in [0.2, 0.5, 0.8, 1.0, 1.5]:
n = sample_size_ttest(d)
print(f"效应量d={d}: 每组需要 {n} 个样本")
# 结果大概是:
# d=0.2(小效应): 每组~394个样本
# d=0.5(中效应): 每组~64个样本
# d=0.8(大效应): 每组~26个样本
# d=1.0: 每组~17个样本
# d=1.5: 每组~9个样本
# 面试要点:
# RNA-seq:一般3个生物学重复是最低要求,推荐5-6个
# WGS/WES:取决于预期的突变频率和效应量
# 宏基因组:通常需要20-30个样本/组才有统计功效
实验设计概念¶
面试常考的实验设计概念:
1. 生物学重复 vs 技术重复
- 生物学重复:不同个体/样本(反映真实的生物变异)
- 技术重复:同一样本测多次(反映技术误差)
- 统计分析用生物学重复!技术重复不能增加统计功效
2. 配对设计 vs 独立设计
- 配对:同一患者的肿瘤vs正常(配对t检验)
- 独立:不同人的患者组vs对照组(独立t检验)
- 配对设计更强(消除个体差异),但不总是可行
3. 随机化和盲法
- 随机化:随机分配样本到不同批次/泳道
- 盲法:分析时不知道样本分组
- 防止系统偏差和主观偏差
4. 混杂因素
- 年龄、性别、BMI等可能同时影响自变量和因变量
- 解决:匹配设计、在统计模型中加入协变量
- 例:比较T2D和对照的菌群差异时,需要控制年龄和BMI
六、相关性与因果性¶
# ========== 相关性 ≠ 因果性 ==========
# 相关系数类型
from scipy import stats
# Pearson相关(线性关系,连续数据,正态分布)
r, p = stats.pearsonr(x, y)
# r = 1: 完全正相关
# r = 0: 无线性相关
# r = -1: 完全负相关
# Spearman相关(单调关系,不要求正态,更稳健)
rho, p = stats.spearmanr(x, y)
# 基于秩(rank)计算,对异常值不敏感
# 面试经典问题:
# Q: 冰淇淋销量和溺水人数高度正相关,是因果关系吗?
# A: 不是。两者都受第三个变量(温度/夏天)影响。
# 这叫"混杂因素"(confounding variable)。
# 相关性可以发现关联,但不能证明因果。
# 证明因果需要:随机对照实验、孟德尔随机化(MR)等方法。
# 生信中的例子:
# 基因A表达量和基因B表达量相关 → 可能是:
# 1. A调控B(因果)
# 2. B调控A(反向因果)
# 3. 第三个因子C同时调控A和B(混杂)
# 4. A和B在同一个通路中(共调控)
# 5. 纯粹巧合(假阳性)
七、贝叶斯统计基础¶
贝叶斯定理(白话版):
P(A|B) = P(B|A) × P(A) / P(B)
翻译:
"在看到证据B之后,A的概率"
= "如果A为真,看到B的概率" × "A本来的概率"
/ "不管A真不真,看到B的概率"
生信应用:
1. GATK变异检测:
P(变异|数据) = P(数据|变异) × P(变异) / P(数据)
- P(变异): 先验概率(gnomAD中的频率)
- P(数据|变异): 似然(reads支持变异的概率)
- P(变异|数据): 后验概率(最终判断)
2. 差异表达(贝叶斯方法如limma):
借用所有基因的信息来估计单个基因的方差
→ 经验贝叶斯(Empirical Bayes)
→ 对低表达基因的方差估计更稳定
面试要点:
- 频率学派:p值、置信区间("如果重复实验多次")
- 贝叶斯学派:后验概率、可信区间("给定数据,参数的概率")
- GATK、limma、PyClone等工具都用贝叶斯方法
八、常见报错与解决¶
| 问题 | 原因 | 解决方法 |
|---|---|---|
| p值全部是0或NA | 数据有问题或方差为0 | 检查数据,去掉零方差的特征 |
| 校正后全部不显著 | 多重检验过于保守或真的没差异 | 增大样本量,或用更宽松的FDR阈值 |
| 相关系数≈0但明显有关系 | 非线性关系 | 用Spearman或看散点图 |
| PCA第一个PC解释<10% | 数据没有主要变异模式 | 可能数据确实很均匀,尝试其他降维 |
九、面试高频问题¶
Q1:p值<0.05一定有生物学意义吗?
不一定。p值只反映统计显著性,不反映效应大小。样本量足够大时,很小的差异也能得到p<0.05。要同时看效应量(如logFC)和置信区间。生信中同时要求padj<0.05和|logFC|>1就是这个原因。
Q2:什么是I型错误和II型错误?
I型错误(α, 假阳性):实际没差异但你说有差异。II型错误(β, 假阴性):实际有差异但你没检测到。降低α会增加β(更保守=更多漏检),所以需要在两者间平衡。增加样本量可以同时降低两种错误。
Q3:参数检验和非参数检验怎么选?
参数检验(t/ANOVA)假设数据正态分布,统计功效更高。非参数检验(Wilcoxon/Kruskal-Wallis)不假设分布,更稳健但功效略低。选择流程:先做正态性检验(Shapiro-Wilk),正态→参数,不正态→非参。样本量n>30时,因中心极限定理参数检验也基本可靠。
Q4:PCA图上两个样本靠近是什么意思?
表示这两个样本在主成分空间中相似——即在解释最多方差的基因组合上有相似的表达模式。但注意PCA只显示前几个PC的信息,不是全部信息。如果PC1+PC2只解释30%方差,那靠近不代表真的很相似。
十、速查表¶
# === 统计学面试速查 ===
# 假设检验选择
# 2组连续+正态 → t检验
# 2组连续+非正态 → Wilcoxon
# 3+组连续 → ANOVA/Kruskal-Wallis
# 2组分类 → 卡方检验/Fisher精确检验
# 相关性 → Pearson(正态)/Spearman(非正态)
# 多重校正
# Bonferroni: p × n(最保守)
# BH(FDR): 控制假发现率(最常用)
# padj < 0.05 = 预期假阳性<5%
# 效应量
# Cohen's d = (μ1-μ2)/σ: 小=0.2, 中=0.5, 大=0.8
# log2FC > 1 = 2倍变化
# 分布选择
# 连续数据 → 正态分布
# count数据(方差=均值) → 泊松
# count数据(方差>均值) → 负二项(RNA-seq用这个)
# 比例数据 → 二项分布
# 降维方法
# PCA → 线性降维,解释方差
# t-SNE/UMAP → 非线性降维,可视化用
# NMF → 非负矩阵分解,特征提取
参考资料:Statistics for Biologists (Nature 2013 系列)、Modern Statistics for Modern Biology (Holmes & Huber 2019)、StatQuest 教程