Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Statsmodels公式API(patsy):如何排除交互组件的子集?_Python_Statsmodels - Fatal编程技术网

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

Python Statsmodels公式API(patsy):如何排除交互组件的子集?,python,statsmodels,Python,Statsmodels,我正在使用statsmodels公式api(来自patsy)构建WLS(statsmodels.formula.api.WLS)模型,并使用因素之间的相互作用。其中一些是预测性的,而另一些则不是。有没有一种方法可以在模型中只包含交互的一个子集,而不用手工构建设计矩阵 或者,是否有方法将模型变量子集的估计系数限制为零 我不确定我是否完全理解您的需求,但我建议您从真正优秀的pasty docs开始(patsy处理statsmodels的公式)。关于分类数据有一个很好的部分: 我的猜测是,你想要的是很

我正在使用statsmodels公式api(来自patsy)构建WLS(
statsmodels.formula.api.WLS
)模型,并使用因素之间的相互作用。其中一些是预测性的,而另一些则不是。有没有一种方法可以在模型中只包含交互的一个子集,而不用手工构建设计矩阵


或者,是否有方法将模型变量子集的估计系数限制为零

我不确定我是否完全理解您的需求,但我建议您从真正优秀的pasty docs开始(patsy处理statsmodels的公式)。关于分类数据有一个很好的部分:

我的猜测是,你想要的是很难实现一个单一的公式调用。我可能只是使用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
[28]中的
:将statsmodels.formula.api作为sm导入
在[29]中:导入熊猫作为pd
在[30]中:将numpy作为np导入
在[31]中:输入patsy
在[32]中:url=”http://vincentarelbundock.github.com/Rdatasets/csv/HistData/Guerry.csv"
在[33]中:df=pd.read\u csv(url)
[34]中:w=np.one(df.shape[0])
在[35]中:f='彩票~财富:C(地区)'
在[36]中:y,X=patsy.d矩阵(f,df,return_type='dataframe')
在[37]:X.head()中
出[37]:
INT64索引:5个条目,从0到4
数据列:
截取5个非空值
财富:C(地区)[nan]5个非空值
财富:C(地区)[C]5个非空值
财富:C(地区)[E]5个非空值
财富:C(地区)[N]5个非空值
财富:C(地区)[S]5个非空值
财富:C(地区)[W]5个非空值
数据类型:float64(7)
在[38]:X=X.ix[:,[2,3,4]]
在[39]:X.head()中
出[39]:
财富:C(地区)[C]财富:C(地区)[E]财富:C(地区)[N]
0                    0                   73                    0
1                    0                    0                   22
2                   61                    0                    0
3                    0                   76                    0
4                    0                   83                    0
[40]:mod=sm.WLS(y,X,1./w).fit()
In[41]:mod.params
出[41]:
财富:C(地区)[C]1.084430
财富:C(地区)[E]0.650396
财富:C(地区)[N]1.021582

我不明白你所说的“交互的子集”是什么意思。你可能想说的一件事是这样一个公式

y ~ pred1 + pred2 + pred3 + pred1:pred3 + pred1:pred2
或同等品

y ~ pred1*pred2*pred3 - pred2:pred3
后者表明我们包含了一些可能的交互,但不是全部(我们省略了
pred2:pred3

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


另外,我不认为statsmodels包含适合这种受限型号的方法,不。这将是一个很好的功能要求。

我可以问一下如何减去一个数字吗?例如,我有以下“smf.ols(formula=“y~x+1”,data=df).fit()”。当我运行这个时,我会得到一个错误,但是当我排除1时,它会工作。。