R:避免summary.plm

Wil*_*uck 7 optimization profiling r summary plm

我正在使用R来运行蒙特卡罗模拟,研究面板数据估计器的性能.因为我将进行大量的试验,所以我需要从我的代码中获得至少不错的性能.

Rprof在我的模拟的10次试验中使用表明,很大一部分时间花在了呼叫上summary.plm.前几行Rprofsummary提供如下:

$by.total
                            total.time total.pct self.time self.pct
"trial"                          54.48     100.0      0.00      0.0
"coefs"                          53.90      98.9      0.06      0.1
"model.matrix"                   36.72      67.4      0.10      0.2
"model.matrix.pFormula"          35.98      66.0      0.06      0.1
"summary"                        33.82      62.1      0.00      0.0
"summary.plm"                    33.80      62.0      0.08      0.1
"r.squared"                      29.00      53.2      0.02      0.0
"FUN"                            24.84      45.6      7.52     13.8
Run Code Online (Sandbox Code Playgroud)

我正在调用summary我的代码,因为我需要得到系数估计的标准误差以及系数本身(我可以从plm对象得到).我的电话看起来像

regression <- plm(g ~ y0 + Xit, data=panel_data, model=model, index=c("country","period"))

coefficients_estimated <- summary(regression)$coefficients[,"Estimate"]
ses_estimated <- summary(regression)$coefficients[,"Std. Error"]
Run Code Online (Sandbox Code Playgroud)

我有一种唠叨的感觉,这是一个巨大的浪费cpu时间,但我不知道R如何做的事情,以避免调用摘要.我很欣赏有关幕后发生的事情的任何信息,或者某些方法可以减少这种情况.

Rei*_*son 6

你只需要向内plm:::summary.plm看看它在做什么.当你这样做时,你会看到你的两条线调用summary()你的模型适合可以替换为:

coefficients_estimated <- coef(regression)
ses_estimated <- sqrt(diag(vcov(regression)))
Run Code Online (Sandbox Code Playgroud)

例如:

require(plm)
data("Produc", package = "plm")
zz <- plm(log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp, 
          data = Produc, index = c("state","year"))
Run Code Online (Sandbox Code Playgroud)

summary(zz) 得到:

> summary(zz)
Oneway (individual) effect Within Model

....

Coefficients :
             Estimate  Std. Error t-value  Pr(>|t|)    
log(pcap) -0.02614965  0.02900158 -0.9017    0.3675    
log(pc)    0.29200693  0.02511967 11.6246 < 2.2e-16 ***
log(emp)   0.76815947  0.03009174 25.5273 < 2.2e-16 ***
unemp     -0.00529774  0.00098873 -5.3582 1.114e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
....
Run Code Online (Sandbox Code Playgroud)

我展示的两行返回zz:

> coef(zz)
   log(pcap)      log(pc)     log(emp)        unemp 
-0.026149654  0.292006925  0.768159473 -0.005297741 
> sqrt(diag(vcov(zz)))
   log(pcap)      log(pc)     log(emp)        unemp 
0.0290015755 0.0251196728 0.0300917394 0.0009887257
Run Code Online (Sandbox Code Playgroud)

你没有真正提供足够的信息(例如你的模拟代码或完整的输出Rprof())来说明这是否有用- 它肯定看起来不会花费大量的时间summary(); FUN远远高于其他任何你展现更加昂贵,而且你做节目的元素,r.squared()是出现在唯一的一个plm:::summary.plm(),它似乎采取任何时候都.

因此,上述速度是否明显加快仍有待观察.