ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-25 14:04:27  阅读:226  来源: 互联网

标签:Multiple python Testing sms df DescrStatsW treatment test group


目录

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,python,Testing,sms,df,DescrStatsW,treatment,test,group
来源: https://blog.csdn.net/Nancyninghao/article/details/122682164

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有