Statistical formula

📚 Catalogue


🎯 Summary-of-equations

QuantityDefinition
Genotype properties 
MAF estimate for a SNP $j$$\hat p_j = \frac {\bar{x}_j} {2}$
Expected MAF sampling variance${SE}^2_{\hat p_j} = \frac {\hat p_j(1 - \hat p_j)} {2N}$
Expected variance of a SNP$var(X_j) = 2\hat p_j (1 - \hat p_j)$
LD matrix$L = \frac {X^TX}{N}$
GRM$A = \frac {XX^T}{M}$
LD score of a SNP$l_j = \frac {1}{N^2}X^T_jXX^TX_j$
SNP effect estimates 
OLS effect estimate for model with one SNP($\hat \beta_{GWAS}$)$\hat \beta_{j, GWAS} = \frac{X^T_jy}{X^T_jX_j} = \frac{cov(X_j, y)}{var(X_j)}$
Mixed linear mode association (MLMA) estimate for one SNP$\beta _{j,MLMA} = \frac {X^T_jV^{-1}y}{X^T_jV{-1}X_j}$
OLS effect estimate for model with all SNPs ($\hat \beta_{OLS}$)$\hat \beta_{OLS} = (X^TX)^{-1}X^Ty$
BLUP effect estimate$\hat \beta_{BLUP} = (X^TX + \lambda I)^{-1}X^Ty$
Precision of SNP effect estimates 
Excepted sampling variance of $\hat{\beta}^{*}_{j,\mathrm{GWAS}}$$SE^{2}{\hat{\beta}^{*}{j}}=\mathrm{Var}!\left(\hat{\beta}^{*}{j}\mid\hat{\beta}{j}\right)\approx\frac{1}{N\cdot\mathrm{Var}(X_{j})}$

Genotype-Properties

1.1 MAF estimate for SNP $j$:

\[\hat p_j = \frac {\bar{x}_j} {2}\]
p_hat_j = mean(x[, j]) / 2

1.2 Expected MAF sampling variance:

\[{SE}^2_{\hat p_j} = \frac {\hat p_j(1 - \hat p_j)} {2N}\]
se2_p_hat_j = p_hat_j*(1 - p_hat_j) / (2 * N)

1.3 Expected variance of a SNP:

\[var(X_j) = 2\hat p_j (1 - \hat p_j)\]
var_x_j = 2 * p_hat_j * (1 - p_hat_j)

1.4 LD matrix:

\[L = \frac {X^TX}{N}\]
L = t(x) %*% x / N

SMR

SMR 里 HEIDI heterogeneity

1)符号与输入(你手里有什么)

假设某个基因 cis 区域有 n 个 SNP(nsnp = n),SNP 索引 $(k = 1,\dots,n)$。

对于每个 SNP $(k)$:

代码层面常见对应:

2)SMR ratio(每个 SNP 一个比值)

SMR 的核心比值(Wald ratio):

\[\hat b_{xy,k} = \frac{\hat b_{y,k}} {\hat b_{x,k}}\]

把所有 SNP 的 ratio 堆成向量:

\[\hat{\mathbf b}_{xy} = (\hat b_{xy,1}, \dots, \hat b_{xy,n})^\top\]

形状检查:

3)SMR ratio 的 SE(每个 SNP 一个标准误)

前面已经定义了每个 SNP $k$ 的 ratio:

\[\hat b_{xy,k} = \frac{\hat b_{y,k}}{\hat b_{x,k}}\]

那么他对应的抽样方差(delta method 一阶近似)则推导如下

把 $u=\hat b_{y,k}$、$v=\hat b_{x,k}$、$f(u,v)=u/v$,则:

\[\frac{\partial f}{\partial u}=\frac{1}{v},\quad \frac{\partial f}{\partial v}=-\frac{u}{v^2}\]

因此一般形式(保留 $Cov(\hat b_{y,k},\hat b_{x,k})$):

