mcpField
S
statistical-analysis

statistical-analysis

github.com/ovachiever数据与数据库5654 次安装48 周前更新
代码仓库

关于 statistical-analysis

statistical-analysis 是用于研究数据分析的技能,支持分析规划、假设检验、前提检查和结果报告。它涵盖频率学派与贝叶斯方法、效应量、功效分析及 APA 格式输出。

主要功能

  1. 01统计检验选择与功效规划
  2. 02结合诊断图检查分析前提
  3. 03假设检验、回归与相关分析
  4. 04贝叶斯分析和贝叶斯因子
  5. 05效应量与置信区间
  6. 06APA 报告、图表与表格

适用场景

  1. 01为实验数据选择检验方法
  2. 02解释结果前检查分析前提
  3. 03估算研究所需样本量
  4. 04整理 APA 格式统计结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --skill statistical-analysis

安装后在 Claude Code 中输入/statistical-analysis确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
assumptions_and_diagnostics.md
bayesian_statistics.md
effect_sizes_and_power.md
reporting_standards.md
test_selection_guide.md
scripts/
assumption_checks.py

详细介绍

统计分析

概述

统计分析是一个系统性的过程,用于检验假设并量化变量之间的关系。执行假设检验(t 检验、ANOVA、卡方检验)、回归、相关分析和贝叶斯分析,并进行假设检验和 APA 格式报告。在进行学术研究时应用此技能。

何时使用此技能

此技能应在以下情况下使用:

  • 进行统计假设检验(t 检验、ANOVA、卡方检验)
  • 执行回归或相关分析
  • 运行贝叶斯统计分析
  • 检查统计假设和诊断
  • 计算效应量并进行功效分析
  • 以 APA 格式报告统计结果
  • 分析实验或观察数据用于研究

核心能力

1. 检验选择与规划
  • 根据研究问题和数据特征选择合适的统计检验
  • 进行先验功效分析以确定所需的样本量
  • 规划分析策略,包括多重比较校正
2. 假设检查
  • 在运行检验前自动验证所有相关假设
  • 提供诊断可视化(Q-Q 图、残差图、箱线图)
  • 当假设被违反时推荐补救措施
3. 统计检验
  • 假设检验:t 检验、ANOVA、卡方检验、非参数替代方法
  • 回归:线性、多元、逻辑回归,并附带诊断
  • 相关性:Pearson、Spearman,并附带置信区间
  • 贝叶斯替代方法:贝叶斯 t 检验、ANOVA、回归,并附带贝叶斯因子
4. 效应量与解释
  • 为所有分析计算并解释适当的效应量
  • 为效应估计提供置信区间
  • 区分统计显著性与实际显著性
5. 专业报告
  • 生成 APA 风格的统计报告
  • 创建适合发表的图表
  • 提供包含所有必要统计量的完整解释

工作流决策树

使用此决策树确定您的分析路径:

START
│
├─ Need to SELECT a statistical test?
│  └─ YES → See "Test Selection Guide"
│  └─ NO → Continue
│
├─ Ready to check ASSUMPTIONS?
│  └─ YES → See "Assumption Checking"
│  └─ NO → Continue
│
├─ Ready to run ANALYSIS?
│  └─ YES → See "Running Statistical Tests"
│  └─ NO → Continue
│
└─ Need to REPORT results?
   └─ YES → See "Reporting Results"

检验选择指南

快速参考:选择合适的检验

使用 references/test_selection_guide.md 获取全面指导。快速参考:

比较两组:

  • 独立、连续、正态 → 独立 t 检验
  • 独立、连续、非正态 → Mann-Whitney U 检验
  • 配对、连续、正态 → 配对 t 检验
  • 配对、连续、非正态 → Wilcoxon 符号秩检验
  • 二分类结果 → 卡方检验或 Fisher 精确检验

比较 3 组及以上:

  • 独立、连续、正态 → 单因素 ANOVA
  • 独立、连续、非正态 → Kruskal-Wallis 检验
  • 配对、连续、正态 → 重复测量 ANOVA
  • 配对、连续、非正态 → Friedman 检验

