Statsmodels公式API(patsy):如何排除交互组件的子集?

时间:2012-12-21 16:37:53

标签: python statsmodels

我正在使用statsmodels公式API(来自patsy)构建WLS(statsmodels.formula.api.wls)模型,并且我正在使用因子之间的交互。其中一些是预测性的,而另一些则不是。有没有办法在模型中只包含一部分交互而不需要手工构建设计矩阵?

或者,有没有办法将模型变量子集的估计系数约束为零?

2 个答案:

答案 0 :(得分:3)

我不明白你所说的“互动的一个子集”是什么意思。你可能想要的一件事是像

这样的公式
y ~ pred1 + pred2 + pred3 + pred1:pred3 + pred1:pred2

或等效的

y ~ pred1*pred2*pred3 - pred2:pred3

后者明显表示我们会包含一些可能的互动,但不是所有互动(我们已经遗漏了pred2:pred3)。

但是,这很容易做到,所以我猜你实际意味着什么,你想要包含一个与交互相关的系数子集?如果是,那么不,这不是目前实施的东西。从统计角度来看,这也是相当可疑的;如果您开始省略随机列,那么您将以非常难以解释的方式更改所有其他列的解释。此外,我无法想到一个良好的可实现语法来描述您想要的部分交互...如果您可以随时在patsy上提交功能请求。

另外,我不相信statsmodels包含一种适合这种限制模型的方法,不。这将是一个很好的功能请求。

答案 1 :(得分:2)

我不确定我到底知道你需要什么,但我建议你从真正优秀的糊状文档开始(patsy处理statsmodels的公式)。关于分类数据有一个很好的部分:http://patsy.readthedocs.org/en/latest/index.html

我的猜测是,通过单个公式调用,您想要的是很难实现的。我可能只是使用patsy来构建一个设计矩阵,其中的术语比我需要的更多,然后删除列。例如:

In [28]: import statsmodels.formula.api as sm
In [29]: import pandas as pd
In [30]: import numpy as np
In [31]: import patsy
In [32]: url = "http://vincentarelbundock.github.com/Rdatasets/csv/HistData/Guerry.csv"
In [33]: df = pd.read_csv(url)
In [34]: w = np.ones(df.shape[0])
In [35]: f = 'Lottery ~ Wealth : C(Region)'
In [36]: y,X = patsy.dmatrices(f, df, return_type='dataframe')
In [37]: X.head()
Out[37]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns:
Intercept                5  non-null values
Wealth:C(Region)[nan]    5  non-null values
Wealth:C(Region)[C]      5  non-null values
Wealth:C(Region)[E]      5  non-null values
Wealth:C(Region)[N]      5  non-null values
Wealth:C(Region)[S]      5  non-null values
Wealth:C(Region)[W]      5  non-null values
dtypes: float64(7)

In [38]: X = X.ix[:,[2,3,4]]
In [39]: X.head()
Out[39]: 
   Wealth:C(Region)[C]  Wealth:C(Region)[E]  Wealth:C(Region)[N]
0                    0                   73                    0
1                    0                    0                   22
2                   61                    0                    0
3                    0                   76                    0
4                    0                   83                    0

In [40]: mod = sm.WLS(y, X, 1./w).fit()
In [41]: mod.params
Out[41]: 
Wealth:C(Region)[C]    1.084430
Wealth:C(Region)[E]    0.650396
Wealth:C(Region)[N]    1.021582