我的观察是在公司层面进行回归。我想控制公司的类型[它产生什么]。我在一个对象变量中有这个信息,我变成了分类,然后从中获取虚拟变量。
df['Product Type'] = df['Product Type'].astype('category')
df = pd.get_dummies(df, columns=['Product Type']).head()
我的样本非常大,我最终得到了很多虚拟变量。将它们逐个引入我的模型中可能需要做很多工作(可能有10-15个)。
reg = sm.OLS(endog=df['Y'], exog= df[['X1', 'Number of workers', 'X2', "Product Type_Jewellery", "Product_Type_Apparel", (all the other product dummies) ]], missing='drop')
有没有更有效的方法来做到这一点?在stata中,我使用了前缀i.Product_Type,它会向软件发出信号,表明String变量必须被视为一个类别......类似的东西?
使用str.contains
查找包含“Product_ *”的列,访问它们变得很容易。
c = df.columns[df.columns.str.contains('Product')]
如果不需要正则表达式,则可以将c
初始化为
c = df.columns[df.columns.str.contains('Product', regex=False)]
或者,使用str.startswith
:
c = df.columns[df.columns.str.startswith('Product')]
或者,列表理解:
c = [c_ for c_ in df if c_.startswith('Product')]
最后,通过解压缩c
来访问子集:
subset = df[['X1', 'Number of workers', 'X2', *c]]
reg = sm.OLS(endog=df['Y'], exog=subset, missing='drop')
同样的想法,就像使用filter
提供的冷
sm.OLS(endog=df['Y'],
exog=df.filter(regex=r'X1|X2|Number|Product'),
missing='drop')
使用statsmodels.formula.api
你不需要自己生成假人。从列名中删除空格,并使用C(col_name)
引用Categorical列
import statsmodels.formula.api as smf
df = df.rename(columns={'Product Type': 'Product_Type',
'Number of workers': 'Number_of_workers'})
results = smf.ols(formula = 'Y ~ X1 + X2 + Number_of_workers + C(Product_Type)',
data=df, missing='drop').fit()
样本数据
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'Y': np.random.randint(1,100,200),
'X1': np.random.normal(1,20,200),
'X2': np.random.normal(-10,1,200),
'Number of workers': np.arange(1,201,1)/10,
'Product Type': np.random.choice(list('abcde'), 200)})
results.summary()
的输出
========================================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------------------------------
Intercept 69.2836 23.105 2.999 0.003 23.711 114.856
C(Product_Type)[T.b] 11.3334 6.941 1.633 0.104 -2.356 25.023
C(Product_Type)[T.c] 1.3745 6.943 0.198 0.843 -12.321 15.070
C(Product_Type)[T.d] 2.0430 6.258 0.326 0.744 -10.300 14.386
C(Product_Type)[T.e] 3.8445 6.273 0.613 0.541 -8.528 16.217
X1 0.0207 0.113 0.184 0.854 -0.202 0.243
X2 1.4677 2.177 0.674 0.501 -2.825 5.761
Number_of_workers -0.5803 0.369 -1.573 0.117 -1.308 0.147
==============================================================================
注意,使用公式api,因为你的products
创建了一个完整的基础,它将自动删除其中一个类别,因为我们有拦截,类似于你在stata中找到的。