ASR

ASReml-R 4.2 & ASRgenomics 速查表

v2 · 修订版

混合模型 (REML) · 系谱 / 基因组选择 (GBLUP / ssGBLUP) · GWAS (ASRgwas) · 已勘误

00

本版勘误与修订说明

点击顶栏「标记修正」可在全文高亮 已修正 位置
#位置原版问题修正后后果 / 依据
19.2 ssGBLUPH.inverse(A=Amat, G=Ginv, …, inverse=TRUE)H.inverse(A=Amat, Ginv=Ginv, lambda=0.9, sparseform=TRUE)参数名为 Ginv;inverse 已标记弃用(生成 H 用 H.matrix())。ASRgenomics 手册
22.5 / 9.2“lambda=0.9 等价于 90% 基因组 + 10% 系谱”λ 同时设定 τ=ω=λ,缩放的是 (G⁻¹ − A₂₂⁻¹) 整项,取值 0–1概念错误。G 与 A₂₂ 的融合 (blend/align) 应在 G.tuneup() 完成
39.1 GBLUPG.inverse(G, sparseform=TRUE)$GinvG.inverse(G, sparseform=TRUE)$Ginv.sparsesparseform=TRUE 时 $Ginv 为 NULL,vm() 会直接报错
401 / 06 / 05ide(Animal, ainv)ide(Animal)ide() 只接受一个因子,复制模型中已有 vm() 因子的水平(WAM 教程 / VSNi KB)
56.1 模型 1无系谱重复力用 random=~ide(Animal, ainv)random = ~ Animalide() 需配合同名 vm() 项使用
62.4“x = "omit" (默认)”x 默认为 "fail"协变量含 NA 且不设 x 时模型直接报错,而不是删行
72.5vm() 默认要求 "PD"默认 singG = "NSD";"PSD" 仅在 source 为非逆 G 矩阵时使用传入逆矩阵时 PSD 无意义
8全文$\sigma^2_a$ 等 LaTeX 写法改为 Unicode:σ²ₐ、A₂₂⁻¹页面未加载 MathJax,原文显示为乱码美元符号
94.2 LRT手算 p 值未做边界修正边界检验 p = 0.5 × (1 − pchisq(D, 1))与 boundary=TRUE 的混合 χ² 一致
104.2 Wald注释称 denDF="default" 为 Kenward-Rogerdefault 依次尝试 algebraic / numeric 分母自由度注释误导
114.3 predictsed = list("Nitrogen:Variety"=TRUE)sed = TRUEsed 为逻辑值
123B 场景 A按位置填 iv$Value <- c(...)按 Component 名称赋值组分顺序随模型改变,按位置极易填错
133B 场景 Cmod_unconstrained 未定义补充无约束模型原代码无法运行
149.4 CVmod_full$vparameters.table用 start.values=TRUE 取表,再按名称填入 mod_full$vparameters拟合后的对象无此元素(只有 start.values 返回)
152.1排序注释 Trial→Row→Col 与 ar1(Column):ar1(Row) 矛盾排序与 residual 外层→内层顺序一致—
162.4“无表型个体须靠 y="include" 才获得 GEBV”只要个体在 ainv/ginv/hinv 中,vm() 就输出其 BLUPinclude 影响的是数据行与拟合值
179.2ssGBLUP 未校准 G 与 A₂₂新增 match.G2A() + G.tuneup(align=TRUE)官方 H.inverse 示例流程
18标题 / 08“ASRgenomics 1.1.6”“1.1.x”(CRAN 2025-08 为 1.1.5)版本号无法核实
19页面脚本彩色分类按钮选中后高亮失效;深色模式不记忆;深色模式下打印为深底统一 .is-active;localStorage + 系统偏好;打印前临时切回浅色交互 bug
20杂项“設定”、“取向异质性”、样式类拼写“设定”、“异质性”等错别字
01

版本迁移 (v3 → v4.x) 与全局设置

网上旧教程多为 v3 语法,务必先对照

1.1 核心语法对照表

Breaking Changes
功能v3(已废弃)v4.1 / v4.2注意事项
残差项rcov = ~ unitsresidual = ~ units
residual = ~ idv(units)
idv(units) 会多出一行固定为 1 的 units!R,位于 varcomp 末尾
系谱逆矩阵random = ~ ped(ID)
ginverse = list(ID = ainv)
random = ~ vm(ID, ainv)vm() 在公式中直接绑定因子与已知(逆)矩阵
永久环境 (PE) 已修正~ ped(ID) + ide(ID)~ vm(ID, ainv) + ide(ID)ide() 只有一个参数,沿用 vm(ID, …) 的水平但不带亲缘协方差
计算 A⁻¹asreml.Ainverse(ped)$ginvainverse(ped)返回带 rowNames、INVERSE=TRUE 属性的三元组
方差函数pin(mod, h2 ~ V1/(V1+V2))vpredict(mod, h2 ~ V1/(V1+V2))V1、V2… 对应 summary(mod)$varcomp 行号;Delta 法近似 SE
分区残差rcov = ~ at(Site):unitsresidual = ~ dsum(~ units | Site)每个 Site 一组独立残差(也可放空间结构)
GLMM 分布族family = asreml.binomial()family = asr_binomial(link = "logit")另有 asr_gaussian / asr_poisson / asr_gamma
缺失值设定na.method.Y / na.method.Xna.action = na.method(y = , x = )默认 y="include"、x="fail"(详见 2.4)

