生物医学統計を学ぶ!
事例と実践
対応のない2群の検定
検定の目的
対応のない2群の差を比較します。
データの構造
データは、1つの群につき、1変数です。
例えば、{Aさん、Bさん、Cさんの身長}と、{Dさん、Eさん、Fさんの身長}のデータなどです。
フローチャート
実践
プラセボ群(第1群)と薬剤群(第2群)の比較可能性を評価するために、背景因子の1つである体重データについて平均値の差の検定を行います。
``` # サンプルデータファイルをランタイムにアップロードします。 # curl -L -o "file name" "data location" # data locationは、利用するデータがGoogleDriveの共有リンクになって配付されているので、次のようにします。 # https://drive.google.com/uc?export=download&id=ファイルID !curl -L -o "Weight.csv" "https://drive.google.com/uc?export=download&id=1GYhAsaMFenogZXU_FfuF42uwxYY_cgT6" # データを読み込みます import pandas as pd data = pd.read_csv(filepath_or_buffer="Weight.csv", header=None, names=["No","Weight","Group"],encoding="utf-8") data.describe() # 標準化 weight = (data["Weight"] - data["Weight"].values.mean())/np.std(data["Weight"]) data = pd.DataFrame(np.stack([weight,data["Group"].values],axis=1),columns=["Weight","Group"]) ''' 変数の中に、Groupというカテゴリ変数が含まれています。 これは、解析用の数値ではなく、体重のデータが1群と2群のどちらに属するかを示すlabelです。 このラベルを使って、データを整えます。 ''' # 1群のデータ placebo = data[data["Group"] == 1] print("placebo group") print(placebo.head()) # 2群のデータ control = data[data["Group"] == 2] print("control group") print(control.head()) # フローチャートに従い検定を行います。 # 有意水準を0.05、帰無仮説を「2群間に差がないこと」とします。 # データは対応のないデータですので、各群の値の個数は一致していなくても大丈夫です。 # データの尺度は間隔尺度です。 # 標本(1変数のみもつ)ごとに正規性の検定(シャピロウィルク検定)を行います。 # stats.shapiro(datalist)は、シャピロウィルク検定統計量(正規分布に従わない場合は小さくなる)と正規分布に従う確率(p値)を算出できます。 from scipy import stats stat_p,p_p = stats.shapiro(placebo["Weight"]) print(stat_p,p_p) stat_c,p_c = stats.shapiro(control["Weight"]) print(stat_c,p_c) # 今回は信頼区間を5%にしているので、p_b、p_cが0.05より大きければ、正規分布に従うと判断します。 # 上の結果から、正規分布と判断できたので、フローチャートに従い標本間が等分散かどうかを調べます。 # 等分散であるか否かの検定にはルビーン検定(Levene test)を使います。 # 帰無仮説は、「1群と2群は等分散である」です。 # p >= 0.05で、帰無仮説を採択することにします。 # center引数で代表値を指定できます。 # meanは平均値による等分散性の分析で、一般にいうレビーン検定です。 # デフォルトはmedian(中央値)になっていますが、中央値を利用する場合、厳密にはBrown-Forsythe検定と呼ばれます。 # 関数にはscipy.stats.levene関数が利用できます。 stat_l,p_l = stats.levene(placebo["Weight"],control["Weight"], center="mean") print(stat_l,p_l) # 今回は信頼区間を5%とし、p_lが0.05より大きければ、等分散であると判断します。 # 上の結果から、正規分布かつ等分散と判断できたので、フローチャートに従い2標本t検定(studentのt検定)を適用します # 対応のあるt検定にはstats.ttest_ind関数を使います。 # equal_var引数には、等分散性の検定の結果を反映します。このデータは等分散であったので、Trueとしています。 stat, p = stats.ttest_ind(placebo["Weight"],control["Weight"],equal_var = True) print("p-value ttest2",p) # p値が0.05より大きければ、帰無仮説が採択されます # 仮の手順になりますが、もし、等分散が認められない場合は、ウェルチの検定を用います。 # 仮説や信頼区間の定義は同じです。 # 利用例のみ示します。 # 対応のないt検定(ウェルチの検定)には、上と同じstats.ttest_ind関数を使います。 # 等分散ではなかった場合は、 equal_var引数をFalseとします。コードの違いはこれだけです。 stat, p = stats.ttest_ind(placebo["Weight"],control["Weight"],equal_var = False) print("p-value ttest2-welch",p) # p値が0.05より大きければ、帰無仮説が採択されます # もし、正規分布が認められないときは、マン・ホイットニーの検定を行います。 # 2群間の平均値が独立であり(データに対応がない)、正規分布が仮定できない(ノンパラメトリック)場合に用います # 順序尺度に対応 # 独立2群間の代表値の差の検定ができます # 対応のないデータですから、各群のサンプル数は一致しなくても大丈夫です。 # stats.mannwhitneyu関数を利用します。 # この関数は、use_continuityとalternativeの引数を設定できます。 # continuityは連続補正(離散値から連続値への近似)をするかしないかの指定、alternativeには両側検定(two-sided)か片側検定(少なすぎるかどうか"less"大きすぎるかどうか"greater")かを指定します。 stat, p = stats.mannwhitneyu(placebo["Weight"],control["Weight"],use_continuity=True, alternative = "two-sided") print("p-value ttest2-mann",p) # p値が0.05より大きければ、帰無仮説が採択されます ```
Visionary Imaging Services, Inc.
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