\[SE^2_{\hat b_{xy,k}} = Var(\hat b_{xy,k}) \approx \left(\frac{1}{\hat b_{x,k}}\right)^2 \hat s_{y,k}^2 + \left(\frac{\hat b_{y,k}}{\hat b_{x,k}^2}\right)^2 \hat s_{x,k}^2 - 2\left(\frac{1}{\hat b_{x,k}}\right)\left(\frac{\hat b_{y,k}}{\hat b_{x,k}^2}\right)Cov(\hat b_{y,k},\hat b_{x,k})\]

SMR 常用两样本设定(GWAS 与 eQTL 来自独立样本)下,近似 $Cov(\hat b_{y,k},\hat b_{x,k})\approx 0$,于是:

\[SE^2_{\hat b_{xy,k}} \approx \frac{\hat s_{y,k}^2}{\hat b_{x,k}^2} + \frac{\hat b_{y,k}^2 \hat s_{x,k}^2}{\hat b_{x,k}^4}\]

最终:

\[SE_{\hat b_{xy,k}}=\sqrt{SE^2_{\hat b_{xy,k}}}\]

代码层面常见对应:

形状检查:

备注:

4)基于 SMR 框架:SMR 输出的 b / se 代表什么?

SMR 把 cis-eQTL top SNP 当作工具变量 $z$,把表达当 exposure $x$,把性状当 outcome $y$。

(a)SMR 的效应估计 b(输出里的 b_SMR

SMR 默认用 lead SNP 的 Wald ratio 作为 SMR 效应估计:

\[b_{SMR}\equiv \hat b_{xy,0}=\frac{\hat b_{y,0}}{\hat b_{x,0}}\]

它表示的是:在工具变量 $z$ 支撑下,表达 $x$ 每增加 1 个单位(以 eQTL 数据中表达的刻度为单位),性状 $y$ 改变多少。

单位怎么理解取决于你输入 summary 的定义:

关键点:

(b)SMR 的标准误 se(输出里的 se_SMR

se_SMR 就是同一个 lead SNP ratio 的标准误:

\[se_{SMR}\equiv SE_{\hat b_{xy,0}} \approx \sqrt{ \frac{\hat s_{y,0}^2}{\hat b_{x,0}^2} + \frac{\hat b_{y,0}^2 \hat s_{x,0}^2}{\hat b_{x,0}^4} }\]

它代表的是:$\hat b_{y,0}$(GWAS)和 $\hat b_{x,0}$(eQTL)的抽样误差,经过 ratio(除法)传播后,$b_{SMR}$ 的抽样不确定性。

(c)SMR 的显著性检验(输出里的 p_SMR

SMR 用 1 df 的 Wald/chi-square 检验(两种写法等价):

\[Z_{SMR}=\frac{b_{SMR}}{se_{SMR}} \quad\Rightarrow\quad T_{SMR}=Z_{SMR}^2 \sim \chi^2_{1}\]

解释:

(后面的 HEIDI 就是在这个基础上,用多个 SNP 的 ratio 一致性来检验是否更像“同一因果信号”还是“linkage/多信号混合”。)

HEIDI

1)HEIDI 的核心:差值向量 d(用来测“异质性”)

先选一个 lead SNP(索引记作 $0$,代码里就是 lead)。

对每个非 lead SNP $i \neq 0$,定义差值:

\[\hat d_i = \hat b_{xy,i} - \hat b_{xy,0}\]

把所有 $i \neq 0$ 的差值堆成向量:

\[\hat{\mathbf d} = (\hat d_1, \dots, \hat d_m)^\top\]

其中 $m = n-1$

直觉:

形状检查:

2)MVN 是什么?为什么会出现?

MVN = Multivariate Normal,多元正态分布。

HEIDI 使用近似:

\[\hat{\mathbf d} \sim MVN(\mathbf d, V)\]

含义:

零假设(无异质性):

\[H_0: \mathbf d = 0\]

为什么 $V$ 不是对角矩阵?

3)最关键:怎么从 Sigma_b = Cov(bxy) 构造 V = Cov(d)

