---------------------------------------------
t检验
---------------------------------------------
单样本t检验(One Sample t-test)
单样本t检验,需要满足四个条件:
条件1:观察变量为连续变量。
条件2:观察变量相互独立。
条件3:观察变量不存在显著的异常值。
条件4:观察变量为(近似)正态分布。
独立样本t检验(Independent Samples t-test)
独立样本t检验,需要满足六个条件:
条件1:观察变量为连续变量。
条件2:观察变量相互独立。
条件3:观察变量分为2组。
条件4:观察变量不存在显著的异常值。
条件5:各组观察变量为正态(或近似正态)分布。
条件6:两组观察变量的方差相等。
当两样本均来自正态总体,但样本含量较小,如n1≤60或/和n2≤60时,要根据两总体方差是否相等而采用不同检验方法。
(一) 总体方差相等的t检验
(二) 总体方差不等的近似t检验
近似t检验有以下三种方法可供选择:Cochran & Cox法、Satterthwaite法和Welch法。
配对样本t检验(Paired Samples t-test)
配对样本t检验需要满足五个条件:
条件1:观察变量为连续变量。
条件2:观察变量为配对设计。
条件3:观察变量可分为2组。
条件4:观察变量不存在显著的异常值。
条件5:两个配对组别间观察变量的差值服从正态(或近似正态)分布。
---------------------------------------------
秩和检验
---------------------------------------------
单样本Wilcoxon符号秩检验
独立样本Wilcoxon秩和检验
配对样本Wilcoxon符号秩检验
---------------------------------------------
方差分析
---------------------------------------------
单因素方差分析(One-way ANOVA)
单因素方差分析,需要满足6个条件:
条件1:观察变量为连续变量。
条件2:观测值相互独立。
条件3:观测值可分为多组(≥2)。
条件4:观察变量不存在显著的异常值。
条件5:各组观测值为正态(或近似正态)分布。
条件6:多组观测值的整体方差相等。
"""
df2.loc[df['group']==1,'group']='A'
df2.loc[df['group']==2,'group']='B'
df2.loc[df['group']==3,'group']='C'
--------------------------------------------------------
1. 条件4判断(异常值判断)
plt.boxplot([df2.loc[df2.loc[:,'group']=='A','血红蛋白'],
df2.loc[df2.loc[:,'group']=='B','血红蛋白'],
df2.loc[df2.loc[:,'group']=='C','血红蛋白']], labels=["A","B","C"])
2. 条件5判断(正态性检验)
## 分组绘制Q-Q图##
import statsmodels.api as sm
sm.qqplot(df2.loc[df2.loc[:,'group']=='A','血红蛋白'], line='s')
sm.qqplot(df2.loc[df2.loc[:,'group']=='B','血红蛋白'], line='s')
sm.qqplot(df2.loc[df2.loc[:,'group']=='C','血红蛋白'], line='s')
##正态性检验##
from scipy import stats
shapiro_test1 = stats.shapiro(df2.loc[df2.loc[:,'group']=='A','血红蛋白'])
shapiro_test2 = stats.shapiro(df2.loc[df2.loc[:,'group']=='B','血红蛋白'])
shapiro_test3 = stats.shapiro(df2.loc[df2.loc[:,'group']=='C','血红蛋白'])
3. 条件6判断(方差齐性检验)
##levene法方差齐性检验##
group0 = df2.loc[df2.loc[:,'group']=='A']['血红蛋白'] #选取第一组数据
group1 = df2.loc[df2.loc[:,'group']=='B']['血红蛋白'] #选取第二组数据
group2 = df2.loc[df2.loc[:,'group']=='C']['血红蛋白'] #选取第二组数据
leveneTestRes = stats.levene(group0, group1, group2, center='mean') #levene法齐性检验
print(leveneTestRes) #显示检验结果
3组的标准差存在差异,但是否有统计学意义还需进一步判断。
Levene检验结果(图9)显示,F=2.6102,P=0.08019<0.1,提示3组数据的方差不齐,不满足条件6。
--------------------------------------------------------
##单因素方差分析
from scipy import stats
stats.f_oneway(df2.loc[df2.loc[:,'group']=='A']['血红蛋白'],df2.loc[df2.loc[:,'group']=='B']['血红蛋白'],df2.loc[df2.loc[:,'group']=='C']['血红蛋白'])
##校正单因素方差分析(Welch’s)
import pingouin as pg
pg.welch_anova(dv='血红蛋白', between='group', data=df2)
--------------------------------------------------------
事后检验(两两比较)
#注:当不满足方差齐性时采用“Games-Howell”法进行事后检验
pg.pairwise_gameshowell(dv='血红蛋白', between='group', data=df2)
"""
"""
多重比较一般分为事前检验(Prior tests)和事后检验(Post hoc tests)。
事前检验是指在数据收集之前便决定了要通过多重比较来考察多个组与某个特定组之间的差别,多根据专业意义设定比较的策略。
如果是事前检验,不论整体分析的结果如何,均可进行比较,并且一般不需要对检验水准进行太多修正。
事后检验只有在方差分析得到有统计学意义的结果后才进行,是一种探索性分析。
对于事先未计划的多重比较(即事后检验),各组间的差异只是一种提示,要确认这种差异最好重新设计实验。
事前检验(Prior tests)最常用的两两比较方法有LSD法和Dunnett-t检验。
事后检验(Post hoc tests)最常用的方法有SNK法、Duncan法、Turkey’b和Scheffe法。
LSD法是最灵敏的方法,因此也容易犯假阳性错误。Dunnett-t法多用于多个实验组与一个对照组比较,此时应指定对照组,多用于确证性研究,少用于探索性研究。Bonferroni法是对LSD法的严格校正,结果更加保守,但当组数较多时,较难发现组间差异,因此如果各组例数相差不大且组数不多时可采用。当不满足方差齐性时常采用“Games-Howell”法进行事后检验。
"""
协方差分析(Analysis of Covariance,ANCOVA)
将线性回归分析与方差分析结合起来的一种统计分析方法,用于比较两组或多组均数之间的差异时,控制对因变量有影响的混杂因素(即协变量covariate)的一种方法。协变量可以有一个、两个或多个,分析方法略有不同,但其解决问题的基本思想相同。
协方差分析,需要满足9个条件:
条件1:观察变量为连续变量。
条件2:观测值相互独立。
条件3:观察变量不存在显著的异常值。
条件4:自变量存在2个或多个分组。
条件5:协变量是连续变量。
条件6:各组内因变量的残差服从正态(或近似正态)分布。
条件7:组间因变量的残差方差齐。
条件8:各组内协变量和观察变量之间存在线性关系。
按组分别绘制散点图和计算相关系数
条件9:各组内协变量和因变量的回归直线平行,即通过平行性检验。
平行性检验通过判断group与Food的交互项是否有统计学意义决定。
两因素方差分析一(无交互作用)
两因素方差分析,需要满足6个条件:
条件1:观察变量唯一,且为连续变量。
条件2:有两个分组变量,且都为分类变量。
条件3:观测值相互独立。
条件4:观察变量不存在显著的异常值。
条件5:各组、各水平观察变量为正态(或近似正态)分布。
条件6:相互比较的各处理水平(组别)的总体方差相等,即通过方差齐性检验。
单独效应是指其他因素的水平固定时,同一因素不同水平间的差别。
主效应是指某一因素各水平间的平均差别。
交互作用是指当因素的各个单独效应随另一因素变化而变化。
"""
(二) 适用条件判断
条件4~条件6需要通过模型残差进行判断,因此先生成模型残差。
1. 生成模型残差
##计算模型,得预测值(图2)##
import statsmodels.formula.api as smf #加载statsmodels.formula.api库
X = df[['Drug_A', 'Drug_B']]
y = df['Time']
ana = smf.ols('Time ~ C(Drug_A) * C(Drug_B)', data=df).fit() #计算模型
df.loc[:,'res'] = y - ana.predict(X)
2. 条件4判断(异常值判断)
## 绘制箱线图 ##
sns.boxplot(x = 'Drug_A', y = 'res', data = df,hue='Drug_B') #绘制箱线图
3. 条件5判断(正态性检验)
## 正态性检验 ##
from scipy.stats import shapiro
shapiro(df.res)
4. 条件6判断(方差齐性检验)
## 方差齐性检验 ##
import pingouin as pg
df.loc[:,'group'] = df.apply(lambda x: "%d_%d"%(x["Drug_A"],x["Drug_B"]),axis = 1)
print(pg.homoscedasticity(df, dv='res', group='group',method='levene',center = 'mean'))
--------------------------------------------------------
(三) 统计描述
df.groupby(["Drug_A","Drug_B"]).mean()
df.groupby(["Drug_A","Drug_B"]).std()
(四) 两因素方差分析
## 绘制边际均数图 ##
import seaborn
seaborn.lmplot(y='Time', x = 'Drug_A', hue = 'Drug_B',data=df)
边际均数图显示了各组镇痛时间的变化情况,可见两药物的变化曲线基本平行,不存在明显的交互作用。
(五) 交互作用判断
本案例有两个因素(一个为A药,另一个为B药),因此需要首先判断两个因素(药物)之间是否存在交互作用。 如果交互作用有统计学意义,则需要分析单独效应。此时,单纯研究某个因素的作用并无意义,应分别探讨另一个因素不同水平时对该因素的作用。
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
formula = 'Time~ C(Drug_A)+C(Drug_B)+C(Drug_A) * C(Drug_B) '
anova_results = anova_lm(ols(formula,df).fit())
print(anova_results)
#提示Drug_A与Drug_B之间的交互作用无统计学意义。
#因此,本案例可直接以主效应分析结果进行判断,如果交互作用有统计学意义,则需要分析单独效应。
(六) A药主效应分析
根据(五),A药的主效应检验结果显示,FDrug_A=88.162,P<0.001,认为不同药物浓度时,镇痛时间差异有统计学意义。
(七) B药主效应分析
根据(五),B药的主效应检验结果显示,FDrug_B=95.269,P<0.001,认为不同药物浓度时,镇痛时间差异有统计学意义。
(八) 事后检验(两两比较)
A、B药物在不同药物浓度时,镇痛时间差异均有统计学意义的结论,因此需要进行事后检验,开展两两比较。
from statsmodels.stats.multicomp import pairwise_tukeyhsd
print(pairwise_tukeyhsd(df ['Time']