R语言——单因素方差分析笔记

2024-02-01 01:40

本文主要是介绍R语言——单因素方差分析笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这学期有一门选修应用统计软件。课上理论讲得不清不楚,编程根本练不着,老师布置的作业就是将他发的代码运行一下写个报告,简直就是机械化的浪费时间的操作。为了不白学这门课,在此稍加整理课上的笔记,供自己以后回顾复习。

一、aov函数

(一)样本服从正态分布

1.代码示例

n1=150;  ##n1=50
n2=150;  ##n2=50
n3=150;  ##n3=50
u1=0.5;
u2=0;
u3=0;
csd=1;
x1=rnorm(n1,u1,csd);
x2=rnorm(n2,u2,csd);
x3=rnorm(n3,u3,csd);
mouse<-data.frame(
X=c(x1,x2,x3),
A=factor(c(rep(1,n1),rep(2,n2), rep(3,n3))))
mouse.aov<-aov(X~A,data=mouse)
source("anova.tab.R"); anova.tab(mouse.aov)

2.部分代码解释

(1)aov()函数提供方差分析表计算,使用方法:aov(formula,data=NULL,projections=FALSE,qr=TRUE,contrasts=NULL,...),结合在线帮助理解。

(2)factor:转换为因子类型,因子在整个计算过程中不作为数值,而是一个”符号”。

3.结果分析

 

 图①是样本量取50的运行结果,P值较大,接受原假设,即三类样本无显著差异;图②是样本量取150的运行结果,P值较小,拒绝原假设,即三类样本存在显著差异。可见样本量越大,检验结果越准确。

(二)样本误差服从T分布(T分布尾部比正态分布重)

1.代码示例
n1=150;
n2=150;
n3=150;
u1=0.5;
u2=0;
u3=0;
df=3  ##自由度为3
x1=u1+rt(n1,df);  ##误差生成t分布随机数
x2=u2+rt(n2,df);
x3=u3+rt(n3,df);
mouse<-data.frame(
X=c(x1,x2,x3),
A=factor(c(rep(1,n1),rep(2,n2), rep(3,n3))))
mouse.aov<-aov(X~A, data=mouse)
source("anova.tab.R"); anova.tab(mouse.aov)

2.结果分析

 在样本量较大的情况下,所得P值较小,可拒绝原假设。故当样本量较大,误差的分布对于检验的影响较小,而样本均值的差异对于检验影响较大。

二、KW检验

KW检验的优点:对于误差分布无限制,对误差分布无正态性假设。

(一)样本服从正态分布

1.代码示例

n1=50;
n2=50;
n3=50;
u1=0.5;
u2=0;
u3=0;
csd=1;
x1=rnorm(n1,u1,csd);
x2=rnorm(n2,u2,csd);
x3=rnorm(n3,u3,csd);
food<-data.frame(
x=c(x1,x2,x3),
g=factor(rep(1:3, c(n1,n2,n3))))
kruskal.test(x~g, data=food)

2.结果分析

样本量为50时,就能得到在显著性水平取0.05时拒绝原假设的结果。可见KW检验可能比aov函数具有更好的检验效果。

(二)样本误差服从T分布

1.代码示例

n1=200;
n2=200;
n3=200;
u1=0.5;
u2=0;
u3=0;
df=3
x1=u1+rt(n1,df);
x2=u2+rt(n2,df);
x3=u3+rt(n3,df);
food<-data.frame(
x=c(x1,x2,x3),
g=factor(rep(1:3, c(n1,n2,n3))))
kruskal.test(x~g, data=food)

2.代码解释

kruskal.test(formula,data,subset,na.action,...)是K-W秩和检验的函数

3.结果分析

 

P值很小,故拒绝原假设,即三组样本均值存在显著差异。

三、pairwise检验

(一)样本服从正态分布

1.代码示例

n1=100;
n2=100;
n3=100;
u1=0.5;
u2=0;
u3=0;
csd=1;
x1=rnorm(n1,u1,csd);
x2=rnorm(n2,u2,csd);
x3=rnorm(n3,u3,csd);
X=c(x1,x2,x3)
A=factor(c(rep(1,n1),rep(2,n2), rep(3,n3)))
mu<-c(mean(X[A==1]), mean(X[A==2]), mean(X[A==3])); mu
pairwise.t.test(X, A, p.adjust.method = "none")
pairwise.t.test(X, A, p.adjust.method = "holm")
pairwise.t.test(X, A, p.adjust.method = "bonferroni")

