我正在尝试在Python中运行回归,但是这花了很长时间并且停止运行。在Stata中,它可以工作,仅需几秒钟。
这是由于分类列,包括组固定效应。如果没有该变量,Stata和Python的性能将相当相等,对于200,000个观察值,大约需要1秒:
代码库
reg income height Number_children
程式码Python
model = smf.ols(income ~ height + Number_children, data=humans).fit()
添加虚拟对象后,我将Stata代码更改为areg:
areg income height Number_children, absorb(Village)
比没有假人只需要1-2秒。
在Python中:
model = smf.ols(income ~ height + Number_children + Village, data=humans).fit()
哪里:
Name: Village, dtype: category
Categories (3678, object):
等待2分钟后,我停止了回归。有什么想法可以使代码运行,并将速度提高到几乎与Stata一样快吗?问题更多是由变量还是由回归命令引起的?
编辑:
根据Dimitriy的回答,我尝试了所有变量:
例如:
humans["income_gr_m"]= humans["income"].groupby(humans['Village']).mean()
humans["income_star"] = humans["income"] - humans["income_gr_m"] + humans["income"].mean()
但是,这也使Python至少可以工作2分钟(我又停了下来)。还是应该以不同的方式执行转换?谢谢
解决方案
areg实际上并没有像使用Python那样使用3677个村庄指标来反转该矩阵。它正在以某种方式转换数据,从而消除了这样做的需要,因此它将更快。这也是为什么regress村庄areg等待者的常数from与村庄的常数不匹配的原因,但是如果等待Python完成,则斜率系数应该相同。
这是areg用来计算系数的方法regress。由于我不对5种吸收的效果进行自由度调整,因此标准误差将太大,但是下面将通过乘以SE来循环地手动进行调整:
. sysuse auto, clear
(1978 Automobile Data)
. drop if missing(rep78)
(5 observations deleted)
. /* (1) transform the data by subtracting the group specific mean and */
. /* adding the grand/overall mean back in for outcome and regressors */
. foreach var of varlist price weight length foreign {
2. bys rep78: egen group_mean = mean(`var')
3. qui sum `var'
4. gen double `var'_star = `var' - group_mean + r(mean)
5. drop group_mean
6. }
. /* (2) Fit the model on transformed data */
. regress price_star weight_star length_star foreign_star
Source | SS df MS Number of obs = 69
-------------+---------------------------------- F(3, 65) = 26.99
Model | 315296838 3 105098946 Prob > F = 0.0000
Residual | 253139578 65 3894455.05 R-squared = 0.5547
-------------+---------------------------------- Adj R-squared = 0.5341
Total | 568436416 68 8359359.06 Root MSE = 1973.4
------------------------------------------------------------------------------
price_star | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight_star | 6.15521 1.008605 6.10 0.000 4.140885 8.169534
length_star | -100.9268 33.82508 -2.98 0.004 -168.4801 -33.37341
foreign_star | 3394.052 782.454 4.34 0.000 1831.383 4956.72
_cons | 5453.782 3829.487 1.42 0.159 -2194.232 13101.8
------------------------------------------------------------------------------
. /* (3) Adjust the SEs for DoF */
. foreach coef in weight_star length_star foreign_star _cons {
2. di "Adjusted SE for `coef': " %9.8gc _se[`coef']*sqrt(65/61)
3. }
Adjusted SE for weight_star: 1.041149
Adjusted SE for length_star: 34.91649
Adjusted SE for foreign_star: 807.7009
Adjusted SE for _cons: 3953.05
. /* (4) Make sure areg gives the same output */
. areg price weight length foreign, absorb(rep78)
Linear regression, absorbing indicators Number of obs = 69
F( 3, 61) = 25.33
Prob > F = 0.0000
R-squared = 0.5611
Adj R-squared = 0.5108
Root MSE = 2037.1129
------------------------------------------------------------------------------
price | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | 6.15521 1.041149 5.91 0.000 4.073303 8.237116
length | -100.9268 34.91649 -2.89 0.005 -170.7466 -31.10692
foreign | 3394.052 807.7009 4.20 0.000 1778.954 5009.149
_cons | 5453.782 3953.05 1.38 0.173 -2450.831 13358.39
-------------+----------------------------------------------------------------
rep78 | F(4, 61) = 0.261 0.902 (5 categories)
Stata代码:
cls
sysuse auto, clear
drop if missing(rep78)
/* (1) transform the data by subtracting the group specific mean and */
/* adding the grand/overall mean back in for outcome and regressors */
foreach var of varlist price weight length foreign {
bys rep78: egen group_mean = mean(`var')
qui sum `var'
gen double `var'_star = `var' - group_mean + r(mean)
drop group_mean
}
/* (2) Fit the model on transformed data */
regress price_star weight_star length_star foreign_star
/* (3) Adjust the SEs for DoF */
foreach coef in weight_star length_star foreign_star _cons {
di "Adjusted SE for `coef': " %9.8gc _se[`coef']*sqrt(65/61)
}
/* (4) Make sure areg gives the same output */
areg price weight length foreign, absorb(rep78)
Python vs Stata:固定效应回归速度对比
在处理包含组固定效应的回归时,发现在Python中运行回归比在Stata中耗时更长。当没有分类列时,两者速度相近。在Python中添加虚拟变量后,回归耗时超过2分钟,而Stata的`areg`命令只需1-2秒。文章探讨了可能的优化方法并提供了Stata的`areg`命令与Python的对比,以解释其速度优势。
4902

被折叠的 条评论
为什么被折叠?