1.2 v4.2 性能与全局选项New in 4.2

  • 内存:工作空间上限提升(官方称最高约 96 GB),适合大型 G / H 矩阵。
  • 多线程:OpenMP 并行(官方称最多 16 线程),FA 与稠密矩阵运算显著提速。
  • 参数化:使用 idv / ar1v / us 等带方差的结构时,以 sigma 参数化报告组分。
全局选项 asreml.options()
library(asreml)
asreml.options(
  threads    = 8,       # 并行线程 (v4.2)
  workspace  = "8gb",   # REML 求解内存
  pworkspace = "4gb",   # predict() 内存
  maxit      = 30,      # 默认 13
  ai.sing    = TRUE     # AI 矩阵奇异时继续迭代
)
asreml.options()        # 查看当前设置
02

数据读取、系谱与模型公式

Data · Pedigree · Formula terms · na.method · 关键参数

2.1 数据读取与排序asreml.read.table()

asreml.read.table() 将首字母大写的列读为因子,小写为数值。用 read.csv() 时需自行 as.factor()。

  • 因子水平名避免空格、逗号、#、$。
  • 空间/嵌套残差:建议按 residual 项由外到内排序(ar1(Column):ar1(Row) → 先 Column 后 Row),并保证 Row×Column 网格完整(缺失小区补 NA 行)。已修正
读取与排序
nin89 <- asreml.read.table("nin89.csv", header = TRUE,
                           sep = ",", na.strings = "NA")

# residual = ~ dsum(~ ar1(Column):ar1(Row) | Trial)
# 排序顺序 = Trial -> Column -> Row
sbt <- sbt[order(sbt$Trial, sbt$Column, sbt$Row), ]

2.2 系谱 A⁻¹ 与外部逆矩阵ainverse() / giv

  • 系谱三列:个体、父本、母本;未知亲本用 0 或 NA;建议祖先排在后代之前。
  • 三元组格式:3 列 Row, Column, Value(下三角,按行内列排序),需 rowNames 与 INVERSE=TRUE 属性。
  • vm() 的因子水平须是 source 中 rowNames 的子集。
A⁻¹ 与外部三元组
# 1. 系谱直接生成 A^-1
ainv <- ainverse(harvey[, 1:3])   # Calf, Sire, Dam
head(attr(ainv, "rowNames"))

# 2. 外部三元组 (3 列) 补齐属性
hinv <- as.matrix(hinv)
attr(hinv, "rowNames") <- as.character(idd$V1)
attr(hinv, "INVERSE")  <- TRUE

# 3. 模型中绑定
mod <- asreml(y1 ~ Line, random = ~ vm(Calf, ainv),
              residual = ~ idv(units), data = harvey)

2.3 公式算符与特殊函数Table 4-1

语法用途
A:B · A*B · A/B互作;A*B = A+B+A:B;A/B = A+A:B(嵌套)
trait · units多性状索引;每个观测一个水平
mv缺失值作为额外效应估计
at(f, l)仅在 f 的水平 l 上拟合,如 at(Site, 3):Row
lin(f) · pol(x, t)因子作线性项 / 正交多项式
spl(x, k) · dev(x)三次样条(随机)/ 偏离趋势项
and(f)叠加设计矩阵(双列 Male + and(Female))
grp(name)多列协变量打包,配合 group = list(...)
str(form, vmodel)多个随机项共用协方差结构(直接-母体)

2.4 na.action = na.method(y = , x = ) 详解已修正

① 响应变量:y = "include"(默认)/ "omit" / "fail"

include:保留 y 为 NA 的行(不贡献似然),以下场景应使用:

  • 规则网格空间分析(ar1(Row):ar1(Col)):删除缺失小区会破坏网格。
  • 多性状 cbind(t1, t2):只缺一个性状的个体仍保留其他性状信息。
  • 交叉验证掩码:验证集 y 置 NA 后需保留其行,以便直接按行对齐预测值。

注:无表型个体只要出现在 ainv / ginv / hinv 的 rowNames 中,vm() 就会给出其 BLUP,与 y 的设置无关。

omit:删除 y 为 NA 的行;仅适用于无网格要求的单性状模型。

② 解释变量:x = "fail"(默认)/ "include" / "omit"

fail(默认):固定或随机项中出现 NA 时报错停止,提醒你主动处理。

include:协变量 NA 按 0 处理(⚠️ 先中心化 scale(x, scale = FALSE),让 0 等于均值);因子 NA 在设计矩阵中该行全为 0。

omit:删除任一解释变量为 NA 的整行。

2.5 高频关键参数

Essential Arguments
参数函数含义与调优
workspace / pworkspaceasreml()求解 / predict 内存,如 "4gb";报 workspace insufficient 时调大。
maxitasreml()默认 13;多性状 us()、fa()、GLMM 建议 30–100;固定方差求 BLUP 时设 1。
singG 已修正vm()默认 "NSD"(非奇异)。若 source 是关系矩阵本身(非逆)且半正定,用 vm(ID, G, singG = "PSD")。
ai.singasreml()AI 矩阵奇异时继续迭代(多性状 / FA 常用)。
equate.levelsasreml()如 c("Male","Female"):叠加模型中两因子共享水平集合。
classify / sed / averagepredict()预测分类;sed=TRUE 输出差值标准误;average 把因子纳入平均集。
sparseform 已修正G.inverse()
H.inverse()
TRUE:三元组,从 $Ginv.sparse(G.inverse)取出给 vm();FALSE:完整方阵 $Ginv,供 H.inverse(Ginv = …)。
lambda / tau / omega 已修正H.inverse()H⁻¹ = A⁻¹ + [0 0; 0 τG⁻¹ − ωA₂₂⁻¹]。给 λ 时 τ = ω = λ(0–1),缩放整个 (G⁻¹ − A₂₂⁻¹),不是“基因组/系谱比例”。
P3Dgwas.asreml()TRUE:零模型估一次方差后固定,逐 SNP 扫描快很多;精确检验或 GLMM 可设 FALSE。
03

