Petersen–Chapman population estimate
Mark 200 animals, catch 150 later and find 20 with marks: the classic Petersen ratio says 1500, while the Chapman adjustment gives a slightly lower, less biased estimate with its standard error and a 95% interval. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Marked
- 200
- Captured
- 150
- Recaptured
- 20
- Estimate chapman
- 1,444.2857142857
- Variance chapman
- 73,202.7829313544
- Se chapman
- 270.5601281256
- Ci95 low
- 913.9976075069
Wildlife biologists, fisheries scientists, and ecology students often need a closed-population abundance estimate from a two-sample mark–recapture study: mark M individuals, release them, capture C animals later, and count R marked recaptures. The classic Petersen ratio M times C over R is simple but biased for small samples and undefined when no recaptures occur. The Chapman modification replaces that ratio with N equals open parenthesis M plus one close parenthesis times open parenthesis C plus one close parenthesis over open parenthesis R plus one close parenthesis, then subtracts one, which reduces bias and remains defined when R is zero. This Petersen population adjusted calculator accepts the three integer counts, returns the Chapman point estimate, Seber variance and standard error, an approximate ninety-five percent interval floored at the number of unique individuals observed, and the classic Petersen value when R is positive—so homework checks, field notebooks, and automation pipelines share one deterministic contract.
What the Petersen–Chapman mark–recapture estimator measures
In a two-occasion closed-population mark–recapture design you capture a first sample, mark every individual in it, and release them so they remix with the unmarked animals. After mixing you capture a second sample of size C and count how many of those animals already carry a mark (R).
Under ideal assumptions—no births, deaths, immigration, or emigration between samples; marks not lost; equal capture probability; and random mixing—the proportion marked in the second sample estimates the proportion marked in the whole population, so population size N satisfies R over C approximately equals M over N, which rearranges to the classic Petersen estimator N equals M times C over R. That estimator is intuitive but has positive finite-sample bias and blows up when R is zero.
Chapman’s adjustment adds one to each count before dividing and then subtracts one from the ratio, yielding N hat equals open parenthesis M plus one close parenthesis times open parenthesis C plus one close parenthesis divided by open parenthesis R plus one close parenthesis, minus one. The adjustment is widely taught in wildlife and fisheries courses because it is nearly unbiased for moderate sample sizes under the same closed-population assumptions, and because it still returns a finite number when no marked animal is seen again.
This capability implements that Chapman point estimate exactly, together with the usual Seber sampling variance so you can report uncertainty alongside the point value. It does not fit open-population models, multi-occasion histories, or trap-dependence corrections; those need richer data and different estimators.
Where a Chapman population calculator earns its keep
Undergraduate and graduate ecology labs repeatedly ask students to turn mark and recapture tallies into an abundance estimate and a rough confidence interval. A deterministic calculator marks wrong the cases of fractional animals, negative counts, or R greater than M, instead of silently inventing a number.
Fisheries managers and wildlife technicians often need a quick closed-population check from a two-pass tagging event before investing in longer multi-occasion models: plug in M, C, and R, read the Chapman estimate and Seber standard error, and compare against the classic Petersen value when recaptures exist. Treat the result as a model-based estimate under closed-population assumptions, not as a census: if animals leave the study area, marks fall off, or capture probabilities differ between marked and unmarked individuals, the numerical output can be precise and still wrong for management decisions.
What you can do with it
Ecology lab mark–recapture homework
From marked, captured, and recaptured counts, obtain the Chapman abundance estimate and Seber uncertainty for closed-population lab reports.
Two-pass fisheries and wildlife tagging checks
Turn a single mark-and-recapture event into a bias-adjusted population point estimate plus approximate ninety-five percent bounds for field notebooks.
Teaching and auto-grading oracles
Give students a deterministic Petersen–Chapman oracle that rejects impossible recapture relations and non-integer counts.
FAQ
How do I compute the Chapman-adjusted Petersen population estimate?
Send integers marked (M), captured (C), and recaptured (R).
What if recaptured is zero?
Chapman still returns a finite estimate. The classic Petersen field is omitted because division by zero is undefined. Uncertainty is large when R is small.
Why must recaptured not exceed marked or captured?
Recaptures are marked animals seen again in the second sample, so R cannot exceed the marked pool M or the second-sample size C.
What is the difference between the Petersen and Chapman estimates?
Petersen multiplies marked by captured and divides by recaptures, which overestimates in small samples and fails with no recaptures. Chapman adds one to each count, divides, then subtracts one; in the example it comes out slightly below the Petersen 1500.
What assumptions does a mark–recapture estimate need?
A closed population between the two samples: no births, deaths or migration, no lost marks, the same chance of capture for every animal and good mixing of marked animals before the second sample.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/bio/petersen-chapman-adjusted \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"marked":200,"captured":150,"recaptured":20}'const res = await fetch("https://api.kit.forhosting.com/bio/petersen-chapman-adjusted", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"marked": 200,
"captured": 150,
"recaptured": 20
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/petersen-chapman-adjusted",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"marked": 200,
"captured": 150,
"recaptured": 20
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/petersen-chapman-adjusted", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"marked":200,"captured":150,"recaptured":20}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"marked":200,"captured":150,"recaptured":20}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/petersen-chapman-adjusted", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"marked": 200,
"captured": 150,
"recaptured": 20
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.petersen_chapman_adjusted",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Input contract, response fields, and validation errors
Logical constraints also apply: marked and captured must be at least one, and recaptured cannot exceed either marked or captured, because recaptures are a subset of both the marked pool and the second sample. POST a JSON body with three required integer fields: marked (M), the positive count of animals marked and released in the first sample; captured (C), the positive count of animals taken in the second sample; and recaptured (R), the non-negative count of marked animals among those in the second sample. Short aliases work the same way: m, n1, marked_count, and first_sample for marked; c, n2, second_sample, and captured_count for captured; r, m2, recaptures, and marked_recaptured for recaptured. Each field may arrive as a JSON number or as a numeric string; empty strings, missing keys, non-finite values, and non-integers fail with invalid_input naming the field. On success the body echoes the three counts; estimate_chapman as the Chapman N hat; variance_chapman and se_chapman from the Seber formula involving open parenthesis M plus one close parenthesis times open parenthesis C plus one close parenthesis times open parenthesis M minus R close parenthesis times open parenthesis C minus R close parenthesis over open parenthesis R plus one close parenthesis squared times open parenthesis R plus two close parenthesis; ci95_low and ci95_high as an approximate normal interval using about 1.96 times the standard error, with the lower end floored at observed_minimum equals M plus C minus R (unique individuals known to exist); and a formula string restating Chapman and Seber. When R is greater than zero the response also includes estimate_petersen equals M times C over R for side-by-side comparison; when R is zero that classic field is omitted because division by zero is undefined. Failed validation is not billed; successful calls use prepaid KIT balance at the published $0.002 base price per item.
Technical questions
How does Chapman differ from the classic Petersen formula?
Classic Petersen is N = M·C/R (undefined when R = 0). Chapman uses ((M+1)(C+1)/(R+1)) − 1, which reduces small-sample bias and stays defined when R = 0.
What does the Petersen population adjusted calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.