8

这是一个非常简单的问题,但我一直无法找到明确的答案,所以我想我会问它。我使用plm包来处理面板数据。我正在尝试使用该lag函数来及时滞后变量 FORWARD(默认是检索上一时期的值,我想要来自 NEXT 的值)。我发现了一些旧文章/问题(大约 2009 年)表明这可以通过k=-1用作参数来实现。但是,当我尝试这样做时,我得到一个错误。

示例代码:

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.frameplm. 但是,plm.data似乎根本不适用于该lag功能:

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 中实现。函数要么是要么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 回答
1

CRAN 中的 collapse 包具有基于 C++ 的函数flag以及相关的滞后/超前运算符LF. 它支持滞后/超前的连续序列(正值和负值n),以及 plm pseriespdata.frame类。性能:比 plm 快 100 倍,比 data.table 快 10 倍(撰写本文时 R 中最快的)。例子:

library(collapse)
pwlddev <- plm::pdata.frame(wlddev, index = c("iso3c", "year"))
head(flag(pwlddev$LIFEEX, -1:1))     # A sequence of lags and leads
             F1     --     L1
ABW-1960 66.074 65.662     NA
ABW-1961 66.444 66.074 65.662
ABW-1962 66.787 66.444 66.074
ABW-1963 67.113 66.787 66.444
ABW-1964 67.435 67.113 66.787
ABW-1965 67.762 67.435 67.113

head(L(pwlddev$LIFEEX, -1:1))        # Same as above
head(L(pwlddev, -1:1, cols = 9:12))  # Computing on columns 9 through 12
         iso3c year F1.PCGDP PCGDP L1.PCGDP F1.LIFEEX LIFEEX L1.LIFEEX F1.GINI GINI L1.GINI
ABW-1960   ABW 1960       NA    NA       NA    66.074 65.662        NA      NA   NA      NA
ABW-1961   ABW 1961       NA    NA       NA    66.444 66.074    65.662      NA   NA      NA
ABW-1962   ABW 1962       NA    NA       NA    66.787 66.444    66.074      NA   NA      NA
ABW-1963   ABW 1963       NA    NA       NA    67.113 66.787    66.444      NA   NA      NA
ABW-1964   ABW 1964       NA    NA       NA    67.435 67.113    66.787      NA   NA      NA
ABW-1965   ABW 1965       NA    NA       NA    67.762 67.435    67.113      NA   NA      NA
         F1.ODA ODA L1.ODA
ABW-1960     NA  NA     NA
ABW-1961     NA  NA     NA
ABW-1962     NA  NA     NA
ABW-1963     NA  NA     NA
ABW-1964     NA  NA     NA
ABW-1965     NA  NA     NA


library(microbenchmark)
library(data.table)
microbenchmark(plm_class = flag(pwlddev), 
               ad_hoc = flag(wlddev, g = wlddev$iso3c, t = wlddev$year), 
               data.table = qDT(wlddev)[, shift(.SD), by = iso3c]) 

Unit: microseconds
       expr      min        lq      mean   median         uq      max neval cld
  plm_class  462.313  512.5145  1044.839  551.562   637.6875 15913.17   100  a 
     ad_hoc  443.124  519.6550  1127.363  559.817   701.0545 34174.05   100  a 
 data.table 7477.316 8070.3785 10126.471 8682.184 10397.1115 33575.18   100   b
于 2020-09-01T21:04:49.503 回答
0

plm我遇到了同样的问题,在任何其他包中都找不到好的解决方案。ddply很诱人(例如s5 = ddply(df, .(country,year), transform, lag=lag(df[, "value-to-lag"], lag=3))),但我无法让我的滞后列中的 NA 正确排列,而不是一个滞后。

我编写了一个蛮力解决方案,它逐行迭代数据帧并用适当的值填充滞后列。它非常慢(我的 13000x130 数据帧为 437.33 秒,而将其转换为 apdata.frame和 using则为 0.012 秒lag),但它为我完成了工作。我想我会在这里分享它,因为我在互联网上的其他地方找不到太多信息。

在下面的函数中:

  • df是你的数据框。该函数返回df一个包含前向值的新列。
  • group是面板数据的分组变量的列名。例如,我有多个国家的纵向数据,我在这里使用了“Country.Name”。
  • x是您要从中生成滞后值的列,例如“GDP”
  • forwardx是将包含前向滞后的(新)列,例如“GDP.next.year”。
  • lag是未来的周期数。例如,如果您的数据是按年获取的,则 usinglag=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 回答