ANOVA from group summaries
Run a one-way ANOVA from group means, standard deviations and sizes alone: three groups of 4 with means 3, 5 and 7 and a deviation of 1 give an F of 16 and a p-value of 0.001087837278. No raw data needed. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Published papers, textbooks, and dashboards often report only group means, standard deviations, and sample sizes—not the full observation vectors. You still need a one-way analysis of variance: the F statistic that compares between-group mean squares to within-group mean squares, and the matching upper-tail p-value under the central F distribution. This ANOVA from group summaries calculator accepts two or more groups, each with mean, sample deviation, and size, then rebuilds the classic ANOVA table and reports F and p without requiring raw rows.
What one-way ANOVA from summaries means
One-way analysis of variance tests whether at least one of k group means differs from the others under the usual independent normal equal-variance model. Textbooks start from raw observations, but the same F ratio can be recovered when each group contributes only its sample mean, sample standard deviation, and sample size. The grand mean is the size-weighted average of the group means.
Between-group sum of squares SSB pools each size times the squared gap from that group mean to the grand mean. Within-group sum of squares SSW pools each (n minus one) times the squared sample deviation, which is exactly the sum of squared residuals if the deviation is the ordinary sample SD. Degrees of freedom are k minus one between groups and N minus k within groups.
Mean squares are those sums divided by their degrees of freedom, and F is the ratio of between to within mean square. The p-value is the probability that a central F random variable with those degrees of freedom exceeds the observed statistic. Effect size η² equals SSB over total SS when total SS is positive.
This summary route is essential when raw data cannot leave a privacy boundary, when you only have a published table, or when a spreadsheet already collapsed replicates into means and SDs. Hand reconstruction fails when n is confused with n minus one, when population SD is mixed with sample SD, when unequal sizes are ignored in the grand mean, or when the F tail is read from the wrong critical-value row.
Automating the reconstruction from explicit mean, deviation, and size fields removes those slips while still exposing the intermediate SS and MS columns a solution write-up expects.
Where to use it and what it costs
Use the free browser tool when a homework problem or paper table already lists group means, SDs, and n and you need the matching F and p without retyping raw scores. Typical placements include verifying textbook ANOVA answers from collapsed tables, screening published experiment summaries before requesting raw data, teaching the link between the ANOVA table and the F tail, and feeding F and p into reports that only store group-level aggregates for privacy. The browser path runs locally and needs no account.
Keep at least two groups with n at least two each so within-group degrees of freedom are positive, prefer sample SD for deviation, and treat the result as a global one-way test rather than a substitute for checking independence or roughly comparable residual variance.
What you can do with it
Homework and exam keys
Given only published group means, sample SDs, and sizes, verify the one-way ANOVA F statistic and p-value against a single canonical table.
Paper and report tables
Rebuild F and p from summary statistics in journals or internal dashboards when raw observation vectors are not available.
FAQ
Is deviation the sample or population standard deviation?
Use the ordinary sample standard deviation (divisor n−1).
Can I run an ANOVA without the raw data?
Yes. When a paper or a table gives only each group's mean, standard deviation and size, those three numbers are enough to rebuild the sums of squares, the F statistic and its p-value.
How are the degrees of freedom worked out?
Between groups it is the number of groups minus one, and within groups it is the total sample size minus the number of groups. Three groups of 4 give 2 and 9.
What does eta squared tell me?
It is the share of the total variation explained by the differences between group means: the between-group sum of squares over the total. In the three-group example, 32 out of 41 gives 0.780487804878.
What happens if every standard deviation is zero?
If the means are also equal, F is zero and the p-value is one. If the means differ, F is treated as infinite and the p-value is zero, because there is no spread within the groups at all.
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/stat/anova-summary \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"groups":[{"mean":3,"deviation":1,"size":4,"label":"A"},{"mean":5,"deviation":1,"size":4,"label":"B"},{"mean":7,"deviation":1,"size":4,"label":"C"}]}'const res = await fetch("https://api.kit.forhosting.com/stat/anova-summary", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"groups": [
{
"mean": 3,
"deviation": 1,
"size": 4,
"label": "A"
},
{
"mean": 5,
"deviation": 1,
"size": 4,
"label": "B"
},
{
"mean": 7,
"deviation": 1,
"size": 4,
"label": "C"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/stat/anova-summary",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"groups": [
{
"mean": 3,
"deviation": 1,
"size": 4,
"label": "A"
},
{
"mean": 5,
"deviation": 1,
"size": 4,
"label": "B"
},
{
"mean": 7,
"deviation": 1,
"size": 4,
"label": "C"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/stat/anova-summary", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"groups":[{"mean":3,"deviation":1,"size":4,"label":"A"},{"mean":5,"deviation":1,"size":4,"label":"B"},{"mean":7,"deviation":1,"size":4,"label":"C"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"groups":[{"mean":3,"deviation":1,"size":4,"label":"A"},{"mean":5,"deviation":1,"size":4,"label":"B"},{"mean":7,"deviation":1,"size":4,"label":"C"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/stat/anova-summary", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"groups": [
{
"mean": 3,
"deviation": 1,
"size": 4,
"label": "A"
},
{
"mean": 5,
"deviation": 1,
"size": 4,
"label": "B"
},
{
"mean": 7,
"deviation": 1,
"size": 4,
"label": "C"
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "stat.anova_summary",
"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
How this capability computes F and p
Each object must include mean (finite number), deviation (non-negative sample standard deviation), and size (integer n at least two). Optional label names the group for the response table; if omitted, groups are labeled G1, G2, and so on. When every deviation is zero and all means match, F is zero and p is one. You send a JSON body with a required groups array of at least two objects. Aliases such as sd, std, n, and summaries are accepted for convenience, but the canonical contract is mean, deviation, and size. The engine rejects fewer than two groups, non-finite numbers, negative deviations, non-integer or too-small sizes, and malformed rows with invalid_input and without charge. It then forms N as the sum of sizes, the grand mean as the size-weighted mean, SSB and SSW as above, degrees of freedom, mean squares, F equals MSB over MSW when MSW is positive, and the upper-tail p-value via the regularized incomplete beta identity for the F distribution. When deviations are all zero but means still differ, F is treated as infinite, p is zero, and f_statistic is null with f_statistic_infinite true so JSON stays finite. The response also returns k, n_total, grand_mean, df_between, df_within, ss_between, ss_within, ss_total, ms_between, ms_within, eta_squared, the echoed groups, and a short formula string. There is no randomness, no clock, and no network; identical summaries always yield identical JSON. The work is validation plus O of k arithmetic plus a bounded continued-fraction incomplete-beta evaluation, which sits inside the analytic cost model for this tier-A parse capability priced at $0.002 per successful request.
Where to use it and what it costs
Call the API when a notebook, gradebook, meta-analysis pipeline, or product analytics job must resolve many multi-group summary tables the same way every time. API usage draws from prepaid KIT balance at the published $0.002 base price per successful request; failed validation does not consume balance.
Integration use cases
Privacy-preserving analytics
Batch group-level aggregates through the API so multi-arm experiments can be tested without shipping individual-level data.
Technical questions
How do I run an ANOVA from group summaries with this API?
POST JSON with groups as an array of objects, each with mean, deviation (sample SD), and size (n ≥ 2). The response includes ss_between, ss_within, ms_between, ms_within, f_statistic, and p_value.
What error do I get with fewer than two groups?
Validation fails with invalid_input stating that one-way ANOVA from summaries requires at least two groups. That failure is not charged.
Is the ANOVA from group summaries calculator free?
The browser widget is free and runs locally. API calls use prepaid KIT balance at the published $0.002 base price; invalid input is not charged.
Is the result always the same for the same inputs?
Yes. The algorithm is pure analytic arithmetic with a fixed incomplete-beta p-value path and no randomness or timestamps, so identical summaries produce identical JSON.