Pythonで共分散分析(One-Way ANCOVA)をしてみた:Analysis of Covariance
どうも、お久しぶりです。
本日は、簡単に共分散分析(ANCOVA:Analysis of Covariance)をPythonで行いましたので記事にしてみました。
まず、分散分析(ANOVA)は、三つ以上の独立したグループの平均値に統計的に有意な差があるか否かを決定するために使用する検定です。例えば、
FIM移動項目(”自立”, "見守り", "介助")の3群では歩行速度に差があるか?
という解析を行いたいとします。
一般的には、自立が歩行速度が速くて、介助の方が遅いという解釈です。しかし、年齢というFactorがありますよね。歩行自立の方が年齢が若いかもしれません。この年齢が共変量(交絡)となっている可能性がありますよね。
この年齢という共変量を考慮して解析するのが、共分散分析(ANCOVA)です。先ほどの例で言うと、年齢を考慮しても、歩行速度に有意差があるのか?と言うことですね。
ANCOVAにはいくつかの前提条件があります。
・共変量と因子変数(群)は独立している
・分散の均一性
・独立性
・正規性
・極端な外れ値がない
これらの条件をクリアしていればANCOVAへGoです。
まずは、必要なものをインストール
pip install pingouin
import numpy as np
import pandas as pdfrom pingouin import ancova
データは適当です。(FIM、年齢、歩行速度)
df = pd.DataFrame({'fim_idou': np.repeat(['介助', '見守り', '自立'], 7),
'age': [67,88, 75, 77, 85,77,77,
92, 69, 77, 74, 88, 70,66,
96, 91, 88, 82, 80,67,56],
'gait_speeds': [0.8, 0.7, 0.6, 0.9, 0.4,0.3,0.5,
1.2, 1.4, 1.2, 1.9, 1.7,1.5,1.9,
1.0, 2.1, 1.5, 2.5, 2.8,1.9,2.0]})
結果を出力 !!!!
ancova(data=df, dv='gait_speeds', covar='age', between='fim_idou')
このような感じになりました。
FIM移動のp値は0.000016です。
年齢を考慮しても、歩行速度に差があったと言う解釈になります。
(どの群間に差があったかは、事後検定が必要です!)
別のコード
import pandas as pd
df >> group_by(X.group) >> summarize(n=X['bmi'].count(), mean=X['bmi'].mean(), std=X['bmi'].std())
import seaborn as sns
import matplotlib.pyplot as plt
fig, axs = plt.subplots(ncols=2)
sns.scatterplot(data=df, x="grip_strength", y="group", hue=df.group.tolist(), ax=axs[0])
sns.boxplot(data=df, x="knee_strength", y="group", hue=df.group.tolist(), ax=axs[1])
plt.show()
from pingouin import ancova
ancova(data=df, dv='knee_strength', covar='grip_strength', between='group')
握力を共変量にしたの膝伸展筋力の差の検定
前回の記事↓
やさしいR入門 初歩から学ぶR-統計分析ー [ 赤間世紀 ] 価格:2,860円 |