From 7c70ec52e5716eaf1f16c63d5f7f23882fc53f93 Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Mon, 20 Mar 2023 09:52:28 -0400 Subject: [PATCH 01/37] Modified files for strain-specific residual variance option --- src/gemma_io.cpp | 88 ++++++++--- src/mvlmm.cpp | 371 ++++++++++++++++++++++++++++++----------------- src/param.cpp | 57 ++++++++ 3 files changed, 366 insertions(+), 150 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index bd687af..25a8b56 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -150,7 +150,7 @@ std::istream &safeGetline(std::istream &is, std::string &t) { // Read SNP file. A single column of SNP names. bool ReadFile_snps(const string file_snps, set &setSnps) { - debug_msg("enter ReadFile_snps"); + debug_msg("entered"); setSnps.clear(); igzstream infile(file_snps.c_str(), igzstream::in); @@ -329,9 +329,6 @@ bool ReadFile_anno(const string &file_anno, map &mapRS2chr, mapRS2bp[rs] = b_pos; mapRS2cM[rs] = cM; } - // for (auto& [key, value] : mapRS2bp) { - // cerr << key << endl; - //} infile.close(); infile.clear(); @@ -509,6 +506,73 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, return true; } +bool ReadFile_res(const string &file_res, vector &indicator_res, + vector> &res, size_t &n_res) { + debug_msg("entered"); + indicator_res.clear(); + + ifstream infile(file_res.c_str(), ifstream::in); + if (!infile) { + cout << "error! fail to open residual variance file: " << file_res << endl; + return false; + } + + string line; + char *ch_ptr; + double d; + + int flag_na = 0; + + while (!safeGetline(infile, line).eof()) { + vector v_d; + flag_na = 0; + ch_ptr = strtok((char *)line.c_str(), " ,\t"); + while (ch_ptr != NULL) { + if (strcmp(ch_ptr, "NA") == 0) { + flag_na = 1; + d = -9; + } else { + d = atof(ch_ptr); + } + + v_d.push_back(d); + ch_ptr = strtok(NULL, " ,\t"); + } + if (flag_na == 0) { + indicator_res.push_back(1); + } else { + indicator_res.push_back(0); + } + res.push_back(v_d); + } + + if (indicator_res.empty()) { + n_res = 0; + } else { + flag_na = 0; + for (vector::size_type i = 0; i < indicator_res.size(); ++i) { + if (indicator_res[i] == 0) { + continue; + } + + if (flag_na == 0) { + flag_na = 1; + n_res = res[i].size(); + } + if (flag_na != 0 && n_res != cvt[i].size()) { + cout << "error! number of residuals in row " << i + << " do not match other rows." << endl; + return false; + } + } + } + + infile.close(); + infile.clear(); + + return true; +} + // Read .bim file. bool ReadFile_bim(const string &file_bim, vector &snpInfo) { debug_msg("entered"); @@ -684,9 +748,6 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, double maf, geno, geno_old; size_t n_miss; size_t n_0, n_1, n_2; - double min_g = std::numeric_limits::max(); - double max_g = std::numeric_limits::min(); - int flag_poly; int ni_total = indicator_idv.size(); @@ -699,9 +760,6 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, file_pos = 0; auto count_warnings = 0; auto infilen = file_geno.c_str(); - // for (auto& [key, value] : mapRS2bp) { - // cerr << key << endl; - // } while (!safe_get_line(infile, line).eof()) { ch_ptr = strtok_safe2((char *)line.c_str(), " ,\t",infilen); rs = ch_ptr; @@ -723,7 +781,8 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, if (mapRS2bp.count(rs) == 0) { if (is_debug_mode() && count_warnings++ < 10) { - std::string msg = "Can't figure out position for <" + rs + ">"; + std::string msg = "Can't figure out position for "; + msg += rs; debug_msg(msg); if (count_warnings == 10) debug_msg("Skipping similar warnings"); @@ -773,8 +832,6 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, } gsl_vector_set(genotype, c_idv, geno); - if (geno < min_g) min_g = geno; - if (geno > max_g) max_g = geno; // going through genotypes with 0.0 < geno < 2.0 if (flag_poly == 0) { // first init in marker @@ -851,11 +908,6 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, ns_test++; } - if (min_g != 0.0) - warning_msg("The minimum genotype value is not 0.0 - this is not the BIMBAM standard and will skew l_lme and effect sizes"); - if (max_g != 2.0) - warning_msg("The maximum genotype value is not 2.0 - this is not the BIMBAM standard and will skew l_lme and effect sizes"); - gsl_vector_free(genotype); gsl_vector_free(genotype_miss); gsl_matrix_free(WtW); diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index 1d05bf1..60bdeee 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -272,7 +272,7 @@ double EigenProc(const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_vector *D_l, // free memory gsl_matrix_free(Lambda); - gsl_matrix_free(V_e_temp); + //gsl_matrix_free(V_e_temp); we want to continue using V_e_temp to scale epsilon gsl_matrix_free(V_e_h); gsl_matrix_free(V_e_hi); gsl_matrix_free(VgVehi); @@ -281,13 +281,13 @@ double EigenProc(const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_vector *D_l, return logdet_Ve; } -// Qi=(\sum_{k=1}^n x_kx_k^T\otimes(delta_k*Dl+I)^{-1} )^{-1}. -double CalcQi(const gsl_vector *eval, const gsl_vector *D_l, +// Qi=(\sum_{k=1}^n x_kx_k^T\otimes(delta_k*Dl+epsilon_k)^{-1} )^{-1}. +double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *X, gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; size_t c_size = dc_size / d_size; - double delta, dl, d1, d2, d, logdet_Q; + double delta, epsilon, dl, d1, d2, d, logdet_Q; gsl_matrix *Q = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix_set_zero(Q); @@ -305,7 +305,8 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *D_l, d1 = gsl_matrix_get(X, i, k); d2 = gsl_matrix_get(X, j, k); delta = gsl_vector_get(eval, k); - d += d1 * d2 / (dl * delta + 1.0); // @@ + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + d += d1 * d2 / (dl * delta + epsilon); // @@ } } @@ -328,10 +329,10 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *D_l, return logdet_Q; } -// xHiy=\sum_{k=1}^n x_k\otimes ((delta_k*Dl+I)^{-1}Ul^TVe^{-1/2}y. +// xHiy=\sum_{k=1}^n x_k\otimes ((delta_k*Dl+epsilon_k)^{-1}Ul^TVe^{-1/2}y. // // FIXME: mvlmm spends a massive amount of time here -void CalcXHiY(const gsl_vector *eval, const gsl_vector *D_l, +void CalcXHiY(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *UltVehiY, gsl_vector *xHiy) { // debug_msg("enter"); @@ -339,7 +340,7 @@ void CalcXHiY(const gsl_vector *eval, const gsl_vector *D_l, // gsl_vector_set_zero(xHiy); - double x, delta, dl, y, d; + double x, delta, epsilon, dl, y, d; for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); for (size_t j = 0; j < c_size; j++) { @@ -348,7 +349,8 @@ void CalcXHiY(const gsl_vector *eval, const gsl_vector *D_l, x = gsl_matrix_get(X, j, k); y = gsl_matrix_get(UltVehiY, i, k); delta = gsl_vector_get(eval, k); - d += x * y / (delta * dl + 1.0); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + d += x * y / (delta * dl + epsilon); } gsl_vector_set(xHiy, j * d_size + i, d); } @@ -358,19 +360,20 @@ void CalcXHiY(const gsl_vector *eval, const gsl_vector *D_l, return; } -// OmegaU=D_l/(delta Dl+I)^{-1} -// OmegaE=delta D_l/(delta Dl+I)^{-1} -void CalcOmega(const gsl_vector *eval, const gsl_vector *D_l, +// OmegaU=D_l/(delta Dl+epsilon)^{-1} +// OmegaE=delta D_l/(delta Dl+epsilon)^{-1} +void CalcOmega(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, gsl_matrix *OmegaU, gsl_matrix *OmegaE) { size_t n_size = eval->size, d_size = D_l->size; - double delta, dl, d_u, d_e; + double delta, epsilon, dl, d_u, d_e; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); - d_u = dl / (delta * dl + 1.0); // @@ + d_u = dl / (delta * dl + epsilon); // @@ d_e = delta * d_u; gsl_matrix_set(OmegaU, i, k, d_u); @@ -440,7 +443,7 @@ void UpdateRL_B(const gsl_vector *xHiy, const gsl_matrix *Qi, return; } -void UpdateV(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *E, +void UpdateV(const gsl_vector *eval, gsl_vector *eps_eval, const gsl_matrix *U, const gsl_matrix *E, const gsl_matrix *Sigma_uu, const gsl_matrix *Sigma_ee, gsl_matrix *V_g, gsl_matrix *V_e) { size_t n_size = eval->size, d_size = U->size1; @@ -448,20 +451,22 @@ void UpdateV(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *E, gsl_matrix_set_zero(V_g); gsl_matrix_set_zero(V_e); - double delta; + double delta, epsilon; // Calculate the first part: UD^{-1}U^T and EE^T. for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; if (delta == 0) { continue; } gsl_vector_const_view U_col = gsl_matrix_const_column(U, k); + gsl_vector_const_view E_col = gsl_matrix_const_column(E, k); gsl_blas_dsyr(CblasUpper, 1.0 / delta, &U_col.vector, V_g); + gsl_blas_dsyr(CblasUpper, 1.0 / epsilon, &E_col.vector, V_e); } - gsl_blas_dsyrk(CblasUpper, CblasNoTrans, 1.0, E, 0.0, V_e); // Copy the upper part to lower part. for (size_t i = 0; i < d_size; i++) { @@ -482,7 +487,7 @@ void UpdateV(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *E, return; } -void CalcSigma(const char func_name, const gsl_vector *eval, +void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *OmegaU, const gsl_matrix *OmegaE, const gsl_matrix *UltVeh, const gsl_matrix *Qi, @@ -500,7 +505,7 @@ void CalcSigma(const char func_name, const gsl_vector *eval, gsl_matrix_set_zero(Sigma_uu); gsl_matrix_set_zero(Sigma_ee); - double delta, dl, x, d; + double delta, epsilon, dl, x, d; // Calculate the first diagonal term. gsl_vector_view Suu_diag = gsl_matrix_diagonal(Sigma_uu); @@ -525,12 +530,13 @@ void CalcSigma(const char func_name, const gsl_vector *eval, for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); for (size_t j = 0; j < c_size; j++) { x = gsl_matrix_get(X, j, k); - d = x / (delta * dl + 1.0); + d = x / (delta * dl + epsilon); gsl_matrix_set(M_e, j * d_size + i, i, d); gsl_matrix_set(M_u, j * d_size + i, i, d * dl); } @@ -539,7 +545,7 @@ void CalcSigma(const char func_name, const gsl_vector *eval, gsl_blas_dgemm(CblasTrans, CblasNoTrans, delta, M_u, QiM, 1.0, Sigma_uu); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, Qi, M_e, 0.0, QiM); - gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, M_e, QiM, 1.0, Sigma_ee); + gsl_blas_dgemm(CblasTrans, CblasNoTrans, epsilon, M_e, QiM, 1.0, Sigma_ee); } gsl_matrix_free(M_u); @@ -562,19 +568,20 @@ void CalcSigma(const char func_name, const gsl_vector *eval, // 'R' for restricted likelihood and 'L' for likelihood. // 'R' update B and 'L' don't. // only calculate -0.5*\sum_{k=1}^n|H_k|-0.5yPxy. -double MphCalcLogL(const gsl_vector *eval, const gsl_vector *xHiy, +double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *xHiy, const gsl_vector *D_l, const gsl_matrix *UltVehiY, const gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; - double logl = 0.0, delta, dl, y, d; + double logl = 0.0, delta, epsilon, dl, y, d; // Calculate yHiy+log|H_k|. for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; for (size_t i = 0; i < d_size; i++) { y = gsl_matrix_get(UltVehiY, i, k); dl = gsl_vector_get(D_l, i); - d = delta * dl + 1.0; + d = delta * dl + epsilon; logl += y * y / d + safe_log(d); } @@ -597,7 +604,7 @@ double MphCalcLogL(const gsl_vector *eval, const gsl_vector *xHiy, // dxd matrix, V_e is a dxd matrix, eval is a size n vector //'R' for restricted likelihood and 'L' for likelihood. double MphEM(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *U_hat, gsl_matrix *E_hat, gsl_matrix *OmegaU, gsl_matrix *OmegaE, gsl_matrix *UltVehiY, gsl_matrix *UltVehiBX, gsl_matrix *UltVehiU, gsl_matrix *UltVehiE, gsl_matrix *V_g, @@ -628,6 +635,48 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, double logdet_Q, logdet_Ve; int sig; +//print inputs + cout<<"X, as inputted to MphEM: "<size2<size1<size2<size1<size, c_size = W->size1, d_size = V_g->size1; size_t dc_size = d_size * c_size; - double delta, dl, d, d1, d2, dy, dx, dw; // logdet_Ve, logdet_Q, p_value; + double delta, epsilon, dl, d, d1, d2, dy, dx, dw; // logdet_Ve, logdet_Q, p_value; gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); @@ -754,7 +844,7 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *x_vec, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, W, Qi); - CalcQi(eval, D_l, W, Qi); + CalcQi(eval, eps_eval, D_l, W, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -767,11 +857,12 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *x_vec, d2 = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; dx = gsl_vector_get(x_vec, k); dy = gsl_matrix_get(UltVehiY, i, k); - d1 += dx * dy / (delta * dl + 1.0); - d2 += dx * dx / (delta * dl + 1.0); + d1 += dx * dy / (delta * dl + epsilon); + d2 += dx * dx / (delta * dl + epsilon); } gsl_vector_set(xPy, i, d1); gsl_matrix_set(xPx, i, i, d2); @@ -781,12 +872,13 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *x_vec, d2 = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; dx = gsl_vector_get(x_vec, k); dw = gsl_matrix_get(W, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d1 += dx * dw / (delta * dl + 1.0); - d2 += dy * dw / (delta * dl + 1.0); + d1 += dx * dw / (delta * dl + epsilon); + d2 += dy * dw / (delta * dl + epsilon); } gsl_matrix_set(WHix, j * d_size + i, i, d1); gsl_vector_set(WHiy, j * d_size + i, d2); @@ -832,13 +924,13 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *x_vec, // Calculate B and its standard error (which is a matrix of the same // dimension as B). -void MphCalcBeta(const gsl_vector *eval, const gsl_matrix *W, +void MphCalcBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *W, const gsl_matrix *Y, const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_matrix *UltVehiY, gsl_matrix *B, gsl_matrix *se_B) { size_t n_size = eval->size, c_size = W->size1, d_size = V_g->size1; size_t dc_size = d_size * c_size; - double delta, dl, d, dy, dw; // , logdet_Ve, logdet_Q; + double delta, epsilon, dl, d, dy, dw; // , logdet_Ve, logdet_Q; gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); @@ -858,7 +950,7 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_matrix *W, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, W, Qi); - CalcQi(eval, D_l, W, Qi); + CalcQi(eval, eps_eval, D_l, W, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -871,10 +963,11 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_matrix *W, d = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; dw = gsl_matrix_get(W, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d += dy * dw / (delta * dl + 1.0); + d += dy * dw / (delta * dl + epsilon); } gsl_vector_set(WHiy, j * d_size + i, d); } @@ -939,7 +1032,7 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_matrix *W, // Calculate all Hi and return logdet_H=\sum_{k=1}^{n}log|H_k| // and calculate Qi and return logdet_Q // and calculate yPy. -void CalcHiQi(const gsl_vector *eval, const gsl_matrix *X, +void CalcHiQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_matrix *Hi_all, gsl_matrix *Qi, double &logdet_H, double &logdet_Q) { gsl_matrix_set_zero(Hi_all); @@ -948,7 +1041,7 @@ void CalcHiQi(const gsl_vector *eval, const gsl_matrix *X, logdet_Q = 0.0; size_t n_size = eval->size, c_size = X->size1, d_size = V_g->size1; - double logdet_Ve = 0.0, delta, dl, d; + double logdet_Ve = 0.0, delta, epsilon, dl, d; gsl_matrix *mat_dd = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); @@ -962,11 +1055,12 @@ void CalcHiQi(const gsl_vector *eval, const gsl_matrix *X, logdet_H = (double)n_size * logdet_Ve; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; gsl_matrix_memcpy(mat_dd, UltVehi); for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); - d = delta * dl + 1.0; + d = delta * dl + epsilon; gsl_vector_view mat_row = gsl_matrix_row(mat_dd, i); gsl_vector_scale(&mat_row.vector, 1.0 / d); // @@ @@ -983,7 +1077,7 @@ void CalcHiQi(const gsl_vector *eval, const gsl_matrix *X, // Calculate Qi, and multiply I\o times UtVeh on both side and // calculate logdet_Q, don't forget to substract // c_size*logdet_Ve. - logdet_Q = CalcQi(eval, D_l, X, Qi) - (double)c_size * logdet_Ve; + logdet_Q = CalcQi(eval, eps_eval, D_l, X, Qi) - (double)c_size * logdet_Ve; for (size_t i = 0; i < c_size; i++) { for (size_t j = 0; j < c_size; j++) { @@ -1108,33 +1202,34 @@ size_t GetIndex(const size_t i, const size_t j, const size_t d_size) { return (2 * d_size - s + 1) * s / 2 + l - s; } -void Calc_yHiDHiy(const gsl_vector *eval, const gsl_matrix *Hiy, const size_t i, +void Calc_yHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const size_t i, const size_t j, double &yHiDHiy_g, double &yHiDHiy_e) { yHiDHiy_g = 0.0; yHiDHiy_e = 0.0; size_t n_size = eval->size; - double delta, d1, d2; + double delta, epsilon, d1, d2; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; d1 = gsl_matrix_get(Hiy, i, k); d2 = gsl_matrix_get(Hiy, j, k); if (i == j) { yHiDHiy_g += delta * d1 * d2; - yHiDHiy_e += d1 * d2; + yHiDHiy_e += epsilon * d1 * d2; } else { yHiDHiy_g += delta * d1 * d2 * 2.0; - yHiDHiy_e += d1 * d2 * 2.0; + yHiDHiy_e += epsilon * d1 * d2 * 2.0; } } return; } -void Calc_xHiDHiy(const gsl_vector *eval, const gsl_matrix *xHi, +void Calc_xHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *Hiy, const size_t i, const size_t j, gsl_vector *xHiDHiy_g, gsl_vector *xHiDHiy_e) { gsl_vector_set_zero(xHiDHiy_g); @@ -1142,17 +1237,18 @@ void Calc_xHiDHiy(const gsl_vector *eval, const gsl_matrix *xHi, size_t n_size = eval->size, d_size = Hiy->size1; - double delta, d; + double delta, epsilon, d; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i); d = gsl_matrix_get(Hiy, j, k); gsl_blas_daxpy(d * delta, &xHi_col_i.vector, xHiDHiy_g); - gsl_blas_daxpy(d, &xHi_col_i.vector, xHiDHiy_e); + gsl_blas_daxpy(d * epsilon, &xHi_col_i.vector, xHiDHiy_e); if (i != j) { gsl_vector_const_view xHi_col_j = @@ -1160,14 +1256,14 @@ void Calc_xHiDHiy(const gsl_vector *eval, const gsl_matrix *xHi, d = gsl_matrix_get(Hiy, i, k); gsl_blas_daxpy(d * delta, &xHi_col_j.vector, xHiDHiy_g); - gsl_blas_daxpy(d, &xHi_col_j.vector, xHiDHiy_e); + gsl_blas_daxpy(d * epsilon, &xHi_col_j.vector, xHiDHiy_e); } } return; } -void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *xHi, const size_t i, +void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const size_t i, const size_t j, gsl_matrix *xHiDHix_g, gsl_matrix *xHiDHix_e) { gsl_matrix_set_zero(xHiDHix_g); @@ -1176,13 +1272,14 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *xHi, const size_t i, size_t n_size = eval->size, dc_size = xHi->size1; size_t d_size = xHi->size2 / n_size; - double delta; + double delta, epsilon; gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *mat_dcdc_t = gsl_matrix_alloc(dc_size, dc_size); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i); @@ -1213,7 +1310,7 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *xHi, const size_t i, return; } -void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, +void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *Hiy, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &yHiDHiDHiy_gg, double &yHiDHiDHiy_ee, double &yHiDHiDHiy_ge) { @@ -1223,11 +1320,12 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, size_t n_size = eval->size, d_size = Hiy->size1; - double delta, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; + double delta, epsilon, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; double d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; d_Hiy_i1 = gsl_matrix_get(Hiy, i1, k); d_Hiy_j1 = gsl_matrix_get(Hiy, j1, k); @@ -1241,28 +1339,28 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, if (i1 == j1) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); } } else { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += - (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += - (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); } } @@ -1271,7 +1369,7 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, return; } -void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, +void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_vector *xHiDHiDHiy_gg, @@ -1282,11 +1380,12 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, size_t n_size = eval->size, d_size = Hiy->size1; - double delta, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; + double delta, epsilon, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; double d_Hi_j1i2, d_Hi_j1j2; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i1); @@ -1304,41 +1403,45 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, if (i1 == j1) { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); } } else { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ge); } } @@ -1347,7 +1450,7 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *Hi, return; } -void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *Hi, +void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *xHi, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_matrix *xHiDHiDHix_gg, gsl_matrix *xHiDHiDHix_ee, @@ -1364,6 +1467,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *Hi, for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; gsl_vector_const_view xHi_col_i1 = gsl_matrix_const_column(xHi, k * d_size + i1); @@ -1451,31 +1555,32 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *Hi, return; } -void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *Hi, const size_t i, +void Calc_traceHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const size_t i, const size_t j, double &tHiD_g, double &tHiD_e) { tHiD_g = 0.0; tHiD_e = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, d; + double delta, epsilon, d; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; d = gsl_matrix_get(Hi, j, k * d_size + i); if (i == j) { tHiD_g += delta * d; - tHiD_e += d; + tHiD_e += epsilon * d; } else { tHiD_g += delta * d * 2.0; - tHiD_e += d * 2.0; + tHiD_e += epsilon * d * 2.0; } } return; } -void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *Hi, +void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &tHiDHiD_gg, double &tHiDHiD_ee, double &tHiDHiD_ge) { @@ -1484,10 +1589,11 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *Hi, tHiDHiD_ge = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; + double delta, epsilon, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); @@ -1496,25 +1602,25 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *Hi, if (i1 == j1) { tHiDHiD_gg += delta * delta * d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ee += d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ge += delta * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ee += epsilon * epsilon * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ge += delta * epsilon * d_Hi_i1j2 * d_Hi_j1i2; if (i2 != j2) { tHiDHiD_gg += delta * delta * d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ee += d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ge += delta * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ee += epsilon * epsilon * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ge += delta * epsilon * d_Hi_i1i2 * d_Hi_j1j2; } } else { tHiDHiD_gg += delta * delta * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ee += (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ge += delta * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ge += delta * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); if (i2 != j2) { tHiDHiD_gg += delta * delta * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ee += (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ge += delta * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ge += delta * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); } } } @@ -1523,7 +1629,7 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *Hi, } // trace(PD) = trace((Hi-HixQixHi)D)=trace(HiD) - trace(HixQixHiD) -void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *Qi, +void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *Hi, const gsl_matrix *xHiDHix_all_g, const gsl_matrix *xHiDHix_all_e, const size_t i, const size_t j, double &tPD_g, double &tPD_e) { @@ -1533,7 +1639,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *Qi, double d; // Calculate the first part: trace(HiD). - Calc_traceHiD(eval, Hi, i, j, tPD_g, tPD_e); + Calc_traceHiD(eval, eps_eval, Hi, i, j, tPD_g, tPD_e); // Calculate the second part: -trace(HixQixHiD). for (size_t k = 0; k < dc_size; k++) { @@ -1555,7 +1661,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *Qi, // trace(PDPD) = trace((Hi-HixQixHi)D(Hi-HixQixHi)D) // = trace(HiDHiD) - trace(HixQixHiDHiD) // - trace(HiDHixQixHiD) + trace(HixQixHiDHixQixHiD) -void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *Qi, +void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *QixHiDHix_all_g, const gsl_matrix *QixHiDHix_all_e, @@ -1571,7 +1677,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *Qi, double d; // Calculate the first part: trace(HiDHiD). - Calc_traceHiDHiD(eval, Hi, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); + Calc_traceHiDHiD(eval, eps_eval, Hi, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); // Calculate the second and third parts: // -trace(HixQixHiDHiD) - trace(HiDHixQixHiD) @@ -1621,7 +1727,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *Qi, } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *xHi, +void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *Hiy, gsl_matrix *xHiDHiy_all_g, gsl_matrix *xHiDHiy_all_e) { gsl_matrix_set_zero(xHiDHiy_all_g); @@ -1640,14 +1746,14 @@ void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *xHi, gsl_vector_view xHiDHiy_g = gsl_matrix_column(xHiDHiy_all_g, v); gsl_vector_view xHiDHiy_e = gsl_matrix_column(xHiDHiy_all_e, v); - Calc_xHiDHiy(eval, xHi, Hiy, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); + Calc_xHiDHiy(eval, eps_eval, xHi, Hiy, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); } } return; } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *xHi, +void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, gsl_matrix *xHiDHix_all_g, gsl_matrix *xHiDHix_all_e) { gsl_matrix_set_zero(xHiDHix_all_g); gsl_matrix_set_zero(xHiDHix_all_e); @@ -1667,14 +1773,14 @@ void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *xHi, gsl_matrix_view xHiDHix_e = gsl_matrix_submatrix(xHiDHix_all_e, 0, v * dc_size, dc_size, dc_size); - Calc_xHiDHix(eval, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); + Calc_xHiDHix(eval, eps_eval, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); } } return; } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, +void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, gsl_matrix *xHiDHiDHiy_all_gg, gsl_matrix *xHiDHiDHiy_all_ee, @@ -1718,7 +1824,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, +void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *xHi, gsl_matrix *xHiDHiDHix_all_gg, gsl_matrix *xHiDHiDHix_all_ee, @@ -1860,7 +1966,7 @@ void Calc_QiMat_all(const gsl_matrix *Qi, const gsl_matrix *mat_all_g, // yPDPy = y(Hi-HixQixHi)D(Hi-HixQixHi)y // = ytHiDHiy - (yHix)Qi(xHiDHiy) - (yHiDHix)Qi(xHiy) // + (yHix)Qi(xHiDHix)Qi(xtHiy) -void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *Hiy, +void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *xHiDHixQixHiy_all_g, @@ -1872,7 +1978,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *Hiy, double d; // First part: ytHiDHiy. - Calc_yHiDHiy(eval, Hiy, i, j, yPDPy_g, yPDPy_e); + Calc_yHiDHiy(eval, eps_eval, Hiy, i, j, yPDPy_g, yPDPy_e); // Second and third parts: -(yHix)Qi(xHiDHiy)-(yHiDHix)Qi(xHiy) gsl_vector_const_view xHiDHiy_g = gsl_matrix_const_column(xHiDHiy_all_g, v); @@ -2357,7 +2463,7 @@ void CalcCRT(const gsl_matrix *Hessian_inv, const gsl_matrix *Qi, } // Calculate first-order and second-order derivatives. -void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, +void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_vector *QixHiy, gsl_vector *gradient, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, @@ -2402,14 +2508,14 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, gsl_matrix_alloc(dc_size, v_size * v_size * dc_size); // Calculate xHiDHiy_all, xHiDHix_all and xHiDHixQixHiy_all. - Calc_xHiDHiy_all(eval, xHi, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); - Calc_xHiDHix_all(eval, xHi, xHiDHix_all_g, xHiDHix_all_e); + Calc_xHiDHiy_all(eval, eps_eval, xHi, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); + Calc_xHiDHix_all(eval, eps_eval, xHi, xHiDHix_all_g, xHiDHix_all_e); Calc_xHiDHixQixHiy_all(xHiDHix_all_g, xHiDHix_all_e, QixHiy, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e); - Calc_xHiDHiDHiy_all(v_size, eval, Hi, xHi, Hiy, xHiDHiDHiy_all_gg, + Calc_xHiDHiDHiy_all(v_size, eval, eps_eval, Hi, xHi, Hiy, xHiDHiDHiy_all_gg, xHiDHiDHiy_all_ee, xHiDHiDHiy_all_ge); - Calc_xHiDHiDHix_all(v_size, eval, Hi, xHi, xHiDHiDHix_all_gg, + Calc_xHiDHiDHix_all(v_size, eval, eps_eval, Hi, xHi, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge); // Calculate QixHiDHiy_all, QixHiDHix_all and QixHiDHixQixHiy_all. @@ -2432,18 +2538,18 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, } v1 = GetIndex(i1, j1, d_size); - Calc_yPDPy(eval, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPy(eval, eps_eval, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, i1, j1, yPDPy_g, yPDPy_e); if (func_name == 'R' || func_name == 'r') { - Calc_tracePD(eval, Qi, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, + Calc_tracePD(eval, eps_eval, Qi, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, tPD_e); dev1_g = -0.5 * tPD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tPD_e + 0.5 * yPDPy_e; } else { - Calc_traceHiD(eval, Hi, i1, j1, tHiD_g, tHiD_e); + Calc_traceHiD(eval, eps_eval, Hi, i1, j1, tHiD_g, tHiD_e); dev1_g = -0.5 * tHiD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tHiD_e + 0.5 * yPDPy_e; @@ -2463,7 +2569,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, continue; } - Calc_yPDPDPy(eval, Hi, xHi, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPDPy(eval, eps_eval, Hi, xHi, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, QixHiDHiy_all_g, QixHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, QixHiDHixQixHiy_all_g, QixHiDHixQixHiy_all_e, xHiDHiDHiy_all_gg, @@ -2473,7 +2579,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, // AI for REML. if (func_name == 'R' || func_name == 'r') { - Calc_tracePDPD(eval, Qi, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, + Calc_tracePDPD(eval, eps_eval, Qi, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); @@ -2482,7 +2588,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *Qi, dev2_ee = 0.5 * tPDPD_ee - yPDPDPy_ee; dev2_ge = 0.5 * tPDPD_ge - yPDPDPy_ge; } else { - Calc_traceHiDHiD(eval, Hi, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, + Calc_traceHiDHiD(eval, eps_eval, Hi, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, tHiDHiD_ge); dev2_gg = 0.5 * tHiDHiD_gg - yPDPDPy_gg; @@ -2606,7 +2712,7 @@ void UpdateVgVe(const gsl_matrix *Hessian_inv, const gsl_vector *gradient, } double MphNR(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *Hi_all, gsl_matrix *xHi_all, gsl_matrix *Hiy_all, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, double &crt_c) { @@ -2694,7 +2800,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // If flag_pd==1, continue to calculate quantities // and logl. if (flag_pd == 1) { - CalcHiQi(eval, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); + CalcHiQi(eval, eps_eval, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); Calc_Hiy_all(Y, Hi_all, Hiy_all); Calc_xHi_all(X, Hi_all, xHi_all); @@ -2735,7 +2841,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, logl_old = logl_new; - CalcDev(func_name, eval, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, + CalcDev(func_name, eval, eps_eval, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, Hessian_inv, crt_a, crt_b, crt_c); } @@ -2762,7 +2868,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // Initialize Vg, Ve and B. void MphInitial(const size_t em_iter, const double em_prec, const size_t nr_iter, const double nr_prec, - const gsl_vector *eval, const gsl_matrix *X, + const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, const double l_min, const double l_max, const size_t n_region, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *B) { @@ -2786,9 +2892,9 @@ void MphInitial(const size_t em_iter, const double em_prec, for (size_t i = 0; i < d_size; i++) { gsl_vector_const_view Y_row = gsl_matrix_const_row(Y, i); - CalcLambda('R', eval, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, + CalcLambda('R', eval, eps_eval, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, logl); - CalcLmmVgVeBeta(eval, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, + CalcLmmVgVeBeta(eval, eps_eval, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, se_beta_temp); gsl_matrix_set(V_g, i, i, vg); @@ -2847,10 +2953,10 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_matrix_set(Vg_sub, 1, 1, gsl_matrix_get(V_g, j, j)); gsl_matrix_set(Ve_sub, 1, 1, gsl_matrix_get(V_e, j, j)); - logl = MphEM('R', em_iter, em_prec, eval, X, Y_sub, U_hat, E_hat, + logl = MphEM('R', em_iter, em_prec, eval, eps_eval, X, Y_sub, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, Vg_sub, Ve_sub, B_sub); - logl = MphNR('R', nr_iter, nr_prec, eval, X, Y_sub, Hi_all, xHi_all, + logl = MphNR('R', nr_iter, nr_prec, eval, eps_eval, X, Y_sub, Hi_all, xHi_all, Hiy_all, Vg_sub, Ve_sub, Hessian, a, b, c); gsl_matrix_set(V_g, i, j, gsl_matrix_get(Vg_sub, 0, 1)); @@ -2894,7 +3000,7 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_vector_set_zero(XHiy); - double dl, d, delta, dx, dy; + double dl, d, delta, epsilon, dx, dy; // Eigen decomposition and calculate log|Ve|. // double logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); @@ -2902,7 +3008,7 @@ void MphInitial(const size_t em_iter, const double em_prec, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, X, Qi); - CalcQi(eval, D_l, X, Qi); + CalcQi(eval, eps_eval, D_l, X, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -2915,9 +3021,10 @@ void MphInitial(const size_t em_iter, const double em_prec, d = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); + epsilon = gsl_vector_get(eps_eval, k) / V_e_temp dx = gsl_matrix_get(X, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d += dy * dx / (delta * dl + 1.0); + d += dy * dx / (delta * dl + epsilon); } gsl_vector_set(XHiy, j * d_size + i, d); } diff --git a/src/param.cpp b/src/param.cpp index f96e9c3..3e0ab30 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -65,6 +65,22 @@ void LOCO_set_Snps(set &ksnps, set &gwasnps, } } +// This code defines a function named LOCO_set_Snps that takes four arguments: +// two set references (ksnps and gwasnps), a constant map reference (mapchr), and a constant string (loco). + +// The function first checks that both ksnps and gwasnps are empty sets to ensure they are not initialized twice. + +// Next, the function loops through each key-value pair (kv) in the mapchr map using a range-based for loop. +//For each key-value pair, the function extracts the key (snp) and value (chr) using auto. + +// Then, the function checks if chr is equal to loco. If it is, then the snp is added to +// gwasnps using the insert() method of the set container. If chr is not equal to loco, then snp is added to ksnps. + +// Essentially, the function divides the set of SNPs (single nucleotide polymorphisms) into two groups: +// the SNPs that are associated with the trait of interest (gwasnps) and the SNPs that are not associated with the trait of interest (ksnps). +// The loco variable specifies the chromosome on which the trait of interest is located. + + // Trim #individuals to size which is used to write tests that run faster // // Note it actually trims the number of functional individuals @@ -243,6 +259,11 @@ void PARAM::ReadFiles(void) { error = true; } } + if (!file_res.empty()) { + if (ReadFile_column(file_res, indicator_res, res_var, 1) == false) { + error = true; + } + } trim_individuals(indicator_idv, ni_max); @@ -939,6 +960,7 @@ void PARAM::CheckParam(void) { enforce_fexists(file_weight, "open file"); enforce_fexists(file_epm, "open file"); enforce_fexists(file_ebv, "open file"); + enforce_fexists(file_res, "open file"); enforce_fexists(file_read, "open file"); // Check if files are compatible with analysis mode. @@ -1020,6 +1042,14 @@ void PARAM::CheckData(void) { return; } + if ((indicator_res).size() != 0 && + (indicator_res).size() != (indicator_idv).size()) { + error = true; + cout << "error! number of rows in the residual variance file do not match " + << "the number of individuals. " << endl; + return; + } + if ((indicator_read).size() != 0 && (indicator_read).size() != (indicator_idv).size()) { error = true; @@ -1069,6 +1099,12 @@ void PARAM::CheckData(void) { } } + if (indicator_res.size() != 0) { + if (indicator_res[i] == 0) { + continue; + } + } + for (size_t j = 0; j < indicator_pheno[i].size(); j++) { if (indicator_pheno[i][j] == 0) { np_miss++; @@ -2026,6 +2062,13 @@ void PARAM::ProcessCvtPhen() { } } + // Remove individuals with missing residual variance. + if ((indicator_res).size() != 0) { + for (vector::size_type i = 0; i < (indicator_idv).size(); ++i) { + indicator_idv[i] *= indicator_res[i]; + } + } + // Obtain ni_test. ni_test = 0; for (vector::size_type i = 0; i < (indicator_idv).size(); ++i) { @@ -2141,6 +2184,20 @@ void PARAM::CopyWeight(gsl_vector *w) { return; } +void PARAM::CopyResid(gsl_vector *res) { + size_t ci_test = 0; + + for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { + if (indicator_idv[i] == 0 || indicator_res[i] == 0) { + continue; + } + gsl_vector_set(res, ci_test, res_var[i]); + ci_test++; + } + + return; +} + // If flag=0, then use indicator_idv to load W and Y; // else, use indicator_cvt to load them. void PARAM::CopyCvtPhen(gsl_matrix *W, gsl_vector *y, size_t flag) { From ca93fb2f47a72d15fab924bcd843947ae1eb4f34 Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Tue, 21 Mar 2023 11:08:55 -0400 Subject: [PATCH 02/37] Fixed 'cvt' variable and missing 0 < geno < 2 checks --- src/gemma_io.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 25a8b56..3e27dd6 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -507,7 +507,7 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, } bool ReadFile_res(const string &file_res, vector &indicator_res, - vector> &res, size_t &n_res) { + vector> &res_var, size_t &n_res) { debug_msg("entered"); indicator_res.clear(); @@ -543,7 +543,7 @@ bool ReadFile_res(const string &file_res, vector &indicator_res, } else { indicator_res.push_back(0); } - res.push_back(v_d); + res_var.push_back(v_d); } if (indicator_res.empty()) { @@ -557,9 +557,9 @@ bool ReadFile_res(const string &file_res, vector &indicator_res, if (flag_na == 0) { flag_na = 1; - n_res = res[i].size(); + n_res = res_var[i].size(); } - if (flag_na != 0 && n_res != cvt[i].size()) { + if (flag_na != 0 && n_res != res_var[i].size()) { cout << "error! number of residuals in row " << i << " do not match other rows." << endl; return false; @@ -748,6 +748,10 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, double maf, geno, geno_old; size_t n_miss; size_t n_0, n_1, n_2; + + double min_g = std::numeric_limits::max(); + double max_g = std::numeric_limits::min(); + int flag_poly; int ni_total = indicator_idv.size(); @@ -781,8 +785,7 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, if (mapRS2bp.count(rs) == 0) { if (is_debug_mode() && count_warnings++ < 10) { - std::string msg = "Can't figure out position for "; - msg += rs; + std::string msg = "Can't figure out position for <" + rs + ">"; debug_msg(msg); if (count_warnings == 10) debug_msg("Skipping similar warnings"); @@ -832,6 +835,8 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, } gsl_vector_set(genotype, c_idv, geno); + if (geno < min_g) min_g = geno; + if (geno > max_g) max_g = geno; // going through genotypes with 0.0 < geno < 2.0 if (flag_poly == 0) { // first init in marker @@ -908,6 +913,11 @@ bool ReadFile_geno(const string &file_geno, const set &setSnps, ns_test++; } + if (min_g != 0.0) + warning_msg("The minimum genotype value is not 0.0 - this is not the BIMBAM standard and will skew l_lme and effect sizes"); + if (max_g != 2.0) + warning_msg("The maximum genotype value is not 2.0 - this is not the BIMBAM standard and will skew l_lme and effect sizes"); + gsl_vector_free(genotype); gsl_vector_free(genotype_miss); gsl_matrix_free(WtW); From 763a0b5fb304aa9fee81e665356ca4d979d6969c Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Thu, 6 Apr 2023 14:22:03 -0400 Subject: [PATCH 03/37] Fixed errors except for MphInitial errors --- src/mvlmm.cpp | 570 ++++++++++++++++++++++++++++---------------------- 1 file changed, 323 insertions(+), 247 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index 60bdeee..35142f3 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -210,7 +210,7 @@ void MVLMM::WriteFiles() { } // Below are functions for EM algorithm. -double EigenProc(const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_vector *D_l, +tuple EigenProc(const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_vector *D_l, gsl_matrix *UltVeh, gsl_matrix *UltVehi) { size_t d_size = V_g->size1; double d, logdet_Ve = 0.0; @@ -278,16 +278,16 @@ double EigenProc(const gsl_matrix *V_g, const gsl_matrix *V_e, gsl_vector *D_l, gsl_matrix_free(VgVehi); gsl_matrix_free(U_l); - return logdet_Ve; + return make_tuple(V_e_temp, logdet_Ve); } // Qi=(\sum_{k=1}^n x_kx_k^T\otimes(delta_k*Dl+epsilon_k)^{-1} )^{-1}. double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, - const gsl_matrix *X, gsl_matrix *Qi) { + const gsl_matrix *X, const gsl_matrix *V_e_temp, gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; size_t c_size = dc_size / d_size; - double delta, epsilon, dl, d1, d2, d, logdet_Q; + double delta, ve, epsilon, epsilon_sc, dl, d1, d2, d, logdet_Q; gsl_matrix *Q = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix_set_zero(Q); @@ -296,6 +296,7 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect for (size_t j = 0; j < c_size; j++) { for (size_t l = 0; l < d_size; l++) { dl = gsl_vector_get(D_l, l); + ve = gsl_matrix_get(V_e_temp, l, l); if (j < i) { d = gsl_matrix_get(Q, j * d_size + l, i * d_size + l); @@ -305,8 +306,10 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect d1 = gsl_matrix_get(X, i, k); d2 = gsl_matrix_get(X, j, k); delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; - d += d1 * d2 / (dl * delta + epsilon); // @@ + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; + d += d1 * d2 / (dl * delta + epsilon_sc); // @@ } } @@ -333,24 +336,27 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect // // FIXME: mvlmm spends a massive amount of time here void CalcXHiY(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, - const gsl_matrix *X, const gsl_matrix *UltVehiY, + const gsl_matrix *X, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, gsl_vector *xHiy) { // debug_msg("enter"); size_t n_size = eval->size, c_size = X->size1, d_size = D_l->size; // gsl_vector_set_zero(xHiy); - double x, delta, epsilon, dl, y, d; + double x, delta, ve, epsilon, epsilon_sc, dl, y, d; for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t j = 0; j < c_size; j++) { d = 0.0; for (size_t k = 0; k < n_size; k++) { x = gsl_matrix_get(X, j, k); y = gsl_matrix_get(UltVehiY, i, k); delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; - d += x * y / (delta * dl + epsilon); + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; + d += x * y / (delta * dl + epsilon_sc); } gsl_vector_set(xHiy, j * d_size + i, d); } @@ -362,18 +368,21 @@ void CalcXHiY(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect // OmegaU=D_l/(delta Dl+epsilon)^{-1} // OmegaE=delta D_l/(delta Dl+epsilon)^{-1} -void CalcOmega(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, +void CalcOmega(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *V_e_temp, gsl_matrix *OmegaU, gsl_matrix *OmegaE) { size_t n_size = eval->size, d_size = D_l->size; - double delta, epsilon, dl, d_u, d_e; + double delta, ve, epsilon, epsilon_sc, dl, d_u, d_e; for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + delta = gsl_vector_get(eval, k);; + epsilon = gsl_vector_get(eps_eval, k); + for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); + ve = gsl_matrix_get(V_e_temp, i, i); - d_u = dl / (delta * dl + epsilon); // @@ + epsilon_sc = epsilon / ve; + d_u = dl / (delta * dl + epsilon_sc); // @@ d_e = delta * d_u; gsl_matrix_set(OmegaU, i, k, d_u); @@ -443,28 +452,32 @@ void UpdateRL_B(const gsl_vector *xHiy, const gsl_matrix *Qi, return; } -void UpdateV(const gsl_vector *eval, gsl_vector *eps_eval, const gsl_matrix *U, const gsl_matrix *E, - const gsl_matrix *Sigma_uu, const gsl_matrix *Sigma_ee, +void UpdateV(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *U, const gsl_matrix *E, + const gsl_matrix *Sigma_uu, const gsl_matrix *Sigma_ee, const gsl_matrix *V_e_temp, gsl_matrix *V_g, gsl_matrix *V_e) { size_t n_size = eval->size, d_size = U->size1; gsl_matrix_set_zero(V_g); gsl_matrix_set_zero(V_e); - double delta, epsilon; + double delta, ve, epsilon, epsilon_sc; // Calculate the first part: UD^{-1}U^T and EE^T. + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); + for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); if (delta == 0) { continue; } - + epsilon_sc = epsilon / ve; gsl_vector_const_view U_col = gsl_matrix_const_column(U, k); gsl_vector_const_view E_col = gsl_matrix_const_column(E, k); gsl_blas_dsyr(CblasUpper, 1.0 / delta, &U_col.vector, V_g); - gsl_blas_dsyr(CblasUpper, 1.0 / epsilon, &E_col.vector, V_e); + gsl_blas_dsyr(CblasUpper, 1.0 / epsilon_sc, &E_col.vector, V_e); + } } @@ -490,7 +503,7 @@ void UpdateV(const gsl_vector *eval, gsl_vector *eps_eval, const gsl_matrix *U, void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *OmegaU, const gsl_matrix *OmegaE, - const gsl_matrix *UltVeh, const gsl_matrix *Qi, + const gsl_matrix *UltVeh, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, gsl_matrix *Sigma_uu, gsl_matrix *Sigma_ee) { if (func_name != 'R' && func_name != 'L' && func_name != 'r' && func_name != 'l') { @@ -505,7 +518,7 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e gsl_matrix_set_zero(Sigma_uu); gsl_matrix_set_zero(Sigma_ee); - double delta, epsilon, dl, x, d; + double delta, ve, epsilon, epsilon_sc, dl, x, d; // Calculate the first diagonal term. gsl_vector_view Suu_diag = gsl_matrix_diagonal(Sigma_uu); @@ -530,13 +543,16 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t j = 0; j < c_size; j++) { x = gsl_matrix_get(X, j, k); - d = x / (delta * dl + epsilon); + + epsilon_sc = epsilon / ve; + d = x / (delta * dl + epsilon_sc); gsl_matrix_set(M_e, j * d_size + i, i, d); gsl_matrix_set(M_u, j * d_size + i, i, d * dl); } @@ -569,19 +585,22 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e // 'R' update B and 'L' don't. // only calculate -0.5*\sum_{k=1}^n|H_k|-0.5yPxy. double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *xHiy, - const gsl_vector *D_l, const gsl_matrix *UltVehiY, + const gsl_vector *D_l, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, const gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; - double logl = 0.0, delta, epsilon, dl, y, d; + double logl = 0.0, delta, ve, epsilon, epsilon_sc, dl, y, d; // Calculate yHiy+log|H_k|. for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); for (size_t i = 0; i < d_size; i++) { y = gsl_matrix_get(UltVehiY, i, k); dl = gsl_vector_get(D_l, i); - d = delta * dl + epsilon; + ve = gsl_matrix_get(V_e_temp, i, i); + + epsilon_sc = epsilon / ve; + d = delta * dl + epsilon_sc; logl += y * y / d + safe_log(d); } @@ -624,6 +643,7 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehi = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehiB = gsl_matrix_alloc(d_size, c_size); gsl_matrix *Qi = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *Sigma_uu = gsl_matrix_alloc(d_size, d_size); @@ -699,16 +719,16 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, // Start EM. for (size_t t = 0; t < max_iter; t++) { - logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); + tie(V_e_temp, logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); - logdet_Q = CalcQi(eval, eps_eval, D_l, X, Qi); + logdet_Q = CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); - CalcXHiY(eval, eps_eval, D_l, X, UltVehiY, xHiy); + CalcXHiY(eval, eps_eval, D_l, X, UltVehiY, V_e_temp, xHiy); // Calculate log likelihood/restricted likelihood value, and // terminate if change is small. - logl_new = logl_const + MphCalcLogL(eval, eps_eval, xHiy, D_l, UltVehiY, Qi) - + logl_new = logl_const + MphCalcLogL(eval, eps_eval, xHiy, D_l, UltVehiY, V_e_temp, Qi) - 0.5 * (double)n_size * logdet_Ve; if (func_name == 'R' || func_name == 'r') { logl_new += -0.5 * (logdet_Q - (double)c_size * logdet_Ve); @@ -718,7 +738,7 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, } logl_old = logl_new; - CalcOmega(eval, eps_eval, D_l, OmegaU, OmegaE); + CalcOmega(eval, eps_eval, D_l, V_e_temp, OmegaU, OmegaE); // Update UltVehiB, UltVehiU. if (func_name == 'R' || func_name == 'r') { @@ -750,11 +770,11 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, UltVeh, UltVehiB, 0.0, B); // Calculate Sigma_uu and Sigma_ee. - CalcSigma(func_name, eval, eps_eval, D_l, X, OmegaU, OmegaE, UltVeh, Qi, Sigma_uu, + CalcSigma(func_name, eval, eps_eval, D_l, X, OmegaU, OmegaE, UltVeh, Qi, V_e_temp, Sigma_uu, Sigma_ee); // Update V_g and V_e. - UpdateV(eval, eps_eval, U_hat, E_hat, Sigma_uu, Sigma_ee, V_g, V_e); + UpdateV(eval, eps_eval, U_hat, E_hat, Sigma_uu, Sigma_ee, V_e_temp, V_g, V_e); // print statements //print iteration number: cout<< t<size, c_size = W->size1, d_size = V_g->size1; size_t dc_size = d_size * c_size; - double delta, epsilon, dl, d, d1, d2, dy, dx, dw; // logdet_Ve, logdet_Q, p_value; + double delta, ve, epsilon, epsilon_sc, dl, d, d1, d2, dy, dx, dw; // logdet_Ve, logdet_Q, p_value; gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehi = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_matrix *Qi = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *WHix = gsl_matrix_alloc(dc_size, d_size); gsl_matrix *QiWHix = gsl_matrix_alloc(dc_size, d_size); @@ -844,7 +865,7 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ve // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, W, Qi); - CalcQi(eval, eps_eval, D_l, W, Qi); + CalcQi(eval, eps_eval, D_l, W, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -852,17 +873,19 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ve // Calculate WHix, WHiy, xHiy, xHix. for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); + ve = gsl_matrix_get(V_e_temp, i, i); d1 = 0.0; d2 = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); dx = gsl_vector_get(x_vec, k); dy = gsl_matrix_get(UltVehiY, i, k); - d1 += dx * dy / (delta * dl + epsilon); - d2 += dx * dx / (delta * dl + epsilon); + epsilon_sc = epsilon / ve; + d1 += dx * dy / (delta * dl + epsilon_sc); + d2 += dx * dx / (delta * dl + epsilon_sc); } gsl_vector_set(xPy, i, d1); gsl_matrix_set(xPx, i, i, d2); @@ -872,13 +895,14 @@ double MphCalcP(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ve d2 = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); dx = gsl_vector_get(x_vec, k); dw = gsl_matrix_get(W, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d1 += dx * dw / (delta * dl + epsilon); - d2 += dy * dw / (delta * dl + epsilon); + epsilon_sc = epsilon / ve; + d1 += dx * dw / (delta * dl + epsilon_sc); + d2 += dy * dw / (delta * dl + epsilon_sc); } gsl_matrix_set(WHix, j * d_size + i, i, d1); gsl_vector_set(WHiy, j * d_size + i, d2); @@ -930,11 +954,12 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_m gsl_matrix *se_B) { size_t n_size = eval->size, c_size = W->size1, d_size = V_g->size1; size_t dc_size = d_size * c_size; - double delta, epsilon, dl, d, dy, dw; // , logdet_Ve, logdet_Q; + double delta, ve, epsilon, epsilon_sc, dl, d, dy, dw; // , logdet_Ve, logdet_Q; gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehi = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_matrix *Qi = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *Qi_temp = gsl_matrix_alloc(dc_size, dc_size); gsl_vector *WHiy = gsl_vector_alloc(dc_size); @@ -945,12 +970,12 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_m gsl_vector_set_zero(WHiy); // Eigen decomposition and calculate log|Ve|. - // double logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); + // tuple(V_e_temp,logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); // Calculate Qi and log|Q|. - // double logdet_Q = CalcQi(eval, D_l, W, Qi); - CalcQi(eval, eps_eval, D_l, W, Qi); + // double logdet_Q = CalcQi(eval, D_l, W, V_e_temp, Qi); + CalcQi(eval, eps_eval, D_l, W, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -958,16 +983,18 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_m // Calculate WHiy. for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t j = 0; j < c_size; j++) { d = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); dw = gsl_matrix_get(W, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d += dy * dw / (delta * dl + epsilon); + epsilon_sc = epsilon / ve; + d += dy * dw / (delta * dl + epsilon_sc); } gsl_vector_set(WHiy, j * d_size + i, d); } @@ -1018,6 +1045,7 @@ void MphCalcBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_m gsl_matrix_free(UltVeh); gsl_matrix_free(UltVehi); gsl_matrix_free(Qi); + //gsl_matrix_free(V_e_temp); gsl_matrix_free(Qi_temp); gsl_vector_free(WHiy); gsl_vector_free(QiWHiy); @@ -1041,26 +1069,30 @@ void CalcHiQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matr logdet_Q = 0.0; size_t n_size = eval->size, c_size = X->size1, d_size = V_g->size1; - double logdet_Ve = 0.0, delta, epsilon, dl, d; + double logdet_Ve = 0.0, delta, ve, epsilon, epsilon_sc, dl, d; gsl_matrix *mat_dd = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehi = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_vector *D_l = gsl_vector_alloc(d_size); // Calculate D_l, UltVeh and UltVehi. - logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); + tie(V_e_temp, logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); // Calculate each Hi and log|H_k|. logdet_H = (double)n_size * logdet_Ve; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); gsl_matrix_memcpy(mat_dd, UltVehi); for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); - d = delta * dl + epsilon; + ve = gsl_matrix_get(V_e_temp, i, i); + + epsilon_sc = epsilon / ve; + d = delta * dl + epsilon_sc; gsl_vector_view mat_row = gsl_matrix_row(mat_dd, i); gsl_vector_scale(&mat_row.vector, 1.0 / d); // @@ @@ -1077,7 +1109,7 @@ void CalcHiQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matr // Calculate Qi, and multiply I\o times UtVeh on both side and // calculate logdet_Q, don't forget to substract // c_size*logdet_Ve. - logdet_Q = CalcQi(eval, eps_eval, D_l, X, Qi) - (double)c_size * logdet_Ve; + logdet_Q = CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi) - (double)c_size * logdet_Ve; for (size_t i = 0; i < c_size; i++) { for (size_t j = 0; j < c_size; j++) { @@ -1202,53 +1234,63 @@ size_t GetIndex(const size_t i, const size_t j, const size_t d_size) { return (2 * d_size - s + 1) * s / 2 + l - s; } -void Calc_yHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const size_t i, +void Calc_yHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i, const size_t j, double &yHiDHiy_g, double &yHiDHiy_e) { yHiDHiy_g = 0.0; yHiDHiy_e = 0.0; size_t n_size = eval->size; + size_t d_size = V_e_temp->size1; - double delta, epsilon, d1, d2; + double delta, ve, epsilon, epsilon_sc, d1, d2; +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); d1 = gsl_matrix_get(Hiy, i, k); d2 = gsl_matrix_get(Hiy, j, k); + epsilon_sc = epsilon / ve; + if (i == j) { yHiDHiy_g += delta * d1 * d2; - yHiDHiy_e += epsilon * d1 * d2; + yHiDHiy_e += epsilon_sc * d1 * d2; } else { yHiDHiy_g += delta * d1 * d2 * 2.0; - yHiDHiy_e += epsilon * d1 * d2 * 2.0; + yHiDHiy_e += epsilon_sc * d1 * d2 * 2.0; } } +} + return; } void Calc_xHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, - const gsl_matrix *Hiy, const size_t i, const size_t j, + const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i, const size_t j, gsl_vector *xHiDHiy_g, gsl_vector *xHiDHiy_e) { gsl_vector_set_zero(xHiDHiy_g); gsl_vector_set_zero(xHiDHiy_e); size_t n_size = eval->size, d_size = Hiy->size1; - double delta, epsilon, d; - + double delta, ve, epsilon, epsilon_sc, d; +for (size_t i = 0; i < d_size; d++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i); d = gsl_matrix_get(Hiy, j, k); gsl_blas_daxpy(d * delta, &xHi_col_i.vector, xHiDHiy_g); - gsl_blas_daxpy(d * epsilon, &xHi_col_i.vector, xHiDHiy_e); + gsl_blas_daxpy(d * epsilon_sc, &xHi_col_i.vector, xHiDHiy_e); if (i != j) { gsl_vector_const_view xHi_col_j = @@ -1256,14 +1298,14 @@ void Calc_xHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ d = gsl_matrix_get(Hiy, i, k); gsl_blas_daxpy(d * delta, &xHi_col_j.vector, xHiDHiy_g); - gsl_blas_daxpy(d * epsilon, &xHi_col_j.vector, xHiDHiy_e); + gsl_blas_daxpy(d * epsilon_sc, &xHi_col_j.vector, xHiDHiy_e); } } - +} return; } -void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const size_t i, +void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i, const size_t j, gsl_matrix *xHiDHix_g, gsl_matrix *xHiDHix_e) { gsl_matrix_set_zero(xHiDHix_g); @@ -1272,14 +1314,17 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ size_t n_size = eval->size, dc_size = xHi->size1; size_t d_size = xHi->size2 / n_size; - double delta, epsilon; + double delta, ve, epsilon, epsilon_sc; gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *mat_dcdc_t = gsl_matrix_alloc(dc_size, dc_size); - +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i); @@ -1291,18 +1336,21 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ gsl_matrix_transpose_memcpy(mat_dcdc_t, mat_dcdc); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHix_e, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHix_g, mat_dcdc); if (i != j) { + gsl_matrix_scale(mat_dcdc_t, epsilon_sc); gsl_matrix_add(xHiDHix_e, mat_dcdc_t); gsl_matrix_scale(mat_dcdc_t, delta); gsl_matrix_add(xHiDHix_g, mat_dcdc_t); } } +} gsl_matrix_free(mat_dcdc); gsl_matrix_free(mat_dcdc_t); @@ -1311,7 +1359,7 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ } void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, - const gsl_matrix *Hiy, const size_t i1, const size_t j1, + const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &yHiDHiDHiy_gg, double &yHiDHiDHiy_ee, double &yHiDHiDHiy_ge) { yHiDHiDHiy_gg = 0.0; @@ -1320,12 +1368,15 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hiy->size1; - double delta, epsilon, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; + double delta, ve, epsilon, epsilon_sc, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; double d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; - +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; d_Hiy_i1 = gsl_matrix_get(Hiy, i1, k); d_Hiy_j1 = gsl_matrix_get(Hiy, j1, k); @@ -1339,38 +1390,39 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g if (i1 == j1) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); } } else { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); } } } +} return; } void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, - const gsl_matrix *xHi, const gsl_matrix *Hiy, + const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_vector *xHiDHiDHiy_gg, gsl_vector *xHiDHiDHiy_ee, gsl_vector *xHiDHiDHiy_ge) { @@ -1380,12 +1432,16 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hiy->size1; - double delta, epsilon, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; + double delta, ve, epsilon, epsilon_sc, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; double d_Hi_j1i2, d_Hi_j1j2; +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i1); @@ -1403,54 +1459,55 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g if (i1 == j1) { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); } } else { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + gsl_blas_daxpy(delta * epsilon_sc * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ge); } } } - +} return; } -void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, +void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_matrix *xHiDHiDHix_gg, gsl_matrix *xHiDHiDHix_ee, @@ -1461,13 +1518,17 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hi->size1, dc_size = xHi->size1; - double delta, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; + double delta, ve, epsilon, epsilon_sc, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; gsl_vector_const_view xHi_col_i1 = gsl_matrix_const_column(xHi, k * d_size + i1); @@ -1489,7 +1550,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1500,7 +1561,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1511,7 +1572,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1521,7 +1582,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1532,7 +1593,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1542,45 +1603,51 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_scale(mat_dcdc, epsilon_sc); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); } } } +} gsl_matrix_free(mat_dcdc); return; } -void Calc_traceHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const size_t i, +void Calc_traceHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i, const size_t j, double &tHiD_g, double &tHiD_e) { tHiD_g = 0.0; tHiD_e = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, epsilon, d; + double delta, ve, epsilon, epsilon_sc, d; +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); d = gsl_matrix_get(Hi, j, k * d_size + i); + epsilon_sc = epsilon / ve; + if (i == j) { tHiD_g += delta * d; - tHiD_e += epsilon * d; + tHiD_e += epsilon_sc * d; } else { tHiD_g += delta * d * 2.0; - tHiD_e += epsilon * d * 2.0; + tHiD_e += epsilon_sc * d * 2.0; } } +} return; } -void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, +void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &tHiDHiD_gg, double &tHiDHiD_ee, double &tHiDHiD_ge) { @@ -1589,11 +1656,15 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const tHiDHiD_ge = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, epsilon, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; + double delta, ve, epsilon, epsilon_sc, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; +for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp; + epsilon = gsl_vector_get(eps_eval, k); + + epsilon_sc = epsilon / ve; d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); @@ -1602,34 +1673,35 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const if (i1 == j1) { tHiDHiD_gg += delta * delta * d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ee += epsilon * epsilon * d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ge += delta * epsilon * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ee += epsilon_sc * epsilon_sc * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ge += delta * epsilon_sc * d_Hi_i1j2 * d_Hi_j1i2; if (i2 != j2) { tHiDHiD_gg += delta * delta * d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ee += epsilon * epsilon * d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ge += delta * epsilon * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ee += epsilon_sc * epsilon_sc * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ge += delta * epsilon_sc * d_Hi_i1i2 * d_Hi_j1j2; } } else { tHiDHiD_gg += delta * delta * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ge += delta * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ee += epsilon_sc * epsilon_sc * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ge += delta * epsilon_sc * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); if (i2 != j2) { tHiDHiD_gg += delta * delta * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ge += delta * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ee += epsilon_sc * epsilon_sc * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ge += delta * epsilon_sc * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); } } } +} return; } // trace(PD) = trace((Hi-HixQixHi)D)=trace(HiD) - trace(HixQixHiD) -void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, +void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHiDHix_all_g, const gsl_matrix *xHiDHix_all_e, const size_t i, const size_t j, double &tPD_g, double &tPD_e) { @@ -1639,7 +1711,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ double d; // Calculate the first part: trace(HiD). - Calc_traceHiD(eval, eps_eval, Hi, i, j, tPD_g, tPD_e); + Calc_traceHiD(eval, eps_eval, Hi, V_e_temp, i, j, tPD_g, tPD_e); // Calculate the second part: -trace(HixQixHiD). for (size_t k = 0; k < dc_size; k++) { @@ -1661,7 +1733,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ // trace(PDPD) = trace((Hi-HixQixHi)D(Hi-HixQixHi)D) // = trace(HiDHiD) - trace(HixQixHiDHiD) // - trace(HiDHixQixHiD) + trace(HixQixHiDHixQixHiD) -void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, +void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *QixHiDHix_all_g, const gsl_matrix *QixHiDHix_all_e, @@ -1677,7 +1749,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gs double d; // Calculate the first part: trace(HiDHiD). - Calc_traceHiDHiD(eval, eps_eval, Hi, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); + Calc_traceHiDHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); // Calculate the second and third parts: // -trace(HixQixHiDHiD) - trace(HiDHixQixHiD) @@ -1727,7 +1799,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gs } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, +void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiy_all_g, gsl_matrix *xHiDHiy_all_e) { gsl_matrix_set_zero(xHiDHiy_all_g); @@ -1746,14 +1818,14 @@ void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector_view xHiDHiy_g = gsl_matrix_column(xHiDHiy_all_g, v); gsl_vector_view xHiDHiy_e = gsl_matrix_column(xHiDHiy_all_e, v); - Calc_xHiDHiy(eval, eps_eval, xHi, Hiy, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); + Calc_xHiDHiy(eval, eps_eval, xHi, Hiy, V_e_temp, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); } } return; } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, +void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHix_all_g, gsl_matrix *xHiDHix_all_e) { gsl_matrix_set_zero(xHiDHix_all_g); gsl_matrix_set_zero(xHiDHix_all_e); @@ -1773,7 +1845,7 @@ void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix_view xHiDHix_e = gsl_matrix_submatrix(xHiDHix_all_e, 0, v * dc_size, dc_size, dc_size); - Calc_xHiDHix(eval, eps_eval, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); + Calc_xHiDHix(eval, eps_eval, V_e_temp, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); } } return; @@ -1781,7 +1853,7 @@ void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const // Calculate (xHiDHiy) for every pair (i,j). void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, - const gsl_matrix *Hi, const gsl_matrix *xHi, + const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiDHiy_all_gg, gsl_matrix *xHiDHiDHiy_all_ee, gsl_matrix *xHiDHiDHiy_all_ge) { @@ -1813,7 +1885,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ gsl_vector_view xHiDHiDHiy_ge = gsl_matrix_column(xHiDHiDHiy_all_ge, v1 * v_size + v2); - Calc_xHiDHiDHiy(eval, Hi, xHi, Hiy, i1, j1, i2, j2, + Calc_xHiDHiDHiy(eval, eps_eval, Hi, xHi, Hiy, V_e_temp, i1, j1, i2, j2, &xHiDHiDHiy_gg.vector, &xHiDHiDHiy_ee.vector, &xHiDHiDHiy_ge.vector); } @@ -1825,7 +1897,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ // Calculate (xHiDHix) for every pair (i,j). void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, - const gsl_matrix *Hi, const gsl_matrix *xHi, + const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHiDHix_all_gg, gsl_matrix *xHiDHiDHix_all_ee, gsl_matrix *xHiDHiDHix_all_ge) { @@ -1864,7 +1936,7 @@ void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_ xHiDHiDHix_all_ge, 0, (v1 * v_size + v2) * dc_size, dc_size, dc_size); - Calc_xHiDHiDHix(eval, Hi, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, + Calc_xHiDHiDHix(eval, eps_eval, Hi, V_e_temp, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, &xHiDHiDHix_ee1.matrix, &xHiDHiDHix_ge1.matrix); if (v2 != v1) { @@ -1966,7 +2038,7 @@ void Calc_QiMat_all(const gsl_matrix *Qi, const gsl_matrix *mat_all_g, // yPDPy = y(Hi-HixQixHi)D(Hi-HixQixHi)y // = ytHiDHiy - (yHix)Qi(xHiDHiy) - (yHiDHix)Qi(xHiy) // + (yHix)Qi(xHiDHix)Qi(xtHiy) -void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, +void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *xHiDHixQixHiy_all_g, @@ -1978,7 +2050,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ma double d; // First part: ytHiDHiy. - Calc_yHiDHiy(eval, eps_eval, Hiy, i, j, yPDPy_g, yPDPy_e); + Calc_yHiDHiy(eval, eps_eval, Hiy, V_e_temp, i, j, yPDPy_g, yPDPy_e); // Second and third parts: -(yHix)Qi(xHiDHiy)-(yHiDHix)Qi(xHiy) gsl_vector_const_view xHiDHiy_g = gsl_matrix_const_column(xHiDHiy_all_g, v); @@ -2012,7 +2084,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ma // + (yHix)Qi(xHiDHiDHix)Qi(xHiy) // - (yHix)Qi(xHiDHix)Qi(xHiDHix)Qi(xHiy) void Calc_yPDPDPy( - const gsl_vector *eval, const gsl_matrix *Hi, const gsl_matrix *xHi, + const gsl_vector *eval, const gsl_vector *eps_eval,const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *QixHiDHiy_all_g, const gsl_matrix *QixHiDHiy_all_e, @@ -2034,7 +2106,7 @@ void Calc_yPDPDPy( gsl_vector *xHiDHiDHixQixHiy = gsl_vector_alloc(dc_size); // First part: yHiDHiDHiy. - Calc_yHiDHiDHiy(eval, Hi, Hiy, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, + Calc_yHiDHiDHiy(eval, eps_eval, Hi, Hiy, V_e_temp, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, yPDPDPy_ge); // Second and third parts: @@ -2482,7 +2554,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps double dev1_g, dev1_e, dev2_gg, dev2_ee, dev2_ge; gsl_matrix *Hessian = gsl_matrix_alloc(v_size * 2, v_size * 2); - + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_matrix *xHiDHiy_all_g = gsl_matrix_alloc(dc_size, v_size); gsl_matrix *xHiDHiy_all_e = gsl_matrix_alloc(dc_size, v_size); gsl_matrix *xHiDHix_all_g = gsl_matrix_alloc(dc_size, v_size * dc_size); @@ -2508,14 +2580,14 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps gsl_matrix_alloc(dc_size, v_size * v_size * dc_size); // Calculate xHiDHiy_all, xHiDHix_all and xHiDHixQixHiy_all. - Calc_xHiDHiy_all(eval, eps_eval, xHi, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); - Calc_xHiDHix_all(eval, eps_eval, xHi, xHiDHix_all_g, xHiDHix_all_e); + Calc_xHiDHiy_all(eval, eps_eval, xHi, V_e_temp, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); + Calc_xHiDHix_all(eval, eps_eval, xHi, V_e_temp, xHiDHix_all_g, xHiDHix_all_e); Calc_xHiDHixQixHiy_all(xHiDHix_all_g, xHiDHix_all_e, QixHiy, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e); - Calc_xHiDHiDHiy_all(v_size, eval, eps_eval, Hi, xHi, Hiy, xHiDHiDHiy_all_gg, + Calc_xHiDHiDHiy_all(v_size, eval, eps_eval, Hi, xHi, V_e_temp, Hiy, xHiDHiDHiy_all_gg, xHiDHiDHiy_all_ee, xHiDHiDHiy_all_ge); - Calc_xHiDHiDHix_all(v_size, eval, eps_eval, Hi, xHi, xHiDHiDHix_all_gg, + Calc_xHiDHiDHix_all(v_size, eval, eps_eval, Hi, xHi, V_e_temp, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge); // Calculate QixHiDHiy_all, QixHiDHix_all and QixHiDHixQixHiy_all. @@ -2538,18 +2610,18 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps } v1 = GetIndex(i1, j1, d_size); - Calc_yPDPy(eval, eps_eval, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPy(eval, eps_eval, Hiy, V_e_temp, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, i1, j1, yPDPy_g, yPDPy_e); if (func_name == 'R' || func_name == 'r') { - Calc_tracePD(eval, eps_eval, Qi, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, + Calc_tracePD(eval, eps_eval, Qi, V_e_temp, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, tPD_e); dev1_g = -0.5 * tPD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tPD_e + 0.5 * yPDPy_e; } else { - Calc_traceHiD(eval, eps_eval, Hi, i1, j1, tHiD_g, tHiD_e); + Calc_traceHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, tHiD_g, tHiD_e); dev1_g = -0.5 * tHiD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tHiD_e + 0.5 * yPDPy_e; @@ -2569,7 +2641,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps continue; } - Calc_yPDPDPy(eval, eps_eval, Hi, xHi, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPDPy(eval, eps_eval, Hi, xHi, V_e_temp, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, QixHiDHiy_all_g, QixHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, QixHiDHixQixHiy_all_g, QixHiDHixQixHiy_all_e, xHiDHiDHiy_all_gg, @@ -2579,7 +2651,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps // AI for REML. if (func_name == 'R' || func_name == 'r') { - Calc_tracePDPD(eval, eps_eval, Qi, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, + Calc_tracePDPD(eval, eps_eval, Qi, V_e_temp, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); @@ -2588,7 +2660,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps dev2_ee = 0.5 * tPDPD_ee - yPDPDPy_ee; dev2_ge = 0.5 * tPDPD_ge - yPDPDPy_ge; } else { - Calc_traceHiDHiD(eval, eps_eval, Hi, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, + Calc_traceHiDHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, tHiDHiD_ge); dev2_gg = 0.5 * tHiDHiD_gg - yPDPDPy_gg; @@ -2712,7 +2784,7 @@ void UpdateVgVe(const gsl_matrix *Hessian_inv, const gsl_vector *gradient, } double MphNR(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *Hi_all, gsl_matrix *xHi_all, gsl_matrix *Hiy_all, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, double &crt_c) { @@ -2733,7 +2805,8 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, gsl_matrix *Vg_save = gsl_matrix_alloc(d_size, d_size); gsl_matrix *Ve_save = gsl_matrix_alloc(d_size, d_size); - gsl_matrix *V_temp = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); + gsl_matrix *V_g_temp = gsl_matrix_alloc(d_size, d_size); gsl_matrix *U_temp = gsl_matrix_alloc(d_size, d_size); gsl_vector *D_temp = gsl_vector_alloc(d_size); gsl_vector *xHiy = gsl_vector_alloc(dc_size); @@ -2782,15 +2855,15 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // Check if both Vg and Ve are positive definite. flag_pd = 1; - gsl_matrix_memcpy(V_temp, V_e); - EigenDecomp(V_temp, U_temp, D_temp, 0); + gsl_matrix_memcpy(V_e_temp, V_e); + EigenDecomp(V_e_temp, U_temp, D_temp, 0); for (size_t i = 0; i < d_size; i++) { if (gsl_vector_get(D_temp, i) <= 0) { flag_pd = 0; } } - gsl_matrix_memcpy(V_temp, V_g); - EigenDecomp(V_temp, U_temp, D_temp, 0); + gsl_matrix_memcpy(V_g_temp, V_g); + EigenDecomp(V_g_temp, U_temp, D_temp, 0); for (size_t i = 0; i < d_size; i++) { if (gsl_vector_get(D_temp, i) <= 0) { flag_pd = 0; @@ -2851,7 +2924,8 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, gsl_matrix_free(Vg_save); gsl_matrix_free(Ve_save); - gsl_matrix_free(V_temp); + gsl_matrix_free(V_e_temp); + gsl_matrix_free(V_g_temp); gsl_matrix_free(U_temp); gsl_vector_free(D_temp); gsl_vector_free(xHiy); @@ -3007,8 +3081,8 @@ void MphInitial(const size_t em_iter, const double em_prec, EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); // Calculate Qi and log|Q|. - // double logdet_Q = CalcQi(eval, D_l, X, Qi); - CalcQi(eval, eps_eval, D_l, X, Qi); + // double logdet_Q = CalcQi(eval, D_l, X, V_e_temp, Qi); + CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -3016,15 +3090,17 @@ void MphInitial(const size_t em_iter, const double em_prec, // calculate XHiy for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); - + ve = gsl_matrix_get(V_e_temp, i, i); for (size_t j = 0; j < c_size; j++) { d = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k) / V_e_temp + epsilon = gsl_vector_get(eps_eval, k); dx = gsl_matrix_get(X, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - d += dy * dx / (delta * dl + epsilon); + + epsilon_sc = epsilon / ve; + d += dy * dx / (delta * dl + epsilon_sc); } gsl_vector_set(XHiy, j * d_size + i, d); } @@ -3158,15 +3234,15 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3226,13 +3302,13 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3395,32 +3471,32 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -3431,17 +3507,17 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -3595,18 +3671,18 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); write(eval,"eval4"); - logl_H0 = MphEM('R', em_iter, em_prec, eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3669,13 +3745,13 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3877,33 +3953,33 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -3913,17 +3989,17 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4036,13 +4112,13 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, gsl_matrix_transpose_memcpy(W, UtW); // Initial, EM, NR, and calculate B. - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, W, Y, l_min, l_max, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, W, Y, l_min, l_max, n_region, V_g, V_e, B); - MphEM('R', em_iter, em_prec, eval, W, Y, U_hat, E_hat, OmegaU, OmegaE, + MphEM('R', em_iter, em_prec, eval, eps_eval, W, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - MphNR('R', nr_iter, nr_prec, eval, W, Y, Hi_all, xHi_all, Hiy_all, V_g, + MphNR('R', nr_iter, nr_prec, eval, eps_eval, W, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, W, Y, V_g, V_e, UltVehiY, B, se_B); + MphCalcBeta(eval, eps_eval, W, Y, V_g, V_e, UltVehiY, B, se_B); // Free matrices. gsl_matrix_free(U_hat); @@ -4157,15 +4233,15 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4225,13 +4301,13 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4367,24 +4443,24 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -4393,32 +4469,32 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -4429,17 +4505,17 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4602,16 +4678,16 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4670,13 +4746,13 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4843,24 +4919,24 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -4869,33 +4945,33 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -4905,17 +4981,17 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { From 18e15e3bc96cef0786d17501a73c156dd203e4ce Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Tue, 18 Jul 2023 17:09:40 -0400 Subject: [PATCH 04/37] Fixed parameter names, attempted to integrate residual variance as an option similar to cvt --- src/gemma.cpp | 45 +++++++++++++++++++++++++++++++++------------ src/gemma_io.cpp | 28 ++++++++++++++-------------- src/lmm.cpp | 14 +++++--------- src/mvlmm.cpp | 17 +++++++++-------- src/param.cpp | 24 ++++++++++++------------ 5 files changed, 73 insertions(+), 55 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index 2525075..99da50d 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -336,6 +336,17 @@ void GEMMA::PrintHelp(size_t option) { cout << " format: variable for individual 1" << endl; cout << " variable for individual 2" << endl; cout << " ..." << endl; + cout << " missing value: NA" << endl; + cout << " -residvar [filename] " + << " residual variance file contains a column of positive values to be used " + << "directly as for the residual variance---each value corresponds to an " + << "individual, in which each value is the empirical residual variance based" + << "on a trait value calculated from multiple replicates for this individual" + << "(similar in format to phenotype file)" + << endl; + cout << " format: variable for individual 1" << endl; + cout << " variable for individual 2" << endl; + cout << " ..." << endl; cout << " missing value: NA" << endl; cout << " -k [filename] " << " specify input kinship/relatedness matrix file name" << endl; @@ -824,6 +835,14 @@ void GEMMA::Assign(int argc, char **argv, PARAM &cPar) { str.clear(); str.assign(argv[i]); cPar.file_weight = str; + } else if (strcmp(argv[i], "-residvar") == 0) { + if (argv[i + 1] == NULL || argv[i + 1][0] == '-') { + continue; + } + ++i; + str.clear(); + str.assign(argv[i]); + cPar.file_resid = str; } else if (strcmp(argv[i], "-wsnp") == 0) { if (argv[i + 1] == NULL || argv[i + 1][0] == '-') { continue; @@ -2611,6 +2630,8 @@ void GEMMA::BatchRun(PARAM &cPar) { } } } + // Need some way of reading the residual variance file and then + // assigning it to what would have been the ..+ 1 part of the computation // eigen-decomposition and calculate trace_G - main track cout << "Start Eigen-Decomposition..." << endl; @@ -2795,11 +2816,11 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { // PLINK analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzePlink(U, eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlink(U, eval, eps_eval, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzePlinkGXE(U, eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlinkGXE(U, eval, eps_eval, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2807,10 +2828,10 @@ void GEMMA::BatchRun(PARAM &cPar) { // BIMBAM analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzeBimbam(U, eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbam(U, eval, eps_eval, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzeBimbamGXE(U, eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbamGXE(U, eval, eps_eval, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2827,15 +2848,15 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzePlink(U, eval, UtW, UtY); + cMvlmm.AnalyzePlink(U, eval, eps_eval, UtW, UtY); } else { - cMvlmm.AnalyzePlinkGXE(U, eval, UtW, UtY, env); + cMvlmm.AnalyzePlinkGXE(U, eval, eps_eval, UtW, UtY, env); } } else { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzeBimbam(U, eval, UtW, UtY); + cMvlmm.AnalyzeBimbam(U, eval, eps_eval, UtW, UtY); } else { - cMvlmm.AnalyzeBimbamGXE(U, eval, UtW, UtY, env); + cMvlmm.AnalyzeBimbamGXE(U, eval, eps_eval, UtW, UtY, env); } } @@ -2924,9 +2945,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); @@ -3034,9 +3055,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 3e27dd6..3c9b9d4 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -506,14 +506,14 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, return true; } -bool ReadFile_res(const string &file_res, vector &indicator_res, - vector> &res_var, size_t &n_res) { +bool ReadFile_resid(const string &file_resid, vector &indicator_resid, + vector> &residvar, size_t &n_resid) { debug_msg("entered"); - indicator_res.clear(); + indicator_resid.clear(); - ifstream infile(file_res.c_str(), ifstream::in); + ifstream infile(file_resid.c_str(), ifstream::in); if (!infile) { - cout << "error! fail to open residual variance file: " << file_res << endl; + cout << "error! fail to open residual variance file: " << file_resid << endl; return false; } @@ -539,27 +539,27 @@ bool ReadFile_res(const string &file_res, vector &indicator_res, ch_ptr = strtok(NULL, " ,\t"); } if (flag_na == 0) { - indicator_res.push_back(1); + indicator_resid.push_back(1); } else { - indicator_res.push_back(0); + indicator_resid.push_back(0); } - res_var.push_back(v_d); + residvar.push_back(v_d); } - if (indicator_res.empty()) { - n_res = 0; + if (indicator_resid.empty()) { + n_resid = 0; } else { flag_na = 0; - for (vector::size_type i = 0; i < indicator_res.size(); ++i) { - if (indicator_res[i] == 0) { + for (vector::size_type i = 0; i < indicator_resid.size(); ++i) { + if (indicator_resid[i] == 0) { continue; } if (flag_na == 0) { flag_na = 1; - n_res = res_var[i].size(); + n_resid = residvar[i].size(); } - if (flag_na != 0 && n_res != res_var[i].size()) { + if (flag_na != 0 && n_resid != residvar[i].size()) { cout << "error! number of residuals in row " << i << " do not match other rows." << endl; return false; diff --git a/src/lmm.cpp b/src/lmm.cpp index 091b3b4..93335aa 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -2,7 +2,7 @@ Genome-wide Efficient Mixed Model Association (GEMMA) Copyright © 2011-2017, Xiang Zhou Copyright © 2017, Peter Carbonetto - Copyright © 2017-2022 Pjotr Prins + Copyright © 2017-2018 Pjotr Prins This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -49,8 +49,6 @@ #include "lmm.h" #include "mathfunc.h" -#define P_YY_MIN 0.00000001 - using namespace std; void LMM::CopyFromParam(PARAM &cPar) { @@ -524,8 +522,7 @@ double LogL_f(double l, void *params) { index_yy = GetabIndex(n_cvt + 2, n_cvt + 2, n_cvt); double P_yy = gsl_matrix_safe_get(Pab, nc_total, index_yy); - if (P_yy >= 0.0 && (P_yy < P_YY_MIN)) P_yy = P_YY_MIN; // control potential round-off - + if (P_yy == 0.0) P_yy = 0.00000001; // control potential round-off if (is_check_mode() || is_debug_mode()) { // cerr << "P_yy is" << P_yy << endl; assert(!is_nan(P_yy)); @@ -851,7 +848,7 @@ double LogRL_f(double l, void *params) { index_ww = GetabIndex(n_cvt + 2, n_cvt + 2, n_cvt); double P_yy = gsl_matrix_safe_get(Pab, nc_total, index_ww); // P_yy is positive and may get zeroed printf("P_yy=%f",P_yy); - if (P_yy >= 0.0 && (P_yy < P_YY_MIN)) P_yy = P_YY_MIN; // control potential round-off + if (P_yy == 0.0) P_yy = 0.00000001; // control potential round-off double c = 0.5 * df * (safe_log(df) - safe_log(2 * M_PI) - 1.0); f = c - 0.5 * logdet_h - 0.5 * logdet_hiw - 0.5 * df * safe_log(P_yy); @@ -2027,14 +2024,13 @@ void CalcLambda(const char func_name, FUNC_PARAM ¶ms, const double l_min, for (vector::size_type i = 0; i < lambda_lh.size(); ++i) { lambda_l = lambda_lh[i].first; lambda_h = lambda_lh[i].second; - // printf("%f,%f\n",lambda_l,lambda_h); - auto handler = gsl_set_error_handler_off(); gsl_root_fsolver_set((gsl_root_fsolver*)s_f, &F, lambda_l, lambda_h); int status = GSL_FAILURE; uint iter = 0; const auto max_iter = 100; + auto handler = gsl_set_error_handler_off(); do { iter++; status = gsl_root_fsolver_iterate((gsl_root_fsolver*)s_f); @@ -2205,7 +2201,7 @@ void CalcPve(const gsl_vector *eval, const gsl_matrix *UtW, // Obtain REML estimate for Vg and Ve using lambda_remle. // Obtain beta and se(beta) for coefficients. // ab is not used when e_mode==0. -void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, +void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_vector *Uty, const double lambda, double &vg, double &ve, gsl_vector *beta, gsl_vector *se_beta) { size_t n_cvt = UtW->size2, ni_test = UtW->size1; diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index 35142f3..6b5252a 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -86,6 +86,7 @@ void MVLMM::CopyFromParam(PARAM &cPar) { indicator_idv = cPar.indicator_idv; indicator_snp = cPar.indicator_snp; snpInfo = cPar.snpInfo; + file_resid - cPar.file_resid; // not entirely sure if this is the right place for this return; } @@ -3074,15 +3075,15 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_vector_set_zero(XHiy); - double dl, d, delta, epsilon, dx, dy; + double dl, d, delta, epsilon, epsilon_sc, dx, dy; // Eigen decomposition and calculate log|Ve|. // double logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); - EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); + tie(V_e_temp, logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, X, V_e_temp, Qi); - CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); + CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi) // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -3151,7 +3152,7 @@ double PCRT(const size_t mode, const size_t d_size, const double p_value, return p_crt; } -void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, +void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); igzstream infile(file_geno.c_str(), igzstream::in); @@ -3589,7 +3590,7 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, return; } -void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, +void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); string file_bed = file_bfile + ".bed"; @@ -4072,7 +4073,7 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, // Calculate Vg, Ve, B, se(B) in the null mvLMM model. // Both B and se_B are d by c matrices. -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, @@ -4141,7 +4142,7 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, return; } -void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, +void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); @@ -4587,7 +4588,7 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, return; } -void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, +void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); diff --git a/src/param.cpp b/src/param.cpp index 3e0ab30..ebd2848 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -259,8 +259,8 @@ void PARAM::ReadFiles(void) { error = true; } } - if (!file_res.empty()) { - if (ReadFile_column(file_res, indicator_res, res_var, 1) == false) { + if (!file_resid.empty()) { + if (ReadFile_column(file_resid, indicator_resid, residvar, 1) == false) { error = true; } } @@ -960,7 +960,7 @@ void PARAM::CheckParam(void) { enforce_fexists(file_weight, "open file"); enforce_fexists(file_epm, "open file"); enforce_fexists(file_ebv, "open file"); - enforce_fexists(file_res, "open file"); + enforce_fexists(file_resid, "open file"); enforce_fexists(file_read, "open file"); // Check if files are compatible with analysis mode. @@ -1042,8 +1042,8 @@ void PARAM::CheckData(void) { return; } - if ((indicator_res).size() != 0 && - (indicator_res).size() != (indicator_idv).size()) { + if ((indicator_resid).size() != 0 && + (indicator_resid).size() != (indicator_idv).size()) { error = true; cout << "error! number of rows in the residual variance file do not match " << "the number of individuals. " << endl; @@ -1099,8 +1099,8 @@ void PARAM::CheckData(void) { } } - if (indicator_res.size() != 0) { - if (indicator_res[i] == 0) { + if (indicator_resid.size() != 0) { + if (indicator_resid[i] == 0) { continue; } } @@ -2063,9 +2063,9 @@ void PARAM::ProcessCvtPhen() { } // Remove individuals with missing residual variance. - if ((indicator_res).size() != 0) { + if ((indicator_resid).size() != 0) { for (vector::size_type i = 0; i < (indicator_idv).size(); ++i) { - indicator_idv[i] *= indicator_res[i]; + indicator_idv[i] *= indicator_resid[i]; } } @@ -2184,14 +2184,14 @@ void PARAM::CopyWeight(gsl_vector *w) { return; } -void PARAM::CopyResid(gsl_vector *res) { +void PARAM::CopyResid(gsl_vector *resid) { size_t ci_test = 0; for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { - if (indicator_idv[i] == 0 || indicator_res[i] == 0) { + if (indicator_idv[i] == 0 || indicator_resid[i] == 0) { continue; } - gsl_vector_set(res, ci_test, res_var[i]); + gsl_vector_set(resid, ci_test, residvar[i]); ci_test++; } From 72f5a244f9bd134c7f100d7808320b4ab46eefe3 Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Fri, 28 Jul 2023 11:55:47 -0400 Subject: [PATCH 05/37] More bug fixes --- src/gemma_io.cpp | 73 ++++++++++++++++++++++++++++++++++++++---------- src/gemma_io.h | 2 ++ src/mvlmm.cpp | 12 ++++---- src/mvlmm.h | 11 ++++---- src/param.cpp | 34 ++++++++++++---------- src/param.h | 11 ++++++++ 6 files changed, 103 insertions(+), 40 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 3c9b9d4..848ecb5 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -506,14 +506,14 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, return true; } -bool ReadFile_resid(const string &file_resid, vector &indicator_resid, - vector> &residvar, size_t &n_resid) { +bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, + vector> &eps_eval, size_t &n_residvar) { debug_msg("entered"); - indicator_resid.clear(); + indicator_residvar.clear(); - ifstream infile(file_resid.c_str(), ifstream::in); + ifstream infile(file_residvar.c_str(), ifstream::in); if (!infile) { - cout << "error! fail to open residual variance file: " << file_resid << endl; + cout << "error! fail to open residual variance file: " << file_residvar << endl; return false; } @@ -539,27 +539,27 @@ bool ReadFile_resid(const string &file_resid, vector &indicator_resid, ch_ptr = strtok(NULL, " ,\t"); } if (flag_na == 0) { - indicator_resid.push_back(1); + indicator_residvar.push_back(1); } else { - indicator_resid.push_back(0); + indicator_residvar.push_back(0); } - residvar.push_back(v_d); + eps_eval.push_back(v_d); } - if (indicator_resid.empty()) { - n_resid = 0; + if (indicator_residvar.empty()) { + n_residvar = 0; } else { flag_na = 0; - for (vector::size_type i = 0; i < indicator_resid.size(); ++i) { - if (indicator_resid[i] == 0) { + for (vector::size_type i = 0; i < indicator_residvar.size(); ++i) { + if (indicator_residvar[i] == 0) { continue; } if (flag_na == 0) { flag_na = 1; - n_resid = residvar[i].size(); + n_residvar = eps_eval[i].size(); } - if (flag_na != 0 && n_resid != residvar[i].size()) { + if (flag_na != 0 && n_residvar != eps_eval[i].size()) { cout << "error! number of residuals in row " << i << " do not match other rows." << endl; return false; @@ -1474,6 +1474,51 @@ void ReadFile_eigenD(const string &file_kd, bool &error, gsl_vector *eval) { return; } +void ReadFile_residvar(const string &file_residvar, bool &error, gsl_vector *eps_eval) { + debug_msg("entered"); + igzstream infile(file_residvar.c_str(), igzstream::in); + if (!infile) { + cout << "error! fail to open the residual variance file: " << file_residvar << endl; + error = true; + return; + } + + size_t n_row = eps_eval->size, i_row = 0; + + gsl_vector_set_zero(eps_eval); //change this so that eps_eval = V_e somehow + + string line; + char *ch_ptr; + double d; + + while (getline(infile, line)) { + if (i_row == n_row) { + cout << "error! number of rows in the residual variance file is larger " + << "than expected." << endl; + error = true; + } + + ch_ptr = strtok_safe2((char *)line.c_str(), " ,\t",file_residvar.c_str()); + d = atof(ch_ptr); + + ch_ptr = strtok(NULL, " ,\t"); + if (ch_ptr != NULL) { + cout << "error! number of columns in the residual variance file is larger " + << "than expected, for row = " << i_row << endl; + error = true; + } + + gsl_vector_set(eps_eval, i_row, d); + + i_row++; + } + + infile.close(); + infile.clear(); + + return; +} + // Read bimbam mean genotype file and calculate kinship matrix. bool BimbamKin(const string file_geno, const set ksnps, vector &indicator_snp, const int k_mode, diff --git a/src/gemma_io.h b/src/gemma_io.h index dd1d5c0..30817e1 100644 --- a/src/gemma_io.h +++ b/src/gemma_io.h @@ -86,6 +86,8 @@ void ReadFile_mk(const string &file_mk, vector &indicator_idv, gsl_matrix *G); void ReadFile_eigenU(const string &file_u, bool &error, gsl_matrix *U); void ReadFile_eigenD(const string &file_d, bool &error, gsl_vector *eval); +bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, + vector> &eps_eval, size_t &n_residvar); bool BimbamKin(const string file_geno, const set ksnps, vector &indicator_snp, const int k_mode, diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index 6b5252a..ca5466a 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -80,13 +80,13 @@ void MVLMM::CopyFromParam(PARAM &cPar) { ni_test = cPar.ni_test; ns_test = cPar.ns_test; n_cvt = cPar.n_cvt; + n_residvar = cPar.n_residvar; n_ph = cPar.n_ph; indicator_idv = cPar.indicator_idv; indicator_snp = cPar.indicator_snp; snpInfo = cPar.snpInfo; - file_resid - cPar.file_resid; // not entirely sure if this is the right place for this return; } @@ -2967,9 +2967,9 @@ void MphInitial(const size_t em_iter, const double em_prec, for (size_t i = 0; i < d_size; i++) { gsl_vector_const_view Y_row = gsl_matrix_const_row(Y, i); - CalcLambda('R', eval, eps_eval, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, + CalcLambda('R', eval, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, logl); - CalcLmmVgVeBeta(eval, eps_eval, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, + CalcLmmVgVeBeta(eval, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, se_beta_temp); gsl_matrix_set(V_g, i, i, vg); @@ -3065,7 +3065,7 @@ void MphInitial(const size_t em_iter, const double em_prec, // Calculate B hat using GSL estimate. gsl_matrix *UltVehiY = gsl_matrix_alloc(d_size, n_size); - + gsl_matrix *V_e_temp = gsl_matrix_alloc(d_size, d_size); gsl_vector *D_l = gsl_vector_alloc(d_size); gsl_matrix *UltVeh = gsl_matrix_alloc(d_size, d_size); gsl_matrix *UltVehi = gsl_matrix_alloc(d_size, d_size); @@ -3075,7 +3075,7 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_vector_set_zero(XHiy); - double dl, d, delta, epsilon, epsilon_sc, dx, dy; + double logdet_Ve, dl, d, delta, epsilon, epsilon_sc, dx, dy; // Eigen decomposition and calculate log|Ve|. // double logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); @@ -3083,7 +3083,7 @@ void MphInitial(const size_t em_iter, const double em_prec, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, X, V_e_temp, Qi); - CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi) + CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); diff --git a/src/mvlmm.h b/src/mvlmm.h index b92bd5e..b7d37c1 100644 --- a/src/mvlmm.h +++ b/src/mvlmm.h @@ -58,6 +58,7 @@ class MVLMM { size_t ni_total, ni_test; // Number of individuals. size_t ns_total, ns_test; // Number of SNPs. size_t n_cvt; + size_t n_residvar; size_t n_ph; double time_UtX; // Time spent on optimization iterations. double time_opt; // Time spent on optimization iterations. @@ -78,22 +79,22 @@ class MVLMM { // Main functions void CopyFromParam(PARAM &cPar); void CopyToParam(PARAM &cPar); - void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, + void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, + void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY); void Analyzebgen(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, + void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); - void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, + void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); void WriteFiles(); }; -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, diff --git a/src/param.cpp b/src/param.cpp index ebd2848..2344cc4 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -249,6 +249,13 @@ void PARAM::ReadFiles(void) { } trim_individuals(indicator_cvt, ni_max); + // Read residual variance files before the genotype files. + if (!file_residvar.empty()) { + if (ReadFile_column(file_residvar, indicator_residvar, residvar, 1) == false) { + error = true; + } + } + if (!file_gxe.empty()) { if (ReadFile_column(file_gxe, indicator_gxe, gxe, 1) == false) { error = true; @@ -259,11 +266,7 @@ void PARAM::ReadFiles(void) { error = true; } } - if (!file_resid.empty()) { - if (ReadFile_column(file_resid, indicator_resid, residvar, 1) == false) { - error = true; - } - } + trim_individuals(indicator_idv, ni_max); @@ -960,7 +963,7 @@ void PARAM::CheckParam(void) { enforce_fexists(file_weight, "open file"); enforce_fexists(file_epm, "open file"); enforce_fexists(file_ebv, "open file"); - enforce_fexists(file_resid, "open file"); + enforce_fexists(file_residvar, "open file"); enforce_fexists(file_read, "open file"); // Check if files are compatible with analysis mode. @@ -1042,8 +1045,8 @@ void PARAM::CheckData(void) { return; } - if ((indicator_resid).size() != 0 && - (indicator_resid).size() != (indicator_idv).size()) { + if ((indicator_residvar).size() != 0 && + (indicator_residvar).size() != (indicator_idv).size()) { error = true; cout << "error! number of rows in the residual variance file do not match " << "the number of individuals. " << endl; @@ -1099,8 +1102,8 @@ void PARAM::CheckData(void) { } } - if (indicator_resid.size() != 0) { - if (indicator_resid[i] == 0) { + if (indicator_residvar.size() != 0) { + if (indicator_residvar[i] == 0) { continue; } } @@ -1150,6 +1153,7 @@ void PARAM::CheckData(void) { cout << "## number of analyzed individuals = " << ni_test << endl; } cout << "## number of covariates = " << n_cvt << endl; + cout << "## number of residual variances" << n_residvar << endl; cout << "## number of phenotypes = " << n_ph << endl; if (a_mode == 43) { cout << "## number of observed data = " << np_obs << endl; @@ -2063,9 +2067,9 @@ void PARAM::ProcessCvtPhen() { } // Remove individuals with missing residual variance. - if ((indicator_resid).size() != 0) { + if ((indicator_residvar).size() != 0) { for (vector::size_type i = 0; i < (indicator_idv).size(); ++i) { - indicator_idv[i] *= indicator_resid[i]; + indicator_idv[i] *= indicator_residvar[i]; } } @@ -2184,14 +2188,14 @@ void PARAM::CopyWeight(gsl_vector *w) { return; } -void PARAM::CopyResid(gsl_vector *resid) { +void PARAM::CopyResid(gsl_vector *eps_eval) { size_t ci_test = 0; for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { - if (indicator_idv[i] == 0 || indicator_resid[i] == 0) { + if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { continue; } - gsl_vector_set(resid, ci_test, residvar[i]); + gsl_vector_set(eps_eval, ci_test, residvar[i]); ci_test++; } diff --git a/src/param.h b/src/param.h index e747182..474379c 100644 --- a/src/param.h +++ b/src/param.h @@ -136,6 +136,7 @@ class PARAM { string file_anno; // Optional. string file_gxe; // Optional. string file_cvt; // Optional. + string file_residvar; // Optional string file_cat, file_mcat; string file_catc, file_mcatc; string file_var; @@ -218,6 +219,7 @@ class PARAM { HYPBSLMM cHyp_initial; + // VARCOV-related parameters. double window_cm; size_t window_bp; @@ -243,6 +245,7 @@ class PARAM { size_t ni_control, ni_case; // Number of controls and number of cases. size_t ni_subsample; // Number of subsampled individuals. size_t n_cvt; // Number of covariates. + size_t n_residvar; // Number of residual variances. size_t n_cat; // Number of continuous categories. size_t n_ph; // Number of phenotypes. size_t n_vc; // Number of variance components @@ -267,6 +270,9 @@ class PARAM { // Vector recording all covariates (NA replaced with -9). vector> cvt; +// Vector recording all residual variances (NA replaced with -9). + vector residvar; + // Vector recording all covariates (NA replaced with -9). vector gxe; @@ -294,6 +300,10 @@ class PARAM { // analysis. vector indicator_cvt; + // Indicator for residuals: 0 missing, 1 available for + // analysis. + vector indicator_residvar; + // Indicator for gxe: 0 missing, 1 available for analysis. vector indicator_gxe; @@ -340,6 +350,7 @@ class PARAM { const bool calc_K); void CheckCvt(); void CopyCvt(gsl_matrix *W); + void CopyResid(gsl_vector *eps_eval); void CopyA(size_t flag, gsl_matrix *A); void CopyGxe(gsl_vector *gxe); void CopyWeight(gsl_vector *w); From f76326b78770dec2e9cc3407a24e30fe9ee76cbd Mon Sep 17 00:00:00 2001 From: Jameson Blount Date: Fri, 28 Jul 2023 13:25:35 -0400 Subject: [PATCH 06/37] Added PARAM 'CheckResidvar' so that if no vector is supplied, it is replaced in the math with the null Ve --- src/param.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/param.cpp b/src/param.cpp index 2344cc4..a276e4e 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -1974,6 +1974,45 @@ void PARAM::WriteVector(const gsl_vector *vector_D, const string suffix) { return; } +void PARAM::CheckResidvar() { + if (indicator_residvar.size() == 0) { + return; + } + + size_t ci_test = 0; + + gsl_vector *eps_eval = gsl_vector_alloc(n_residvar); + + for (size_t i = 0; i < n_residvar; ++i) { + gsl_vector_set(eps_eval, i, (residvar)[i]); + } + + size_t flag_ipt = 0; + double v_min, v_max; + set set_remove; + + // If no residual variance is specified, eps_eval = V_e. + if (n_residvar == set_remove.size()) { + indicator_residvar.clear(); + n_residvar = 1; + } else if (flag_ipt == 0) { + info_msg("no residual variances are found in the residvar file: a column of V_e is added"); + for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { + if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { + continue; + } + gsl_vector_set(eps_eval, i, Ve_remle_null[i]); + } + + n_residvar++; + } else { + } + + gsl_vector_free(eps_eval); + + return; +} + void PARAM::CheckCvt() { if (indicator_cvt.size() == 0) { return; From 58e370f252c8b46bb0d6c4ed4bba84ab261fbb29 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 7 Oct 2024 14:42:00 -0400 Subject: [PATCH 07/37] Update gemma.cpp Small formatting change to -residvar --- src/gemma.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index 99da50d..eaffd39 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -337,7 +337,7 @@ void GEMMA::PrintHelp(size_t option) { cout << " variable for individual 2" << endl; cout << " ..." << endl; cout << " missing value: NA" << endl; - cout << " -residvar [filename] " + cout << " -residvar [filename] " << " residual variance file contains a column of positive values to be used " << "directly as for the residual variance---each value corresponds to an " << "individual, in which each value is the empirical residual variance based" From 924daa5ffed3ddb907963b833bc8a234ba4e8f66 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:01:04 -0400 Subject: [PATCH 08/37] Update mvlmm.cpp Updated resid_var math to CalcQi --- src/mvlmm.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index ca5466a..a255e6f 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -283,21 +283,32 @@ tuple EigenProc(const gsl_matrix *V_g, const gsl_matrix *V } // Qi=(\sum_{k=1}^n x_kx_k^T\otimes(delta_k*Dl+epsilon_k)^{-1} )^{-1}. -double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, +double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *V_e_temp, gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; size_t c_size = dc_size / d_size; - double delta, ve, epsilon, epsilon_sc, dl, d1, d2, d, logdet_Q; + double delta, ve, epsilon, dl, d1, d2, d, logdet_Q; gsl_matrix *Q = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix_set_zero(Q); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + for (size_t i = 0; i < c_size; i++) { for (size_t j = 0; j < c_size; j++) { for (size_t l = 0; l < d_size; l++) { dl = gsl_vector_get(D_l, l); ve = gsl_matrix_get(V_e_temp, l, l); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + + double sigmasq_value = gsl_matrix_get(sigmasq, 0, 0); // Adjust if sigmasq has different structure + double scalar = sigmasq_value / ve; + gsl_matrix_scale(eps_eval, scalar); if (j < i) { d = gsl_matrix_get(Q, j * d_size + l, i * d_size + l); @@ -309,8 +320,7 @@ double CalcQi(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect delta = gsl_vector_get(eval, k); epsilon = gsl_vector_get(eps_eval, k); - epsilon_sc = epsilon / ve; - d += d1 * d2 / (dl * delta + epsilon_sc); // @@ + d += d1 * d2 / (dl * delta + epsilon); // @@ } } From db723279526c7aba11e46fd7b7971fbdcc47385f Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:47:46 -0400 Subject: [PATCH 09/37] Update mvlmm.cpp Updated most functions except MphEM and remaining P-val functions --- src/mvlmm.cpp | 123 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index a255e6f..a14a34d 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -346,28 +346,45 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr // xHiy=\sum_{k=1}^n x_k\otimes ((delta_k*Dl+epsilon_k)^{-1}Ul^TVe^{-1/2}y. // // FIXME: mvlmm spends a massive amount of time here -void CalcXHiY(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, +void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, gsl_vector *xHiy) { // debug_msg("enter"); - size_t n_size = eval->size, c_size = X->size1, d_size = D_l->size; + size_t n_size = eval->size, + c_size = X->size1, + d_size = D_l->size; // gsl_vector_set_zero(xHiy); + std::vector xHiy(d_size * c_size, 0.0); // Initialize output vector xHiy - double x, delta, ve, epsilon, epsilon_sc, dl, y, d; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double x, delta, ve, epsilon, dl, y, d; + for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); + + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + for (size_t j = 0; j < c_size; j++) { d = 0.0; for (size_t k = 0; k < n_size; k++) { x = gsl_matrix_get(X, j, k); y = gsl_matrix_get(UltVehiY, i, k); delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + epsilon = gsl_vector_get(Sigma, k); epsilon_sc = epsilon / ve; - d += x * y / (delta * dl + epsilon_sc); + d += x * y / (delta * dl + epsilon); } gsl_vector_set(xHiy, j * d_size + i, d); } @@ -379,11 +396,18 @@ void CalcXHiY(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vect // OmegaU=D_l/(delta Dl+epsilon)^{-1} // OmegaE=delta D_l/(delta Dl+epsilon)^{-1} -void CalcOmega(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *D_l, const gsl_matrix *V_e_temp, +void CalcOmega(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *V_e_temp, gsl_matrix *OmegaU, gsl_matrix *OmegaE) { - size_t n_size = eval->size, d_size = D_l->size; + size_t n_size = eval->size, + d_size = D_l->size; double delta, ve, epsilon, epsilon_sc, dl, d_u, d_e; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k);; epsilon = gsl_vector_get(eps_eval, k); @@ -392,8 +416,17 @@ void CalcOmega(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vec dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - epsilon_sc = epsilon / ve; - d_u = dl / (delta * dl + epsilon_sc); // @@ + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + // Get epsilon from Sigma + epsilon = gsl_matrix_get(Sigma, k, k); + + + d_u = dl / (delta * dl + epsilon); // @@ d_e = delta * d_u; gsl_matrix_set(OmegaU, i, k, d_u); @@ -463,7 +496,7 @@ void UpdateRL_B(const gsl_vector *xHiy, const gsl_matrix *Qi, return; } -void UpdateV(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *U, const gsl_matrix *E, +void UpdateV(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *U, const gsl_matrix *E, const gsl_matrix *Sigma_uu, const gsl_matrix *Sigma_ee, const gsl_matrix *V_e_temp, gsl_matrix *V_g, gsl_matrix *V_e) { size_t n_size = eval->size, d_size = U->size1; @@ -471,23 +504,36 @@ void UpdateV(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matri gsl_matrix_set_zero(V_g); gsl_matrix_set_zero(V_e); - double delta, ve, epsilon, epsilon_sc; + double delta, ve; - // Calculate the first part: UD^{-1}U^T and EE^T. + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + // Calculate the first part: UD^{-1}U^T and EE^T. for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + if (delta == 0) { continue; } - epsilon_sc = epsilon / ve; + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + double epsilon = gsl_matrix_get(Sigma, k, k); + gsl_vector_const_view U_col = gsl_matrix_const_column(U, k); gsl_vector_const_view E_col = gsl_matrix_const_column(E, k); gsl_blas_dsyr(CblasUpper, 1.0 / delta, &U_col.vector, V_g); - gsl_blas_dsyr(CblasUpper, 1.0 / epsilon_sc, &E_col.vector, V_e); + gsl_blas_dsyr(CblasUpper, 1.0 / epsilon, &E_col.vector, V_e); } } @@ -511,8 +557,8 @@ void UpdateV(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matri return; } -void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *eps_eval, - const gsl_vector *D_l, const gsl_matrix *X, +void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *eval_vec, + const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *OmegaU, const gsl_matrix *OmegaE, const gsl_matrix *UltVeh, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, gsl_matrix *Sigma_uu, gsl_matrix *Sigma_ee) { @@ -523,8 +569,10 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e return; } - size_t n_size = eval->size, c_size = X->size1; - size_t d_size = D_l->size, dc_size = Qi->size1; + size_t n_size = eval->size, + c_size = X->size1; + size_t d_size = D_l->size, + dc_size = Qi->size1; gsl_matrix_set_zero(Sigma_uu); gsl_matrix_set_zero(Sigma_ee); @@ -552,18 +600,28 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e gsl_matrix_set_zero(M_u); gsl_matrix_set_zero(M_e); + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); + + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_matrix_scale(Sigma, sigmasq / ve); + + double epsilon = gsl_matrix_get(Sigma, k, k); + for (size_t j = 0; j < c_size; j++) { x = gsl_matrix_get(X, j, k); epsilon_sc = epsilon / ve; - d = x / (delta * dl + epsilon_sc); + d = x / (delta * dl + epsilon); gsl_matrix_set(M_e, j * d_size + i, i, d); gsl_matrix_set(M_u, j * d_size + i, i, d * dl); } @@ -595,23 +653,36 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e // 'R' for restricted likelihood and 'L' for likelihood. // 'R' update B and 'L' don't. // only calculate -0.5*\sum_{k=1}^n|H_k|-0.5yPxy. -double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector *xHiy, +double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_vector *xHiy, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, const gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; double logl = 0.0, delta, ve, epsilon, epsilon_sc, dl, y, d; + // Create temporary matrix for Sigma + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); // Calculate yHiy+log|H_k|. for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + for (size_t i = 0; i < d_size; i++) { y = gsl_matrix_get(UltVehiY, i, k); dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - epsilon_sc = epsilon / ve; - d = delta * dl + epsilon_sc; + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_matrix_scale(Sigma, sigmasq / ve); + + double epsilon = gsl_matrix_get(Sigma, k, k); + + // Calculate d = delta * dl + epsilon + double d = delta * dl + epsilon; logl += y * y / d + safe_log(d); } @@ -634,7 +705,7 @@ double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl // dxd matrix, V_e is a dxd matrix, eval is a size n vector //'R' for restricted likelihood and 'L' for likelihood. double MphEM(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *U_hat, gsl_matrix *E_hat, gsl_matrix *OmegaU, gsl_matrix *OmegaE, gsl_matrix *UltVehiY, gsl_matrix *UltVehiBX, gsl_matrix *UltVehiU, gsl_matrix *UltVehiE, gsl_matrix *V_g, From 363ec00b0da8941706b4f4b12f9b887581b25e9d Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:23:50 -0400 Subject: [PATCH 10/37] Update mvlmm.cpp Continued to make appropriate math changes to MphCalcSigma, UpdateV, MphCalcLogL, MphEM, MphCalcP, MphCalcBeta, and other functions. --- src/mvlmm.cpp | 209 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 136 insertions(+), 73 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index a14a34d..ccfd222 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -577,7 +577,7 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e gsl_matrix_set_zero(Sigma_uu); gsl_matrix_set_zero(Sigma_ee); - double delta, ve, epsilon, epsilon_sc, dl, x, d; + double delta, ve, epsilon, dl, x, d; // Calculate the first diagonal term. gsl_vector_view Suu_diag = gsl_matrix_diagonal(Sigma_uu); @@ -803,14 +803,14 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, for (size_t t = 0; t < max_iter; t++) { tie(V_e_temp, logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); - logdet_Q = CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); + logdet_Q = CalcQi(eval, eval_vec, sigmasq, D_l, X, V_e_temp, Qi); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); - CalcXHiY(eval, eps_eval, D_l, X, UltVehiY, V_e_temp, xHiy); + CalcXHiY(eval, eval_vec, sigmasq, D_l, X, UltVehiY, V_e_temp, xHiy); // Calculate log likelihood/restricted likelihood value, and // terminate if change is small. - logl_new = logl_const + MphCalcLogL(eval, eps_eval, xHiy, D_l, UltVehiY, V_e_temp, Qi) - + logl_new = logl_const + MphCalcLogL(eval, eval_vec, xHiy, sigmasq, D_l, UltVehiY, V_e_temp, Qi) - 0.5 * (double)n_size * logdet_Ve; if (func_name == 'R' || func_name == 'r') { logl_new += -0.5 * (logdet_Q - (double)c_size * logdet_Ve); @@ -820,7 +820,7 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, } logl_old = logl_new; - CalcOmega(eval, eps_eval, D_l, V_e_temp, OmegaU, OmegaE); + CalcOmega(eval, eval_vec, sigmasq, D_l, V_e_temp, OmegaU, OmegaE); // Update UltVehiB, UltVehiU. if (func_name == 'R' || func_name == 'r') { @@ -852,11 +852,11 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, UltVeh, UltVehiB, 0.0, B); // Calculate Sigma_uu and Sigma_ee. - CalcSigma(func_name, eval, eps_eval, D_l, X, OmegaU, OmegaE, UltVeh, Qi, V_e_temp, Sigma_uu, + CalcSigma(func_name, eval, eval_vec, sigmasq, D_l, X, OmegaU, OmegaE, UltVeh, Qi, V_e_temp, Sigma_uu, Sigma_ee); // Update V_g and V_e. - UpdateV(eval, eps_eval, U_hat, E_hat, Sigma_uu, Sigma_ee, V_e_temp, V_g, V_e); + UpdateV(eval, eval_vec, sigmasq, U_hat, E_hat, Sigma_uu, Sigma_ee, V_e_temp, V_g, V_e); // print statements //print iteration number: cout<< t<size; size_t d_size = V_e_temp->size1; - double delta, ve, epsilon, epsilon_sc, d1, d2; + double delta, ve, epsilon, d1, d2; + + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + epsilon = gsl_matrix_get(Sigma,k, k); d1 = gsl_matrix_get(Hiy, i, k); d2 = gsl_matrix_get(Hiy, j, k); - epsilon_sc = epsilon / ve; - if (i == j) { yHiDHiy_g += delta * d1 * d2; - yHiDHiy_e += epsilon_sc * d1 * d2; + yHiDHiy_e += epsilon * d1 * d2; } else { yHiDHiy_g += delta * d1 * d2 * 2.0; - yHiDHiy_e += epsilon_sc * d1 * d2 * 2.0; + yHiDHiy_e += epsilon * d1 * d2 * 2.0; } } } @@ -1350,7 +1391,7 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_xHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, +void Calc_xHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigma, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i, const size_t j, gsl_vector *xHiDHiy_g, gsl_vector *xHiDHiy_e) { gsl_vector_set_zero(xHiDHiy_g); @@ -1358,36 +1399,47 @@ void Calc_xHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ size_t n_size = eval->size, d_size = Hiy->size1; - double delta, ve, epsilon, epsilon_sc, d; -for (size_t i = 0; i < d_size; d++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - epsilon_sc = epsilon / ve; + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double delta, ve, epsilon, d; + for (size_t i = 0; i < d_size; d++) { + ve = gsl_matrix_get(V_e_temp, i, i); - gsl_vector_const_view xHi_col_i = - gsl_matrix_const_column(xHi, k * d_size + i); - d = gsl_matrix_get(Hiy, j, k); + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); - gsl_blas_daxpy(d * delta, &xHi_col_i.vector, xHiDHiy_g); - gsl_blas_daxpy(d * epsilon_sc, &xHi_col_i.vector, xHiDHiy_e); + gsl_vector_const_view xHi_col_i = //Is there somethign missing here? + gsl_matrix_const_column(xHi, k * d_size + i); + d = gsl_matrix_get(Hiy, j, k); - if (i != j) { - gsl_vector_const_view xHi_col_j = + gsl_blas_daxpy(d * delta, &xHi_col_i.vector, xHiDHiy_g); + gsl_blas_daxpy(d * epsilon, &xHi_col_i.vector, xHiDHiy_e); + + if (i != j) { + gsl_vector_const_view xHi_col_j = gsl_matrix_const_column(xHi, k * d_size + j); - d = gsl_matrix_get(Hiy, i, k); + d = gsl_matrix_get(Hiy, i, k); - gsl_blas_daxpy(d * delta, &xHi_col_j.vector, xHiDHiy_g); - gsl_blas_daxpy(d * epsilon_sc, &xHi_col_j.vector, xHiDHiy_e); + gsl_blas_daxpy(d * delta, &xHi_col_j.vector, xHiDHiy_g); + gsl_blas_daxpy(d * epsilon, &xHi_col_j.vector, xHiDHiy_e); } } } return; } -void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i, +void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigma, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i, const size_t j, gsl_matrix *xHiDHix_g, gsl_matrix *xHiDHix_e) { gsl_matrix_set_zero(xHiDHix_g); @@ -1396,36 +1448,47 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ size_t n_size = eval->size, dc_size = xHi->size1; size_t d_size = xHi->size2 / n_size; - double delta, ve, epsilon, epsilon_sc; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double delta, ve, epsilon; gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix *mat_dcdc_t = gsl_matrix_alloc(dc_size, dc_size); -for (size_t i = 0; i < d_size; i++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); - epsilon_sc = epsilon / ve; + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); - gsl_vector_const_view xHi_col_i = + gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i); - gsl_vector_const_view xHi_col_j = + gsl_vector_const_view xHi_col_j = gsl_matrix_const_column(xHi, k * d_size + j); - gsl_matrix_set_zero(mat_dcdc); - gsl_blas_dger(1.0, &xHi_col_i.vector, &xHi_col_j.vector, mat_dcdc); + gsl_matrix_set_zero(mat_dcdc); + gsl_blas_dger(1.0, &xHi_col_i.vector, &xHi_col_j.vector, mat_dcdc); - gsl_matrix_transpose_memcpy(mat_dcdc_t, mat_dcdc); + gsl_matrix_transpose_memcpy(mat_dcdc_t, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); - gsl_matrix_add(xHiDHix_e, mat_dcdc); + gsl_matrix_scale(mat_dcdc, epsilon); + gsl_matrix_add(xHiDHix_e, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); - gsl_matrix_add(xHiDHix_g, mat_dcdc); + gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_add(xHiDHix_g, mat_dcdc); - if (i != j) { - gsl_matrix_scale(mat_dcdc_t, epsilon_sc); + if (i != j) { + gsl_matrix_scale(mat_dcdc_t, epsilon); gsl_matrix_add(xHiDHix_e, mat_dcdc_t); gsl_matrix_scale(mat_dcdc_t, delta); @@ -4669,7 +4732,7 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const return; } -void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, +void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); From c40699b3928ede44662b28b396f203c28c09f2d6 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:35:18 -0400 Subject: [PATCH 11/37] Update mvlmm.cpp Finished theoretical changes in other functions and replaced all "eps_eval" entries with "eval_vec, sigmasq". --- src/mvlmm.cpp | 541 ++++++++++++++++++++++++++++---------------------- 1 file changed, 303 insertions(+), 238 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index ccfd222..7050dc3 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -308,7 +308,7 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr double sigmasq_value = gsl_matrix_get(sigmasq, 0, 0); // Adjust if sigmasq has different structure double scalar = sigmasq_value / ve; - gsl_matrix_scale(eps_eval, scalar); + gsl_matrix_scale(Sigma, scalar); if (j < i) { d = gsl_matrix_get(Q, j * d_size + l, i * d_size + l); @@ -318,7 +318,7 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr d1 = gsl_matrix_get(X, i, k); d2 = gsl_matrix_get(X, j, k); delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); d += d1 * d2 / (dl * delta + epsilon); // @@ } @@ -381,7 +381,7 @@ void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr x = gsl_matrix_get(X, j, k); y = gsl_matrix_get(UltVehiY, i, k); delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(Sigma, k); + epsilon = gsl_vector_get(Sigma, k, k); epsilon_sc = epsilon / ve; d += x * y / (delta * dl + epsilon); @@ -410,7 +410,6 @@ void CalcOmega(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_mat for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k);; - epsilon = gsl_vector_get(eps_eval, k); for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); @@ -1503,7 +1502,7 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ return; } -void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, +void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &yHiDHiDHiy_gg, double &yHiDHiDHiy_ee, double &yHiDHiDHiy_ge) { @@ -1513,50 +1512,61 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hiy->size1; - double delta, ve, epsilon, epsilon_sc, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double delta, ve, epsilon, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; double d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; -for (size_t i = 0; i < d_size; i++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); - epsilon_sc = epsilon / ve; + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); - d_Hiy_i1 = gsl_matrix_get(Hiy, i1, k); - d_Hiy_j1 = gsl_matrix_get(Hiy, j1, k); - d_Hiy_i2 = gsl_matrix_get(Hiy, i2, k); - d_Hiy_j2 = gsl_matrix_get(Hiy, j2, k); + d_Hiy_i1 = gsl_matrix_get(Hiy, i1, k); + d_Hiy_j1 = gsl_matrix_get(Hiy, j1, k); + d_Hiy_i2 = gsl_matrix_get(Hiy, i2, k); + d_Hiy_j2 = gsl_matrix_get(Hiy, j2, k); - d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); - d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); - d_Hi_j1i2 = gsl_matrix_get(Hi, j1, k * d_size + i2); - d_Hi_j1j2 = gsl_matrix_get(Hi, j1, k * d_size + j2); + d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); + d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); + d_Hi_j1i2 = gsl_matrix_get(Hi, j1, k * d_size + i2); + d_Hi_j1j2 = gsl_matrix_get(Hi, j1, k * d_size + j2); - if (i1 == j1) { - yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + if (i1 == j1) { + yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2); - if (i2 != j2) { + if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); - } - } else { - yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2); + } + } else { + yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); - yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1i2 * d_Hiy_j2 + d_Hiy_j1 * d_Hi_i1i2 * d_Hiy_j2); if (i2 != j2) { yHiDHiDHiy_gg += delta * delta * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ee += epsilon_sc * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + yHiDHiDHiy_ee += epsilon * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); - yHiDHiDHiy_ge += delta * epsilon_sc * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + + yHiDHiDHiy_ge += delta * epsilon * (d_Hiy_i1 * d_Hi_j1j2 * d_Hiy_i2 + d_Hiy_j1 * d_Hi_i1j2 * d_Hiy_i2); } } @@ -1566,7 +1576,7 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, +void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_vector *xHiDHiDHiy_gg, @@ -1577,16 +1587,27 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hiy->size1; - double delta, ve, epsilon, epsilon_sc, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double delta, ve, epsilon, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; double d_Hi_j1i2, d_Hi_j1j2; for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); + + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); - - epsilon_sc = epsilon / ve; + epsilon = gsl_matrix_get(Sigma, k, k); gsl_vector_const_view xHi_col_i = gsl_matrix_const_column(xHi, k * d_size + i1); @@ -1604,46 +1625,46 @@ for (size_t i = 0; i < d_size; i++) { if (i1 == j1) { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); } } else { gsl_blas_daxpy(delta * delta * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ee); + gsl_blas_daxpy(delta * epsilon * d_Hi_j1i2 * d_Hiy_j, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, + gsl_blas_daxpy(delta * epsilon * d_Hi_i1i2 * d_Hiy_j, &xHi_col_j.vector, xHiDHiDHiy_ge); if (i2 != j2) { gsl_blas_daxpy(delta * delta * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, + gsl_blas_daxpy(delta * epsilon * d_Hi_j1j2 * d_Hiy_i, &xHi_col_i.vector, xHiDHiDHiy_ge); gsl_blas_daxpy(delta * delta * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_gg); - gsl_blas_daxpy(epsilon_sc * epsilon_sc * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + gsl_blas_daxpy(epsilon * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ee); - gsl_blas_daxpy(delta * epsilon_sc * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, + gsl_blas_daxpy(delta * epsilon * d_Hi_i1j2 * d_Hiy_i, &xHi_col_j.vector, xHiDHiDHiy_ge); } } @@ -1652,7 +1673,7 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, +void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_matrix *xHiDHiDHix_gg, gsl_matrix *xHiDHiDHix_ee, @@ -1663,50 +1684,62 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_vector *eps_eval, const g size_t n_size = eval->size, d_size = Hi->size1, dc_size = xHi->size1; - double delta, ve, epsilon, epsilon_sc, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; + double delta, ve, epsilon, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); -for (size_t i = 0; i < d_size; i++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); - epsilon_sc = epsilon / ve; + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); - gsl_vector_const_view xHi_col_i1 = + gsl_vector_const_view xHi_col_i1 = gsl_matrix_const_column(xHi, k * d_size + i1); - gsl_vector_const_view xHi_col_j1 = + gsl_vector_const_view xHi_col_j1 = gsl_matrix_const_column(xHi, k * d_size + j1); - gsl_vector_const_view xHi_col_i2 = + gsl_vector_const_view xHi_col_i2 = gsl_matrix_const_column(xHi, k * d_size + i2); - gsl_vector_const_view xHi_col_j2 = + gsl_vector_const_view xHi_col_j2 = gsl_matrix_const_column(xHi, k * d_size + j2); - d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); - d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); - d_Hi_j1i2 = gsl_matrix_get(Hi, j1, k * d_size + i2); - d_Hi_j1j2 = gsl_matrix_get(Hi, j1, k * d_size + j2); + d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); + d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); + d_Hi_j1i2 = gsl_matrix_get(Hi, j1, k * d_size + i2); + d_Hi_j1j2 = gsl_matrix_get(Hi, j1, k * d_size + j2); - if (i1 == j1) { - gsl_matrix_set_zero(mat_dcdc); - gsl_blas_dger(d_Hi_j1i2, &xHi_col_i1.vector, &xHi_col_j2.vector, + if (i1 == j1) { + gsl_matrix_set_zero(mat_dcdc); + gsl_blas_dger(d_Hi_j1i2, &xHi_col_i1.vector, &xHi_col_j2.vector, mat_dcdc); - gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); - gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); - gsl_matrix_scale(mat_dcdc, delta); - gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); + gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); + gsl_matrix_scale(mat_dcdc, epsilon); + gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); + gsl_matrix_scale(mat_dcdc, delta); + gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); - if (i2 != j2) { + if (i2 != j2) { gsl_matrix_set_zero(mat_dcdc); gsl_blas_dger(d_Hi_j1j2, &xHi_col_i1.vector, &xHi_col_i2.vector, mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); + gsl_matrix_scale(mat_dcdc, epsilon); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1717,7 +1750,7 @@ for (size_t i = 0; i < d_size; i++) { mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); + gsl_matrix_scale(mat_dcdc, epsilon); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1727,7 +1760,7 @@ for (size_t i = 0; i < d_size; i++) { mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); + gsl_matrix_scale(mat_dcdc, epsilon); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1738,7 +1771,7 @@ for (size_t i = 0; i < d_size; i++) { mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); + gsl_matrix_scale(mat_dcdc, epsilon); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1748,7 +1781,7 @@ for (size_t i = 0; i < d_size; i++) { mat_dcdc); gsl_matrix_add(xHiDHiDHix_ee, mat_dcdc); - gsl_matrix_scale(mat_dcdc, epsilon_sc); + gsl_matrix_scale(mat_dcdc, epsilon); gsl_matrix_add(xHiDHiDHix_ge, mat_dcdc); gsl_matrix_scale(mat_dcdc, delta); gsl_matrix_add(xHiDHiDHix_gg, mat_dcdc); @@ -1762,29 +1795,40 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_traceHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i, +void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i, const size_t j, double &tHiD_g, double &tHiD_e) { tHiD_g = 0.0; tHiD_e = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, ve, epsilon, epsilon_sc, d; + double delta, ve, epsilon, d; -for (size_t i = 0; i < d_size; i++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); - d = gsl_matrix_get(Hi, j, k * d_size + i); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); - epsilon_sc = epsilon / ve; + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); - if (i == j) { + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); + d = gsl_matrix_get(Hi, j, k * d_size + i); + + if (i == j) { tHiD_g += delta * d; - tHiD_e += epsilon_sc * d; - } else { + tHiD_e += epsilon * d; + } else { tHiD_g += delta * d * 2.0; - tHiD_e += epsilon_sc * d * 2.0; + tHiD_e += epsilon * d * 2.0; } } } @@ -1792,7 +1836,7 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, +void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &tHiDHiD_gg, double &tHiDHiD_ee, double &tHiDHiD_ge) { @@ -1801,15 +1845,24 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_vector *eps_eval, const tHiDHiD_ge = 0.0; size_t n_size = eval->size, d_size = Hi->size1; - double delta, ve, epsilon, epsilon_sc, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; + double delta, ve, epsilon, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; -for (size_t i = 0; i < d_size; i++) { - ve = gsl_matrix_get(V_e_temp, i, i); - for (size_t k = 0; k < n_size; k++) { - delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - epsilon_sc = epsilon / ve; + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + for (size_t i = 0; i < d_size; i++) { + ve = gsl_matrix_get(V_e_temp, i, i); + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + for (size_t k = 0; k < n_size; k++) { + delta = gsl_vector_get(eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); d_Hi_i1i2 = gsl_matrix_get(Hi, i1, k * d_size + i2); d_Hi_i1j2 = gsl_matrix_get(Hi, i1, k * d_size + j2); @@ -1818,25 +1871,25 @@ for (size_t i = 0; i < d_size; i++) { if (i1 == j1) { tHiDHiD_gg += delta * delta * d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ee += epsilon_sc * epsilon_sc * d_Hi_i1j2 * d_Hi_j1i2; - tHiDHiD_ge += delta * epsilon_sc * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ee += epsilon * epsilon * d_Hi_i1j2 * d_Hi_j1i2; + tHiDHiD_ge += delta * epsilon * d_Hi_i1j2 * d_Hi_j1i2; if (i2 != j2) { tHiDHiD_gg += delta * delta * d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ee += epsilon_sc * epsilon_sc * d_Hi_i1i2 * d_Hi_j1j2; - tHiDHiD_ge += delta * epsilon_sc * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ee += epsilon * epsilon * d_Hi_i1i2 * d_Hi_j1j2; + tHiDHiD_ge += delta * epsilon * d_Hi_i1i2 * d_Hi_j1j2; } } else { tHiDHiD_gg += delta * delta * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ee += epsilon_sc * epsilon_sc * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); - tHiDHiD_ge += delta * epsilon_sc * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); + tHiDHiD_ge += delta * epsilon * (d_Hi_i1j2 * d_Hi_j1i2 + d_Hi_j1j2 * d_Hi_i1i2); if (i2 != j2) { tHiDHiD_gg += delta * delta * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ee += epsilon_sc * epsilon_sc * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); - tHiDHiD_ge += delta * epsilon_sc * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ee += epsilon * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); + tHiDHiD_ge += delta * epsilon * (d_Hi_i1i2 * d_Hi_j1j2 + d_Hi_j1i2 * d_Hi_i1j2); } } } @@ -1846,7 +1899,7 @@ for (size_t i = 0; i < d_size; i++) { } // trace(PD) = trace((Hi-HixQixHi)D)=trace(HiD) - trace(HixQixHiD) -void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, +void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHiDHix_all_g, const gsl_matrix *xHiDHix_all_e, const size_t i, const size_t j, double &tPD_g, double &tPD_e) { @@ -1856,7 +1909,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ double d; // Calculate the first part: trace(HiD). - Calc_traceHiD(eval, eps_eval, Hi, V_e_temp, i, j, tPD_g, tPD_e); + Calc_traceHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i, j, tPD_g, tPD_e); // Calculate the second part: -trace(HixQixHiD). for (size_t k = 0; k < dc_size; k++) { @@ -1878,7 +1931,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ // trace(PDPD) = trace((Hi-HixQixHi)D(Hi-HixQixHi)D) // = trace(HiDHiD) - trace(HixQixHiDHiD) // - trace(HiDHixQixHiD) + trace(HixQixHiDHixQixHiD) -void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, +void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *QixHiDHix_all_g, const gsl_matrix *QixHiDHix_all_e, @@ -1894,7 +1947,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gs double d; // Calculate the first part: trace(HiDHiD). - Calc_traceHiDHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); + Calc_traceHiDHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); // Calculate the second and third parts: // -trace(HixQixHiDHiD) - trace(HiDHixQixHiD) @@ -1944,7 +1997,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_vector *eps_eval, const gs } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, +void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiy_all_g, gsl_matrix *xHiDHiy_all_e) { gsl_matrix_set_zero(xHiDHiy_all_g); @@ -1963,14 +2016,14 @@ void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_vector_view xHiDHiy_g = gsl_matrix_column(xHiDHiy_all_g, v); gsl_vector_view xHiDHiy_e = gsl_matrix_column(xHiDHiy_all_e, v); - Calc_xHiDHiy(eval, eps_eval, xHi, Hiy, V_e_temp, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); + Calc_xHiDHiy(eval, eval_vec, sigmasq, xHi, Hiy, V_e_temp, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); } } return; } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, +void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHix_all_g, gsl_matrix *xHiDHix_all_e) { gsl_matrix_set_zero(xHiDHix_all_g); gsl_matrix_set_zero(xHiDHix_all_e); @@ -1990,14 +2043,14 @@ void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix_view xHiDHix_e = gsl_matrix_submatrix(xHiDHix_all_e, 0, v * dc_size, dc_size, dc_size); - Calc_xHiDHix(eval, eps_eval, V_e_temp, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); + Calc_xHiDHix(eval, eval_vec, sigmasq, V_e_temp, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); } } return; } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, +void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiDHiy_all_gg, gsl_matrix *xHiDHiDHiy_all_ee, @@ -2030,7 +2083,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ gsl_vector_view xHiDHiDHiy_ge = gsl_matrix_column(xHiDHiDHiy_all_ge, v1 * v_size + v2); - Calc_xHiDHiDHiy(eval, eps_eval, Hi, xHi, Hiy, V_e_temp, i1, j1, i2, j2, + Calc_xHiDHiDHiy(eval, eval_vec, sigmasq, Hi, xHi, Hiy, V_e_temp, i1, j1, i2, j2, &xHiDHiDHiy_gg.vector, &xHiDHiDHiy_ee.vector, &xHiDHiDHiy_ge.vector); } @@ -2041,7 +2094,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_vector *eps_eval, +void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHiDHix_all_gg, gsl_matrix *xHiDHiDHix_all_ee, @@ -2081,7 +2134,7 @@ void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_ xHiDHiDHix_all_ge, 0, (v1 * v_size + v2) * dc_size, dc_size, dc_size); - Calc_xHiDHiDHix(eval, eps_eval, Hi, V_e_temp, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, + Calc_xHiDHiDHix(eval, eval_vec, sigmasq, Hi, V_e_temp, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, &xHiDHiDHix_ee1.matrix, &xHiDHiDHix_ge1.matrix); if (v2 != v1) { @@ -2183,7 +2236,7 @@ void Calc_QiMat_all(const gsl_matrix *Qi, const gsl_matrix *mat_all_g, // yPDPy = y(Hi-HixQixHi)D(Hi-HixQixHi)y // = ytHiDHiy - (yHix)Qi(xHiDHiy) - (yHiDHix)Qi(xHiy) // + (yHix)Qi(xHiDHix)Qi(xtHiy) -void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, +void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *xHiDHixQixHiy_all_g, @@ -2195,7 +2248,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ma double d; // First part: ytHiDHiy. - Calc_yHiDHiy(eval, eps_eval, Hiy, V_e_temp, i, j, yPDPy_g, yPDPy_e); + Calc_yHiDHiy(eval, eval_vec, sigmasq, Hiy, V_e_temp, i, j, yPDPy_g, yPDPy_e); // Second and third parts: -(yHix)Qi(xHiDHiy)-(yHiDHix)Qi(xHiy) gsl_vector_const_view xHiDHiy_g = gsl_matrix_const_column(xHiDHiy_all_g, v); @@ -2229,7 +2282,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_ma // + (yHix)Qi(xHiDHiDHix)Qi(xHiy) // - (yHix)Qi(xHiDHix)Qi(xHiDHix)Qi(xHiy) void Calc_yPDPDPy( - const gsl_vector *eval, const gsl_vector *eps_eval,const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, + const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *QixHiDHiy_all_g, const gsl_matrix *QixHiDHiy_all_e, @@ -2251,7 +2304,7 @@ void Calc_yPDPDPy( gsl_vector *xHiDHiDHixQixHiy = gsl_vector_alloc(dc_size); // First part: yHiDHiDHiy. - Calc_yHiDHiDHiy(eval, eps_eval, Hi, Hiy, V_e_temp, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, + Calc_yHiDHiDHiy(eval, eval_vec, sigmasq, Hi, Hiy, V_e_temp, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, yPDPDPy_ge); // Second and third parts: @@ -2680,7 +2733,7 @@ void CalcCRT(const gsl_matrix *Hessian_inv, const gsl_matrix *Qi, } // Calculate first-order and second-order derivatives. -void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *Qi, +void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_vector *QixHiy, gsl_vector *gradient, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, @@ -2725,14 +2778,14 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps gsl_matrix_alloc(dc_size, v_size * v_size * dc_size); // Calculate xHiDHiy_all, xHiDHix_all and xHiDHixQixHiy_all. - Calc_xHiDHiy_all(eval, eps_eval, xHi, V_e_temp, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); - Calc_xHiDHix_all(eval, eps_eval, xHi, V_e_temp, xHiDHix_all_g, xHiDHix_all_e); + Calc_xHiDHiy_all(eval, eval_vec, sigmasq, xHi, V_e_temp, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); + Calc_xHiDHix_all(eval, eval_vec, sigmasq, xHi, V_e_temp, xHiDHix_all_g, xHiDHix_all_e); Calc_xHiDHixQixHiy_all(xHiDHix_all_g, xHiDHix_all_e, QixHiy, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e); - Calc_xHiDHiDHiy_all(v_size, eval, eps_eval, Hi, xHi, V_e_temp, Hiy, xHiDHiDHiy_all_gg, + Calc_xHiDHiDHiy_all(v_size, eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, Hiy, xHiDHiDHiy_all_gg, xHiDHiDHiy_all_ee, xHiDHiDHiy_all_ge); - Calc_xHiDHiDHix_all(v_size, eval, eps_eval, Hi, xHi, V_e_temp, xHiDHiDHix_all_gg, + Calc_xHiDHiDHix_all(v_size, eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge); // Calculate QixHiDHiy_all, QixHiDHix_all and QixHiDHixQixHiy_all. @@ -2755,18 +2808,18 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps } v1 = GetIndex(i1, j1, d_size); - Calc_yPDPy(eval, eps_eval, Hiy, V_e_temp, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPy(eval, eval_vec, sigmasq, Hiy, V_e_temp, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, i1, j1, yPDPy_g, yPDPy_e); if (func_name == 'R' || func_name == 'r') { - Calc_tracePD(eval, eps_eval, Qi, V_e_temp, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, + Calc_tracePD(eval, eval_vec, sigmasq, Qi, V_e_temp, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, tPD_e); dev1_g = -0.5 * tPD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tPD_e + 0.5 * yPDPy_e; } else { - Calc_traceHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, tHiD_g, tHiD_e); + Calc_traceHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, tHiD_g, tHiD_e); dev1_g = -0.5 * tHiD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tHiD_e + 0.5 * yPDPy_e; @@ -2786,7 +2839,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps continue; } - Calc_yPDPDPy(eval, eps_eval, Hi, xHi, V_e_temp, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPDPy(eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, QixHiDHiy_all_g, QixHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, QixHiDHixQixHiy_all_g, QixHiDHixQixHiy_all_e, xHiDHiDHiy_all_gg, @@ -2796,7 +2849,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps // AI for REML. if (func_name == 'R' || func_name == 'r') { - Calc_tracePDPD(eval, eps_eval, Qi, V_e_temp, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, + Calc_tracePDPD(eval, eval_vec, sigmasq, Qi, V_e_temp, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); @@ -2805,7 +2858,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_vector *eps dev2_ee = 0.5 * tPDPD_ee - yPDPDPy_ee; dev2_ge = 0.5 * tPDPD_ge - yPDPDPy_ge; } else { - Calc_traceHiDHiD(eval, eps_eval, Hi, V_e_temp, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, + Calc_traceHiDHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, tHiDHiD_ge); dev2_gg = 0.5 * tHiDHiD_gg - yPDPDPy_gg; @@ -2929,7 +2982,7 @@ void UpdateVgVe(const gsl_matrix *Hessian_inv, const gsl_vector *gradient, } double MphNR(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *Hi_all, gsl_matrix *xHi_all, gsl_matrix *Hiy_all, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, double &crt_c) { @@ -3018,7 +3071,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // If flag_pd==1, continue to calculate quantities // and logl. if (flag_pd == 1) { - CalcHiQi(eval, eps_eval, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); + CalcHiQi(eval, eval_vec, sigmasq, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); Calc_Hiy_all(Y, Hi_all, Hiy_all); Calc_xHi_all(X, Hi_all, xHi_all); @@ -3059,7 +3112,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, logl_old = logl_new; - CalcDev(func_name, eval, eps_eval, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, + CalcDev(func_name, eval, eval_vec, sigmasq, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, Hessian_inv, crt_a, crt_b, crt_c); } @@ -3087,7 +3140,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // Initialize Vg, Ve and B. void MphInitial(const size_t em_iter, const double em_prec, const size_t nr_iter, const double nr_prec, - const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *X, + const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, const double l_min, const double l_max, const size_t n_region, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *B) { @@ -3111,9 +3164,9 @@ void MphInitial(const size_t em_iter, const double em_prec, for (size_t i = 0; i < d_size; i++) { gsl_vector_const_view Y_row = gsl_matrix_const_row(Y, i); - CalcLambda('R', eval, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, + CalcLambda('R', eval, eval_vec, sigmasq, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, logl); - CalcLmmVgVeBeta(eval, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, + CalcLmmVgVeBeta(eval, eval_vec, sigmasq, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, se_beta_temp); gsl_matrix_set(V_g, i, i, vg); @@ -3172,10 +3225,10 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_matrix_set(Vg_sub, 1, 1, gsl_matrix_get(V_g, j, j)); gsl_matrix_set(Ve_sub, 1, 1, gsl_matrix_get(V_e, j, j)); - logl = MphEM('R', em_iter, em_prec, eval, eps_eval, X, Y_sub, U_hat, E_hat, + logl = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, X, Y_sub, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, Vg_sub, Ve_sub, B_sub); - logl = MphNR('R', nr_iter, nr_prec, eval, eps_eval, X, Y_sub, Hi_all, xHi_all, + logl = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, X, Y_sub, Hi_all, xHi_all, Hiy_all, Vg_sub, Ve_sub, Hessian, a, b, c); gsl_matrix_set(V_g, i, j, gsl_matrix_get(Vg_sub, 0, 1)); @@ -3219,7 +3272,13 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_vector_set_zero(XHiy); - double logdet_Ve, dl, d, delta, epsilon, epsilon_sc, dx, dy; + gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); + + // Transpose eval_vec + gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + + double logdet_Ve, dl, d, delta, epsilon, dx, dy; // Eigen decomposition and calculate log|Ve|. // double logdet_Ve = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); @@ -3227,7 +3286,7 @@ void MphInitial(const size_t em_iter, const double em_prec, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, X, V_e_temp, Qi); - CalcQi(eval, eps_eval, D_l, X, V_e_temp, Qi); + CalcQi(eval, eval_vec, sigmasq, D_l, X, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -3236,16 +3295,22 @@ void MphInitial(const size_t em_iter, const double em_prec, for (size_t i = 0; i < d_size; i++) { dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); + + // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + gsl_matrix_set_zero(Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + double scalar = sigmasq / ve; + gsl_matrix_scale(Sigma, scalar); + for (size_t j = 0; j < c_size; j++) { d = 0.0; for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); - epsilon = gsl_vector_get(eps_eval, k); + epsilon = gsl_matrix_get(Sigma, k, k); dx = gsl_matrix_get(X, j, k); dy = gsl_matrix_get(UltVehiY, i, k); - epsilon_sc = epsilon / ve; - d += dy * dx / (delta * dl + epsilon_sc); + d += dy * dx / (delta * dl + epsilon); } gsl_vector_set(XHiy, j * d_size + i, d); } @@ -3296,7 +3361,7 @@ double PCRT(const size_t mode, const size_t d_size, const double p_value, return p_crt; } -void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, +void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); igzstream infile(file_geno.c_str(), igzstream::in); @@ -3379,15 +3444,15 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3447,13 +3512,13 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3616,32 +3681,32 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -3652,17 +3717,17 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -3734,7 +3799,7 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl return; } -void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, +void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); string file_bed = file_bfile + ".bed"; @@ -3816,18 +3881,18 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); write(eval,"eval4"); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3890,13 +3955,13 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -4098,33 +4163,33 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -4134,17 +4199,17 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eps_eval, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4217,7 +4282,7 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ // Calculate Vg, Ve, B, se(B) in the null mvLMM model. // Both B and se_B are d by c matrices. -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, @@ -4257,13 +4322,13 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix_transpose_memcpy(W, UtW); // Initial, EM, NR, and calculate B. - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, W, Y, l_min, l_max, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, W, Y, l_min, l_max, n_region, V_g, V_e, B); - MphEM('R', em_iter, em_prec, eval, eps_eval, W, Y, U_hat, E_hat, OmegaU, OmegaE, + MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, W, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - MphNR('R', nr_iter, nr_prec, eval, eps_eval, W, Y, Hi_all, xHi_all, Hiy_all, V_g, + MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, W, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, W, Y, V_g, V_e, UltVehiY, B, se_B); + MphCalcBeta(eval, eval_vec, sigmasq, W, Y, V_g, V_e, UltVehiY, B, se_B); // Free matrices. gsl_matrix_free(U_hat); @@ -4286,7 +4351,7 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const return; } -void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, +void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); @@ -4378,15 +4443,15 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4446,13 +4511,13 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4588,24 +4653,24 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -4614,32 +4679,32 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -4650,17 +4715,17 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4823,16 +4888,16 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4891,13 +4956,13 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eps_eval, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eps_eval, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -5064,24 +5129,24 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eps_eval, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, eval_vec, sigmasq,, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -5090,33 +5155,33 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -5126,17 +5191,17 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eps_eval, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eps_eval, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eps_eval, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { From 96d5f1791e63f4d95a8e2a9327f7994f2c22b939 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:36:47 -0400 Subject: [PATCH 12/37] Update gemma.cpp Replaced any lingering mentions of "eps_eval" with "eval_vec, sigmasq". --- src/gemma.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index eaffd39..561d135 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -2816,11 +2816,11 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { // PLINK analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzePlink(U, eval, eps_eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlink(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzePlinkGXE(U, eval, eps_eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlinkGXE(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2828,10 +2828,10 @@ void GEMMA::BatchRun(PARAM &cPar) { // BIMBAM analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzeBimbam(U, eval, eps_eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbam(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzeBimbamGXE(U, eval, eps_eval, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbamGXE(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2848,15 +2848,15 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzePlink(U, eval, eps_eval, UtW, UtY); + cMvlmm.AnalyzePlink(U, eval, eval_vec, sigmasq, UtW, UtY); } else { - cMvlmm.AnalyzePlinkGXE(U, eval, eps_eval, UtW, UtY, env); + cMvlmm.AnalyzePlinkGXE(U, eval, eval_vec, sigmasq, UtW, UtY, env); } } else { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzeBimbam(U, eval, eps_eval, UtW, UtY); + cMvlmm.AnalyzeBimbam(U, eval, eval_vec, sigmasq, UtW, UtY); } else { - cMvlmm.AnalyzeBimbamGXE(U, eval, eps_eval, UtW, UtY, env); + cMvlmm.AnalyzeBimbamGXE(U, eval, eval_vec, sigmasq, UtW, UtY, env); } } @@ -2945,9 +2945,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); @@ -3055,9 +3055,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, eps_eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); From 112d4992fed1075106d7ed38259d218e42e50b11 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:38:43 -0400 Subject: [PATCH 13/37] Update gemma.cpp --- src/gemma.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index 561d135..a891e94 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -340,7 +340,7 @@ void GEMMA::PrintHelp(size_t option) { cout << " -residvar [filename] " << " residual variance file contains a column of positive values to be used " << "directly as for the residual variance---each value corresponds to an " - << "individual, in which each value is the empirical residual variance based" + << "individual, in which each value is the empirical residual variance (sigmasq) based" << "on a trait value calculated from multiple replicates for this individual" << "(similar in format to phenotype file)" << endl; From 6f1d2cd02990b1734bd9c9a82e7ce2bd841d6242 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:42:19 -0400 Subject: [PATCH 14/37] Update gemma_io.cpp Changed mentions of "eps_eval" with "sigmasq". Still need to figure out how to get eigenvectors from the same place "eval" is derived. --- src/gemma_io.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 848ecb5..472c1e5 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -507,7 +507,7 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, } bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, - vector> &eps_eval, size_t &n_residvar) { + vector> &sigmasq, size_t &n_residvar) { debug_msg("entered"); indicator_residvar.clear(); @@ -543,7 +543,7 @@ bool ReadFile_residvar(const string &file_residvar, vector &indicator_resid } else { indicator_residvar.push_back(0); } - eps_eval.push_back(v_d); + sigmasq.push_back(v_d); } if (indicator_residvar.empty()) { @@ -557,9 +557,9 @@ bool ReadFile_residvar(const string &file_residvar, vector &indicator_resid if (flag_na == 0) { flag_na = 1; - n_residvar = eps_eval[i].size(); + n_residvar = sigmasq[i].size(); } - if (flag_na != 0 && n_residvar != eps_eval[i].size()) { + if (flag_na != 0 && n_residvar != sigmasq[i].size()) { cout << "error! number of residuals in row " << i << " do not match other rows." << endl; return false; @@ -1483,9 +1483,9 @@ void ReadFile_residvar(const string &file_residvar, bool &error, gsl_vector *eps return; } - size_t n_row = eps_eval->size, i_row = 0; + size_t n_row = sigmasq->size, i_row = 0; - gsl_vector_set_zero(eps_eval); //change this so that eps_eval = V_e somehow + gsl_vector_set_zero(sigmasq); //change this so that sigmasq = V_e somehow string line; char *ch_ptr; @@ -1508,7 +1508,7 @@ void ReadFile_residvar(const string &file_residvar, bool &error, gsl_vector *eps error = true; } - gsl_vector_set(eps_eval, i_row, d); + gsl_vector_set(sigmasq, i_row, d); i_row++; } From 057d27ab1fe15add3eebee18a9d4122d064508f8 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:45:59 -0400 Subject: [PATCH 15/37] Update gemma_io.h Changed mention of eps_eval as a vector to "gsl_matrix *sigmasq" --- src/gemma_io.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gemma_io.h b/src/gemma_io.h index 30817e1..648c7e5 100644 --- a/src/gemma_io.h +++ b/src/gemma_io.h @@ -87,7 +87,7 @@ void ReadFile_mk(const string &file_mk, vector &indicator_idv, void ReadFile_eigenU(const string &file_u, bool &error, gsl_matrix *U); void ReadFile_eigenD(const string &file_d, bool &error, gsl_vector *eval); bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, - vector> &eps_eval, size_t &n_residvar); + gsl_matrix *sigmasq, size_t &n_residvar); bool BimbamKin(const string file_geno, const set ksnps, vector &indicator_snp, const int k_mode, From a8352e88f33c5b2eedbb3080687d716201fb5a0e Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:49:00 -0400 Subject: [PATCH 16/37] Update lmm.cpp Changed the one mention of "eps_eval" to "eval_vec" and "sigmasq". May actually need to return to this file in order for the code to actually run. --- src/lmm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lmm.cpp b/src/lmm.cpp index 93335aa..ecac143 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -2,7 +2,7 @@ Genome-wide Efficient Mixed Model Association (GEMMA) Copyright © 2011-2017, Xiang Zhou Copyright © 2017, Peter Carbonetto - Copyright © 2017-2018 Pjotr Prins + Copyright © 2017-2022 Pjotr Prins This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2201,7 +2201,7 @@ void CalcPve(const gsl_vector *eval, const gsl_matrix *UtW, // Obtain REML estimate for Vg and Ve using lambda_remle. // Obtain beta and se(beta) for coefficients. // ab is not used when e_mode==0. -void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, +void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_vector *Uty, const double lambda, double &vg, double &ve, gsl_vector *beta, gsl_vector *se_beta) { size_t n_cvt = UtW->size2, ni_test = UtW->size1; From f858b30c3793fc9aac9be32e8e718e006a725391 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:51:49 -0400 Subject: [PATCH 17/37] Update mvlmm.h eps_eval --> eval_vec, sigmasq --- src/mvlmm.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mvlmm.h b/src/mvlmm.h index b7d37c1..14f6887 100644 --- a/src/mvlmm.h +++ b/src/mvlmm.h @@ -35,6 +35,7 @@ class MVLMM { string file_bfile; string file_geno; + //string file_residvar maybe? string file_oxford; string file_out; string path_out; @@ -79,22 +80,22 @@ class MVLMM { // Main functions void CopyFromParam(PARAM &cPar); void CopyToParam(PARAM &cPar); - void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, + void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, + void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY); void Analyzebgen(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, + void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); - void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector *eps_eval, + void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); void WriteFiles(); }; -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_vector *eps_eval, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, From 587c18117f2525d84747284b4ac76873b53b0a1e Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:52:23 -0400 Subject: [PATCH 18/37] Update param.cpp Changed eps_eval to sigmasq and corrected any identified regions where dimensions did not match. --- src/param.cpp | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/param.cpp b/src/param.cpp index a276e4e..04b744b 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -1976,40 +1976,47 @@ void PARAM::WriteVector(const gsl_vector *vector_D, const string suffix) { void PARAM::CheckResidvar() { if (indicator_residvar.size() == 0) { + // No residual variance is specified, fill sigmasq with Ve_remle_null along the diagonal + gsl_matrix *sigmasq = gsl_matrix_alloc(n_residvar, n_residvar); + + for (size_t i = 0; i < n_residvar; ++i) { + gsl_matrix_set(sigmasq, i, i, Ve_remle_null[i]); + } + + info_msg("No residual variances were specified: Ve_remle_null is placed along the diagonal."); + gsl_matrix_free(sigmasq); return; } size_t ci_test = 0; + gsl_matrix *sigmasq = gsl_matrix_alloc(n_residvar, n_residvar); - gsl_vector *eps_eval = gsl_vector_alloc(n_residvar); - + // If residual variance is specified, use residvar matrix for (size_t i = 0; i < n_residvar; ++i) { - gsl_vector_set(eps_eval, i, (residvar)[i]); - } + gsl_matrix_set(sigmasq, i, i, residvar[i][i]); + } size_t flag_ipt = 0; double v_min, v_max; - set set_remove; + std::set set_remove; - // If no residual variance is specified, eps_eval = V_e. + // If no residual variance is found, assign Ve_remle_null if (n_residvar == set_remove.size()) { indicator_residvar.clear(); n_residvar = 1; } else if (flag_ipt == 0) { - info_msg("no residual variances are found in the residvar file: a column of V_e is added"); - for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { + info_msg("No residual variances found in the residvar file: a diagonal of Ve_remle_null is added."); + for (std::vector::size_type i = 0; i < indicator_idv.size(); ++i) { if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { continue; } - gsl_vector_set(eps_eval, i, Ve_remle_null[i]); + gsl_matrix_set(residvar, i, i, Ve_remle_null[i]); } n_residvar++; - } else { } - gsl_vector_free(eps_eval); - + gsl_matrix_free(sigmasq); return; } @@ -2227,14 +2234,19 @@ void PARAM::CopyWeight(gsl_vector *w) { return; } -void PARAM::CopyResid(gsl_vector *eps_eval) { +void PARAM::CopyResid(gsl_matrix *sigmasq) { size_t ci_test = 0; - for (vector::size_type i = 0; i < indicator_idv.size(); ++i) { + // Loop through the individuals and residual variance indicators + for (std::vector::size_type i = 0; i < indicator_idv.size(); ++i) { if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { - continue; + continue; // Skip if either the individual or residual variance is not active } - gsl_vector_set(eps_eval, ci_test, residvar[i]); + + // Set the diagonal element in sigmasq from residvar + gsl_matrix_set(sigmasq, ci_test, ci_test, gsl_matrix_get(residvar, i, i)); + + // Increment the index for the next valid individual/residual variance ci_test++; } From e85449de1e1a228a077353ef468bf55bfb3fa8eb Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:53:36 -0400 Subject: [PATCH 19/37] Update param.h From ad549574397e521f4b68a3a1fc1c91754dff94b3 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:54:38 -0400 Subject: [PATCH 20/37] Update param.h Replaced input of CopyResid from eps_eval to sigmasq --- src/param.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/param.h b/src/param.h index 474379c..04dffd0 100644 --- a/src/param.h +++ b/src/param.h @@ -350,7 +350,7 @@ class PARAM { const bool calc_K); void CheckCvt(); void CopyCvt(gsl_matrix *W); - void CopyResid(gsl_vector *eps_eval); + void CopyResid(gsl_matrix *sigmasq); void CopyA(size_t flag, gsl_matrix *A); void CopyGxe(gsl_vector *gxe); void CopyWeight(gsl_vector *w); From b0da2e46d0c63218d45abe594681176f8293d262 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:13:38 -0400 Subject: [PATCH 21/37] Update param.h Changed "file_residvar" back to "file_resid" --- src/param.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/param.h b/src/param.h index 04dffd0..f2d93a7 100644 --- a/src/param.h +++ b/src/param.h @@ -136,7 +136,7 @@ class PARAM { string file_anno; // Optional. string file_gxe; // Optional. string file_cvt; // Optional. - string file_residvar; // Optional + string file_resid; // Optional string file_cat, file_mcat; string file_catc, file_mcatc; string file_var; From 9580e68838e94fa7123242701ef5842f16b1d317 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:21:49 -0400 Subject: [PATCH 22/37] Update gemma.cpp Transferred all instances of "eval_vec" to "U". --- src/gemma.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index a891e94..c2c75dd 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -1810,9 +1810,9 @@ void GEMMA::BatchRun(PARAM &cPar) { gsl_vector_view UtY_col = gsl_matrix_column(UtY, 0); // obtain estimates - CalcLambda('R', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('R', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, lambda, logl); - CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, lambda, vg, ve, beta, + CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, lambda, vg, ve, beta, se_beta); cout << "REMLE estimate for vg in the null model = " << vg << endl; @@ -2720,11 +2720,11 @@ void GEMMA::BatchRun(PARAM &cPar) { assert_issue(is_issue(26), ROUND(UtY->data[0]) == -16.6143); - CalcLambda('L', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('L', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); assert(!isnan(UtY->data[0])); - CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, cPar.l_mle_null, + CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_mle_null, cPar.vg_mle_null, cPar.ve_mle_null, &beta.vector, &se_beta.vector); @@ -2743,9 +2743,9 @@ void GEMMA::BatchRun(PARAM &cPar) { assert(!isnan(cPar.se_beta_mle_null.front())); // the following functions do not modify eval - CalcLambda('R', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('R', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); - CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, cPar.l_remle_null, + CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_remle_null, cPar.vg_remle_null, cPar.ve_remle_null, &beta.vector, &se_beta.vector); @@ -2816,11 +2816,11 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { // PLINK analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzePlink(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlink(U, eval, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzePlinkGXE(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlinkGXE(U, eval, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2828,10 +2828,10 @@ void GEMMA::BatchRun(PARAM &cPar) { // BIMBAM analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzeBimbam(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbam(U, eval, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzeBimbamGXE(U, eval, eval_vec, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbamGXE(U, eval, sigmasq, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2848,15 +2848,15 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzePlink(U, eval, eval_vec, sigmasq, UtW, UtY); + cMvlmm.AnalyzePlink(U, eval, sigmasq, UtW, UtY); } else { - cMvlmm.AnalyzePlinkGXE(U, eval, eval_vec, sigmasq, UtW, UtY, env); + cMvlmm.AnalyzePlinkGXE(U, eval, sigmasq, UtW, UtY, env); } } else { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzeBimbam(U, eval, eval_vec, sigmasq, UtW, UtY); + cMvlmm.AnalyzeBimbam(U, eval, sigmasq, UtW, UtY); } else { - cMvlmm.AnalyzeBimbamGXE(U, eval, eval_vec, sigmasq, UtW, UtY, env); + cMvlmm.AnalyzeBimbamGXE(U, eval, sigmasq, UtW, UtY, env); } } @@ -2945,9 +2945,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); @@ -3055,9 +3055,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', eval, eval_vec, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); From 1b9c986a02b235c074df8b7b757d4c5c9577dfb0 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:24:14 -0400 Subject: [PATCH 23/37] Update gemma_io.cpp Changed all instances of "_residvar" to "resid" to keep things consistent. --- src/gemma_io.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index 472c1e5..a475e5d 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -506,14 +506,14 @@ bool ReadFile_cvt(const string &file_cvt, vector &indicator_cvt, return true; } -bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, - vector> &sigmasq, size_t &n_residvar) { +bool ReadFile_resid(const string &file_resid, vector &indicator_resid, + vector> &sigmasq, size_t &n_resid) { debug_msg("entered"); - indicator_residvar.clear(); + indicator_resid.clear(); - ifstream infile(file_residvar.c_str(), ifstream::in); + ifstream infile(file_resid.c_str(), ifstream::in); if (!infile) { - cout << "error! fail to open residual variance file: " << file_residvar << endl; + cout << "error! fail to open residual variance file: " << file_resid << endl; return false; } @@ -539,27 +539,27 @@ bool ReadFile_residvar(const string &file_residvar, vector &indicator_resid ch_ptr = strtok(NULL, " ,\t"); } if (flag_na == 0) { - indicator_residvar.push_back(1); + indicator_resid.push_back(1); } else { - indicator_residvar.push_back(0); + indicator_resid.push_back(0); } sigmasq.push_back(v_d); } - if (indicator_residvar.empty()) { - n_residvar = 0; + if (indicator_resid.empty()) { + n_resid = 0; } else { flag_na = 0; - for (vector::size_type i = 0; i < indicator_residvar.size(); ++i) { - if (indicator_residvar[i] == 0) { + for (vector::size_type i = 0; i < indicator_resid.size(); ++i) { + if (indicator_resid[i] == 0) { continue; } if (flag_na == 0) { flag_na = 1; - n_residvar = sigmasq[i].size(); + n_resid = sigmasq[i].size(); } - if (flag_na != 0 && n_residvar != sigmasq[i].size()) { + if (flag_na != 0 && n_resid != sigmasq[i].size()) { cout << "error! number of residuals in row " << i << " do not match other rows." << endl; return false; @@ -1474,11 +1474,11 @@ void ReadFile_eigenD(const string &file_kd, bool &error, gsl_vector *eval) { return; } -void ReadFile_residvar(const string &file_residvar, bool &error, gsl_vector *eps_eval) { +void ReadFile_resid(const string &file_resid, bool &error, gsl_vector *eps_eval) { debug_msg("entered"); - igzstream infile(file_residvar.c_str(), igzstream::in); + igzstream infile(file_resid.c_str(), igzstream::in); if (!infile) { - cout << "error! fail to open the residual variance file: " << file_residvar << endl; + cout << "error! fail to open the residual variance file: " << file_resid << endl; error = true; return; } @@ -1498,7 +1498,7 @@ void ReadFile_residvar(const string &file_residvar, bool &error, gsl_vector *eps error = true; } - ch_ptr = strtok_safe2((char *)line.c_str(), " ,\t",file_residvar.c_str()); + ch_ptr = strtok_safe2((char *)line.c_str(), " ,\t",file_resid.c_str()); d = atof(ch_ptr); ch_ptr = strtok(NULL, " ,\t"); From e193600af4cdc221cea22f778d40f61b2a6112fd Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:25:30 -0400 Subject: [PATCH 24/37] Update gemma_io.h Changed all instances of "residvar" to "resid" to keep things consistent --- src/gemma_io.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gemma_io.h b/src/gemma_io.h index 648c7e5..9586591 100644 --- a/src/gemma_io.h +++ b/src/gemma_io.h @@ -86,8 +86,8 @@ void ReadFile_mk(const string &file_mk, vector &indicator_idv, gsl_matrix *G); void ReadFile_eigenU(const string &file_u, bool &error, gsl_matrix *U); void ReadFile_eigenD(const string &file_d, bool &error, gsl_vector *eval); -bool ReadFile_residvar(const string &file_residvar, vector &indicator_residvar, - gsl_matrix *sigmasq, size_t &n_residvar); +bool ReadFile_resid(const string &file_resid, vector &indicator_resid, + gsl_matrix *sigmasq, size_t &n_resid); bool BimbamKin(const string file_geno, const set ksnps, vector &indicator_snp, const int k_mode, From 8409e495b6a1c4e1502c66f70f654904a42f17e2 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:32:18 -0400 Subject: [PATCH 25/37] Update lmm.cpp Changed inputs to "CalcLmmVgVeBeta", "CalcLambda", and "AnalyzePlink" according to their use elsewhere (i.e. no more "eval_vec"). --- src/lmm.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lmm.cpp b/src/lmm.cpp index ecac143..dc58fea 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -1702,7 +1702,7 @@ void LMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, #include "eigenlib.h" -void LMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, +void LMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_vector *Uty, const gsl_matrix *W, const gsl_vector *y, const set gwasnps) { @@ -2134,7 +2134,7 @@ void CalcLambda(const char func_name, FUNC_PARAM ¶ms, const double l_min, } // Calculate lambda in the null model. -void CalcLambda(const char func_name, const gsl_vector *eval, +void CalcLambda(const char func_name, const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_vector *Uty, const double l_min, const double l_max, const size_t n_region, double &lambda, double &logl_H0) { @@ -2201,7 +2201,7 @@ void CalcPve(const gsl_vector *eval, const gsl_matrix *UtW, // Obtain REML estimate for Vg and Ve using lambda_remle. // Obtain beta and se(beta) for coefficients. // ab is not used when e_mode==0. -void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, +void CalcLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_vector *Uty, const double lambda, double &vg, double &ve, gsl_vector *beta, gsl_vector *se_beta) { size_t n_cvt = UtW->size2, ni_test = UtW->size1; From 06b5f62f640b862b0418de146b673189cd377aab Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:33:38 -0400 Subject: [PATCH 26/37] Update param.h Changed residvar to resid for consistency. --- src/param.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/param.h b/src/param.h index f2d93a7..89c7c81 100644 --- a/src/param.h +++ b/src/param.h @@ -245,7 +245,7 @@ class PARAM { size_t ni_control, ni_case; // Number of controls and number of cases. size_t ni_subsample; // Number of subsampled individuals. size_t n_cvt; // Number of covariates. - size_t n_residvar; // Number of residual variances. + size_t n_resid; // Number of residual variances. size_t n_cat; // Number of continuous categories. size_t n_ph; // Number of phenotypes. size_t n_vc; // Number of variance components @@ -271,7 +271,7 @@ class PARAM { vector> cvt; // Vector recording all residual variances (NA replaced with -9). - vector residvar; + vector resid; // Vector recording all covariates (NA replaced with -9). vector gxe; @@ -302,7 +302,7 @@ class PARAM { // Indicator for residuals: 0 missing, 1 available for // analysis. - vector indicator_residvar; + vector indicator_resid; // Indicator for gxe: 0 missing, 1 available for analysis. vector indicator_gxe; From be69a55137f93b15b1de5e1354ab2cace3748b06 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:35:45 -0400 Subject: [PATCH 27/37] Update param.cpp Changed all mentions of residvar to resid for consistency --- src/param.cpp | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/param.cpp b/src/param.cpp index 04b744b..683fc42 100644 --- a/src/param.cpp +++ b/src/param.cpp @@ -250,8 +250,8 @@ void PARAM::ReadFiles(void) { trim_individuals(indicator_cvt, ni_max); // Read residual variance files before the genotype files. - if (!file_residvar.empty()) { - if (ReadFile_column(file_residvar, indicator_residvar, residvar, 1) == false) { + if (!file_resid.empty()) { + if (ReadFile_column(file_resid, indicator_resid, resid, 1) == false) { error = true; } } @@ -963,7 +963,7 @@ void PARAM::CheckParam(void) { enforce_fexists(file_weight, "open file"); enforce_fexists(file_epm, "open file"); enforce_fexists(file_ebv, "open file"); - enforce_fexists(file_residvar, "open file"); + enforce_fexists(file_resid, "open file"); enforce_fexists(file_read, "open file"); // Check if files are compatible with analysis mode. @@ -1045,8 +1045,8 @@ void PARAM::CheckData(void) { return; } - if ((indicator_residvar).size() != 0 && - (indicator_residvar).size() != (indicator_idv).size()) { + if ((indicator_resid).size() != 0 && + (indicator_resid).size() != (indicator_idv).size()) { error = true; cout << "error! number of rows in the residual variance file do not match " << "the number of individuals. " << endl; @@ -1102,8 +1102,8 @@ void PARAM::CheckData(void) { } } - if (indicator_residvar.size() != 0) { - if (indicator_residvar[i] == 0) { + if (indicator_resid.size() != 0) { + if (indicator_resid[i] == 0) { continue; } } @@ -1153,7 +1153,7 @@ void PARAM::CheckData(void) { cout << "## number of analyzed individuals = " << ni_test << endl; } cout << "## number of covariates = " << n_cvt << endl; - cout << "## number of residual variances" << n_residvar << endl; + cout << "## number of residual variances" << n_resid << endl; cout << "## number of phenotypes = " << n_ph << endl; if (a_mode == 43) { cout << "## number of observed data = " << np_obs << endl; @@ -1974,12 +1974,12 @@ void PARAM::WriteVector(const gsl_vector *vector_D, const string suffix) { return; } -void PARAM::CheckResidvar() { - if (indicator_residvar.size() == 0) { +void PARAM::Checkresid() { + if (indicator_resid.size() == 0) { // No residual variance is specified, fill sigmasq with Ve_remle_null along the diagonal - gsl_matrix *sigmasq = gsl_matrix_alloc(n_residvar, n_residvar); + gsl_matrix *sigmasq = gsl_matrix_alloc(n_resid, n_resid); - for (size_t i = 0; i < n_residvar; ++i) { + for (size_t i = 0; i < n_resid; ++i) { gsl_matrix_set(sigmasq, i, i, Ve_remle_null[i]); } @@ -1989,11 +1989,11 @@ void PARAM::CheckResidvar() { } size_t ci_test = 0; - gsl_matrix *sigmasq = gsl_matrix_alloc(n_residvar, n_residvar); + gsl_matrix *sigmasq = gsl_matrix_alloc(n_resid, n_resid); - // If residual variance is specified, use residvar matrix - for (size_t i = 0; i < n_residvar; ++i) { - gsl_matrix_set(sigmasq, i, i, residvar[i][i]); + // If residual variance is specified, use resid matrix + for (size_t i = 0; i < n_resid; ++i) { + gsl_matrix_set(sigmasq, i, i, resid[i][i]); } size_t flag_ipt = 0; @@ -2001,19 +2001,19 @@ void PARAM::CheckResidvar() { std::set set_remove; // If no residual variance is found, assign Ve_remle_null - if (n_residvar == set_remove.size()) { - indicator_residvar.clear(); - n_residvar = 1; + if (n_resid == set_remove.size()) { + indicator_resid.clear(); + n_resid = 1; } else if (flag_ipt == 0) { - info_msg("No residual variances found in the residvar file: a diagonal of Ve_remle_null is added."); + info_msg("No residual variances found in the resid file: a diagonal of Ve_remle_null is added."); for (std::vector::size_type i = 0; i < indicator_idv.size(); ++i) { - if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { + if (indicator_idv[i] == 0 || indicator_resid[i] == 0) { continue; } - gsl_matrix_set(residvar, i, i, Ve_remle_null[i]); + gsl_matrix_set(resid, i, i, Ve_remle_null[i]); } - n_residvar++; + n_resid++; } gsl_matrix_free(sigmasq); @@ -2113,9 +2113,9 @@ void PARAM::ProcessCvtPhen() { } // Remove individuals with missing residual variance. - if ((indicator_residvar).size() != 0) { + if ((indicator_resid).size() != 0) { for (vector::size_type i = 0; i < (indicator_idv).size(); ++i) { - indicator_idv[i] *= indicator_residvar[i]; + indicator_idv[i] *= indicator_resid[i]; } } @@ -2239,12 +2239,12 @@ void PARAM::CopyResid(gsl_matrix *sigmasq) { // Loop through the individuals and residual variance indicators for (std::vector::size_type i = 0; i < indicator_idv.size(); ++i) { - if (indicator_idv[i] == 0 || indicator_residvar[i] == 0) { + if (indicator_idv[i] == 0 || indicator_resid[i] == 0) { continue; // Skip if either the individual or residual variance is not active } - // Set the diagonal element in sigmasq from residvar - gsl_matrix_set(sigmasq, ci_test, ci_test, gsl_matrix_get(residvar, i, i)); + // Set the diagonal element in sigmasq from resid + gsl_matrix_set(sigmasq, ci_test, ci_test, gsl_matrix_get(resid, i, i)); // Increment the index for the next valid individual/residual variance ci_test++; From 2b25992e46c4dc2d10c155bbaa4542d2650c5671 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:36:27 -0400 Subject: [PATCH 28/37] Update gemma.cpp Changed all residvar to resid for consistency. --- src/gemma.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index c2c75dd..14d1db5 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -337,7 +337,7 @@ void GEMMA::PrintHelp(size_t option) { cout << " variable for individual 2" << endl; cout << " ..." << endl; cout << " missing value: NA" << endl; - cout << " -residvar [filename] " + cout << " -resid [filename] " << " residual variance file contains a column of positive values to be used " << "directly as for the residual variance---each value corresponds to an " << "individual, in which each value is the empirical residual variance (sigmasq) based" @@ -835,7 +835,7 @@ void GEMMA::Assign(int argc, char **argv, PARAM &cPar) { str.clear(); str.assign(argv[i]); cPar.file_weight = str; - } else if (strcmp(argv[i], "-residvar") == 0) { + } else if (strcmp(argv[i], "-resid") == 0) { if (argv[i + 1] == NULL || argv[i + 1][0] == '-') { continue; } From e1d92d089e37e5eaf28a814fcf070e6e0f13c3d1 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:40:25 -0400 Subject: [PATCH 29/37] Update mvlmm.h Changed "residvar" to "resid" and removed unnecessary mentions of "eval_vec" from other functions. --- src/mvlmm.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mvlmm.h b/src/mvlmm.h index 14f6887..126cad7 100644 --- a/src/mvlmm.h +++ b/src/mvlmm.h @@ -35,7 +35,7 @@ class MVLMM { string file_bfile; string file_geno; - //string file_residvar maybe? + string file_resid; string file_oxford; string file_out; string path_out; @@ -59,7 +59,7 @@ class MVLMM { size_t ni_total, ni_test; // Number of individuals. size_t ns_total, ns_test; // Number of SNPs. size_t n_cvt; - size_t n_residvar; + size_t n_resid; size_t n_ph; double time_UtX; // Time spent on optimization iterations. double time_opt; // Time spent on optimization iterations. @@ -80,22 +80,22 @@ class MVLMM { // Main functions void CopyFromParam(PARAM &cPar); void CopyToParam(PARAM &cPar); - void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, + void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, + void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY); void Analyzebgen(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, + void AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); - void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, + void AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env); void WriteFiles(); }; -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, From 1caa0d165bb819ed8d37805f5c8f7915d81d538b Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:49:53 -0400 Subject: [PATCH 30/37] Update gemma_io.cpp Altered previous Read_resid function so that sigmasq is a matrix, not a vector. --- src/gemma_io.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/gemma_io.cpp b/src/gemma_io.cpp index a475e5d..6bb2c68 100644 --- a/src/gemma_io.cpp +++ b/src/gemma_io.cpp @@ -1474,7 +1474,7 @@ void ReadFile_eigenD(const string &file_kd, bool &error, gsl_vector *eval) { return; } -void ReadFile_resid(const string &file_resid, bool &error, gsl_vector *eps_eval) { +void ReadFile_resid(const string &file_resid, bool &error, gsl_matrix *sigmasq) { debug_msg("entered"); igzstream infile(file_resid.c_str(), igzstream::in); if (!infile) { @@ -1483,9 +1483,9 @@ void ReadFile_resid(const string &file_resid, bool &error, gsl_vector *eps_eval) return; } - size_t n_row = sigmasq->size, i_row = 0; + size_t n_row = sigmasq->size1, n_col = sigmasq->size2, i_row = 0, i_col = 0; - gsl_vector_set_zero(sigmasq); //change this so that sigmasq = V_e somehow + gsl_matrix_set_zero(sigmasq); //change this so that sigmasq = V_e somehow string line; char *ch_ptr; @@ -1498,17 +1498,21 @@ void ReadFile_resid(const string &file_resid, bool &error, gsl_vector *eps_eval) error = true; } - ch_ptr = strtok_safe2((char *)line.c_str(), " ,\t",file_resid.c_str()); - d = atof(ch_ptr); + i_col = 0; + ch_ptr = strtok((char *)line.c_str(), " ,\t"); + while (ch_ptr != NULL) { + if (i_col == n_col) { + cout << "error! number of columns in the residual variance file " + << "is larger than expected, for row = " << i_row << endl; + error = true; + } - ch_ptr = strtok(NULL, " ,\t"); - if (ch_ptr != NULL) { - cout << "error! number of columns in the residual variance file is larger " - << "than expected, for row = " << i_row << endl; - error = true; - } + d = atof(ch_ptr); + gsl_matrix_set(sigmasq, i_row, i_col, d); + i_col++; - gsl_vector_set(sigmasq, i_row, d); + ch_ptr = strtok(NULL, " ,\t"); + } i_row++; } From eb1e11362e15eb7ce630469b04be272cb7a9c814 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:04:26 -0400 Subject: [PATCH 31/37] Update lmm.cpp Tentatively removed the sigmasq parameter requirement from AnalyzePlink, CalcLambda, CalcLmmVgVeBeta. --- src/lmm.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lmm.cpp b/src/lmm.cpp index dc58fea..ce46a41 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -1702,7 +1702,7 @@ void LMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, #include "eigenlib.h" -void LMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, +void LMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_vector *Uty, const gsl_matrix *W, const gsl_vector *y, const set gwasnps) { @@ -2134,7 +2134,7 @@ void CalcLambda(const char func_name, FUNC_PARAM ¶ms, const double l_min, } // Calculate lambda in the null model. -void CalcLambda(const char func_name, const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, +void CalcLambda(const char func_name, const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_vector *Uty, const double l_min, const double l_max, const size_t n_region, double &lambda, double &logl_H0) { @@ -2201,7 +2201,7 @@ void CalcPve(const gsl_vector *eval, const gsl_matrix *UtW, // Obtain REML estimate for Vg and Ve using lambda_remle. // Obtain beta and se(beta) for coefficients. // ab is not used when e_mode==0. -void CalcLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, +void CalcLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_vector *Uty, const double lambda, double &vg, double &ve, gsl_vector *beta, gsl_vector *se_beta) { size_t n_cvt = UtW->size2, ni_test = UtW->size1; From c18db6d6c9ddeb14e42e00046d900671f25114ba Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:08:09 -0400 Subject: [PATCH 32/37] Update mvlmm.h Got rid of sigmasq mentions where they aren't needed. --- src/mvlmm.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mvlmm.h b/src/mvlmm.h index 126cad7..7fa6d94 100644 --- a/src/mvlmm.h +++ b/src/mvlmm.h @@ -80,9 +80,9 @@ class MVLMM { // Main functions void CopyFromParam(PARAM &cPar); void CopyToParam(PARAM &cPar); - void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, + void AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); - void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, + void AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); void Analyzebgen(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY); @@ -95,7 +95,7 @@ class MVLMM { void WriteFiles(); }; -void CalcMvLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, From 94927daeba71e4c2e11c203b379fa6b8449b381d Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:25:14 -0400 Subject: [PATCH 33/37] Update gemma.cpp Got rid of mentions of both U and sigmasq when they're not appropriate for functions AnalyzePlink, CalcLambda, CalcLmmVgVeBeta that don't need them. --- src/gemma.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index 14d1db5..d34773f 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -2720,11 +2720,11 @@ void GEMMA::BatchRun(PARAM &cPar) { assert_issue(is_issue(26), ROUND(UtY->data[0]) == -16.6143); - CalcLambda('L', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('L', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); assert(!isnan(UtY->data[0])); - CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_mle_null, + CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, cPar.l_mle_null, cPar.vg_mle_null, cPar.ve_mle_null, &beta.vector, &se_beta.vector); @@ -2743,9 +2743,9 @@ void GEMMA::BatchRun(PARAM &cPar) { assert(!isnan(cPar.se_beta_mle_null.front())); // the following functions do not modify eval - CalcLambda('R', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('R', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); - CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_remle_null, + CalcLmmVgVeBeta(eval, sigmasq, UtW, &UtY_col.vector, cPar.l_remle_null, cPar.vg_remle_null, cPar.ve_remle_null, &beta.vector, &se_beta.vector); @@ -2816,11 +2816,11 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { // PLINK analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzePlink(U, eval, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlink(U, eval, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzePlinkGXE(U, eval, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzePlinkGXE(U, eval, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2828,10 +2828,10 @@ void GEMMA::BatchRun(PARAM &cPar) { // BIMBAM analysis if (cPar.file_gxe.empty()) { - cLmm.AnalyzeBimbam(U, eval, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbam(U, eval, UtW, &UtY_col.vector, W, &Y_col.vector, cPar.setGWASnps); } else { - cLmm.AnalyzeBimbamGXE(U, eval, sigmasq, UtW, &UtY_col.vector, W, + cLmm.AnalyzeBimbamGXE(U, eval, UtW, &UtY_col.vector, W, &Y_col.vector, env); } } @@ -2848,15 +2848,15 @@ void GEMMA::BatchRun(PARAM &cPar) { if (!cPar.file_bfile.empty()) { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzePlink(U, eval, sigmasq, UtW, UtY); + cMvlmm.AnalyzePlink(U, eval, UtW, UtY); } else { - cMvlmm.AnalyzePlinkGXE(U, eval, sigmasq, UtW, UtY, env); + cMvlmm.AnalyzePlinkGXE(U, eval, UtW, UtY, env); } } else { if (cPar.file_gxe.empty()) { - cMvlmm.AnalyzeBimbam(U, eval, sigmasq, UtW, UtY); + cMvlmm.AnalyzeBimbam(U, eval, UtW, UtY); } else { - cMvlmm.AnalyzeBimbamGXE(U, eval, sigmasq, UtW, UtY, env); + cMvlmm.AnalyzeBimbamGXE(U, eval, UtW, UtY, env); } } @@ -2945,9 +2945,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); @@ -3055,9 +3055,9 @@ void GEMMA::BatchRun(PARAM &cPar) { CalcUtX(U, y, Uty); // calculate REMLE/MLE estimate and pve - CalcLambda('L', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('L', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_mle_null, cPar.logl_mle_H0); - CalcLambda('R', U, eval, sigmasq, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, + CalcLambda('R', eval, UtW, Uty, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); CalcPve(eval, UtW, Uty, cPar.l_remle_null, cPar.trace_G, cPar.pve_null, cPar.pve_se_null); From b2ae33e2822a211a373dae864e42a65841256cfc Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:27:20 -0400 Subject: [PATCH 34/37] Update gemma.cpp Last cleanup of sigmasq --- src/gemma.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gemma.cpp b/src/gemma.cpp index d34773f..da13dd8 100644 --- a/src/gemma.cpp +++ b/src/gemma.cpp @@ -1810,9 +1810,9 @@ void GEMMA::BatchRun(PARAM &cPar) { gsl_vector_view UtY_col = gsl_matrix_column(UtY, 0); // obtain estimates - CalcLambda('R', U, eval, sigmasq, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, + CalcLambda('R', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, lambda, logl); - CalcLmmVgVeBeta(U, eval, sigmasq, UtW, &UtY_col.vector, lambda, vg, ve, beta, + CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, lambda, vg, ve, beta, se_beta); cout << "REMLE estimate for vg in the null model = " << vg << endl; @@ -2745,7 +2745,7 @@ void GEMMA::BatchRun(PARAM &cPar) { // the following functions do not modify eval CalcLambda('R', eval, UtW, &UtY_col.vector, cPar.l_min, cPar.l_max, cPar.n_region, cPar.l_remle_null, cPar.logl_remle_H0); - CalcLmmVgVeBeta(eval, sigmasq, UtW, &UtY_col.vector, cPar.l_remle_null, + CalcLmmVgVeBeta(eval, UtW, &UtY_col.vector, cPar.l_remle_null, cPar.vg_remle_null, cPar.ve_remle_null, &beta.vector, &se_beta.vector); From dfd99b35b672b79a312dc0f5fd601cfb0f3aa683 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:32:51 -0400 Subject: [PATCH 35/37] Update lmm.cpp Removed parameter requirement for eigenvectors U in CalcLambda and CalcLmmVgVeBeta --- src/lmm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lmm.cpp b/src/lmm.cpp index ce46a41..ca9fbc2 100644 --- a/src/lmm.cpp +++ b/src/lmm.cpp @@ -2134,7 +2134,7 @@ void CalcLambda(const char func_name, FUNC_PARAM ¶ms, const double l_min, } // Calculate lambda in the null model. -void CalcLambda(const char func_name, const gsl_matrix *U, const gsl_vector *eval, +void CalcLambda(const char func_name, const gsl_vector *eval, const gsl_matrix *UtW, const gsl_vector *Uty, const double l_min, const double l_max, const size_t n_region, double &lambda, double &logl_H0) { @@ -2201,7 +2201,7 @@ void CalcPve(const gsl_vector *eval, const gsl_matrix *UtW, // Obtain REML estimate for Vg and Ve using lambda_remle. // Obtain beta and se(beta) for coefficients. // ab is not used when e_mode==0. -void CalcLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, +void CalcLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, const gsl_vector *Uty, const double lambda, double &vg, double &ve, gsl_vector *beta, gsl_vector *se_beta) { size_t n_cvt = UtW->size2, ni_test = UtW->size1; From 2d6afc247daacc3d34aaa95799bd50a995b18d01 Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:31:03 -0400 Subject: [PATCH 36/37] Update mvlmm.cpp Replaced all eval_vec with U --- src/mvlmm.cpp | 485 +++++++++++++++++++++++++------------------------- 1 file changed, 243 insertions(+), 242 deletions(-) diff --git a/src/mvlmm.cpp b/src/mvlmm.cpp index 7050dc3..ceba2bb 100644 --- a/src/mvlmm.cpp +++ b/src/mvlmm.cpp @@ -54,6 +54,7 @@ void MVLMM::CopyFromParam(PARAM &cPar) { file_bfile = cPar.file_bfile; file_geno = cPar.file_geno; + file_resid = cPar.file_resid; file_out = cPar.file_out; path_out = cPar.path_out; @@ -80,7 +81,7 @@ void MVLMM::CopyFromParam(PARAM &cPar) { ni_test = cPar.ni_test; ns_test = cPar.ns_test; n_cvt = cPar.n_cvt; - n_residvar = cPar.n_residvar; + n_resid = cPar.n_resid; n_ph = cPar.n_ph; @@ -283,7 +284,7 @@ tuple EigenProc(const gsl_matrix *V_g, const gsl_matrix *V } // Qi=(\sum_{k=1}^n x_kx_k^T\otimes(delta_k*Dl+epsilon_k)^{-1} )^{-1}. -double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, +double CalcQi(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *V_e_temp, gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; size_t c_size = dc_size / d_size; @@ -293,9 +294,9 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr gsl_matrix *Q = gsl_matrix_alloc(dc_size, dc_size); gsl_matrix_set_zero(Q); - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); @@ -304,7 +305,7 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr for (size_t l = 0; l < d_size; l++) { dl = gsl_vector_get(D_l, l); ve = gsl_matrix_get(V_e_temp, l, l); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double sigmasq_value = gsl_matrix_get(sigmasq, 0, 0); // Adjust if sigmasq has different structure double scalar = sigmasq_value / ve; @@ -346,7 +347,7 @@ double CalcQi(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr // xHiy=\sum_{k=1}^n x_k\otimes ((delta_k*Dl+epsilon_k)^{-1}Ul^TVe^{-1/2}y. // // FIXME: mvlmm spends a massive amount of time here -void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, +void CalcXHiY(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, gsl_vector *xHiy) { // debug_msg("enter"); @@ -357,11 +358,11 @@ void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr // gsl_vector_set_zero(xHiy); std::vector xHiy(d_size * c_size, 0.0); // Initialize output vector xHiy - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double x, delta, ve, epsilon, dl, y, d; @@ -369,9 +370,9 @@ void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -396,17 +397,17 @@ void CalcXHiY(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matr // OmegaU=D_l/(delta Dl+epsilon)^{-1} // OmegaE=delta D_l/(delta Dl+epsilon)^{-1} -void CalcOmega(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *V_e_temp, +void CalcOmega(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *V_e_temp, gsl_matrix *OmegaU, gsl_matrix *OmegaE) { size_t n_size = eval->size, d_size = D_l->size; - double delta, ve, epsilon, epsilon_sc, dl, d_u, d_e; + double delta, ve, epsilon, dl, d_u, d_e; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k);; @@ -415,9 +416,9 @@ void CalcOmega(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_mat dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -495,7 +496,7 @@ void UpdateRL_B(const gsl_vector *xHiy, const gsl_matrix *Qi, return; } -void UpdateV(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *U, const gsl_matrix *E, +void UpdateV(const gsl_vector *eval, const gsl_matrix *sigmasq, const gsl_matrix *U, const gsl_matrix *E, const gsl_matrix *Sigma_uu, const gsl_matrix *Sigma_ee, const gsl_matrix *V_e_temp, gsl_matrix *V_g, gsl_matrix *V_e) { size_t n_size = eval->size, d_size = U->size1; @@ -505,11 +506,11 @@ void UpdateV(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matri double delta, ve; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); // Calculate the first part: UD^{-1}U^T and EE^T. for (size_t i = 0; i < d_size; i++) { @@ -521,9 +522,9 @@ void UpdateV(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matri if (delta == 0) { continue; } - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -556,7 +557,7 @@ void UpdateV(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matri return; } -void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *eval_vec, +void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *X, const gsl_matrix *OmegaU, const gsl_matrix *OmegaE, const gsl_matrix *UltVeh, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, @@ -599,8 +600,8 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e gsl_matrix_set_zero(M_u); gsl_matrix_set_zero(M_e); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); for (size_t k = 0; k < n_size; k++) { delta = gsl_vector_get(eval, k); @@ -609,9 +610,9 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); gsl_matrix_scale(Sigma, sigmasq / ve); double epsilon = gsl_matrix_get(Sigma, k, k); @@ -652,17 +653,17 @@ void CalcSigma(const char func_name, const gsl_vector *eval, const gsl_vector *e // 'R' for restricted likelihood and 'L' for likelihood. // 'R' update B and 'L' don't. // only calculate -0.5*\sum_{k=1}^n|H_k|-0.5yPxy. -double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_vector *xHiy, const gsl_matrix *sigmasq, +double MphCalcLogL(const gsl_vector *eval, const gsl_matrix *U, const gsl_vector *xHiy, const gsl_matrix *sigmasq, const gsl_vector *D_l, const gsl_matrix *UltVehiY, const gsl_matrix *V_e_temp, const gsl_matrix *Qi) { size_t n_size = eval->size, d_size = D_l->size, dc_size = Qi->size1; double logl = 0.0, delta, ve, epsilon, epsilon_sc, dl, y, d; // Create temporary matrix for Sigma gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); // Calculate yHiy+log|H_k|. for (size_t k = 0; k < n_size; k++) { @@ -673,9 +674,9 @@ double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); gsl_matrix_scale(Sigma, sigmasq / ve); double epsilon = gsl_matrix_get(Sigma, k, k); @@ -704,7 +705,7 @@ double MphCalcLogL(const gsl_vector *eval, const gsl_vector *eval_vec, const gsl // dxd matrix, V_e is a dxd matrix, eval is a size n vector //'R' for restricted likelihood and 'L' for likelihood. double MphEM(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_vector *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *U_hat, gsl_matrix *E_hat, gsl_matrix *OmegaU, gsl_matrix *OmegaE, gsl_matrix *UltVehiY, gsl_matrix *UltVehiBX, gsl_matrix *UltVehiU, gsl_matrix *UltVehiE, gsl_matrix *V_g, @@ -802,14 +803,14 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, for (size_t t = 0; t < max_iter; t++) { tie(V_e_temp, logdet_Ve) = EigenProc(V_g, V_e, D_l, UltVeh, UltVehi); - logdet_Q = CalcQi(eval, eval_vec, sigmasq, D_l, X, V_e_temp, Qi); + logdet_Q = CalcQi(eval, U, sigmasq, D_l, X, V_e_temp, Qi); gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); - CalcXHiY(eval, eval_vec, sigmasq, D_l, X, UltVehiY, V_e_temp, xHiy); + CalcXHiY(eval, U, sigmasq, D_l, X, UltVehiY, V_e_temp, xHiy); // Calculate log likelihood/restricted likelihood value, and // terminate if change is small. - logl_new = logl_const + MphCalcLogL(eval, eval_vec, xHiy, sigmasq, D_l, UltVehiY, V_e_temp, Qi) - + logl_new = logl_const + MphCalcLogL(eval, U, xHiy, sigmasq, D_l, UltVehiY, V_e_temp, Qi) - 0.5 * (double)n_size * logdet_Ve; if (func_name == 'R' || func_name == 'r') { logl_new += -0.5 * (logdet_Q - (double)c_size * logdet_Ve); @@ -819,7 +820,7 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, } logl_old = logl_new; - CalcOmega(eval, eval_vec, sigmasq, D_l, V_e_temp, OmegaU, OmegaE); + CalcOmega(eval, U, sigmasq, D_l, V_e_temp, OmegaU, OmegaE); // Update UltVehiB, UltVehiU. if (func_name == 'R' || func_name == 'r') { @@ -851,11 +852,11 @@ double MphEM(const char func_name, const size_t max_iter, const double max_prec, gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, UltVeh, UltVehiB, 0.0, B); // Calculate Sigma_uu and Sigma_ee. - CalcSigma(func_name, eval, eval_vec, sigmasq, D_l, X, OmegaU, OmegaE, UltVeh, Qi, V_e_temp, Sigma_uu, + CalcSigma(func_name, eval, U, sigmasq, D_l, X, OmegaU, OmegaE, UltVeh, Qi, V_e_temp, Sigma_uu, Sigma_ee); // Update V_g and V_e. - UpdateV(eval, eval_vec, sigmasq, U_hat, E_hat, Sigma_uu, Sigma_ee, V_e_temp, V_g, V_e); + UpdateV(eval, U, sigmasq, U_hat, E_hat, Sigma_uu, Sigma_ee, V_e_temp, V_g, V_e); // print statements //print iteration number: cout<< t<size, d_size = Hiy->size1; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double delta, ve, epsilon, d; for (size_t i = 0; i < d_size; d++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1438,7 +1439,7 @@ void Calc_xHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ return; } -void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigma, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i, +void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigma, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i, const size_t j, gsl_matrix *xHiDHix_g, gsl_matrix *xHiDHix_e) { gsl_matrix_set_zero(xHiDHix_g); @@ -1447,11 +1448,11 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ size_t n_size = eval->size, dc_size = xHi->size1; size_t d_size = xHi->size2 / n_size; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double delta, ve, epsilon; @@ -1460,9 +1461,9 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1502,7 +1503,7 @@ void Calc_xHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ return; } -void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, +void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &yHiDHiDHiy_gg, double &yHiDHiDHiy_ee, double &yHiDHiDHiy_ge) { @@ -1512,20 +1513,20 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const g size_t n_size = eval->size, d_size = Hiy->size1; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double delta, ve, epsilon, d_Hiy_i1, d_Hiy_j1, d_Hiy_i2, d_Hiy_j2; double d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1576,7 +1577,7 @@ void Calc_yHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const g return; } -void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, +void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_vector *xHiDHiDHiy_gg, @@ -1587,11 +1588,11 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const g size_t n_size = eval->size, d_size = Hiy->size1; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double delta, ve, epsilon, d_Hiy_i, d_Hiy_j, d_Hi_i1i2, d_Hi_i1j2; double d_Hi_j1i2, d_Hi_j1j2; @@ -1599,9 +1600,9 @@ void Calc_xHiDHiDHiy(const gsl_vector *eval, const gsl_matrix *eval_vec, const g for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1673,7 +1674,7 @@ for (size_t i = 0; i < d_size; i++) { return; } -void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, +void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const gsl_matrix *xHi, const size_t i1, const size_t j1, const size_t i2, const size_t j2, gsl_matrix *xHiDHiDHix_gg, gsl_matrix *xHiDHiDHix_ee, @@ -1688,19 +1689,19 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const g gsl_matrix *mat_dcdc = gsl_matrix_alloc(dc_size, dc_size); - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1795,7 +1796,7 @@ void Calc_xHiDHiDHix(const gsl_vector *eval, const gsl_matrix *eval_vec, const g return; } -void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i, +void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i, const size_t j, double &tHiD_g, double &tHiD_e) { tHiD_g = 0.0; tHiD_e = 0.0; @@ -1803,18 +1804,18 @@ void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl size_t n_size = eval->size, d_size = Hi->size1; double delta, ve, epsilon, d; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -1836,7 +1837,7 @@ void Calc_traceHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl return; } -void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, +void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *V_e_temp, const size_t i1, const size_t j1, const size_t i2, const size_t j2, double &tHiDHiD_gg, double &tHiDHiD_ee, double &tHiDHiD_ge) { @@ -1847,17 +1848,17 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const size_t n_size = eval->size, d_size = Hi->size1; double delta, ve, epsilon, d_Hi_i1i2, d_Hi_i1j2, d_Hi_j1i2, d_Hi_j1j2; - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); for (size_t i = 0; i < d_size; i++) { ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); for (size_t k = 0; k < n_size; k++) { @@ -1899,7 +1900,7 @@ void Calc_traceHiDHiD(const gsl_vector *eval, const gsl_matrix *eval_vec, const } // trace(PD) = trace((Hi-HixQixHi)D)=trace(HiD) - trace(HixQixHiD) -void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, +void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHiDHix_all_g, const gsl_matrix *xHiDHix_all_e, const size_t i, const size_t j, double &tPD_g, double &tPD_e) { @@ -1909,7 +1910,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ double d; // Calculate the first part: trace(HiD). - Calc_traceHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i, j, tPD_g, tPD_e); + Calc_traceHiD(eval, U, sigmasq, Hi, V_e_temp, i, j, tPD_g, tPD_e); // Calculate the second part: -trace(HixQixHiD). for (size_t k = 0; k < dc_size; k++) { @@ -1931,7 +1932,7 @@ void Calc_tracePD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ // trace(PDPD) = trace((Hi-HixQixHi)D(Hi-HixQixHi)D) // = trace(HiDHiD) - trace(HixQixHiDHiD) // - trace(HiDHixQixHiD) + trace(HixQixHiDHixQixHiD) -void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, +void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *V_e_temp, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *QixHiDHix_all_g, const gsl_matrix *QixHiDHix_all_e, @@ -1947,7 +1948,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gs double d; // Calculate the first part: trace(HiDHiD). - Calc_traceHiDHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); + Calc_traceHiDHiD(eval, U, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); // Calculate the second and third parts: // -trace(HixQixHiDHiD) - trace(HiDHixQixHiD) @@ -1997,7 +1998,7 @@ void Calc_tracePDPD(const gsl_vector *eval, const gsl_matrix *eval_vec, const gs } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, +void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiy_all_g, gsl_matrix *xHiDHiy_all_e) { gsl_matrix_set_zero(xHiDHiy_all_g); @@ -2016,14 +2017,14 @@ void Calc_xHiDHiy_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_vector_view xHiDHiy_g = gsl_matrix_column(xHiDHiy_all_g, v); gsl_vector_view xHiDHiy_e = gsl_matrix_column(xHiDHiy_all_e, v); - Calc_xHiDHiy(eval, eval_vec, sigmasq, xHi, Hiy, V_e_temp, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); + Calc_xHiDHiy(eval, U, sigmasq, xHi, Hiy, V_e_temp, i, j, &xHiDHiy_g.vector, &xHiDHiy_e.vector); } } return; } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, +void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHix_all_g, gsl_matrix *xHiDHix_all_e) { gsl_matrix_set_zero(xHiDHix_all_g); gsl_matrix_set_zero(xHiDHix_all_e); @@ -2043,14 +2044,14 @@ void Calc_xHiDHix_all(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix_view xHiDHix_e = gsl_matrix_submatrix(xHiDHix_all_e, 0, v * dc_size, dc_size, dc_size); - Calc_xHiDHix(eval, eval_vec, sigmasq, V_e_temp, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); + Calc_xHiDHix(eval, U, sigmasq, V_e_temp, xHi, i, j, &xHiDHix_g.matrix, &xHiDHix_e.matrix); } } return; } // Calculate (xHiDHiy) for every pair (i,j). -void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, gsl_matrix *xHiDHiDHiy_all_gg, gsl_matrix *xHiDHiDHiy_all_ee, @@ -2083,7 +2084,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ gsl_vector_view xHiDHiDHiy_ge = gsl_matrix_column(xHiDHiDHiy_all_ge, v1 * v_size + v2); - Calc_xHiDHiDHiy(eval, eval_vec, sigmasq, Hi, xHi, Hiy, V_e_temp, i1, j1, i2, j2, + Calc_xHiDHiDHiy(eval, U, sigmasq, Hi, xHi, Hiy, V_e_temp, i1, j1, i2, j2, &xHiDHiDHiy_gg.vector, &xHiDHiDHiy_ee.vector, &xHiDHiDHiy_ge.vector); } @@ -2094,7 +2095,7 @@ void Calc_xHiDHiDHiy_all(const size_t v_size, const gsl_vector *eval, const gsl_ } // Calculate (xHiDHix) for every pair (i,j). -void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, gsl_matrix *xHiDHiDHix_all_gg, gsl_matrix *xHiDHiDHix_all_ee, @@ -2134,7 +2135,7 @@ void Calc_xHiDHiDHix_all(const size_t v_size, const gsl_vector *eval, const gsl_ xHiDHiDHix_all_ge, 0, (v1 * v_size + v2) * dc_size, dc_size, dc_size); - Calc_xHiDHiDHix(eval, eval_vec, sigmasq, Hi, V_e_temp, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, + Calc_xHiDHiDHix(eval, U, sigmasq, Hi, V_e_temp, xHi, i1, j1, i2, j2, &xHiDHiDHix_gg1.matrix, &xHiDHiDHix_ee1.matrix, &xHiDHiDHix_ge1.matrix); if (v2 != v1) { @@ -2236,7 +2237,7 @@ void Calc_QiMat_all(const gsl_matrix *Qi, const gsl_matrix *mat_all_g, // yPDPy = y(Hi-HixQixHi)D(Hi-HixQixHi)y // = ytHiDHiy - (yHix)Qi(xHiDHiy) - (yHiDHix)Qi(xHiy) // + (yHix)Qi(xHiDHix)Qi(xtHiy) -void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, +void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hiy, const gsl_matrix *V_e_temp, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *xHiDHixQixHiy_all_g, @@ -2248,7 +2249,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ma double d; // First part: ytHiDHiy. - Calc_yHiDHiy(eval, eval_vec, sigmasq, Hiy, V_e_temp, i, j, yPDPy_g, yPDPy_e); + Calc_yHiDHiy(eval, U, sigmasq, Hiy, V_e_temp, i, j, yPDPy_g, yPDPy_e); // Second and third parts: -(yHix)Qi(xHiDHiy)-(yHiDHix)Qi(xHiy) gsl_vector_const_view xHiDHiy_g = gsl_matrix_const_column(xHiDHiy_all_g, v); @@ -2282,7 +2283,7 @@ void Calc_yPDPy(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_ma // + (yHix)Qi(xHiDHiDHix)Qi(xHiy) // - (yHix)Qi(xHiDHix)Qi(xHiDHix)Qi(xHiy) void Calc_yPDPDPy( - const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, + const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *V_e_temp, const gsl_matrix *Hiy, const gsl_vector *QixHiy, const gsl_matrix *xHiDHiy_all_g, const gsl_matrix *xHiDHiy_all_e, const gsl_matrix *QixHiDHiy_all_g, const gsl_matrix *QixHiDHiy_all_e, @@ -2304,7 +2305,7 @@ void Calc_yPDPDPy( gsl_vector *xHiDHiDHixQixHiy = gsl_vector_alloc(dc_size); // First part: yHiDHiDHiy. - Calc_yHiDHiDHiy(eval, eval_vec, sigmasq, Hi, Hiy, V_e_temp, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, + Calc_yHiDHiDHiy(eval, U, sigmasq, Hi, Hiy, V_e_temp, i1, j1, i2, j2, yPDPDPy_gg, yPDPDPy_ee, yPDPDPy_ge); // Second and third parts: @@ -2733,7 +2734,7 @@ void CalcCRT(const gsl_matrix *Hessian_inv, const gsl_matrix *Qi, } // Calculate first-order and second-order derivatives. -void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *Qi, +void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *Qi, const gsl_matrix *Hi, const gsl_matrix *xHi, const gsl_matrix *Hiy, const gsl_vector *QixHiy, gsl_vector *gradient, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, @@ -2778,14 +2779,14 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eva gsl_matrix_alloc(dc_size, v_size * v_size * dc_size); // Calculate xHiDHiy_all, xHiDHix_all and xHiDHixQixHiy_all. - Calc_xHiDHiy_all(eval, eval_vec, sigmasq, xHi, V_e_temp, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); - Calc_xHiDHix_all(eval, eval_vec, sigmasq, xHi, V_e_temp, xHiDHix_all_g, xHiDHix_all_e); + Calc_xHiDHiy_all(eval, U, sigmasq, xHi, V_e_temp, Hiy, xHiDHiy_all_g, xHiDHiy_all_e); + Calc_xHiDHix_all(eval, U, sigmasq, xHi, V_e_temp, xHiDHix_all_g, xHiDHix_all_e); Calc_xHiDHixQixHiy_all(xHiDHix_all_g, xHiDHix_all_e, QixHiy, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e); - Calc_xHiDHiDHiy_all(v_size, eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, Hiy, xHiDHiDHiy_all_gg, + Calc_xHiDHiDHiy_all(v_size, eval, U, sigmasq, Hi, xHi, V_e_temp, Hiy, xHiDHiDHiy_all_gg, xHiDHiDHiy_all_ee, xHiDHiDHiy_all_ge); - Calc_xHiDHiDHix_all(v_size, eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, xHiDHiDHix_all_gg, + Calc_xHiDHiDHix_all(v_size, eval, U, sigmasq, Hi, xHi, V_e_temp, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge); // Calculate QixHiDHiy_all, QixHiDHix_all and QixHiDHixQixHiy_all. @@ -2808,18 +2809,18 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eva } v1 = GetIndex(i1, j1, d_size); - Calc_yPDPy(eval, eval_vec, sigmasq, Hiy, V_e_temp, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPy(eval, U, sigmasq, Hiy, V_e_temp, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, i1, j1, yPDPy_g, yPDPy_e); if (func_name == 'R' || func_name == 'r') { - Calc_tracePD(eval, eval_vec, sigmasq, Qi, V_e_temp, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, + Calc_tracePD(eval, U, sigmasq, Qi, V_e_temp, Hi, xHiDHix_all_g, xHiDHix_all_e, i1, j1, tPD_g, tPD_e); dev1_g = -0.5 * tPD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tPD_e + 0.5 * yPDPy_e; } else { - Calc_traceHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, tHiD_g, tHiD_e); + Calc_traceHiD(eval, U, sigmasq, Hi, V_e_temp, i1, j1, tHiD_g, tHiD_e); dev1_g = -0.5 * tHiD_g + 0.5 * yPDPy_g; dev1_e = -0.5 * tHiD_e + 0.5 * yPDPy_e; @@ -2839,7 +2840,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eva continue; } - Calc_yPDPDPy(eval, eval_vec, sigmasq, Hi, xHi, V_e_temp, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, + Calc_yPDPDPy(eval, U, sigmasq, Hi, xHi, V_e_temp, Hiy, QixHiy, xHiDHiy_all_g, xHiDHiy_all_e, QixHiDHiy_all_g, QixHiDHiy_all_e, xHiDHixQixHiy_all_g, xHiDHixQixHiy_all_e, QixHiDHixQixHiy_all_g, QixHiDHixQixHiy_all_e, xHiDHiDHiy_all_gg, @@ -2849,7 +2850,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eva // AI for REML. if (func_name == 'R' || func_name == 'r') { - Calc_tracePDPD(eval, eval_vec, sigmasq, Qi, V_e_temp, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, + Calc_tracePDPD(eval, U, sigmasq, Qi, V_e_temp, Hi, xHi, QixHiDHix_all_g, QixHiDHix_all_e, xHiDHiDHix_all_gg, xHiDHiDHix_all_ee, xHiDHiDHix_all_ge, i1, j1, i2, j2, tPDPD_gg, tPDPD_ee, tPDPD_ge); @@ -2858,7 +2859,7 @@ void CalcDev(const char func_name, const gsl_vector *eval, const gsl_matrix *eva dev2_ee = 0.5 * tPDPD_ee - yPDPDPy_ee; dev2_ge = 0.5 * tPDPD_ge - yPDPDPy_ge; } else { - Calc_traceHiDHiD(eval, eval_vec, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, + Calc_traceHiDHiD(eval, U, sigmasq, Hi, V_e_temp, i1, j1, i2, j2, tHiDHiD_gg, tHiDHiD_ee, tHiDHiD_ge); dev2_gg = 0.5 * tHiDHiD_gg - yPDPDPy_gg; @@ -2982,7 +2983,7 @@ void UpdateVgVe(const gsl_matrix *Hessian_inv, const gsl_vector *gradient, } double MphNR(const char func_name, const size_t max_iter, const double max_prec, - const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, + const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, gsl_matrix *Hi_all, gsl_matrix *xHi_all, gsl_matrix *Hiy_all, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *Hessian_inv, double &crt_a, double &crt_b, double &crt_c) { @@ -3071,7 +3072,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // If flag_pd==1, continue to calculate quantities // and logl. if (flag_pd == 1) { - CalcHiQi(eval, eval_vec, sigmasq, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); + CalcHiQi(eval, U, sigmasq, X, V_g, V_e, Hi_all, Qi, logdet_H, logdet_Q); Calc_Hiy_all(Y, Hi_all, Hiy_all); Calc_xHi_all(X, Hi_all, xHi_all); @@ -3112,7 +3113,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, logl_old = logl_new; - CalcDev(func_name, eval, eval_vec, sigmasq, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, + CalcDev(func_name, eval, U, sigmasq, Qi, Hi_all, xHi_all, Hiy_all, QixHiy, gradient, Hessian_inv, crt_a, crt_b, crt_c); } @@ -3140,7 +3141,7 @@ double MphNR(const char func_name, const size_t max_iter, const double max_prec, // Initialize Vg, Ve and B. void MphInitial(const size_t em_iter, const double em_prec, const size_t nr_iter, const double nr_prec, - const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *X, + const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *X, const gsl_matrix *Y, const double l_min, const double l_max, const size_t n_region, gsl_matrix *V_g, gsl_matrix *V_e, gsl_matrix *B) { @@ -3164,9 +3165,9 @@ void MphInitial(const size_t em_iter, const double em_prec, for (size_t i = 0; i < d_size; i++) { gsl_vector_const_view Y_row = gsl_matrix_const_row(Y, i); - CalcLambda('R', eval, eval_vec, sigmasq, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, + CalcLambda('R', eval, U, sigmasq, Xt, &Y_row.vector, l_min, l_max, n_region, lambda, logl); - CalcLmmVgVeBeta(eval, eval_vec, sigmasq, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, + CalcLmmVgVeBeta(eval, U, sigmasq, Xt, &Y_row.vector, lambda, vg, ve, beta_temp, se_beta_temp); gsl_matrix_set(V_g, i, i, vg); @@ -3225,10 +3226,10 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_matrix_set(Vg_sub, 1, 1, gsl_matrix_get(V_g, j, j)); gsl_matrix_set(Ve_sub, 1, 1, gsl_matrix_get(V_e, j, j)); - logl = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, X, Y_sub, U_hat, E_hat, + logl = MphEM('R', em_iter, em_prec, eval, U, sigmasq, X, Y_sub, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, Vg_sub, Ve_sub, B_sub); - logl = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, X, Y_sub, Hi_all, xHi_all, + logl = MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, X, Y_sub, Hi_all, xHi_all, Hiy_all, Vg_sub, Ve_sub, Hessian, a, b, c); gsl_matrix_set(V_g, i, j, gsl_matrix_get(Vg_sub, 0, 1)); @@ -3272,11 +3273,11 @@ void MphInitial(const size_t em_iter, const double em_prec, gsl_vector_set_zero(XHiy); - gsl_matrix *eval_vec_T = gsl_matrix_alloc(n_size, n_size); + gsl_matrix *U_T = gsl_matrix_alloc(n_size, n_size); gsl_matrix *Sigma = gsl_matrix_alloc(n_size, n_size); - // Transpose eval_vec - gsl_matrix_transpose_memcpy(eval_vec_T, eval_vec); + // Transpose U + gsl_matrix_transpose_memcpy(U_T, U); double logdet_Ve, dl, d, delta, epsilon, dx, dy; @@ -3286,7 +3287,7 @@ void MphInitial(const size_t em_iter, const double em_prec, // Calculate Qi and log|Q|. // double logdet_Q = CalcQi(eval, D_l, X, V_e_temp, Qi); - CalcQi(eval, eval_vec, sigmasq, D_l, X, V_e_temp, Qi); + CalcQi(eval, U, sigmasq, D_l, X, V_e_temp, Qi); // Calculate UltVehiY. gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, UltVehi, Y, 0.0, UltVehiY); @@ -3296,9 +3297,9 @@ void MphInitial(const size_t em_iter, const double em_prec, dl = gsl_vector_get(D_l, i); ve = gsl_matrix_get(V_e_temp, i, i); - // Calculate Sigma = t(eval_vec) %*% (sigmasq / V_e_temp[i]) %*% eval_vec + // Calculate Sigma = t(U) %*% (sigmasq / V_e_temp[i]) %*% U gsl_matrix_set_zero(Sigma); - gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, eval_vec_T, eval_vec, 0.0, Sigma); + gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, U_T, U, 0.0, Sigma); double scalar = sigmasq / ve; gsl_matrix_scale(Sigma, scalar); @@ -3361,7 +3362,7 @@ double PCRT(const size_t mode, const size_t d_size, const double p_value, return p_crt; } -void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); igzstream infile(file_geno.c_str(), igzstream::in); @@ -3444,15 +3445,15 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, U, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3512,13 +3513,13 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, U, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3681,32 +3682,32 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -3717,17 +3718,17 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -3799,7 +3800,7 @@ void MVLMM::AnalyzeBimbam(const gsl_matrix *U, const gsl_vector *eval, const gsl return; } -void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY) { debug_msg("entering"); string file_bed = file_bfile + ".bed"; @@ -3881,18 +3882,18 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ gsl_vector_view B_col = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub.matrix); write(eval,"eval4"); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, U, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -3955,13 +3956,13 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, U, sigmasq, &X_sub.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, U, sigmasq, &X_sub.matrix, Y, Hi_all, &xHi_all_sub.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub.matrix, Y, V_g, V_e, UltVehiY, &B_sub.matrix, se_B_null); c = 0; @@ -4163,33 +4164,33 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g_null, + p_score = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -4199,17 +4200,17 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row.vector, &X_sub.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4282,7 +4283,7 @@ void MVLMM::AnalyzePlink(const gsl_matrix *U, const gsl_vector *eval, const gsl_ // Calculate Vg, Ve, B, se(B) in the null mvLMM model. // Both B and se_B are d by c matrices. -void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min, @@ -4322,13 +4323,13 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix_transpose_memcpy(W, UtW); // Initial, EM, NR, and calculate B. - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, W, Y, l_min, l_max, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, U, sigmasq, W, Y, l_min, l_max, n_region, V_g, V_e, B); - MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, W, Y, U_hat, E_hat, OmegaU, OmegaE, + MphEM('R', em_iter, em_prec, eval, U, sigmasq, W, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, W, Y, Hi_all, xHi_all, Hiy_all, V_g, + MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, W, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, W, Y, V_g, V_e, UltVehiY, B, se_B); + MphCalcBeta(eval, U, sigmasq, W, Y, V_g, V_e, UltVehiY, B, se_B); // Free matrices. gsl_matrix_free(U_hat); @@ -4351,7 +4352,7 @@ void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *eval_vec, const return; } -void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); @@ -4443,15 +4444,15 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, U, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4511,13 +4512,13 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, U, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4653,24 +4654,24 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -4679,32 +4680,32 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); @@ -4715,17 +4716,17 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eval_vec, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { @@ -4797,7 +4798,7 @@ void MVLMM::AnalyzeBimbamGXE(const gsl_matrix *U, const gsl_vector *eval, const return; } -void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *eval_vec, const gsl_matrix *sigmasq, +void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *U, const gsl_matrix *sigmasq, const gsl_matrix *UtW, const gsl_matrix *UtY, const gsl_vector *env) { debug_msg("entering"); @@ -4888,16 +4889,16 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g gsl_vector_view B_col2 = gsl_matrix_column(B, c_size); gsl_vector_set_zero(&B_col2.vector); - MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, l_min, + MphInitial(em_iter, em_prec, nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, l_min, l_max, n_region, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphEM('R', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('R', em_iter, em_prec, eval, U, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('R', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('R', nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -4956,13 +4957,13 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g } cout << "REMLE likelihood = " << logl_H0 << endl; - logl_H0 = MphEM('L', em_iter, em_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, + logl_H0 = MphEM('L', em_iter, em_prec, eval, U, sigmasq, &X_sub1.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub1.matrix); - logl_H0 = MphNR('L', nr_iter, nr_prec, eval, eval_vec, sigmasq, &X_sub1.matrix, Y, Hi_all, + logl_H0 = MphNR('L', nr_iter, nr_prec, eval, U, sigmasq, &X_sub1.matrix, Y, Hi_all, &xHi_all_sub1.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub1.matrix, Y, V_g, V_e, UltVehiY, &B_sub1.matrix, se_B_null1); c = 0; @@ -5129,24 +5130,24 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g if (a_mode == 2 || a_mode == 3 || a_mode == 4) { if (a_mode == 3 || a_mode == 4) { - logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq, &X_sub2.matrix, + logl_H0 = MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } if (a_mode == 2 || a_mode == 4) { - logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, &X_sub2.matrix, + logl_H0 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, &B_sub2.matrix); - logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, &X_sub2.matrix, + logl_H0 = MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, &X_sub2.matrix, Y, Hi_all, &xHi_all_sub2.matrix, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - MphCalcBeta(eval, eval_vec, sigmasq,, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, + MphCalcBeta(eval, U, sigmasq, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, &B_sub2.matrix, se_B_null2); } } @@ -5155,33 +5156,33 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g // 3 is before 1. if (a_mode == 3 || a_mode == 4) { - p_score = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, + p_score = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g_null, V_e_null, UltVehiY, beta, Vbeta); if (p_score < p_nr && crt == 1) { - logl_H1 = MphNR('R', 1, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, + logl_H1 = MphNR('R', 1, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); p_score = PCRT(3, d_size, p_score, crt_a, crt_b, crt_c); } } if (a_mode == 2 || a_mode == 4) { - logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, + logl_H1 = MphEM('L', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (p_lrt < p_nr) { logl_H1 = - MphNR('L', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, + MphNR('L', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); // Calculate beta and Vbeta. - p_lrt = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_lrt = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); p_lrt = gsl_cdf_chisq_Q(2.0 * (logl_H1 - logl_H0), (double)d_size); if (crt == 1) { @@ -5191,17 +5192,17 @@ void MVLMM::AnalyzePlinkGXE(const gsl_matrix *U, const gsl_vector *eval, const g } if (a_mode == 1 || a_mode == 4) { - logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, eval_vec, sigmasq,, X, Y, U_hat, E_hat, + logl_H1 = MphEM('R', em_iter / 10, em_prec * 10, eval, U, sigmasq, X, Y, U_hat, E_hat, OmegaU, OmegaE, UltVehiY, UltVehiBX, UltVehiU, UltVehiE, V_g, V_e, B); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (p_wald < p_nr) { logl_H1 = - MphNR('R', nr_iter / 10, nr_prec * 10, eval, eval_vec, sigmasq,, X, Y, Hi_all, xHi_all, + MphNR('R', nr_iter / 10, nr_prec * 10, eval, U, sigmasq, X, Y, Hi_all, xHi_all, Hiy_all, V_g, V_e, Hessian, crt_a, crt_b, crt_c); - p_wald = MphCalcP(eval, eval_vec, sigmasq,, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, + p_wald = MphCalcP(eval, U, sigmasq, &X_row2.vector, &X_sub2.matrix, Y, V_g, V_e, UltVehiY, beta, Vbeta); if (crt == 1) { From bb4db7234e9e89473e25f2c801f05dbe0ff146bb Mon Sep 17 00:00:00 2001 From: jb621-star <65730803+jb621-star@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:36:12 -0400 Subject: [PATCH 37/37] Update mvlmm.h Removed eigenvectors U from CalcMvLmmVgVeBeta parameters. --- src/mvlmm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mvlmm.h b/src/mvlmm.h index 7fa6d94..df776be 100644 --- a/src/mvlmm.h +++ b/src/mvlmm.h @@ -95,7 +95,7 @@ class MVLMM { void WriteFiles(); }; -void CalcMvLmmVgVeBeta(const gsl_matrix *U, const gsl_vector *eval, const gsl_matrix *UtW, +void CalcMvLmmVgVeBeta(const gsl_vector *eval, const gsl_matrix *UtW, const gsl_matrix *UtY, const size_t em_iter, const size_t nr_iter, const double em_prec, const double nr_prec, const double l_min,