Permutation Test

2023-05-16

常规步骤:一般多组间样本均数的比较是先做正态性检验和方差齐性,然后在各组都满足正态性和方差齐性的前提下做方差分析。

如果数据呈现正态分布,但方差不齐,则可以选择近似方法(Welch法 和 Brown-Forsythe法)。

如果不满足正态性检验,则选择非参数方法Kruskal-Wallis检验或其他方法。

(来源:陈平雁主编的《IBM SPSS 19统计软件应用教程》)。



Permutation Test。该方法可用于:

  1. 完全随机设计资料的分析(两或多样本的均数比较、率比较和等级分布比较)

  2. 配对设计资料的分析(配对设计的定量资料差值均值与0比较、配对四格表资料、配对设计等级资料)

  3. 随机区组设计资料的分析

  4. 相关分析

  5. 线性回归分析等

(来源:饶克勤主编的《卫生统计方法与应用进展 第2卷》)。



 Permutation Test的基本思想  

从特定的H0假设出发,根据所研究的问题构造一个统计量,并利用手头样本,按排列组合的原理,导出检验统计量的理论抽样分布;若难以导出确切的理论分布,则采用抽样模拟的方法估计其近似分布。然后求出从该分布中获得手头样本及更极端样本的概率(P值),并界定此概率,做出推断性结论。


注意:假设现在有18个对象平均分布在3组,则其确切的组合数是18!/(6!*6!*6!) = 17,153,136(约1715万)。如果是成千上万的数据,则计算量之大可见一斑。所以,当计算量大时,一般会采用抽样模拟的方法估计近似分布。



实施步骤(以两样本均数比较为例)


(1) 建立假设,确定检验水准

H0: μ1=μ2; H1: μ1≠μ2; α=0.05(双侧)


(2) 构造统计量D,并计算现有样本统计量D(obs)

两样本均数的比较,则构造样本均数之差作为统计量


(3) 在H0假设成立的条件下,通过计算机大量计算得到统计量D的“经验抽样分布”。


(4) 计算概率P值

在H0假设成立的前提下,P值为“经验抽样分布”中D值大于等于(或小于等于)现有样本统计量D(obs)的概率。即


P=P(|D|≥|D(obs)|)=#( |D|≥|D(obs)|)/R

 

其中,分母R为确切排列组合数或随机重复的次数,分子为分母中|D|≥|D(obs)|的次数。


(5) 根据小概率原理做出推断性结论


  案例分析  


数据背景:美国各地区(东北部A、南部B、中北部C和西部D)的文盲率,其中每个地区包含多个州,每个州有一个文盲率。所以在比较四个地区(A/B/C/D)的文盲率时文盲率属于数值型变量。

目的:对比四组之间的文盲率是否有差异

方法:单因素方差分析、Kruskal-Wallis检验和Permutation Test



#加载R包

library(tidyverse) 


#获得数据,%>%表示管道操作符,表示参数直接传递给下一个函数,mutate用于增添变量,rename用于修改变量名称,select用于选择变量

states <- as.data.frame(cbind(state.region,state.x77[,3])) %>%
mutate(region = factor(state.region, labels= c("A", "B", "C", "D"))) %>%
rename(illiteracy = V2) %>%
select(region, illiteracy)


#查看数据结构

summary(states)


#绘制箱式图,看组间文盲率的差异

states %>% ggplot( aes (x= region, y = illiteracy,color = region)) + geom_boxplot() + geom_point()



#绘制各组的频数分布直方图,结果可见D组比较偏态,binwidth=0.3表示间距是0.3,facet_wrap是分面函数,指按照地区分别绘制,theme_bw()是主题函数,表示让背景显示白色

states %>% ggplot(aes(x = illiteracy, color= region )) +

geom_histogram(binwidth = 0.3) + facet_wrap(~ region) + theme_bw()



#调用FSA包的Summarize函数,获得每组的描述性指标

library(FSA)

Summarize(illiteracy ~ region, data =states)


#分组正态性检验,发现D组不满足正态性检验,by = list(分组变量)表示按组分别计算

a <- aggregate(states$illiteracy, by = list(states$region),shapiro.test)


#查看结果

