我使用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是如何做事情的,以避免调用summary。我非常感谢任何关于这里幕后正在发生的事情的信息,或者一些减少执行所需时间的方法。
发布于 2011-04-11 15:37:47
您只需查看plm:::summary.plm内部,看看它在做什么。执行此操作时,您将看到在模型fit上调用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的return
> 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-11 16:11:27
如果你想更进一步,那么看看plm:::plm的实际函数代码,你会注意到有很多参数检查,在最后调用plm:::plm.fit之前,你可以(如果真的想要的话),直接跳到plm.fit。
最后一点。你提到你的问题是蒙特卡洛模拟。你能利用并行计算来提高你的速度吗?
发布于 2012-03-05 05:55:48
只需使用coeftest(zz)即可。coeftest在lmtest包中;它将比summary.plm更快地提供来自plm对象的系数和标准误差。
https://stackoverflow.com/questions/5616381
复制相似问题