如何在数据帧上执行双向方差分析后的 Sidak 测试(多计算)?

Posted

技术标签:

【中文标题】如何在数据帧上执行双向方差分析后的 Sidak 测试(多计算)?【英文标题】:How to perform Sidak's test (multi comp) following two-way anova on a dataframe? 【发布时间】:2022-01-13 03:26:16 【问题描述】:

我有一个包含以下列的数据框:整整 24 小时的时间、药物和流动性。

数据帧的快照

Time Drug Mobility
18   A    1.2 
19   A    1.3
20   A    1.3
21   A    1.2
18   B    3.2
19   B    3.2
20   B    3.3
21   B    3.3

然后我使用以下代码执行双向 anova 以比较药物在每个时间点对流动性的影响:

mod = ols('Mobility~Time+Drug+Time*Drug', data = fdf).fit()
aov = anova_lm(mod, type=2) 

然后我想做一个多重比较测试(事后),特别是 sidak,但不知道该怎么做。努力在网上寻找任何可以学习的资源。

我知道我可以使用 tukey 的测试,但它会比较所有内容,而且我也只对相同时间点的药物效果感兴趣:

18+A - 18+B
19+A - 19+B
20+A - 20+B

不是:

18+A - 19+B
18+A - 20+B
20+A - 18+A

任何帮助都会有很大帮助

【问题讨论】:

【参考方案1】:

如果您只对组内比较感兴趣,那么您的系数中已经包含它们。

使用示例数据集:

import statsmodels.formula.api as sm
import pandas as pd
import numpy as np
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multitest import multipletests

fdf = pd.DataFrame('Time':np.random.choice([18,19,20],50),
'Drug':np.random.choice(['A','B'],50), 
'Mobility':np.random.uniform(0,1,50))

fdf['Time'] = pd.Categorical(fdf['Time'])

mod = sm.ols('Mobility~Time+Drug+Time:Drug', data = fdf).fit()
aov = anova_lm(mod, type=2)

结果如下所示:

mod.summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:               Mobility   R-squared:                       0.083
Model:                            OLS   Adj. R-squared:                 -0.021
Method:                 Least Squares   F-statistic:                    0.7994
Date:                Wed, 08 Dec 2021   Prob (F-statistic):              0.556
Time:                        07:13:14   Log-Likelihood:                -4.4485
No. Observations:                  50   AIC:                             20.90
Df Residuals:                      44   BIC:                             32.37
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
========================================================================================
                           coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------
Intercept                0.4063      0.094      4.323      0.000       0.217       0.596
Time[T.19]               0.1622      0.149      1.091      0.281      -0.137       0.462
Time[T.20]              -0.0854      0.133     -0.643      0.524      -0.353       0.182
Drug[T.B]                0.0046      0.149      0.031      0.975      -0.295       0.304
Time[T.19]:Drug[T.B]    -0.1479      0.206     -0.717      0.477      -0.564       0.268
Time[T.20]:Drug[T.B]     0.2049      0.199      1.028      0.310      -0.197       0.607

在这种情况下,Time=18 是参考,所以Drug[T.B] 将是 B 对 A 的影响,在 Time=18,这是 18+B - 18+A 的结果,Time[T.19]:Drug[T.B] 将是 19+B - 19+ATime[T.20]:Drug[T.B] 将是 20+B - 20+A

对于多重比较调整,您可以简单地提取这些结果并计算校正后的 pvalues:

res = pd.concat([mod.params,mod.pvalues],axis=1)
res.columns=['coefficient','pvalues']
res = res[res.index.str.contains('Drug')]
res['corrected_p'] = multipletests(res['pvalues'],method="sidak")[1]
res['comparison'] = ['18+B - 18+A','19+B - 19+A','20+B - 20+A']

                      coefficient   pvalues  corrected_p   comparison
Drug[T.B]                0.004630  0.975284     0.999985  18+B - 18+A
Time[T.19]:Drug[T.B]    -0.147928  0.477114     0.857038  19+B - 19+A
Time[T.20]:Drug[T.B]     0.204925  0.309616     0.670942  20+B - 20+A

另见help page for multipletests

【讨论】:

非常感谢,这很有意义,并且能够将其应用于我的实际数据框。只是为了更好地理解它,T. 是什么意思?例如在 Drug[T.B]? 是的,这意味着药物 B 为真,就像 T.19 一样,T.20 意味着时间 == 19,时间==20 的真 感谢您的澄清

以上是关于如何在数据帧上执行双向方差分析后的 Sidak 测试(多计算)?的主要内容,如果未能解决你的问题,请参考以下文章

SPSS数据分析—协方差分析

如何使用 spark-scala 在 spark 数据帧上执行枢轴?

如何在包含 numpy.ndarrays 的列/列的 pandas 数据帧上执行 StandardScaler?

如何在 python 中执行 n 方式方差分析?

2021-06-19 R语言执行单因素方差分析(单因素ANOVA)及多重比较

PCA 分析后的特征/变量重要性