statistical-analysis
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseStatistical Analysis
统计分析
Overview
概述
Conduct hypothesis tests (t-tests, ANOVA, chi-square), regression, correlation, and Bayesian analyses with systematic assumption checking, effect sizes, and APA-style reporting. The goal is an analysis a reviewer could not tear apart: the right test, verified assumptions, honest effect sizes, and a complete write-up.
开展假设检验(t 检验、ANOVA、卡方检验)、回归、相关和贝叶斯分析,并系统地检查统计假设、计算效应量以及按 APA 风格报告结果。目标是产出一项审稿人无法轻易驳倒的分析:采用正确的检验、验证统计假设、如实呈现效应量,并提供完整的书面报告。
When to Use This Skill
何时使用本技能
Use this skill when:
- Conducting statistical hypothesis tests (t-tests, ANOVA, chi-square, non-parametric)
- Performing regression or correlation analyses
- Running Bayesian statistical analyses
- Checking statistical assumptions and diagnostics
- Calculating effect sizes and conducting power analyses
- Reporting statistical results in APA format
- Analyzing experimental or observational data for research
在以下情况下使用本技能:
- 开展统计假设检验(t 检验、ANOVA、卡方检验、非参数检验)
- 执行回归或相关分析 n- 运行贝叶斯统计分析
- 检查统计假设和诊断结果
- 计算效应量并开展功效分析
- 按 APA 格式报告统计结果
- 分析研究中的实验数据或观察数据
Installation
安装
Use uv to install the libraries used in this skill. Pin versions in production; unpinned installs are fine for exploration.
bash
undefined使用 uv 安装本技能所用的库。在生产环境中应固定版本;探索阶段可不固定版本。
bash
undefinedCore frequentist stack (Python 3.10+; 3.12+ recommended for latest SciPy/ArviZ)
Core frequentist stack (Python 3.10+; 3.12+ recommended for latest SciPy/ArviZ)
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn
uv pip install "pingouin>=0.6" "scipy>=1.11" "statsmodels>=0.14.6" pandas matplotlib seaborn
Bayesian modeling (PyMC 5 + ArviZ)
Bayesian modeling (PyMC 5 + ArviZ)
uv pip install "pymc>=5.0" "arviz>=1.0"
**Compatibility notes (verified against pingouin 0.6.1, statsmodels 0.14.6, arviz 1.2, 2026):**
- **Pingouin 0.6.0** renamed output columns to remove special characters: `p_val`, `cohen_d`, `CI95`, `p_unc` (previously `p-val`, `cohen-d`, `CI95%`, `p-unc` in 0.5.x). Examples below use the current names; if stuck on 0.5.x, use the hyphenated forms.
- **statsmodels + SciPy**: use `statsmodels>=0.14.6` with `scipy>=1.11` to avoid `_lazywhere` import errors on SciPy 1.16+.
- **ArviZ 1.x**: `az.summary()` now defaults to **89% intervals** (`eti89` columns) and the width parameter is `ci_prob` (not `hdi_prob`). To report a conventional 95% credible interval, pass `az.summary(trace, ci_prob=0.95)`.
- **One-sided Bayes Factors are gone from Pingouin**: `pg.ttest(..., alternative='greater')` silently drops the `BF10` column, and `pg.bayesfactor_ttest` raises on one-sided alternatives. For one-sided Bayesian tests, use PyMC directly (compute the posterior probability of the directional hypothesis) or JASP/R's BayesFactor.
For model-specific APIs (OLS, GLM, ARIMA), see the **statsmodels** skill. For PyMC workflows, see the **pymc** skill.
---uv pip install "pymc>=5.0" "arviz>=1.0"
**兼容性说明(已针对 pingouin 0.6.1、statsmodels 0.14.6、arviz 1.2、2026 验证):**
- **Pingouin 0.6.0** 重命名了输出列以移除特殊字符:`p_val`、`cohen_d`、`CI95`、`p_unc`(0.5.x 中分别使用 `p-val`、`cohen-d`、`CI95%`、`p-unc`)。下面的示例使用当前列名;如果受限于 0.5.x,请改用带连字符的形式。
- **statsmodels + SciPy**:使用 `statsmodels>=0.14.6` 和 `scipy>=1.11`,以避免在 SciPy 1.16+ 上出现 `_lazywhere` 导入错误。
- **ArviZ 1.x**:`az.summary()` 现在默认使用 **89% 区间**(`eti89` 列),宽度参数为 `ci_prob`(不再是 `hdi_prob`)。若要报告常规的 95% 可信区间,请传入 `az.summary(trace, ci_prob=0.95)`。
- **Pingouin 已不再支持单侧 Bayes Factors**:`pg.ttest(..., alternative='greater')` 会静默省略 `BF10` 列,而 `pg.bayesfactor_ttest` 遇到单侧备择假设时会抛出错误。对于单侧贝叶斯检验,请直接使用 PyMC(计算方向性假设的后验概率)或 JASP/R 的 `BayesFactor`。
有关模型专用 API(OLS、GLM、ARIMA),请参阅 **statsmodels** 技能。有关 PyMC 工作流,请参阅 **pymc** 技能。
---Analysis Workflow
分析工作流
Every sound analysis follows the same arc. Skipping steps is how analyses end up retracted, so work through them in order and say what you did at each one.
- Frame the question before touching the data. State the hypothesis, the outcome and predictor variables, and the design (independent vs. paired, number of groups). Commit to a planned test now — choosing the test after peeking at results is p-hacking, even when done innocently.
- Inspect the data. Per group: n, mean, SD, median, missing values. Plot the raw data (histograms or box plots) before any test. Unequal group sizes, missingness, floor/ceiling effects, and outliers all change what test is appropriate — surface them to the user rather than silently working around them.
- Select the test using the quick reference below, or for designs beyond the basics (counts, time-to-event, reliability, factorial).
references/test_selection_guide.md - Check assumptions with . If an assumption fails, switch to the remedial test (table below) and report both the plan and the change.
scripts/assumption_checks.py - Run the test and always compute the effect size alongside it — a p-value says an effect exists; the effect size says whether anyone should care.
- Report using the APA templates below, including descriptives, exact statistics, effect sizes with CIs, and the assumption checks performed.
If the user only needs one step (e.g., "how many participants do I need?"), jump straight to that section — but still confirm the design assumptions the calculation rests on.
每项严谨的分析都遵循相同的过程。跳过步骤正是分析最终被撤回的原因,因此应按顺序完成,并说明每一步采用了什么方法。
- 在接触数据之前明确问题。 陈述研究假设、结果变量和预测变量,以及研究设计(独立样本或配对样本、组数)。此时就应确定计划采用的检验——查看结果后再选择检验属于 ,即使本意并非如此也同样如此。
p-hacking - 检查数据。 按组统计 n、均值、SD、中位数和缺失值。在进行任何检验之前绘制原始数据(直方图或箱线图)。组间样本量不等、数据缺失、存在下限或上限效应以及离群值,都会影响适宜的检验方法——应向用户明确指出这些问题,而不是默默绕过。
- 选择检验。 使用下方快速参考,或参阅 ,了解基础场景之外的设计(计数数据、生存时间、可靠性、析因设计)。
references/test_selection_guide.md - 使用 检查统计假设。 如果某项假设不成立,请改用补救性检验(见下表),并同时报告原计划和变更内容。
scripts/assumption_checks.py - 运行检验,并且始终同时计算效应量——p 值说明效应是否存在;效应量则说明该效应是否值得关注。
- 报告。 使用下方 APA 模板,包含描述性统计量、精确统计量、带置信区间的效应量,以及已执行的统计假设检查。
如果用户只需要其中一步(例如“我需要多少参与者?”),可以直接进入对应章节——但仍需确认计算所依据的设计假设。
Test Selection Guide
检验选择指南
Quick Reference: Choosing the Right Test
快速参考:如何选择合适的检验
Use for comprehensive guidance (counts, survival, reliability, factorial designs). Quick reference:
references/test_selection_guide.mdComparing Two Groups:
- Independent, continuous, normal → Independent t-test
- Independent, continuous, non-normal → Mann-Whitney U test
- Paired, continuous, normal → Paired t-test
- Paired, continuous, non-normal → Wilcoxon signed-rank test
- Binary outcome → Chi-square or Fisher's exact test
Comparing 3+ Groups:
- Independent, continuous, normal → One-way ANOVA
- Independent, continuous, non-normal → Kruskal-Wallis test
- Paired, continuous, normal → Repeated measures ANOVA
- Paired, continuous, non-normal → Friedman test
Relationships:
- Two continuous variables → Pearson (normal) or Spearman correlation (non-normal)
- Continuous outcome with predictor(s) → Linear regression
- Binary outcome with predictor(s) → Logistic regression
Bayesian Alternatives:
All tests have Bayesian versions providing direct probability statements about hypotheses, Bayes Factors quantifying evidence, and the ability to support the null. See .
references/bayesian_statistics.md有关计数数据、生存分析、可靠性和析因设计的综合指导,请参阅 。快速参考如下:
references/test_selection_guide.md比较两个组:
- 独立、连续、正态 → 独立样本 t 检验
- 独立、连续、非正态 → Mann-Whitney U 检验
- 配对、连续、正态 → 配对样本 t 检验
- 配对、连续、非正态 → Wilcoxon 符号秩检验
- 二元结果 → 卡方检验或 Fisher 精确检验
比较三个或更多组:
- 独立、连续、正态 → 单因素 ANOVA
- 独立、连续、非正态 → Kruskal-Wallis 检验
- 配对、连续、正态 → 重复测量 ANOVA
- 配对、连续、非正态 → Friedman 检验
变量关系:
- 两个连续变量 → Pearson 相关(正态)或 Spearman 相关(非正态)
- 连续结果与一个或多个预测变量 → 线性回归
- 二元结果与一个或多个预测变量 → Logistic 回归
贝叶斯替代方法:
所有检验都有对应的贝叶斯版本,可直接陈述关于研究假设的概率、通过 Bayes Factors 量化证据,并能够为支持零假设提供依据。请参阅 。
references/bayesian_statistics.mdAssumption Checking
统计假设检查
Always check assumptions before interpreting test results, and report the checks — reviewers look for them.
Use the bundled module. Run Python from the skill directory () or add to :
scripts/assumption_checks.pyskills/statistical-analysis/scripts/sys.pathpython
from assumption_checks import comprehensive_assumption_check解释检验结果之前,务必检查统计假设,并报告检查过程——审稿人会关注这些内容。
使用随附的 模块。请从技能目录()运行 Python,或将 添加到 :
scripts/assumption_checks.pyskills/statistical-analysis/scripts/sys.pathpython
from assumption_checks import comprehensive_assumption_checkOutliers + normality (per group) + homogeneity of variance, with plots
Outliers + normality (per group) + homogeneity of variance, with plots
results = comprehensive_assumption_check(
data=df,
value_col='score',
group_col='group', # Optional: for group comparisons
alpha=0.05
)
For targeted checks, import individual functions:
```python
from assumption_checks import (
check_normality, # Shapiro-Wilk + Q-Q plot + histogram
check_normality_per_group,
check_homogeneity_of_variance, # Levene's test + box plots
check_linearity, # scatter + residual plot for simple regression
check_regression_diagnostics, # full OLS diagnostics (see Regression below)
detect_outliers # IQR or z-score methods
)
result = check_normality(data=df['score'], name='Test Score', alpha=0.05, plot=True)
print(result['interpretation'])
print(result['recommendation'])results = comprehensive_assumption_check(
data=df,
value_col='score',
group_col='group', # Optional: for group comparisons
alpha=0.05
)
如需执行针对性检查,可导入单独的函数:
```python
from assumption_checks import (
check_normality, # Shapiro-Wilk + Q-Q plot + histogram
check_normality_per_group,
check_homogeneity_of_variance, # Levene's test + box plots
check_linearity, # scatter + residual plot for simple regression
check_regression_diagnostics, # full OLS diagnostics (see Regression below)
detect_outliers # IQR or z-score methods
)
result = check_normality(data=df['score'], name='Test Score', alpha=0.05, plot=True)
print(result['interpretation'])
print(result['recommendation'])What to Do When Assumptions Are Violated
统计假设不满足时的处理方式
Normality violated:
- Mild violation + n > 30 per group → Proceed with parametric test (robust)
- Moderate violation → Use non-parametric alternative
- Severe violation → Transform data or use non-parametric test
Homogeneity of variance violated:
- For t-test → Use Welch's t-test (applies it automatically with
pg.ttest)correction='auto' - For ANOVA → Use Welch's ANOVA () or Brown-Forsythe
pg.welch_anova - For regression → Use robust standard errors or weighted least squares
Linearity violated (regression):
- Add polynomial terms, transform variables, or use non-linear models / GAM
Formal tests get oversensitive as n grows: for n ≥ 100, weigh the Q-Q plot more heavily than the Shapiro-Wilk p-value. See for comprehensive guidance.
references/assumptions_and_diagnostics.md正态性不满足:
- 轻度偏离且每组 n > 30 → 继续使用参数检验(具有稳健性)
- 中度偏离 → 使用非参数替代检验
- 严重偏离 → 转换数据或使用非参数检验
方差齐性不满足:
- 对于 t 检验 → 使用 Welch t 检验(使用
pg.ttest时会自动应用)correction='auto' - 对于 ANOVA → 使用 Welch ANOVA()或 Brown-Forsythe 检验
pg.welch_anova - 对于回归 → 使用稳健标准误或加权最小二乘法
线性不满足(回归):
- 添加多项式项、转换变量,或使用非线性模型/GAM
随着 n 增长,正式检验会变得过度敏感:当 n ≥ 100 时,应更重视 Q-Q 图,而不是 Shapiro-Wilk 的 p 值。有关完整指导,请参阅 。
references/assumptions_and_diagnostics.mdRunning Statistical Tests
运行统计检验
Primary libraries:
- pingouin: user-friendly tests that return effect sizes by default — prefer it for standard tests
- scipy.stats: core statistical tests
- statsmodels: regression, diagnostics, power analysis
- pymc + arviz: Bayesian modeling and diagnostics
主要库:
- pingouin:用户友好的检验,默认返回效应量——标准检验优先使用此库
- scipy.stats:核心统计检验
- statsmodels:回归、诊断和功效分析
- pymc + arviz:贝叶斯建模和诊断
T-Test with Complete Reporting
包含完整报告的 t 检验
python
import pingouin as pgpython
import pingouin as pgcorrection='auto' applies Welch's correction when variances are unequal
correction='auto' applies Welch's correction when variances are unequal
result = pg.ttest(group_a, group_b, correction='auto')
result = pg.ttest(group_a, group_b, correction='auto')
Pingouin >= 0.6 column names
Pingouin >= 0.6 column names
t_stat = result['T'].values[0]
df = result['dof'].values[0]
p_value = result['p_val'].values[0]
cohens_d = result['cohen_d'].values[0]
ci_lower, ci_upper = result['CI95'].values[0] # CI for the mean difference
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}, d = {cohens_d:.2f}")
undefinedt_stat = result['T'].values[0]
df = result['dof'].values[0]
p_value = result['p_val'].values[0]
cohens_d = result['cohen_d'].values[0]
ci_lower, ci_upper = result['CI95'].values[0] # CI for the mean difference
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}, d = {cohens_d:.2f}")
undefinedANOVA with Post-Hoc Tests
带事后检验的 ANOVA
python
import pingouin as pg
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)python
import pingouin as pg
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)Effect size: partial eta-squared
Effect size: partial eta-squared
eta_p2 = aov['np2'].values[0]
eta_p2 = aov['np2'].values[0]
If significant, conduct post-hoc tests (Tukey HSD controls family-wise error)
If significant, conduct post-hoc tests (Tukey HSD controls family-wise error)
if aov['p_unc'].values[0] < 0.05:
posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
print(posthoc) # includes Hedges' g per pair
undefinedif aov['p_unc'].values[0] < 0.05:
posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
print(posthoc) # includes Hedges' g per pair
undefinedLinear Regression with Diagnostics
带诊断的线性回归
python
import statsmodels.api as sm
from assumption_checks import check_regression_diagnostics
X = sm.add_constant(X_predictors) # Add intercept
model = sm.OLS(y, X).fit()
print(model.summary())python
import statsmodels.api as sm
from assumption_checks import check_regression_diagnostics
X = sm.add_constant(X_predictors) # Add intercept
model = sm.OLS(y, X).fit()
print(model.summary())4-panel residual plot + Shapiro-Wilk, Breusch-Pagan, Durbin-Watson, VIF
4-panel residual plot + Shapiro-Wilk, Breusch-Pagan, Durbin-Watson, VIF
diag = check_regression_diagnostics(model)
print(diag['interpretation'])
print(diag['vif'])
diag = check_regression_diagnostics(model)
print(diag['interpretation'])
print(diag['vif'])
If heteroscedasticity was flagged, report robust standard errors instead
If heteroscedasticity was flagged, report robust standard errors instead
robust = model.get_robustcov_results('HC3')
undefinedrobust = model.get_robustcov_results('HC3')
undefinedBayesian T-Test
贝叶斯 t 检验
python
import pymc as pm
import arviz as az
import numpy as np
with pm.Model() as model:
# Priors
mu1 = pm.Normal('mu_group1', mu=0, sigma=10)
mu2 = pm.Normal('mu_group2', mu=0, sigma=10)
sigma = pm.HalfNormal('sigma', sigma=10)
# Likelihood
y1 = pm.Normal('y1', mu=mu1, sigma=sigma, observed=group_a)
y2 = pm.Normal('y2', mu=mu2, sigma=sigma, observed=group_b)
# Derived quantity
diff = pm.Deterministic('difference', mu1 - mu2)
trace = pm.sample(2000, tune=1000)python
import pymc as pm
import arviz as az
import numpy as np
with pm.Model() as model:
# Priors
mu1 = pm.Normal('mu_group1', mu=0, sigma=10)
mu2 = pm.Normal('mu_group2', mu=0, sigma=10)
sigma = pm.HalfNormal('sigma', sigma=10)
# Likelihood
y1 = pm.Normal('y1', mu=mu1, sigma=sigma, observed=group_a)
y2 = pm.Normal('y2', mu=mu2, sigma=sigma, observed=group_b)
# Derived quantity
diff = pm.Deterministic('difference', mu1 - mu2)
trace = pm.sample(2000, tune=1000)ArviZ 1.x defaults to 89% intervals; request 95% explicitly for reporting
ArviZ 1.x defaults to 89% intervals; request 95% explicitly for reporting
print(az.summary(trace, var_names=['difference'], ci_prob=0.95))
print(az.summary(trace, var_names=['difference'], ci_prob=0.95))
Direct probability statement (this is what one-sided questions become)
Direct probability statement (this is what one-sided questions become)
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(mu1 > mu2 | data) = {prob_greater:.3f}")
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(mu1 > mu2 | data) = {prob_greater:.3f}")
ArviZ 1.x removed az.plot_posterior; use plot_dist (on 0.x, plot_posterior still works)
ArviZ 1.x removed az.plot_posterior; use plot_dist (on 0.x, plot_posterior still works)
az.plot_dist(trace, var_names=['difference'], ci_prob=0.95)
Scale priors to the data (e.g., `sigma=10` suits outcomes with SD near 10; use the observed SD as a guide) and state the priors in the report.
---az.plot_dist(trace, var_names=['difference'], ci_prob=0.95)
应根据数据调整先验尺度(例如,当结果变量的 SD 接近 10 时,`sigma=10`较为合适),并在报告中说明先验设置。
---Effect Sizes
效应量
Effect sizes quantify magnitude; p-values only indicate existence. Report one for every test. See for the full guide.
references/effect_sizes_and_power.md效应量用于量化大小;p 值仅表示效应是否存在。 每项检验都应报告效应量。有关完整指南,请参阅 。
references/effect_sizes_and_power.mdQuick Reference: Common Effect Sizes
快速参考:常见效应量
| Test | Effect Size | Small | Medium | Large |
|---|---|---|---|---|
| T-test | Cohen's d | 0.20 | 0.50 | 0.80 |
| ANOVA | η²_p | 0.01 | 0.06 | 0.14 |
| Correlation | r | 0.10 | 0.30 | 0.50 |
| Regression | R² | 0.02 | 0.13 | 0.26 |
| Chi-square | Cramér's V | 0.07 | 0.21 | 0.35 |
Benchmarks are conventions, not laws — a "small" effect can matter enormously (drug side effects) and a "large" one can be trivial. Interpret in context.
| 检验 | 效应量 | 小 | 中 | 大 |
|---|---|---|---|---|
| t 检验 | Cohen's d | 0.20 | 0.50 | 0.80 |
| ANOVA | η²_p | 0.01 | 0.06 | 0.14 |
| 相关 | r | 0.10 | 0.30 | 0.50 |
| 回归 | R² | 0.02 | 0.13 | 0.26 |
| 卡方检验 | Cramér's V | 0.07 | 0.21 | 0.35 |
这些基准只是惯例,而非定律——“小”效应也可能产生巨大影响(例如药物副作用),而“大”效应也可能无关紧要。应结合具体情境进行解释。
Calculating Effect Sizes
计算效应量
Pingouin returns effect sizes with its tests ( from , from , from ; from is already an effect size).
cohen_dpg.ttestnp2pg.anovahedgespg.pairwise_tukeyrpg.corrPingouin 会在执行检验时返回效应量( 返回 , 返回 , 返回 ; 返回的 本身就是效应量)。
pg.ttestcohen_dpg.anovanp2pg.pairwise_tukeyhedgespg.corrrConfidence Intervals for Effect Sizes
效应量的置信区间
Report a CI for the effect size to show its precision. Use (note: returns only the point estimate — it does not return a CI):
pg.compute_escipg.compute_effsize_from_tpython
import pingouin as pg
d = pg.compute_effsize(group_a, group_b, eftype='cohen')
ci_lower, ci_upper = pg.compute_esci(stat=d, nx=len(group_a), ny=len(group_b),
eftype='cohen', confidence=0.95)
print(f"d = {d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")报告效应量的置信区间,以展示其精确度。请使用 (注意: 仅返回点估计,不会返回置信区间):
pg.compute_escipg.compute_effsize_from_tpython
import pingouin as pg
d = pg.compute_effsize(group_a, group_b, eftype='cohen')
ci_lower, ci_upper = pg.compute_esci(stat=d, nx=len(group_a), ny=len(group_b),
eftype='cohen', confidence=0.95)
print(f"d = {d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")Power Analysis
功效分析
A Priori Power Analysis (Study Planning)
先验功效分析(研究规划)
Determine required sample size before data collection:
python
from statsmodels.stats.power import tt_ind_solve_power, FTestAnovaPower在收集数据之前确定所需样本量:
python
from statsmodels.stats.power import tt_ind_solve_power, FTestAnovaPowerT-test: What n per group is needed to detect d = 0.5?
T-test: What n per group is needed to detect d = 0.5?
n_required = tt_ind_solve_power(
effect_size=0.5,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Required n per group: {n_required:.0f}")
n_required = tt_ind_solve_power(
effect_size=0.5,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Required n per group: {n_required:.0f}")
One-way ANOVA: What n is needed to detect Cohen's f = 0.25?
One-way ANOVA: What n is needed to detect Cohen's f = 0.25?
Notes: the parameter is k_groups; effect_size is Cohen's f (f = sqrt(eta2/(1-eta2)));
Notes: the parameter is k_groups; effect_size is Cohen's f (f = sqrt(eta2/(1-eta2)));
and solve_power returns the TOTAL sample size, not n per group.
and solve_power returns the TOTAL sample size, not n per group.
import math
anova_power = FTestAnovaPower()
n_total = anova_power.solve_power(
effect_size=0.25,
k_groups=3,
alpha=0.05,
power=0.80
)
print(f"Required total N: {math.ceil(n_total)} ({math.ceil(n_total / 3)} per group)")
undefinedimport math
anova_power = FTestAnovaPower()
n_total = anova_power.solve_power(
effect_size=0.25,
k_groups=3,
alpha=0.05,
power=0.80
)
print(f"Required total N: {math.ceil(n_total)} ({math.ceil(n_total / 3)} per group)")
undefinedSensitivity Analysis (Post-Study)
敏感性分析(研究完成后)
Determine what effect size the study could detect:
python
undefined确定研究能够检测到的效应量:
python
undefinedWith n=50 per group, what effect could we detect at 80% power?
With n=50 per group, what effect could we detect at 80% power?
detectable_d = tt_ind_solve_power(
effect_size=None, # Solve for this
nobs1=50,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Study could detect d >= {detectable_d:.2f}")
**Note**: Post-hoc "observed power" (computing power from the observed effect) is circular and misleading — it is a deterministic function of the p-value. If a study is done and someone asks about power, run a sensitivity analysis instead.
See `references/effect_sizes_and_power.md` for detailed guidance.
---detectable_d = tt_ind_solve_power(
effect_size=None, # Solve for this
nobs1=50,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"Study could detect d >= {detectable_d:.2f}")
**注意:** 事后计算“观察功效”(根据观察到的效应计算功效)是循环论证且会产生误导——它是 p 值的确定性函数。如果研究已经完成且有人询问功效,应改为开展敏感性分析。
有关详细指导,请参阅 `references/effect_sizes_and_power.md`。
---Reporting Results
结果报告
Follow for APA style. Every report needs:
references/reporting_standards.md- Descriptive statistics: M, SD, n for all groups/variables
- Test statistics: Test name, statistic, df, exact p-value (, not
p = .034; usep < .05only below .001)p < .001 - Effect sizes: With confidence intervals
- Assumption checks: Which tests were run, results, and actions taken
- All planned analyses: Including non-significant findings — omitting them is cherry-picking
APA 风格报告请遵循 。每份报告都需要包含:
references/reporting_standards.md- 描述性统计:所有组或变量的 M、SD、n
- 检验统计量:检验名称、统计量、df、精确 p 值(使用 ,而不是
p = .034;仅当 p 值低于 .001 时才使用p < .05)p < .001 - 效应量:附置信区间
- 统计假设检查:执行了哪些检验、结果如何,以及采取了哪些处理措施
- 所有计划分析:包括不显著结果——遗漏这些结果属于挑选性报告
Example Report Templates
报告模板示例
Independent T-Test
独立样本 t 检验
Group A (n = 48, M = 75.2, SD = 8.5) scored significantly higher than
Group B (n = 52, M = 68.3, SD = 9.2), t(98) = 3.82, p < .001, d = 0.77,
95% CI [0.36, 1.18], two-tailed. Assumptions of normality (Shapiro-Wilk:
Group A W = 0.97, p = .18; Group B W = 0.96, p = .12) and homogeneity
of variance (Levene's F(1, 98) = 1.23, p = .27) were satisfied.Group A (n = 48, M = 75.2, SD = 8.5) scored significantly higher than
Group B (n = 52, M = 68.3, SD = 9.2), t(98) = 3.82, p < .001, d = 0.77,
95% CI [0.36, 1.18], two-tailed. Assumptions of normality (Shapiro-Wilk:
Group A W = 0.97, p = .18; Group B W = 0.96, p = .12) and homogeneity
of variance (Levene's F(1, 98) = 1.23, p = .27) were satisfied.One-Way ANOVA
单因素 ANOVA
A one-way ANOVA revealed a significant main effect of treatment condition
on test scores, F(2, 147) = 8.45, p < .001, η²_p = .10. Post hoc
comparisons using Tukey's HSD indicated that Condition A (M = 78.2,
SD = 7.3) scored significantly higher than Condition B (M = 71.5,
SD = 8.1, p = .002, d = 0.87) and Condition C (M = 70.1, SD = 7.9,
p < .001, d = 1.07). Conditions B and C did not differ significantly
(p = .52, d = 0.18).A one-way ANOVA revealed a significant main effect of treatment condition
on test scores, F(2, 147) = 8.45, p < .001, η²_p = .10. Post hoc
comparisons using Tukey's HSD indicated that Condition A (M = 78.2,
SD = 7.3) scored significantly higher than Condition B (M = 71.5,
SD = 8.1, p = .002, d = 0.87) and Condition C (M = 70.1, SD = 7.9,
p < .001, d = 1.07). Conditions B and C did not differ significantly
(p = .52, d = 0.18).Multiple Regression
多元回归
Multiple linear regression was conducted to predict exam scores from
study hours, prior GPA, and attendance. The overall model was significant,
F(3, 146) = 45.2, p < .001, R² = .48, adjusted R² = .47. Study hours
(B = 1.80, SE = 0.31, β = .35, t = 5.78, p < .001, 95% CI [1.18, 2.42])
and prior GPA (B = 8.52, SE = 1.95, β = .28, t = 4.37, p < .001,
95% CI [4.66, 12.38]) were significant predictors, while attendance was
not (B = 0.15, SE = 0.12, β = .08, t = 1.25, p = .21, 95% CI [-0.09, 0.39]).
Multicollinearity was not a concern (all VIF < 1.5).Multiple linear regression was conducted to predict exam scores from
study hours, prior GPA, and attendance. The overall model was significant,
F(3, 146) = 45.2, p < .001, R² = .48, adjusted R² = .47. Study hours
(B = 1.80, SE = 0.31, β = .35, t = 5.78, p < .001, 95% CI [1.18, 2.42])
and prior GPA (B = 8.52, SE = 1.95, β = .28, t = 4.37, p < .001,
95% CI [4.66, 12.38]) were significant predictors, while attendance was
not (B = 0.15, SE = 0.12, β = .08, t = 1.25, p = .21, 95% CI [-0.09, 0.39]).
Multicollinearity was not a concern (all VIF < 1.5).Bayesian Analysis
贝叶斯分析
A Bayesian independent samples t-test was conducted using weakly
informative priors (Normal(0, 10) for group means). The posterior
distribution indicated that Group A scored higher than Group B
(M_diff = 6.8, 95% credible interval [3.2, 10.4]), with a 99.8%
posterior probability that Group A's mean exceeded Group B's mean.
Convergence diagnostics were satisfactory (all R-hat < 1.01, ESS > 1000).If a non-parametric test was used, report medians rather than means, the U/W/H statistic, and a rank-based effect size (e.g., rank-biserial correlation, returned by as ).
pg.mwuRBCA Bayesian independent samples t-test was conducted using weakly
informative priors (Normal(0, 10) for group means). The posterior
distribution indicated that Group A scored higher than Group B
(M_diff = 6.8, 95% credible interval [3.2, 10.4]), with a 99.8%
posterior probability that Group A's mean exceeded Group B's mean.
Convergence diagnostics were satisfactory (all R-hat < 1.01, ESS > 1000).如果使用了非参数检验,应报告中位数而非均值、U/W/H 统计量,以及基于秩的效应量(例如 返回的秩二列相关 )。
pg.mwuRBCBayesian Statistics
贝叶斯统计
Consider Bayesian approaches when:
- You have prior information to incorporate
- You want direct probability statements about hypotheses ("there is a 95% probability the effect lies in this interval")
- Sample size is small or data collection is sequential (no correction needed for optional stopping)
- You need to quantify evidence for the null hypothesis
- The model is complex (hierarchical structure, missing data)
See for prior specification, Bayes Factors, credible intervals, hierarchical models, and convergence checking (R-hat < 1.01, sufficient ESS, posterior predictive checks).
references/bayesian_statistics.md在以下情况下考虑采用贝叶斯方法:
- 需要纳入先验信息
- 希望直接陈述关于研究假设的概率(“有 95% 的概率表明效应位于此区间内”)
- 样本量较小或数据收集是序贯进行的(无需针对可选停止进行校正)
- 需要量化支持零假设的证据
- 模型较为复杂(层级结构、缺失数据)
有关先验设定、Bayes Factors、可信区间、层级模型和收敛检查(R-hat < 1.01、ESS 足够、进行后验预测检查),请参阅 。
references/bayesian_statistics.mdBundled Resources
随附资源
References (references/
)
references/参考资料(references/
)
references/- test_selection_guide.md: Decision tree covering group comparisons, relationships, counts, time-to-event, agreement/reliability, and categorical analysis
- assumptions_and_diagnostics.md: Detailed guidance on checking and handling assumption violations
- effect_sizes_and_power.md: Calculating, interpreting, and reporting effect sizes; power analysis
- bayesian_statistics.md: Priors, Bayes Factors, credible intervals, hierarchical models, diagnostics
- reporting_standards.md: APA-style reporting guidelines with worked examples
- test_selection_guide.md:涵盖组间比较、变量关系、计数数据、生存时间、一致性与可靠性及分类分析的决策树
- assumptions_and_diagnostics.md:检查和处理统计假设违反问题的详细指导
- effect_sizes_and_power.md:效应量的计算、解释和报告,以及功效分析
- bayesian_statistics.md:先验、Bayes Factors、可信区间、层级模型和诊断
- reporting_standards.md:APA 风格报告指南及实例
Scripts (scripts/
)
scripts/脚本(scripts/
)
scripts/- assumption_checks.py: Automated assumption checking with visualizations
- : outliers + normality + variance homogeneity in one call
comprehensive_assumption_check() - ,
check_normality(): Shapiro-Wilk with Q-Q plotscheck_normality_per_group() - : Levene's test with box plots
check_homogeneity_of_variance() - : 4-panel residual plots + Shapiro-Wilk, Breusch-Pagan, Durbin-Watson, VIF for fitted OLS models
check_regression_diagnostics() - ,
check_linearity()detect_outliers()
- assumption_checks.py:自动执行统计假设检查并生成可视化结果
- :一次调用即可完成离群值、正态性和方差齐性检查
comprehensive_assumption_check() - 、
check_normality():执行 Shapiro-Wilk 检验并生成 Q-Q 图check_normality_per_group() - :执行 Levene 检验并生成箱线图
check_homogeneity_of_variance() - :针对拟合的 OLS 模型生成四联残差图,并执行 Shapiro-Wilk、Breusch-Pagan、Durbin-Watson 和 VIF 检查
check_regression_diagnostics() - 、
check_linearity()detect_outliers()
Statistical Integrity
统计完整性
These are the practices that keep an analysis defensible. They matter because the most common statistical failures are not computational errors — they are silent flexibility (testing until something works) and selective reporting.
- Distinguish confirmatory from exploratory. State the planned analysis before running it; label anything discovered along the way as exploratory.
- Don't shop for significance. If the planned test is non-significant, that is the result. Trying alternative tests, subgroups, or outlier-removal schemes until p < .05 invalidates the p-value.
- Correct for multiple comparisons when running families of tests (Tukey HSD for post-hoc ANOVA; Holm or Benjamini-Hochberg FDR for other families) and say which correction was used.
- A non-significant result is not evidence of no effect. With small n, the study may simply have been underpowered — run a sensitivity analysis, or use a Bayesian analysis / equivalence test to actually quantify support for the null.
- Statistical significance is not practical importance. With large n, trivial effects reach p < .001. Lead the interpretation with the effect size.
- Understand missing data before dropping rows. Listwise deletion is only safe when data are missing completely at random; otherwise consider multiple imputation and say what was done.
- Make it reproducible. Set random seeds, report library versions for simulation-based methods, and keep the analysis in a runnable script.
以下实践能够确保分析经得起质疑。它们之所以重要,是因为最常见的统计失误并非计算错误——而是隐性的分析自由度(不断尝试直到得到显著结果)和选择性报告。
- 区分验证性分析与探索性分析。 在运行分析前说明计划;将分析过程中发现的内容标记为探索性结果。
- 不要到处寻找显著性。 如果计划采用的检验结果不显著,这就是结果。不断尝试其他检验、子组或离群值剔除方案,直到 p < .05,会使 p 值失效。
- 进行多重比较校正。 当运行一组检验时,应进行校正(ANOVA 事后检验使用 Tukey HSD;其他检验组使用 Holm 或 Benjamini-Hochberg FDR),并说明使用了哪种校正方法。
- 不显著结果并不等同于没有效应的证据。 当 n 较小时,研究可能只是功效不足——应开展敏感性分析,或使用贝叶斯分析/等效性检验实际量化对零假设的支持程度。
- 统计显著性并不等同于实际重要性。 当 n 较大时,即使效应很小也可能达到 p < .001。解释结果时应首先关注效应量。
- 删除行之前先了解缺失数据。 只有当数据完全随机缺失时,按行删除才是安全的;否则应考虑多重插补,并说明所采用的处理方法。
- 确保结果可复现。 设置随机种子,报告基于模拟的方法所使用的库版本,并将分析保存在可运行的脚本中。
Related skills
相关技能
- : Sample-size and statistical power calculations for planning studies.
statistical-power - : Statistical models library for Python.
statsmodels - : Search scientific papers and retrieve structured experimental data extracted from full-text studies via the BGPT MCP server.
bgpt-paper-search
- :用于研究规划的样本量和统计功效计算。
statistical-power - :Python 统计模型库。
statsmodels - :通过 BGPT MCP server 搜索科学论文,并检索从全文研究中提取的结构化实验数据。
bgpt-paper-search