9.6 KiB
9.6 KiB
统计分析指南
本模块提供学术论文中统计分析的选择、执行和报告指南。
一、统计检验选择
快速参考:选择正确的检验
比较两组
| 数据特征 | 推荐检验 |
|---|---|
| 独立、连续、正态 | 独立样本t检验 |
| 独立、连续、非正态 | Mann-Whitney U检验 |
| 配对、连续、正态 | 配对样本t检验 |
| 配对、连续、非正态 | Wilcoxon符号秩检验 |
| 二分类结果 | 卡方检验或Fisher精确检验 |
比较三组及以上
| 数据特征 | 推荐检验 |
|---|---|
| 独立、连续、正态 | 单因素方差分析 |
| 独立、连续、非正态 | Kruskal-Wallis检验 |
| 配对、连续、正态 | 重复测量方差分析 |
| 配对、连续、非正态 | Friedman检验 |
关系分析
| 分析目标 | 推荐方法 |
|---|---|
| 两个连续变量关系 | Pearson相关(正态)或Spearman相关(非正态) |
| 连续结果与预测变量 | 线性回归 |
| 二分类结果与预测变量 | 逻辑回归 |
二、假设检验
系统性假设验证
在解释检验结果之前,必须检查假设。
正态性检验
from scipy import stats
import numpy as np
# Shapiro-Wilk检验(样本量<5000)
stat, p_value = stats.shapiro(data)
print(f"Shapiro-Wilk检验: W={stat:.4f}, p={p_value:.4f}")
if p_value > 0.05:
print("数据符合正态分布假设")
else:
print("数据不符合正态分布,考虑使用非参数检验")
方差齐性检验
from scipy import stats
# Levene检验
stat, p_value = stats.levene(group1, group2)
print(f"Levene检验: F={stat:.4f}, p={p_value:.4f}")
if p_value > 0.05:
print("方差齐性假设满足")
else:
print("方差不齐,使用Welch's t检验或Welch's ANOVA")
假设违反时的处理
正态性违反:
- 轻微违反 + n > 30 → 继续使用参数检验(稳健)
- 中度违反 → 使用非参数替代
- 严重违反 → 数据转换或使用非参数检验
方差齐性违反:
- t检验 → 使用Welch's t检验
- ANOVA → 使用Welch's ANOVA或Brown-Forsythe ANOVA
- 回归 → 使用稳健标准误或加权最小二乘
三、效应量
为什么需要效应量
效应量量化效应的大小,而p值只表明效应是否存在。
常用效应量参考
| 检验 | 效应量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 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 |
重要:这些基准是指导性的,具体情境很重要!
Python计算效应量
import pingouin as pg
# t检验返回Cohen's d
result = pg.ttest(group1, group2)
d = result['cohen-d'].values[0]
print(f"Cohen's d = {d:.2f}")
# ANOVA返回偏η²
aov = pg.anova(dv='score', between='group', data=df)
eta_p2 = aov['np2'].values[0]
print(f"Partial η² = {eta_p2:.3f}")
# 相关:r本身就是效应量
corr = pg.corr(x, y)
r = corr['r'].values[0]
print(f"r = {r:.2f}")
四、功效分析
事前功效分析(研究规划)
在数据收集前确定所需样本量:
from statsmodels.stats.power import tt_ind_solve_power, FTestAnovaPower
# t检验:检测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"每组所需样本量: {n_required:.0f}")
# ANOVA:检测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"每组所需样本量: {n_per_group:.0f}")
敏感性分析(研究后)
确定能检测到的效应量:
# 每组n=50,能检测到什么效应?
detectable_d = tt_ind_solve_power(
effect_size=None,
nobs1=50,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"研究能检测到 d ≥ {detectable_d:.2f}")
注意:事后功效分析(研究后计算功效)通常不推荐。使用敏感性分析代替。
五、APA格式报告
必要报告元素
- 描述统计:所有组/变量的M、SD、n
- 检验统计量:检验名称、统计量、df、精确p值
- 效应量:带置信区间
- 假设检验:进行了哪些检验、结果、采取的措施
- 所有计划分析:包括非显著发现
报告模板
独立样本t检验
A组(n = 48, M = 75.2, SD = 8.5)得分显著高于B组
(n = 52, M = 68.3, SD = 9.2),t(98) = 3.82, p < .001,
d = 0.77, 95% CI [0.36, 1.18],双尾检验。正态性假设
(Shapiro-Wilk: A组 W = 0.97, p = .18; B组 W = 0.96,
p = .12)和方差齐性假设(Levene's F(1, 98) = 1.23,
p = .27)均满足。
单因素方差分析
单因素方差分析显示处理条件对测试分数有显著主效应,
F(2, 147) = 8.45, p < .001, η²_p = .10。事后比较使用
Tukey HSD表明,条件A(M = 78.2, SD = 7.3)得分显著
高于条件B(M = 71.5, SD = 8.1, p = .002, d = 0.87)
和条件C(M = 70.1, SD = 7.9, p < .001, d = 1.07)。
条件B和C无显著差异(p = .52, d = 0.18)。
多元回归
进行多元线性回归以预测考试成绩,预测变量为学习时间、
先前GPA和出勤率。整体模型显著,F(3, 146) = 45.2,
p < .001, R² = .48, 调整后R² = .47。学习时间
(B = 1.80, SE = 0.31, β = .35, t = 5.78, p < .001,
95% CI [1.18, 2.42])和先前GPA(B = 8.52, SE = 1.95,
β = .28, t = 4.37, p < .001, 95% CI [4.66, 12.38])
是显著预测变量,而出勤率不显著(B = 0.15, SE = 0.12,
β = .08, t = 1.25, p = .21, 95% CI [-0.09, 0.39])。
多重共线性不是问题(所有VIF < 1.5)。
六、常见统计陷阱
必须避免的错误
- P-hacking:不要测试多种方式直到出现显著性
- HARKing:不要将探索性发现呈现为验证性
- 忽视假设:检查并报告违反情况
- 混淆显著性与重要性:p < .05 ≠ 有意义的效应
- 不报告效应量:对解释至关重要
- 挑选结果:报告所有计划的分析
- 误解p值:它们不是假设为真的概率
- 多重比较:适当时校正族错误率
- 忽视缺失数据:理解机制(MCAR、MAR、MNAR)
- 过度解释非显著结果:无证据 ≠ 无效应的证据
七、Python统计分析示例
完整t检验流程
import numpy as np
import pandas as pd
import pingouin as pg
from scipy import stats
# 数据
group_a = np.array([75, 82, 68, 79, 85, 72, 88, 76])
group_b = np.array([65, 70, 62, 68, 75, 60, 72, 66])
# 1. 描述统计
print("描述统计:")
print(f"A组: M={group_a.mean():.2f}, SD={group_a.std():.2f}, n={len(group_a)}")
print(f"B组: M={group_b.mean():.2f}, SD={group_b.std():.2f}, n={len(group_b)}")
# 2. 假设检验
# 正态性
_, p_a = stats.shapiro(group_a)
_, p_b = stats.shapiro(group_b)
print(f"\n正态性检验: A组 p={p_a:.3f}, B组 p={p_b:.3f}")
# 方差齐性
_, p_levene = stats.levene(group_a, group_b)
print(f"Levene检验: p={p_levene:.3f}")
# 3. t检验
result = pg.ttest(group_a, group_b, correction='auto')
print(f"\nt检验结果:")
print(f"t({result['dof'].values[0]:.0f}) = {result['T'].values[0]:.2f}")
print(f"p = {result['p-val'].values[0]:.4f}")
print(f"Cohen's d = {result['cohen-d'].values[0]:.2f}")
完整ANOVA流程
import pingouin as pg
import pandas as pd
# 创建数据
df = pd.DataFrame({
'score': [85, 82, 88, 79, 75, 72, 78, 70, 65, 68, 62, 60],
'group': ['A']*4 + ['B']*4 + ['C']*4
})
# 1. 描述统计
print(df.groupby('group')['score'].agg(['mean', 'std', 'count']))
# 2. 方差分析
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print("\nANOVA结果:")
print(aov)
# 3. 事后检验(如果显著)
if aov['p-unc'].values[0] < 0.05:
posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
print("\n事后比较 (Tukey HSD):")
print(posthoc)
相关与回归
import numpy as np
import pandas as pd
import pingouin as pg
import statsmodels.api as sm
# 数据
np.random.seed(42)
x = np.random.randn(100)
y = 2*x + np.random.randn(100)*0.5
# 相关分析
corr = pg.corr(x, y)
print("相关分析:")
print(f"r = {corr['r'].values[0]:.3f}")
print(f"p = {corr['p-val'].values[0]:.4f}")
print(f"95% CI = [{corr['CI95%'].values[0][0]:.3f}, {corr['CI95%'].values[0][1]:.3f}]")
# 线性回归
X = sm.add_constant(x)
model = sm.OLS(y, X).fit()
print("\n回归分析:")
print(model.summary())
八、统计分析检查清单
开始统计分析时:
- 定义研究问题和假设
- 确定适当的统计检验
- 进行功效分析确定样本量
- 加载并检查数据
- 检查缺失数据和异常值
- 验证假设
- 运行主要分析
- 计算效应量和置信区间
- 进行事后检验(如需要,带校正)
- 创建可视化
- 按APA格式撰写结果
- 进行敏感性分析
- 共享数据和代码
九、推荐资源
Python库
- scipy.stats:核心统计检验
- statsmodels:高级回归和诊断
- pingouin:用户友好的统计检验,带效应量
- numpy/pandas:数据处理
参考教材
- 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
在线资源
- APA Style Guide: https://apastyle.apa.org/
- Cross Validated: stats.stackexchange.com