a$x

 

#1.进行Kruskal-Wallis检验

kruskal.test(illiteracy ~ region, data =states)

 

#1.1基于Kruskal-Wallis检验的两两比较,bon表示采用bonferroni矫正

kw.pairtest <- dunnTest(illiteracy ~ region,data = states, method="bon")


#提取两两比较的结果

kw.pairtest <- kw.pairtest$res 

#2进行Permutation Test

#此包可进行Permutation Test

library(coin)


#设置种子。由于Permutation Test会模拟抽样,所以每次的结果会存在一定的差异,设置种子有利于结果的重现。
set.seed(1234)


oneway_test(illiteracy ~ region, data = states, distribution= approximate(B=9999))

#2.1基于PermutationTest的两两比较

library(rcompanion)
PT = pairwisePermutationTest(illiteracy ~ region, data =states, method="bon")


#3进行单因素方差分析

#加载R包

library(multcomp) 

#拟合模型

oneway.fit <- aov(illiteracy ~ region, data = states) 


#查看整体模型是否有意义

summary(oneway.fit)

#3.1基于单因素方差分析的两两比较

TukeyHSD(oneway.fit)



表1 三种方法的结果对比


组间

diff

PT.adj.P

KW.adj.P

Anova.adj.P

A-B

-0.74

0.016

0.110

0.002

A-C

0.30

0.046

0.600

0.464

A-D

-0.02

1.000

1.000

0.999

B-C

1.04

<0.001

<0.001

<0.001

B-D

0.71

0.027

0.0038

<0.001

C-D

-0.32

0.518

1.000

0.314