关系:

  • 两个连续变量 → Pearson(正态)或 Spearman 相关(非正态)
  • 连续结果与预测变量 → 线性回归
  • 二分类结果与预测变量 → 逻辑回归

贝叶斯替代方法: 所有检验都有贝叶斯版本,提供:

  • 关于假设的直接概率陈述
  • 量化证据的贝叶斯因子
  • 支持零假设的能力
  • 参见 references/bayesian_statistics.md

假设检查

系统性假设验证

在解释检验结果之前,始终检查假设。

使用提供的 scripts/assumption_checks.py 模块进行自动检查:

from scripts.assumption_checks import comprehensive_assumption_check

# Comprehensive check with visualizations
results = comprehensive_assumption_check(
    data=df,
    value_col='score',
    group_col='group',  # Optional: for group comparisons
    alpha=0.05
)

这会执行:

  1. 异常值检测(IQR 和 z 分数方法)
  2. 正态性检验(Shapiro-Wilk 检验 + Q-Q 图)
  3. 方差齐性(Levene 检验 + 箱线图)
  4. 解释与建议
单独假设检查

对于针对性检查,使用单独的函数:

from scripts.assumption_checks import (
    check_normality,
    check_normality_per_group,
    check_homogeneity_of_variance,
    check_linearity,
    detect_outliers
)

# Example: Check normality with visualization
result = check_normality(
    data=df['score'],
    name='Test Score',
    alpha=0.05,
    plot=True
)
print(result['interpretation'])
print(result['recommendation'])
假设被违反时该怎么办

正态性被违反:

  • 轻度违反 + 每组 n > 30 → 继续使用参数检验(稳健)
  • 中度违反 → 使用非参数替代方法
  • 严重违反 → 变换数据或使用非参数检验

方差齐性被违反:

  • 对于 t 检验 → 使用 Welch's t-test
  • 对于 ANOVA → 使用 Welch's ANOVA 或 Brown-Forsythe ANOVA
  • 对于回归 → 使用稳健标准误或加权最小二乘法

线性被违反(回归):

  • 添加多项式项
  • 变换变量
  • 使用非线性模型或 GAM

有关全面指导,请参阅 references/assumptions_and_diagnostics.md。


运行统计检验

Python 库

用于统计分析的主要库:

  • scipy.stats:核心统计检验
  • statsmodels:高级回归与诊断
  • pingouin:用户友好的统计检验,并附带效应量
  • pymc:贝叶斯统计建模
  • arviz:贝叶斯可视化与诊断
示例分析
带完整报告的 T 检验
import pingouin as pg
import numpy as np

# Run independent t-test
result = pg.ttest(group_a, group_b, correction='auto')

# Extract results
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 = result['CI95%'].values[0][0]
ci_upper = result['CI95%'].values[0][1]

# Report
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}")
print(f"Cohen's d = {cohens_d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")
带事后检验的 ANOVA
import pingouin as pg

# One-way ANOVA
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)

# If significant, conduct post-hoc tests
if aov['p-unc'].values[0] < 0.05:
    posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
    print(posthoc)

# Effect size
eta_squared = aov['np2'].values[0]  # Partial eta-squared
print(f"Partial η² = {eta_squared:.3f}")
带诊断的线性回归
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# Fit model
X = sm.add_constant(X_predictors)  # Add intercept
model = sm.OLS(y, X).fit()

# Summary
print(model.summary())

# Check multicollinearity (VIF)
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

# Check assumptions
residuals = model.resid
fitted = model.fittedvalues

# Residual plots
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Residuals vs fitted
axes[0, 0].scatter(fitted, residuals, alpha=0.6)
axes[0, 0].axhline(y=0, color='r', linestyle='--')
axes[0, 0].set_xlabel('Fitted values')
axes[0, 0].set_ylabel('Residuals')
axes[0, 0].set_title('Residuals vs Fitted')

# Q-Q plot
from scipy import stats
stats.probplot(residuals, dist="norm", plot=axes[0, 1])
axes[0, 1].set_title('Normal Q-Q')

