我正在进行回归分析,我的观察是在公司层面。我想控制公司的类型[它生产什么]。我将这些信息保存在一个对象变量中,将其分类,然后从中获取虚拟变量。
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变量视为绝对变量...类似的东西吗?
答案 0 :(得分:2)
使用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')
答案 1 :(得分:2)
类似的想法,例如使用filter
sm.OLS(endog=df['Y'],
exog=df.filter(regex=r'X1|X2|Number|Product'),
missing='drop')
答案 2 :(得分:1)
使用statsmodels.formula.api
不需要自己生成虚拟对象。从列名称中删除空格,并使用C(col_name)
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
==============================================================================
请注意,自products
创建完整基础以来,使用公式api会自动删除其中一个类别,因为我们具有拦截功能,类似于您在stata中会找到的类别。