美文网首页
方差分析(一元多因素)

方差分析(一元多因素)

作者: 弦好想断 | 来源:发表于2020-05-15 16:58 被阅读0次
    当有两个或两个以上的因素对因变量产生影响时,把因素单独对因变量产生的影响称之为‘主效应’;把因素之间共同对因变量产生的影响,或者因素某些水平同时出现时,除了主效应之外的附加影响,称之为‘交互效应’。

    因此,多因素方差分析模型也是一个一般化线性模型的延续:

    因变量=因素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())
    

    相关文章

      网友评论

          本文标题:方差分析(一元多因素)

          本文链接:https://www.haomeiwen.com/subject/bnpcohtx.html