被験者内1要因分散分析
被験者内1要因分散分析(岡本安晴「データ分析のための統計学入門」2009、おうふう、pp.107−115)のプログラムを以下のように作成した。
=============== anovaOneFacRepPrg.py =======================
from calc_p_for_F
import calc_p
Y = [[1, 3, 2],
[5, 9, 7],
[6, 12, 9]]
N = len(Y)
a = len(Y[0])
print("a =
%d N =
%d"%(a, N))
Yid = []
for i in range(0, N):
sum = 0.0
for j in range(0, a):
sum
+= Y[i][j]
Yid.append(sum / a)
Ydj = []
for j in range(0, a):
sum = 0.0
for i in range(0, N):
sum
+= Y[i][j]
Ydj.append(sum / N)
sum = 0.0
for j in range(0, a):
sum += Ydj[j]
Ydd = sum / a
SS_A = 0.0
SS_S = 0.0
SS_SA = 0.0
for i in range(0, N):
for j in range(0, a):
SS_A
+= (Ydj[j] - Ydd) ** 2.0
SS_S
+= (Yid[i] - Ydd) ** 2.0
SS_SA += (Y[i][j] - Yid[i] - Ydj[j] + Ydd) ** 2.0
SS_T = SS_A + SS_S +
SS_SA
df_A = a - 1
df_S = N - 1
df_SA = (a - 1) * (N -
1)
MS_A = SS_A / df_A
MS_S = SS_S / df_S
MS_SA = SS_SA / df_SA
F = MS_A / MS_SA
p = calc_p(F, df_A,
df_SA)
print()
print("%10s"%"Source",
"%12s"%"SS", "%5s"%"df",
"%12s"%"MS", "%12s"%"F")
print("%10s"%"S",
"%12.3f"%SS_S, "%5d"%df_S, "%12.3f"%MS_S)
print("%10s"%"A",
"%12.3f"%SS_A, "%5d"%df_A, "%12.3f"%MS_A,
"%12.3f"%F,
" p = %-10.5f"%(1.0 - p))
print("%10s"%"SA",
"%12.3f"%SS_SA, "%5d"%df_SA, "%12.3f"%MS_SA)
====================================================
データはリストYに設定されている。被験者iの水準(条件)jのデータは、リストYのi番目のリストのj番目の要素として設定されている。
Y[0]
は被験者0のデータであり、
Y[0][0]
は、被験者0の水準(条件)0でのデータである。
Y[1]
は被験者1のデータであり、
Y[1][2]
は、被験者1の水準(条件)2でのデータである。すなわち、設定されているデータは表1のものである。
表1 被験者内1要因分散分析データ例 |
|||
|
条件 |
||
被験者 |
水準0 |
水準1 |
水準2 |
被験者0 |
1 |
3 |
2 |
被験者1 |
5 |
9 |
7 |
被験者2 |
6 |
12 |
9 |
上のデータの設定の下でプログラムを実行すると、図1の分散分析表が出力される。
図1
上のプログラムの計算部分をクラス型CANOVA_Repとして以下のようにまとめた。
================ CanovaOneFacRep.py =======================
from calc_p_for_F
import calc_p
class CANOVA_Rep:
def __init__(self, Y):
self.Y = Y
def calc(self):
N =
len(self.Y)
a =
len(self.Y[0])
print("a = %d N = %d"%(a, N))
Yid = []
for
i in range(0, N):
sum = 0.0
for j in range(0, a):
sum += self.Y[i][j]
Yid.append(sum / a)
Ydj
= []
for
j in range(0, a):
sum = 0.0
for i in range(0, N):
sum += self.Y[i][j]
Ydj.append(sum / N)
sum
= 0.0
for
j in range(0, a):
sum += Ydj[j]
Ydd
= sum / a
SS_A
= 0.0
SS_S
= 0.0
SS_SA = 0.0
for
i in range(0, N):
for j in range(0, a):
SS_A += (Ydj[j] - Ydd) ** 2.0
SS_S += (Yid[i] - Ydd) ** 2.0
SS_SA += (self.Y[i][j] - Yid[i] - Ydj[j] + Ydd) ** 2.0
SS_T
= SS_A + SS_S + SS_SA
df_A
= a - 1
df_S
= N - 1
df_SA = (a - 1) * (N - 1)
MS_A
= SS_A / df_A
MS_S
= SS_S / df_S
MS_SA = SS_SA / df_SA
F =
MS_A / MS_SA
p =
calc_p(F, df_A, df_SA)
return SS_S, SS_A, SS_SA,
df_S, df_A, df_SA, MS_S, MS_A, MS_SA, F, p
================================================
クラス型CANOVA_Repを用いて上のプログラムを以下のように書き変えた。
================ anovaOneFacRepPrgCls.py =================
#from calc_p_for_F
import calc_p
from CanovaOneFacRep
import CANOVA_Rep
Y = [[1, 3, 2],
[5, 9, 7],
[6, 12, 9]]
anova = CANOVA_Rep(Y)
SS_S, SS_A, SS_SA,
df_S, df_A, df_SA, MS_S, MS_A, MS_SA, F, p = anova.calc()
print()
print("%10s"%"Source",
"%12s"%"SS", "%5s"%"df",
"%12s"%"MS", "%12s"%"F")
print("%10s"%"S",
"%12.3f"%SS_S, "%5d"%df_S, "%12.3f"%MS_S)
print("%10s"%"A",
"%12.3f"%SS_A, "%5d"%df_A, "%12.3f"%MS_A,
"%12.3f"%F,
" p = %-10.5f"%(1.0 - p))
print("%10s"%"SA",
"%12.3f"%SS_SA, "%5d"%df_SA, "%12.3f"%MS_SA)
================================================
クラス型CANOVA_Repのオブジェクトanovaを、データの設定されているリストYを実引数として作成して、メソッドanova.calc()を呼び出している。実行結果は、上のプログラムと同じく図1のようになる。
プログラムは圧縮ファイルanovaOneFacRepPrg.zipとしてまとめた。ファイル名anovaOneFacRepPrg.zipをクリックしてダウンロードすることができる。