面向水产动物家系选育的百万系谱分析:visPedigree 1.8.1 的工作流与方法学解释

以一个包含 1,000,150 个体、50 个世代的模拟系谱为例,从水产动物家系选育的理论与技术体系出发,说明如何用 visPedigree 1.8.1 完成百万级系谱整理、参考群体多样性诊断、半衰期监控与局部可视化,并将结果转化为可执行的育种管理建议。
Breeding
Pedigree Analysis
visPedigree
Author

Sheng Luan

Published

March 24, 2026

摘要

水产动物选择育种通常以家系为基本管理单元。建群时需要控制基础亲本来源,育种过程中需要在家系间和家系内同时进行选择,连续世代中又必须抑制近交累积、家系丢失和少数优势亲本的过度扩张。随着亲子鉴定、共同培育和跨年度留种体系的普及,系谱规模迅速扩展到几十万甚至上百万个体。此时真正的问题已不再是“数据能否存下”,而是:哪些分析应在全量系谱上完成,哪些分析应围绕当前参考群体展开,以及哪些问题根本不应通过整图硬画来解决

本文使用 pedigree_mixed_founder_to_G50.csv 作为示例数据。该数据包含 1,000,150 个体、150 个始祖、50 个连续世代和 6 个始祖来源群体。文章从水产动物家系选育的理论与技术体系出发,回答三个方法学问题:

  1. 面对百万级系谱,visPedigree 1.8.1 的高效分析流程应如何组织?
  2. tidyped()pediv()pedhalflife() 和局部 visped() 各自对应哪一类育种学问题?
  3. 这些指标如何转化为家系保留、留种面控制和年度多样性监控的管理建议?

全文的基本判断是:

  • 全量系谱适合承担数据整理、代次结构重建和长期趋势分析;
  • 参考群体适合承担家系多样性诊断和年度决策支持;
  • 图形展示应回到局部家系、关键祖先和候选群体,而不是追求整库可视化。

一、为什么水产家系选育的百万系谱不应从“画图”开始

在水产动物家系选育体系中,百万级系谱的意义并不在于“终于可以把所有个体同时画出来”,而在于它提供了足够长的代际深度和足够完整的亲缘传递记录,使研究者和育种者能够回答以下问题:

  • 当前候选留种群到底来自哪些始祖和关键祖先?
  • 多样性损失主要发生在建群初期、后续家系瓶颈,还是持续漂变?
  • 哪些低频家系仍保留有续留价值,值得在下一轮配种中被重新纳入?
  • 如果沿用当前留种结构,多样性半衰期大约还有多久?

这类问题本质上都指向“家系贡献在时间上的实现方式”,而不是指向图形本身。因此,对百万系谱最有效的使用方式,不是从“能不能一把画全图”开始,而是从“先把全量数据转化成一个可分析对象”开始。visPedigree 1.8.1 在这一点上的意义主要体现在三方面:

  1. tidyped() 把原始系谱标准化为带代次、整数编号和拓扑顺序的分析对象。
  2. pediv() 让多样性诊断围绕参考群体展开,而不是停留在整库平均意义上。
  3. pedhalflife() 把长期家系收缩过程压缩为更适合管理解释的趋势指标,例如半衰期与衰减来源分解。

二、数据概况、理论背景与分析目标

2.1 数据结构

library(data.table)
library(ggplot2)
library(showtext)
library(sysfonts)
library(visPedigree)

font_add("cn", "/System/Library/Fonts/STHeiti Medium.ttc")
showtext_auto()

theme_set(
  theme_minimal(base_family = "cn") +
    theme(
      plot.title = element_text(face = "bold"),
      plot.title.position = "plot",
      panel.grid.minor = element_blank()
    )
)

path_ped <- "pedigree_mixed_founder_to_G50.csv"

ped_raw <- fread(path_ped, na.strings = c("", "NA", "0"))
ped_raw[, `:=`(
  Ind = as.character(Ind),
  Sire = fifelse(is.na(Sire), NA_character_, as.character(Sire)),
  Dam = fifelse(is.na(Dam), NA_character_, as.character(Dam)),
  Sex = as.character(Sex),
  Breed = as.character(Breed),
  Year = as.integer(Year)
)]

