R:避免摘要.plm

R:避免摘要.plm,r,optimization,profiling,summary,plm,R,Optimization,Profiling,Summary,Plm,我用R来进行蒙特卡罗模拟,研究面板数据估计器的性能。因为我将运行大量的测试,所以我需要从我的代码中获得至少相当好的性能 在我的10次模拟试验中使用Rprof表明,很大一部分时间花在调用summary.plm上。下面提供了RPROFSUMARY的前几行: $by.total total.time total.pct self.time self.pct "trial" 54.48 10

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

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

$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"]

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

coefficients_estimated <- coef(regression)
ses_estimated <- sqrt(diag(vcov(regression)))
我为
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()
中花费大量时间<代码>乐趣
比你展示的任何东西都要昂贵得多,而且在你展示的元素中,
r.squared()
是唯一出现在
plm:::summary.plm()
中的元素,而且似乎一点时间也不花


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

如果您想更进一步,请查看
plm::plm::plm的实际函数代码。您会注意到,在最后调用
plm:::plm.fit
之前,需要进行大量的参数检查(如果确实需要),直接跳到
plm.fit


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

只需使用
coeftest(zz)
coeftest
lmtest
包中;它将比
summary.plm

Hmmm更快地为您提供
plm
对象的系数和标准错误。首先要考虑的是将两个summary调用组合起来。我将尝试一下,看看它是否有帮助…结合两个摘要调用确实有很大帮助,但是summary.plm仍然是一个主要的工具。好的一点,遗憾的是,该函数没有从
?plm
链接到,因为我想知道@Wilduck是否可以利用一个繁重的计算核心。我放弃了草草浏览一下
plm()
的帮助。正如你所指出的,我认为看
有趣的
可能是@wilduck的最佳选择。我正计划利用并行计算,因为monte carlo的并行性令人尴尬,我认为foreach会工作得很好。你是对的,对速度的影响可以忽略不计。正如我在对这个问题的评论中所指出的,我的总结电话从减少到了一次(时间减少了约30%)。我没想到summary.plm在做什么,所以我很欣赏对未来问题的洞察。关于你关于“乐趣”的建议,我不确定“乐趣”指的是什么。我想应用一个参数,但我没有任何应用循环。。。有什么方法可以轻松找到“乐趣”是什么?无论如何,答案是可以接受的。谢谢。@Wilduck
FUN
通常是应用于数据块的函数的参数名。我们没有你的模拟代码,所以很难说什么是
FUN
,但是你使用的是
apply()
sapply()
lappy()
家族等等吗?是的,这正是我所想的。我没有在大数据块上使用apply家族的任何一个,所以它一定是其他东西。我不会让你在我用梳子仔细检查我的模拟代码之前检查它。谢谢你的帮助。
> 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 
....
> 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