先定义:

\[\Sigma_b = Cov(\hat{\mathbf b}_{xy})\]

元素是 $\Sigma_b[k,l] = Cov(\hat b_{xy,k}, \hat b_{xy,l})$

因为 $\hat d_i = \hat b_{xy,i} - \hat b_{xy,0}$,所以对任意非 lead SNP $i,j \neq 0$:

\[Cov(\hat d_i, \hat d_j) = Cov(\hat b_{xy,i} - \hat b_{xy,0},\ \hat b_{xy,j} - \hat b_{xy,0})\]

用协方差恒等式 $Cov(A-B, C-B)=Cov(A,C)+Var(B)-Cov(A,B)-Cov(C,B)$ 得到:

\[Cov(\hat d_i,\hat d_j) = Cov(\hat b_{xy,i},\hat b_{xy,j}) + Var(\hat b_{xy,0}) - Cov(\hat b_{xy,i},\hat b_{xy,0}) - Cov(\hat b_{xy,j},\hat b_{xy,0})\]

这就是构造 V=covdxy 的根本原因:d 是 bxy 的线性变换,协方差可以直接从 Sigma_b 推出来。

4)HEIDI 统计量(概念上怎么用 V)

常见二次型(不显式求逆,用 solve 更稳):

\[Q = \hat{\mathbf d}^\top V^{-1}\hat{\mathbf d}\]

近似下:

解释:


Eigen Decomposition

1.基本概念

1.1 数学定义 对于实对称矩阵 $R$(如LD矩阵),存在特征值分解:

\[R = U \Lambda U^T\]

其中:

1.2 各成分解释

符号名称维度性质
R原始矩阵m × m对称正定
U特征向量矩阵m × m正交矩阵:UᵀU = I
Λ特征值矩阵m × m对角矩阵:diag(λ₁, λ₂, …, λₘ)
λᵢ特征值标量λ₁ ≥ λ₂ ≥ … ≥ λₘ > 0

2.几何意义

变换三部曲

\[R \times 向量 = U \times \Lambda \times U^T \times 向量\]
  1. $U^T \times \text{向量}$:旋转到特征向量坐标系

  2. $\Lambda \times (\text{结果})$:沿新坐标轴缩放

  3. $U \times (\text{结果})$:旋转回原始坐标系

3. R语言实现

3.1 基础分解

# 生成对称矩阵
set.seed(123)
m <- 5
R <- matrix(runif(m^2, 0.1, 0.9), m, m)
R <- (R + t(R)) / 2  # 强制对称
diag(R) <- 1         # 对角线设为1(LD矩阵)

# 特征值分解
eig <- eigen(R, symmetric = TRUE)

# 提取结果
U <- eig$vectors      # 特征向量矩阵
values <- eig$values  # 特征值向量
Lambda <- diag(values) # 特征值对角矩阵

# 验证分解正确性
R_recon <- U %*% Lambda %*% t(U)
all.equal(R, R_recon, tolerance = 1e-10)  # 应返回TRUE

3.2 降维近似(低秩近似)

# 只保留前k个主成分
k <- 2  # 保留的主成分数量

# 选择前k个特征值和特征向量
U_k <- U[, 1:k]                # m × k
values_k <- values[1:k]        # 长度k
Lambda_k <- diag(values_k)     # k × k

# 低秩近似重建
R_approx <- U_k %*% Lambda_k %*% t(U_k)  # m × m,但秩为k

4. 遗传学中的应用

4.1 LD矩阵分析