方差结构 (G & R)、初始值与约束

后缀:无 = 相关矩阵 · v = 同质方差 · h = 异质方差

3.1 常用方差模型 (Table 5-1)

n = 水平数
函数结构参数数典型用途
id / idv / idhI ; σ²I ; diag(σ₁²…σₙ²)0 / 1 / n默认随机项;idh(Site)(= diag)异质方差
ar1 / ar1v / ar1hCij = ρ^|i−j|1 / 2 / n+1田间行列空间 ar1(Row):ar1(Column)、重复测量
ar2 / ma1 / arma / sarAR(2), MA(1), ARMA(1,1)2 / 1 / 2 / 1高阶时序 / 空间
cor / corv / corh / corghCij = ρ ; Cij = ρij(corgh)1 / 2 / n+1 / n(n+1)/2统一相关(Type-B);异质方差 + 非结构相关
us(obj, init = )Vij = σijn(n+1)/2多性状 us(trait):vm(ID, ainv);少地点 MET
fa(obj, k) / rr(obj, k)ΛΛᵀ + Ψ(rr 中 Ψ = 0)n(k+1) − k(k−1)/2多环境 G×E 首选,收敛优于 us()
vm(f, source)σ²A / σ²G / σ²H1绑定 ainv / ginv / hinv
ide(f)σ²I(沿用 vm 水平)1永久环境、母体环境

3.2 直积规则与初始值

直积单一尺度:直积项(如 Column:Row)中至多一个组分带方差,其余为相关矩阵:ar1v(Column):ar1(Row)、id(units):us(trait)。

约束代码:P 正值 · U 无约束 · F 固定 · B 落在边界 · C 等式约束。

start.values 改初值
# 1. 不拟合,仅导出参数表
sv <- asreml(yield ~ Variety, random = ~ Rep,
             data = nin89, start.values = TRUE)
iv <- sv$vparameters.table
print(iv)   # Component, Value, Constraint

# 2. 按名称修改
iv$Value[iv$Component == "Rep"] <- 0.5

# 3. 传回重新拟合
mod <- asreml(yield ~ Variety, random = ~ Rep,
              data = nin89, G.param = iv, R.param = iv)

3B 方差固定 ("F") 与等式约束 (vcc)

3.3 何时需要固定方差

  1. 常规育种值评估:参数已由大样本估计,全部设 "F" 并 maxit = 1,直接解 MME 得 BLUP 与 SE。
  2. 两阶段 MET / Meta 加权:二阶段用 weights = 1/SE²,并把 units!R 固定为 1,使误差方差等于一阶段已知值。
  3. LRT 检验特定假设:如固定 CovA = 0,或检验 rg = 1(边界检验)。
  4. 多性状逐步收敛:先用单性状方差固定对角线,只估协方差,收敛后再放开为 "P" 联合估计。
  5. GWAS 快速扫描 (P3D / EMMAX):零模型估一次 σ²ₐ、σ²ₑ,扫描时固定。

3.4 三种固定 / 约束写法已修正

Constraint = "F" 与 vcc
# 场景 A: 已知参数,固定方差直接解 BLUP —— 按名称赋值
sv <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, ginv),
             residual = ~ idv(units), data = dat1,
             start.values = TRUE)
iv <- sv$vparameters.table
print(iv$Component)   # 先确认组分名称
iv$Value[iv$Component == "vm(Genotype, ginv)"] <- 1.1427
iv$Value[iv$Component == "units!units"]        <- 1.3724
iv$Constraint <- "F"
mod_blup <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, ginv),
                   residual = ~ idv(units), data = dat1,
                   G.param = iv, R.param = iv, maxit = 1)

# 场景 B: 两阶段 MET,固定残差尺度 = 1 (wt = 1/SE^2)
sv_wt <- asreml(blue ~ Site, random = ~ fa(Site, 2):Variety,
                weights = wt, data = stage1_blues,
                start.values = TRUE)
iv_wt <- sv_wt$vparameters.table
r_row <- iv_wt$Component == "units!R"
iv_wt$Value[r_row] <- 1; iv_wt$Constraint[r_row] <- "F"
mod_stage2 <- asreml(blue ~ Site, random = ~ fa(Site, 2):Variety,
                     weights = wt, data = stage1_blues,
                     G.param = iv_wt, R.param = iv_wt)

# 场景 C: 约束父本方差 = 母本方差 (NCII)
mod_unc <- asreml(length ~ rep,
                  random = ~ female + male + female:male,
                  data = pine)                       # 无约束模型
sv_nc <- asreml(length ~ rep,
                random = ~ female + male + female:male,
                data = pine, start.values = TRUE)
gam <- sv_nc$vparameters.table
# 第 1 列: 约束组号(相同 = 相等); 第 2 列: 比例系数
M <- cbind(c(1, 1, 2, 3), c(1, 1, 1, 1))
dimnames(M) <- list(gam$Component, NULL)  # 行数须等于组分数
mod_eq <- asreml(length ~ rep,
                 random = ~ female + male + female:male,
                 vcc = M, data = pine)
lrt.asreml(mod_unc, mod_eq, boundary = FALSE)   # H0: σ²m = σ²f
04

结果提取、显著性检验与预测

varcomp · BLUE/BLUP · Wald · LRT · predict

4.1 方差组分与 BLUE / BLUP

