void Structure::initialiseVariables(Random &ran,int oneDelta) { // // initialise remaining fixed variables // alphaA = 1.0; betaA = 1.0; pA0 = 0.0; pA1 = 0.0; alphaB = 1.0; betaB = 1.0; pB0 = 0.0; pB1 = 0.0; nuR = Q + 1.0; nuRho = Q + 1.0; alphaXi = 1.0; betaXi = 1.0; c2Max = 1.0; // // initialise variable parameters // int isneg = 0; do { rho = ran.CorrelationStandardInverseWishart(Q,nuRho); r = ran.CorrelationStandardInverseWishart(Q,nuR); isneg = 0; int p,q; for (p = 0; p < Q; p++) for (q = 0; q < Q; q++) { isneg += (r[p][q] < 0.0); isneg += (rho[p][q] < 0.0); } } while (isneg > 0); gamma2 = 1.0; c2 = c2Max / 2.0; int q; for (q = 0; q < Q; q++) { tau2R[q] = 1.0; tau2Rho[q] = 1.0; } for (q = 0; q < Q; q++) { t[q] = 1.0; l[q] = 1.0; } for (q = 0; q < Q; q++) { int g; for (g = 0; g < G; g++) sigma2[q][g] = ran.InverseGamma(t[q],l[q]); } for (q = 0; q < Q; q++) { a[q] = ran.Beta(alphaA,betaA); b[q] = ran.Beta(alphaB,betaB); } int g; for (g = 0; g < G; g++) { vector<vector<double> > Sigma; Sigma.resize(Q); for (q = 0; q < Q; q++) Sigma[q].resize(Q); int p; for (p = 0; p < Q; p++) for (q = 0; q < Q; q++) { Sigma[p][q] = gamma2; if (p != q) Sigma[p][q] *= rho[p][q]; Sigma[p][q] *= sqrt(tau2Rho[p] * tau2Rho[q]); Sigma[p][q] *= exp(0.5 * (a[q] * log(sigma2[q][g]) + a[p] * log(sigma2[p][g]))); } vector<double> zero(Q,0); vector<double> value(Q,0); value = ran.MultiGaussian(Sigma,zero); for (q = 0; q < Q; q++) nu[q][g] = value[q]; } for (g = 0; g < G; g++) { vector<vector<double> > R; R.resize(Q); for (q = 0; q < Q; q++) R[q].resize(Q); int p; for (p = 0; p < Q; p++) for (q = 0; q < Q; q++) { R[p][q] = c2; if (p != q) R[p][q] *= r[p][q]; R[p][q] *= sqrt(tau2R[p] * tau2R[q]); R[p][q] *= exp(0.5 * (b[q] * log(sigma2[q][g]) + b[p] * log(sigma2[p][g]))); } vector<double> zero(Q,0); vector<double> value(Q,0); value = ran.MultiGaussian(R,zero); for (q = 0; q < Q; q++) Delta[q][g] = value[q]; } if (oneDelta == 0) { for (q = 0; q < Q; q++) xi[q] = ran.Beta(alphaXi,betaXi); for (q = 0; q < Q; q++) for (g = 0; g < G; g++) delta[q][g] = (ran.Unif01() <= xi[q]); } else { xi[0] = ran.Beta(alphaXi,betaXi); for (q = 1; q < Q; q++) xi[q] = xi[0]; for (g = 0; g < G; g++) { int dd = (ran.Unif01() <= xi[0]); for (q = 0; q < Q; q++) delta[q][g] = dd; } } for (q = 0; q < Q; q++) { theta[q] = 1.0; lambda[q] = 1.0; } for (q = 0; q < Q; q++) for (g = 0; g < G; g++) phi[q][g] = ran.Gamma(theta[q],lambda[q]); return; }