Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .claude/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add Aperivue/medsci-skills --skill analyze-stats -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .agents/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add Aperivue/medsci-skills --skill analyze-stats -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .cursor/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add Aperivue/medsci-skills --skill analyze-stats -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .gemini/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add Aperivue/medsci-skills --skill analyze-stats -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .github/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add Aperivue/medsci-skills --skill analyze-stats -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "analyze-stats" agent skill from https://github.com/Aperivue/medsci-skills/tree/main/skills/analyze-stats into .opencode/skills/analyze-stats/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-stats", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
analyze-stats
GitHub stars
331
Token cost
~7k tokens
SKILL.md length
3,282 words
Files
92 (incl. scripts, references)
Skills in repo
54
Repo updated
First seen
Licence
MIT
At a glance
A skill your agent uses when data needs statistical analysis.
Works in 5 steps: Data Assessment → Analysis Plan → Execute → …
Data needs statistical analysis
SKILL.md covers Data Privacy Check, Reference Files, Workflow and Statistical Reporting Rules…, plus 3 more sections
Calls python3
What it does
Analyze Stats is an agent skill from Aperivue/medsci-skills. Use when data needs statistical analysis. Runs reproducible Python/R code for Table 1, diagnostic accuracy, agreement, regression, survival, propensity score, survey-weighted and repeated-measures models, with publication tables. Sample size is /calc-sample-size; pooling studies is /meta-analysis.
Its SKILL.md is about 7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 93 other files, including scripts and reference files (for example `references/analysis_guides/agreement_reliability.md`, `references/analysis_guides/burden_decomposition_forecasting.md` and `references/analysis_guides/calibration.md`).
It sits in Research & Science, covering Statistics and Experimental design. It works with Python. The repository describes itself as: Agent Skills for medical research — literature search, reporting-guideline & citation checks, statistics, publication figures, submission. Works with Claude Code, Codex, Cursor &… The licence is MIT.
When your agent uses it
Data needs statistical analysis
Tasks that involve Statistics
Tasks that involve Experimental design
Example prompts
“/analyze-stats”
Requirements
Python 3
Workflow steps
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3b14ae2. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
python3
From the folder's file list and the shell code blocks in SKILL.md.
Network
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Analyze Stats loads about 7k tokens when it runs, and up to ~123k if it reads all its reference files. Until then it costs about 78 tokens; SKILL.md has 3,282 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~78
When it runs· the whole SKILL.md, loaded when a task matches
~7k
With references· SKILL.md plus every file in references/, read only if the agent opens them
~123k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check passed
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
Download SKILL.mdSave it as .claude/skills/analyze-stats/SKILL.md (or your agent's skills folder). This skill also uses 91 other files; get the full folder from GitHub.
name
analyze-stats
description
Use when data needs statistical analysis. Runs reproducible Python/R code for Table 1, diagnostic accuracy, agreement, regression, survival, propensity score, survey-weighted and repeated-measures models, with publication tables. Sample size is /calc-sample-size; pooling studies is /meta-analysis.
Generate reproducible code (Python preferred, R when necessary) for medical research analyses,
run it, and produce publication-ready tables and figures from its output.
Data Privacy Check
Before reading any data file, check whether it might contain Protected Health Information (PHI):
If *_deidentified.* files exist in the working directory, use those.
If only raw CSV/Excel files exist, ask the user whether the data contain patient identifiers
(names, national ID / RRN, contact details); if so, have them de-identify it first with
/deidentify.
Proceed once the user confirms the data are de-identified or contain no PHI.
NEVER display raw PHI values (names, phone numbers, RRN) in your output, because console
output is copied into transcripts and drafts. If you encounter them, warn the user and suggest
/deidentify.
Reference Files
${CLAUDE_SKILL_DIR}/references/templates/ — reusable analysis scripts; read the matching one
before generating code.
${CLAUDE_SKILL_DIR}/references/analysis_guides/ — methodology guides; the Phase 2 table says
which to read.
${CLAUDE_SKILL_DIR}/references/table-standards/ — table-standards.md (universal and AMA
rules, footnote order, gtsummary pipeline), journal-profiles/ (YAML per journal: radiology,
jama, nejm, lancet, european_radiology, ajr), table-types/ (one template per table type),
tool-comparison.md (R/Python table tools).
Read the data file (CSV, Excel, TSV, or other tabular format).
Report to the user: shape (rows x columns); column names and inferred types (continuous,
categorical, ordinal, binary, datetime); missing values per column (count and percentage);
first 5 rows; unique value counts for categorical columns.
Identify the analysis unit: patient, exam, lesion, image, rater, study, etc.
If a variable name or coding is uncertain, write [VERIFY: variable_name] and ask the user to
confirm it against the data dictionary; never guess a column name or coding.
Phase 2: Analysis Plan
Observational designs (cohort, case-control, cross-sectional, registry, survey): before
planning, look for a variable_operationalization.md from /define-variables (or an equivalent
codebook-backed definition table). If none exists, warn the user and recommend running
/define-variables first, because exposure/outcome/covariate definitions and cutoffs invented
ad hoc from the data dictionary are a common reason reviewers reject observational work. This is
a warning, not a block: proceed on explicit user confirmation and record that the artifact was
not available.
Propose an analysis plan; the user decides the research question and endpoints. Mark any
clinical definition, cutoff, diagnostic criterion or guideline claim you could not confirm
[VERIFY].
Detect the analysis type from the table in Analysis-Specific Guidelines, or accept the
user's specification.
List the specific tests to be performed.
Identify primary and secondary endpoints.
State the assumptions that will be checked (normality, homogeneity, independence).
Note data cleaning needed (recoding, outlier handling, missing-data strategy).
Anchor the estimand to the research question.
Interaction, synergy or effect modification: the primary estimand is the interaction
parameter itself (a likelihood-ratio test of the interaction term, or the interaction
OR/HR on one stated scale) — not a main-effect OR whose CI is then read as "no synergy". A
public-health or biological synergy claim is additive-scale: report RERI, AP or
S, each with a CI (R interactionR / epiR; Knol & VanderWeele reporting), not only a
multiplicative product term, because a non-significant multiplicative interaction is
compatible with a large additive one (and vice versa). Joint categories (high/high vs
low/low) show joint association, not interaction; "stronger in A than in B" from separate
stratum estimates is the difference-in-significance fallacy — report the formal interaction
term.
Equivalence or non-inferiority: declare the margin up front (a TOST procedure, or the CI
compared against a pre-stated MCID); a non-significant difference is not equivalence
without a margin.
Screen every categorical/binary predictor for separation before fitting anything. A
predictor that perfectly predicts the outcome has no finite MLE, and the failure is silent:
glm returns an odds ratio near 0 (or enormous), p ≈ 0.99, and an AUC that ends up in a
table. Pathognomonic imaging signs (T2-FLAIR mismatch, the string sign, a halo sign) cause
it routinely: 100% specificity means an empty cell by construction.
COMPLETE_SEPARATION (an empty cell) and QUASI_SEPARATION (a cell below the sparsity
floor) both halt the plan. With two or more predictors the script also tests them jointly
(a linear combination can separate the outcome when no single predictor does); that test
needs scipy, and without it the report says the joint check was not run. The remedy is a design decision, made in the plan: Firth's
penalised likelihood keeps one model, while a two-stage rule — classify the sign-positive
cases directly, model only the sign-negative remainder — is usually the clinically meaningful
choice for a pathognomonic sign, because a sign-positive patient is already diagnosed.
Present the plan and wait for user approval before executing.
Phase 3: Execute
Generate and run a Python (preferred) or R script. Every number you report MUST come from
its executed output, never estimated or hand-typed, because a number no script reproduces cannot
be verified.
Script Structure
Start every script with a reproducibility header:
python
"""
Analysis: {description}
Date: {YYYY-MM-DD}
Random seed: 42
Python: {version}
Key packages: {package==version, ...}
"""
import numpy as np
import pandas as pd
np.random.seed(42)
Execution Rules
Random seed: always np.random.seed(42) or set.seed(42).
Figure style: always load the matplotlib style file:python
import matplotlib.pyplot as plt
style_path = os.path.join(os.environ.get('CLAUDE_SKILL_DIR', '.'), 'references/style/figure_style.mplstyle')
if os.path.exists(style_path):
plt.style.use(style_path)
Output files: save next to the input data, or in a user-specified output directory.
Tables as CSV plus a printed markdown version (see Output Conventions); figures as
PDF (vector) and PNG (300 DPI).
Console output: a summary with every number that would appear in the text, formatted for
direct copy-paste into the Results section.
Assumption Checking
Choose the summary and test from the design and the distribution, not a preliminary test:
Shape: QQ plot / histogram and skewness; for Table 1, |skewness| > 1 → median (IQR) with a
rank test, else mean (SD) (table-types/table1_demographics.md). Never gate on a Shapiro-Wilk or
KS P value: it flags trivial departures at large n, misses real ones at small n, and
test-then-test inflates the type I error (Rochon et al. 2012).
Unequal variances: default to Welch's t / Welch ANOVA, not a Levene gate; Mann-Whitney
tests a different hypothesis and does not fix them. State the choice and reason in Methods.
Stratified & Ordinal-Trend Reporting
Strata disjointness gate (before any ordinal trend test). Before a Cochran-Armitage trend
test (or any analysis that treats tiers as an ordered partition), assert that the strata are
mutually exclusive and exhaustive: sum(n per stratum) == unique N and
sum(events per stratum) == total events. A trend test on overlapping or non-exhaustive strata
is invalid. Print the per-stratum N/event table and the reconciliation (the analysis-side
mirror of /self-reviewcheck_cohort_arithmetic.pyPARTITION_OVERLAP).
Secondary stratum HR/OR: report each with (a) its reference contrast (the referent
category), (b) the event count in each stratum, and (c) a sparse-stratum caveat when
any stratum has few events (< 10 is unstable). "HR 1.55 in lean participants" without the
referent and the events is uninterpretable.
Proportion CI lower-bound clamp: clamp every lower bound to max(0, lower). A zero-event
Wilson/score interval can print a negative or tiny-exponent bound (e.g. 3.47e-16) that is a
display artifact; report 0 (or 0.0%), and prefer an exact (Clopper-Pearson) interval for
zero/near-zero cells.
Output Manifest
After all analyses complete, save _analysis_outputs.md in the output directory, in the format
given in references/analysis_run_workflow.md, so
/make-figures and /write-paper can find the outputs without asking.
For prespecified binary predictions on independent units, use the bundled
scripts/run_analysis.py run workflow in that file: it embeds data/configuration/code/output
hashes, exact counts, metric-specific denominators and the reproduction command in the same
manifest (audit checks recorded versions without rewriting them; compare separates declared
context and numeric equality from byte drift). It does not select thresholds or establish study
validity, privacy clearance or reuse rights. Synthetic example:
python3 ${CLAUDE_SKILL_DIR}/scripts/demo_analysis_run.py --out demo-project.
Phase 3.5: Generated-Code Quality Gate
Before reporting any script as final, lint every emitted .py/.R file:
bash
python3 ${CLAUDE_SKILL_DIR}/scripts/check_generated_code.py {script.py} --strict
# or scan a whole output directory:
python3 ${CLAUDE_SKILL_DIR}/scripts/check_generated_code.py --code-dir {analysis_dir} --strict
Fix every Major before reporting the script: MISSING_SEED (randomness with no seed),
HARDCODED_DATA_LITERAL (hand-typed, table-shaped data instead of read_csv()/read.csv() +
subset), HARDCODED_ABS_PATH (non-portable and a PII risk), and INPLACE_SOURCE_OVERWRITE
(writing to the path read as input — never modify raw data; write derived outputs to a new
path). Fix the flags DEBUG_LEFTOVER and UNUSED_IMPORT when tidying.
Minor, Python only: API_DEFAULT_STUDENT_T (scipy's ttest_ind without equal_var is Student's
t; state Welch or the reason for Student) and API_DEFAULT_PENALIZED_OR (LogisticRegression
with none of penalty, C, l1_ratio, in a file that exponentiates a coef_). R's t.test()
is Welch by default.
Phase 4: Report
After execution, generate manuscript-ready text from the script's output:
Results paragraph: 3-8 sentences with specific numbers, formatted as:
Continuous: "mean +/- SD" or "median (IQR)"
Proportions: "n/N (XX.X%)"
Test results: "statistic = X.XX, p = 0.XXX"
Effect sizes: "Cohen's d = X.XX (95% CI: X.XX-X.XX)"
Methods snippet: 2-3 sentences describing the statistical methods, for the Methods
section. Cite only references whose DOI/PMID /search-lit confirmed; mark any other
[UNVERIFIED - NEEDS MANUAL CHECK].
Report statistical results; leave judgments of clinical significance to the user. For designs this
skill does not cover (adaptive or Bayesian trials, complex multilevel or causal-mediation models),
say so and recommend biostatistician review before the results are reported.
Statistical Reporting Rules (Always Enforced)
Exact p-values: report exact values (e.g., p = 0.034), not inequalities; below 0.001,
report p < 0.001.
Confidence intervals: always report 95% CIs for primary endpoints.
Effect sizes: report one alongside every p-value (Cohen's d, eta-squared, odds ratio,
risk ratio, etc., as appropriate).
Multiple comparisons: for 3+ tests on the same dataset, apply Bonferroni or
Benjamini-Hochberg correction, state the method, and report both uncorrected and corrected
p-values.
Sample size: state n for each group/analysis.
Missing data: report how many cases were excluded and why.
Decimal places: p-values to 3 decimals, proportions to 1 decimal, means/SDs to the
precision of the measurement.
Design/power statistics are code outputs, never hand-computed. Any minimum detectable
effect (MDE), a-priori power, or required sample size that will appear in the
manuscript MUST be printed by the committed script with its method and inputs (n per arm,
alpha, power, allocation ratio, one/two-sided), not computed in a side tool (G*Power, an
online calculator) and pasted in, because a manuscript value no script reproduces cannot be
checked. Use one method family throughout (e.g. the exact noncentral-t via statsmodelsTTestIndPower or scipy's nct); do not mix a normal approximation for some values with
exact-t for others. Do not report post-hoc (observed) power: it is a function of the P value
and adds nothing (Hoenig & Heisey 2001); report the CI of the effect instead.
Estimand & CI output contract. Every primary point estimate — including quantile
estimands (T25, median time-to-event), pooled proportions and subdistribution HRs, not just
ORs/HRs/AUCs — MUST be emitted with its 95% CI, because /self-review treats a primary
metric without one as a defect. In the output CSV carry the interval as explicit columns
(estimate, ci_lower, ci_upper) or as one text column in est (lo–hi) form; never a point
estimate with no interval beside it. Round ORs/HRs/sHRs to 2 decimals and AUC/C-statistic
to 3.
Show full SKILL.md (1,492 more words)Show less
Effect-Size Real-World Translation
Whenever a primary result is a correlation, a standardized coefficient, a regression slope, an
OR/HR/RR or a Cohen's d, also report it as a plain-language unit shift a non-statistician can
act on — in addition to the effect size (rule 3), not instead of it. This applies to
continuous exposure–outcome associations (Spearman's rho, Pearson's r, standardized slopes), to
relative measures where the audience needs an absolute-risk feel, and to reader or
expert-elicitation studies, clinical-utility framing, abstracts and figure captions.
Pick an anchored contrast on the exposure, not a 1-unit step. Default: 25th to 75th
percentile (IQR), both endpoints in native units.
Translate to the outcome scale.
Regression slope b in native units: delta_outcome = b * (x_p75 - x_p25). Keep the sign:
a negative b is a decrease.
Per-SD slope (exposure standardized): delta_outcome = beta * (x_p75 - x_p25) / SD_x; a
fully standardized beta is also multiplied by SD_outcome.
A correlation is not a slope. Pearson r converts to the simple regression slope of the same
data (b = r * SD_outcome / SD_x), which is the mean change per unit only if the relation is
linear; Spearman's rho converts to no change in outcome units. Fit the outcome on the
exposure and translate that slope (Theil-Sen if outliers are why Spearman was used); for a
monotonic but curved association, report the fitted outcome at x_p25 and at x_p75 instead.
Report as: "going from {x_p25} to {x_p75} {units} is associated with about {delta_outcome}
{outcome units} on average", and state the linearity assumption behind it.
Bound the claim: report the contrast, the assumption and a CI on the coefficient; do not
imply causation from a crude or unadjusted estimate.
Output contract (clinical utility is a default, not an optional add-on):
OR/HR/RR primary outcomes → the relative measure and the absolute risk at a stated
baseline, the absolute risk difference, and NNT = 1/ARR (or NNH = 1/ARI), with the
baseline risk explicit. A relative-only headline is incomplete.
Continuous outcomes → the IQR/clinically anchored "Real-world translation" line beneath
the effect size.
Prediction / classification (incl. medical-AI) models → calibration (Brier score,
calibration plot, or calibration slope/intercept) alongside discrimination, because AUC alone
is insufficient; a decision-curve / net-benefit pass at the relevant threshold is standard
output. An incremental claim reports the added-value test on the new term (likelihood
ratio / Wald in the nested model), ΔC-statistic with its CI and Δnet benefit over the
established clinical model, not the new model's AUC alone; NRI only as the categorical,
event/non-event-split version, and IDI with caution. See
references/table-standards/table-types/incremental_value.md and the make-figuresdecision_curve exemplar (and render_core_figures.py for the rendered curve).
Error Handling
If a script fails, diagnose the likely cause (missing package, data format mismatch, wrong
column name) and present a fix. Do not rerun the same script more than once without modifying
it or asking the user.
If an R package is unavailable, suggest install.packages() and wait for user confirmation.
Output Conventions
Code, tables, figures and console output are in English.
Tables
Before generating any publication table, load:
${CLAUDE_SKILL_DIR}/references/table-standards/journal-profiles/{journal}.yaml if a target
journal is known (it sets footnote markers, P and CI format, title and abbreviation order)
${CLAUDE_SKILL_DIR}/references/table-standards/table-types/{type}.md for the table type
If no journal is specified, default to AMA style (Radiology profile)
Output formats (always generate all three): a CSV file (downstream use and archival), a
console markdown rendering (user review), and R gtsummary code (Word/LaTeX export). Read
${CLAUDE_SKILL_DIR}/references/table-standards/table-standards.md for the gtsummary pipeline
and the footnote placement order (general note, abbreviations, specific notes, probability
notes).
Validation checklist (run before finalizing any table):
No vertical lines — horizontal rules only (top, below header, bottom)
Binary variables show only one level (e.g., Male only)
Units in headers, not cells; consistent decimal places per column
Variability measure stated: mean (SD) or median (IQR)
Statistical test named (footnote or general note); exact P values, never "NS"
Effect sizes per clinically meaningful unit (per 10 years, not per 1 year)
Reference category stated for categorical predictors
Abbreviations defined in footnotes, self-contained per table
Figures
PDF (vector) + PNG (300 DPI), styled with figure_style.mplstyle (Arial, colorblind-safe
palette); width 3.5 inches (single column) or 7.0 inches (double column); axis labels with
units.
Analysis-Specific Guidelines
Before generating code for any row, read the files listed for it (paths relative to
${CLAUDE_SKILL_DIR}); they carry the method rules this file does not repeat.
references/analysis_guides/repeated_measures.md; for missing data see references/analysis_guides/missing_data.md (an LMM already uses every observed outcome under MAR, so missing outcomes alone do not call for MICE)
Comparing models: use a paired DeLong test for two separate scores on the same patients. For a
nested "baseline + new term" model fitted and evaluated on the same data, DeLong is not the
added-value test — test the term (likelihood ratio) and report ΔAUC with its CI.
The rules below have no separate guide.
Survey/Likert
Descriptives per item: median, IQR, frequency distribution. Group comparisons: Mann-Whitney
or Kruskal-Wallis (ordinal data). Visualization: diverging stacked bar chart.
Internal consistency: Cronbach's alpha with item-total correlations.
Reverse-coding guard (run before reliability): recode every negatively worded item
(min+max) - x before computing the scale total or Cronbach's alpha. An un-recoded reverse
item produces a negative item-rest correlation and can make alpha negative — a coding bug,
not evidence of a multidimensional construct; do not defend it as one. likert_summary.py
prints per-item item-rest correlations, flags negative ones as reverse-code suspects, warns on
a negative alpha, and applies the recode with --reverse-items E3 .... To screen at cleaning
time, run python3 "${CLAUDE_SKILL_DIR}/../clean-data/scripts/check_reverse_coding.py".
Applies to any multivariable adjustment (logistic / linear / Cox / propensity score / survey-
weighted) with a dose/duration variable anchored to a categorical exposure (pack-years under
smoking status, grams/week under alcohol use, cessation duration under former smoker):
Structural-zero guard (do not impute): a never-smoker's pack_years is a structural
zero — known to be 0 by definition of the category, not missing. Imputing it (MICE/MNAR)
fabricates a dose for unexposed subjects and corrupts the exposure contrast. Before imputing a
dose/duration column, set the implied zero explicitly (IF status == 'never' THEN dose = 0)
and impute only the genuinely missing residual among the exposed. /clean-data flags never
rows with a NULL dose (scripts/check_structural_zero.py).
Complete-case collapse (adjust for status, not dose): a dose variable in a complete-case
model drops the unexposed stratum wholesale when its zeros are stored as NULL, collapsing n
(commonly 40–60%) and distorting subgroup estimates. Adjust for the categorical status
(never/former/current); reserve the continuous dose for an exposed-only secondary
analysis. Report n before and after model fitting and confirm the denominator did not
silently collapse.
Covariate Selection: Over-adjustment in a Cross-Sectional Outcome Model
Applies to any cross-sectional / single-visit outcome regression (temporal order is not
observed). Select covariates causally, not statistically:
Do not adjust for a consequence or mediator of the outcome — that is over-adjustment /
collider bias and removes part of the effect under study. Signature case: with eGFR as the
outcome, serum uric acid is renally excreted (a lower eGFR raises urate), so it is an
outcome-consequence, not a confounder; blood pressure and HbA1c are often similarly
downstream. Classify each candidate covariate against a DAG as confounder / mediator /
outcome-consequence / collider, and keep only confounders in the primary model.
"It differs in Table 1" is not a confounder-selection criterion. Imbalance justifies
considering a variable; a mediator or outcome-consequence stays out however imbalanced it is.
Report the suspect-covariate sensitivity + VIF. Make a parsimonious, history-/design-based
model primary; report the fuller model as a sensitivity analysis that drops (or adds) the
suspect covariate and show whether the headline estimate moves. Print VIF and the n actually
fitted. If dropping the covariate materially changes the estimate, carry that to the abstract
and conclusion.
Compare adjusted vs unadjusted on the SAME frame. When extended adjustment adds covariates
with missingness, the analytic n shrinks (e.g. 84 → 49 events), and comparing that estimate
with the full-frame unadjusted one confounds adjustment with who was dropped. Refit the
unadjusted model on the reduced complete-case frame and report unadjusted and adjusted on that
frame beside the full-frame estimate; never describe "adjustment changed the estimate" from a
comparison across different frames (or use multiple imputation so all models share one frame).
Analyze Stats next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Controls error rates across thousands of simultaneous tests in genomics discovery using false-discovery-rate methods (Benjamini-Hochberg 1995; Benjamini-Yekutieli 2001 for arbitrary dependence…
A skill your agent uses for PhD-level expertise in data science, statistics, and machine learning: rigorous statistical analysis, experimental design, causal inference, advanced modeling, research…
A skill your agent uses when a clinical CSV/Excel dataset needs profiling and cleaning before analysis (missing values, outliers, duplicates, type mismatches).
A skill your agent uses when an institutional Word form (.doc/.docx IRB protocol, ethics application, grant template) must be filled without breaking its styles, tables, fonts or page layout.
A skill your agent uses when looking for research topics a longitudinal cohort database can answer (NHIS, UK Biobank, an institutional EMR or registry).
A skill your agent uses when data needs statistical analysis. Analyze Stats is an agent skill from Aperivue/medsci-skills. Use when data needs statistical analysis.
When should I use Analyze Stats?
Analyze Stats fits situations like: data needs statistical analysis; tasks that involve Statistics; tasks that involve Experimental design.
How do I install Analyze Stats in Claude Code?
Run `npx skills add Aperivue/medsci-skills --skill analyze-stats -a claude-code`. Or copy the skill folder (skills/analyze-stats in Aperivue/medsci-skills) into .claude/skills/analyze-stats in your project. Claude Code loads it when a task matches its description.
How do I install Analyze Stats in Codex?
Run `npx skills add Aperivue/medsci-skills --skill analyze-stats -a codex`. Or copy the skill folder (skills/analyze-stats in Aperivue/medsci-skills) into .agents/skills/analyze-stats in your project. Codex loads it when a task matches its description.
Can I use Analyze Stats in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Aperivue/medsci-skills --skill analyze-stats -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/analyze-stats, .gemini/skills/analyze-stats, .github/skills/analyze-stats and .opencode/skills/analyze-stats in your project.
What does Analyze Stats need to run?
Going by SKILL.md and its folder, Analyze Stats needs the command-line tools its instructions call (python3). Our summary lists: Python 3.
Does Analyze Stats access the network?
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Is Analyze Stats safe to install?
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
What licence does Analyze Stats use?
Analyze Stats is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Analyze Stats use?
About 7k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 116k tokens, read only when the agent opens those files.
What are the alternatives to Analyze Stats?
Skills that share tags, products or a category with Analyze Stats: Bio Experimental Design Multiple Testing (GPTomics/bioSkills, 1.2k stars), E1 (brycewang-stanford/Auto-Empirical-Research-Skills, 4.5k stars), Math Modeling Solver (Lupynow/math-modeling-skills, 416 stars) and Data Scientist (magnus919/hermes-profiles, 282 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Analyze Stats?
Aperivue (a GitHub organization) maintains it in Aperivue/medsci-skills, which has 331 GitHub stars. The repository holds 54 skills in this directory. The repository was last updated on October 5, 2026.
Source: Aperivue/medsci-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.