3

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

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

4

2 回答 2

3

我不确定我是否完全理解您的需求,但我建议您从真正优秀的 paste 文档开始(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
于 2012-12-23T16:19:46.453 回答
3

我不明白您所说的“交互的子集”是什么意思。您可能的意思是一个公式,例如

y ~ pred1 + pred2 + pred3 + pred1:pred3 + pred1:pred2

或同等的

y ~ pred1*pred2*pred3 - pred2:pred3

后者表明我们包含了一些可能的交互,但不是全部(我们已经忽略了pred2:pred3)。

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

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

于 2012-12-23T19:15:29.457 回答