@@ -436,13 +436,27 @@ mat DBSLMMFIT::PCGm(mat A, mat B, size_t maxiter, const double tol){
436
436
int DBSLMMFIT::estBlock (int n_ref, int n_obs, double sigma_s, mat geno_s, mat geno_l, vec z_s, vec z_l, vec &beta_s, vec &beta_l) {
437
437
438
438
// LD matrix
439
- mat SIGMA_ls = geno_l.t () * geno_s;
440
- SIGMA_ls /= (double )n_ref;
439
+ // mat SIGMA_ls = geno_l.t() * geno_s;
440
+ // SIGMA_ls /= (double)n_ref;
441
+ // mat SIGMA_ll = geno_l.t() * geno_l;
442
+ // SIGMA_ll /= (double)n_ref;
443
+ // mat SIGMA_ss = geno_s.t() * geno_s;
444
+ // SIGMA_ss /= (double)n_ref;
445
+
446
+ double tau = 0.8 ;
447
+ mat SIGMA_ls = geno_l.t () * geno_s;
448
+ SIGMA_ls *= tau/(double )n_ref;
441
449
mat SIGMA_ll = geno_l.t () * geno_l;
442
- SIGMA_ll /= (double )n_ref;
450
+ SIGMA_ll *= tau/(double )n_ref;
451
+ vec DIAG_l (geno_l.n_cols , fill::ones);
452
+ DIAG_l *= (1.0 -tau);
453
+ SIGMA_ll += diagmat (DIAG_l);
443
454
mat SIGMA_ss = geno_s.t () * geno_s;
444
- SIGMA_ss /= (double )n_ref;
445
-
455
+ SIGMA_ss *= tau/(double )n_ref;
456
+ vec DIAG_s (geno_s.n_cols , fill::ones);
457
+ DIAG_s *= (1.0 -tau);
458
+ SIGMA_ss += diagmat (DIAG_s);
459
+
446
460
// beta_l
447
461
SIGMA_ss.diag () += 1.0 / (sigma_s * (double )n_obs);
448
462
mat SIGMA_ss_inv_SIGMA_sl = PCGm (SIGMA_ss, SIGMA_ls.t (), 1000 , 1e-7 );
@@ -469,8 +483,15 @@ int DBSLMMFIT::estBlock(int n_ref, int n_obs, double sigma_s, mat geno_s, mat ge
469
483
int DBSLMMFIT::estBlock (int n_ref, int n_obs, double sigma_s, mat geno_s, vec z_s, vec &beta_s) {
470
484
471
485
// LD matrix
486
+ // mat SIGMA_ss = geno_s.t() * geno_s;
487
+ // SIGMA_ss /= (double)n_ref;
488
+
489
+ double tau = 0.8 ;
472
490
mat SIGMA_ss = geno_s.t () * geno_s;
473
- SIGMA_ss /= (double )n_ref;
491
+ SIGMA_ss *= tau/(double )n_ref;
492
+ vec DIAG_s (geno_s.n_cols , fill::ones);
493
+ DIAG_s *= (1.0 -tau);
494
+ SIGMA_ss += diagmat (DIAG_s);
474
495
475
496
// beta_s
476
497
SIGMA_ss.diag () += 1.0 / (sigma_s * (double )n_obs);
0 commit comments