常用的方程求解方法主要分为三种:
1 直接求逆,适合小数据,用来练习
2 MME的迭代计算,适合一般研究应用
3 数据迭代, 适合国家的遗传估计,上百万、千万的记录,如BLUP90IOD2。
先验共轭梯度迭代算法(PCG)用于奶牛(千万条数据)的遗传估计
1 直接求逆
直接所有的数据带入,进行求逆即可求解
2 线性方程的迭代求解
假设有:
Ab=r (1) A为pxp的系数矩阵,
A可以分解: A = M+ N (2); 实际M为aii的均值,N为- aij的矩阵,正对角线为0
(2)带入(1):
Mb = -Nb + r
b = Qb + f (3) 其中:Q = M-1N; f = M-1r
b(t+1) = Qbt + f, t = 0,1....
t趋近于正无穷时,有极限b, 称为迭代收敛, 且b为(1)的解
一般的迭代式:
bi(t+1) = [ri- sumi-1(aij*bjt) - sum(aijbjt)]/aii
bi(t+1) = bit+ [ri - sum(aijbjt)]/aii
矩阵形式:
b(t+1) = bi^t + D(-1)(r - Abt); D为A的中对角线元素构成的对角矩阵
这成为Jacobi迭代法。
使用时,需要(1)对固定效应,进行约束处理,每次更新一个效应(2)对于随机效应(animal-additive 或 dominance),需要拓展为second-order Jacobi
我们注意到,bi(t+1)计算时,只是利用了bit的数据, 并没有没有利用b1(t+1),...bi-1(t+1).
那利用bi-i^(t+1)等最新的值:
bit+1 = [ri- sumi-1(aijbjt+1) - sum(aijbjt)]/aii
这就成为高斯-赛德尔(Gauss-Seidel, GS)迭代法。
sum(aiib(t+1)) = ri - sum(aijbj(t))
矩阵: b^(t+1) = (L+D)^-1{r - [A - (L + D)b^t]} , 其中L是A中由对角线以下的元素(不含对角线)构成的下三角矩阵。
GS有时收敛速度很慢,此时就需要考虑逐次超松弛(successive over-relaxation , SOR)迭代法。
bi^(t+1) ^= bi^t + w[ri- sumi-1(aijbjt+1) - sum(aijbjt)]/aii; 比一般的GS多了w,其为松弛因子, 适当的w可以加快收敛速度, 一般为 1 < w< 2。 当w=1时,其又变成GS
3 PCG(先验共轭梯度迭代算法)
优点:是在复杂模型和大量数据时,收敛速度比两种快;
缺点:不能自己修正,并且如果大量数据不是双精度,会发生偏移
收敛
常用的收敛标准:
max(1<i<p)|b(t+1)-bt| < e
或
[sum(b(t+1) - bt)2] / [sum(bt+1)2] < e
e为设定的一个很小的值,REMLF90,一般设定为10^-11次方,即两次解的相差小于这个值
GS比Jacobi法收敛的快些,因为其使用(L+D)接近了D,更接近A,故其收敛速度更快。
GS(SOR)收敛的的一个充分条件是:方程组的系数矩阵是正定矩阵(所有的特征值为正)或半正定矩阵。混合方程组往往是这样的
Jacobi则需要系数矩阵是对角优势均值(每一行中,均有对角线元素大于所有非对角线元素的值)。混合方程组多于一个固定效应时不是这样的,尤其是animal model。
4 混合模型的迭代求解
4.1 直接法
其是直接计算出LHS 和RHS的各个元素,再储存起来,然后使用GS等方法迭代求解,也称为对方程组迭代(iteration on equations)。但是存在内存中,会占用较大的运作内存,也可以存在硬盘中,但读取的次数太多,会减慢计算速度,编程也较难。存在硬盘时,需要将每个元素进行行号和列号的标记,方便读取。
按效应分块迭代求解
将方程的对角线上元素分别写成单个方程,分别迭代求解。
4.2 间接法
不建立方程组,对模型中不同效应的每个水平建立相应方程,在每次迭代中读入观察值数据文件和系谱文件,并计算方程组的解,故又称为数据文件迭代(iteration on data)。
读取次数会减少,并且编程简单。
一般来说,GS所需要的迭代次数少于Jacobi, 但是其需要的读写的次数多于后者。
所以血缘相关的因子用Jacobi法,对其他因子用GS法或SOR
总结
当系数矩阵可以存储在内存中并且简单性很重要时,GS和SOR迭代是选择的方法。 这通常需要100-1000字节/等式的内存。 对于更简单的模型,通过对Jacobi进行修改来对数据进行迭代将是下一个选择,其内存需求为12-16字节/等式。 但是,如今的选择方法似乎是PCG。 尽管看似复杂的代码,但PCG非常易于实现,因为唯一的计算密集型操作是Ax或Ap,尤其是对于带有矢量指令的Fortran 90。 带有对角前置条件调节器的PCG可用于所有尝试的模型,包括多重性状,随机回归,母性效应和优势。 收敛速度与J或SOR一样好或更好。 另外,没有要确定的加速度参数。 PCG的一个缺点是它需要更多的内存:36-56字节/等式,但这已不再是一个问题。
此部分来自张勤老师写的书和blupf90团队培训课件。