coef(mod) 只给估计值;需要 SE 与 z.ratio 用 summary(mod, coef = TRUE)。

模型核心输出
mod$converge                  # TRUE = 收敛
mod$loglik                    # REML 对数似然
summary(mod)$aic; summary(mod)$bic   # 同一固定效应下比较
summary(mod)$varcomp          # component, std.error, z.ratio

mod <- update(mod)            # 未收敛时继续迭代

blue <- summary(mod, coef = TRUE)$coef.fixed
blup <- summary(mod, coef = TRUE)$coef.random

plot(mod)                     # 残差诊断
plot(varioGram(mod))          # 空间模型变异函数图
fitted(mod); resid(mod)

4.2 Wald 检验与 LRT已修正

  • Wald:默认 ssType = "incremental"(序贯);不平衡数据用 "conditional"。denDF = "default" 优先代数法,失败时用数值法。
  • LRT:嵌套模型且固定效应完全相同;方差 = 0 在参数边界上,用混合 χ²。
Wald 与 LRT
# 条件 F 检验 + 近似分母自由度
wald.asreml(mod, ssType = "conditional", denDF = "default")

# 随机效应 LRT (方差在边界 0 上)
lrt.asreml(mod_full, mod_reduced, boundary = TRUE)

# 手算 (单个方差组分, 边界修正 0.5χ²0 + 0.5χ²1)
D <- 2 * (mod_full$loglik - mod_reduced$loglik)
p_boundary <- 0.5 * (1 - pchisq(D, df = 1))
p_interior <- 1 - pchisq(D, df = 1)  # 协方差/相关等非边界参数

4.3 predict 与可靠性已修正

predict() 基于超表对其他因子求平均,给出 classify 组合的预测值与 SED。

predict 与 reliability
pv <- predict(mod, classify = "Variety", sed = TRUE)
head(pv$pvals)   # predicted.value, std.error, status
pv$avsed         # 平均 SED

pv_int <- predict(mod, classify = "Nitrogen:Variety",
                  sed = TRUE)

# 育种值可靠性 r^2 = 1 - PEV / ((1 + F_i) * Va)
# PEV = std.error^2;无近交时 F_i = 0
blup_df$rel <- 1 - blup_df$std.error^2 / Va
05

经典试验设计与遗传模型库 (Cookbook Case 1–12)

V1, V2… 严格对应 summary(mod)$varcomp 行号,使用前务必打印确认
案例核心公式遗传参数vpredict() 模板
1 & 2
拉丁方 / 裂区
y ~ Variety, random = ~ Day + Run
y ~ Variety*Nitrogen, random = ~ Blocks/Wplots
组内相关 r = σ²d / (σ²d + σ²r + σ²e) predict(mod, classify = "Variety:Nitrogen", sed = TRUE)
3 & 4
空间 / MET
random = ~ units, residual = ~ ar1(Row):ar1(Column)
random = ~ fa(Site, 2):Variety + at(Site):Rep
residual = ~ dsum(~ ar1(Row):ar1(Col) | Site)
Var(e) = σ²ξ[Σc ⊗ Σr] + σ²ηI
Ge = ΛΛᵀ + Ψ
summary(mod)$aic # 比较 AR1×AR1 / +units / IB
5
半同胞子代测定
height ~ Site/Block
random = ~ Family + Family:Site + Family:Site:Block
h²i = 4σ²F / (σ²F + σ²FS + σ²FSB + σ²e) vpredict(mod, h2 ~ 4*V1/(V1+V2+V3+V4))
6
巢式交配
亲本: y ~ Block/Rep, random = ~ Male/Female
个体: random = ~ vm(ID, ainv)
h² = 4σ²M / (σ²M + σ²F(M) + σ²e)
h² = σ²A / (σ²A + σ²e)
vpredict(m1, h2 ~ 4*V1/(V1+V2+V3))
vpredict(m2, h2 ~ V1/(V1+V2))
7 & 8
NCII / 双列
random = ~ Rep + Male + Fem + Male:Fem
random = ~ Block + Male*Female + Family
h²N = 2(σ²M + σ²F) / VP
H²B = [2(σ²M + σ²F) + 4σ²MF] / VP
vpredict(m1, h2N ~ 2*(V2+V3)/(V2+V3+V4+V5))
vpredict(m1, h2B ~ (2*(V2+V3)+4*V4)/(V2+V3+V4+V5))
9 & 10 已修正
无性系 / 重复力
date ~ 1 + Age
random = ~ vm(Animal, ainv) + ide(Animal)
h² = σ²A / VP
rep = (σ²A + σ²PE) / VP
vpredict(m, h2 ~ V1/(V1+V2+V3))
vpredict(m, rep ~ (V1+V2)/(V1+V2+V3))
11
双性状
cbind(t1, t2) ~ trait + trait:Block/Rep
random = ~ us(trait):vm(ID, ainv)
residual = ~ units:us(trait)
rg = CovA / √(VA1VA2)
rp = (CovA + Cove) / √(VP1VP2)
# V4 = units!R (固定 1)
vpredict(biv, rg ~ V2/sqrt(V1*V3))
vpredict(biv, rp ~ (V2+V6)/sqrt((V1+V5)*(V3+V7)))
12
二分类 GLMM
status ~ 1, random = ~ Sire + Dam + Family
family = asr_binomial(link = "probit")
潜在尺度残差:probit = 1;logit = π²/3 ≈ 3.2899 vpredict(THRp, h2 ~ 4*V1/(V1+V2+V3+1))
vpredict(THRl, h2 ~ 4*V1/(V1+V2+V3+3.2899))
06

动物模型进阶:重复力、母体效应、多性状与遗传相关

