被験者間1要因分散分析
被験者間1要因分散分析(岡本安晴「データ分析のための統計学入門」2009、おうふう、pp.99−107)のプログラムを以下のように作ってみた。
=============== 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 |
5 |
7 |
6 |
水準1 |
9 |
8 |
10 |
水準2 |
6 |
3 |
3 |
上のデータの設定でプログラムを実行すると図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をクリックしてダウンロードすることができる。