《社会科学的数理统计基础讲义》第十章 卡方检验与F检验 10.2 F检验
- 2026-11-08 22:57:06
10.2 F检验(方差分析)
10.2.1 方差分析的基本思想
F检验是一种用于比较多个总体均值差异的统计方法,在分析分类自变量对数值因变量的影响时尤为常用。这种方法更广为人知的名称是方差分析 (ANOVA)。其核心思想在于通过分解方差来源来间接推断均值差异,这是与t检验等直接比较均值的方法有本质区别。
为了确保F检验结论的有效性,方差分析建立在以下三个基本假设之上:
1. 正态性:每个总体应服从或近似服从正态分布。这是因为F统计量的抽样分布基于正态总体推导而来,满足此假设才能保证检验的有效性。 2. 同方差性:各总体的方差应相等。这是比较均值的前提,因为只有当组内波动水平相近时,若发现组间差异显著,我们才能将其归因于均值差异而非方差不同。 3. 独立性:各观测值之间相互独立。该假设确保了数据点提供的信息不重复,是统计推断的基础。
我们具体描述其原理:
核心思想:将数据的总变异分解为不同来源的变异(主要是组间变异和组内变异),然后比较这些变异的大小。如果组间变异显著大于组内变异,则有理由认为不同组的均值存在显著差异。(在方差分析的语境下,“变异”指数值的波动或差异程度,其量化指标是“平方和”。)
变异分解与计算公式:
总变异:反映所有观测值围绕总均值的波动。总平方和 (SST):所有观测值与总均值之差的平方和。其中,为组数,为第组的样本量,是第组的第个观测值,为总均值。*
组间变异:反映不同处理(水平)带来的系统性差异。组间平方和 (SSA):各组均值与总均值之差的加权平方和。其中,为第组的组内均值。*
组内变异:反映组内随机误差或个体差异。组内平方和 (SSE):组内各观测值与本组均值之差的平方和。
检验统计量的构建:方差分析通过比较组间变异与组内变异的相对大小进行推断。为消除数据量(自由度)的影响,我们将平方和转换为均方(Mean Square, MS)。
• 组间均方 (MSA):,其中组间自由度 。 • 组内均方 (MSE):,其中组内自由度 ,为总样本量。
最终,构建F统计量:
在原假设(各总体均值相等)成立的条件下,该F统计量服从F分布,即 。通过计算得到的F值与F分布的临界值比较(或计算p值),即可判断组间差异是否具有统计学意义。
这种基于方差比较的间接推断方式,使得方差分析在处理多组均值比较时,比多次两两t检验更具优势,能有效控制第一类错误的膨胀。(因为多次两两t检验会成倍增加犯“假阳性”错误的机会,而方差分析通过一次整体性检验,将总的错误概率严格控制在预设水平(如5%)之内。)
10.2.2 单因素方差分析
单因素方差分析是一种用于检验一个自变量(称为“因素”)的不同类别(称为“水平”)是否对某个连续型因变量的均值产生显著影响的统计方法。其分析过程遵循标准的统计假设检验流程。
1. 构建原假设和备择假设。 • 原假设 (H₀):所有水平对应的总体均值均相等,即因素对因变量无显著影响。公式表示为:μ₁ = μ₂ = ... = μₖ(k为水平数)。 • 备择假设 (H₁):至少有两个水平的总体均值不相等,即因素对因变量有显著影响。 2. 构建检验统计量:F统计量依照上一节的公式,计算方差分析所需要的各指标以及F统计量。进而汇总到方差分析表中:
3. 统计决策与结论在零假设成立的条件下,F统计量服从自由度为(df₁ = k-1, df₂ = N-k)的F分布。将计算得到的F值与选定显著性水平α(如0.05)下的F分布临界值进行比较:
• 若 F值 > F临界值,则拒绝H₀,认为因素的不同水平对因变量均值有显著影响。 • 若 F值 ≤ F临界值,则没有充分证据拒绝H₀。
4. 事后检验(附加的)若方差分析的结果显著(拒绝H₀),仅表明至少存在两个水平的均值差异显著,但无法指明具体是哪几组之间存在差异。此时,需要进行事后检验(或称多重比较),如LSD检验、Tukey HSD检验等,以进行两两之间的详细比较。
我们通过一个例子进行说明:
某研究机构希望评估三种不同的台风预警信息发布策略(因素:预警策略)对沿海城市居民应急物资储备天数(因变量:储备天数)的影响。
• 水平A(基础文本):通过短信和广播发布简单的台风路径和风力预报。 • 水平B(多媒体增强):在A基础上,增加图文推送和短视频,直观展示影响范围和避险指南。 • 水平C(社区联动):在B基础上,嵌入社区干部上门讲解和邻里互助动员。我们想知道,不同的台风预警策略,是否会对居民的应急物资储备天数产生显著影响?
收集数据如下:
1. 构建研究假设
• H₀: μ_A = μ_B = μ_C (三种策略下的平均储备天数无显著差异) • H₁: 至少有两种策略下的平均储备天数存在显著差异。
2.构建检验统计量:
总样本量 ,组数 。总均值
计算平方和 (SS):
• 总平方和 (SST):所有观测值与总均值之差的平方和。 • 组间平方和 (SSA):各组均值与总均值之差的加权平方和。 • 组内平方和 (SSE):总平方和减去组间平方和。
计算自由度 (df):
• 组间自由度: • 组内自由度: • 总自由度:
计算均方 (MS):
• 组间均方: • 组内均方:
计算F统计量:
方差分析表:
3. 统计决策和结论设定α = 0.05,查F分布表得临界值 。由于计算F值 13.47 > 3.81,因此*拒绝零假设 (H₀)。因此,可以得出结论:在0.05的显著性水平上,有充分证据表明,不同的台风预警策略对居民的应急物资储备天数产生了显著影响。 4. 事后检验(如果我们想明确差异来源可以继续做LSD或者Tukey HSD。我们这里省略。只展示结果。事后检验表明:
• 策略B(多媒体增强)和策略C(社区联动)的效果均显著优于策略A(基础文本)。 • 策略B与策略C之间的效果差异在统计学上不显著。(可以思考一下为啥图形反映出来好像不是这样呢。lol) • 这一结果为防灾减灾资源分配提供了依据:将预警信息从“基础文本”升级为“多媒体增强”能显著提升民众准备程度;而进一步投入大量人力进行“社区联动”,其附加效益在此研究中并不明显。决策者可据此优化投入,优先推广“多媒体增强”策略。 # 加载必要的包library(ggplot2)library(dplyr)# 创建数据框strategy_data <- data.frame( strategy = factor(rep(c("A_基础文本", "B_多媒体增强", "C_社区联动"), times = c(5, 6, 5))), days = c(3, 4, 5, 4, 3, # 策略A5, 6, 7, 5, 7, 6, # 策略B7, 8, 6, 9, 8) # 策略C)# 单因素方差分析anova_result <- aov(days ~ strategy, data = strategy_data)# 单因素方差分析结果print(summary(anova_result))## Df Sum Sq Mean Sq F value Pr(>F) ## strategy 2 36.44 18.219 19.74 0.000115 ***## Residuals 13 12.00 0.923 ## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1# 事后检验tukey_result <- TukeyHSD(anova_result)print(tukey_result)## Tukey multiple comparisons of means## 95% family-wise confidence level## ## Fit: aov(formula = days ~ strategy, data = strategy_data)## ## $strategy## diff lwr upr p adj## B_多媒体增强-A_基础文本 2.2 0.66386108 3.736139 0.0060223## C_社区联动-A_基础文本 3.8 2.19555523 5.404445 0.0000818## C_社区联动-B_多媒体增强 1.6 0.06386108 3.136139 0.0409620# 箱线图+均值点+显著性标记ggplot(strategy_data, aes(x = strategy, y = days, fill = strategy)) + geom_boxplot(alpha = 0.7, width = 0.5) + geom_jitter(width = 0.2, size = 2, alpha = 0.8) + stat_summary(fun = mean, geom = "point", shape = 23, size = 4, fill = "red", color = "black") + labs(title = "不同预警策略对应急物资储备天数的影响", subtitle = paste("单因素方差分析: F =", round(summary(anova_result)[[1]][1, "F value"], 2),", p =", round(summary(anova_result)[[1]][1, "Pr(>F)"], 4)), x = "预警策略", y = "应急物资储备天数(天)") + scale_fill_manual(values = c("#FF9999", "#99CCFF", "#99FF99")) + theme_minimal() + theme(legend.position = "none", plot.title = element_text(face = "bold"))