WAM 教程 v4 写法

6.1 个体动物模型 vs 重复力模型 已修正vm(Animal, ainv) + ide(Animal)

模型:y = Xb + Z₁a + Z₂pe + e,a ~ N(0, Aσ²ₐ),pe ~ N(0, Iσ²ₚₑ)。

要点:有重复记录却只拟合 vm() 时,σ²ₚₑ 会并入 σ²ₐ,遗传力被严重高估(Cookbook 案例 10:0.636 → 0.026)。

三步对比
ainv <- ainverse(ped)   # Animal, Sire, Dam

# 模型 1: 不用系谱,个体作普通随机因子 -> 总重复力
m_rep <- asreml(date ~ 1 + Age, random = ~ Animal,
                residual = ~ idv(units), data = dat)
vpredict(m_rep, rep ~ V1 / (V1 + V2))

# 模型 2: 基础动物模型 (仅适用于单次测量)
m_her <- asreml(date ~ 1 + Age, random = ~ vm(Animal, ainv),
                residual = ~ idv(units), data = dat)

# 模型 3: 重复力动物模型 (加性 + 永久环境)
m_full <- asreml(date ~ 1 + Age,
                 random = ~ vm(Animal, ainv) + ide(Animal),
                 residual = ~ idv(units), data = dat)
summary(m_full)$varcomp  # V1 vm, V2 ide, V3 units!units, V4 units!R

vpredict(m_full, h2  ~ V1 / (V1 + V2 + V3))
vpredict(m_full, pe2 ~ V2 / (V1 + V2 + V3))
vpredict(m_full, rep ~ (V1 + V2) / (V1 + V2 + V3))

lrt.asreml(m_full, m_her, boundary = TRUE)  # PE 是否显著

6.2 母体效应模型 M1–M4 已修正str(~ vm(Animal,ainv) + vm(Dam,ainv), …)

模型:y = Xb + Z₁a + Z₂m + Z₃c + e;a 直接加性,m 母体遗传,c 母体永久环境,σam = Cov(a, m)。

Willham (1972) 总遗传力:h²T = (σ²ₐ + 0.5σ²ₘ + 1.5σam) / σ²ₚ,σ²ₚ = σ²ₐ + σ²ₘ + σam + σ²c + σ²ₑ。

Dam 的 ID 须出现在系谱中,否则 vm(Dam, ainv) 报错。

四种递进模型
# M1: Dam 作普通随机因子 (母体总效应, 不分遗传/环境)
m1 <- asreml(bwt ~ 1 + sex, random = ~ vm(Animal, ainv) + Dam,
             residual = ~ idv(units), data = gryphon)

# M2: 直接加性 + 母体遗传, Cov(a,m) = 0
m2 <- asreml(bwt ~ 1 + sex,
             random = ~ vm(Animal, ainv) + vm(Dam, ainv),
             residual = ~ idv(units), data = gryphon)

# M3: + 母体永久环境 ide(Dam)
m3 <- asreml(bwt ~ 1 + sex,
             random = ~ vm(Animal, ainv) + vm(Dam, ainv) + ide(Dam),
             residual = ~ idv(units), data = gryphon)

# M4: 允许 Cov(a,m) != 0
m4 <- asreml(bwt ~ 1 + sex,
  random = ~ str(~ vm(Animal, ainv) + vm(Dam, ainv),
                 ~ us(2, init = c(1, -0.1, 0.5)):vm(Animal, ainv)) +
             ide(Dam),
  residual = ~ idv(units), data = gryphon)

# V1 = Va, V2 = Cov(a,m), V3 = Vm, V4 = Vc, V5 = Ve
summary(m4)$varcomp
vpredict(m4, h2_d ~ V1 / (V1+V2+V3+V4+V5))
vpredict(m4, h2_m ~ V3 / (V1+V2+V3+V4+V5))
vpredict(m4, c2   ~ V4 / (V1+V2+V3+V4+V5))
vpredict(m4, r_am ~ V2 / sqrt(V1 * V3))
vpredict(m4, h2_T ~ (V1 + 0.5*V3 + 1.5*V2) / (V1+V2+V3+V4+V5))

6.3 多性状动物模型cbind(t1, t2, t3) ~ trait

  • 固定效应须含 trait,其他固定因子与其互作(trait:sex)。
  • 用 na.method(y = "include", x = "include") 保留部分测定的个体。
  • us(trait) 有 t(t+1)/2 个参数(3 性状 = 6),用单性状方差作 init,或改用 corgh / fa(trait, k)。
  • init 顺序为下三角按行:(1,1), (2,1), (2,2), (3,1), (3,2), (3,3)。
双性状 / 三性状
init_G <- c(3.0, 0.5, 2.0)   # V1, Cov12, V2
init_R <- c(4.0, 0.2, 2.5)
biv <- asreml(
  fixed    = cbind(bwt, tarsus) ~ trait + trait:sex,
  random   = ~ us(trait, init = init_G):vm(Animal, ainv) +
               us(trait):Dam,
  residual = ~ id(units):us(trait, init = init_R),
  na.action = na.method(y = "include", x = "include"),
  data = gryphon, maxit = 30)

init_G3 <- c(10, 2, 15, 1.5, 3, 20)  # V1,C12,V2,C13,C23,V3
triv <- asreml(
  fixed    = cbind(y1, y2, y3) ~ trait + trait:Line,
  random   = ~ us(trait, init = init_G3):vm(Calf, ainv),
  residual = ~ id(units):us(trait),
  na.action = na.method(y = "include"),
  data = harvey, maxit = 50)

