1

欠測値のある不均衡な四半期パネルデータセットがあります。次の四半期A2から変数を差し引きたいです。A1A2の差を取得したくないが、互いに異なる変数を減算することに注意してください。差異は、uidごとに個別に計算する必要があります。1999年第4四半期や2000年第1四半期のように年を変更することに加えて、その後に続くことを意図しています。

zooのようなパッケージは1つのインデックスしか受け取らないため、ここで時間インデックスを連結する必要があるかどうかは本当にわかりません。しかし、それはここでは問題ではありません。次にいくつかのデータ例を示します。

structure(list(uid = c(1, 1, 1, 2, 2, 3, 3, 3), tndx = c(1999.4, 
2000.1, 2000.2, 1999.4, 2000.1, 2000.1, 2000.2, 2000.3), A1 = c(2, 
2, 2, 10, 11, 1, 1, 1), A2 = c(3, 3, 3, 14, 14, 2, 100, 2)), .Names = c("uid", 
"tndx", "A1", "A2"), row.names = c(NA, -8L), class = "data.frame")

# which results in
  uid   tndx A1  A2
1   1 1999.4  2   3
2   1 2000.1  2   3
3   1 2000.2  2   3
4   2 1999.4 10  14
5   2 2000.1 11  14
6   3 2000.1  1   2
7   3 2000.2  1 100
8   3 2000.3  1   2  

個別のインデックスが必要な場合は、次の例を使用してください。

# Thx Andrie!
x2 <- data.frame(x, colsplit(x$tndx, "\\.", names=c("year", "qtr")))

これをベースで解決する良い方法はありますかreshape2plyrそれともカスタム関数を作成しますか?

一部が1回だけ発生する可能性もあることに注意してくださいuid。明らかに、その場合、遅延差を計算することはできません。それでも、それを確認してNAを作成する必要があります。

4

2 に答える 2

2

uidを使用して分割しby、単一の行の各セットを操作する関数内で、インデックスのクラスを使用しuidてzooオブジェクトを作成します。次に、時系列を、不足している中間四半期を含むすべての目的の四半期を含む空の系列とマージし、を与える計算を実行します。最後に、途中でフォームに変換します。zyearqtrzmzzdata.frame

library(zoo)
to.yearqtr <- function(x) as.yearqtr(trunc(x) + (10*(x-trunc(x))-1)/4)

DF <- do.call("rbind", by(x, x$uid, function(x) {
    # columns of x are: uid tndx A1 A2
    z <- zoo(x[c("A1", "A2")], to.yearqtr(x$tndx))
    zm <- merge(z, zoo(, seq(start(z), end(z), 1/4)))
    zz <- with(zm, cbind(zm, `A1 - A2 lag` = A1 - lag(A2, -1)))
    if (ncol(zz) <= ncol(z)) zz$`A1 - A2 lag` <- NA # append NA if col not added
    data.frame(uid = x[1, 1], tndx = time(zz), coredata(zz), check.names = FALSE)
}))

これはこれを与えます:

> DF
    uid    tndx A1 A2 result A1 - A2 lagged
1.1   1 1999 Q4  2  3     NA             NA
1.2   1 2000 Q1  2  2     NA             -1
1.3   1 2000 Q2  2  3     NA              0
2.1   2 1999 Q4  2  4     NA             NA
2.2   2 2000 Q1 NA NA     NA             NA
2.3   2 2000 Q2 NA NA     NA             NA
2.4   2 2000 Q3 NA NA     NA             NA
2.5   2 2000 Q4 NA NA     NA             NA
2.6   2 2001 Q1  3  4     NA             NA
3.1   3 2000 Q1  1  2     NA             NA
3.2   3 2000 Q2  1 NA     NA             -1
3.3   3 2000 Q3  1  2     NA             NA

編集:さらなる議論に基づいて、ソリューションを完全にやり直しました。これにより、列が追加されるだけでなく、インデックスが"yearqtr"クラスに変換され、欠落している行が追加されることに注意してください。

編集:関数のいくつかのマイナーな簡略化by

于 2011-11-10T13:58:43.320 に答える
1

「正解」が含まれていなかったため、何を作成したのか完全にはわかりませんでした。あるラグのある変数を別のラグのない変数から減算する場合は、オフセットされたインデックスを使用して減算します。(データフレームに戻すために結果を取得する場合は、結果をパディングする必要があります。

 x$A1lagA2 <- ave(x[, c("A1", "A2")], x$uid, FUN=function(z) {
            with(z, c(NA, A1[2:NROW(z)] -A2[1:(NROW(z)-1)]) ) } )[[1]]
 x
  uid   tndx A1  A2 A1lagA2
1   1 1999.4  2   3      NA
2   1 2000.1  2   3      -1
3   1 2000.2  2   3      -1
4   2 1999.4 10  14      NA
5   2 2000.1 11  14      -3
6   3 2000.1  1   2      NA
7   3 2000.2  1 100      -1
8   3 2000.3  1   2     -99

引数が複数列の場合、ave()を使用すると、煩わしい重複する余分な列が発生しますが、最初の列を取得しました。

于 2011-11-10T14:58:39.863 に答える