Estimating a Pooled/Group Variance-Covariance Matrices/Means
Use the VSL_SS_METHOD_1PASS method to compute pooled/group variance-covariance matrices, or pooled/group means.
For the definition of pooled/group variance-covariance matrices, see the Mathematical Notation and Definitions chapter in the Summary Statistics section of [MKLMan].
To compute a pooled variance-covariance and/or a pooled mean, you need to split observations into g groups by allocating array grp_indices of size n, where n is the number of observations. Indices of the groups take values from the range [0,1, ... g-1]. Thus, grp_indices[j]= k if observation j belongs to the group indexed k.
The pooled variance-covariance matrix is packed as a one-dimensional array. For information on available storage formats and memory requirements, see Table Storage formats of a variance-covariance/correlation matrix of the Summary Statistics section of [MKLMan]. The pooled mean estimate is returned in the array that should store at least p elements, where p is the dimension of the task.
You can get estimates for group variance-covariance matrices and/or group means by passing into the library the array grp_cov_indices of size g. This array determines the group variance-covariance matrices and/or means to be returned:
If the group variance-covariance matrix and/or the vector of means are to be returned, grp_cov_indices[idx] = 1.
Otherwise, grp_cov_indices[idx] = 0.
The estimates for group variance-covariance matrices and group means are stored in one-dimensional arrays grp_cov and grp_means, respectively.
The group means are packed in the grp_means array in series. The size of the array should be sufficient for at least p*k elements,
where
p is the dimension of the task.
k is the number of group matrices to be returned.
Group matrices are packed in the grp_cov array in series according to the contents of the array grp_cov_indices. The size of the grp_cov array should be sufficient for at least cov_dim*k
where
cov_dim is the size of a single group matrix defined by the chosen storage format.
k is the number of group matrices to be returned.
The library checks that the initialization of the grp_indices pointer is correct and the values stored in the array are positive. If the initialization is wrong, computation of pooled/group variance-covariance matrix terminates with an error code. In this case, you need to make sure that the grp_indices array contains all values from 0 to g-1 inclusively, and the memory allocated for the grp_cov_indices array is sufficient to hold at least g values.
The example below shows pooled/group variance-covariance matrices that you can get:
#include "mkl_vsl.h"
#define DIM 3 /* dimension of the task */
#define N 1000 /* number of observations */
#define G 2 /* number of groups */
#define GN 2 /* number of group variance-covariance matrices */
int main()
{
int i;
VSLSSTaskPtr task;
double g_indices[N]; /* indices of the groups */
double x[N][DIM]; /* matrix of observations */
double g_cov_indices[G]={1,1}; /* two group matrices to be returned */
double pcov[DIM*DIM]; /* pooled variance-covariance matrix */
double pmean[DIM]; /* array of pooled means */
double gcov[DIM*DIM*GN]; /* array for group variance-covariance matrices */
double gmean[DIM*GN]; /* array for group means */
int status;
MKL_INT p, n, xstorage, pcovstorage, gcovstorage;
unsigned long long estimates;
/* Parameters of the task and initialization */
p = DIM;
n = N;
xstorage = VSL_SS_MATRIX_STORAGE_COLS;
pcovstorage = VSL_SS_MATRIX_STORAGE_FULL;
gcovstorage = VSL_SS_MATRIX_STORAGE_FULL;
/* The first N/2 elements belong to the first group, the rest belong to the second group */
for ( i = 0; i < N/2; i++ )
{
g_indices[i+0] = 0; g_indices[i+N/2] = 1;
}
/* Create a task */
status = vslsSSNewTask( &task, &p, &n, &xstorage, x, 0, 0 );
/* Initialize the task parameters */
status = vslsSSEditTask( task, VSL_SS_ED_POOLED_COV_STORAGE,
&pcovstorage );
status = vslsSSEditTask( task, VSL_SS_ED_GROUP_COV_STORAGE,
&gcovstorage );
status = vsldSSEditPooledCovariance( task, g_indices, pmean,
pcov, g_cov_indices, gmean, gcov );
/* Compute the pooled and group variance-covariance matrices */
estimates = VSL_SS_POOLED_COV|VSL_SS_GROUP_COV;
status = vsldSSCompute( task, estimates, VSL_SS_METHOD_1PASS );
/* Deallocate the task resources */
status = vslSSDeleteTask( &task );
return 0;
}
Computation of pooled/group variance-covariance matrices does not support datasets available in blocks.