# Scale-Location
axes[1, 0].scatter(fitted, np.sqrt(np.abs(residuals / residuals.std())), alpha=0.6)
axes[1, 0].set_xlabel('Fitted values')
axes[1, 0].set_ylabel('√|Standardized residuals|')
axes[1, 0].set_title('Scale-Location')

# Residuals histogram
axes[1, 1].hist(residuals, bins=20, edgecolor='black', alpha=0.7)
axes[1, 1].set_xlabel('Residuals')
axes[1, 1].set_ylabel('Frequency')
axes[1, 1].set_title('Histogram of Residuals')

plt.tight_layout()
plt.show()
贝叶斯 T 检验
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)

    # Sample
    trace = pm.sample(2000, tune=1000, return_inferencedata=True)

# Summarize
print(az.summary(trace, var_names=['difference']))

# Probability that group1 > group2
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(μ₁ > μ₂ | data) = {prob_greater:.3f}")

# Plot posterior
az.plot_posterior(trace, var_names=['difference'], ref_val=0)

效应量

始终计算效应量

效应量量化大小,而 p 值仅表明效应是否存在。

有关全面指导,请参阅 references/effect_sizes_and_power.md。

快速参考:常见效应量
检验效应量小中大
T 检验Cohen's d0.200.500.80
ANOVAη²_p0.010.060.14
相关r0.100.300.50
回归R²0.020.130.26
卡方Cramér's V0.070.210.35

重要:基准值仅供参考。具体情境很重要!

计算效应量

大多数效应量由 pingouin 自动计算:

# T-test returns Cohen's d
result = pg.ttest(x, y)
d = result['cohen-d'].values[0]

# ANOVA returns partial eta-squared
aov = pg.anova(dv='score', between='group', data=df)
eta_p2 = aov['np2'].values[0]

# Correlation: r is already an effect size
corr = pg.corr(x, y)
r = corr['r'].values[0]
效应量的置信区间

始终报告 CI 以显示精确度:

from pingouin import compute_effsize_from_t

# For t-test
d, ci = compute_effsize_from_t(
    t_statistic,
    nx=len(group1),
    ny=len(group2),
    eftype='cohen'
)
print(f"d = {d:.2f}, 95% CI [{ci[0]:.2f}, {ci[1]:.2f}]")

功效分析

先验功效分析(研究规划)

在数据收集前确定所需样本量:

from statsmodels.stats.power import (
    tt_ind_solve_power,
    FTestAnovaPower
)

# T-test: What n 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}")

# ANOVA: What n is needed to detect f = 0.25?
anova_power = FTestAnovaPower()
n_per_group = anova_power.solve_power(
    effect_size=0.25,
    ngroups=3,
    alpha=0.05,
    power=0.80
)
print(f"Required n per group: {n_per_group:.0f}")
敏感性分析(研究后)

确定你可以检测到的效应量:

# With n=50 per group, what effect could we detect?
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}")

注意:通常不建议进行事后功效分析(研究后计算功效)。请改用敏感性分析。

有关详细指导,请参阅 references/effect_sizes_and_power.md。


报告结果

APA 风格统计报告

遵循 references/reporting_standards.md 中的指南。

必备报告要素
  1. 描述性统计:所有组/变量的 M、SD、n
  2. 检验统计量:检验名称、统计量、df、精确 p 值
  3. 效应量:附带置信区间
  4. 假设检查:进行了哪些检验、结果、采取的措施
  5. 所有计划的分析:包括不显著的结果
示例报告模板
独立样本 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.
单因素 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).
多元回归
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).
贝叶斯分析
A Bayesian independent samples t-test was conducted using weakly
informative priors (Normal(0, 1) for mean difference). The posterior
distribution indicated that Group A scored higher than Group B
(M_diff = 6.8, 95% credible interval [3.2, 10.4]). The Bayes Factor
BF₁₀ = 45.3 provided very strong evidence for a difference between
groups, with a 99.8% posterior probability that Group A's mean exceeded
Group B's mean. Convergence diagnostics were satisfactory (all R̂ < 1.01,
ESS > 1000).

贝叶斯统计

何时使用贝叶斯方法

