Python 数学建模——方差分析
文章目录
- 前言
- 单因素方差分析
- 原理
- 核心代码
- 双因素方差分析
- 数学模型
- 分析依据
- 典型代码
前言
方差分析也是概率论中非常重要的内容,有时数学建模需要用到。方差分析是干什么的?如果说假设检验用于分析两个总体之间的均值 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2 是否存在显著的差别,那么方差分析就是分析两个以上总体之间的均值是否存在显著的差别。
单因素方差分析
用途:已知一个量 A A A 可能会影响 X X X, A A A 的不同取值可能会造成 X X X 的分布函数不同。判定 A A A 是不是真的会影响 X X X。(需要默认 X X X 服从正态分布,且 A A A 不影响正态分布的方差,可以在论文的假设中给出;当 A A A 只有两个取值的时候,就退化成了假设检验)
建议只看下面的“用途”概括以及代码部分,原理部分只是简单介绍且生涩难懂。
原理
假设有 r r r 个正态总体 X i ∼ N ( μ i , σ 2 ) ( i = 1 , 2 , ⋯ , r ) {X_i}\sim N({{\mu }_{i}},{{\sigma }^{2}})(i=1,2,\cdots ,r) Xi∼N(μi,σ2)(i=1,2,⋯,r) 相互独立,现在我们给出假设 H 0 : μ 1 = μ 2 = ⋯ = μ r {H_0}:{{\mu }_{1}}={{\mu }_{2}}=\cdots ={{\mu }_{r}} H0:μ1=μ2=⋯=μr。从第 i i i 个正态总体中抽取了 n i n_i ni 个样本,并将其均值记作 X ‾ i \overline{X}_i Xi。 n = ∑ i = 1 r n i n=\sum_{i=1}^{r}{{{n}_{i}}} n=∑i=1rni , X ‾ \overline X X 是所有的 n n n 个样品的均值。
单因素方差分析,正是通过对要分析的因素 A A A 取 A 1 , ⋯ , A r {{A}_{1}},\cdots ,{{A}_{r}} A1,⋯,Ar 这不同的 r r r 个值,对于每个值分别获取一个总体,通过判断各个总体的均值是否有显著差异(即假设 H 0 H_0 H0 是否成立)来判断因素 A A A 是否对总体有显著影响。
我们构造下面三个统计量:
S
T
=
∑
i
=
1
r
∑
j
=
1
n
i
(
X
i
j
−
X
‾
)
2
=
∑
i
=
1
r
∑
j
=
1
n
i
X
i
j
2
−
n
X
‾
2
{{S}_{T}}=\sum_{i=1}^{r}{\sum_{j=1}^{{{n}_{i}}}{(}}{{X}_{ij}}-\overline{X}{{)}^{2}}=\sum_{i=1}^{r}{\sum_{j=1}^{{{n}_{i}}}{{{X}_{ij}^{2}}-}}n{{\overline{X}}^{2}}
ST=i=1∑rj=1∑ni(Xij−X)2=i=1∑rj=1∑niXij2−nX2
S
E
=
∑
i
=
1
r
∑
j
=
1
n
i
(
X
i
j
−
X
‾
i
)
2
=
∑
i
=
1
r
∑
j
=
1
n
i
X
i
j
2
−
∑
i
=
1
r
n
i
X
‾
i
2
{{S}_{E}}=\sum_{i=1}^{r}{\sum_{j=1}^{{{n}_{i}}}{(}}{{X}_{ij}}-\overline{X}_i{{)}^{2}}=\sum_{i=1}^{r}{\sum_{j=1}^{{{n}_{i}}}{{{X}_{ij}^{2}}-}}\sum_{i=1}^{r}{{{n}_{i}}}{{\overline{X}_i}^{2}}
SE=i=1∑rj=1∑ni(Xij−Xi)2=i=1∑rj=1∑niXij2−i=1∑rniXi2
S
A
=
∑
i
=
1
r
n
i
(
X
‾
i
−
X
‾
)
2
=
S
T
−
S
E
{{S}_{A}}=\sum_{i=1}^{r}{{{n}_{i}}}(\overline{X}_i-\overline{X}{{)}^{2}}={{S}_{T}}-{{S}_{E}}
SA=i=1∑rni(Xi−X)2=ST−SE
其中
S
T
S_T
ST 反映了所有样本之间的差异情况,
S
E
S_E
SE 反映了各组内部样本之间的差异情况(即同一组内随机抽样产生的误差),
S
A
S_A
SA 反映了各组之间由于因素水平不同而引起的差异(不同水平下的差异即条件误差)。
当假设
H
0
H_0
H0 成立时,应当有
S
E
,
S
A
S_E,S_A
SE,SA 相互独立,且统计量
F
=
S
A
/
(
r
−
1
)
S
E
/
(
n
−
r
)
∼
F
(
r
−
1
,
n
−
r
)
F=\cfrac{{{S}_{A}}/(r-1)}{{{S}_{E}}/(n-r)}\sim F(r-1,n-r)
F=SE/(n−r)SA/(r−1)∼F(r−1,n−r)。若
F
<
F
α
(
r
−
1
,
n
−
r
)
F<{{F}_{\alpha }}(r-1,n-r)
F<Fα(r−1,n−r)(其中
α
\alpha
α 是显著性水平),则接受原假设,认为总体之间的均值不存在显著差别。
F F F 值位于区间 | [ 0 , F 0.05 ( r − 1 , n − r ) ] [0,{{F}_{0.05}}(r-1,n-r)] [0,F0.05(r−1,n−r)] | ( F 0.05 ( r − 1 , n − r ) , F 0.01 ( r − 1 , n − r ) ] ({{F}_{0.05}}(r-1,n-r),{{F}_{0.01}}(r-1,n-r)] (F0.05(r−1,n−r),F0.01(r−1,n−r)] | ( F 0.01 ( r − 1 , n − r ) , + ∞ ) ({{F}_{0.01}}(r-1,n-r),+\infty ) (F0.01(r−1,n−r),+∞) |
---|---|---|---|
α \alpha α 值位于区间 | [ 0.05 , 1 ] [0.05,1] [0.05,1] | [ 0.01 , 0.05 ) [0.01,0.05) [0.01,0.05) | [ 0 , 0.01 ) [0,0.01) [0,0.01) |
对于均值的说法 | 差别不显著 | 差别显著 | 差别高度显著 |
核心代码
核心代码如下:
import statsmodels.api as sm
# 此处的x,a是长度相同的一维数组。第 i 个数据的值是a[i],属于第x[i]个样本总体。比如:
x = [1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5]
a = [256 242 280 298 254 330 290 295 250 277 230 302 248 280 305 289 236 252
220 252]
d={'x':x,'y':a} #构造求解需要的字典
model = sm.formula.ols("y~C(x)",d).fit() #构建模型
anovat = sm.stats.anova_lm(model) #进行单因素方差分析
print(anovat)
运行的结果示例如下,需要用到C(x)
行PR(>F)
列的内容。这个
0.110913
0.110913
0.110913 是使得
F
<
F
α
(
r
−
1
,
n
−
r
)
F<{{F}_{\alpha }}(r-1,n-r)
F<Fα(r−1,n−r) 成立的最大
α
\alpha
α,也就是
F
F
F 属于区间
[
0
,
F
0.05
(
r
−
1
,
n
−
r
)
]
[0,{{F}_{0.05}}(r-1,n-r)]
[0,F0.05(r−1,n−r)],从而差别不显著。
df sum_sq mean_sq F PR(>F)
C(x) 4.0 6125.7 1531.425 2.261741 0.110913
Residual 15.0 10156.5 677.100 NaN NaN
双因素方差分析
用途:有两个量 A A A, B B B 都会影响到随机变量 X X X 的分布。单方面地,分别验证 A A A 是否影响 X X X、 B B B 是否影响 X X X。综合地,判断 A , B A,B A,B 对 X X X 的影响是否有交互效应。
数学模型
总体
X
X
X 会受到
A
A
A、
B
B
B 两个因素的影响,仿照单因素方差分析的思路,我们令因素
A
A
A 取
s
s
s 个不同水平
A
1
,
⋯
,
A
s
{{A_1}},\cdots ,{{A}_{s}}
A1,⋯,As,令因素
B
B
B 取
r
r
r 个不同水平
B
1
,
⋯
,
B
r
{{B_1}},\cdots ,{{B}_{r}}
B1,⋯,Br。
对于每一组因素组合
(
B
i
,
A
j
)
({{B}_{i}},{{A}_{j}})
(Bi,Aj),都取
t
t
t 个样本,得到一个总体
X
i
j
X_{ij}
Xij。我们认为这个总体服从正态分布,即
X
i
j
∼
N
(
μ
i
j
,
σ
2
)
{{X}_{ij}}\sim N({{\mu }_{ij}},{{\sigma }^{2}})
Xij∼N(μij,σ2)。那么就有
ε
i
j
k
=
X
i
j
k
−
μ
i
j
∼
N
(
0
,
σ
2
)
{{\varepsilon }_{ijk}}={{X}_{ijk}}-{{\mu }_{ij}}\sim N(0,{{\sigma }^{2}})
εijk=Xijk−μij∼N(0,σ2)。
现在获取下面几个统计量:
- 所有总体的均值 μ = 1 r s ∑ i = 1 r ∑ j = 1 s μ i j \displaystyle\mu =\frac{1}{rs}\sum_{i=1}^{r}{\sum_{j=1}^{s}{{{\mu }_{ij}}}} μ=rs1i=1∑rj=1∑sμij。
- 水平 A j A_j Aj 对指标的效应 α j = μ ⋅ j − μ = 1 r ∑ i = 1 r μ i j − μ \displaystyle{{\alpha }_{j}}={{\mu }_{·j}}-\mu =\frac{1}{r}\sum_{i=1}^{r}{{{\mu }_{ij}}}-\mu αj=μ⋅j−μ=r1i=1∑rμij−μ。
- 水平 B i B_i Bi 对指标的效应 β i = μ i ⋅ − μ = 1 s ∑ j = 1 s μ i j − μ \displaystyle{{\beta }_{i}}={{\mu }_{i·}}-\mu =\frac{1}{s}\sum_{j=1}^{s}{{{\mu }_{ij}}}-\mu βi=μi⋅−μ=s1j=1∑sμij−μ。
- 水平 B i B_i Bi 与 A j A_j Aj 对指标的交互效应 γ i j = μ i j − μ − α j − β i {{\gamma }_{ij}}={{\mu }_{ij}}-\mu -{{\alpha }_{j}}-{{\beta }_{i}} γij=μij−μ−αj−βi。
建立的原假设有三个:
- H 01 : α j = 0 ( j = 1 , 2 , ⋯ , s ) {{H}_{01}}:{{\alpha }_{j}}=0(j=1,2,\cdots ,s) H01:αj=0(j=1,2,⋯,s)。
- H 02 : β i = 0 ( i = 1 , 2 , ⋯ , r ) {{H}_{02}}:{{\beta }_{i}}=0(i=1,2,\cdots ,r) H02:βi=0(i=1,2,⋯,r)。
- H 03 : γ i j = 0 ( i = 1 , 2 , ⋯ , r ; j = 1 , 2 , ⋯ , s ) {{H}_{03}}:{{\gamma }_{ij}}=0(i=1,2,\cdots ,r;j=1,2,\cdots ,s) H03:γij=0(i=1,2,⋯,r;j=1,2,⋯,s)。
分析依据
一般来说,至少要讨论假设
H
01
,
H
02
{{H}_{01}},{{H}_{02}}
H01,H02,当因素
A
,
B
A,B
A,B 之间可能存在交互作用时,还需要讨论假设
H
03
H_{03}
H03。下面直接介绍含有交互效应的双因素方差分析。
说明一下一些均值:
- 所有总体的均值 X ‾ = 1 r s t ∑ i = 1 r ∑ j = 1 s ∑ k = 1 t X i j k \displaystyle\overline{X}=\frac{1}{rst}\sum_{i=1}^{r}{\sum_{j=1}^{s}{\sum_{k=1}^{t}{{{X}_{ijk}}}}} X=rst1i=1∑rj=1∑sk=1∑tXijk。
- 因素 ( B i , A j ) (B_i,A_j) (Bi,Aj) 所确定总体的均值 X i j ⋅ ‾ = 1 t ∑ k = 1 t X i j k \displaystyle\overline{{{X}_{ij·}}}=\frac{1}{t}\sum_{k=1}^{t}{{{X}_{ijk}}} Xij⋅=t1k=1∑tXijk。
- 因素 A j A_j Aj 所确定 r r r 个总体的均值 X ⋅ j ⋅ ‾ = 1 r t ∑ i = 1 r ∑ k = 1 t X i j k \displaystyle\overline{{{X}_{·j·}}}=\frac{1}{rt}\sum_{i=1}^{r}{\sum_{k=1}^{t}{{{X}_{ijk}}}} X⋅j⋅=rt1i=1∑rk=1∑tXijk。
- 因素 B i B_i Bi 所确定 s s s 个总体的均值 X i ⋅ ⋅ ‾ = 1 s t ∑ j = 1 s ∑ k = 1 t X i j k \displaystyle\overline{{{X}_{i··}}}=\frac{1}{st}\sum_{j=1}^{s}{\sum_{k=1}^{t}{{{X}_{ijk}}}} Xi⋅⋅=st1j=1∑sk=1∑tXijk。
与单因素方差分析类似,可以构造出以下的统计量:
S
E
=
∑
i
=
1
r
∑
j
=
1
s
∑
k
=
1
t
(
X
i
j
k
−
X
i
j
⋅
‾
)
2
{{S}_{E}}=\sum_{i=1}^{r}{\sum_{j=1}^{s}{\sum_{k=1}^{t}{(}}}{{X}_{ijk}}-\overline{{{X}_{ij·}}}{{)}^{2}}
SE=i=1∑rj=1∑sk=1∑t(Xijk−Xij⋅)2
S
A
=
r
t
∑
j
=
1
s
(
X
⋅
j
⋅
‾
−
X
‾
)
2
{{S}_{A}}=rt\sum_{j=1}^{s}{(}\overline{{{X}_{·j·}}}-\overline{X}{{)}^{2}}
SA=rtj=1∑s(X⋅j⋅−X)2
S
B
=
s
t
∑
i
=
1
r
(
X
i
⋅
⋅
‾
−
X
‾
)
2
{{S}_{B}}=st\sum_{i=1}^{r}{(}\overline{{{X}_{i··}}}-\overline{X}{{)}^{2}}
SB=sti=1∑r(Xi⋅⋅−X)2
S
A
B
=
t
∑
i
=
1
r
∑
j
=
1
s
(
X
i
j
⋅
‾
−
X
i
⋅
⋅
‾
−
X
⋅
j
⋅
‾
+
X
‾
)
2
{{S}_{AB}}=t\sum_{i=1}^{r}{\sum_{j=1}^{s}{(}}\overline{{{X}_{ij·}}}-\overline{{{X}_{i··}}}-\overline{{{X}_{·j·}}}+\overline{X}{{)}^{2}}
SAB=ti=1∑rj=1∑s(Xij⋅−Xi⋅⋅−X⋅j⋅+X)2
其中 S E S_E SE 为误差平方和, S A S_A SA 为因素 A A A 的平方和(或列间平方和), S B S_B SB 为因素 B B B 的平方和(或行间平方和), S A B S_{AB} SAB 为交互作用的平方和(或格间平方和)。那么:
- F A = S A s − 1 S E r s ( t − 1 ) ∼ F ( s − 1 , r s ( t − 1 ) ) {{F_A}}=\displaystyle\cfrac{\cfrac{{{S}_{A}}}{s-1}}{\cfrac{{{S}_{E}}}{rs(t-1)}}\sim F(s-1,rs(t-1)) FA=rs(t−1)SEs−1SA∼F(s−1,rs(t−1)),若 F A < F α ( s − 1 , r s ( t − 1 ) ) {{F_A}}<{{F_\alpha }}(s-1,rs(t-1)) FA<Fα(s−1,rs(t−1)) 则接受原假设 。即因素 A A A 无显著影响。
- F B = S B r − 1 S E r s ( t − 1 ) ∼ F ( r − 1 , r s ( t − 1 ) ) {{F_B}}=\displaystyle\cfrac{\cfrac{{{S}_{B}}}{r-1}}{\cfrac{{{S}_{E}}}{rs(t-1)}}\sim F(r-1,rs(t-1)) FB=rs(t−1)SEr−1SB∼F(r−1,rs(t−1)),若 F B < F α ( r − 1 , r s ( t − 1 ) ) {{F_B}}<{{F_\alpha }}(r-1,rs(t-1)) FB<Fα(r−1,rs(t−1)) 则接受原假设 。即因素 B B B 无显著影响。
- F A B = S A B ( r − 1 ) ( s − 1 ) S E r s ( t − 1 ) ∼ F ( ( r − 1 ) ( s − 1 ) , r s ( t − 1 ) ) {{F}_{AB}}=\cfrac{\cfrac{{{S}_{AB}}}{(r-1)(s-1)}}{\cfrac{{{S}_{E}}}{rs(t-1)}}\sim F((r-1)(s-1),rs(t-1)) FAB=rs(t−1)SE(r−1)(s−1)SAB∼F((r−1)(s−1),rs(t−1)),若 F A B < F α ( ( r − 1 ) ( s − 1 ) , r s ( t − 1 ) ) {{F}_{AB}}<{{F_\alpha }}((r-1)(s-1),rs(t-1)) FAB<Fα((r−1)(s−1),rs(t−1)) 则接受原假设 。即因素 A , B A,B A,B 无显著交互作用。
典型代码
#程序文件Pex4_24.py
import numpy as np
import statsmodels.api as sm
# 构造数据
y=np.array([[11, 11, 13, 10], [10, 11, 9, 12],
[9, 10, 7, 6], [7, 8, 11, 10],
[5, 13, 12, 14], [11, 14, 13, 10]]).flatten()
A=np.tile(np.arange(1,5),(6,1)).flatten()
B=np.tile(np.arange(1,4).reshape(3,1),(1,8)).flatten()
# 数据字典——此处的A,B,y是长度相同的一维数组。第 i 个数据的值是y[i],属于因素(A[i],B[i])所确定的样本总体。比如:
d={'x1':A,'x2':B,'y':y}
model = sm.formula.ols("y~C(x1)+C(x2)+C(x1):C(x2)",d).fit() #注意交互作用公式的写法
anovat = sm.stats.anova_lm(model) #进行双因素方差分析
print(anovat)
"""
df sum_sq mean_sq F PR(>F)
C(x1) 3.0 19.125000 6.375000 1.330435 0.310404
C(x2) 2.0 40.083333 20.041667 4.182609 0.041856
C(x1):C(x2) 6.0 18.250000 3.041667 0.634783 0.701009
Residual 12.0 57.500000 4.791667 NaN NaN
"""
同样是看PR(>F)
列的内容,说明因素x1
对结果影响不显著,x2
对结果影响显著x1,x2
交互作用不显著。