简单来说,R语言中的排列假设检验是一种比较两组数据数值的方法。它是一种极具价值的替代方案,可以用于替代以下检验:
让我们在 R 编程中来实现这个检验。
为什么我们要使用排列假设检验?
- 样本量较小:在数据稀缺时,它比传统方法更可靠。
- 不满足参数检验的假设:当数据不符合正态分布等假设时,它是理想的选择。
- 检验非经典指标:除了经典的均值和中位数比较,我们还可以用它来检验其他统计量。
- 标准误难以估计:当检验统计量的标准误难以通过公式计算时,它提供了一种基于模拟的解决方案。
排列假设检验的步骤
- 明确假设:建立我们的零假设和备择假设。
- 选择检验统计量:例如均值、中位数等。
- 确定统计量的分布:通过重抽样来模拟分布。
- 计算 P 值:将观察到的统计量转化为概率值。
> 注意:
> P 值的计算公式为:
> P值 = (排列检验统计量大于观察统计量的数量) / (总排列数量)
R 语言实现
- 数据集:鸡饲料数据。该数据集是“R 数据集包”中“chickwts”数据的一个子集。您可以在此下载数据集。
- 假设:鸡的体重与饲料的种类无关。
检验统计量
- 检验统计量 #1:两组饲料体重均值差异的绝对值
Y1 – Y2 。这与独立双样本双侧 t 检验使用的统计量相同。 - 检验统计量 #2:两组饲料体重中位数差异的绝对值
Median1 – Median2 。
# R 程序演示
# 加载数据集
d <- read.table(file = "ChickData.csv",
header = T, sep = ",")
# 打印数据集
print(d)
# 检查列名
names(d)
levels(d$feed)
# 每种饲料有多少个观测值?
table(d$feed)
# 让我们通过箱线图查看这两种饲料的体重增减情况
boxplot(d$weight~d$feed, las = 1,
ylab = "weight (g)",
xlab = "feed",
main = "Weight by Feed")
# 计算样本 MEANS(均值)的差异
mean(d$weight[d$feed == "casein"]) # casein 的均值
mean(d$weight[d$feed == "meatmeal"]) # meatmeal 的均值
# 让我们计算均值的绝对差异
test.stat1 <- abs(mean(d$weight[d$feed == "casein"]) -
mean(d$weight[d$feed == "meatmeal"]))
test.stat1
# 计算样本 MEDIANS(中位数)的差异
median(d$weight[d$feed == "casein"]) # casein 的中位数
median(d$weight[d$feed == "meatmeal"]) # meatmeal 的中位数
# 让我们计算中位数的绝对差异
test.stat2 <- abs(median(d$weight[d$feed == "casein"]) -
median(d$weight[d$feed == "meatmeal"]))
test.stat2
# 排列检验
# 为了结果的可重现性
set.seed(1979)
# 要抽样的观测数量
n <- length(d$feed)
# 要获取的排列样本数量
P <- 100000
# 我们将要进行重抽样的变量
variable <- d$weight
# 初始化一个矩阵来存储排列数据
PermSamples <- matrix(0, nrow = n, ncol = P)
# 每一列都是数据的一个排列样本
# 现在,使用循环获取那些排列样本
# 让我们花点时间讨论一下那段代码的作用
for(i in 1:P)
{
PermSamples[, i] <- sample(variable,
size = n,
replace = FALSE)
}
# 我们可以快速查看 PermSamples 的前 5 列
PermSamples[, 1:5]
# 初始化向量来存储所有的检验统计量
Perm.test.stat1 <- Perm.test.stat2 <- rep(0, P)
# 遍历并计算检验统计量
for (i in 1:P)
{
# 计算 perm-test-stat1 并保存
Perm.test.stat1[i] <- abs(mean(PermSamples[d$feed == "casein",i]) -
mean(PermSamples[d$feed == "meatmeal",i]))
# 计算 perm-test-stat2 并保存
Perm.test.stat2[i] = test.stat1)[1:15]
# 如果我们要求所有这些值的均值,
# 它会将 0 视为 FALSE(假),1 视为 TRUE(真)
mean((Perm.test.stat1 >= test.stat1)[1:15])
# 计算所有 P = 100,000 次的 p 值
mean(Perm.test.stat1 >= test.stat1)
# 并且,让我们计算
# 检验统计量选项 2(中位数绝对差异)的 p 值
mean(Perm.test.stat2 >= test.stat2)