R:aov和lm方差分析的区别

在R中经常会用aov()和lm()两个函数进行方差分析,aov 函数的内核使用了lm算法,但二者有一定的区别。
aov() 默认(summary) 结果是基于Type I 平方和,而 lm() 默认(summary)的结果是Type III平方和。aov()分析的结果受自变量输入顺序的影响,而lm()与自变量输入顺序无关。当然这种差异是针对非平衡数据而言。对于平衡全处理的数据结构,二者分析的结果是一致的。

Ⅲ型平方和与Ⅰ型平方和

如果是等组设计,这几种平方和没有任何区别。不同类型的平方和是针对非等组设计提出的。需要通过线性模型来理解。

I型平方和也叫顺序平方和,需要考虑各主效应的进入顺序。但I型平方和不正交,顺序不同计算出的结果也不同,不推荐使用。

II型平方和叫偏序平方和,不考虑主效应顺序,但在计算主效应时不考虑交互作用。

如果各效应之间不存在交互作用,II型平方和效力较高III型平方和也叫正交平方和,不考虑顺序,但不能将总平方和完全分解。目前非等组设计中推荐使用的是III型平方和



from statsmodels.formula.api import ols #拟合线性模型的包
from statsmodels.stats.anova import anova_lm#进行方差分析的包
import pandas as pd
import numpy as np
data={'XA1':  [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1],'XA2':  [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1],'XB1':  [1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1],'XAB11':[1,1,1,-1,-1,-1,-1,-1, 0,0,0,0, 0,0,0,0,0,-1,-1,-1,1,1,1,1],'XAB21':[0,0,0, 0,0,0,0,0,1,1,1,1, -1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1],'Y':[6,3,3,6,3,5,5,2,7,6,7,5,8,7,8,9,8,9,7,5,10,12,11,7],'A':[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3],'B':[1,1,1,2,2,2,2,2,1,1,1,1,2,2,2,2,2,1,1,1,2,2,2,2]
}#其中前5行是虚拟变量,Y是观测值,A,B是分类变量
df=pd.DataFrame(data)
model_none=ols('Y~1',data=df).fit()#零模型,即没有任何效应
#-----------------首先进场的三种情况-----------------
model_A=ols('Y~XA1+XA2',data=df).fit()#只有A因素,即A先入场
model_B=ols('Y~XB1',data=df).fit()#只有B因素,即B先入场
#------------------其次进场的情况----------------------
model_AB=ols('Y~XA1+XA2+XB1',data=df).fit()#A,B主效应同时存在
#------------------最后进场,全模型-------------------------
model_full=ols('Y~XA1+XA2+XB1+XAB11+XAB21',data=df).fit()#全模型
#------------------以下为方差分析结果---------------------
model_anova_ABR=ols('Y~C(A,Sum)+C(B,Sum)+C(A,Sum):C(B,Sum)',data=df).fit()
#用分类变量进行方差分析,进场顺序为ABR
anova_Result_ABR=anova_lm(model_anova_ABR,typ=1)#此时选择Ⅰ型平方和model_anova_BAR=ols('Y~C(B,Sum)+C(A,Sum)+C(A,Sum):C(B,Sum)',data=df).fit()
#用分类变量进行方差分析,进场顺序为BAR
anova_Result_BAR=anova_lm(model_anova_BAR,typ=1)#此时选择Ⅰ型平方和

先来计算进场顺序依次为A主效应,B主效应,AB交互作用的Ⅰ型平方和。看看结果如何

#以下计算进场顺序A-B-R的Ⅰ型平方和
SSEN=model_none.mse_resid*model_none.df_resid#零模型残差
SSEA=model_A.mse_resid*model_A.df_resid#A先进场模型残差
SSEAB=model_AB.mse_resid*model_AB.df_resid#AB模型残差,此时B第二个进场
SSEF=model_full.mse_resid*model_full.df_resid#全模型残差
SSA=SSEN-SSEA#A主效应
SSB=SSEA-SSEAB#B主效应
SSR=SSEAB-SSEF#交互作用效应
print('用回归计算的Ⅰ型平方和输出结果为:''\nSSA:%.3f,\nSSB:%.3f,\nSSR:%.3f'%(SSA,SSB,SSR))
#依次打印A主效应平方和,B主效应平方和,交互作用平方和用回归计算的Ⅰ型平方和输出结果为:
SSA:83.766,
SSB:15.226,
SSR:7.083
print('Ⅰ型平方和方差分析输出结果为:\n',anova_Result_ABR)#打印方差分析结果Ⅰ型平方和方差分析输出结果为:df     sum_sq    mean_sq          F    PR(>F)
C(A, Sum)             2.0  83.765873  41.882937  17.310973  0.000064
C(B, Sum)             1.0  15.226146  15.226146   6.293241  0.021911
C(A, Sum):C(B, Sum)   2.0   7.082981   3.541490   1.463762  0.257627
Residual             18.0  43.550000   2.419444        NaN       NaN
print('各主效应与交互作用平方和之和为:%.3f'%(np.sum(anova_Result_ABR.sum_sq[0:3])))各主效应与交互作用平方和之和为:106.075

