## 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.

**Parent topic:**Algorithms and Interfaces in Summary Statistics