理由:在数据不满足正态分布和结合图1箱式图的情况下,单因素方差分析的结果不太可靠。秩和检验由于舍弃原始数据的具体信息而导致检验功效低。相对而言,Permutation Test 充分利用样本数据的信息,且对原始数据无正态性、方差齐性等要求,故检验效能高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Permutation Test 的相关文章

  • 从加权集中按权重顺序生成长度 L 的前 N ​​个组合

    我有一组带有权重的字母 这给出了它们出现在字符串中的概率 a 0 7 b 0 1 c 0 3 z 0 01 因此 这个词aaaa有一个概率0 7 0 7 0 7 0 7 0 24 这个单词aaac会有概率0 7 0 7 0 7 0 3 0
  • 智能生成String排列组合的方法

    String database a b c 我想根据给定生成以下字符串序列database a b c aa ab ac ba bb bc ca cb cc aaa 我只能想到一个相当 虚拟 的解决方案 public class JavaA
  • 如何使这种组合/排列方法递归?

    我有一个字符串数组列表 希望将所有可能的组合存储到另一个集合中 例如 air bus car gt air bus car air bus air car bus air bus car car air car bus air bus ca
  • 关于循环排列

    我学过数学 然后我就想到了这个问题 有两个排列 A 和 B 以及一个整数 M 如果我们可以从 A 到 B 进行以下操作 我们就说 A 几乎等于 B 1 选择排列 A 的 M 长度段 2 对其进行向右循环移位 因此 如果子段是 1 2 3 4
  • 生成重复列表,无论顺序如何

    我想生成将列表中的索引与 槽 相关联的组合 例如 0 0 1 表示 0 和 1 属于同一个槽 而 2 属于另一个槽 0 1 1 1 表示 1 2 3 属于同一个槽 而 0 则单独存在 在这个例子中 0和1只是识别这些槽的方式 但不携带供我使
  • 在Python中查找给定字符串的所有可能排列[重复]

    这个问题在这里已经有答案了 我有一根绳子 我想通过更改该字符串中字符的顺序来生成该字符串的所有排列 例如 说 x stack 我想要的是这样的列表 l stack satck sackt 目前 我正在迭代字符串的列表强制转换 随机选取 2
  • 在Java中动态生成2个列表的非重复排列对

    我一直在查看很多关于 Java 排列的不同帖子 但没有一个符合我的要求 所以我决定发布 所以我有 2List
  • 生成 M 个箱中 N 个球的所有排列

    我想生成一组排列n球进m垃圾箱 以下一组嵌套列表生成这些排列 n lt 3 m lt 4 v lt rep 0 m for i in n 0 for j in n sum i 0 for k in n sum i j 0 for l in
  • 排列 - 所有可能的数字集

    我有从 0 到 8 的数字 我想要结果是这些数字的所有可能集合 每个集合应该使用所有数字 每个数字只能在集合中出现一次 我希望看到用 PHP 制作的可以打印结果的解决方案 或者 至少 我想对组合学理论有所了解 因为我早已忘记了它 计算有多少
  • O(N) 排列识别

    这个答案 https stackoverflow com a 36818947 2642059通过比较两个字符串的内容来确定它们是否是排列 如果它们包含相同数量的每个字符 那么它们显然是排列 这是在O N time 但我不喜欢这个答案 因为
  • C++ 中排列、组合和 PowerSet 的实现 [重复]

    这个问题在这里已经有答案了 我正在寻找使用 C 实现排列 组合和幂集 使用STL 排列 using std next permutation template
  • Makefile 排列

    Bash 可以产生排列 笛卡尔积 http wikipedia org wiki Cartesian product echo 1 2 a b 1a 1b 2a 2b 我想用 makefile 做类似的事情 这是一个例子 生成文件 all
  • 生成向量元素的所有可能组合的列表

    我正在尝试在长度为 14 的向量中生成 0 和 1 的所有可能组合 是否有一种简单的方法可以将输出作为向量列表 甚至更好 作为数据帧 为了更好地演示我正在寻找的内容 假设我只想要一个长度为 3 的向量 我希望能够生成以下内容 1 1 1 0
  • 列出具有重复字母的字符串的唯一排列的算法

    例如 字符串 AAABBB 将具有排列 阿巴巴 巴巴巴 阿巴巴 ETC 生成排列的好算法是什么 它的时间复杂度是多少 这不是完整的答案 只是一个想法 如果您的字符串的固定数量只有两个字母 我将使用二叉树和良好的递归函数 每个节点都是包含名称
  • 在 O(n) 中获取作为唯一给定索引的函数的排列

    我想要一个函数get permutation给定一个列表l和一个索引i 返回一个排列l这样排列对于所有人来说都是唯一的i大于0并低于n where n len l I e get permutation l i get permutatio
  • CUDA Thrust 和 sort_by_key

    我正在寻找 CUDA 上的排序算法 它可以对元素数组 A 双精度 进行排序 并返回该数组 A 的键 B 数组 我知道sort by keyThrust 库中的函数 但我希望元素数组 A 保持不变 我能做些什么 我的代码是 void sort
  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • 可能的数独谜题的数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Wiki http en wikipedia org wiki Mathematics of Sudoku http en wikiped
  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何

