我正在使用statsmodels公式API(来自patsy)构建WLS(statsmodels.formula.api.wls
)模型,并且我正在使用因子之间的交互。其中一些是预测性的,而另一些则不是。有没有办法在模型中只包含一部分交互而不需要手工构建设计矩阵?
或者,有没有办法将模型变量子集的估计系数约束为零?
答案 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