可见,此时用回归模型计算的结果与用方差分析计算的结果相同,注意此时的方差分析使用的是Ⅰ型平方和。而且Ⅰ型平方和的主效应与交互作用之和刚好等于组间平方和106.075

接下来再计算进场顺序为B主效应,A主效应,AB交互作用的Ⅰ型平方和看看

#以下计算进场顺序B-A-R的Ⅰ型平方和
SSEN=model_none.mse_resid*model_none.df_resid#零模型残差
SSEB=model_B.mse_resid*model_B.df_resid#B先进场模型残差
SSEAB=model_AB.mse_resid*model_AB.df_resid#AB模型残差,此时A第二个进场
SSEF=model_full.mse_resid*model_full.df_resid#全模型残差
SSA=SSEN-SSEB#A主效应
SSB=SSEB-SSEAB#B主效应
SSR=SSEAB-SSEF#交互作用效应
print('用回归计算的Ⅰ型平方和输出结果为:''\nSSA:%.3f,\nSSB:%.3f,\nSSR:%.3f'%(SSA,SSB,SSR))
#依次打印A主效应平方和,B主效应平方和,交互作用平方和用回归计算的Ⅰ型平方和输出结果为:
SSA:11.668,
SSB:87.324,
SSR:7.083
print('Ⅰ型平方和方差分析输出结果为:\n',anova_Result_BAR)#打印方差分析结果Ⅰ型平方和方差分析输出结果为:df     sum_sq    mean_sq          F    PR(>F)
C(B, Sum)             1.0  11.667857  11.667857   4.822536  0.041435
C(A, Sum)             2.0  87.324162  43.662081  18.046325  0.000050
C(A, Sum):C(B, Sum)   2.0   7.082981   3.541490   1.463762  0.257627
Residual             18.0  43.550000   2.419444        NaN       NaN
print('各主效应与交互作用平方和之和为:%.3f'%(np.sum(anova_Result_BAR.sum_sq[0:3])))各主效应与交互作用平方和之和为:106.075

详细阅读:用回归理解方差分析

为了更好理解这篇文章,你可能需要了解:

  • 两因素方差分析
  • 平方和的分解
  • 方差分析模型
  • 虚拟变量

推荐先阅读

用回归来理解方差分析(一):单因素方差分析
用回归来理解方差分析(二):两因素方差分析

双因素方差分析python

