R语言中的排列假设检验:一种稳健的替代方案

简单来说,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)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/43773.html
点赞
0.00 平均评分 (0% 分数) - 0