相关性一些需要知道的概念

统计学习05:F检验,多组均值比较的假设检验

2020-11-23  本文已影响0人  小贝学生信

简单理解,t检验是两组均值比较的假设检验,P<0.05则表示两组均值存在显著差异。而F检验(一般更常称为方差分析analysis of variance)就是多组均值是否相同的假设检验,P<0.05,则表示多组间均值存在显著差异。

1、方差分析思路

1.1假设检验

(1)零假设:组均值统计量的方差为0,或者说μ1=μ2=μ3=....=μk
(2)计算F统计量:F=组间方差/组内方差;
(3)若F大于临界值,则认为组均值存在显著差异。

1.2变异分解

理解变异分解则可以更好地明白方差分析的思路与缘由。

F statistcs

一般来说:多组数据的总变异都可分为组间方差与组内方差两部分。
而方差分析的目的就是计算:是不是每组间的(均值)差异占总变异的主要部分。考虑两种极端情况

2、实例计算

方差分析有很多种类型,这里演示最常见的两种:单因素方差分析与双因素方差分析
此外R语言里都有现成的函数可直接计算。通过实例计算,对比函数结果,可帮助更好地理解方差分析计算过程。

2.1 单因素方差分析

sum((cholesterol$response-mean(cholesterol$response))^2)
#[1] 1820.119
aggregate(cholesterol$response, by=list(cholesterol$trt), FUN=mean)
#  Group.1        x
#1   1time  5.78197
#2  2times  9.22497
#3  4times 12.37478
#4   drugD 15.36117
#5   drugE 20.94752

mean(cholesterol$response)
#[1] 12.73808

a=aggregate(cholesterol$response, by=list(cholesterol$trt), FUN=mean)
m=mean(cholesterol$response)
sum((a$x-m)^2*10)
#[1] 1351.369
sum((cholesterol$response-rep(a$x,each=10))^2)
#[1] 468.7504
1351.369 + 468.7504
#[1] 1820.119   即总变异
fit0 <- aov(response ~ trt, data=cholesterol)
summary(fit0)
aov()

trt 即为研究的单因素;Residuals 即为组内变异
Df 表示自由度;Sum sq即为变异值;
Mean Sq=Sum Sq/Df ; F value=337.8/10.4;
再计算在自由度(4,45)下,F=337的p值是多少。

2.2 双因素方差分析

即有两个因素(A、B)影响实验结果,分别有不同的水平。根据是否有交互项可分为两类
所谓交互项,即因素A的不同水平可能影响因素B的作用

table(ToothGrowth$supp,ToothGrowth$dose)    
#     0.5  1  2
#  OJ  10 10 10
#  VC  10 10 10
ToothGrowth$dose=factor(ToothGrowth$dose)
(1)无交互项
sum((ToothGrowth$len-mean(ToothGrowth$len))^2)
#[1] 3452.209
aggregate(len, by=list(supp), FUN=mean)
#  Group.1        x
#1      OJ 20.66333
#2      VC 16.96333

b=aggregate(len, by=list(supp), FUN=mean)
sum(((b$x-mean(b$x))^2)*30)
#[1] 205.35
aggregate(len, by=list(dose), FUN=mean)
#  Group.1      x
#1     0.5 10.605
#2       1 19.735
#3       2 26.100

aggregate(len, by=list(dose), FUN=mean)
sum(((c$x-mean(c$x))^2)*20)
#[1] 2426.434
#A因素相较于总均值的影响
supp2mean=rep(b$x[2:1],each=30)-mean(len)

#B因素相较于总均值的影响
dose2mean=rep(c(c$x,c$x),each=10)-mean(len)

#总均值
m=mean(len)

df=data.frame(ToothGrowth$len,supp2mean,dose2mean,m)
sum((df$ToothGrowth.len-df$supp2mean-df$dose2mean-df$m)^2)
#[1] 820.425
fit1 <- aov(len ~ supp*dose-supp:dose) 
summary(fit1)
aov
(2)有交互项
#交互项差异
aggregate(len, by=list(supp,dose), FUN=mean) 
#  Group.1 Group.2     x
#1      OJ     0.5 13.23
#2      VC     0.5  7.98
#3      OJ       1 22.70
#4      VC       1 16.77
#5      OJ       2 26.06
#6      VC       2 26.14

a=a[order(a$Group.1,decreasing = T),]
df$mean.s.d=rep(a$x,each=10)
sum((df$mean.s.d-df$supp2mean-df$dose2mean-df$m)^2)
#[1] 108.319
#新的组内差异
sum((df$ToothGrowth.len-df$mean.s.d)^2)
#[1] 712.106
fit <- aov(len ~ supp*dose) 
summary(fit)
image.png

3、两两比较(简单理解)

3.1 原因
3.2 FDR方法
gene=paste0("gene",1:10)
p.value=round(abs(rnorm(10,mean=0.030,sd=0.1)),4)
df=data.frame(gene,p.value)
raw df

(2)按p值从大到小排序

df=df[order(df$p.value,decreasing = T),]
df$num = 10:1
df

(3)按照Benjamini & Hochberg(BH)法计算FDR值
计算公式为:FDR=p*n/rank。一个注意点就是计算第二个fdr开始,需要与上一个计算值比较,取其中较小的。R代码如下

for (i in 1:10) {
  if (i != 1) {
    df$fdr[i]=min(df$p.value[i]*(10/df$num[i]),df$fdr[i-1])
  } else {
    df$fdr[i]= df$p.value[i]*(10/df$num[i])
  }
}
df
与R函数p.adjust结果一致
p.adjust(df$p.value, "BH")
# [1] 0.22810000 0.16522222 0.10925000 0.07528571 0.05766667 0.05766667 0.05766667
# [8] 0.05766667 0.05766667 0.05766667

可以看到,原始p值中6个是小于0.05,但经FDR校正后,全都大于0.05了,即无显著意义。

FDR在生信,尤其海量的基因比较数据中常用。而在医学实验中,进行若干实验组的两两比较,也有很多其它方法。

3.3 其它方法

这两组方法,在之前R语言笔记中也学到相关函数

上一篇下一篇

猜你喜欢

热点阅读