<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ANOVA | Dhafer Malouche</title><link>https://dhafermalouche.net/tag/anova/</link><atom:link href="https://dhafermalouche.net/tag/anova/index.xml" rel="self" type="application/rss+xml"/><description>ANOVA</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><copyright>Dhafer Malouche © 2026</copyright><lastBuildDate>Sat, 02 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://dhafermalouche.net/media/icon_hu294da7f24af66942b94b8e240e33fe59_2153342_512x512_fill_lanczos_center_3.png</url><title>ANOVA</title><link>https://dhafermalouche.net/tag/anova/</link></image><item><title>StatANOVA — One-way ANOVA &amp; Tukey HSD Workbench</title><link>https://dhafermalouche.net/apps/statanova/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://dhafermalouche.net/apps/statanova/</guid><description>&lt;p>An interactive web application that fits a one-way analysis of variance and its standard post-hoc decomposition entirely in the student&amp;rsquo;s browser. &lt;strong>StatANOVA&lt;/strong> extends the small family of teaching tools designed for undergraduate statistics at Qatar University: where &lt;strong>StatTests&lt;/strong> answers &lt;em>which test do I run on these two groups&lt;/em> and &lt;strong>StatRegress&lt;/strong> asks &lt;em>given these data, what is the model&lt;/em>, &lt;strong>StatANOVA&lt;/strong> asks &lt;em>do these $k$ groups differ on average — and if so, which ones?&lt;/em>&lt;/p>
&lt;h2 id="why-an-anova-workbench">Why an ANOVA workbench?&lt;/h2>
&lt;p>The pedagogical gap StatANOVA targets is the step from the global $F$-test to a defensible per-pair conclusion. In a typical lecture, students are taught the $F$-statistic for the equality-of-means hypothesis $H_{0}: \mu_{1} = \cdots = \mu_{k}$, but the natural next question — &lt;em>which groups are responsible for the rejection?&lt;/em> — is usually answered with a quick remark about Tukey&amp;rsquo;s honestly significant difference. StatANOVA closes that loop interactively: the student uploads a real dataset, reads the ANOVA decomposition, and immediately sees the Tukey HSD intervals, the family-wise adjusted $p$-values, and the resulting compact-letter-display (CLD) groupings on the same screen.&lt;/p>
&lt;h2 id="what-the-app-does">What the app does&lt;/h2>
&lt;p>&lt;strong>Input.&lt;/strong> Upload a CSV (UTF-8, header row, comma-separated, dot decimal, $\le 10$ MB and $\le 50{,}000$ rows after dropping NAs). The app inspects the columns and proposes:&lt;/p>
&lt;ul>
&lt;li>a &lt;strong>factor variable&lt;/strong> — any column with between 2 and 6 distinct values, with at least 3 observations per level after listwise deletion;&lt;/li>
&lt;li>one or more &lt;strong>continuous response variables&lt;/strong> — numeric columns selectable in a checklist, capped at 50 active responses.&lt;/li>
&lt;/ul>
&lt;p>The student then chooses the significance level $\alpha$ and the post-hoc method (Tukey HSD by default).&lt;/p>
&lt;p>&lt;strong>Inferential output.&lt;/strong> For each selected response, the app reports:&lt;/p>
&lt;ul>
&lt;li>the &lt;strong>ANOVA summary table&lt;/strong> (sums of squares, degrees of freedom, mean squares, the $F$-statistic, and the corresponding $p$-value);&lt;/li>
&lt;li>the &lt;strong>compact-letter-display (CLD) table&lt;/strong>: each group is annotated with letters such that two groups share at least one letter if and only if their means are not significantly different at level $\alpha$ under the chosen multiple-comparison correction;&lt;/li>
&lt;li>a &lt;strong>forest plot of pairwise mean differences&lt;/strong> with simultaneous confidence intervals, ordered for readability, with intervals that exclude zero highlighted.&lt;/li>
&lt;/ul>
&lt;p>Because the workflow runs across many response variables in a single pass, StatANOVA is well suited to the kind of multivariate teaching dataset (Qatar Biobank-style, biomedical, or biodiversity) where a single grouping factor is to be screened against several outcomes.&lt;/p>
&lt;h2 id="classroom-workflow">Classroom workflow&lt;/h2>
&lt;p>In lectures, the instructor mirrors the app on the projector while writing the model on the board: the algebraic decomposition $\mathrm{SS}&lt;em>{\text{total}} = \mathrm{SS}&lt;/em>{\text{between}} + \mathrm{SS}_{\text{within}}$ is read off the same table the students see. In practice sessions, students upload their assigned CSV, copy the ANOVA table, the CLD summary, and the forest plot into their report, and explain in one paragraph (i) whether the global $F$-test rejects, (ii) which pairs of groups differ once the family-wise error is controlled, and (iii) how the CLD letters and the forest plot tell the same story in two complementary forms.&lt;/p>
&lt;h2 id="technical-notes">Technical notes&lt;/h2>
&lt;p>The app is a single-page client-side application: all computation runs in the browser, with no server round-trip and no data leaving the device. The ANOVA decomposition is computed directly from the group means and pooled variance estimator; Tukey HSD intervals use the studentised-range distribution at the chosen family-wise level; the CLD is constructed by the standard insert-and-absorb algorithm on the matrix of adjusted $p$-values. The static bundle is deployed on Netlify; like its siblings, it works offline after first load and has no external run-time dependencies.&lt;/p></description></item><item><title>StatTests — Hypothesis Testing Hub</title><link>https://dhafermalouche.net/apps/stattests/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://dhafermalouche.net/apps/stattests/</guid><description>&lt;p>An interactive web application that performs the hypothesis tests covered in a standard one- or two-semester course in statistical inference, with a uniform interface, fully visible formulas, and automatic checking of the assumptions on which each procedure depends. The app is the natural complement to &lt;strong>StatTables&lt;/strong>: where StatTables answers &lt;em>what is the critical value&lt;/em> and &lt;em>what is the tail probability&lt;/em>, StatTests answers &lt;em>which test do I run, and what does the conclusion look like&lt;/em>.&lt;/p>
&lt;h2 id="why-a-unified-hub">Why a unified hub?&lt;/h2>
&lt;p>Most introductory textbooks present each test as a self-contained recipe — formula for the test statistic, sampling distribution under $H_{0}$, decision rule, and example. In practice, students confuse the recipes, mis-identify the appropriate distribution, and forget to verify the assumptions. &lt;strong>StatTests&lt;/strong> unifies all the standard procedures behind a single interface: pick the inference problem (one mean, two means, proportion, variance ratio, ANOVA, association, location shift, …), enter the data or the summary statistics, and the app returns a complete inference report consisting of:&lt;/p>
&lt;ul>
&lt;li>the explicit hypotheses $H_{0}$ vs.\ $H_{1}$ in the chosen direction (left, right, two-sided);&lt;/li>
&lt;li>the test statistic and its formula, with all values substituted;&lt;/li>
&lt;li>the reference distribution, displayed with the rejection region(s) shaded;&lt;/li>
&lt;li>the $p$-value, the critical value(s), and the decision at the user-selected $\alpha$;&lt;/li>
&lt;li>a checklist of the parametric assumptions, marked as satisfied, suspicious, or violated when checkable from the data.&lt;/li>
&lt;/ul>
&lt;h2 id="tests-covered">Tests covered&lt;/h2>
&lt;p>The current release implements 14 procedures grouped by inferential goal:&lt;/p>
&lt;p>&lt;strong>Means.&lt;/strong> One-sample $t$-test, paired $t$-test, two-sample $t$-test (pooled and Welch), one-way ANOVA.&lt;/p>
&lt;p>&lt;strong>Proportions.&lt;/strong> One-proportion $z$-test, two-proportion $z$-test.&lt;/p>
&lt;p>&lt;strong>Variances.&lt;/strong> Chi-square test for a single variance, $F$-test for the ratio of two variances, Bartlett / Levene-style homogeneity check feeding into ANOVA.&lt;/p>
&lt;p>&lt;strong>Categorical.&lt;/strong> $\chi^{2}$ goodness-of-fit, $\chi^{2}$ test of independence in a contingency table.&lt;/p>
&lt;p>&lt;strong>Non-parametric.&lt;/strong> Wilcoxon signed-rank (one-sample and paired), Mann–Whitney $U$ (two-sample location), Kruskal–Wallis (one-way location across $k &amp;gt; 2$ groups).&lt;/p>
&lt;h2 id="classroom-workflow">Classroom workflow&lt;/h2>
&lt;p>In lectures, the instructor mirrors the app on the projector and walks through a worked example: the formula panel shows exactly the algebra the instructor would write on the board, while the shaded density panel makes the geometry of the decision rule explicit. In practice sessions and exams, students paste the inputs they used together with the resulting $p$-value, which makes grading deterministic and removes ambiguity around one- vs. two-tailed conventions. The accompanying solution sheets cite the exact query rather than a row in a table.&lt;/p>
&lt;h2 id="technical-notes">Technical notes&lt;/h2>
&lt;p>The app is a single-page client-side application built with &lt;strong>React&lt;/strong>: all computation runs in the student&amp;rsquo;s browser, with no server round-trip. Distributional computations rely on the &lt;a href="https://github.com/jstat/jstat" target="_blank" rel="noopener">jStat&lt;/a> numerical library (MIT-licensed). The static bundle is deployed on Netlify, which means it works offline after first load and has no external dependencies at run time.&lt;/p></description></item></channel></rss>