基本概念
方差分析(Analysis of variance, ANOVA) :——又稱“變異數分析”
①用於兩個及兩個以上樣本均數差別的顯著性檢驗
②主要研究分類變量作爲自變量時,對因變量的影響是否是顯著
(1)組間因子 & 組內因子
組間因子:同一結果在同一變量的不同維度上單次試驗
組內因子:同一結果在同一變量的不同維度上反覆試驗
(2)自變量 & 因變量
自變量:可以自由改變的量;因變量:隨着自變量的改變而改變的量
簡單點說,自變量是“原因”,而因變量就是“結果”
(3)均衡設計(balanced design) & 非均衡設計(unbalanced design)
研究組間變量時,設計的試驗在每個組間因子下的觀測數是否相等,相等就叫均衡設計(試驗),否則,就叫非均衡設計(試驗)
(4)主效應 & 交互效應
(5)單因素方差分析(one-way ANOVA)——單因素組間方差分析
(6)單因素組內方差分析——重複測量方差分析
(7)因素方差分析設計【雙因素方差分析、三因素方差分析等】
(8)混合模型方差分析
(9)混淆因素(confounding factor)也被稱作干擾變數(nuisance variable)
以焦慮症治療爲例,
現有兩種治療方案:認知行爲療法(CBT)和眼動脫敏再加工法(EMDR)。
招募10位焦慮症患者作爲志願者,
隨機分配一半的人接受爲期五週的CBT,另外一半接受爲期五週的EMDR,
設計方案如表1-1所示。在治療結束時,要求每位患者都填寫狀態特質焦慮問卷(STAI),也就是一份焦慮度測量的自我評測報告
表1-1 單因素組間方差分析
CBT | EMDR |
---|---|
s1 | s6 |
s2 | s7 |
s3 | s8 |
s4 | s9 |
s5 | s10 |
治療方案CBT和治療方案EMDR是組間因子,因爲每位患者都僅被分配到一個組別中,沒有患者同時接受CBT和EMDR。表中字母s代表受試者(患者)。STAI是因變量,治療方案是自變量(CBT、EMDR是治療方案的不同維度)。由於在每種治療方案下觀測數相等,因此這種設計也稱爲均衡設計(balanced design);若觀測數不同,則稱作非均衡設計(unbalanced design)。
因爲僅有一個類別型變量,表1的統計設計又稱爲單因素方差分析(one-way ANOVA),或進一步稱爲單因素組間方差分析。
方差分析主要通過F檢驗來進行效果評測,若治療方案的F檢驗顯著,則說明五週後兩種療法的STAI得分均值不同
方差分析基本步驟
研究分類型自變量對數值型因變量的影響
實際就是多個樣本的均值比較
注意:數據必須是兩列數值數據(分類型數值、度量值)
步驟:
F檢驗 原假設:三個品牌壽命方差沒有顯著差異
備擇假設:三個品牌壽命方差有顯著差異
注意:F檢驗結果中顯著性>0.05纔算方差齊
ANOVA檢驗結果
原假設:三個品牌電池壽命的均值相等(三個品牌電池壽命方差沒有顯著差異)
備擇假設:三個品牌電池壽命的均值不全相等(三個品牌電池壽命方差有顯著差異)
事後檢驗-----方差齊 LSD; 方差不齊 T2
事後多重比較是兩兩對比均值
4、 P<0.05,接受備擇假設,兩總體均值有顯著性差異
P>0.05,接受原假設,兩總體均值不存在顯著性差異
案例—python實現
from scipy.stats import f_oneway
a = [87,86,76,56,78,98,77,66,75,67] #羣體1成績
b = [87,85,99,85,79,81,82,78,85,91] #羣體2成績
c = [89,91,96,87,89,90,89,96,96,93] #羣體3成績
#計算F值
f,p = f_oneway(a,b,c)
print(f,p)
from scipy import stats
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
treatment = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] #處理 變量
gender = [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2] #性別
loss = [76,78,76,76,76,74,74,76,76,55,65,90,65,90,65,90,90,79,70,90, 88,76,76,76,56,76,76,98,88,78,65,67,67,87,78,56,54,56,54,56] #體重減少
data = {'T':treatment, 'G':gender, 'L':loss}
df = pd.DataFrame(data)
formula = 'L~T+G+T:G' #~ 隔離因變量和自變量 (左邊因變量,右邊自變量 )
#+ 分隔各個自變量, :表示兩個自變量交互影響
model = ols(formula,df).fit() # 根據公式數據建模,擬合
results = anova_lm(model) # 計算F和P
print(results)
import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
data = pd.DataFrame([[1, 1, 32],
[1, 2, 35],
[1, 3, 35.5],
[1, 4, 38.5],
[2, 1, 33.5],
[2, 2, 36.5],
[2, 3, 38],
[2, 4, 39.5],
[3, 1, 36],
[3, 2, 37.5],
[3, 3, 39.5],
[3, 4, 43]],
columns=['A', 'B', 'value'])
# 因素A的水平對結果的影響 'value ~ C(A)'
# 因素A和因素B的水平對結果的影響 'value ~ C(A) + C(B)'
# 因素A和因素B以及A和B的交互作用的水平對結果的影響 'value ~ C(A) + C(B) + C(A)*C(B)'
# 多因素無重複試驗,不計算交互作用的影響
model = ols('value~C(A) + C(B)', data=data[['A', 'B', 'value']]).fit()
anovat = anova_lm(model)
print (model.summary())
print (anovat)
# #data爲之前生成的DataFrame中選出的進行分析所需要的列,實際上ols是通過DataFrame的列名來獲得試驗結果和因素水平的數據的。最後用ols函數進行最小二乘線性擬合,用anova_lm函數進行方差分析並輸出結果。
# # 如果是直接導入excel,通過pandas讀取excel後,得到df,那麼就不需要在ols()函數中data選擇列,直接加入df
# model = ols('value~C(group) + C(time)',df).fit()
# anovat = anova_lm(model)
# print (model.summary())
# print (anovat)
# #進行單因素多方差分析,將formula中的C(B)去掉即可。
# #如果是對於有重複的多因素方差分析,將formula中加上C(A)*C(B)
總結
方差分析的思想就是通過方差比較各族羣之間有沒有差異,
其中就是計算組內均方和和組間均方和,然後代入統計量做顯著性檢驗
方差分析可以算是個線性模型,在統計學上面的檢驗原理和線性迴歸是差不多的
主要功能:
驗證兩組樣本,或者兩組以上的樣本均值是否有顯著性差異,即均值是否一樣
注意:
①方差分析的原假設是:樣本不存在顯著性差異(即,均值完全相等);
②兩樣本數據無交互作用(即,樣本數據獨立)這一點在雙因素方差分析中判斷兩因素是否獨立時用。
原理:
SST=SS組間+SSR組內 (全部平方和=組間平方和+組內平方和)
說明:
方差分析本質上對總變異的解釋。
組間平方和=每一組的均值減去樣本均值
組內平方和=個體減去每組平方和
方差分析看的最終結果看的統計量是:F統計量、R2
參考資料:
datawhale組隊學習——《率統計(四)-方差分析》
Task3:常見分佈與假設檢驗
python中anova方差分析