python和stata哪个难_Python:与Stata(固定效果假人)相比,回归速度较慢

Python vs Stata:固定效应回归速度对比
在处理包含组固定效应的回归时,发现在Python中运行回归比在Stata中耗时更长。当没有分类列时,两者速度相近。在Python中添加虚拟变量后,回归耗时超过2分钟,而Stata的`areg`命令只需1-2秒。文章探讨了可能的优化方法并提供了Stata的`areg`命令与Python的对比,以解释其速度优势。

我正在尝试在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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值