我正在statsmodels.formula.api.wls
使用 statsmodels 公式 API(来自 patsy)构建 WLS ( ) 模型,并且正在使用因子之间的交互。其中一些是预测性的,而另一些则不是。有没有办法在模型中只包含交互的子集,而无需手动构建设计矩阵?
或者,有没有办法将模型变量子集的估计系数约束为零?
我正在statsmodels.formula.api.wls
使用 statsmodels 公式 API(来自 patsy)构建 WLS ( ) 模型,并且正在使用因子之间的交互。其中一些是预测性的,而另一些则不是。有没有办法在模型中只包含交互的子集,而无需手动构建设计矩阵?
或者,有没有办法将模型变量子集的估计系数约束为零?
我不确定我是否完全理解您的需求,但我建议您从真正优秀的 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
我不明白您所说的“交互的子集”是什么意思。您可能的意思是一个公式,例如
y ~ pred1 + pred2 + pred3 + pred1:pred3 + pred1:pred2
或同等的
y ~ pred1*pred2*pred3 - pred2:pred3
后者表明我们包含了一些可能的交互,但不是全部(我们已经忽略了pred2:pred3
)。
但是,这很容易做到,所以我猜你的实际意思可能是,你想包含与单个交互相关的系数子集?如果是这样,那么不,这不是当前实施的东西。从统计的角度来看,这也是相当可疑的;如果您开始忽略随机列,那么您会以非常难以解释的方式更改所有其他列的解释。此外,我真的想不出一个好的可实现语法来描述你想要的部分交互......如果你可以随意在 patsy 上提交功能请求。
另外,我不相信 statsmodels 包含一种适合这样的受限模型的方法,不。这将是一个很好的功能请求。