这是一个非常简单的问题,但我还没有找到一个明确的答案,所以我想我会问它。我使用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.data已经在plm中的一些应用程序中取代了pdata.frame。然而,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,因为它可以自动处理多个个体之间的滞后,并跳过时间序列中的间隙。
发布于 2015-08-19 06:44:23
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发布于 2020-09-02 05:04:50
CRAN中的折叠包有一个基于C++的函数flag,以及相关的滞后/领先运算符L和F。它支持连续的滞后/前导序列(正负n值),以及pseries和pdata.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发布于 2013-10-16 03:16:51
我也遇到了同样的问题,在plm或其他包中找不到好的解决方案。ddply很诱人(例如s5 = ddply(df, .(country,year), transform, lag=lag(df[, "value-to-lag"], lag=3))),但是我不能让我的滞后列中的NAs正确地排成一列,而不是1。
我编写了一个强力解决方案,它逐行迭代数据帧,并用适当的值填充滞后列。它慢得可怕(我的13000x130数据帧需要437.33秒,而将它变成pdata.frame并使用lag只需要0.012秒),但它为我完成了这项工作。我想我会在这里分享它,因为我在互联网上找不到太多的信息。
在下面的函数中:
df是您的数据帧。此函数返回包含正向values.group的新列的df,该列是面板数据的分组变量的列名。例如,我有多个国家的纵向数据,并且我使用了"Country.Name“here.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数据集的示例输出。这在dataset的上下文中没有意义,但它可以让您看到列的作用。
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考虑到这需要多长时间,你可能想要使用一种不同的方法:向后-滞后所有其他变量。
https://stackoverflow.com/questions/13037389
复制相似问题