6.4 相关系数与显著性检验us() vs idh() / corgh()

rg = CovA/√(VA1VA2);re = CovR/√(VR1VR2);rp = (CovA+CovR)/√(VP1VP2)。

H₀: rg = 0:用 idh(trait) 替换 us(trait),LRT 设 boundary = FALSE(0 不在边界)。H₀: rg = 1 在边界上,需固定相关后做边界检验。

corgh(trait) 直接把 rg 作为参数输出(varcomp 中先列相关、后列方差)。

r_g / r_e / r_p 与 LRT
# V1 Va1, V2 CovA, V3 Va2, V4 units!R, V5 Ve1, V6 CovE, V7 Ve2
summary(biv)$varcomp
vpredict(biv, h2_1 ~ V1 / (V1 + V5))
vpredict(biv, h2_2 ~ V3 / (V3 + V7))
vpredict(biv, r_g  ~ V2 / sqrt(V1 * V3))
vpredict(biv, r_e  ~ V6 / sqrt(V5 * V7))
vpredict(biv, r_p  ~ (V2 + V6) / sqrt((V1 + V5) * (V3 + V7)))

# corgh: 直接估计 r_g 及其 SE
biv_cor <- asreml(cbind(t1, t2) ~ trait + trait:Block/Rep,
                  random = ~ corgh(trait):vm(ID, ainv),
                  residual = ~ id(units):us(trait), data = nested)

# 约束模型 Cov_A = 0
biv0 <- asreml(cbind(t1, t2) ~ trait + trait:Block/Rep,
               random = ~ idh(trait):vm(ID, ainv),
               residual = ~ id(units):us(trait), data = nested)
lrt.asreml(biv, biv0, boundary = FALSE)
07

基因 × 环境互作 (G×E) 与 Type-B 遗传相关

CS → corh → corgh / us → fa

7.1 概念与模型选择

Type-B 相关 (Burdon 1977):同一性状在不同环境间的遗传相关。复合对称模型下 rB = σ²G / (σ²G + σ²GE)。rB → 1 表示排名稳定;经验上 rB < 约 0.67 提示存在较强秩次改变型 G×E,可考虑划分育种区。

设计效应:at(Site):Rep 每地点独立区组方差;at(Site, c("S1","S3")):Block 仅特定地点。

残差:dsum(~ units | Site) 地点异质残差,或 dsum(~ ar1(Row):ar1(Col) | Site) 加空间。

地点数推荐结构
任意,先行CS:vm + Site:vm
任意corh(Site):异质方差 + 统一相关
≤ 4corgh / us(Site)
≥ 5fa(Site, k),k 逐步增加按 AIC/LRT 选

7.2 四种递进结构

G×E 模型与 r_B
# 1. 复合对称 (CS): 同质遗传方差、相同两两相关
m_cs <- asreml(yield ~ Site,
  random   = ~ vm(ID, ainv) + Site:vm(ID, ainv) + at(Site):Rep,
  residual = ~ dsum(~ units | Site), data = met_dat)
# 先打印 varcomp 确认 V1 = σ²G, V2 = σ²GE
summary(m_cs)$varcomp
vpredict(m_cs, r_B ~ V1 / (V1 + V2))

# 2. corh: 各地点独立遗传方差 + 统一相关 r_B (直接输出)
m_corh <- asreml(yield ~ Site,
  random   = ~ corh(Site):vm(ID, ainv) + at(Site):Rep,
  residual = ~ dsum(~ units | Site), data = met_dat)
summary(m_corh)$varcomp   # "...!Site!cor" 行即 r_B 及 SE

# 3. corgh: 非结构化相关 (地点少时)
m_corgh <- asreml(yield ~ Site,
  random   = ~ corgh(Site):vm(ID, ainv) + at(Site):Rep,
  residual = ~ dsum(~ ar1(Row):ar1(Col) | Site), data = met_dat)

# 4. 因子分析 FA(2): 地点多时首选,捕获异质性并保证半正定
m_fa2 <- asreml(yield ~ Site,
  random   = ~ fa(Site, 2):vm(ID, ainv) + at(Site):Rep,
  residual = ~ dsum(~ ar1(Row):ar1(Col) | Site), data = met_dat,
  maxit = 50)
08

ASRgenomics:基因型质控与亲缘矩阵

CRAN ASRgenomics 1.1.x

8.1 基因型格式与 qc.filtering()已修正

输入 n × p 数值矩阵(行名 = 个体,列名 = SNP,编码 0/1/2;PLINK --recodeA 可生成)。字母型基因型先用 snp.recode() 转码。

callrate 阈值表示允许的缺失比例:marker.callrate = 0.2 删除缺失 > 20% 的 SNP。

读取 · 质控 · 可视化
library(ASRgenomics)

M_raw <- as.matrix(read.csv("genotype.csv", row.names = 1))

M_filter <- qc.filtering(
  M = M_raw,
  na.string       = "-9",  # 缺失标记
  marker.callrate = 0.2,   # SNP 缺失 > 20% 删除
  ind.callrate    = 0.2,   # 个体缺失 > 20% 删除
  maf             = 0.05,
  heterozygosity  = 0.95,  # 最大观测杂合度
  Fis             = 1,     # 最大 |Fis|
  impute          = FALSE, # TRUE: 用均值填补
  plots           = TRUE)

dim(M_filter$M.clean)
M_filter$plot.missing.ind; M_filter$plot.missing.SNP
M_filter$plot.maf; M_filter$plot.heteroz; M_filter$plot.Fis

8.2 G 矩阵、调优与 PCAKinship

