Hardy-Weinberg Equilibrium Calculator
ANA›Life Services Authority›National 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
- Allele frequencies are estimated from observed genotype counts using the maximum-likelihood estimator p̂ = (2NAA + NAa) / 2N.
- The chi-square test uses 1 degree of freedom (3 genotype classes − 1 constraint on total − 1 estimated parameter p).
- Hardy, G.H. (1908). Mendelian proportions in a mixed population. Science, 28(706), 49–50.
- Weinberg, W. (1908). Über den Nachweis der Vererbung beim Menschen. Jahreshefte des Vereins für vaterländische Naturkunde in Württemberg, 64, 368–382.
- Wigginton, J.E., Cutler, D.J., & Abecasis, G.R. (2005). A note on exact tests of Hardy-Weinberg equilibrium. American Journal of Human Genetics, 76(5), 887–893.
More Calculators
- Sprinkler Head Spacing & Coverage Calculator
- Dumpster Rental Size & Cost Calculator
- Irrigation System Pressure Loss Calculator
- Overtime Pay Calculator
- Crop Water Requirement (ET) Calculator
- Security Deposit Interest Calculator
- Accounts Receivable Days (AR Days) Calculator
- Security Monitoring Coverage Calculator
- Physical Security Risk Assessment Calculator
- SSL/TLS Certificate Expiry Risk Calculator
- Home Security Camera Coverage Calculator
- Smart Lock Battery Life Estimator
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;...