首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:避免summary.plm

R:避免summary.plm
EN

Stack Overflow用户
提问于 2011-04-11 10:59:51
回答 3查看 1.2K关注 0票数 7

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

在我的模拟的10次试验中,使用Rprof显示有很大一部分时间花在对summary.plm的调用上。下面提供了Rprofsummary的前几行代码:

代码语言:javascript
复制
$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对象中获得)。我的电话看起来像

代码语言:javascript
复制
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是如何做事情的,以避免调用summary。我非常感谢任何关于这里幕后正在发生的事情的信息,或者一些减少执行所需时间的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-11 15:37:47

您只需查看plm:::summary.plm内部,看看它在做什么。执行此操作时,您将看到在模型fit上调用summary()的两行代码可以替换为:

代码语言:javascript
复制
coefficients_estimated <- coef(regression)
ses_estimated <- sqrt(diag(vcov(regression)))

例如:

代码语言:javascript
复制
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)提供了:

代码语言:javascript
复制
> 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的return

代码语言:javascript
复制
> 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()中的元素,而且它似乎根本不占用时间。

因此,上述方法是否能显著提高速度还有待观察。

票数 6
EN

Stack Overflow用户

发布于 2011-04-11 16:11:27

如果你想更进一步,那么看看plm:::plm的实际函数代码,你会注意到有很多参数检查,在最后调用plm:::plm.fit之前,你可以(如果真的想要的话),直接跳到plm.fit

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-05 05:55:48

只需使用coeftest(zz)即可。coeftestlmtest包中;它将比summary.plm更快地提供来自plm对象的系数和标准误差。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5616381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档