当有两个或两个以上的因素对因变量产生影响时,把因素单独对因变量产生的影响称之为‘主效应’;把因素之间共同对因变量产生的影响,或者因素某些水平同时出现时,除了主效应之外的附加影响,称之为‘交互效应’。
因此,多因素方差分析模型也是一个一般化线性模型的延续:
因变量=因素1主效应+因素2主效应+···+因素n主效应 + 因素交互效应1+因素交互效应2+···+因素交互效应m+随机误差
只考虑主效应的方差分析
例:根据样本数据(472个样本)分析各种因素(学历、工作单位、收入水平和户型)对购房面积的影响。设显著性水平a=0.05。
原数据:
转换数值标签后:
在不考虑交互效应的情况下,使用statsmodels中的anova_lm配合ols进行分析:
可以看到edcationt因数主效应对应P值=0.1923和unit因数主效应的P值=0.7347,均非常大,可以得出这两个因素对因变量的影响十分不显著,应当在模型中予以剔除。
说明拟购房面积大小受不同学历和工作单位的影响较小。因此从formula语句中剔除这两个因素。
从结果中可以看到income和type两个因素对拟购面积的影响非常显著。
多重比较检验
购房者收入水平对拟购面积的影响
可以认为,低收入群体和高收入群体对购房面积最敏感,而中收入群体对购房面积敏感性不如高手如何低收入群体。
利用方差分析模型进行参数估计
本例模型的拟合优度0.171偏低,但是对于时机界面数据而言,该模型拟合程度勉强能接受。
如,考察年收入在50000-75000元,购买意向户型为三室二厅的拟购面积为:102.2754-19.4782(平米)
存在交互效应的多因素方差分析
当不确定因素之间是否存在交互效应时,可以首先考虑利用方差分析的群模型进行分析,即考虑主效应和交互效应。
在statsmodels中,“:”表示因素之间的交互效应,“ * ”表示因素之间的全部效应。
即 'space ~ C(income)*C(type)' 等价于 'space ~ C(income)+C(type)+C(income):C(type)'
各因素的主效应与交互效应均非常显著,且模型拟合度为0.269,较无交互效应模型要大。
交互效应图
python代码
import pandas as pd
from scipy import stats
import statsmodels.api as sm
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']#显示中文
plt.style.use('ggplot')
数据预处理
house = pd.read_csv('house.csv')
house['education'] = house['education'].astype('category')
house['education'].cat.categories = ['初中及以下','高中及中专','大学','研究生及以上']
house['education'].cat.set_categories = ['初中及以下','高中及中专','大学','研究生及以上']
house ['unit'] = house['unit'].astype('category')
house['unit'].cat.categories = ['国营企业','行政事业单位','大专院校科研单位','私营企业','失业','其他']
house['unit'].cat.set_categories = ['国营企业','行政事业单位','大专院校科研单位','私营企业','失业','其他']
house['income'] = house['income'].astype('category')
house['income'].cat.categories = ['10000元以下','10000元-25000元','25000-50000元','50000元-75000元','75000元以上']
house['income'].cat.set_categories = ['10000元以下','10000元-25000元','25000-50000元','50000元-75000元','75000元以上']
house['type'] = house['type'].astype('category')
house['type'].cat.categories = ['一室一厅','二室一厅','二室二厅','三室一厅','三室二厅','三室三厅','四室二厅一卫','四室二厅二卫',
'四室三厅一卫','四室三厅二卫','更大户型']
house['type'].cat.set_categories = ['一室一厅','二室一厅','二室二厅','三室一厅','三室二厅','三室三厅','四室二厅一卫','四室二厅二卫',
'四室三厅一卫','四室三厅二卫','更大户型']
只有主效应没有交互效应的情况下
#
from statsmodels.formula.api import ols
formula = 'space ~ C(education)+C(unit)+C(income)+C(type)'
house_anova = sm.stats.anova_lm(ols(formula,data = house).fit(),typ = 3)
house_anova
#由于edcation和unit因数主效应的影响十分不显著,所以从formula语句中剔除这两个因素
formula = 'space ~ C(income)+C(type)'
house_anova = sm.stats.anova_lm(ols(formula,data = house).fit(),typ = 3)
#此处typ=3表示做方差分析type iii型检验,
#type iii即平方和分解法,适用于平衡和非平衡的ANOVA模型,凡是用于type ii和type i的模型均可使用该法。
#该参数默认使用type i型。
house_anova
对因素进行多重比较检验
from statsmodels.stats.multicomp import pairwise_tukeyhsd
house_anova_post = pairwise_tukeyhsd(house['space'],house['income'],alpha = 0.05)
house_anova_post.summary()
house_anova_post = pairwise_tukeyhsd(house['space'],house['type'],alpha = 0.05)
house_anova_post.summary()
利用方差分析模型进行参数估计
house_anova_est = ols(formula,data = house).fit()
house_anova_est.summary2()
house_anova_est = ols('space ~ C(income)+C(type)-1',data = house).fit()
house_anova_est.summary2()
考察存在交互效应时的方差分析
formula = 'space ~ C(income)*C(type)'
house_anova_inter = sm.stats.anova_lm(ols(formula,data = house).fit())
house_anova_inter
拟合优度系数
ols(formula,data = house).fit().rsquared
0.26907101524187094
画交互效应图
from statsmodels.graphics.api import interaction_plot
import numpy as np
plt.figure(figsize=(12,6))
fig = interaction_plot(np.array(house['income']),np.array(house['type']),np.array(house['space']),ax=plt.gca())
fig_adj = plt.subplot(111)
plt.legend(prop={'family':'SimHei','size':10.5},loc='upper left',frameon=False)
fig_adj.set_xticklabels(house['income'].unique())
网友评论