1、一个例子
当你做完一个实验,得到以下数据:
处理:2.11 2.35 2.16
对照:2.32 2.34 2.43
t检验p值为0.1529,接下来你该怎么做,是继续埋头实验,重复着一次又一次的p>0.05,还是停下来对你目前所做的实验进行一个评估,加以改善,以确保有更大的把握得到显著性结果?鉴于此,本文试图解决以下两个问题:
1、以目前的实验操作能力,以目前的实验方法或仪器精度,继续以3个重复做这个实验,你有多大的概率拿到显著性结果。
2、如果你想要有90%的把握得到p<0.05甚至p<0.01的结果,该设计几个重复数比较合理。
2、R语言实现
以上两个问题可以使用R语言的pwr包帮你做一个功效分析,如果你还没有安装pwr包,请先安装。
本例中我们用的是t检验,因此使用pwr包中的pwr.t.test()函数,使用说明如下:
pwr.t.test(n=NULL, d=NULL,sig.level=0.05 ,power=NULL ,type=c("two.sample","one.sample","paired"),alternative=c("two.sided","less","greater"))
其中,n为重复数;d为效应值,即实验组与控制组之间“标准化后的平均差异程度;power为功效水平;type默认为双样本t检验;alternative默认为双侧检验。
第一个问题:
# 加载pwr包
library(pwr)
# 输入数据
trt <- c(2.11, 2.35, 2.16)
ck <- c(2.32, 2.34, 2.43)
# 计算离差平方和
ss1 <- var(trt) * (3 - 1) # 方差*自由度
ss2 <- var(ck) * (3 - 1)
# 计算效应值
d <- (mean(trt) - mean(ck)) / sqrt((ss1 + ss2) / (3 + 3 - 2))
# n=3时,p<0.05的概率估计
pwr.t.test(n = 3, d = d)
Two-sample t test power calculation
n = 3
d = 1.587983
sig.level = 0.05
power = 0.3212346
alternative = two.sided
NOTE: n is number in *each* group
结果表明若继续以3个重复进行实验,只能有0.32的概率得到p<0.05的数据。
第二个问题:
# 90%的把握获得p<0.05的重复数
pwr.t.test(d=d,power=0.9)
Two-sample t test power calculation
n = 9.406774
d = 1.587983
sig.level = 0.05
power = 0.9
alternative = two.sided
NOTE: n is number in *each* group
结果表明要有90%的把握得到p<0.05的数据,需要做9~10个重复。
3、拓展
1)效应值
实验结果容不容易取得显著性结果,很大程度取决于效应值高不高,你可以试试将效应值调大,看看power值的变化(本例算出的效应值为1.59)。而从效应值的公式看,分子部分表示均值之差,分母部分与样本方差有关,如果实验处理的效果是很明显的,表现为均值之差很大,这时即使你操作差一点或者选择的方法精度较低(表现为方差较大),结果还是很容易显著的。相反,如果你的处理本身效果不明显,你想把这么微小的差异表现出来,那么你就需要更熟练的操作,选择更精密的仪器或方法,尽量的减小误差,使得效应值变大,才能用更少的重复数做出来。
2)pwr包
本例使用的是pwr包中的pwr.t.test()函数,pwr包中还有其他的函数,列举如下:
函 数 用途
pwr.2p.test() 两比例(n相等)
pwr.2p2n.test() 两比例(n不相等)
pwr.anova.test() 平衡的单因素ANOVA
pwr.chisq.test() 卡方检验
pwr.f2.test() 广义线性模型
pwr.p.test() 比例(单样本)
pwr.r.test() 相关系数
pwr.t2n.test() t检验(n不相等的两样本)
对于每个函数,你可以给定3个量(样本大小、功效和效应值) 中的2个获得第3个量,有兴趣的可自行了解。