无法弄清楚如何有条件地滞后变量

时间:2014-11-11 02:50:34

标签: r

我在创建一个滞后变量时遇到问题,该变量在两种不同的条件下重置:1)是否有战争开始(1或0); 2)一个国家是否转换。

以下是示例数据(EDITED):

   year wartype war_onset country neighborWar
1  1970    <NA>         0      US           1
2  1971    <NA>         0      US           1
3  1972    <NA>         0      US           1
4  1973    <NA>         0      US           0
5  1974   civil         1      US           0
6  1975    <NA>         0      US           1
7  1976    <NA>         0      US           0
8  1970    <NA>         0     Rus           1
9  1971    <NA>         0     Rus           1
10 1972    <NA>         0     Rus           0
11 1973   civil         1     Rus           0
12 1974    <NA>         0     Rus           1
13 1975    <NA>         0     Rus           1
14 1976    <NA>         0     Rus           1
15 1977    <NA>         0     Rus           0

我想用上述条件在邻居战争上创建一个滞后变量,以便数据看起来像这样(EDITED):

    year wartype war_onset country neighborWar ideal_lag_behavior
 1  1970    <NA>         0      US           1                 NA
 2  1971    <NA>         0      US           1                 NA
 3  1972    <NA>         0      US           1                 NA
 4  1973    <NA>         0      US           0                  3
 5  1974   civil         1      US           0                  2
 6  1975    <NA>         0      US           1                 NA
 7  1976    <NA>         0      US           0                 NA
 8  1970    <NA>         0     Rus           1                 NA
 9  1971    <NA>         0     Rus           1                 NA
 10 1972    <NA>         0     Rus           0                 NA
 11 1973   civil         1     Rus           0                  2
 12 1974    <NA>         0     Rus           1                 NA
 13 1975    <NA>         0     Rus           1                 NA
 14 1976    <NA>         0     Rus           1                 NA
 15 1977    <NA>         0     Rus           0                  3

而不是这个(EDITED):

  > df
   year wartype war_onset country neighborWar lagged_variable
1  1970    <NA>         0      US           1              NA
2  1971    <NA>         0      US           1              NA
3  1972    <NA>         0      US           1              NA
4  1973    <NA>         0      US           0               3
5  1974   civil         1      US           0               2
6  1975    <NA>         0      US           1               2
7  1976    <NA>         0      US           0               1
8  1970    <NA>         0     Rus           1               2
9  1971    <NA>         0     Rus           1               3
10 1972    <NA>         0     Rus           0               2
11 1973   civil         1     Rus           0               2
12 1974    <NA>         0     Rus           1               2
13 1975    <NA>         0     Rus           1               2 
14 1976    <NA>         0     Rus           1               3
15 1977    <NA>         0     Rus           0               3

数据生成代码:

b <- c(1970, 1971, 1972, 1973, 1974, 1975, 1976, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977)
c <- c(NA, NA, NA, NA, "civil", NA, NA, NA, NA, NA, "civil", NA, NA, NA, NA)
d <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
s <- c("US", "US", "US", "US", "US", "US", "US", "Rus", "Rus", "Rus", "Rus", "Rus", "Rus", "Rus", "Rus")
v <- c(1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0)
v3 <- v + lag(v,1) + lag(v,2) + lag(v,3)
df <- data.frame(b,c,d,s,v,v3)
colnames(df) <-c("year", "wartype", "war_onset", "country", 
             "neighborWar", "lagged variable")

滞后变量分解:

v <- c(1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0)
lag1 <- lag(v,1)
lag2 <- lag(v,2)
lag3 <- lag(v,3)
lags_plus_v <- v + lag(v,1) + lag(v,2) + lag(v,3)
df <- data.frame(v, lag1, lag2, lag3, lags_plus_v)
df

  v lag1 lag2 lag3 lags_plus_v
