8

これは非常に単純な質問ですが、決定的な答えを見つけることができなかったので、質問しようと思いました。plmパネルデータを扱うためにパッケージを使用します。関数を使用してlag、変数 FORWARD を時間的に遅らせようとしています (デフォルトでは、前の期間から値を取得するため、NEXT から値が必要です)。k=-1引数として使用することでこれが可能であることを示唆する古い記事/質問 (2009 年頃) をいくつか見つけました。ただし、これを試みると、エラーが発生します。

サンプルコード:

library(plm)
df<-as.data.frame(matrix(c(1,1,1,2,2,3,20101231,20111231,20121231,20111231,20121231,20121231,50,60,70,120,130,210),nrow=6,ncol=3))
names(df)<-c("individual","date","data")
df$date<-as.Date(as.character(df$date),format="%Y%m%d")
df.plm<-pdata.frame(df,index=c("individual","date"))

遅れ:

lag(df.plm$data,0)
##returns
1-2010-12-31 1-2011-12-31 1-2012-12-31 2-2011-12-31 2-2012-12-31 3-2012-12-31 
         50           60           70          120          130          210

lag(df.plm$data,1)
##returns
1-2010-12-31 1-2011-12-31 1-2012-12-31 2-2011-12-31 2-2012-12-31 3-2012-12-31 
         NA           50           60           NA          120           NA

lag(df.plm$data,-1)
##returns
Error in rep(1, ak) : invalid 'times' argument

また、 の一部のアプリケーションでplm.dataが置き換えられたことも読みました。ただし、関数ではまったく機能しないようです:pdata.frameplmplm.datalag

df.plm<-plm.data(df,indexes=c("individual","date"))
lag(df.plm$data,1)
##returns
[1]  50  60  70 120 130 210
attr(,"tsp")
[1] 0 5 1

助けていただければ幸いです。遅延に使用するパッケージについて別の提案があれば、私はすべて耳にします。plmただし、複数の個人にわたる遅れを自動的に処理し、時系列のギャップをスキップするため、私は気に入っています。

4

3 に答える 3

3

EDIT2 : 前方への遅れ (=先行値) は、plmCRAN リリース >= 1.6-4 で実装されています。関数は or のいずれlead()かですlag()(後者は先頭の値に負の整数を使用)。

同じ関数名を使用する他のパッケージが添付されている場合は注意してください。確かに、完全な名前空間で関数を参照できます (例: plm::lead.

からの例?plm::lead:

# First, create a pdata.frame
data("EmplUK", package = "plm")
Em <- pdata.frame(EmplUK)

# Then extract a series, which becomes additionally a pseries
z <- Em$output
class(z)

# compute negative lags (= leading values)
lag(z, -1)
lead(z, 1) # same as line above
identical(lead(z, 1), lag(z, -1)) # TRUE
于 2015-08-18T22:44:23.323 に答える
0

私はこれと同じ問題を抱えていて、plmまたは他のパッケージで適切な解決策を見つけることができませんでした。ddply魅力的でしたが (例: s5 = ddply(df, .(country,year), transform, lag=lag(df[, "value-to-lag"], lag=3)))、遅延列の NA を 1 以外の遅延に対して適切に並べることができませんでした。

データフレームを行ごとに反復処理し、遅延列に適切な値を入力するブルート フォース ソリューションを作成しました。それは恐ろしく遅いです(13000x130データフレームの場合は437.33秒、それをに変換しpdata.frameて使用する場合は0.012秒lag)、仕事はうまくいきました。インターネット上で他の場所で多くの情報を見つけることができなかったので、ここで共有すると思いました.

以下の関数では:

  • dfあなたのデータフレームです。この関数はdf、前方値を含む新しい列を返します。
  • groupパネル データのグループ化変数の列名です。たとえば、複数の国に関する経時的なデータがあり、ここでは「Country.Name」を使用しました。
  • x「GDP」など、ラグ値を生成する列です。
  • forwardx「GDP.next.year」など、フォワード ラグを含む (新しい) 列です。
  • lag未来への期間の数です。たとえば、データが年間隔で取得された場合、使用すると5 年後の値にlag=5設定されます。forwardxx

.

add_forward_lag <- function(df, group, x, forwardx, lag) {
for (i in 1:(nrow(df)-lag)) {
    if (as.character(df[i, group]) == as.character(df[i+lag, group])) {
        # put forward observation in forwardx
        df[i, forwardx] <- df[i+lag, x]
    }
    else {
        # end of group, no forward observation
        df[i, forwardx] <- NA
    }
}
# last elem(s) in forwardx are NA
for (j in ((nrow(df)-lag+1):nrow(df))) {
    df[j, forwardx] <- NA
}
return(df)
}

組み込みのデータセットを使用したサンプル出力を参照してくださいDNase。これはデータセットのコンテキストでは意味がありませんが、列の機能を確認できます。

require(DNase)
add_forward_lag(DNase, "Run", "density", "lagged_density",3)

Grouped Data: density ~ conc | Run
     Run    conc    density lagged_density
1     1  0.04882812   0.017  0.124
2     1  0.04882812   0.018  0.206
3     1  0.19531250   0.121  0.215
4     1  0.19531250   0.124  0.377
5     1  0.39062500   0.206  0.374
6     1  0.39062500   0.215  0.614
7     1  0.78125000   0.377  0.609
8     1  0.78125000   0.374  1.019
9     1  1.56250000   0.614  1.001
10    1  1.56250000   0.609  1.334
11    1  3.12500000   1.019  1.364
12    1  3.12500000   1.001  1.730
13    1  6.25000000   1.334  1.710
14    1  6.25000000   1.364     NA
15    1 12.50000000   1.730     NA
16    1 12.50000000   1.710     NA
17    2  0.04882812   0.045  0.123
18    2  0.04882812   0.050  0.225
19    2  0.19531250   0.137  0.207

これにかかる時間を考えると、別のアプローチを使用することをお勧めします: 他のすべての変数を後方ラグします。

于 2013-10-15T19:16:50.740 に答える