public double likelihood() {
    double c1 = 0.0;
    double c3 = -1.0 / (double) Math.sqrt(2.0 * variance);
    double sum = 0.0;

    double cpart = -0.5 * Math.log(Math.sqrt(2.0 * Math.PI * variance));

    for (int i = 0; i < data.size(); i++) {
      for (int k = 0; k < channels.length; k++) {
        c1 += cpart;
        double pi = 0.0;

        for (Integer t : transcripts.keySet()) {
          if (transcripts.get(t).contains(i)) {
            double gammai = gammas[t][k];
            double dit = delta(i, t);

            double pit = gammai * Math.exp(-lambda * dit);
            pi += pit;
          }
        }

        double zi = Math.log(pi);
        double err = data.values(i)[channels[k]] - zi;

        sum += (err * err);
      }
    }

    return c1 + c3 * sum;
  }
  public double error() {
    double sum = 0.0;

    for (int i = 0; i < data.size(); i++) {
      for (int k = 0; k < channels.length; k++) {
        double pi = 0.0;

        for (Integer t : transcripts.keySet()) {
          if (transcripts.get(t).contains(i)) {
            double gammai = gammas[t][k];
            double dit = delta(i, t);

            double pit = gammai * Math.exp(-lambda * dit);
            pi += pit;
          }
        }

        double zi = Math.log(pi);
        double err = Math.abs(data.values(i)[channels[k]] - zi);

        sum += err;
      }
    }

    return sum;
  }