0

編集:以下の回答で提供されているソリューションを実装しようとしています。

私のデータに非常によく適合するため、新しいサンプルデータを提供しています。

> head(Grunfeld, 25)
   firm year    inv  value capital
1     1 1935  317.6 3078.5     2.8
2     1 1936  391.8 4661.7    52.6
3     1 1937  410.6 5387.1   156.9
4     1 1938  257.7 2792.2   209.2
5     1 1939  330.8 4313.2   203.4
6     1 1940  461.2 4643.9   207.2
7     1 1941  512.0 4551.2   255.2
8     1 1942  448.0 3244.1   303.7
9     1 1943  499.6 4053.7   264.1
10    1 1944  547.5 4379.3   201.6
11    1 1945  561.2 4840.9   265.0
12    1 1946  688.1 4900.9   402.2
13    1 1947  568.9 3526.5   761.5
14    1 1948  529.2 3254.7   922.4
15    1 1949  555.1 3700.2  1020.1
16    1 1950  642.9 3755.6  1099.0
17    1 1951  755.9 4833.0  1207.7 
18    1 1952  891.2 4924.9  1430.5
19    1 1953 1304.4 6241.7  1777.3
20    1 1954 1486.7 5593.6  2226.3
21    2 1935  209.9 1362.4    53.8
22    2 1936  355.3 1807.1    50.5
23    2 1937  469.9 2676.3   118.1
24    2 1938  262.3 1801.9   260.2
25    2 1939  230.4 1957.3   312.7



library(plm)
data("Grunfeld", package="plm")

Grunfeld$firm <- as.factor(Grunfeld$firm)

#adding lagged variable (+1)
Grunfeld$inv.plus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus1 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-1],NA)
}

#adding lagged variable (+2)
Grunfeld$inv.plus2 <- NA
for (f in levels(Grunfeld$firm)) {
  Grunfeld[which(Grunfeld$firm == f),]$inv.plus2 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-c(1,2)],NA)
}

#adding lagged variable (-1)
Grunfeld$inv.minus1 <- NA
for (f in levels(Grunfeld$firm)) {
  Grunfeld[which(Grunfeld$firm == f),]$inv.minus1 <- c(Grunfeld[which(Grunfeld$firm == f),]NA,$inv[-1],)
}

(+1) 変数では機能しますが、(+2) または (-1) の正しいコードを導き出すことができません。私は何を間違っていますか?


私はplmパッケージを使用していますが、次のように回帰したいと思います: lm(inv(t+1) ~ inv(t) + other variables(t)) と lm("inv(t+2)" ~ inv(t) + その他の変数(t)) および lm("inv(t+3)" ~ inv(t) + その他の変数(t))

ラグ変数を両方向 (つまり、inv(t+1)、inv(t-1)) に最長 3 年間追加する便利な方法はありますか? 私のデータはバランスのとれた形式ですが、多くの「NA」. それがまだバランスの取れたパネルと見なされているかどうかはわかりません. パッケージや数式はありますか? よろしくお願いします.

編集:以下の回答と同じことを試みました:

dd$earnings.plus1 <- c(dd$earnings[-1], NA)
dd$earnings.plus2 <- c(dd$earnings[-c(1:2)], NA, NA)

しかし、代わりに dd$earnings.minus1 を定義しようとしています

z<- nrows(set)
dd$earnings.minus1 <- c(NA, dd$earnings[-z])

しかし、会社 1 の最後の値が会社 2 に移動されるため、適切に機能していません。これは、上記のソリューションでは発生しないようです。ここの違いは何ですか?

4

2 に答える 2

0

これを達成する1つの方法tは、各行が特定の時間であり(質問に基づいているようです)、行間の差が同じである(そして正確にあなたが望むラグ、再びあなたの質問に基づいているようです)。

あなたのデータを考えると、次のようなものです

 dd$earnings.plus1 <- c(dd$earnings[-1], NA)
 dd$earnings.plus2 <- c(dd$earnings[-c(1:2)], NA, NA)
 # ...etc

lm次に、適切な行数でデータをトリミングします。

 lm(earnings.plus1 ~ earnings + year + firm, data=head(dd,-1))
 lm(earnings.plus2 ~ earnings + year + firm, data=head(dd,-2))
 # ...etc

明らかに、実装をより一般的にすることもできますが (たとえば、 を使用するembed)、小規模で繰り返しのない分析の場合は、コピー、貼り付け、調整のアプローチでおそらく十分です。

編集:

ですから、私の悪い点: プラス シフトでなぜそれが起こらないのかはわかりませんが、そうあるべきです。データが他のさまざまなパラメーターでスライスされているという事実を無視しました。実際には、おそらく のような列がありますemployee_id。これらの時間差のある変数 (または編集した別の変数) を作成する前に、データをサブセット化して、関連する項目のみが遅れるようにする必要があります。

サブセット化をしっかりと行うために私がしたことは次のとおりです。

dd$firm <- as.factor(dd$firm)
dd$earnings.plus1 <- NA
for (f in levels(dd$firm)) {
  dd[which(dd$firm == f),]$earnings.plus1 <- c(dd[which(dd$firm == f),]$earnings[-1],NA)
}

.plus2などの他のスライスを追加できます。

于 2014-07-11T19:44:53.487 に答える
0

carl のおかげで、パネル データの両方向にラグ変数を追加するためのコードを導き出すことができました。

library(plm)
data("Grunfeld", package="plm")

Grunfeld$firm <- as.factor(Grunfeld$firm)



#adding lagged variable (+1)
Grunfeld$inv.plus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus1 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-1],NA)
}

#adding lagged variable (+2)
Grunfeld$inv.plus2 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus2 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-c(1,2)],NA, NA)
}


#adding lagged variable (-1)
Grunfeld$inv.minus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.minus1 <- c(NA,Grunfeld[which(Grunfeld$firm == f),]$inv[-nrow(Grunfeld[which(Grunfeld$firm == f),])])
}

かなり単純なタスクに多くのコードが必要なため、より簡単な方法があれば教えてください。しかし、私が判断するのは誰ですか :D

于 2014-07-15T09:10:28.610 に答える