在以下情况下考虑贝叶斯方法:

  • 你有先验信息需要纳入
  • 你想要关于假设的直接概率陈述
  • 样本量较小或计划进行序贯数据收集
  • 你需要量化对零假设的证据
  • 模型较复杂(分层、缺失数据)

有关以下内容的全面指导,请参阅 references/bayesian_statistics.md:

  • 贝叶斯定理与解释
  • 先验设定(有信息、弱信息、无信息)
  • 使用贝叶斯因子的贝叶斯假设检验
  • 可信区间与置信区间
  • 贝叶斯 t 检验、ANOVA、回归和分层模型
  • 模型收敛检查与后验预测检验
主要优势
  1. 直观解读:“给定数据,参数落在此区间内的概率为 95%”
  2. 支持零假设的证据:可以量化对无效应的支持程度
  3. 灵活:无需担心 p 值操纵;可在数据到达时随时分析
  4. 不确定性量化:完整的后验分布

资源

本技能包含全面的参考材料:

References 目录
  • test_selection_guide.md:选择合适统计检验的决策树
  • assumptions_and_diagnostics.md:检查和应对假设违背的详细指导
  • effect_sizes_and_power.md:计算、解读和报告效应量;进行功效分析
  • bayesian_statistics.md:贝叶斯分析方法的完整指南
  • reporting_standards.md:APA 风格报告指南及示例
Scripts 目录
  • assumption_checks.py:带可视化的自动化假设检查
    • comprehensive_assumption_check():完整工作流
    • check_normality():带 Q-Q 图的正态性检验
    • check_homogeneity_of_variance():带箱线图的 Levene 检验
    • check_linearity():回归线性检查
    • detect_outliers():IQR 和 z 分数异常值检测

最佳实践

  1. 预注册分析(如有可能),以区分验证性与探索性分析
  2. 在查看结果前检查假设
  3. 报告效应量及置信区间
  4. 报告所有计划的分析,包括不显著的结果
  5. 区分统计显著性与实际意义
  6. 在分析前后可视化数据
  7. 检查诊断信息:回归/ANOVA(残差图、VIF 等)
  8. 进行敏感性分析以评估稳健性
  9. 共享数据和代码以实现可复现性
  10. 对违背情况、数据转换和决策保持透明
应避免的常见陷阱
  1. P 值操纵:不要尝试多种方式直到某个结果显著
  2. HARKing:不要将探索性发现当作验证性结果呈现
  3. 混淆显著性与重要性:p < .05 ≠ 有实际意义的效应
  4. 不报告效应量:始终报告
  5. 挑选结果:报告所有计划的分析
  6. 误解 p 值:它们不是零假设为真的概率
  7. 多重比较:适当时对族系误差进行校正
  8. 忽视缺失数据:理解机制(MCAR、MAR、MNAR)
  9. 过度解读不显著结果:无证据 ≠ 证明不存在
  10. 忽视前提条件:每个检验都有假设

入门清单

开始统计分析时:

  • 明确研究问题和假设
  • 确定合适的统计检验(使用 test_selection_guide.md)
  • 进行功效分析以确定样本量
  • 加载并检查数据
  • 检查缺失数据和异常值
  • 使用 assumption_checks.py 验证假设
  • 运行主要分析
  • 计算效应量及置信区间
  • 如有需要,进行事后检验(带校正)
  • 创建可视化
  • 按照 reporting_standards.md 撰写结果
  • 进行敏感性分析
  • 共享数据和代码

支持与延伸阅读

有关以下方面的问题:

  • 检验选择:参见 references/test_selection_guide.md
  • 假设:参见 references/assumptions_and_diagnostics.md
  • 效应量:参见 references/effect_sizes_and_power.md
  • 贝叶斯方法:参见 references/bayesian_statistics.md
  • 报告:参见 references/reporting_standards.md

主要教科书:

  • Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences
  • Field, A. (2013). Discovering Statistics Using IBM SPSS Statistics
  • Gelman, A., & Hill, J. (2006). Data Analysis Using Regression and Multilevel/Hierarchical Models
  • Kruschke, J. K. (2014). Doing Bayesian Data Analysis

在线资源:

评论

支持 Markdown