随机推荐

  • ECS Ubuntu20.04配置和删除swap虚拟内存

    参考1 参考2 本文章仅作个人参考之用 xff0c 恕才疏学浅 xff0c 作者对文章内容不负责 xff1b 目标 为解决内存不足的问题 xff0c 将一部分硬盘空间当作内存之用 xff1b 配置 确定设置 xff0c 输入 free m
  • Oracle数据库-存储过程

    创建表 create table TESTTABLE id1 VARCHAR2 12 name VARCHAR2 32 select t id1 t name from TESTTABLE t begin insert into TESTT
  • GitHub教程

    GitHub简介 Git是一个分布式的版本控制系统 xff0c 最初由Linus Torvalds编写 xff0c 用作Linux内核代码的管理 在推出后 xff0c Git在其它项目中也取得了很大成功 xff0c 尤其是在Ruby社区中
  • UEditor(百度编辑器)的使用

    首先我们需要来认识下UEditor xff0c 它是由百度web前端研发部开发所见即所得富文本web编辑器 xff0c 并且是基于BSD协议的开源产品 xff0c 允许自由使用和修改 xff0c 这也是小编最看中它的地方 xff0c 开源就
  • Extjs6 表格数据筛选(无查询)

    使用Extjs6作为前端 想在Gird上进行数据筛选 网上没多少可参考资料 后来在官方提供的Demo中找到了想要的东西 详情如下 xff1a 效果图 在这个基础上进行了调整 于是成了如下的样子 具体的代码如下 xff1a 前提 表格的数据已
  • 如何关闭CentOS7上的firewall防火墙

    1 执行 systemctl stop firewalld service xff0c 停止系统中的firewall服务 xff0c systemctl disable firewalld service xff0c 禁止firewall开
  • JSON for Modern C++的dump函数的一个小修改:纯数值内容放在同一行

    对于 1 2 3 这样的纯数值json xff0c 使用dump 4 输出会占用非常多的行 xff1a 1 2 3 我个人喜欢对这样的纯数值 xff0c 只用一行 xff0c 所以小改了一下源代码 xff1a void dump const
  • C++实现flatten:扁平化容器的容器的容器。。。

    zip map reduce flatten是比较有意思的通用算法 zip在boost iterator里有了 xff0c map reduce是用transfom accumulate inner product实现的 flatten就没
  • C++模仿python的装饰器功能

    C 43 43 固有语法限制 xff0c 导致能模仿功能 xff0c 但是无法模仿语法 function lt int int gt f 61 int x return x DECORATOR f pre post 被装饰的函数必须使用fu
  • 《Modern C++ Design》Loki库源码读解随想

    Modern C 43 43 Design Loki 库源码读解随想 大牛 Andrei Alexandrescu 的 Modern C 43 43 Design 讨论的是 C 43 43 语言的最前沿研究 xff1a generative
  • CUJ:标准库:定义iterator和const iterator

    The Standard Librarian Defining Iterators and Const Iterators Matt Austern http www cuj com experts 1901 austern htm top
  • CUJ:高效使用标准库:显式函数模板参数申明与STL

    Effective Standard C 43 43 Library Explicit Function Template Argument Specification and STL A New Language Feature and
  • 正则是如何判断有重复/由不重复的数字组成的串的。

    源自这里 xff1a http bbs csdn net topics 390804087 d 1 这个判断了有重复的数字 原理 xff1a 是非贪婪 xff0c 从最少的数量试起 是0 无穷大次 最小就是0 对于源串 1234567890
  • 《C++程序设计原理与实践》书评

    在2周内 xff0c 以1目10行的速度读过了这本书 小小书评如下 xff1a 这是一本主要面向初学者的极好的教材 在我看过的编程书籍中 xff0c 这是第二本适合于完全无编程经验的初学者的入门书籍 xff08 前面一本叫 C语言解析教程
  • 最近用了一把boost::range,哎,真方便。(水帖)

    难怪有老外大牛写文章 iterator must go 34 stl是该彻底重写了 嗯 xff0c 我的C 43 43 代码越来越向python代码靠拢了
  • 数据库左连接注意点

    left join on 即左连接 xff0c 把left join左边的表的记录全部找出来 进行左连接时 xff0c 就有涉及到主表 辅表 xff0c 这时 主表条件写在 WHERE之后 xff0c 辅表条件写在 ON后面 xff01 x
  • boost::preprocess的神秘魔法的实现细节:BOOST_PP_SEQ_SIZE(SEQ)

    BOOST PP SEQ SIZE还可以展示一下 xff0c BEGIN BOOST PP SEQ FOLD LEFT SUB S 22 SEQ 61 61 10 END直接生产了2 6M的log过程 define SEQ 4 1 5 2
  • windows子系统固定IP和开启ssh

    Windows子系统固定IP地址 一 固定IP地址 windows子系统默认开机会变更随机ip 修改为固定的ip地址 1 获取子系统名 打开cmd或PowerShell输入 wsl l v 显示如图 获得Ubuntu在子系统中名字 Ubun
  • Centos 安装pyspider 必须成功

    Centos安装pyspider踩过的坑 xff01 xff01 xff01 一个接着一个 写在前面的话 xff1a 一直在本地机器小玩玩pyspider xff0c 今天心血来潮linux安排上 网上教程一大堆 xff0c 一个接着一个坑
  • Permutation Test

    常规步骤 xff1a 一般 多组间样本均数的比较是先做正态性检验和方差齐性 xff0c 然后在各组 都满足 正态性和方差齐性的前提下做方差分析 如果数据呈现正态分布 xff0c 但方差不齐 xff0c 则可以选择近似方法 Welch法 和