2.代码解释

pairwise.t.test()函数用于均值的多重比较,其使用方法如下:pairwise.t.test(x,g,p.adjust.method=p.adjust.methods,pool.sd=TRUE,...)

其中x是响应向量,g是因子向量,p.adjust.method是P值的调整方法。其中,调整方法由p.adjust()给出,详见p.adjust()函数的在线帮助。若p.adjust.method = "none",表示不做任何调整;缺省值按“holm”作调整。

3.结果分析

首先由均值的估计可见,μ1与μ2、μ3存在较大差异。利用三种pairwise的检验方法,均得到μ1与μ2、μ3的检验P值低于显著性水平0.05,故μ1与μ2、μ3存在显著差异;而μ2与μ3之间检验P值较大,故接受原假设,即μ2与μ3之间无显著差异。

(二)样本误差服从自由度为3的T分布

1.代码示例

n1=200;
n2=200;
n3=200;
u1=0.5;
u2=0;
u3=0;
df=3
x1=u1+rt(n1,df);
x2=u2+rt(n2,df);
x3=u3+rt(n3,df);
X=c(x1,x2,x3)
A=factor(c(rep(1,n1),rep(2,n2), rep(3,n3)))
mu<-c(mean(X[A==1]), mean(X[A==2]), mean(X[A==3])); mu
pairwise.t.test(X, A, p.adjust.method = "none")
pairwise.t.test(X, A, p.adjust.method = "holm")
pairwise.t.test(X, A, p.adjust.method = "bonferroni")

2.结果分析

 分析结果同上。

PS:有时运行结果会出现错误,得到不准确的检验结果。多运行几次,能够避免取错误的检验结果。

四、Bartlett检验

1.代码示例

n1=50;
n2=50;
n3=50;
n4=50;
lamp<-data.frame(
X=c(rnorm(n1,0,1),rnorm(n2,0,2),rnorm(n3,0,2),rnorm(n4,0,2)),
A=factor(c(rep(1,n1),rep(2,n2), rep(3,n3), rep(4,n4))))
bartlett.test(X~A, data=lamp)
bartlett.test(lamp$X, lamp$A)  ##bartlett.test函数的另一种使用方法 

2.代码解释

bartlett.test()函数用于方差齐性检验,其使用格式为bartlett.test(x,g,..),其中x是由数据构成的向量或列表,g是由因子构成的向量,x是列表时,此项无效;或使用另一种格式bartlett.test(formula,data,subset,na.action,...),可借助在线帮助理解各参数含义。

3.结果分析

 所得P值很小,故拒绝原假设,即样本间的方差存在显著差异。符合样本的设定。

五、friedman检验

friedman检验用于多个样本的比较,如果它们的总体不能满足正态性和方差齐性的要求。firedman检验原假设为:各方法处理效果无显著差异。

1.代码示例

##各变量之间有相关性##
n=1000
p=3;
alpha=0.5;
sig=1;
##均值
mu=c(0.5,rep(0,p-1));
##协方差矩阵
Sm=sig*toeplitz(c(1,rep(alpha, p-1)));
Sm
#Sm=sig*toeplitz(alpha^(c(0:(p-1))));
#Sm
ev<-eigen(Sm); 
lam=ev$values;
vec=ev$vectors;
Sr=vec%*%sqrt(diag(lam))%*%t(vec)
#Sm-Sr%*%Sr;
x=t(t(matrix(rnorm(n*p),ncol=p)%*%Sr)+mu);
apply(x,2,mean)
var(x)
friedman.test(x)

2.代码解释

friedman检验的函数为friedman.test(y,groups,blocks,...),或者friedman.test(formula,data,subset,na.action,...)

 3.结果分析

 由均值的估计得出,μ1与μ2、μ3存在较大差异。协方差阵显示出不同样本之间存在较大的相关性。Friedman检验的P值非常小,故拒绝原假设,即样本之间存在显著差异。

这篇关于R语言——单因素方差分析笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665701

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整