G.matrix():加性 "VanRaden" / "Yang",显性 "Su" / "Vitezica"。病态矩阵用 G.tuneup() 做 blend / bend / align(G.inverse() 内的同名选项将弃用)。

G · 调优 · 诊断 · PCA
G <- G.matrix(M = M_filter$M.clean, method = "VanRaden")$G

# 防奇异 A: 对角线加小常数 (Cookbook 写法)
G_d <- G; diag(G_d) <- diag(G_d) + 0.01
# 防奇异 B: blend (推荐)
G_b <- G.tuneup(G = G, blend = TRUE, pblend = 0.02)$Gb

kinship.diagnostics(K = G)
kinship.heatmap(K = G, dendrogram = TRUE,
                row.label = FALSE, col.label = FALSE)

pca <- kinship.pca(K = G, ncp = 15)
pca$eigenvalues; pca$plot.scree; pca$plot.pca
09

GBLUP、一步法 ssGBLUP 与交叉验证

sparseform:GBLUP 取 $Ginv.sparse;ssGBLUP 先取完整 $Ginv

9.1 GBLUP 流程 已修正G.inverse(sparseform = TRUE)$Ginv.sparse

GBLUP 完整工作流
library(ASRgenomics); library(asreml); library(dplyr)

data(pheno.pine); dat <- pheno.pine
dat[, 1:3] <- lapply(dat[, 1:3], as.factor)

data(geno.pine655)
M_clean <- qc.filtering(M = geno.pine655, maf = 0.05,
             marker.callrate = 0.2, ind.callrate = 0.2,
             na.string = "-9", plots = FALSE)$M.clean
Gmat <- G.matrix(M_clean, method = "VanRaden")$G

# 表型与 G 对齐
chk  <- match.kinship2pheno(K = Gmat, pheno.data = dat,
          indiv = "Genotype", clean = FALSE, mism = TRUE)
dat1 <- droplevels(dat[chk$matchesP, ])

# 稀疏逆矩阵
G_b  <- G.tuneup(G = Gmat, blend = TRUE, pblend = 0.02)$Gb
ginv <- G.inverse(G = G_b, sparseform = TRUE)$Ginv.sparse

modg <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, ginv),
               residual = ~ idv(units),
               na.action = na.method(y = "include"), data = dat1)
summary(modg)$varcomp
vpredict(modg, h2 ~ V1 / (V1 + V2))

# 导出 GEBV
blup <- as.data.frame(summary(modg, coef = TRUE)$coef.random)
gebv <- data.frame(
  ID   = sub("^vm\\(Genotype, ginv\\)_", "", rownames(blup)),
  gebv = blup$solution, se = blup$std.error)
write.csv(gebv, "gebv_gblup.csv", row.names = FALSE)

9.2 一步法 ssGBLUP 已修正H.inverse(A, Ginv, lambda)

A 与 Ginv 都须为完整方阵,Ginv 的个体须是 A 的子集;建议先将 G 对齐 (align) 到 A₂₂ 再求逆。

ssGBLUP 完整工作流
library(ASRgenomics); library(AGHmatrix); library(asreml)

data(ped.pine)
A <- AGHmatrix::Amatrix(data = ped.pine)   # n_a x n_a

G <- G.matrix(M_clean, method = "VanRaden")$G

# 1. 检查并匹配 G 与 A
chk <- match.G2A(A = A, G = G, clean = TRUE, ord = TRUE,
                 mism = TRUE, RMdiff = TRUE)

# 2. 将 G 对齐到 A22,再求完整逆
G_al <- G.tuneup(G = chk$Gclean, A = chk$Aclean,
                 align = TRUE, sparseform = FALSE)$Gb
Ginv <- G.inverse(G = G_al, sparseform = FALSE)$Ginv

# 3. 构建 H^-1 (λ 同时设定 τ = ω,范围 0–1)
hinv <- H.inverse(A = A, Ginv = Ginv, lambda = 0.90,
                  sparseform = TRUE)
attr(hinv, "INVERSE")   # 应为 TRUE

# 4. 拟合:已测序与未测序个体同时得到 GEBV
ss <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, hinv),
             residual = ~ idv(units), workspace = "2gb",
             na.action = na.method(y = "include"), data = dat)
summary(ss)$varcomp
vpredict(ss, h2 ~ V1 / (V1 + V2))
summary(ss)$aic
blup_ss <- summary(ss, coef = TRUE)$coef.random

9.3 K 折交叉验证与 G.predict()PA · Accuracy · Bias

  • 预测力 PA:r(yval, GEBV),y 可用观测值或校正表型 y*。
  • 准确性:r(y, GEBV) / √h²(Dekkers 2007),h² 统一用全量数据估计值。
  • 偏差:lm(y_val ~ gebv_val) 的斜率 b₁,理想值 1;b₁ < 1 表示 GEBV 离散度过大(膨胀)。
  • CV1:随机分折(家系内有亲属);CV2:整家系留出(预测新家系)。
  • G.predict(G, gy):用多元正态条件分布由已知 BLUP 预测其余个体,gy 须为带行名的矩阵。
掩码 CV 循环 + G.predict
set.seed(2026); k <- 5
dat1$fold <- sample(rep(1:k, length.out = nrow(dat1)))
pa <- b1 <- numeric(k)
term <- "vm(Genotype, ginv)_"

