Multiple Testing 中的 Type I error(python代码实现)
作者:互联网
目录
Confidence Interval与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