Python教程

Multiple Testing 中的 Type I error(python代码实现)

本文主要是介绍Multiple Testing 中的 Type I error(python代码实现),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

Type I Error

T-tests与Type I error

Confidence Interval与Type I error

针对type I error的改进措施


Type I Error

含义:认为treatment group和control group之间有显著不同,而实际上并没有。也叫做"false positive".

T-tests与Type I error

  • Multiple testing: 想知道control group和treatment groups之间的某几个variable有没有区别.(即想知道加了这个treatment对这些变量有没有影响),所以就会执行multiple testing,即在一个实验中进行多组测试。
  • E.g: group0为不设置微信朋友圈置顶功能,group1为设置置顶一条的功能,group2为设置置顶两条的功能,想测试这三个group两两之间的以下7个variable有没有区别:用户的年龄,性别,年纪,工资,家庭成员个数,教育水平,实验前每个月发朋友圈的条数。那么一共需要执行3*7=21个t-test,即这组实验中包含21个test。
  • 很显然这些variable应该不受treatment的影响,即这些组test应该都不能reject null hypothesis. (Null hypothesis: treatment group 和 control group are not significantly different),所以这21条t-test的p-value应该都>0.05(若设置a=5%)。
  • 但实际上,测试出来的结果竟然发现有一条p<0.05,这说明我们的t-test做错了吗?并不是,这其实可以用type I error来解释:如果设置a=0.05,则意味着,在这一群t-test中,会有5%的t-value有可能会落在这两端的位置,因而reject null hypothesis。

  • 在上面例子里,可能有3*7*0.05=1.05个t-test reject null hypothesis(wrongly). 所以如果我们发现有一条t-test的p-value<0.05了,说明这一条可能是type I error,并不是我们的测试做错了。
  • python代码测试(一个不同的例子,一共做了14*3=42条t-test):
def multi_ttests(x):
    x0 = df[df['Group'] == 0][x]
    x1 = df[df['Group'] == 1][x]
    x2 = df[df['Group'] == 2][x]
    cm01 = sms.CompareMeans(sms.DescrStatsW(x0), sms.DescrStatsW(x1))
    cm02 = sms.CompareMeans(sms.DescrStatsW(x0), sms.DescrStatsW(x2))
    cm12 = sms.CompareMeans(sms.DescrStatsW(x1), sms.DescrStatsW(x2))
    cprint(x,'red', 'on_yellow')
    print(cm01.ttest_ind(alternative='two-sided', usevar='pooled'))  
    print(cm02.ttest_ind(alternative='two-sided', usevar='pooled')) 
    print(cm12.ttest_ind(alternative='two-sided', usevar='pooled')) 

var = df.columns
for i in range(14):
    multi_ttests(var[i+1])

(注意:'pooled'意味着这些组之间是equal variance的,因为我们认为treatment对这些组的variable都没有影响,那自然他们应该都是equal variance的。官方描述:If pooled, then the standard deviation of the samples is assumed to be the same. If unequal, then the variance of Welch ttest will be used)

发现有两条t-test的p-value<0.05, 一共允许3*14*0.05=2.1条。所以这两条可以都是type I error。

 

Confidence Interval与Type I error

  • t-test 或 z-test只能通过p-value是否>0.05来决定是否拒绝null hypothesis。因此只能得出treatment group与control group之间就某变量有没有significant的difference,但并不能说明这个difference(treatment effects)有多大。而confidence interval的test就可以做到这一点。
lift = 1.1
ctr0=0.5
ctrl = np.random.binomial(30, p=ctr0, size=1000) * 1.0
test = np.random.binomial(30, p=ctr0*lift, size=1000) * 1.0

cm = sms.CompareMeans(sms.DescrStatsW(test), sms.DescrStatsW(ctrl))

print(cm.tconfint_diff(alpha=0.05, alternative='two-sided', usevar='unequal'))
print(cm.zconfint_diff(alpha=0.05, alternative='two-sided', usevar='unequal'))
  • 如上述代码所示,我们自己建立了ctrl和test两个group,得到confidence interval的计算结果如下:

  • 意思是,这两组的sample mean difference的置信区间在1.06...和1.54...之间。 这样,既说明了两个group之间有不同,有treatment effect,又较明确得表明了这个treatment effect的数值区间大概是多少。 
  • 和上面的t-test一样,confidence interval也可以用来解释multiple testing中的type I error.代码及结果如下:
def multi_CI(x):
    x0 = df[df['Group'] == 0][x]
    x1 = df[df['Group'] == 1][x]
    x2 = df[df['Group'] == 2][x]
    cm01 = sms.CompareMeans(sms.DescrStatsW(x0), sms.DescrStatsW(x1))
    cm02 = sms.CompareMeans(sms.DescrStatsW(x0), sms.DescrStatsW(x2))
    cm12 = sms.CompareMeans(sms.DescrStatsW(x1), sms.DescrStatsW(x2))
    cprint(x,'red', 'on_yellow')
    print(cm01.zconfint_diff(alpha=0.05, alternative='two-sided', usevar='pooled'))
    print(cm02.zconfint_diff(alpha=0.05, alternative='two-sided', usevar='pooled'))
    print(cm12.zconfint_diff(alpha=0.05, alternative='two-sided', usevar='pooled'))

for i in range(14):
    multi_CI(var[i+1])

  • 发现仍然是那两个variable的中间那组测试,显示的置信区间没有包含0,说明这两条测试认为不同group之间的sample mean difference不等于0,即他们是有treatment effect的,即这个treatment对这两个variable有影响。而和上面t-test的那段代码一样,这个experiment允许的type I error的个数是2.1个,所以这两条也可以解释为type I error。

 

针对type I error的改进措施

为了减少type I error,我们可以降低alpha的值,比如从5%降低到1%,这样这些t-test中的p-value<0.01的肯定比<0.05的要少,甚至没有p-value<0.01的,这样就消除了type I error了。confidence interval也同理。

这篇关于Multiple Testing 中的 Type I error(python代码实现)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!