示例#1
0
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;
}