data.table(
  指标 = c("总个体数", "字段数", "Year 范围", "始祖来源群体数"),
  数值 = c(
    format(nrow(ped_raw), big.mark = ","),
    ncol(ped_raw),
    paste(range(ped_raw$Year, na.rm = TRUE), collapse = " ~ "),
    uniqueN(ped_raw$Breed)
  )
)
             指标      数值
           <char>    <char>
1:       总个体数 1,000,150
2:         字段数         6
3:      Year 范围    1 ~ 50
4: 始祖来源群体数         6

这份数据有几个很适合示范 visPedigree 的特点:

  • 个体数达到 1,000,150,足以覆盖百万级使用场景;
  • Year050,适合做连续时间趋势分析;
  • 始祖来源有 6 个群体,便于观察基础群来源是否逐步收缩;
  • 每个非 founder 世代规模基本稳定,便于把结果解释成长期繁育制度下的结构演化。

2.2 与水产动物家系选育体系的对应关系

虽然本文使用的是模拟数据,但其结构与水产动物家系选育中的典型技术路径高度一致:

  • Founder 可对应建群时期纳入核心群的基础亲本;
  • Year 可对应连续育种周期中的年级群或世代批次;
  • 末代参考群体可对应当期候选留种群、核心群后备群或计划配种群;
  • 多世代连续系谱可对应“建群后长期封闭选育,辅以家系记录和亲子鉴定”的技术体系。

在水产动物中,单对亲本往往能产生大量后代,早期家系成活差异、共同培育后的选择强度差异,以及少数优势亲本的重复利用,都可能使“理论上的家系数”与“实际传递到下一代的家系贡献”明显偏离。因此,百万级系谱分析的核心不在于统计总个体数,而在于识别:

  1. 初始亲本来源是否被长期均衡利用;
  2. 家系间选择是否在中间世代形成了额外瓶颈;
  3. 当前参考群体中,仍有哪些低频家系和祖先可以被重新纳入管理。

2.3 方法学上最适合回答什么问题

对于这样的百万系谱,最有价值的不是“把所有模块都跑一遍”,而是回答三个具有明确管理含义的方法学问题:

  1. 结构上还剩多少多样性?
  2. 多样性是怎么丢掉的?
  3. 哪些家系和祖先值得继续追踪与保留?

后文的分析顺序,正是围绕这三个问题来设计。需要强调的是,本文所有指标都属于系谱层面的多样性代理指标。它们反映的是祖先贡献和亲缘传递结构,而不是直接替代基因组层面的变异测量;但在水产动物家系选育中,它们恰好对应日常最需要管理的对象,即家系贡献、亲本利用和年度留种结构。

三、百万系谱下的推荐工作流

3.1 第一步:先把全量系谱转成 tidyped

百万级分析的起点不是 pediv(),也不是 visped(),而是 tidyped()。因为后续大多数分析都依赖它补充出来的几个核心字段:

  • Gen:代次层级
  • IndNumSireNumDamNum:整数编号
  • 对象结构与拓扑顺序:保证上游祖先先于后代
tm_tidyped <- system.time(
  tp_million <- tidyped(ped_raw)
)

tm_tidyped
 用户  系统  流逝 
4.431 0.157 2.210 
data.table(
  指标 = c(
    "tidyped 后个体数",
    "最大 Gen",
    "末代参考群规模",
    "Founder 数量"
  ),
  数值 = c(
    format(nrow(tp_million), big.mark = ","),
    max(tp_million$Gen, na.rm = TRUE),
    tp_million[Year == max(Year, na.rm = TRUE), .N],
    tp_million[SireNum == 0 & DamNum == 0, .N]
  )
)
               指标      数值
             <char>    <char>
1: tidyped 后个体数 1,000,150
2:         最大 Gen        51
3:   末代参考群规模     20000
4:     Founder 数量       150

这一阶段的管理意义在于:你先得到一个“全库统一坐标系”。在水产家系选育体系中,这一步等价于把历年亲子鉴定结果、家系记录和年级群信息统一到同一个分析底座上。之后不管是抽取候选留种群、分析核心群后备群,还是追踪某一批关键家系,都不需要再回到原始 CSV 反复清洗。

3.2 第二步:全量上先看结构概览,而不是直接做全量深分析

全量数据最适合做的是“概览性判断”,例如各年份个体规模、founder 来源是否均衡等。

year_profile <- tp_million[!is.na(Year), .N, by = Year][order(Year)]

