多因素一元方差分析
一、多因素一元方差分析的原理
把样本数据的总离差平方和分解为:各因素主效应离差平方和、交互效应离差平方和、随机因素的离差平方和。根据平方和及自由度分解方式构造检验统计量,对各因素主效应、交互效应作出检验。
多因素一元方差分析的MATLAB实现
anovan函数
功能:多因素一元方差分析
调用方式:
p = anovan(y,group)
p = anovan(y,group,param1,val1,param2,val2,…)
[p,table] = anovan(…)
[p,table,stats] = anovan(…)
[p,table,stats,terms] = anovan(…)
单因素多元方差分析的MATLAB实现
manova1函数
功能:单因素多元方差分析
调用方式:
d = manova1(X,group)
d = manova1(X,group,alpha)
[d,p] = manova1(…)
[d,p,stats] = manova1(…)
【案例分析】
为研究销售方式对商品的销售额的影响,选择四种商品(甲、乙、丙和丁)按三种不同的销售方式(Ⅰ、Ⅱ和Ⅲ)进行销售。这四种商品的销售额分别记为 x1,x2,x3,x4,其数据见表。试分析不同销售方式对销售额是否有显著影响?取α = 0.01。
>> xdata = xlsread('examp011_05.xls'); % 提取xdata的第2至5列和第8至11列,即四种商品的销售额数据 >> x = [xdata(:,2:5); xdata(:,8:11)]; % 提取xdata的第6列和第12列,即销售方式数据 >> group = [xdata(:,6); xdata(:,12)]; % 调用manova1函数作多元方差分析 >> [d,p,stats] = manova1(x,group) d = 1 p = 0.0040 0.0917 stats = W: [4x4 double] B: [4x4 double] T: [4x4 double] dfW: 57 dfB: 2 dfT: 59 lambda: [2x1 double] chisq: [2x1 double] chisqdf: [2x1 double] eigenval: [4x1 double] eigenvec: [4x4 double] canon: [60x4 double] mdist: [60x1 double] gmdist: [3x3 double] gnames: {3x1 cell}
结论
从manova1函数返回的结果来看,检验的p 值分别为0.004和0.0917,说明在显著性水平0.05下拒绝假设:3种销售方式所对应的销售量的均值向量都相同,接受假设:3种销售方式所对应的销售量的均值向量位于一个1维空间(即共线),因此维数的估计值为d = 1. 总的来说,在显著性水平0.05下,可认为不同销售方式对销售额有显著影响,但是究竟对四种商品中的哪种商品的销售额有显著影响,还需要对四种商品的销售额分别作一元方差分析才能知晓。
>> [p1,table1] = anova1(x(:,1),group)
>> [p2,table2] = anova1(x(:,2),group)
>> [p1,table3] = anova1(x(:,3),group)
>> [p1,table4] = anova1(x(:,4),group)
非参数方差分析
前面介绍的方差分析均要求样本来自于正态总体,并且这些正态总体应具有相同的方差,在这样的基本假定(正态性假定和方差齐性假定)下检验各总体均值是否相等,这属于参数检验。当数据不满足正态性和方差齐性假定时,参数检验可能会给出错误的结果,此时应采用基于秩的非参数检验。
Kruskal-Wallis检验(单因素非参数方差分析)
kruskalwallis函数
调用方式:
p = kruskalwallis(X)
p = kruskalwallis(X,group)
p = kruskalwallis(X,group,displayopt)
[p,table] = kruskalwallis(…)
[p,table,stats] = kruskalwallis(…)
【案例分析】
某灯泡厂用四种不同配料方案制成的灯丝生产四批灯泡,在每一批中取若干个作寿命试验,得如下数据
(单位:小时):问灯丝的不同配料方案对灯泡寿命有无显著影响?
方差分析
>> A1 = [1600, 1610, 1650, 1680, 1700, 1720, 1800]'; >> g1 = repmat({'A1'},size(A1)); % 定义配料方案的第1种水平 >> A2 = [1580, 1640, 1600, 1650, 1660]'; >> g2 = repmat({'A2'},size(A2)); % 定义配料方案的第2种水平 >> A3 = [1460, 1550, 1600, 1620, 1640, 1610, 1540, 1620]'; >> g3 = repmat({'A3'},size(A3)); % 定义配料方案的第3种水平 >> A4 = [1510, 1520, 1530, 1570, 1600, 1680]'; >> g4 = repmat({'A4'},size(A4)); % 定义配料方案的第4种水平 >> life = [A1;A2;A3;A4]; >> group = [g1;g2;g3;g4]; % 调用kruskalwallis函数作Kruskal-Wallis检验 >> [p,table,stats] = kruskalwallis(life,group)
多重比较
% 调用multcompare对不同配料方案下灯泡的寿命进行多重比较 >> [c,m,h,gnames] = multcompare(stats); >> c % 查看多重比较的结果矩阵c c = 1.0000 2.0000 -6.6331 4.8429 16.3188 1.0000 3.0000 -0.5630 9.5804 19.7237 1.0000 4.0000 1.0724 11.9762 22.8800 2.0000 3.0000 -6.4356 4.7375 15.9106 2.0000 4.0000 -4.7344 7.1333 19.0010 3.0000 4.0000 -8.1888 2.3958 12.9804
Friedman检验
friedman函数
调用方式:
p = friedman(X,reps)
p = friedman(X,reps,displayopt)
[p,table] = friedman(…)
[p,table,stats] = friedman(…)
案例分析
设有来自A,B,C,D 四个地区的四名厨师制作名菜:京城水煮鱼,想比较它们的品质是否相同。四位美食评委对四名厨师的菜品分别作出了评分,如下表所列。试根据表中的数据检验四个地区制作的京城水煮鱼这道菜的品质有无区别。
方差分析
>> x = [85 82 82 79 87 75 86 82 90 81 80 76 80 75 81 75]; % 调用friedman函数作Friedman检验,返回检验的p值、方差分析表table和结 构体变量stats >> [p,table,stats] = friedman(x)
多重比较
% 调用multcompare函数对四个地区制作的京城水煮鱼这道菜的品质进行多重 比较 >> [c,m] = multcompare(stats); >> c % 查看多重比较的结果矩阵c c = 1.0000 2.0000 -0.5358 1.7500 4.0358 0.2006 1.0000 3.0000 -1.4108 0.8750 3.1608 0.7589 1.0000 4.0000 0.0892 2.3750 4.6608 0.0381 2.0000 3.0000 -3.1608 -0.8750 1.4108 0.7589 2.0000 4.0000 -1.6608 0.6250 2.9108 0.8962 3.0000 4.0000 -0.7858 1.5000 3.7858 0.3311