时间序列面板数据的一般滞后

Dan*_*gan 11 r time-series lag

我有一个类似于此的数据集

User    Date        Value
A       2012-01-01  4
A       2012-01-02  5   
A       2012-01-03  6
A       2012-01-04  7
B       2012-01-01  2
B       2012-01-02  3   
B       2012-01-03  4
B       2012-01-04  5
Run Code Online (Sandbox Code Playgroud)

我想创造一个Value尊重的滞后User.

User    Date        Value   Value.lag
A       2012-01-01  4       NA
A       2012-01-02  5       4
A       2012-01-03  6       5
A       2012-01-04  7       6
B       2012-01-01  2       NA
B       2012-01-02  3       2   
B       2012-01-03  4       3
B       2012-01-04  5       4
Run Code Online (Sandbox Code Playgroud)

我在循环中做得非常低效

df$value.lag1<-NA
levs<-levels(as.factor(df$User))
levs
  for (i in 1:length(levs)) {
    temper<- subset(df,User==as.numeric(levs[i]))
    temper<- rbind(NA,temper[-nrow(temper),])  
df$value.lag1[df$User==as.numeric(as.character(levs[i]))]<- temper
      }
Run Code Online (Sandbox Code Playgroud)

但这很慢.我看使用by和tapply,但没有想出如何使他们的工作.

我认为XTS或TS不会因为User元素而起作用.

有什么建议?

Vin*_*ynd 9

您可以使用ddply:它将data.frame切割成碎片并转换每个碎片.

d <- data.frame( 
  User = rep( LETTERS[1:3], each=10 ),
  Date = seq.Date( Sys.Date(), length=30, by="day" ),
  Value = rep(1:10, 3)
)
library(plyr)
d <- ddply( 
  d, .(User), transform,
  # This assumes that the data is sorted
  Value = c( NA, Value[-length(Value)] ) 
)
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为最简单的方法,尤其是考虑进行进一步分析时,是将数据框pdata.frame从plm包转换为类。

转换后 fromdiff()和lag()运算符可用于创建面板差异和滞后。

df<-pdata.frame(df,index=c("id","date"))  
df<-transform(df, l_value=lag(value,1))   
Run Code Online (Sandbox Code Playgroud)