moment ============================================== Purpose ---------------- Computes a cross-product matrix. This is the same as x'x. Format ---------------- .. function:: y = moment(x, d) :param x: data :type x: NxK matrix or M-dimensional array where the last two dimensions are NxK :param d: controls handling of missing values. .. list-table:: :widths: auto * - 0 - missing values will not be checked for. This is the fastest option. * - 1 - "listwise deletion" is used. Any row that contains a missing value in any of its elements is excluded from the computation of the moment matrix. If every row in *x* contains missing values, then ``moment(x,1)`` will return a scalar zero. * - 2 - "pairwise deletion" is used. Any element of *x* that is missing is excluded from the computation of the moment matrix. Note that this is seldom a satisfactory method of handling missing values, and special care must be taken in computing the relevant number of observations and degrees of freedom. :type d: scalar :return y: where the last two dimensions are KxK, the cross-product of *x*. :rtype y: KxK matrix or M-dimensional array Examples ---------------- :: rndseed 129070; // Create data x = ones(100, 3)*rndn(100, 3); b_true = {1.3 0.5 0.75 -1.9}; y = x*b_true' + 0.5*rndn(100,3); // Create moment matrix xx = moment(x, 2); // Find inverse of moment matrix ixx = invpd(xx); // Find coefficients b = ixx*missrv(x, 0)'y; print "b_true~b_est"; b_true'~b_est; :: 1.3000000 1.2808949 0.50000000 0.49703322 0.75000000 0.73297298 -1.9000000 -1.8087071 In this example, the regression of *y* on *x* is computed. The moment matrix (*xx*) is formed using the :func:`moment` command (with pairwise deletion, since the second parameter is 2). Then *xx* is inverted using the :func:`invpd` function. Finally, the ols coefficients are computed. :func:`missrv` is used to emulate pairwise deletion by setting missing values to 0. Remarks ------- The fact that the moment matrix is symmetric is taken into account to cut execution time almost in half. If *x* is an array, the result will be an array containing the cross-products of each 2-dimensional array described by the two trailing dimensions of *x*. In other words, for a 10x4x4 array *x*, the resulting array *y* will contain the cross-products of each of the 10 4x4 arrays contained in *x*, so :math:`y[n,.,.]=x[n,.,.]'x[n,.,.]` for :math:`1 <= n <= 10`. If there is no missing data then d = 0 should be used because it will be faster. The ``/`` operator (matrix division) will automatically form a moment matrix (performing pairwise deletions if ``trap 2`` is set) and will compute the ols coefficients of a regression. However, it can only be used for data sets that are small enough to fit into a single matrix. In addition, the moment matrix and its inverse cannot be recovered if the ``/`` operator is used.