Statsmodels - 线性回归模型 (OLS) 中系数趋势显着性的 Wald 检验

Posted

技术标签:

【中文标题】Statsmodels - 线性回归模型 (OLS) 中系数趋势显着性的 Wald 检验【英文标题】:Statsmodels - Wald Test for significance of trend in coefficients in Linear Regression Model (OLS) 【发布时间】:2015-05-09 17:15:10 【问题描述】:

我已使用 Statsmodels 生成 OLS 线性回归模型,以根据大约 10 个自变量来预测因变量。自变量都是分类变量。

我有兴趣仔细研究其中一个自变量的系数的重要性。有 4 个类别,所以有 3 个系数——每个系数都非常显着。我还想看看所有 3 个类别的趋势的重要性。根据我(有限的)理解,这通常是使用 Wald 检验并将所有系数与 0 进行比较来完成的。

这究竟是如何使用 Statsmodels 完成的?我看到 OLS 函数有一个 Wald Test 方法。使用此方法时,您似乎必须传入所有系数的值。

我的方法如下...

首先,这里是所有的系数:

np.array(lm.params) = array([ 0.21538725,  0.05675108,  0.05020252,  0.08112228,  0.00074715,
        0.03886747,  0.00981819,  0.19907263,  0.13962354,  0.0491201 ,
       -0.00531318,  0.00242845, -0.0097336 , -0.00143791, -0.01939182,
       -0.02676771,  0.01649944,  0.01240742, -0.00245309,  0.00757727,
        0.00655152, -0.02895381, -0.02027537,  0.02621716,  0.00783884,
        0.05065323,  0.04264466, -0.13068456, -0.15694931, -0.25518566,
       -0.0308599 , -0.00558183,  0.02990139,  0.02433505, -0.01582824,
       -0.00027538,  0.03170669,  0.01130944,  0.02631403])

我只对参数 2-4(感兴趣的 3 个系数)感兴趣。

coeffs = np.zeros_like(lm.params)
coeffs = coeffs[1:4] = [0.05675108,  0.05020252,  0.08112228]

检查以确保这有效:

array([ 0.        ,  0.05675108,  0.05020252,  0.08112228,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ])

看起来不错,现在可以运行测试了!

lm.wald_test(coeffs) = 
<class 'statsmodels.stats.contrast.ContrastResults'>
<F test: F=array([[ 13.11493673]]), p=0.000304699208434, df_denom=1248, df_num=1>

这是正确的方法吗?我真的需要一些帮助!

【问题讨论】:

【参考方案1】:

线性假设的形式为R params = q,其中 R 是定义参数线性组合的矩阵,q 是假设值。

在我们要测试某些参数是否为零的简单情况下,R矩阵在参数位置对应的列中有一个1,其他地方都是零,q为零,这是默认值。每行指定参数的线性组合,将假设定义为整体或联合假设的一部分。

在这种情况下,获得限制矩阵的最简单方法是使用单位矩阵的相应行

R = np.eye(len(results.params))[1:4]

然后,lm.wald_test(R) 将为 3 个参数为零的联合假设提供检验。

指定限制的更简单方法是使用参数名称并通过字符串列表定义限制。

模型结果类还有一个新方法wald_test_terms,它会自动为设计矩阵中的项生成 wald 检验,其中假设包括多个参数或列,如分类解释变量或多项式解释变量的情况。这在 statsmodels master 中可用,并将在即将发布的 0.7 版本中提供。

【讨论】:

非常感谢!这非常有帮助!出于我自己的好奇心,您介意给我一个示例,说明如何使用参数名称指定限制吗?保持简单,假设有以下参数:'Ind1_A,' 'Ind1_B', 'Ind1_C', Ind2_A', Ind2_B', 'Ind2_C', 'Ind3_A', Ind3_B', 'Ind3_C'。假设我只想测试 3 个'Ind1_' 参数的趋势。 我需要查找有关如何指定字符串的示例。 f_test 与 wald_test 相同,但始终使用 F 分布。界面是一样的。一些示例在此处的末尾statsmodels.sourceforge.net/devel/generated/…。 尝试字符串列表wald_test(['Ind1_A,' 'Ind1_B', 'Ind1_C']) 并尝试逗号分隔的字符串wald_test('Ind1_A, Ind1_B, Ind1_C')。我手头没有示例来检查用于分隔假设的支持的语法是什么。如果没有等号,则默认为零。支持更复杂的线性表达式。喜欢'Ind1_A + 2 * Ind1_B - Ind1_C = 5' patsy.readthedocs.org/en/latest/… 谢谢@user333700!字符串列表有效。我之前曾尝试过(在我尝试问题中列出的方法之前),但我没有添加标签(例如,'Ind1' 而不是 'Ind1[T.25-50%]')。

以上是关于Statsmodels - 线性回归模型 (OLS) 中系数趋势显着性的 Wald 检验的主要内容,如果未能解决你的问题,请参考以下文章

超详细多元线性回归模型statsmodels_ols

Python:多元线性回归:statsmodels.formula.api.ols()

python statsmodels - 回归中的二次项

为啥 `sklearn` 和 `statsmodels` 的 OLS 回归实现给出不同的 R^2?

如何使用 statsmodels 获得多元线性回归的标准化(Beta)系数

使用 statsmodels 忽略多个 OLS 回归中的缺失值