Skip to content

Document variance correction for sum to zero matrix #973

Description

@WardBrian

Mostly a reminder for @spinkney who said he would add this on slack

Message

I need to add this to the manual. An N-dimensional tensor with variance tau^2 where each dimension sums to 0 through an isotropic sum-to-zero transform will have variance of tau^2 * prod( (d_k - 1) / d_k) so to correct you need tau^2 * prod(d_k / (d_k - 1)) as the correction.

I deliberately coded this to take in the dimensions to be suitable for a sum-to-zero N-d array but it works fine for matrix

functions {
    real s2z_unit_normal_correction (array[] int s2z_dims) {
        int N = num_elements(s2z_dims);
        vector[N] d = to_vector(s2z_dims);
        return sqrt(prod(d ./ (d - 1)));
    }

    real s2z_unit_normal_lpdf (vector z, array[] int s2z_dims) {
        int N = num_elements(s2z_dims);
        vector[N] d = to_vector(s2z_dims);
        return -dot_self(z) + N * 2 * prod(d ./ (d - 1));
    }
}
data {
    int<lower=1> N;
    int<lower=1> M;
    int<lower=0, upper=1> flag;
}
parameters {
    sum_to_zero_matrix[N, M] X;
}
model {
  if (flag == 0) {
    to_vector(X) ~ normal(0, s2z_unit_normal_correction(dims(X)));
  } else {
    to_vector(X) ~ s2z_unit_normal(dims(X));
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions