# Hardy-Weinberg Equilibrium

Page Contents

## Hardy-Weinberg using Matrix Algebra

As an extended example of the use of matrices in statistical operations, we will consider the problem of checking for Hardy-Weinberg equilibrium.

Suppose that in a species there are two alleles (types of gene) at one particular locus (position) of the DNA. These are denoted A and a. As each individual has a pair of genes at each locus, an individual can be one of the three genotypes: AA, Aa, or aa.

A population is said to be in Hardy-Weinberg equilibrium if the genotypes are distributed in the ratio:

AA #: Aa #: aa _ _ = _ _ ~p^2 #: 2 ~p (1 - ~p) #: (1 - ~p)^2 _ _ _ some 0 < ~p < 1

Suppose we measure ~n individuals from the population, so that there are ~x_1 individuals of type AA, ~x_2 of type Aa, and ~x_3 of type aa.

We wish to test for equilibrium. First, without going into the theory, we find the estimate for ~p

est{~p} _ _ = _ _ (2~x_1 + ~x_2) / 2~n

From this we can calcuate the expected number for each genotype, if the hypothesis of Hardy-Weinberg equilibrium is true, and hence do the chi-squared test in the usual way.

Let's look at a numerical example. A number of nematode worms have been tested, and the genotypes AA, Aa, and aa found in numbers 27, 30, and 12 respectively. First note that if

est{~p} _ _ = _ _ (2~x_1 + ~x_2) / 2~n _ _ then _ _ 1 - est{~p} _ _ = _ _ (2~x_3 + ~x_2) / 2~n

~nest{~p} _ _ = _ _ ~x_1 + ~x_2/2 ,_ _ _ and _ _ ~n - ~nest{~p} _ _ = _ _ ~x_3 + ~x_2/2

First we define the three column vectors:

```< script >
var wObs = new mathyma.Matrix ("27/30/12");
...
```

Then we can calculate the estimates, and the sum:

```
< script >
var wA = new mathyma.Matrix ("1/0.5/0");
var wB = new mathyma.Matrix ("0/0.5/1");
var nEstP = wObs.Trans().Mult(wA).Det();
var nEstQ = wObs.Trans().Mult(wB).Det();
var ObsTot = nEstP + nEstQ;

document.write("~nest{~p} _ _ = _ _ "  + mathyma.formatDP(nEstP,1) + "< br / > ");
document.write("~n (1 - est{~p}) _ _ = _ _ "   + mathyma.formatDP(nEstQ,1) + "< br / > ");
document.write("~n _ _ = _ _ "   + mathyma.formatDP(ObsTot,1) + "< br / > ");
< /script > ```

Now we can form the column vector of expected values:

```< script >
var wExpArr = new Array();
wExpArr = new Array();
wExpArr = nEstP * nEstP / ObsTot;
wExpArr = new Array();
wExpArr = 2 * nEstP * nEstQ /  ObsTot;
wExpArr = new Array();
wExpArr = nEstQ * nEstQ / ObsTot;
wExp = new mathyma.Matrix(wExpArr);
document.write("< p > Exp _ _ = _ _ " + wExp.McPrint() + "< /p > ");
< /script > ```

The chi-square value for a multinomial distribution is defined as:

X^2 _ _ = _ _ sum{fract{(~{obs} - ~{exp})^2,~{exp}},,}

In (column-) vector terms, if #x is the vector of observations, and #e is the vector of expected values, then

X^2 _ _ = _ _ ((#x - #e) [&div.] #e) #. (#x - #e)

where [&div.] is the division by element of matrices.

So we can now calculate the chi-square value, which has a chi-square distribution with one degree of freedom:

```< script >
var wDiff = wObs.Minus(wExp);
var ChiSqVal = 1 - wDiff.Trans().Mult(wDiff.ElementDiv(wExp)).Det();
document.write("ChiSqVal _ _ = _ _ " + mathyma.formatDP(ChiSqVal,4));
var wSP = ChiSqDist(ChiSqVal,1);
document.write(" Sig. Prob. _ _ = _ _ " + mathyma.formatDP(wSP,4) );
< /script > ```

The significance probability of just over 46% is quite high, tending to suggest that we can accept the hypothesis of Hardy-Weinberg equilibrium. [Or in proper Stats speak: the significance probability is too high to reject the hypothesis at a 5% level.]