mat concentrate_step(mat x, umat x_nonmiss, vec pu, vec pmd, uvec x_miss_group_match, umat miss_group_unique, uvec miss_group_counts, umat miss_group_obs_col, umat miss_group_mis_col, uvec miss_group_p, int miss_group_n, int n, int n_half, int p, vec theta0, mat G, int d, int EM_maxits, double* xh_mem, unsigned int* misgrpuqh_mem, unsigned int* msgrpcth_mem, unsigned int* msgrpoch_mem, unsigned int* msgrpmch_mem, unsigned int* msgrpph_mem) { // information required for subsampling mat x_half(xh_mem, n_half, p, false, true); umat miss_grp_uq_half( misgrpuqh_mem, miss_group_n, p, false, true); miss_grp_uq_half.zeros(); uvec miss_grp_cts_half( msgrpcth_mem, miss_group_n, false, true); miss_grp_cts_half.zeros(); umat miss_grp_oc_half( msgrpoch_mem, miss_group_n, p, false, true); miss_grp_oc_half.zeros(); umat miss_grp_mc_half( msgrpmch_mem, miss_group_n, p, false, true); miss_grp_mc_half.zeros(); uvec miss_grp_p_half( msgrpph_mem, n_half, false, true);miss_grp_p_half.zeros(); int miss_grp_n_half; // compute adjusted pmd vec pmd_adj(n); for(int i = 0; i < n; i++) pmd_adj(i) = R::pchisq(pmd(i), (double) pu(i), 1, 0); double pmd_adj_med = median(pmd_adj); uvec x_half_ind = find( pmd_adj <= pmd_adj_med, n_half); // find new missing pattern based on the halved samples int miss_new_add = -1; for(int i = 0; i < n_half; i++){ int index = (int) x_half_ind(i); x_half.row(i) = x.row( index ); // check whether we found a new missing pattern urowvec check_new_miss(p); if( i == 0 ){ check_new_miss.zeros(); } else{ check_new_miss = (x_nonmiss.row( index ) == miss_grp_uq_half.row( miss_new_add )); } if( sum(check_new_miss)== (unsigned int) p){ // if found same missing pattern miss_grp_cts_half( miss_new_add )++; }else{ // if found a new missing pattern miss_grp_uq_half.row( miss_new_add + 1) = x_nonmiss.row( index ); miss_grp_cts_half( miss_new_add + 1)++; miss_grp_oc_half.row( miss_new_add + 1) = miss_group_obs_col.row( x_miss_group_match( index)-1 ); miss_grp_mc_half.row( miss_new_add + 1) = miss_group_mis_col.row( x_miss_group_match( index)-1 ); miss_grp_p_half( miss_new_add + 1) = miss_group_p( x_miss_group_match( index)-1); miss_new_add++; } } miss_grp_n_half = miss_new_add + 1; mat res = CovEM(x_half, n_half, p, theta0, G, d, miss_grp_uq_half, miss_grp_cts_half, miss_grp_oc_half, miss_grp_mc_half, miss_grp_p_half, miss_grp_n_half, 0.0001, EM_maxits); res.shed_rows(0,1); return res; }
void subsampling(double* subsample_mem, unsigned int* subsamp_nonmis_mem, mat x, umat x_nonmiss, int nSubsampleSize, int p, uvec subsample_id) { mat subsamp( subsample_mem, nSubsampleSize, p, false, true); umat subsamp_nonmiss( subsamp_nonmis_mem, nSubsampleSize, p, false, true); uvec subsample_id_shuff = shuffle(subsample_id); for(int i = 0; i < nSubsampleSize; i++) { subsamp.row(i) = x.row( subsample_id_shuff(i) ); subsamp_nonmiss.row(i) = x_nonmiss.row( subsample_id_shuff(i) ); } }