1  1   NA   NA   NA          NA
2  1    1   NA   NA          NA
3  1    1    1   NA          NA
4  0    1    1    1           3
5  0    0    1    1           2
6  1    0    0    1           2
7  0    1    0    0           1
8  1    0    1    0           2
9  1    1    0    1           3
10 0    1    1    0           2
11 0    0    1    1           2
12 1    0    0    1           2
13 1    1    0    0           2
14 1    1    1    0           3
15 0    1    1    1           3

任何想法。我没有。

我已经尝试过plm包,无法找出任何解决方案。我一直在慢慢地攻击Hadley Wickham的书籍Advanced R,以获得关于产生功能的想法,但还没有把2和2放在一起。

1 个答案:

答案 0 :(得分:2)

我认为这会产生你想要的东西,但要弄清楚这一点有点棘手。请在未来的问题中尝试更明确地说明所需的行为(及其推理)。

重点是从war_onset创建(滞后)分组变量。

我按country和新生成的变量x对数据进行分组。 x等于累计总和war_onset的第一个滞后。我将添加一个包含x变量的示例数据版本,以显示它的外观。然后,基于样本中的描述容易地计算其余部分 - 它是neighborWar和同一变量的前3个滞后的总和。只要NA的任何滞后也是NA,值为neighborWar

require(dplyr)
df %>%
  group_by(country, x = lag(cumsum(war_onset), 1, default = 0)) %>%
  mutate(lagged_variable = neighborWar + lag(neighborWar,1) + lag(neighborWar,2) + lag(neighborWar,3)) %>%
  ungroup() %>% select(-x)

#Source: local data frame [15 x 6]
#
#   year wartype war_onset country neighborWar lagged_variable
#1  1970    <NA>         0      US           1              NA
#2  1971    <NA>         0      US           1              NA
#3  1972    <NA>         0      US           1              NA
#4  1973    <NA>         0      US           0               3
#5  1974   civil         1      US           0               2
#6  1975    <NA>         0      US           1              NA
#7  1976    <NA>         0      US           0              NA
#8  1970    <NA>         0     Rus           1              NA
#9  1971    <NA>         0     Rus           1              NA
#10 1972    <NA>         0     Rus           0              NA
#11 1973   civil         1     Rus           0               2
#12 1974    <NA>         0     Rus           1              NA
#13 1975    <NA>         0     Rus           1              NA
#14 1976    <NA>         0     Rus           1              NA
#15 1977    <NA>         0     Rus           0               3

为了演示分组变量x和lagWar的滞后,这里有一个显示所有列的示例:

df %>%
  group_by(country, x = lag(cumsum(war_onset), 1, default = 0)) %>%
  mutate(lag1 =  lag(neighborWar,1),
         lag2 =  lag(neighborWar,2),
         lag3 =  lag(neighborWar,3),
         lagged_variable = neighborWar + lag1 + lag2 + lag3)

#Source: local data frame [15 x 10]
#Groups: country, x
#
#   year wartype war_onset country neighborWar x lag1 lag2 lag3 lagged_variable
#1  1970    <NA>         0      US           1 0   NA   NA   NA              NA
#2  1971    <NA>         0      US           1 0    1   NA   NA              NA
#3  1972    <NA>         0      US           1 0    1    1   NA              NA
#4  1973    <NA>         0      US           0 0    1    1    1               3
#5  1974   civil         1      US           0 0    0    1    1               2
#6  1975    <NA>         0      US           1 1   NA   NA   NA              NA
#7  1976    <NA>         0      US           0 1    1   NA   NA              NA
#8  1970    <NA>         0     Rus           1 1   NA   NA   NA              NA
#9  1971    <NA>         0     Rus           1 1    1   NA   NA              NA
#10 1972    <NA>         0     Rus           0 1    1    1   NA              NA
#11 1973   civil         1     Rus           0 1    0    1    1               2
#12 1974    <NA>         0     Rus           1 2   NA   NA   NA              NA
#13 1975    <NA>         0     Rus           1 2    1   NA   NA              NA
#14 1976    <NA>         0     Rus           1 2    1    1   NA              NA
#15 1977    <NA>         0     Rus           0 2    1    1    1               3