for (i in 1:k) {
  dcv <- dat1
  val <- which(dcv$fold == i)
  dcv$y_train <- dcv$DBH_Adj
  dcv$y_train[val] <- NA                 # 掩盖验证集

  m <- asreml(y_train ~ 1, random = ~ vm(Genotype, ginv),
              residual = ~ idv(units),
              na.action = na.method(y = "include"),
              data = dcv, trace = FALSE)

  cr   <- summary(m, coef = TRUE)$coef.random
  gebv <- cr[paste0(term, dcv$Genotype[val]), "solution"]
  yv   <- dat1$DBH_Adj[val]
  pa[i] <- cor(yv, gebv, use = "complete.obs")
  b1[i] <- coef(lm(yv ~ gebv))[2]
}
cat("PA:", mean(pa), "| Acc:", mean(pa) / sqrt(h2_full),
    "| b1:", mean(b1), "\n")

# G.predict: G 为参考群 + 候选群的完整方阵
gy <- as.matrix(gebv_ref)       # 一列 BLUP
rownames(gy) <- ref_ids
g_cond <- G.predict(G = G_full, gy = gy)
head(g_cond)                     # predicted.value

9.4 CV 中是否固定方差组分? 已修正方法学问答

策略做法评价
1 每折重估(推荐)每折仅用训练集估计方差并预测无数据泄露;论文首选
2 热启动以全量结果作初值,约束仍为 P仍是每折重估,只是收敛更快
3 固定全量方差Constraint = "F" + maxit = 1轻微泄露,小样本或低 h² 时高估 PA;需在论文中说明
关键区分:折内拟合用策略 1;而计算准确性 r/√h² 时,分母统一使用全量数据的 h²full,以便公平比较 ABLUP / GBLUP / ssGBLUP。
热启动 vs 固定方差
mod_full <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, ginv),
                   residual = ~ idv(units), data = dat1)
h2_full <- vpredict(mod_full, h2 ~ V1 / (V1 + V2))$Estimate[1]

# 拟合对象没有 vparameters.table:取表后按名称填入估计值
iv_full <- asreml(DBH_Adj ~ 1, random = ~ vm(Genotype, ginv),
                  residual = ~ idv(units), data = dat1,
                  start.values = TRUE)$vparameters.table
iv_full$Value <- mod_full$vparameters[iv_full$Component]

iv_fix <- iv_full; iv_fix$Constraint <- "F"

for (i in 1:k) {
  dcv <- dat1
  dcv$y_train <- ifelse(dcv$fold == i, NA, dcv$DBH_Adj)

  # 策略 2: 热启动,每折仍重新估计
  m_re <- asreml(y_train ~ 1, random = ~ vm(Genotype, ginv),
                 residual = ~ idv(units),
                 na.action = na.method(y = "include"),
                 G.param = iv_full, R.param = iv_full,
                 data = dcv, trace = FALSE)

  # 策略 3: 固定方差,只解一次 MME
  m_fx <- asreml(y_train ~ 1, random = ~ vm(Genotype, ginv),
                 residual = ~ idv(units),
                 na.action = na.method(y = "include"),
                 G.param = iv_fix, R.param = iv_fix,
                 maxit = 1, data = dcv, trace = FALSE)
}
10

ASRgwas 全基因组关联分析

y = 1μ + αᵢsᵢ + Xβ + Z₁u + Qδ + Z₂a + e

10.1 连续性状 MLM (Q + K)P3D = TRUE

pre.gwas() 一次完成表型/基因型对齐、QC、填补、K⁻¹ 与群体结构矩阵 Q。用碎石图确定 npc。

连续性状 GWAS
library(asreml); library(ASRgwas)

pre_c <- pre.gwas(
  pheno.data = dat, indiv = "ID", resp = "amoebic_load",
  geno.data = geno.salmon, Q.method = "K", method = "VanRaden",
  maf = 0.05, marker.callrate = 0.2, ind.callrate = 0.2,
  heterozygosity = 0.8, Fis = 0.98, impute = TRUE)
pre_c$plot.scree               # 确定 npc

gw <- gwas.asreml(
  pheno.data = pre_c$pheno.data, resp = "amoebic_load", gen = "ID",
  Kinv = pre_c$Kinv, Q = pre_c$Q, npc = 7,
  geno.data = pre_c$geno.data, map.data = pre_c$map,
  pvalue.thr = 5e-04, workspace = "2gb", P3D = TRUE)

gw$heritability                # 零模型 h2
gw$gwas.sel                    # 超过阈值的 SNP
qq.plot(gwas.table = gw$gwas.all)
manhattan.plot(gwas.table = gw$gwas.all, padding = 2e6)

10.2 二分类性状 GLMMfamily = "binomial"

0/1 性状(存活、抗病)可同时加入协变量 cov、固定因子 fixedf 与额外随机效应 randomf。

二分类 GWAS
pre_b <- pre.gwas(
  pheno.data = dat, indiv = "ID", resp = "ipn_mortality",
  geno.data = geno.salmon, Q.method = "K", method = "VanRaden",
  maf = 0.05, marker.callrate = 0.2, ind.callrate = 0.2,
  heterozygosity = 0.8, Fis = 0.98, impute = TRUE)

gwB <- gwas.asreml(
  pheno.data = pre_b$pheno.data, resp = "ipn_mortality", gen = "ID",
  Kinv = pre_b$Kinv, Q = pre_b$Q, npc = 3,
  cov = "tag_wgt", fixedf = "sex", randomf = "family",
  family = "binomial",
  geno.data = pre_b$geno.data, map.data = pre_b$map,
  pvalue.thr = 5e-04, threads = 1, P3D = FALSE)

gwB$call                       # 内部 asreml 公式
summary(gwB$mod)$varcomp
⚡

交互式 vpredict() 代码生成器与手算验证

选择模型并填入方差组分,实时计算并生成 R 代码

实时估算
生成的 R 代码
📚

官方手册与权威教程