python中GLM的方差分析测试

python中GLM的方差分析测试,python,statistics,glm,statsmodels,Python,Statistics,Glm,Statsmodels,我试图得到GLM中每个协变量的F统计量和p值。在Python中,我使用stats mode.formula.api来执行GLM formula = 'PropNo_Pred ~ Geography + log10BMI + Cat_OpCavity + CatLes_neles + CatRural_urban + \ CatPred_Control + CatNative_Intro + Midpoint_of_study' mod1 = smf.glm(formula=fo

我试图得到GLM中每个协变量的F统计量和p值。在Python中,我使用stats mode.formula.api来执行GLM

formula = 'PropNo_Pred ~ Geography + log10BMI + Cat_OpCavity + CatLes_neles + CatRural_urban + \
        CatPred_Control + CatNative_Intro + Midpoint_of_study'

mod1 = smf.glm(formula=formula, data=A2, family=sm.families.Binomial()).fit()
mod1.summary()
之后,我尝试使用statsmodels.stats中的方差分析对该模型进行方差分析测试

table1 = anova_lm(mod3)
print table1
然而,我得到一个错误,说: “GLMResults”对象没有属性“ssr”


看起来这个anova_lm函数只适用于线性模型。python中是否有对GLMs进行anova测试的模块?

不幸的是,没有。但是,您可以通过对每个术语使用模型的假设检验方法来进行自己的测试。事实上,他们中的一些人甚至不使用属性
ssr
(这是模型的残差平方和,因此对于二项式GLM显然没有定义)。您可能可以修改此代码以进行GLM方差分析。

以下是我自己的尝试

嵌套模型的F统计量定义为:

(D_s-D_b)/(addtl_参数*phi_b)

其中:

  • D_s
    是小型模型的偏差
  • D_b
    是较大(“大”)模型的偏差
  • addtl_参数
    是模型之间自由度的差异
  • phi_b
    是较大模型的色散参数估计值
统计理论认为F统计量 遵循F分布,分子自由度等于 添加的参数和分母自由度等于
n-p_b
,或数字 记录数减去大模型中的参数数。”

我们通过以下方式将其转换为代码:

from scipy import stats

def calculate_nested_f_statistic(small_model, big_model):
    """Given two fitted GLMs, the larger of which contains the parameter space of the smaller, return the F Stat and P value corresponding to the larger model adding explanatory power"""
    addtl_params = big_model.df_model - small_model.df_model
    f_stat = (small_model.deviance - big_model.deviance) / (addtl_params * big_model.scale)
    df_numerator = addtl_params
    # use fitted values to obtain n_obs from model object:
    df_denom = (big_model.fittedvalues.shape[0] - big_model.df_model)
    p_value = stats.f.sf(f_stat, df_numerator, df_denom)
    return (f_stat, p_value)
下面是一个可复制的示例,遵循statsmodels()中的gamma GLM示例:

将numpy导入为np
将statsmodels.api作为sm导入
data2=sm.datasets.scotland.load()
data2.exog=sm.add_常量(data2.exog,prepend=False)
big_model=sm.GLM(data2.endog,data2.exog,family=sm.families.Gamma()).fit()
#删除一个协变量(列):
更小的模型=sm.GLM(data2.endog,data2.exog[:,1:,family=sm.families.Gamma()).fit()
#使用答案中定义的函数:
计算嵌套的统计(较小的模型,较大的模型)
# (9.519052917304652, 0.004914748992474178)
资料来源:

ANOVA类型3结果的初步答案谢谢你的回答,我会研究一下。如果你能在实验中添加一个如何使用假设检验方法的例子,那就太棒了。