7

私は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がどのように処理するかについては十分にわかりません。ここで舞台裏で何が起こっているのか、またはこれが実行されるのにかかる時間を短縮するための何らかの方法についての情報をいただければ幸いです。

4

3 に答える 3

6

あなたplm:::summary.plmはそれが何をしているのかを見るために中を見る必要があります。そうすると、モデルの適合を求める2つの線を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 
....

そして私が示した2行は次のように戻り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

さらに詳しく知りたい場合は、実際の関数コードを見てください。Youへの最後の呼び出し(本当に必要な場合)plm:::plmの前に、引数チェックがたくさんあることに気付くでしょう。plm:::plm.fitplm.fit

最後にもう1つ。あなたはあなたの問題がモンテカルロシミュレーションであると言います。並列コンピューティングを活用して速度を上げることができますか?

于 2011-04-11T08:11:26.980 に答える
2

を使用するだけcoeftest(zz)です。 パッケージcoeftestに含まれています。それはあなたにオブジェクトからの係数と標準誤差をはるかに速くlmtest与えるでしょう。plmsummary.plm

于 2012-03-04T21:55:47.677 に答える