from statsmodels.formula.api import ols #拟合线性模型的包
from statsmodels.stats.anova import anova_lm#进行方差分析的包
import pandas as pd
import numpy as np
data={'XA1':  [1,1,1,1, 1, 1, 1, 1,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1],'XA2':  [0,0,0,0, 0, 0, 0, 0,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1],'XB1':  [1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1],'XAB11':[1,1,1,1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,-1,-1,-1,-1,1,1,1,1],'XAB21':[0,0,0,0,0,0,0,0,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1],'Y':[5,3,4,2,6,3,5,5,7,6,7,8,8,7,8,5,9,7,5,7,10,12,11,7],'A':[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3],'B':[1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2]
}#其中前5行是虚拟变量,Y是观测值,A,B是分类变量
df=pd.DataFrame(data)
model_lin=ols('Y~XA1+XA2+XB1+XAB11+XAB21',data=df).fit()#用虚拟变量进行回归
model_anova=ols('Y~C(A)*C(B)',data=df).fit()#用分类变量进行方差分析
anova_Result=anova_lm(model_anova)print(anova_Result)df     sum_sq    mean_sq          F    PR(>F)
C(A)        2.0  79.083333  39.541667  17.905660  0.000052
C(B)        1.0  12.041667  12.041667   5.452830  0.031315
C(A):C(B)   2.0   9.083333   4.541667   2.056604  0.156887
Residual   18.0  39.750000   2.208333        NaN       NaN
#利用方差分析结果计算决定系数,组间平方和(主效应与交互作用之和)/总平方和
R_square=np.sum(anova_Result.sum_sq[0:3])/np.sum(anova_Result.sum_sq)
print(R_square)0.7159869008633524
#打印回归分析结果
print(model_lin.summary())OLS Regression Results
==============================================================================
Dep. Variable:                      Y   R-squared:                       0.716
Model:                            OLS   Adj. R-squared:                  0.637
Method:                 Least Squares   F-statistic:                     9.075
Date:                Sat, 11 Apr 2020   Prob (F-statistic):           0.000191
Time:                        18:02:59   Log-Likelihood:                -40.109
No. Observations:                  24   AIC:                             92.22
Df Residuals:                      18   BIC:                             99.29
Df Model:                           5
Covariance Type:            nonrobust
==============================================================================coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      6.5417      0.303     21.566      0.000       5.904       7.179
XA1           -2.4167      0.429     -5.633      0.000      -3.318      -1.515
XA2            0.4583      0.429      1.068      0.299      -0.443       1.360
XB1           -0.7083      0.303     -2.335      0.031      -1.346      -0.071
XAB11          0.0833      0.429      0.194      0.848      -0.818       0.985
XAB21          0.7083      0.429      1.651      0.116      -0.193       1.610
==============================================================================
Omnibus:                        1.556   Durbin-Watson:                   2.330
Prob(Omnibus):                  0.459   Jarque-Bera (JB):                1.295
Skew:                          -0.535   Prob(JB):                        0.523
Kurtosis:                       2.614   Cond. No.                         1.73
==============================================================================Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
#利用回归模型输出各预测值
model_lin.predict()array([ 3.5 ,  3.5 ,  3.5 ,  3.5 ,  4.75,  4.75,  4.75,  4.75,  7.  ,7.  ,  7.  ,  7.  ,  7.  ,  7.  ,  7.  ,  7.  ,  7.  ,  7.  ,7.  ,  7.  , 10.  , 10.  , 10.  , 10.  ])
#利用回归模型输出参数估计值
model_lin.paramsIntercept    6.541667
XA1         -2.416667
XA2          0.458333
XB1         -0.708333
XAB11        0.083333
XAB21        0.708333
dtype: float64
#输出原始观测值的总均值
np.mean(df['Y'])6.541666666666667

2 不等组设计的平方和Ⅲ型

from statsmodels.formula.api import ols #拟合线性模型的包
from statsmodels.stats.anova import anova_lm#进行方差分析的包
import pandas as pd
import numpy as np
data={'XA1':  [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1],'XA2':  [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1],'XB1':  [1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1],'XAB11':[1,1,1,-1,-1,-1,-1,-1, 0,0,0,0, 0,0,0,0,0,-1,-1,-1,1,1,1,1],'XAB21':[0,0,0, 0,0,0,0,0,1,1,1,1, -1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1],'Y':[6,3,3,6,3,5,5,2,7,6,7,5, 8,7,8,9,8, 9,7,5,10,12,11,7],'A':[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3],'B':[1,1,1,2,2,2,2,2,1,1,1,1,2,2,2,2,2,1,1,1,2,2,2,2]
}#其中前5行是虚拟变量,Y是观测值,A,B是分类变量
df=pd.DataFrame(data)
model_full=ols('Y~XA1+XA2+XB1+XAB11+XAB21',data=df).fit()#全模型回归
model_A=ols('Y~XB1+XAB11+XAB21',data=df).fit()#去掉A因素主效应
model_B=ols('Y~XA1+XA2+XAB11+XAB21',data=df).fit()#去掉B因素主效应
model_R=ols('Y~XA1+XA2+XB1',data=df).fit()#去掉交互作用
model_anova=ols('Y~C(A,Sum)*C(B,Sum)',data=df).fit()#用分类变量进行方差分析
anova_Result=anova_lm(model_anova,typ=3)SSE=model_full.mse_resid*model_full.df_resid#全模型残差
SSEA=model_A.mse_resid*model_A.df_resid#去A模型残差
SSEB=model_B.mse_resid*model_B.df_resid#去B模型残差
SSER=model_R.mse_resid*model_R.df_resid#去交互模型残差
print(SSEA-SSE,SSEB-SSE,SSER-SSE)
#依次打印A主效应平方和,B主效应平方和,交互作用平方和74.03142710822807 15.639893617021286 7.082980539433265
print(anova_Result)#打印方差分析结果sum_sq    df           F        PR(>F)
Intercept            993.384574   1.0  410.583751  7.687336e-14
C(A, Sum)             74.031427   2.0   15.299262  1.311731e-04
C(B, Sum)             15.639894   1.0    6.464250  2.041777e-02
C(A, Sum):C(B, Sum)    7.082981   2.0    1.463762  2.576274e-01
Residual              43.550000  18.0         NaN           NaN

