Hardy-Weinberg Equilibrium Calculator

ANALife Services AuthorityNational Calculator Authority›Hardy-Weinberg Equilibrium Calculator

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Hardy-Weinberg Equilibrium Calculator

Calculate expected genotype frequencies and test whether a population is in Hardy-Weinberg Equilibrium (HWE) given observed genotype counts or allele frequencies.

Input Mode

Observed Genotype Counts (AA, Aa, aa) Allele Frequency (p)

Observed Count of AA (homozygous dominant)

Observed Count of Aa (heterozygous)

Observed Count of aa (homozygous recessive)

Frequency of dominant allele (p), 0 < p < 1

Total population size (N)

Calculate

function harToggleMode() { var mode = document.getElementById('har-mode').value; document.getElementById('har-counts-section').style.display = (mode === 'counts') ? '' : 'none'; document.getElementById('har-freq-section').style.display = (mode === 'freq') ? '' : 'none'; document.getElementById('har-result').innerHTML = ''; }

function harRound(v, d) { return Math.round(v * Math.pow(10, d)) / Math.pow(10, d); }

function harChiSq(obs, exp) { // chi-square = sum((O - E)^2 / E), skip cells where E == 0 var chi = 0; for (var i = 0; i 0) chi += Math.pow(obs[i] - exp[i], 2) / exp[i]; } return chi; }

// Chi-square CDF (1 df) using regularised incomplete gamma approximation function harChiPval(chi, df) { // p-value = 1 - CDF = regularised upper incomplete gamma(df/2, chi/2) // Use series expansion for lower incomplete gamma return 1 - harGammaRegLow(df / 2, chi / 2); }

function harGammaRegLow(a, x) { if (x 1e-12) { sum += term; n++; term *= x / (a + n); } return Math.exp(-x + a * Math.log(x) - harLogGamma(a)) * sum; }

function harLogGamma(z) { // Lanczos approximation var g = 7; var c = [0.99999999999980993,676.5203681218851,-1259.1392167224028, 771.32342877765313,-176.61502916214059,12.507343278686905, -0.13857109526572012,9.9843695780195716e-6,1.5056327351493116e-7]; if (z Please enter all three genotype counts.'; return; } obsAA = parseFloat(vAA); obsAa = parseFloat(vAa); obsaa = parseFloat(vaa); if (!Number.isFinite(obsAA) || !Number.isFinite(obsAa) || !Number.isFinite(obsaa)) { res.innerHTML = 'All counts must be valid numbers.'; return; } if (obsAA Counts cannot be negative.'; return; } if (!Number.isInteger(obsAA) || !Number.isInteger(obsAa) || !Number.isInteger(obsaa)) { res.innerHTML = 'Counts must be whole numbers.'; return; } N = obsAA + obsAa + obsaa; if (N === 0) { res.innerHTML = 'Total population size must be > 0.'; return; }

// Allele frequency from observed counts // p = (2AA + Aa) / (2N) p = (2 * obsAA + obsAa) / (2 * N); q = 1 - p;

} else { var vp = document.getElementById('har-p').value.trim(); var vN = document.getElementById('har-N').value.trim(); if (vp === '' || vN === '') { res.innerHTML = 'Please enter allele frequency p and population size N.'; return; } p = parseFloat(vp); N = parseFloat(vN); if (!Number.isFinite(p) || !Number.isFinite(N)) { res.innerHTML = 'Please enter valid numbers.'; return; } if (p = 1) { res.innerHTML = 'Allele frequency p must be strictly between 0 and 1.'; return; } if (N Population size N must be a positive integer.'; return; } q = 1 - p; obsAA = null; obsAa = null; obsaa = null; }

// Expected genotype frequencies under HWE var freqAA = p * p; var freqAa = 2 * p * q; var freqaa = q * q;

// Expected counts var expAA = freqAA * N; var expAa = freqAa * N; var expaa = freqaa * N;

var html = '### Results '; html += ''; html += '' + 'Genotype' + 'Expected Frequency' + 'Expected Count' + (mode === 'counts' ? 'Observed Count' : '') + '';

var rows = [ ['AA (p²)', freqAA, expAA, obsAA], ['Aa (2pq)', freqAa, expAa, obsAa], ['aa (q²)', freqaa, expaa, obsaa] ]; rows.forEach(function(r) { html += '' + '' + r[0] + '' + '' + harRound(r[1], 6) + '' + '' + harRound(r[2], 4) + '' + (mode === 'counts' ? '' + r[3] + '' : '') + ''; }); html += '';

html += 'Allele Frequencies: p (A) = ' + harRound(p, 6) + '  |  q (a) = ' + harRound(q, 6) + '

';

if (mode === 'counts') { // Chi-square goodness-of-fit test (df = 1 because p is estimated from data) var obs = [obsAA, obsAa, obsaa]; var exp = [expAA, expAa, expaa]; var chi2 = harChiSq(obs, exp); var df = 1; // 3 classes - 1 (total) - 1 (estimated p) = 1 var pval = harChiPval(chi2, df);

html += 'Chi-Square Statistic (χ²): ' + harRound(chi2, 4) + '

'; html += 'Degrees of Freedom: ' + df + '

';
html += 'p-value: ' + (pval = 0.05;
html += ''
+ (inHWE
? '✔ Population is consistent with Hardy-Weinberg Equilibrium (p ≥ 0.05).'
'✘ Population deviates significantly from Hardy-Weinberg Equilibrium (p 0) ? (1 - obsHet / expHet) : 0; html += 'Inbreeding Coefficient (F): ' + harRound(F, 6) + ' *(F = 0 → random mating; F > 0 → excess homozygotes; F

#### Formulas

Allele frequencies (from observed counts):

p = (2·NAA + NAa) / (2·N)    q = 1 − p

Expected genotype frequencies under HWE:

f(AA) = p²    f(Aa) = 2pq    f(aa) = q²

Chi-square goodness-of-fit test:

χ² = Σ (Oi − Ei)² / Ei    df = 1

Inbreeding coefficient:

F = 1 − (Hobs / Hexp) = 1 − (NAa/N) / (2pq)

#### Assumptions & References

More Calculators

Read Next

Server Vulnerability Patch Priority Scorer ANA › Life Services Authority › National Calculator Authority › Server Vulnerability Patch Priority Scorer .calc-container {...

Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...

References