首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >plm中的滞后

plm中的滞后
EN

Stack Overflow用户
提问于 2012-10-24 03:03:50
回答 3查看 5.5K关注 0票数 8

这是一个非常简单的问题,但我还没有找到一个明确的答案,所以我想我会问它。我使用plm包来处理面板数据。我正在尝试使用lag函数在时间上延迟一个变量(默认值是检索上一段时间的值,我想要下一段时间的值)。我发现许多旧的文章/问题(大约2009年)表明,通过使用k=-1作为参数,这是可能的。然而,当我尝试这样做时,我得到了一个错误。

示例代码:

代码语言:javascript
复制
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"))

滞后:

代码语言:javascript
复制
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函数一起工作:

代码语言:javascript
复制
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,因为它可以自动处理多个个体之间的滞后,并跳过时间序列中的间隙。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-19 06:44:23

EDIT2:在plm CRAN版本>= 1.6-4中实现了滞后向前(=前导值)。函数可以是lead()lag() (后者的前导值为负整数)。

注意使用相同函数名的任何其他附加包。当然,您可以使用完整的名称空间来引用函数,例如plm::lead

来自?plm::lead的示例

代码语言:javascript
复制
# 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
票数 3
EN

Stack Overflow用户

发布于 2020-09-02 05:04:50

CRAN中的折叠包有一个基于C++的函数flag,以及相关的滞后/领先运算符LF。它支持连续的滞后/前导序列(正负n值),以及pseries和pdata.frame类。性能:比plm快100倍,比data.table快10倍(在写这篇文章时是R中最快的)。示例:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 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的值。

代码语言:javascript
复制
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的上下文中没有意义,但它可以让您看到列的作用。

代码语言:javascript
复制
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

考虑到这需要多长时间,你可能想要使用一种不同的方法:向后-滞后所有其他变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13037389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档