跳转至

生信面试统计学概念题精选

一句话概述:生信面试中统计学题集中在假设检验(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 教程