aov()函数lm()函数区别,(I型、Ⅲ型平方和)相关推荐

  1. php中strrpos函数的返回值类型是型_函数strrpos('Welcome to learning PHP','e')的返回值是___________。...

    [简答题]参照资料中"实训3-5用户登录和退出"的要求,完成实训内容,将实训报告作为答案附件提交.实训报告文件名格式:"实训3-5用户登录和退出20170215xx姓名& ...

  2. python内置函数用来返回数值型序列中所有元素之和_Python内置函数______用来返回数值型序列中所有元素之和...

    [填空题]表达式 int(4**0.5) 的值为 [判断题]3+4j不是合法的Python表达式. [填空题]已知列表对象x = ['11', '2', '3'],则表达式 max(x) 的值为 [填 ...

  3. python内置函数可以返回数值型序列中所有元素之和_Python内置函数________________用来返回数值型序列中所有元素之和。...

    [单选题]表达式 ','.join('a     b  ccc\n\n\nddd     '.split()) 的值为______________. [单选题]表达式 'abcabcabc'.coun ...

  4. python内置函数可以返回数值型序列中所有元素之和_智慧职教: Python内置函数________________用来返回数值型序列中所有元素之和。...

    智慧职教: Python内置函数________________用来返回数值型序列中所有元素之和. 答:3, 中国大学MOOC: 叙事性是插画的核心,每一幅插画背后都有一个作者心中的故事,或唯美,或悲 ...

  5. python内置函数sum_Python内置函数sum____用来返回数值型序列中所有元素之和。

    [单选题]关于函数参数传递中,形参与实参的描述错误的是( ). [判断题]PythonModuleDocs是Python的帮助文档. [单选题]以下关于Python的说法中正确的是哪一项? [判断题] ...

  6. 利用OpenCV的函数putText()为图像添加数值型文本内容

    OpenCV的函数putText()的原型如下: C++原型: void cv::putText(InputOutputArray img,const String & text,Point ...

  7. c语言指针自定义函数,c语言函数指针定义,指针函数和函数指针的区别

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面就由小编详细为大家介绍C语言中函数指针,指针函数和函数指针之间的区别. c语言指针函数定义: 函数指针是指向函数的指针变量. 因此&qu ...

  8. SQLServer 2000中,存储过程和用户自定义函数具体的区别??

    2019独角兽企业重金招聘Python工程师标准>>> 存储过程 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语 ...

  9. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

最新文章

  1. 很安逸的离线API文档查询工具Dash和Zeal
  2. 浏览器加载本地html页面,在浏览器字段中加载本地HTML文件时是否显示白屏?
  3. vb表格控件_(超级干货)ExcelVBA拆分表格并分别发送邮件增强版
  4. Java自定义JSlider UI
  5. 重要更新,Office Add-in将全面支持Webview2
  6. ajax默认什么方法,ajax设置默认值ajaxSetup()方法
  7. 晨哥真有料丨女生眼中的高级感!
  8. java 守护进程 linux_Java使用appache deamon实现linux守护进程
  9. java求最大子数组 (分治算法)
  10. PIE SDK矢量数据的读取
  11. 一个极简的RePlugin
  12. 遥感大辞典_学习遥感必读的十本专业书
  13. LayaAir TTF字体使用
  14. SmartSVN for Mac(SVN客户端)
  15. 怎么用计算机连接电视,电脑怎么连接电视当显示屏用
  16. python zipfile压缩的文件用shell命令解压_Python学习第177课——bzip2、zip方式压缩文件和解压文件...
  17. 几款好用的矢量图库网站
  18. 广工大物实验报告十七——铁磁材料的磁滞回线和基本磁化曲线
  19. 由提交storm项目jar包引发对jar的原理的探索
  20. cocos2dx卡牌翻转效果

热门文章

  1. exchange邮箱一直提示密码错误,密码是正确的,求大佬解答
  2. 体育技术机器学习金钱和灵感的圣杯
  3. Windows Phone 8107更新方法
  4. python控制台打印文字logo
  5. 07:计算多项式的值
  6. 使用visio来进行画类图
  7. 关于区块链的想法和感想
  8. 分部积分出现积回去的情况
  9. 618年中大促八大情景话术大全(赶紧收藏)
  10. 未来教育的趋势:线上网校和线下教育相结合