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 检验的主要内容,如果未能解决你的问题,请参考以下文章
Python:多元线性回归:statsmodels.formula.api.ols()
为啥 `sklearn` 和 `statsmodels` 的 OLS 回归实现给出不同的 R^2?