ggplot(year_profile, aes(x = Year, y = N)) +
  geom_line(linewidth = 0.8, color = "#1f5aa6") +
  geom_point(size = 1.5, color = "#1f5aa6") +
  scale_y_continuous(labels = scales::label_comma()) +
  labs(
    title = "各世代个体规模概览",
    x = "Year",
    y = "个体数"
  )

founder_breed <- tp_million[SireNum == 0 & DamNum == 0, .N, by = Breed][order(Breed)]

ggplot(founder_breed, aes(x = Breed, y = N, fill = Breed)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  labs(
    title = "始祖来源群体分布",
    x = "Breed",
    y = "Founder 数量"
  )

这两张图传达的信息在方法学上非常重要:

  • 这份数据并不是一个“规模忽大忽小”的不规则样本,而是一个长期稳定维护的繁育体系;
  • 始祖来源在起点上并不偏斜,因此后续若观察到多样性收缩,更可能来自后续代际中的家系贡献失衡、瓶颈和漂变,而不是建群时的资源严重不足。

3.3 第三步:围绕参考群体运行 pediv(),而不是对整库谈多样性

百万系谱真正值得做的多样性分析,不是“把全库所有个体都当成同一个群体”,而是先定义参考群体。在水产动物家系选育中,参考群体本身就是管理单位。最常见的三类参考群体是:

  • 当前年度候选留种群
  • 当前年度核心群
  • 某个特定家系或品系子群

这里以末代 (Year == 50) 个体作为参考群体。

ref_50 <- tp_million[Year == 50, Ind]

tm_pediv <- system.time(
  div_50 <- pediv(tp_million, reference = ref_50, top = 10, seed = 20260328L)
)

tm_pediv
  用户   系统   流逝 
11.636  0.329  5.138 
div_50$summary[, .(
  NRef,
  NFounder,
  fe = round(fe, 3),
  feH = round(feH, 3),
  `feH/fe` = round(feH / fe, 3),
  NAncestor,
  fa = round(fa, 3),
  faH = round(faH, 3),
  `faH/fa` = round(faH / fa, 3),
  fg = round(fg, 3),
  `fa/fe` = round(fafe, 3)
)]
    NRef NFounder     fe    feH feH/fe NAncestor     fa   faH faH/fa    fg
   <int>    <int>  <num>  <num>  <num>     <int>  <num> <num>  <num> <num>
1: 20000      150 45.208 53.089  1.174        79 30.402 42.63  1.402 2.135
   fa/fe
   <num>
1: 0.673

从水产动物家系选育的角度,这组结果可以作如下解释:

  • fe = 45.208,表示末代参考群体所体现出来的始祖等效数约为 45。也就是说,虽然基础群共有 150 个始祖,但真正以较均衡方式传递到当前候选群体的始祖来源远少于名义始祖数。
  • fa = 30.402,说明当系谱沿时间向后展开后,起主导作用的关键祖先进一步收缩。对家系选育而言,这通常意味着部分家系虽曾进入体系,但未能持续贡献到后续选留阶段。
  • fa / fe = 0.673,表明从始祖层到关键祖先层之间存在明显瓶颈。这一比值下降,通常对应于家系间选择、成活差异或少数亲本反复利用所导致的中间世代收缩。
  • feH / fe = 1.174faH / fa = 1.402,说明低频始祖和低频祖先仍有一部分贡献被保留下来,长尾来源并未完全消失。对管理而言,这意味着仍存在通过配种设计恢复部分稀有谱系的空间。
  • fg = 2.135,提示始祖基因组当量已经非常低,随机漂变的累积影响不可忽视。对于高繁殖力物种,这往往与有效留种亲本数不足、家系规模方差过大或后备家系淘汰过早有关。

因此,这个群体的核心问题不是“已经没有其他血统可用”,而是“历史上保留下来的家系来源,没有被足够均衡地实现到当前参考群体”。从方法学上看,这意味着管理重心不应只放在补充新始祖上,而更应放在控制中间世代瓶颈、降低家系贡献方差、维持平行家系续留上。

3.3.1 用最大世代的 pedrel() 与保留遗传多样性解释 fg

fg 对很多育种实践者来说往往是最难直观理解的指标。一个更容易解释它的方法,是在最大世代上同时补充平均群体共祖和保留遗传多样性。pedrel(scale = "coancestry") 给出的正是与 pediv() 内部 fg 计算直接对应的修正平均共祖系数,而 GeneDiv 则表示该群体在系谱意义上仍保留下来的遗传多样性比例。

rel_50 <- pedrel(
  tp_million,
  by = "Year",
  reference = ref_50,
  scale = "coancestry"
)

rel_50_max <- rel_50[Year == max(Year)]

data.table(
  指标 = c(
    "MeanCoan (pedrel)",
    "GeneDiv = 1 - MeanCoan",
    "fg (pediv)",
    "fg = 1 / (2 * MeanCoan)"
  ),
  数值 = c(
    round(rel_50_max$MeanCoan, 6),
    round(1 - rel_50_max$MeanCoan, 6),
    round(div_50$summary$fg, 3),
    round(1 / (2 * rel_50_max$MeanCoan), 3)
  )
)
                      指标     数值
                    <char>    <num>
1:       MeanCoan (pedrel) 0.234174
2:  GeneDiv = 1 - MeanCoan 0.765826
3:              fg (pediv) 2.135000
4: fg = 1 / (2 * MeanCoan) 2.135000

这组结果的意义在于:

  • 最大世代的平均共祖系数约为 0.234,说明末代参考群体内部已经积累了较高的群体平均共祖;
  • 相应的保留遗传多样性 GeneDiv 约为 0.766,表示从“1 代表完全未损失、0 代表极端收缩”的角度看,当前群体保留下来的系谱多样性已经明显低于建群初期;
  • pedrel() 反推得到的 fgpediv() 结果几乎一致,说明 fg 本质上就是把“平均共祖已经升高到什么程度”换算成“还剩多少等效始祖基因组”的表达方式。

因此,fg 很小并不只是说“始祖数看起来少了”,而是说:最大世代个体之间的平均共祖已经高到足以把原本名义上存在的许多始祖来源压缩成很少的独立遗传份额。 对育种管理而言,这种表述比单独报告 fg 更容易落到交配设计和留种面控制上:如果 MeanCoan 继续升高,那么 GeneDiv 会继续下降,而 fg 也会进一步收缩。

还需要强调的是:对于育种群体而言,fg 随选育世代加深而下降几乎是不可避免的,因此问题从来不是“fg 能否保持不变”,而是“fg 下降到什么程度时,已经不再适合按原有方案继续运行”。fg 本身并不存在脱离管理背景的统一硬阈值;但从育种监控角度,可以给出一个更实用的风险分层:当 fg > 10 时,通常仍有一定缓冲空间;当 fg 降至 5 ~ 10 时,往往已进入需要主动平衡家系贡献的警戒区;当 fg 进一步降至 2 ~ 5 时,对长期闭锁选育群体通常已属于高风险区;若 fg < 2,并同时伴随 MeanCoan 持续升高、Ne 偏低和近交累积加速,则通常应视为长期维持上接近不可接受的状态。

就本文示例而言,末代 fg 约为 2.135,已经接近这一高风险分层的下缘。它并不意味着群体“立刻不可用”,但意味着:若继续沿用当前家系续留和配种结构,而不扩大有效留种面、不平衡家系贡献、不主动恢复低频谱系,则后续世代中 fg 进一步下探将是大概率事件。 因而,对育种实践更合适的理解不是“fg 降低是否正常”,而是“在 fg 已处于低位时,是否已经启动了足够强的纠偏措施”。

3.4 第四步:用 pedhalflife() 看长期趋势,而不是只看单时点结果

如果 pediv() 回答的是“当前结构如何”,那么 pedhalflife() 回答的是“这种结构在过去几十代里是怎么形成的”。

tm_halflife <- system.time(
  hl_million <- pedhalflife(tp_million, timevar = "Year", seed = 20260328L)
)

tm_halflife
   用户    系统    流逝 
235.706   8.760 109.398 
hl_million$decay[, .(
  LambdaE = round(LambdaE, 6),
  LambdaB = round(LambdaB, 6),
  LambdaD = round(LambdaD, 6),
  LambdaTotal = round(LambdaTotal, 6),
  THalf = round(THalf, 3)
)]
    LambdaE  LambdaB  LambdaD LambdaTotal  THalf
      <num>    <num>    <num>       <num>  <num>
1: 0.004979 0.007451 0.043057    0.055486 12.492
hl_plot <- hl_million$timeseries[, .(
  Time,
  fe,
  fa,
  fg
)]

hl_long <- melt(
  hl_plot,
  id.vars = "Time",
  variable.name = "Metric",
  value.name = "Value"
)

ggplot(hl_long, aes(Time, Value, color = Metric)) +
  geom_line(linewidth = 0.9) +
  scale_color_manual(
    values = c(fe = "#1f5aa6", fa = "#d95f02", fg = "#238b45"),
    labels = c(fe = "Fe", fa = "Fa", fg = "Fg")
  ) +
  labs(
    title = "多样性等效数随时间的变化",
    x = "Year",
    y = "等效数",
    color = NULL
  )

这里最重要的不是某一个绝对值,而是三个衰减成分的相对关系。对水产动物家系选育而言,它们分别对应不同的管理环节:

  • LambdaE = 0.004979:与始祖利用不均相关的衰减分量存在,但不是主导因素;
  • LambdaB = 0.007451:与祖先层额外压缩相对应的分量存在,提示后续世代中的家系续留并非完全平衡;
  • LambdaD = 0.043057:由平均共祖进一步升高所体现的残余衰减分量最大,通常意味着漂变样损失占主导,并提示在既定育种规模下,有效贡献亲本数和有效续留家系数偏低;
  • THalf = 12.492:在当前管理格局局部延续、且对数线性趋势近似成立的假设下,多样性半衰期约为 12.5 个时间单位。

对育种管理而言,这样的结果比单纯给出某一时点的 fafe 更有指导意义。它提示:

  1. 问题不主要出在建群起点,而在于后续周转过程中家系贡献没有被长期稳定地保留下来;
  2. 仅靠减少一两个热门父母本的使用,通常不足以逆转趋势;
  3. 更需要优先处理的是扩大有效留种面、增加平行家系续留、控制家系间贡献方差,以减弱漂变在连续世代中的放大。

需要强调的是,这里的 LambdaELambdaBLambdaD 更适合被理解为基于 fefafg 对数分解得到的系谱群体遗传学分量,而不是对三类生物学机制的完全独立识别。换句话说,它们非常适合回答“多样性损失主要表现在哪个层面”,但不宜被解释为已经无偏地、唯一地分离出始祖失衡、历史瓶颈和纯粹漂变三种真实过程。特别是 LambdaD,更稳妥的理解应是:在 founder 不均与 ancestor 压缩之外,由平均共祖进一步升高所体现的剩余衰减分量,它通常以漂变为主,但并不必然只包含漂变。

3.4.1 参考群体的近交累积与有效群体大小

如果说 fa / feLambdaD 主要回答的是“家系贡献在哪里收缩、这些收缩更多表现为哪一类结构信号”,那么近交系数 F 及其代际增量 DeltaF 回答的则是:这种结构性收缩是否已经转化为候选群体的遗传同质化压力。进一步地,由 DeltaF 估算的有效群体大小 Ne,可以把家系压缩和共祖累积转化为更直接的管理量。

tm_inbreed <- system.time(
  tp_inb <- inbreed(tp_million)
)

tm_inbreed
 用户  系统  流逝 
0.350 0.029 0.383 
tp_inb[Year == 50, .(
  MeanF = round(mean(f), 3),
  MedianF = round(median(f), 3),
  P95F = round(quantile(f, 0.95), 3),
  MaxF = round(max(f), 3)
)]
   MeanF MedianF  P95F  MaxF
   <num>   <num> <num> <num>
1: 0.232   0.225 0.269 0.426
yearly_f <- tp_inb[!is.na(Year), .(
  MeanF = mean(f),
  MedianF = median(f)
), by = Year][order(Year)]

ggplot(yearly_f, aes(x = Year, y = MeanF)) +
  geom_line(linewidth = 0.9, color = "#8c2d04") +
  geom_point(size = 1.2, color = "#8c2d04") +
  labs(
    title = "各世代平均近交系数的变化",
    x = "Year",
    y = "Mean F"
  )

ne_inb <- pedne(tp_inb, method = "inbreeding", by = "Year")

ne_inb[Cohort %in% tail(sort(Cohort), 5), .(
  Cohort,
  MeanF = round(MeanF, 3),
  DeltaF = round(DeltaF, 6),
  Ne = round(Ne, 1)
)]
   Cohort MeanF   DeltaF    Ne
    <int> <num>    <num> <num>
1:     46 0.215 0.005386  92.8
2:     47 0.221 0.005433  92.0
3:     48 0.222 0.005338  93.7
4:     49 0.228 0.005387  92.8
5:     50 0.232 0.005398  92.6
ggplot(ne_inb, aes(x = Cohort, y = Ne)) +
  geom_line(linewidth = 0.9, color = "#4d9221") +
  geom_point(size = 1.2, color = "#4d9221") +
  labs(
    title = "基于近交增量估算的有效群体大小",
    x = "Year",
    y = "Ne"
  )

对当前数据而言,这一层结果与前面的结构指标形成了很好的互证:

  • 末代参考群体平均近交系数约为 0.232,中位数约为 0.225,最大值约为 0.426,说明近交累积已经不是零散个体现象,而是候选群体层面的整体压力。
  • Year 维度上的平均 F 呈持续上升趋势,说明前述瓶颈和漂变并非停留在祖先贡献结构上,而是已经转化为逐代累积的系谱近交。
  • 基于 DeltaF 估算的末代 Ne 约为 92.6。这一定义下的 Ne 并不等于实际存栏数或候选数,而是反映“真正以独立方式参与遗传传递的有效贡献规模”。

因此,在这份数据里,问题可以被更完整地表述为:群体的 census size 很大,但 pedigree-based Ne 仍然处在百以内量级,说明当前体系虽然维持了大样本数量,却没有把足够多的独立家系贡献稳定地传递到下一代。

需要说明的是,这里的 FNe 都是基于系谱记录推导得到的预期量,适合用于年度监控和育种管理,不应直接替代 SNP 或 ROH 层面的基因组近交与基因组 Ne

3.5 第五步:可视化要做局部,不要硬画整库

百万系谱下,最容易产生误解的一点是:只要软件足够快,就应该直接把全图画出来。实际上并不是这样。

对育种者真正有价值的图,通常是:

  • 某个候选个体的 3 到 5 代祖先链;
  • 某个参考群体的局部来源网络;
  • 某个高边际贡献祖先的扩张路径;
  • 某个家系在最近几代中的保留情况。

下面示范一个更实际的局部可视化流程:从末代参考群体中随机取 20 个候选个体,再向上追溯 3 代祖先。

set.seed(20260328L)
rand_cand_20 <- sample(tp_million[Year == 50, Ind], 20)
subped_20 <- tidyped(tp_million, cand = rand_cand_20, trace = "up", tracegen = 3)

subped_20[, .N, by = Year][order(Year)]
    Year     N
   <int> <int>
1:    47    62
2:    48    51
3:    49    33
4:    50    20
par(family = "cn")
visped(
  subped_20,
  compact = TRUE,
  cex = 0.3,
  symbolsize = 0.6,
  showgraph = TRUE
)

末代 20 个候选个体向上追溯 3 代的局部系谱

这一点非常关键:百万级系谱的正确可视化策略不是“全量绘图”,而是“全量整理 + 局部提取 + 目标导向可视化”。这也是为什么 tidyped(cand = ..., trace = ..., tracegen = ...) 在大数据场景下如此重要。

四、面向水产动物家系选育的方法学解释

4.1 系谱指标与家系选育技术环节的对应

如果把 visPedigree 的结果放回水产动物家系选育流程,几类核心指标大致对应于以下管理环节:

指标 主要反映的问题 在家系选育中的管理位置
fefeH/fe 基础群始祖来源是否被均衡保留,是否仍有低频始祖可供恢复 建群设计、基础亲本来源配置、长期始祖利用
fafaH/fafa/fe 中间世代是否形成关键祖先瓶颈,是否出现家系贡献集中 家系间选择、家系续留、亲本重复利用控制
fgMeanCoanGeneDivLambdaD 漂变样残余损失是否过快,群体平均共祖是否偏高,实际保留下来的独立始祖遗传份额还有多少 年度留种面、候选家系规模、家系间贡献方差控制
FDeltaFNe 结构收缩是否已经转化为近交累积,以及当前有效管理压力大小 近交控制、交配设计、有效留种面评估
LambdaELambdaBTHalf 风险更主要表现为起点失衡、祖先压缩还是共祖持续累积,当前结构在既有趋势下还能维持多久 年度监控、方案调整评估、干预效果追踪

因此,这些指标并不是抽象的数学量,而是对家系选育技术体系中几个关键环节的压缩表征:建群是否充分,家系是否均衡续留,亲本利用是否过度集中,以及多样性流失是否已进入需要主动干预的阶段。

4.2 对当前结果的水产育种学解释

将本文结果放在“家系为基础的选择育种”框架下,可以得到一个更清晰的判断链条:

  1. 建群阶段的始祖基础并不差。
    Founder 来源较均衡,LambdaE 较低,说明问题并不主要来自起点不足。

  2. 家系在后续世代中的实现并不均衡。
    fa < fefa/fe = 0.673,提示一部分家系虽进入体系,但在中间世代并未持续进入下一轮选留。

  3. 与漂变相关的残余损失已经成为主导性风险。
    LambdaD 远高于 LambdaELambdaB,说明多样性损失更多表现为“长期有效留种面偏窄、平均共祖持续累积”而非单次剧烈收缩。

  4. 长尾家系仍然具有恢复潜力。
    feH/fefaH/fa 高于 1,说明仍有部分低频来源存在于谱系尾部,并非完全消失。

  5. 最大世代的群体平均共祖已经不低。
    MeanCoan 约为 0.234GeneDiv 约为 0.766fg 约为 2.135,说明当前参考群体中真正以独立形式保留下来的始祖遗传份额已经很有限。

  6. 结构收缩已经转化为近交压力。
    末代平均 F 约为 0.232,而基于近交增量得到的 Ne 约为 92.6,说明“候选数很多”并没有自动转化为“有效遗传贡献足够分散”。

这里也需要保留一个方法学上的边界:LambdaELambdaBLambdaD 的加和来自对数分解与线性回归,因此它们首先是可加的统计分量,其次才是便于管理解释的遗传学标签。它们非常适合用于比较“风险主要集中在哪一层”,但不应被理解为已经像实验因果分析那样,完全独立地识别了三类真实历史过程。

换言之,对长期闭锁选育来说,当前 fg 已不再是一个可以被视作“自然下降、无需处理”的水平,而更接近一个需要主动纠偏的强预警信号。

从水产育种学角度,这种结构最常见于以下情形:早期家系数名义上充足,但在候选群构建、成活筛选、表型选留和亲本复用过程中,真正持续进入下一代的家系数逐渐收缩。于是问题并不是“系统里没有家系”,而是“系统长期在重复使用有限的一部分家系”。

4.3 对育种决策的直接启示

如果把这些结果转化为更接近操作层面的建议,优先级大致如下:

  1. 优先扩大有效留种面,而不是只扩大候选个体总数。
    对高繁殖力水产动物而言,增加候选个体数并不自动等于增加有效多样性;真正关键的是提高进入下一轮配种的独立家系数和独立亲本数。

  2. 控制家系间贡献方差,而不只是限制单个明星亲本。
    仅限制少数高频父母本常常不够,更应关注若干优势家系是否整体持续占据配种与选留资源。

  3. 把长尾家系管理为“可恢复资源”。
    feH/fefaH/fa 仍高于 1 时,说明稀有谱系尚未彻底断裂。此时应通过计划交配、目标留种或关键家系保护,把低频来源重新导入核心群,而不是等其完全消失后再补救。

  4. 把年度监控重点放在趋势而不是单点数值。
    对家系选育项目而言,更重要的是连续观察 fa/feLambdaDTHalf、平均 FNe 是否同步恶化,而不是孤立解读某一年的绝对值。尤其 THalf 更适合视为历史趋势压缩指标,而不是未来一定会发生的精确倒计时。

  5. fg 作为分层预警指标,而不是孤立“红线”。
    在实际管理中,更可行的做法不是为 fg 设定单一绝对阈值,而是结合 MeanCoanFNe 进行联合判断:当 fg 已降至 2 ~ 5 且其他风险指标同步恶化时,应视为强干预信号。

4.4 visPedigree 在方法学上的合适定位

对百万级水产系谱而言,visPedigree 的最佳定位不是“整图绘制工具”,而是一套由三个层次组成的分析框架:

  • tidyped() 负责把跨年度、跨批次的原始系谱整理成稳定分析对象;
  • pediv() 负责把多样性问题精确地落到当前参考群体;
  • pedrel() 负责把 fg 进一步拆解为更直观的群体平均共祖与保留遗传多样性;
  • pedhalflife() 负责把长期家系收缩过程转化为可监控的趋势指标;
  • inbreed()pedne() 负责把结构收缩进一步转换为近交累积和有效群体大小的管理解释;
  • visped() 负责针对焦点个体、关键祖先和局部家系问题提供可解释图形。

换句话说,visPedigree 在百万系谱中的方法学价值,不是“所有任务都在图上完成”,而是把结构整理、指标诊断、趋势判断和局部审计组合成一个连贯流程。

五、面向水产家系选育的标准分析与决策流程

如果把本文压缩成一套更接近方法学短文的推荐流程,我会建议把百万系谱分析组织为以下 5 步:

  1. 冻结年度系谱并建立主分析对象。
    每个育种周期结束后,先将当年亲子鉴定结果、年级群、性别和家系信息并入总系谱,再统一运行 tidyped()。这一步相当于建立全年唯一的分析底座。

  2. 以当前管理单元定义参考群体。
    参考群体不应笼统定义为“全库”。更合理的做法是分别定义候选留种群、核心群后备群、计划配种群或保种家系群,然后分别运行 pediv()

  3. pediv()pedrel() 做结构诊断,而不是只报一个多样性值。
    重点同时查看 fefafgMeanCoanGeneDivfa/fefeH/fefaH/fa。其中:

    • fa/fe 持续下降,提示家系瓶颈加重;
  • MeanCoan 升高且 fg 很低,提示群体平均共祖积累和漂变累积显著;
  • GeneDiv 下降,提示保留遗传多样性正在缩水;
  • feH/fefaH/fa 仍高,提示稀有家系仍有恢复空间。
  1. pedhalflife()inbreed()pedne() 做年度趋势监控。
    每年更新一次 LambdaELambdaBLambdaDTHalf、平均 FNe。如果 LambdaD 长期占主导且 Ne 偏低,应优先检讨有效留种家系数和家系间贡献均衡;如果 LambdaB 抬升,则应回查中间世代是否出现明显家系淘汰或亲本集中。同时应记住,这些 Lambda 更适合做横向比较和纵向预警,而不宜当作单一、无歧义的机制识别结论。

  2. 仅针对问题节点做局部可视化与审计。
    当指标提示某些家系或祖先贡献异常时,再通过 visped() 回到局部 pedigree,检查其扩张路径、同胞结构和近几代保留情况。图形在这里承担的是“结构审计”角色,而不是代替指标分析。

这套流程特别适合水产动物家系选育项目中的年度复盘、配种前评估和核心群多样性监控。

六、总结

从水产动物家系选育的理论出发,百万系谱分析的关键并不在于“能否处理一百万个体”,而在于能否把家系贡献、亲本利用和多样性流失过程转化为可解释、可追踪、可干预的管理信息

对这份包含 1,000,150 个体、50 个世代的示例数据,visPedigree 1.8.1 给出的核心结论是:

  • 当前参考群体的始祖基础并非主要矛盾;
  • 家系在中间世代的实现存在明显瓶颈;
  • 多样性损失的主导信号表现为持续共祖累积和漂变样残余衰减,而不是单纯的建群失衡,且最大世代平均共祖已升至约 0.234
  • 这种结构收缩已经转化为持续近交累积,且 pedigree-based Ne 仍处于百以内量级;
  • 末代 fg 已降至约 2.135,对长期闭锁选育而言已接近需要主动纠偏的高风险区;
  • 低频始祖和祖先仍部分保留,说明长尾家系并非没有恢复空间。

因此,对育种方案最有意义的建议不是泛泛地“增加种群规模”,而是更具体地:

  1. 扩大进入下一轮配种的独立家系数和独立亲本数;
  2. 控制家系间贡献方差,避免优势家系长期垄断后续世代;
  3. 针对仍有残余贡献的低频家系开展计划续留;
  4. pediv()pedrel()pedhalflife()inbreed()pedne() 作为年度固定监控环节,而不是临时分析工具。

如果说百万系谱真正能为水产育种者带来的价值是什么,那么答案不是“看见更大的图”,而是更早地识别家系收缩、更准确地定位风险来源,并把这些信号转化为下一轮配种和留种的实际约束条件。这也是 visPedigree 1.8.1 在大规模水产系谱分析中的方法学意义。