在科学哲学的发展历程中,主要存在两种基本的认识论范式:演绎法(Deduction)与归纳法(Induction),它们分别代表了两种不同的知识构建与验证路径。
演绎法是一种从一般推至特殊的推理方式。它从普遍性前提出发,经由逻辑规则导出特定结论,典型形式为三段论:
大前提:所有人都会死(普遍原则)
小前提:苏格拉底是人(特定案例)
结论:因此,苏格拉底会死(特定结论)
演绎法的核心在于其逻辑的必然性:若前提为真且推理有效,则结论必定为真。然而,它也显示出明显的局限,即结论实际上已隐含于前提之中,无法提供超越前提的新知识。因此,演绎法更侧重于逻辑形式上的自洽,常被视作一种“逻辑游戏”,而非用于新发现的有效工具。
归纳法则采取从特殊到一般的路径,通过观察大量个别事例总结出普遍规律。其基本形式如下:
观察:天鹅A是白色的,天鹅B是白色的,天鹅C是白色的……(n个观察实例)
推论:因此,所有天鹅都是白色的(普遍结论)
归纳法长期被当作科学证实的基石,形成所谓“观察-归纳-证实”的传统模式。科学家通过积累正面实例,试图确立理论的真理性。然而,归纳法存在根本性缺陷:首先,它面临“有限归纳困境”,即再多的正面例子也无法逻辑必然地证明一个全称命题;其次,产生“证实不可能性”,无法从“曾经发生”有效推导“必将发生”;最后,归纳推理具有“反例的毁灭性”,仅一个反例(如一只黑天鹅)便足以推翻整个基于大量观察所得的普遍结论。这一切呈现了归纳推理的逻辑脆弱性。
正是在这样的背景下,证伪主义提出了一条融合二者优势的独特进路。它利用演绎逻辑的严格性来审视和淘汰理论,同时将以归纳为基础的、暂时性的接受作为理论确立的务实策略,从而有效回应了传统归纳法面临的哲学困境,并克服了纯演绎法难以产生新知识的局限。相较于传统的归纳逻辑与单纯的演绎推理,证伪主义具有显著的方法论优势:
逻辑上的确定性与修正能力:通过引入“可证伪性”作为科学划界的标准,证伪主义将科学命题建立在演绎逻辑中的否定后件推理(即:如果理论推导出的预言结果与现实不符,那么这个前提理论就是错的)之上,确保了科学判断的清晰度。这不只像归纳法那样停留在经验描述,而是利用了演绎逻辑“必然推出”的严谨性,为理论修正提供了坚实的方法。
批判过程中“破”与“立”的统一:证伪主义充分利用了“证实与证伪的不对称性”:一次反例即足以推翻一个理论。这种机制打破了归纳法“无限列举”的困境;同时,它并未止步于演绎法仅有的“否定”功能,而是通过被证伪后的“试错与猜想”重新构建理论,从而在保证批判效率的同时,实现了科学知识新的增长。
真理的渐进性逼近:科学进步不再像归纳主义所认为的那样是静态真理的累积,也不像纯演绎主义那样只是前提的分析延伸。在证伪主义框架下,理论是在不断抗拒被证伪的严酷考验中获得生存权的。这种机制赋予了科学体系自我纠错和持续进化的能力,使其不满足于局部的经验拟合,而是致力于不断消除错误,从而在动态的试错中不断向真理逼近。
方法应用的严谨与包容性:在科学推理中,证伪主义确立了“否定”相对于“确证”的逻辑优先权。它完美结合了演绎法在逻辑必然性上的绝对权威,用以清除错误;又保留了归纳法面向经验世界的开放性,用以筛选最佳的理论假说。这种兼具严谨逻辑与开放视野的优势,构成了证伪主义方法论的综合竞争力。
小概率事件原理与其说是一条严格的数学定理,不如说是一种基于常识的实用法则。它指出:在一次抽样或试验中,概率极小的事件实际上可被视为不会发生。这一思想构成了统计推断中“拒绝偶然性”的逻辑基础,成为统计决策的依据。
从概率论角度看,小概率事件通常指发生概率低于某一阈值的事件,常用 \(\alpha=0.05\)、 \(\alpha=0.01\)或\(\alpha=0.001\)作为判断标准。尽管在理论上这样的事件仍有可能发生(统计学中还存在另一项原则,“一切皆有可能”),但在单次实践或抽样中,我们通常忽略其发生可能性。这反映了统计学中集体属性与个体属性的哲学张力:从集体(长期、重复)的角度看,统计规律表现出必然性;而从个体(单次、独立)的角度看,则更多体现为或然性。小概率事件原理正是将视角落在个体属性上所作出的实用判断。这种思维方式与日常决策逻辑高度一致。例如,尽管购买彩票存在中奖的可能,我们通常不会预期自己买的某一注彩票能够中得头奖。
需要说明的是,小概率事件原理是频率学派统计思想的产物。该学派的核心是在长期重复中定义概率,并基于单次观测结果做出对假设的拒绝或接受决策。统计学家将这一原理操作化,提出了显著性水平的概念。所谓“显著性”,指的是实际观测结果与原假设之间是否存在显著差异,即结果是否不太可能仅由随机因素导致,从而值得被视为具有统计意义上的异常性或系统性。(贝叶斯学派则不依赖频率规则,而是结合先验计算“后验概率”或利用“贝叶斯因子”;其拒绝原假设不基于小概率事件,而是基于原假设成立概率足够小或数据强烈支持备择假设。)
常用的显著性水平包括:
\(\alpha = 0.05\):表示事件发生的概率小于5%
\(\alpha = 0.01\):表示事件发生的概率小于1%
\(\alpha = 0.001\):表示事件发生的概率小于0.1%
基于证伪思想和小概率事件原理,假设检验建立了一套完整的统计推断逻辑:
采用“反证法”,首先假设原假设成立,然后检验在此假设下,观测到的样本数据是否属于小概率事件。如果是,则拒绝原假设;否则,没有充分理由拒绝原假设。
标准化的检验流程如下:
假设检验体现了证伪思想(通过反证法框架和”未能证伪”的结论表述)与小概率事件原理(通过显著性水平和拒绝域的设定)。我们从未证实任何假设,只是在一定显著性水平上未能证伪原假设。这种谨慎的、批判性的推理方式,确保了科学结论的可靠性和可重复性,成为了现代科学研究的方法论支柱。
参数的区间估计与假设检验是统计推断中两种核心且相辅相成的方法。尽管二者在表现形式和直接目的上有所不同,但它们在本质上是相通的,从不同角度对总体参数进行推断。
区间估计:其核心任务是为未知的总体参数构造一个具有一定可信度的取值范围(即置信区间)。例如,我们可以说,有95%的置信度认为总体均值 \(\mu\) 落在区间 \((a, b)\) 内。这种方法主要回答“参数大概是多少?”的问题,侧重于对参数值的估计。
假设检验 (Hypothesis Testing):其核心任务是对一个关于总体参数的具体假设(如 \(H_0: \mu = \mu_0\))做出是否成立的判断。这种方法主要回答“参数是否等于某个特定值?”的问题,侧重于基于数据做出决策。
这两种方法在数学本质和哲学逻辑上是相通的。对于一个参数,在显著性水平 \(\alpha\) 下进行的双侧假设检验,与考察其置信水平为 \((1-\alpha)\) 的置信区间,在结论上是等价的。
如果要检验的原假设为 \(H_0: \theta = \theta_0\),我们计算出的 \((1-\alpha)\) 置信区间为 \((L, U)\)。
如果 \(\theta_0\) 落在该区间内(即 \(L < \theta_0 < U\)),则在 \(\alpha\) 水平上不拒绝原假设 \(H_0\)。
如果 \(\theta_0\) 落在该区间之外,则在 \(\alpha\) 水平上拒绝原假设 \(H_0\)。
我们可以这样理解,一个 \((1-\alpha)\) 的置信区间,实际上包含了所有在显著性水平 \(\alpha\) 下无法被样本数据拒绝的可能参数值。区间之外的值,则可以认为是与当前样本数据存在显著矛盾的“不合理”取值。
因此,从某种意义上说,假设检验可以看作是基于区间估计原理的一种标准化、流程化的决策工具,它使统计判断变得直接和简单。 但实质上,区间估计提供了比二元决策更为丰富的信息。它不仅给出了“拒绝/不拒绝”的结论,还直观地展示了所有可能的合理参数值,有助于研究者评估效应大小和结果的实际意义。
基于置信区间做出决策(拒绝或不拒绝\(H_0\))时,我们并非在证明一个假设,而是基于概率证据做出一个推断。因此,我们同样面临着犯错误的风险。
a) 基于区间估计决策的两类错误 (Type I and Type II Error)
当我们使用 \((1-\alpha)\) 置信区间进行假设检验时,我们的决策规则是:
若 \(H_0\) 的值 \(\theta_0\) 落在区间内,则不拒绝 \(H_0\)。
若 \(\theta_0\) 落在区间外,则拒绝 \(H_0\)。
这个基于某次样本计算出的区间所做的决策,可能存在以下两种错误:
第一类错误 (Type I Error | α Error):指原假设 \(H_0\) 实际上为真,但我们恰好抽取到了一个“极端”样本,以至于计算出的置信区间未能包含真实的 \(\theta_0\),从而导致我们错误地拒绝了 \(H_0\)。其概率就是 \(\alpha\)。因为所有可能样本中,有 \(100\alpha\%\) 的样本会构造出不包含\(\theta_0\) 的区间(假设 \(H_0\) 为真)。这是显著性水平 \(\alpha\) 在区间估计视角下的直接含义。
第二类错误 (Type II Error | β Error):指原假设 \(H_0\) 实际上为假(真实参数为 \(\theta_1\)),但我们抽取的样本计算出的置信区间却包含了错误的 \(\theta_0\),从而导致我们错误地未能拒绝*\(H_0\)。其概率 \(\beta\) 的大小取决于真实值 \(\theta_1\) 与假设值 \(\theta_0\) 的差距(效应大小)以及区间的宽度(样本量、方差)。
控制第一类错误概率 \(\alpha\),直接决定了我们构建的置信区间的宽度(置信水平为 \(1-\alpha\))。\(\alpha\) 越小,置信区间越宽,\(\theta_0\) 落在区间内的可能性越大,我们也就越“保守”。这种“保守”意味着我们更不容易拒绝真实的 \(H_0\),从而降低了犯第一类错误(弃真错误)的风险。但代价是,更宽的置信区间也意味着我们更容易“容纳”错误的\(H_0\)。当 \(H_0\) 实际上不成立时,我们未能拒绝它的概率也会增加,从而提高了犯第二类错误(取伪错误)的风险。
因此,在选择显著性水平\(\alpha\)时,我们实际上是在第一类错误的风险与第二类错误的风险之间进行权衡。减小 \(\alpha\) 固然可以降低弃真的风险,但也不可避免地增加了取伪的可能性。同时减少两类错误(\(\alpha\)和\(\beta\))的唯一根本方法是增大样本量\(n\)。
b) 观测的风险:P值决策与临界值决策
P值法和临界值法是上述区间估计决策规则的两种数值化实现方式,它们从不同角度回答了“假设值 \(\theta_0\) 距离置信区间边界有多远”这一问题,为统计决策提供量化依据。
P值是在原假设 \(H_0\) 成立的前提下,观测到当前样本结果或更极端结果的概率。它可以被视为当前数据所对应的第一类错误风险的实际观测值。P值越小,表明在原假设为真的情况下,获得当前样本的可能性越低,从而拒绝 \(H_0\) 的统计证据越强,决策所承担的“弃真”风险也就越小。显著性水平 \(\alpha\) 则是研究者事先设定的、可容忍的第一类错误风险的概率上限,作为一个判断门槛存在。决策时,通过比较“实际观测风险”P与“预设风险阈值”\(\alpha\):若 \(P \leq \alpha\),则拒绝 \(H_0\),此时我们承担了不超过 \(\alpha\) 的犯错风险。值得注意的是,第二类错误风险 \(\beta\)并不由P值直接衡量。\(\beta\) 的大小依赖于真实参数值、样本量和显著性水平 \(\alpha\),须针对具体的备择假设 \(H_1\)进行计算。
临界值法提供了另一种等效但形式不同的决策方法。临界值是根据所选显著性水平\(\alpha\) 及统计量的抽样分布(如标准正态分布、t分布),通过查表或计算得到的一个分界点。该临界值将统计量的取值空间划分为“拒绝域”和“不拒绝域”。决策规则为:若计算得到的检验统计量的绝对值大于或等于临界值的绝对值,则拒绝 \(H_0\)。
需要说明的是,在计算机普及前,临界值法因依赖预先计算的统计用表而成为主流,它将复杂的概率问题简化为简单的数值比较。而随着统计软件的普及,P值法因其能提供精确的连续证据(如p=0.037)而日益广泛应用。它既能反映统计显著性,又能衡量这种显著性的强度,逐渐成为现代统计研究的标准。尽管如此,检验统计量落入拒绝域与P值 \(\leq\) \(\alpha\) 在数学上完全等价,它们只是同一统计事实的两种不同表述方式。P值法提供了更丰富、更连续的证据度量,例如P=0.037不仅意味着拒绝 \(H_0\),还暗示了比P=0.04更坚定地拒绝 \(H_0\);而临界值法则给出一个清晰、二元的决策边界,便于快速判断,尤其在传统查表分析中更为直观。
a) 总体均值的假设检验(单个总体,方差已知)
前提条件:总体服从正态分布 \(X \sim N(\mu, \sigma^2)\),且总体方差 \(\sigma^2\) 已知。
例9-1:
修改区间估计例8-6:研究某大学学生每月学习时间(小时)。根据历年数据,学习时间服从正态分布,总体标准差 \(\sigma = 12\) 小时。现随机抽取100名学生(n=100),测得样本均值为48小时。在显著性水平 \(\alpha = 0.05\) 下,能否认为总体均值 \(\mu\) 为50小时?
建立假设(双侧检验): \(H_0: \mu = 50\) (学生平均每月学习时间为50小时) \(H_1: \mu \neq 50\) (学生平均每月学习时间不等于50小时)
选择检验统计量: 由于方差已知,使用Z统计量: \[ Z = \frac{\bar{X} - \mu_0}{\sigma / \sqrt{n}} \sim N(0, 1) \quad \text{(当 } H_0 \text{ 为真时)} \] 其中 \(\mu_0 = 50\)。
确定显著性水平:\(\alpha = 0.05\)。
计算p值与临界值:
做出统计决策:
得出实际结论:在0.05的显著性水平下,没有足够的证据表明该校学生每月的平均学习时间与50小时有显著差异。
利用R语言实现假设检验过程如下:
library(ggplot2)
# 已知参数
n <- 100
sample_mean <- 48
mu0 <- 50
sigma <- 12
alpha <- 0.05
# 计算检验统计量
z_stat <- (sample_mean - mu0) / (sigma / sqrt(n))
# 计算p值 (双侧)
p_value <- 2 * pnorm(-abs(z_stat))
# 计算临界值
z_critical <- qnorm(1 - alpha/2)
# 决策
decision <- ifelse(p_value < alpha, "拒绝H0", "不拒绝H0")
{
cat("检验统计量 Z =", round(z_stat, 3), ",P值 =", round(p_value, 4), "。\n")
cat("在显著性水平 alpha =", alpha, "下,决策结论为", decision, "。\n")
}
## 检验统计量 Z = -1.667 ,P值 = 0.0956 。
## 在显著性水平 alpha = 0.05 下,决策结论为 不拒绝H0 。
# 使用ggplot2绘制标准正态分布并标出拒绝域和检验统计量
x <- seq(-3.5, 3.5, length.out = 200)
y <- dnorm(x)
df <- data.frame(x = x, y = y)
# 定义拒绝域
reject_region_left <- data.frame(x = x[x <= -z_critical], y = y[x <= -z_critical])
reject_region_right <- data.frame(x = x[x >= z_critical], y = y[x >= z_critical])
ggplot(df, aes(x = x, y = y)) +
geom_line() +
geom_area(data = reject_region_left, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_area(data = reject_region_right, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = c(-z_critical, z_critical), linetype = "dashed", color = "blue") +
geom_vline(xintercept = z_stat, color = "darkgreen") +
geom_text(aes(x = z_stat, y = 0.1, label = paste0("Z = ", round(z_stat, 3))),
color = "darkgreen", vjust = -0.5) +
labs(subtitle = paste0("双侧Z检验 (α=", alpha, ")\n",
"检验统计量 Z = ", round(z_stat, 3),
", p值 = ", round(p_value, 4),
", 决策: ", decision),
x = "Z值", y = "密度") +
theme_minimal()
b) 总体均值的假设检验(单个总体,方差未知)
前提条件:总体服从正态分布 \(X \sim N(\mu, \sigma^2)\),且总体方差 \(\sigma^2\) 未知。
例9-2:
修改区间估计例8-7:研究城市居民通勤时间(分钟)。假设通勤时间服从正态分布,但方差未知。随机调查25名居民(n=25),得到通勤时间数据:
[25, 30, 35, 40, 45, 28, 32, 38, 42, 33, 29, 36, 41, 27, 34, 39, 31, 37, 43, 26, 44, 30, 35, 32, 38]。
在显著性水平 \(\alpha = 0.1\) 下,能否认为平均通勤时间大于35分钟?(单侧检验)
建立假设(右侧检验): \(H_0: \mu \le 35\) (平均通勤时间不超过35分钟) \(H_1: \mu > 35\) (平均通勤时间大于35分钟)
选择检验统计量: 由于方差未知,使用t统计量: \[ T = \frac{\bar{X} - \mu_0}{S / \sqrt{n}} \sim t(n-1) \quad \text{(当 } H_0 \text{ 为真时)} \] 其中 \(\mu_0 = 35\)。
确定显著性水平:\(\alpha = 0.10\)。
计算p值与临界值:
做出统计决策:p值 = 0.568 > α = 0.10,不拒绝H₀ 或者 t = -0.174 < t_critical = 1.318,不落入拒绝域,不拒绝H₀
得出实际结论:在\(\alpha=0.10\)的显著性水平下,没有足够的统计证据表明该城市居民的平均通勤时间大于35分钟。
利用R语言实现假设检验过程如下:
# 使用之前的通勤时间数据
set.seed(123)
commute_time <- c(25, 30, 35, 40, 45, 28, 32, 38, 42, 33,
29, 36, 41, 27, 34, 39, 31, 37, 43, 26,
44, 30, 35, 32, 38)
mu0 <- 35
alpha <- 0.10
# 执行单侧t检验
t_test_result <- t.test(commute_time, mu = mu0, alternative = "greater", conf.level = 1-alpha)
# 提取结果
t_stat <- t_test_result$statistic
p_value <- t_test_result$p.value
df_t <- t_test_result$parameter
t_critical <- qt(1 - alpha, df = df_t)
decision <- ifelse(p_value < alpha, "拒绝H0", "不拒绝H0")
{
cat("检验统计量 Z =", round(t_stat, 3), ",P值 =", round(p_value, 4), "。\n")
cat("在显著性水平 alpha =", alpha, "下,决策结论为", decision, "。\n")
}
## 检验统计量 Z = -0.172 ,P值 = 0.5675 。
## 在显著性水平 alpha = 0.1 下,决策结论为 不拒绝H0 。
# 绘制t分布图
x_t <- seq(-3, 3.5, length.out = 200)
y_t <- dt(x_t, df = df_t)
df_t_plot <- data.frame(x = x_t, y = y_t)
# 定义拒绝域 (右侧)
reject_region_t <- data.frame(x = x_t[x_t >= t_critical], y = y_t[x_t >= t_critical])
ggplot(df_t_plot, aes(x = x, y = y)) +
geom_line() +
geom_area(data = reject_region_t, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = t_critical, linetype = "dashed", color = "blue") +
geom_vline(xintercept = t_stat, color = "darkgreen", size = 1) +
geom_text(aes(x = t_stat, y = 0.1, label = paste0("t = ", round(t_stat, 3))),
color = "darkgreen", vjust = -0.5, hjust = -0.1) +
labs(subtitle = paste0("右侧t检验 (α=", alpha, ", df=", df_t, ")\n",
"检验统计量 t = ", round(t_stat, 3),
", p值 = ", round(p_value, 4),
", 决策: ", decision),
x = "t值", y = "密度") +
theme_minimal()
c) 总体比例的假设检验
前提条件:大样本情况下,对总体比例 \(p\) 进行检验。
例9-3:
修改区间估计例8-8:调查某社区1000名选民(n=1000),其中580人支持某项政策。在显著性水平 \(\alpha = 0.05\) 下,能否认为支持率 \(p\) 小于60%?(单侧检验)
建立假设(左侧检验): \(H_0: p \ge 0.60\) (支持率不低于60%) \(H_1: p < 0.60\) (支持率小于60%)
选择检验统计量: 大样本下,使用Z统计量(近似): \[ Z = \frac{\hat{p} - p_0}{\sqrt{\frac{p_0(1-p_0)}{n}}} \overset{\text{近似}}{\sim} N(0, 1) \quad \text{(当 } H_0 \text{ 为真时)} \] 其中 \(p_0 = 0.60\)。
确定显著性水平:\(\alpha = 0.05\)。
计算p值与临界值:
做出统计决策:
得出实际结论:在0.05的显著性水平下,没有足够的证据表明该社区选民对该政策的支持率小于60%。
# 已知参数
n <- 1000
x <- 580
p_hat <- x / n
p0 <- 0.60
alpha <- 0.05
# 计算检验统计量 (使用p0计算标准误)
z_stat_prop <- (p_hat - p0) / sqrt(p0 * (1-p0) / n)
# 计算p值 (左侧)
p_value_prop <- pnorm(z_stat_prop)
# 计算临界值 (左侧)
z_critical_prop <- qnorm(alpha)
decision_prop <- ifelse(p_value_prop < alpha, "拒绝H0", "不拒绝H0")
{
cat("检验统计量 Z =", round(z_stat_prop, 3), ",P值 =", round(p_value_prop, 4), "。\n")
cat("在显著性水平 alpha =", alpha, "下,决策结论为", decision_prop, "。\n")
}
## 检验统计量 Z = -1.291 ,P值 = 0.0984 。
## 在显著性水平 alpha = 0.05 下,决策结论为 不拒绝H0 。
# 绘制标准正态分布图 (左侧检验)
x_prop <- seq(-3.5, 3.5, length.out = 200)
y_prop <- dnorm(x_prop)
df_prop <- data.frame(x = x_prop, y = y_prop)
# 定义拒绝域 (左侧)
reject_region_prop <- data.frame(x = x_prop[x_prop <= z_critical_prop], y = y_prop[x_prop <= z_critical_prop])
ggplot(df_prop, aes(x = x, y = y)) +
geom_line() +
geom_area(data = reject_region_prop, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = z_critical_prop, linetype = "dashed", color = "blue") +
geom_vline(xintercept = z_stat_prop, color = "darkgreen", size = 1) +
geom_text(aes(x = z_stat_prop, y = 0.1, label = paste0("Z = ", round(z_stat_prop, 3))),
color = "darkgreen", vjust = -0.5, hjust = -0.1) +
labs(title = paste0("左侧比例Z检验 (α=", alpha, ")\n",
"检验统计量 Z = ", round(z_stat_prop, 3),
", p值 = ", round(p_value_prop, 4),
", 决策: ", decision_prop),
x = "Z值", y = "密度") +
theme_minimal()
d) 总体方差的假设检验
前提条件:总体服从正态分布 \(X \sim N(\mu, \sigma^2)\)。
例9-4:
修改区间估计例8-9:研究学院开会时长(分钟)的变异性。假设时长服从正态分布,根据上级要求,会议时长的标准差稳定在20分钟(即方差\(\sigma_0^2=400\))。抽取20次会议记录时长(30-120分钟)。
[85, 120, 65, 110, 30, 95, 75, 105, 45, 115, 50, 80, 100, 70, 90, 108, 55, 85, 118, 42]
在显著性水平 \(\alpha = 0.05\) 下,检验总体方差 \(\sigma^2\) 是否等于400。
建立假设(这是一个双侧检验): \(H_0: \sigma^2 = 400\) (会议时长的方差为400平方分钟) \(H_1: \sigma^2 \neq 400\) (会议时长的方差不等于400平方分钟)
选择检验统计量: \[ \chi^2 = \frac{(n-1)S^2}{\sigma_0^2} \sim \chi^2(n-1) \quad \text{(当 } H_0 \text{ 为真时)} \] 其中 \(\sigma_0^2 = 400\)。
确定显著性水平:\(\alpha = 0.05\)。
计算p值与临界值:
做出统计决策:
根据R代码的运行结果,并修正您提供的文本中的数值错误及笔误,保留三位小数后的修正文本如下:
得出实际结论:在0.05的显著性水平下,有充分的证据表明会议时长的方差不等于400平方分钟。实际标准差(27.6分钟)远大于假设的20分钟,说明会议时长的变异性比预期大得多。
session_length <- c(85, 120, 65, 110, 30, 95, 75, 105, 45, 115,
50, 80, 100, 70, 90, 108, 55, 85, 118, 42)
n <- length(session_length)
alpha <- 0.05
sample_var <- var(session_length)
sigma0_sq <- 400
# 计算检验统计量
chi2_stat <- (n-1) * sample_var / sigma0_sq
# 计算p值(双侧检验)
p_value_chi2 <- 2 * min(pchisq(chi2_stat, df = n-1), 1 - pchisq(chi2_stat, df = n-1))
# 计算临界值
chi2_lower <- qchisq(alpha/2, df = n-1)
chi2_upper <- qchisq(1 - alpha/2, df = n-1)
# 做出决策
decision_chi2 <- ifelse(p_value_chi2 < alpha, "拒绝H0", "不拒绝H0")
{
cat("检验统计量 chi2 =", round(chi2_stat, 3), ",P值 =", round(p_value_chi2, 4), "。\n")
cat("在显著性水平 alpha =", alpha, "下,决策结论为", decision_chi2, "。\n")
}
## 检验统计量 chi2 = 35.761 ,P值 = 0.0226 。
## 在显著性水平 alpha = 0.05 下,决策结论为 拒绝H0 。
# 绘制卡方分布图
x_chi2 <- seq(0, 50, length.out = 200)
y_chi2 <- dchisq(x_chi2, df = n-1)
df_chi2 <- data.frame(x = x_chi2, y = y_chi2)
# 定义拒绝域
reject_region_lower <- data.frame(x = x_chi2[x_chi2 <= chi2_lower], y = y_chi2[x_chi2 <= chi2_lower])
reject_region_upper <- data.frame(x = x_chi2[x_chi2 >= chi2_upper], y = y_chi2[x_chi2 >= chi2_upper])
library(ggplot2)
ggplot(df_chi2, aes(x = x, y = y)) +
geom_line() +
geom_area(data = reject_region_lower, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_area(data = reject_region_upper, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = chi2_lower, linetype = "dashed", color = "blue") +
geom_vline(xintercept = chi2_upper, linetype = "dashed", color = "blue") +
geom_vline(xintercept = chi2_stat, color = "darkgreen", size = 1) +
geom_text(aes(x = chi2_stat, y = 0.01, label = paste0("χ² = ", round(chi2_stat, 1))),
color = "darkgreen", vjust = -0.5) +
labs(subtitle = paste0("方差双侧卡方检验 (α=", alpha, "),",
"检验统计量 χ² = ", round(chi2_stat, 1),
", p值 = ", round(p_value_chi2, 4),
", 决策: ", decision_chi2),
x = "卡方值", y = "密度") +
theme_minimal() +
theme(plot.subtitle = element_text(size = 10))
e) 两总体方差比的假设检验
前提条件:两个独立的总体分别服从正态分布 \(X \sim N(\mu_1, \sigma_1^2)\) 和 \(Y \sim N(\mu_2, \sigma_2^2)\)。
例9-5:
修改区间估计例8-9:比较两种教学方法(传统教学法vs 新教学法)对学生考试成绩稳定性的影响。假设考试成绩服从正态分布。
班级1使用传统教学法,抽取的30名同学的成绩为:
[71, 73, 87, 76, 76, 89, 79, 65, 70, 71, 85, 78, 78, 76, 71, 89, 79, 59, 81, 71, 66, 73, 67, 69, 70, 62, 82, 76, 66, 85];
班级2使用新教学法,抽取的25名同学成绩为:
[83, 74, 89, 89, 88, 86, 85, 77, 74, 73, 70, 76, 63, 104, 92, 65, 73, 72, 87, 77, 81, 78, 77, 94, 75]
在显著性水平 \(\alpha = 0.10\) 下,检验两种方法下成绩的方差是否有显著差异。
建立假设(双侧检验):
\(H_0: \sigma_1^2 = \sigma_2^2\) 或 \(\frac{\sigma_1^2}{\sigma_2^2} = 1\)
\(H_1: \sigma_1^2 \neq \sigma_2^2\) 或 \(\frac{\sigma_1^2}{\sigma_2^2} \neq 1\)
选择检验统计量: \[ F = \frac{S_1^2}{S_2^2} \sim F(n_1-1, n_2-1) \quad \text{(当 } H_0 \text{ 为真时)} \]
确定显著性水平:\(\alpha = 0.10\)。
计算p值与临界值:
做出统计决策:
得出实际结论:在0.10的显著性水平下,没有充分的证据表明两种教学方法下学生成绩的方差存在显著差异。
library(ggplot2)
class_1 <- c(71, 73, 87, 76, 76, 89, 79, 65, 70, 71, 85, 78, 78, 76, 71, 89, 79, 59, 81, 71, 66, 73, 67, 69, 70, 62, 82, 76, 66, 85)
class_2 <- c(83, 74, 89, 89, 88, 86, 85, 77, 74, 73, 70, 76, 63, 104, 92, 65, 73, 72, 87, 77, 81, 78, 77, 94, 75)
n1 <- length(class_1)
n2 <- length(class_2)
alpha_f <- 0.10
# 执行F检验 (双侧)
f_test_result <- var.test(class_1, class_2, conf.level = 0.90)
# 提取结果
f_stat <- f_test_result$statistic
p_value_f <- f_test_result$p.value
df1 <- f_test_result$parameter[1]
df2 <- f_test_result$parameter[2]
# 计算临界值
f_critical_lower <- qf(alpha_f/2, df1, df2)
f_critical_upper <- qf(1 - alpha_f/2, df1, df2)
# 决策
decision_f <- ifelse(p_value_f < alpha_f, "拒绝H0", "不拒绝H0")
{
cat("检验统计量 F =", round(f_stat, 3), ",P值 =", round(p_value_f, 4), "。\n")
cat("在显著性水平 alpha =", alpha_f, "下,决策结论为", decision_f, "。\n")
}
## 检验统计量 F = 0.675 ,P值 = 0.3118 。
## 在显著性水平 alpha = 0.1 下,决策结论为 不拒绝H0 。
x_f <- seq(0, 4, length.out = 200)
y_f <- df(x_f, df1, df2)
df_f_plot <- data.frame(x = x_f, y = y_f)
# 定义拒绝域
reject_region_lower_f <- data.frame(x = x_f[x_f <= f_critical_lower], y = y_f[x_f <= f_critical_lower])
reject_region_upper_f <- data.frame(x = x_f[x_f >= f_critical_upper], y = y_f[x_f >= f_critical_upper])
ggplot(df_f_plot, aes(x = x, y = y)) +
geom_line() +
geom_area(data = reject_region_lower_f, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_area(data = reject_region_upper_f, aes(x = x, y = y), fill = "red", alpha = 0.5) +
geom_vline(xintercept = c(f_critical_lower, f_critical_upper), linetype = "dashed", color = "blue") +
geom_vline(xintercept = f_stat, color = "darkgreen", size = 1) +
geom_text(aes(x = f_stat, y = max(y_f)/4, label = paste0("F = ", round(f_stat, 3))),
color = "darkgreen", vjust = -0.5, hjust = -0.1) +
labs( subtitle = paste0("检验统计量 F = ", round(f_stat, 3),
", p值 = ", round(p_value_f, 4),
", 决策: ", decision_f),
x = "F值", y = "密度") +
theme_minimal() +
xlim(0, 4)
a) 从文字描述到数字表达
日常生活中的许多疑问和主张,本质上都是可以检验的假设。在社会科学研究中,这一过程尤为重要,因为它将抽象的理论概念(如“幸福感”、“社会地位”、“政治倾向”)转化为可测量的变量,进而进行实证检验。假设检验的第一步,就是将这些模糊的文字描述或理论命题转化为精确的、可检验的数学命题。我们一般会遵循以下转换规则:
识别核心变量:明确研究问题中涉及的主要概念。
将概念操作化:定义如何测量这些概念(例如,用“年收入”和“职业声望得分”来测量“社会地位”,用“量表总分”来测量“幸福感”)。
确定参数和关系:判断问题涉及的是单个总体的参数(如均值、比例),还是两个或多个总体参数之间的关系(如差异、相关性)。
建立假设:将研究问题转化为关于总体参数的假设。原假设(\(H_0\))通常表示“无效果”、“无差异”或“无关系”;备择假设(\(H_1\))则表示研究者希望证实的“有效果”、“有差异”或“有关系”。
我们看一些例子:
例9-6:
文字描述:“一项新的环保政策实施后,市民的环保意识是否有所提高?”
数理化过程:
识别核心变量:核心变量是“环保意识”。这是一个潜变量,需要被操作化定义。
操作化:将“环保意识”操作化为一个包含多个问题的环保意识量表得分(0-100分)。此时,变量成为可测量的“环保意识得分”。
确定参数:关注政策实施前后“环保意识得分”的平均值变化。参数为政策前的平均得分 \(\mu_{\text{前}}\) 和政策后的平均得分 \(\mu_{\text{后}}\)。
建立假设:研究目标是证明“有所提高”,即 \(\mu_{\text{后}} > \mu_{\text{前}}\)。
\(H_0: \mu_{\text{后}} \leq \mu_{\text{前}}\) (政策无效或反效)
\(H_1: \mu_{\text{后}} > \mu_{\text{前}}\) (政策有效,意识提高)
例9-7:
文字描述:“不同性别的学生在数学能力上是否存在差异?”
数理化过程:
识别核心变量:核心变量是“性别”(自变量,分组变量)和“数学能力”(因变量)。
操作化:“性别”直接分为男、女两组。“数学能力”操作化为“标准化数学测验成绩”。
确定参数:关注两个独立群体(男、女)的“数学测验成绩”的平均值。参数为男生平均成绩 \(\mu_{\text{男}}\) 和女生平均成绩 \(\mu_{\text{女}}\)。
建立假设:问题只关心“是否存在差异”,而不预设方向。
\(H_0: \mu_{\text{男}} = \mu_{\text{女}}\) (两组能力无差异)
\(H_1: \mu_{\text{男}} \neq \mu_{\text{女}}\) (两组能力存在差异)
例9-8:
文字描述:“个人的受教育年限与其收入水平是否正相关?”
数理化过程:
识别核心变量:核心变量是“受教育年限”和“收入水平”。
操作化:“受教育年限”可直接以“年”为单位测量;“收入水平”操作化为“个人年收入”。
确定参数:关注两个连续变量之间的总体相关系数 \(\rho\)。
建立假设:研究假设是存在“正相关”。
\(H_0: \rho \leq 0\) (无正相关)
\(H_1: \rho > 0\) (存在正相关)
通过这些例子可以看到,社会科学中的假设检验,需要将抽象的理论命题“翻译”成关于可测量参数的统计假设。这个过程要求我们清晰地定义变量、选择合适的参数(均值、比例、相关系数等),并根据研究问题的指向性(是问“是否不同?”还是“是否更高/更低/正相关?”)来确定使用双侧检验还是单侧检验。这是进行定量社会科学研究的逻辑起点。
b) 原假设需要可被证伪
科学哲学的核心原则之一是“可证伪性”。一个命题如果无法被任何可能的观察结果所反驳,那么它就不属于科学的范畴。在假设检验中,这一原则具体体现在对原假设 (\(H_0\)) 的构建上:一个优秀的原假设必须是可以被数据证伪(拒绝)的。我们看两个例子:
例9-9:
一个好的原假设(明确的靶子):\(H_0: \mu = 100\)
它之所以可被证伪,是因为存在无数种可能的样本数据(例如,样本均值 \(\bar{x} = 50\) 或 \(\bar{x} = 150\))能够与这个声称发生强烈矛盾。只要数据与100的差距足够大(考虑到随机波动),我们就可以拒绝 \(H_0\)。这个“靶子”是清晰的,我们很容易根据数据判断是否拒绝它。
一个不好的原假设(模糊的靶子):\(H_0: \mu \approx 100\) 或 \(H_0\): 这个产品“有点效果”。
“\(\approx\)(约等于)”和“有点效果”是模糊的、无法精确定义的概念。\(99\) 算不算 \(\approx 100\)?\(105\) 呢?多大的效果算“有点效果”? 这样的假设是不可被证伪的。因为无论观察到什么数据,你都可以说“这仍然在‘大约’的范围内”或“这勉强算‘有点效果’”。你永远无法用数据明确地推翻它。这就像一个模糊的、不断移动的靶子,你永远无法确定自己是否击中了它,检验也就失去了意义。
例9-10:
不好的假设(不可证伪): “这片森林里有鸟。”
这个假设无法被证伪的。即使你在森林里搜寻了一整天一只鸟也没看到,你也不能证明森林里“没有鸟”。你只能证明“在你搜寻的时间和地点没有看到鸟”。鸟可能只是躲起来了,或者在你离开后飞来了。这个假设无法被任何有限的观察所推翻,因此它不是一个科学的、可检验的假设。
好的原假设(可证伪): “这片森林里没有鸟。” (我们可以将其设为 \(H_0\))
这个假设是可以被证伪的,而且非常容易!你只需要一个观察结果“看到一只鸟,甚至只是听到一声鸟叫”,就足以立即、彻底地证伪这个原假设。。
在统计检验中,我们将希望证明的事情(森林里有鸟/新方法有效/平均值不是100)放在备择假设 (\(H_1\)) 中。而将与之对立的、明确的、可被证伪的断言(森林里没有鸟/新方法无效/平均值就是100)设为原假设 (\(H_0\))。然后,我们收集数据(进入森林观察)。如果数据足够(例如,看到了鸟),我们就说“我们有足够的证据拒绝原假设”,从而支持备择假设。如果数据不够(没看到鸟),我们则说“证据不足,无法拒绝原假设”,但这不等于证明了原假设为真(就像没看到鸟不等于证明森林里绝对没有鸟)。
c) 原假设是日常的、普通的、没有差异的现象
在假设检验中,原假设(\(H_0\))通常被设定为反映日常的、普通的或无明显差异的现象。其核心逻辑在于秉持“保守原则”——即除非存在充分证据,否则应维持现状。整个统计检验的推导过程,都基于“原假设 \(H_0\) 为真”这一前提展开。通过将最一般、最普遍的情形设为原假设,可有效避免将由随机误差引起的偶然结果误判为真实效应,从而降低得出“虚假发现”的风险。换句话说,原假设类似于司法体系中的“无罪推定”。它代表在缺乏足够证据时,应被暂时接受的普遍认知或常规状态
例9-11:
典型的原假设,我们可以类似这样设置:
无效效应:例如“一种新药与安慰剂的治疗效果无差异”(\(H_0: \mu_{\text{新药}} = \mu_{\text{安慰剂}}\))。此时原假设体现既有的治疗效果,新药需提供充分证据以证明其有效性超越安慰剂。
无相关:例如“社交媒体使用时长与幸福感之间无关联”(\(H_0: \rho = 0\))。原假设维持“两者无关”这一普遍预设,否定它需基于显著的相反证据。
无差异:例如“男性和女性员工的平均薪酬无差异”(\(H_0: \mu_{\text{男}} = \mu_{\text{女}}\))。该假设设立了一个待检验的基准,任何主张的差异都需通过数据加以验证。
符合标准:例如“产品重量符合100克的标准”(\(H_0: \mu = 100\))。原假设代表符合预期的正常状态,偏离该状态需有统计证据支持。
维持基准:例如“新燃料的燃烧效率不超过传统燃料”(\(H_0: \mu_{\text{新}} \le \mu_{\text{旧}}\))。此时原假设体现了“新事物未必更好”的保守立场,将新燃料视为处于传统水平或更差的状态,除非有强证据否则不承认其优越性。
符合底线:例如“该批次灯泡的平均寿命达到或高于 1000 小时的标准”(\(H_0: \mu \ge 1000\))。原假设预设产品是合格的、符合预期的,这是一种代表质量合格的常规状态,拒绝它则意味着认定产品存在质量问题。
风险可控:例如“新医疗方案并发症的发生率不高于旧方案”(\(H_0: p_{\text{新}} \le p_{\text{旧}}\))。原假设代表了安全性的维持,认为没有因为采用新方案而增加额外的风险,体现了对患者安全的审慎保护。
将原假设设置为保守、常规的命题,符合科学研究的严谨性和审慎性。我们首先假定不存在新的发现或异常现象,除非样本数据提供足够强有力的证据,才能令人信服地放弃这一初始假设。
a) 统计显著性并不等同于实际重要性
在统计推断中,假设检验通常借助 p 值判断结果的显著性,即观察到的差异是否可能由随机误差导致。然而,统计上的显著性并不等同于实际应用中的重要性。例如,在一项教学方法的比较研究中,A 方法相比 B 方法使学生成绩提高了1分(100分制),且 p < 0.05,在统计学上达到显著水平(尤其是在大样本条件下)。但这并不意味着两种教学方法之间存在具有实际意义的差异。
为弥补假设检验仅能回答“差异是否存在”、而无法衡量“差异有多大”的局限,统计学家提出了效应量(effect size)的概念。效应量用于量化处理效应或组间差异的实际幅度,为统计结果的实际重要性提供客观度量。它直接反映“效应强度”,有助于判断结果是否具备实际应用价值或科学意义,且其估计不受样本量的直接影响。以下介绍几种常用的效应量指标。
b) 常用的效应量指标
1. Cohen’s d
Cohen’s d
是最常用的标准化均值差异指标,适用于两组均值比较(如独立样本 t
检验)。其计算公式为:
\[
d = \frac{M_1 - M_2}{S_{pooled}}
\]
其中 \(M_1\)、\(M_2\) 为两组均值,\(S_{pooled}\)
为合并标准差,计算公式为:
\[
S_{pooled} = \sqrt{\frac{(n_1 - 1)S_1^2 + (n_2 - 1)S_2^2}{n_1 + n_2 -
2}}
\]
通过标准差进行去量纲化,使结果可用于不同研究和测量尺度的比较。常见变体包括:
单样本 Cohen’s d:\(d = \frac{\bar{X} - \mu_0}{S}\)
配对样本 Cohen’s d:\(d = \frac{M_{diff}}{SD_{diff}}\)(如前后测设计)
Cohen’s d 的数值强弱通常依据经验法则进行区间划分:当绝对值在 [0.0, 0.2)区间时被视为微小或可忽略效应,在 [0.2, 0.5)区间时为小效应,在[0.5, 0.8)区间时为中等效应,而在[0.8, +∞) 区间时则属于大效应。
2. 相关系数 r
在相关分析中,Pearson 相关系数 r 本身即为一种效应量,用于衡量两个连续变量间的关联强度。其计算公式为:
\[ r = \frac{\sum{(X_i - \bar{X})(Y_i - \bar{Y})}}{\sqrt{\sum{(X_i - \bar{X})^2} \cdot \sum{(Y_i - \bar{Y})^2}}} \]
取值范围为 [-1, 1],绝对值越大表明关联越强。通常认为,|r| ≥ 0.5 为强相关,|r| ≈ 0.3 为中等相关,|r| ≤ 0.1 为弱相关。
3. 标准化回归系数(β)
在回归分析中,标准化回归系数(Standardized Beta)可用于比较自变量对因变量的相对影响强度,消除量纲影响,是一种常用的效应量指标。其计算公式为:
\[
\beta = b \cdot \frac{S_X}{S_Y}
\]
其中 \(b\) 为未标准化回归系数,\(S_X\) 和 \(S_Y\) 分别为自变量和因变量的标准差。β
值越大,说明该自变量对因变量的影响越大。
4. 其他常见效应量
Odds Ratio(OR):常用于二分结果变量,表示事件发生的优势比,适用于逻辑回归和病例对照研究。
η²(Eta-squared):用于方差分析(ANOVA),表示因变量方差中被自变量解释的比例,反映组间差异的效应大小。
Cramér’s V:用于衡量两个分类变量之间的关联强度,适用于卡方检验后的效应量报告,取值在 0 到 1 之间,值越大表明关联越强。
c) 效应量的报告与解释
在报告统计分析时,不应仅依赖p值作出推断,而应同时结合效应量指标,明确区分“差异是否显著”与“差异是否重要”这两个不同层次的问题,从而提高研究的科学性与结果解释的合理性。完整的统计分析报告应包括以下内容:
统计检验类型(如 t 检验);
统计量(如 t 值、F 值)及自由度(df);
p 值;
效应量(如 Cohen’s d)。
同时,应结合统计显著性与实际重要性之间可能出现的以下四种组合情形,对结果进行解读并规划后续研究:
显著但实际意义微弱:谨慎解释,优化或终止研究;
显著且实际重要:理想状况,推广并验证稳健性;
不显著但实际可能重要:扩大样本量,探索亚组效应;
不显著且实际不重要:放弃研究,重新设计。
例9-12:
某所高中近期试点了一种旨在提升学生数学成绩的新型辅助教学法。已知全校学生数学成绩的长期平均水平(总体均值)稳定在 70 分。为了客观评估该方法的实际效果,研究人员从采用该教学法的班级中随机抽取了 120 名学生作为样本。这 120 名学生的平均成绩为 71.5 分,标准差为8 分。
请在显著性水平 \(\alpha = 0.05\) 下,检验该班级的平均成绩是否显著高于全校的基准水平。(请写出假设、统计量、决策过程)。
计算该效应的 Cohen’s \(d\),并结合统计结论分析该教学方法在实际教育场景中是否具备推广价值。
建立假设
原假设 (\(H_0\)):\(\mu \le 70\) (新方法的平均成绩没有高于全校基准)
备择假设 (\(H_1\)):\(\mu > 70\) (新方法的平均成绩显著高于全校基准)
总体标准差未知,且样本量为 \(n=120\),选用 t 统计量。
\[ t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}} \]
确定显著性水平:$= 0.05 $
计算 p 值与临界值
计算 t 统计量的观测值:\(\bar{x} = 71.5, \mu_0 = 70, s = 8, n = 120\) \[ t = \frac{71.5 - 70}{8 / \sqrt{120}} = \frac{1.5}{0.7303} \approx 2.054 \]
自由度 \(df = n - 1 = 119\)。 进行单侧(右侧)检验,查 t 分布表或使用计算工具找 \(\alpha = 0.05\) 对应的临界值: \[ t_{\alpha}(119) = t_{0.05}(119) \approx 1.658 \] 拒绝域为:\(t > 1.658\)。
计算 t 统计量对应的右侧尾概率:
\[ p\text{-value} = P(t_{119} > 2.054) \approx 0.021 \]
通过比较 p 值与显著性水平 \(\alpha\):\(0.021 < 0.05\)或者通过比较观测值t与临界值:\(2.054 > 1.658\)
由于\(p\text{-value} < \alpha\)(或\(t > t_{\alpha}\)),我们拒绝原假设 (\(H_0\))。
计算 Cohen’s \(d\) 以衡量实际差异的大小: \[ d = \frac{\bar{x} - \mu_0}{s} \] 代入数值: \[ d = \frac{71.5 - 70}{8} = \frac{1.5}{8} = 0.1875 \approx 0.19 \]
效应量解释(依据 Cohen 标准):\(|d| \approx 0.2\) 为小效应。
这说明虽然统计上检测到了差异,但平均提升幅度(1.5 分)仅相当于标准差(8 分)的 18.75%,实际影响非常微弱。
从统计检验的角度看,右侧t检验结果显示 \(p\) 值小于 0.05,且t统计量落入了拒绝域。根据统计决策规则,我们必须拒绝原假设 \(H_0\),得出“新型教学方法在统计上显著提高了学生成绩”的结论。这在数学上是严谨的,表明样本中观察到的差异不太可能纯粹由随机误差引起。
然而,效应量的分析给出了更为谨慎的视角。Cohen’s d 的估计值为0.1875,属于“无到小”效应量范畴。这意味着虽然教学方法确实有效,但提升的幅度非常微弱,在实际教学场景中可能难以察觉。平均分可能仅仅提高了几分,这种差异对于单个学生或具体的教学实践来说,可能并不具备实质性的改变意义。
这种现象通常源于样本量较大(\(n=100\))时,统计检验具有极高的功效,能够捕捉到极其细微的差异。这一分析提示我们:在解释研究结果时,不能仅依据 \(p\) 值下结论,必须结合效应量考量差异的实际价值,避免将“ statistically significant”(统计显著)误读为“ practically significant”(实际显著)。
library(ggplot2)
library(patchwork)
# 题目数据
n <- 120
sample_mean <- 71.5
pop_mean <- 70
s <- 8
alpha <- 0.05
# --- 计算过程 ---
# t 值
t_value <- (sample_mean - pop_mean) / (s / sqrt(n))
# p 值 (单尾右侧)
df <- n - 1
p_value <- pt(t_value, df = df, lower.tail = FALSE)
# Cohen's d
cohens_d <- (sample_mean - pop_mean) / s
{
# --- 输出计算结果 (文本) ---
cat(" ================================================\n")
cat(" 单样本 t 检验 与 效应量分析结果\n")
cat(" ================================================\n")
cat("计算 t 值 :", round(t_value, 4), "\n")
cat("自由度 df :", df, "\n")
cat("计算 p 值 :", round(p_value, 4), "\n")
if (p_value < alpha) {
cat("结论: p 值 <", alpha, ",拒绝原假设 (差异具有统计学显著性)。\n")
} else {
cat("结论: p 值 >=", alpha, ",无法拒绝原假设。\n")
}
cat(" --------------------------------\n")
cat("Cohen's d :", round(cohens_d, 4), "\n")
# 效应量解释
interpretation <- if (abs(cohens_d) < 0.2) {
"极小或无实际意义"
} else if (abs(cohens_d) < 0.5) {
"小效应"
} else if (abs(cohens_d) < 0.8) {
"中等效应"
} else {
"大效应"
}
cat("效应量解释 :", interpretation, "\n")
cat(" ================================================\n")
}
## ================================================
## 单样本 t 检验 与 效应量分析结果
## ================================================
## 计算 t 值 : 2.054
## 自由度 df : 119
## 计算 p 值 : 0.0211
## 结论: p 值 < 0.05 ,拒绝原假设 (差异具有统计学显著性)。
## --------------------------------
## Cohen's d : 0.1875
## 效应量解释 : 极小或无实际意义
## ================================================
# --- 准备绘图数据 ---
x_range <- seq(-4, 4, length.out = 1000)
t_dist_data <- data.frame(x = x_range, y = dt(x_range, df = df))
t_critical <- qt(1 - alpha, df = df)
effect_labels <- c("无效应\n(0-0.2)", "小效应\n(0.2-0.5)", "中等效应\n(0.5-0.8)", "大效应\n(>0.8)")
effect_breaks <- c(0, 0.2, 0.5, 0.8)
# 3. 绘图
#t 检验分布图
p1 <- ggplot(t_dist_data, aes(x = x, y = y)) +
# 绘制曲线
geom_line(color = "black", linewidth = 1) +
# 绘制拒绝域
geom_area(data = subset(t_dist_data, x >= t_critical),
aes(y = y), fill = "red", alpha = 0.3) +
geom_vline(xintercept = t_critical, linetype = "dashed", color = "darkred") +
annotate("text", x = t_critical, y = max(t_dist_data$y) * 0.1,
label = paste0("临界值\n", round(t_critical, 3)),
color = "darkred", hjust = -0.1, size = 3) +
# 标注观测 t 值
geom_vline(xintercept = t_value, linewidth = 1, color = "blue") +
annotate("text", x = t_value, y = max(t_dist_data$y) * 0.4,
label = paste0("观测 t\n", round(t_value, 3)),
color = "blue", fontface = "bold", hjust = -0.1) +
# 标签与主题
labs(subtitle = paste0("t检验: ","p = ", round(p_value, 4), " < 0.05 -> 拒绝原假设"),
x = "t 值", y = "概率密度") +
scale_x_continuous(breaks = seq(-4, 4, 1)) +
theme_classic()
# Cohen's d 效应量图
p2 <- ggplot(data.frame(x=0, y=0), aes(x, y)) +
scale_y_continuous(limits = c(0, 1.2)) +
# 绘制背景阶梯区域
geom_rect(aes(xmin = 0, xmax = 0.2, ymin = 0, ymax = 1), fill = "grey70", alpha = 0.4) +
geom_rect(aes(xmin = 0.2, xmax = 0.5, ymin = 0, ymax = 1), fill = "green", alpha = 0.2) +
geom_rect(aes(xmin = 0.5, xmax = 0.8, ymin = 0, ymax = 1), fill = "blue", alpha = 0.2) +
geom_rect(aes(xmin = 0.8, xmax = 1, ymin = 0, ymax = 1), fill = "purple", alpha = 0.2) +
geom_vline(xintercept = c(0.2, 0.5, 0.8), linetype = "dashed", color = "white") +
# 绘制观测点
geom_point(aes(x = cohens_d, y = 0.5), size = 5, color = "red") +
annotate("text", x = cohens_d, y = 0.8, label = paste0("d = ", round(cohens_d, 4)),
color = "red", fontface = "bold", size = 5) +
scale_x_continuous(limits = c(0, 1), breaks = effect_breaks, labels = c("0", "0.2", "0.5", "0.8")) +
scale_y_continuous(limits = c(0, 1.2), breaks = NULL) +
# 区域标题
annotate("text", x = 0.1, y = 1.1, label = "微小效应", color = "grey30", fontface = "bold") +
annotate("text", x = 0.35, y = 1.1, label = "小效应", color = "darkgreen", fontface = "bold") +
annotate("text", x = 0.65, y = 1.1, label = "中等效应", color = "darkblue", fontface = "bold") +
annotate("text", x = 0.825, y = 1.1, label = "大效应", color = "purple", fontface = "bold") +
labs(subtitle = paste0( "效应量分析:","Cohen's d = ", round(cohens_d, 3), " -> 虽显著但效果微弱"),
x = "Cohen's d", y = "") +
coord_cartesian(clip = "off") + # 允许文字画在图外
theme_classic() +
theme(axis.line.y = element_blank())
#合并
plot_title <- paste0("统计显著性(", round(p_value, 4), ") & 实际效应量(", round(cohens_d, 3), ")")
final_plot <- (p1 / p2) +
plot_annotation(
title = plot_title,
theme = theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))
)
print(final_plot)