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

在我的模拟的 10 次试验中使用 Rprof 表明,大部分时间都花在调用 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

我在我的代码中调用 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"]

我有一种唠叨的感觉,这是对 cpu 时间的巨大浪费,但我对 R 是如何避免调用摘要的事情知之甚少。我很感激有关此处幕后发生的事情的任何信息,或者以某种方式减少执行此操作所需的时间。

最佳答案

您只需要查看 plm:::summary.plm 内部即可了解它在做什么。当您这样做时,您会看到在模型拟合上调用 summary() 的两行代码可以替换为:

coefficients_estimated <- coef(regression)
ses_estimated <- sqrt(diag(vcov(regression)))

例如:
require(plm)
data("Produc", package = "plm")
zz <- plm(log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp,
          data = Produc, index = c("state","year"))
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
....

和我显示的 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

您并没有真正提供足够的信息(例如,您的模拟代码或 Rprof() 的完整输出)来说明这是否会有所帮助 - 当然看起来并没有在 summary() 上花费大量时间; FUN 比你展示的任何其他东西都要昂贵得多,在你展示的元素中,r.squared() 是唯一出现在 plm:::summary.plm() 中的元素,它似乎根本不需要时间。

因此,上述是否会显着加快速度还有待观察。

关于R:避免summary.plm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5616381/

10-12 20:47