# LD矩阵的特征值分解
analyze_ld_structure <- function(R, eigen_ratio = 0.95) {
    eig <- eigen(R, symmetric = TRUE)
    values <- eig$values
    U <- eig$vectors
    
    # 计算累积方差解释比例
    total_var <- sum(values)
    cum_prop <- cumsum(values) / total_var
    
    # 确定保留的主成分数
    k <- which(cum_prop >= eigen_ratio)[1]
    if (is.na(k)) k <- length(values)
    
    # 输出结果
    cat("总方差:", total_var, "\n")
    cat("特征值分布:\n")
    print(head(values, 10))
    cat("\n保留主成分数:", k, "\n")
    cat("解释方差比例:", cum_prop[k], "\n")
    
    return(list(U = U, values = values, k = k))
}

4.2 高效计算技巧

# 技巧1:计算 R × beta(避免显式构造R)
compute_R_times_beta <- function(beta, U, values) {
    # beta: m×1向量
    # U: m×k特征向量矩阵
    # values: k个特征值
    
    # 高效计算:R × beta = U × diag(values) × U^T × beta
    tmp <- crossprod(U, beta)  # = U^T × beta,k×1矩阵
    tmp <- tmp[, 1] * values   # 转换为向量并乘以特征值
    result <- U %*% tmp        # = U × (diag(values) × U^T × beta)
    
    return(result)
}

# 技巧2:计算 R^{-1} × beta(避免求逆)
compute_R_inv_times_beta <- function(beta, U, values, epsilon = 1e-8) {
    # 过滤小特征值,避免数值问题
    keep <- values > epsilon
    U_filtered <- U[, keep]
    values_filtered <- values[keep]
    
    # 计算:R^{-1} × beta = U × diag(1/values) × U^T × beta
    tmp <- crossprod(U_filtered, beta)
    tmp <- tmp[, 1] / values_filtered  # 关键:除以特征值!
    result <- U_filtered %*% tmp
    
    return(result)
}

5. 数值稳定性处理

5.1 正定性校正

# 确保矩阵正定
ensure_positive_definite <- function(R, eig_tol = 1e-8) {
    eig <- eigen(R, symmetric = TRUE)
    values <- eig$values
    U <- eig$vectors
    
    # 检查最小特征值
    min_eig <- min(values)
    if (min_eig < eig_tol) {
        cat(sprintf("警告:最小特征值 = %.2e,进行校正\n", min_eig))
        
        # 方法1:添加岭惩罚
        lambda <- abs(min_eig) + 1e-6
        R_corrected <- R + diag(lambda, nrow(R))
        
        # 重新标准化(如果是相关矩阵)
        s <- 1 / sqrt(diag(R_corrected))
        R_corrected <- diag(s) %*% R_corrected %*% diag(s)
        
        return(R_corrected)
    }
    
    return(R)
}

5.2 nearPD 校正

# 使用Matrix包的nearPD函数
if (!require(Matrix)) install.packages("Matrix")
library(Matrix)

correct_with_nearpd <- function(R) {
    # 寻找最近的正定矩阵
    R_pd <- nearPD(R, 
                   corr = TRUE,      # 保持相关矩阵结构
                   keepDiag = TRUE,  # 保持对角线
                   do2eigen = TRUE,  # 确保正定
                   eig.tol = 1e-6,   # 特征值容忍度
                   conv.tol = 1e-7,  # 收敛容忍度
                   maxit = 100)      # 最大迭代次数
    
    return(as.matrix(R_pd$mat))
}

6. 总结表格

操作公式R 代码实现
特征值分解$R = U \Lambda U^\top$eig <- eigen(R, symmetric = TRUE)
重建矩阵$R_{\text{recon}} = U \Lambda U^\top$U %*% diag(values) %*% t(U)
低秩近似$R \approx U_k \Lambda_k U_k^\top$U[, 1:k] %*% diag(values[1:k]) %*% t(U[, 1:k])
计算 $R b$$U\big(\Lambda (U^\top b)\big)$U %*% (crossprod(U, b)[, 1] * values)
计算 $R^{-1} b$$U\big(\Lambda^{-1} (U^\top b)\big)$U %*% (crossprod(U, b)[, 1] / values)
特征值过滤保留 $\lambda_i > \epsilon$keep <- values > epsilon