一阶差异面板数据取决于额外变量R

时间:2018-12-10 08:49:06

标签: r plm

我有一个如下的面板数据集

ID     Model    Month    Country      Activations  avg_price
1      VW Golf  2012-01  NL              23           5000
1      VW Golf  2012-02  NL              2            5500
1      VW Golf  2012-01  FR              8            6000
1      VW Golf  2012-02  FR              34           7000
2      Audi TT  2012-01  NL              8            6900

现在,我想对Activationsavg_price变量采取第一个区别。我使用diff(data$Activations)包中的plm函数执行此操作,但是首先我必须使用pdata.frame(data)转换数据帧。所以:

data_fd = pdata.frame(data)
data_fd$Activations = diff(data_fdactivations)

这将使用上面的数据返回以下错误:duplicate couples (id-time) in resulting pdata.frame。这是因为我拥有不同国家/地区的数据,并且当我汇总所有国家/地区的数据时(所以总计Activationsavg_price,并且只有一个id-month组合),可以正常工作。但是,我现在也想使用Country变量来取得第一个差异。

然后,我的数据框应如下所示:

 ID     Model    Month    Country      Activations  avg_price
 1      VW Golf  2012-01  NL              NA           NA
 1      VW Golf  2012-02  NL             -21           500
 1      VW Golf  2012-01  FR              NA           NA
 1      VW Golf  2012-02  FR              26           1000
 etc

有人知道我该怎么做吗?

1 个答案:

答案 0 :(得分:0)

看看,这是你想要的吗?

lag_new <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L), Model = structure(c(2L, 
                                                                          2L, 2L, 2L, 1L), .Label = c("Audi TT", "VW Golf"), class = "factor"), 
                          Month = structure(c(1L, 2L, 1L, 2L, 1L), .Label = c("2012-01", 
                                                                              "2012-02"), class = "factor"), Country = structure(c(2L, 
                                                                                                                                   2L, 1L, 1L, 2L), .Label = c("FR", "NL"), class = "factor"), 
                          Activations = c(23L, 2L, 8L, 34L, 8L), avg_price = c(5000L, 
                                                                               5500L, 6000L, 7000L, 6900L), Activations_new = c(NA, -21L, 
                                                                                                                                6L, 26L, -26L), avg_price_new = c(NA, 500L, 500L, 1000L, 
                                                                                                                                                                  -100L)), row.names = c(NA, -5L), class = "data.frame")

lag_new$Activations_new <- lag_new$Activations-lag(lag_new$Activations)
lag_new$avg_price_new <- lag_new$avg_price-lag(lag_new$avg_price)