落后于PLM的进展

8
这是一个非常简单的问题,但我一直没有找到确定的答案,所以我想问一下。我使用 plm 包来处理面板数据。我尝试使用 lag 函数将变量向前滞后(默认情况下,获取上一时期的值,我需要下一时期的值)。我发现许多旧的文章/问题(约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.dataplm 的某些应用中替代了 pdata.frame 的文章。然而,plm.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,因为它可以自动处理多个个体间的滞后,并跳过时间序列中的空白。


我不认识那个包,但 lagstats 包中的通用程序,因此相关代码将是 plm:::lag.pseries,它可能没有编写来处理 k 的负值。 - GSee
输入 help(package=plm) 并阅读 lag.pseries 的第二个参数被分配为 "k",因此您应该尝试命名您的 'lag' 参数(而 k 将默认为 1)。 - IRTFM
DWin - 对参数进行命名(lag(df.plm$data,k=-1))会导致相同的错误。 GSee - 看起来 k 可以是任何值,但函数确实使用向量的长度,所以你可能是正确的。 - Matt
滞后向前(前导值)现已在plm的开发版本中实现(https://r-forge.r-project.org/R/?group_id=406)。 - Helix123
谢谢 Helix,这非常有用! - Matt
3个回答

3

EDIT2: 在plm CRAN版本>=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

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

0

我曾经遇到过同样的问题,在plm或其他任何包中都找不到好的解决方案。ddply看起来很诱人(例如:s5 = ddply(df, .(country,year), transform, lag=lag(df[, "value-to-lag"], lag=3))),但是对于除了一之外的滞后,我无法使我的滞后列中的NAs正确对齐。

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

在下面的函数中:

  • df 是你的数据框。该函数返回一个包含前向值的新列的 df
  • group 是你面板数据中分组变量的列名。例如,我有多个国家的纵向数据,在这里使用了 "Country.Name"。
  • x 是你想要生成滞后值的列,例如 "GDP"。
  • forwardx 是(新的)包含前向滞后值的列,例如 "GDP.next.year"。
  • lag 是未来的时间段数。例如,如果你的数据是按年间隔采集的,使用 lag=5 将把 forwardx 设置为 x 五年后的值。

.

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

考虑到这需要花费很长时间,你可能想采用不同的方法:将所有其他变量都向后滞后。

1
谢谢Katrina!有趣的方法。我已经停止使用plm来进行滞后和领先的操作了。我现在使用https://dev59.com/Umgu5IYBdhLWcg3wU1uN中的data.table方法,它运行良好且速度非常快。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接