/** * Compute relative weights based on sample size in m_O; **/ void logistic_normal::compute_relative_weights() { m_dWy.allocate(m_y1,m_y2); dvector dNy = rowsum(m_O); double dN = mean(dNy); m_dWy = sqrt( dN / dNy ); }
void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, double *hy, double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy) { *h = *hx = *hy = *hxgy = *hygx = *uygx = *uxgy = *uxy = 0; autoNUMvector<double> rowsum (1, my numberOfRows); autoNUMvector<double> colsum (1, my numberOfColumns); // row and column totals double sum = 0.0; for (long i = 1; i <= my numberOfRows; i++) { for (long j = 1; j <= my numberOfColumns; j++) { rowsum[i] += my data[i][j]; colsum[j] += my data[i][j]; } sum += rowsum[i]; } // Entropy of x distribution for (long j = 1; j <= my numberOfColumns; j++) { if (colsum[j] > 0.0) { double p = colsum[j] / sum; *hx -= p * NUMlog2 (p); } } // Entropy of y distribution for (long i = 1; i <= my numberOfRows; i++) { if (rowsum[i] > 0.0) { double p = rowsum[i] / sum; *hy -= p * NUMlog2 (p); } } // Total entropy for (long i = 1; i <= my numberOfRows; i++) { for (long j = 1; j <= my numberOfColumns; j++) { if (my data[i][j] > 0.0) { double p = my data[i][j] / sum; *h -= p * NUMlog2 (p); } } } // Conditional entropies *hygx = *h - *hx; *hxgy = *h - *hy; *uygx = (*hy - *hygx) / (*hy + TINY); *uxgy = (*hx - *hxgy) / (*hx + TINY); *uxy = 2.0 * (*hx + *hy - *h) / (*hx + *hy + TINY); }
/** \ingroup matop Matrix exponential. The matrix exponential is calculated using the Pade approximation adapted from Moler, Cleve; Van Loan, Charles F. (2003), "Nineteen Dubious Ways to Compute the Exponential of a Matrix, Twenty-Five Years Later" The main use of the matrix exponential is to solve linear ordinary differential equation (ODE) systems: \f[ \frac{d}{dt}y(t) = Ay(t)\ , \ \mbox{with } y(0) = y_0 \f] \item then the solution becomes \f[ y(t) = e^{At}y_0 \f] \param A square df1b2matrix \returns The matrix exponential of A */ df1b2matrix expm(const df1b2matrix & A) { RETURN_ARRAYS_INCREMENT(); int rmin = A.rowmin(); int rmax = A.rowmax(); if(rmax != A.colmax()) {cout<<"Error: Not square matrix in expm."<<endl; ad_exit(1);} if(rmin != A.colmin()) {cout<<"Error: Not square matrix in expm."<<endl; ad_exit(1);} df1b2matrix I(rmin,rmax,rmin,rmax); df1b2matrix AA(rmin,rmax,rmin,rmax); df1b2matrix X(rmin,rmax,rmin,rmax); df1b2matrix E(rmin,rmax,rmin,rmax); df1b2matrix D(rmin,rmax,rmin,rmax); df1b2matrix cX(rmin,rmax,rmin,rmax); I.initialize(); for(int i = rmin; i<=rmax; ++i){I(i,i) = 1.0;} df1b2variable log2NormInf; log2NormInf = log(max(rowsum(fabs(value(A))))); log2NormInf/=log(2.0); int e = (int)value(log2NormInf) + 1; int s = e+1; s = (s<0) ? 0 : s; AA = 1.0/pow(2.0,s)*A; X = AA; df1b2variable c = 0.5; E = I+c*AA; D = I-c*AA; int q = 6, p = 1; for(int k = 2; k<=q; ++k){ c*=((double)q-k+1.0)/((double)k*(2*q-k+1)); X = AA*X; cX = c*X; E+=cX; if(p==1){D+=cX;}else{D-=cX;} p = (p==1) ? 0 : 1; } // E = inv(D)*E; E = solve(D,E); for(int k = 1; k<=s; ++k){ E = E*E; } RETURN_ARRAYS_DECREMENT(); return E; }
void ContingencyTable_chisq (ContingencyTable me, double *chisq, long *df) { long nr = my numberOfRows, nc = my numberOfColumns; *chisq = 0; *df = 0; autoNUMvector<double> rowsum (1, nr); autoNUMvector<double> colsum (1, nc); /* row and column marginals */ double sum = 0; for (long i = 1; i <= my numberOfRows; i++) { for (long j = 1; j <= my numberOfColumns; j++) { rowsum[i] += my data[i][j]; colsum[j] += my data[i][j]; } sum += rowsum[i]; } for (long i = 1; i <= my numberOfRows; i++) { if (rowsum[i] == 0) { --nr; } } for (long j = 1; j <= my numberOfColumns; j++) { if (colsum[j] == 0) { --nc; } } *df = (nr - 1) * (nc - 1); for (long i = 1; i <= my numberOfRows; i++) { if (rowsum[i] == 0) { continue; } for (long j = 1; j <= my numberOfColumns; j++) { if (colsum[j] == 0) { continue; } double expt = rowsum[i] * colsum[j] / sum; double tmp = my data[i][j] - expt; *chisq += tmp * tmp / expt; } } }