本版勘误与修订说明
| # | 位置 | 原版问题 | 修正后 | 后果 / 依据 |
|---|---|---|---|---|
| 1 | 9.2 ssGBLUP | H.inverse(A=Amat, G=Ginv, …, inverse=TRUE) | H.inverse(A=Amat, Ginv=Ginv, lambda=0.9, sparseform=TRUE) | 参数名为 Ginv;inverse 已标记弃用(生成 H 用 H.matrix())。ASRgenomics 手册 |
| 2 | 2.5 / 9.2 | “lambda=0.9 等价于 90% 基因组 + 10% 系谱” | λ 同时设定 τ=ω=λ,缩放的是 (G⁻¹ − A₂₂⁻¹) 整项,取值 0–1 | 概念错误。G 与 A₂₂ 的融合 (blend/align) 应在 G.tuneup() 完成 |
| 3 | 9.1 GBLUP | G.inverse(G, sparseform=TRUE)$Ginv | G.inverse(G, sparseform=TRUE)$Ginv.sparse | sparseform=TRUE 时 $Ginv 为 NULL,vm() 会直接报错 |
| 4 | 01 / 06 / 05 | ide(Animal, ainv) | ide(Animal) | ide() 只接受一个因子,复制模型中已有 vm() 因子的水平(WAM 教程 / VSNi KB) |
| 5 | 6.1 模型 1 | 无系谱重复力用 random=~ide(Animal, ainv) | random = ~ Animal | ide() 需配合同名 vm() 项使用 |
| 6 | 2.4 | “x = "omit" (默认)” | x 默认为 "fail" | 协变量含 NA 且不设 x 时模型直接报错,而不是删行 |
| 7 | 2.5 | vm() 默认要求 "PD" | 默认 singG = "NSD";"PSD" 仅在 source 为非逆 G 矩阵时使用 | 传入逆矩阵时 PSD 无意义 |
| 8 | 全文 | $\sigma^2_a$ 等 LaTeX 写法 | 改为 Unicode:σ²ₐ、A₂₂⁻¹ | 页面未加载 MathJax,原文显示为乱码美元符号 |
| 9 | 4.2 LRT | 手算 p 值未做边界修正 | 边界检验 p = 0.5 × (1 − pchisq(D, 1)) | 与 boundary=TRUE 的混合 χ² 一致 |
| 10 | 4.2 Wald | 注释称 denDF="default" 为 Kenward-Roger | default 依次尝试 algebraic / numeric 分母自由度 | 注释误导 |
| 11 | 4.3 predict | sed = list("Nitrogen:Variety"=TRUE) | sed = TRUE | sed 为逻辑值 |
| 12 | 3B 场景 A | 按位置填 iv$Value <- c(...) | 按 Component 名称赋值 | 组分顺序随模型改变,按位置极易填错 |
| 13 | 3B 场景 C | mod_unconstrained 未定义 | 补充无约束模型 | 原代码无法运行 |
| 14 | 9.4 CV | mod_full$vparameters.table | 用 start.values=TRUE 取表,再按名称填入 mod_full$vparameters | 拟合后的对象无此元素(只有 start.values 返回) |
| 15 | 2.1 | 排序注释 Trial→Row→Col 与 ar1(Column):ar1(Row) 矛盾 | 排序与 residual 外层→内层顺序一致 | — |
| 16 | 2.4 | “无表型个体须靠 y="include" 才获得 GEBV” | 只要个体在 ainv/ginv/hinv 中,vm() 就输出其 BLUP | include 影响的是数据行与拟合值 |
| 17 | 9.2 | ssGBLUP 未校准 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 | 杂项 | “設定”、“取向异质性”、样式类拼写 | “设定”、“异质性”等 | 错别字 |
版本迁移 (v3 → v4.x) 与全局设置
| 功能 | v3(已废弃) | v4.1 / v4.2 | 注意事项 |
|---|---|---|---|
| 残差项 | rcov = ~ units | residual = ~ 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)$ginv | ainverse(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):units | residual = ~ dsum(~ units | Site) | 每个 Site 一组独立残差(也可放空间结构) |
| GLMM 分布族 | family = asreml.binomial() | family = asr_binomial(link = "logit") | 另有 asr_gaussian / asr_poisson / asr_gamma |
| 缺失值设定 | na.method.Y / na.method.X | na.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 参数化报告组分。
library(asreml)
asreml.options(
threads = 8, # 并行线程 (v4.2)
workspace = "8gb", # REML 求解内存
pworkspace = "4gb", # predict() 内存
maxit = 30, # 默认 13
ai.sing = TRUE # AI 矩阵奇异时继续迭代
)
asreml.options() # 查看当前设置
数据读取、系谱与模型公式
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的子集。
# 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 的整行。
| 参数 | 函数 | 含义与调优 |
|---|---|---|
| workspace / pworkspace | asreml() | 求解 / predict 内存,如 "4gb";报 workspace insufficient 时调大。 |
| maxit | asreml() | 默认 13;多性状 us()、fa()、GLMM 建议 30–100;固定方差求 BLUP 时设 1。 |
| singG 已修正 | vm() | 默认 "NSD"(非奇异)。若 source 是关系矩阵本身(非逆)且半正定,用 vm(ID, G, singG = "PSD")。 |
| ai.sing | asreml() | AI 矩阵奇异时继续迭代(多性状 / FA 常用)。 |
| equate.levels | asreml() | 如 c("Male","Female"):叠加模型中两因子共享水平集合。 |
| classify / sed / average | predict() | 预测分类;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₂₂⁻¹),不是“基因组/系谱比例”。 |
| P3D | gwas.asreml() | TRUE:零模型估一次方差后固定,逐 SNP 扫描快很多;精确检验或 GLMM 可设 FALSE。 |
方差结构 (G & R)、初始值与约束
| 函数 | 结构 | 参数数 | 典型用途 |
|---|---|---|---|
| id / idv / idh | I ; σ²I ; diag(σ₁²…σₙ²) | 0 / 1 / n | 默认随机项;idh(Site)(= diag)异质方差 |
| ar1 / ar1v / ar1h | Cij = ρ^|i−j| | 1 / 2 / n+1 | 田间行列空间 ar1(Row):ar1(Column)、重复测量 |
| ar2 / ma1 / arma / sar | AR(2), MA(1), ARMA(1,1) | 2 / 1 / 2 / 1 | 高阶时序 / 空间 |
| cor / corv / corh / corgh | Cij = ρ ; Cij = ρij(corgh) | 1 / 2 / n+1 / n(n+1)/2 | 统一相关(Type-B);异质方差 + 非结构相关 |
| us(obj, init = ) | Vij = σij | n(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 / σ²H | 1 | 绑定 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 等式约束。
# 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 何时需要固定方差
- 常规育种值评估:参数已由大样本估计,全部设
"F"并maxit = 1,直接解 MME 得 BLUP 与 SE。 - 两阶段 MET / Meta 加权:二阶段用
weights = 1/SE²,并把units!R固定为 1,使误差方差等于一阶段已知值。 - LRT 检验特定假设:如固定 CovA = 0,或检验 rg = 1(边界检验)。
- 多性状逐步收敛:先用单性状方差固定对角线,只估协方差,收敛后再放开为
"P"联合估计。 - GWAS 快速扫描 (P3D / EMMAX):零模型估一次 σ²ₐ、σ²ₑ,扫描时固定。
3.4 三种固定 / 约束写法已修正
# 场景 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
结果提取、显著性检验与预测
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 在参数边界上,用混合 χ²。
# 条件 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。
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
经典试验设计与遗传模型库 (Cookbook Case 1–12)
| 案例 | 核心公式 | 遗传参数 | 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)) |
动物模型进阶:重复力、母体效应、多性状与遗传相关
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 中先列相关、后列方差)。
# 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)
基因 × 环境互作 (G×E) 与 Type-B 遗传相关
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):异质方差 + 统一相关 |
| ≤ 4 | corgh / us(Site) |
| ≥ 5 | fa(Site, k),k 逐步增加按 AIC/LRT 选 |
7.2 四种递进结构
# 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)
ASRgenomics:基因型质控与亲缘矩阵
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 <- 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
GBLUP、一步法 ssGBLUP 与交叉验证
9.1 GBLUP 流程 已修正G.inverse(sparseform = TRUE)$Ginv.sparse
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₂₂ 再求逆。
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须为带行名的矩阵。
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;需在论文中说明 |
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)
}
ASRgwas 全基因组关联分析
10.1 连续性状 MLM (Q + K)P3D = TRUE
pre.gwas() 一次完成表型/基因型对齐、QC、填补、K⁻¹ 与群体结构矩阵 Q。用碎石图确定 npc。
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。
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() 代码生成器与手算验证
官方手册与权威教程
vm(animal, ainv) + ide(animal) 写法出处
CRAN ASRgenomics Reference ↗G.matrix / G.tuneup / G.inverse / H.inverse / G.predict
ASReml-R Supplementary Packages ↗ASRgwas、ASRtriala 主页
ASReml-R 文档与安装 ↗安装与许可证激活
Snippet: Constraining Variance Components ↗固定方差与 vcc 等式约束
G×E 与交叉验证应用论文 ↗原版引用链接(建议自行核对题目)