Up

被験者間1要因分散分析

 

被験者間1要因分散分析(岡本安晴「データ分析のための統計学入門」2009、おうふうpp99107)のプログラムを以下のように作ってみた。

 

===============  anovaOneFacInd.py  ====================

from calc_p_for_F import calc_p

 

Y = [[5, 7, 6],

      [9, 8, 10],

      [6, 3, 3]]

 

a = len(Y)

N = len(Y[0])

print("a = %d"%a)

print("N = %d"%N)

 

Yd = []

for j in range(0, a):

    sum = 0.0

    for i in range(0, N):

        sum += Y[j][i]

    Yd.append(sum / N)

 

print(Yd)

 

sum = 0.0

for j in range(0, a):

    sum += Yd[j]

Ydd = sum / a;

print("Tdd = %f"%Ydd)

 

SSA = 0.0

SSS_A = 0.0

for j in range(0, a):

    SSA += N * ((Yd[j] - Ydd) ** 2.0)

    for i in range(0, N):

        SSS_A += (Y[j][i] - Yd[j]) ** 2.0

 

SST = SSA + SSS_A

dfA = a - 1

dfS_A = a * (N - 1)

MSA = SSA / dfA

MSS_A = SSS_A / dfS_A

F = MSA / MSS_A

p = calc_p( F, dfA, dfS_A )

print()

print("%10s"%"Source", end = " ")

print("%12s"%"SS", end = " ")

print("%5s"%"df", end = " ")

print("%12s"%"MS", end = " ")

print("%12s"%"F")

print("%10s"%"A", "%12.3f"%SSA, "%5d"%dfA, "%12.3f"%MSA, "%12.3f"%F,

      "   p = %-10.5f"%(1.0 - p))

print("%10s"%"S/A", "%12.3f"%SSS_A, "%5d"%dfS_A, "%12.3f"%MSS_A)

print("%10s"%"Total", "%12.3f"%SST, "%5d"%(a * N - 1))

==========================================

 

上のプログラムでは、データをリストYに設定するとき、j番目の要素であるリストの番目の要素に第j水準(条件)の被験者のデータを設定している。例えば、リスト

Y = [[5, 7, 6],

      [9, 8, 10],

      [6, 3, 3]]

Y[0]=[5, 7, 6]

は、水準(条件)0の3人のデータを表し、

Y[2]=[6, 3, 3]

は、水準(条件)2の3人のデータを表している。すなわち、設定されているデータは表1のものである。

 

表1 被験者間1要因分散分析データ例

条件

データ

水準0

水準1

10

水準2

 

上のデータの設定でプログラムを実行すると図1のように分散分析表が出力される。

図1

 

上のプログラムにおいて計算部分を次のようにクラス型CANOVA_Indとしてまとめた。

 

==============  CanovaOneFacInd.py  ===================

from calc_p_for_F import calc_p

 

class CANOVA_Ind:

    def __init__(self, Y):

        self.Y = Y

 

    def calc(self):

        a = len(self.Y)

        N = len(self.Y[0])

        print("a = %d"%a)

        print("N = %d"%N)

        Yd = []

        for j in range(0, a):

            sum = 0.0

            for i in range(0, N):

                sum += self.Y[j][i]

            Yd.append(sum / N)

 

        sum = 0.0

        for j in range(0, a):

            sum += Yd[j]

        Ydd = sum / a;

 

        SSA = 0.0

        SSS_A = 0.0

        for j in range(0, a):

            SSA += N * ((Yd[j] - Ydd) ** 2.0)

            for i in range(0, N):

                SSS_A += (self.Y[j][i] - Yd[j]) ** 2.0

 

        SST = SSA + SSS_A

        dfA = a - 1

        dfS_A = a * (N - 1)

        MSA = SSA / dfA

        MSS_A = SSS_A / dfS_A

        F = MSA / MSS_A

        p = calc_p( F, dfA, dfS_A )

 

        return a, N, SSA, SSS_A, SST, dfA, dfS_A, MSA, MSS_A, F, p

============================================

 

上のプログラムをクラス型CANOVA_Indを用いて書き直すと以下のようになる。

 

========================================

#from calc_p_for_F import calc_p

from CanovaOneFacInd import CANOVA_Ind

 

Y = [[5, 7, 6],

      [9, 8, 10],

      [6, 3, 3]]

 

anova = CANOVA_Ind(Y)

a, N, SSA, SSS_A, SST, dfA, dfS_A, MSA, MSS_A, F, p = anova.calc()

 

print()

print("%10s"%"Source", end = " ")

print("%12s"%"SS", end = " ")

print("%5s"%"df", end = " ")

print("%12s"%"MS", end = " ")

print("%12s"%"F")

print("%10s"%"A", "%12.3f"%SSA, "%5d"%dfA, "%12.3f"%MSA, "%12.3f"%F,

      "   p = %-10.5f"%(1.0 - p))

print("%10s"%"S/A", "%12.3f"%SSS_A, "%5d"%dfS_A, "%12.3f"%MSS_A)

print("%10s"%"Total", "%12.3f"%SST, "%5d"%(a * N - 1))

===========================================

 

クラス型CANOVA_indのオブジェクトanovaをデータの設定されているリストYを実引数として作成して、メソッドanova.calc()を呼び出している。実行結果は、上のプログラムと同じく図1のようになる。

 

プログラムは圧縮ファイルanovaOneFacIndPrg.zipにまとめた。ファイル名anovaOneFacIndPrg.zipをクリックしてダウンロードすることができる。

 

 

Up