7

我正在使用 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

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 是如何避免调用摘要的了解不够。我会很感激有关这里幕后发生的事情的任何信息,或者以某种方式减少执行此操作所需的时间。

4

3 回答 3

6

你只需要看看里面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(),而且似乎根本不需要时间。

因此,上述是否可以明显加快速度还有待观察。

于 2011-04-11T07:37:47.313 回答
2

如果您想更进一步,请查看实际的函数代码plm:::plmYou 会注意到有很多参数检查,在最终调用plm:::plm.fitYou 之前(如果真的需要),直接跳到plm.fit.

最后一点。您提到您的问题是蒙特卡洛模拟。您可以利用并行计算来提高速度吗?

于 2011-04-11T08:11:26.980 回答
2

只需使用coeftest(zz). coeftestlmtest包装中;它会plmsummary.plm.

于 2012-03-04T21:55:47.677 回答