为 R 中的回归创建领先和滞后年份虚拟变量

Create lead and lag year dummies for regression in R

这是一个示例数据框,其中 PRE5_id1、POST5_id1、PRE5_id2、POST5_id2 是我想要获取的变量。我正在寻找一个超前值和滞后值,它在自然死亡之前的年份 (PRE5) 和自然死亡年份之后的 5 年 (POST5) 中有五个值为 1。我不确定在创建这些 PRE 和 POST 变量时如何留在国家组中,在这种情况下,PRE 和 POST 变量仅在同一国家/地区内变为 +5 和 -5。

我计划对每个 ID 进行单独的回归(我的数据集中共有 69 例自然死亡,因此达到 ID69)并为每个回归包含 PRE5 和 POST5,类似这样: lm(gdp.growth.rate~country+year+PRE5_id1+POST5_id1) 所以如果无论如何在回归中创建这些 PRE 和 POST 假人也可以工作。

> df <- data.frame(country = rep("Angola",length(20)), year=c(1940:1959), leader = c("David", "NA", "NA", "NA","Henry","NA","Tom","NA","Chris","NA","NA","NA","NA","Alia","NA","NA","NA","NA","NA","NA"), natural.death = c(0,NA,NA,NA,0,NA,1,NA,0,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA),gdp.growth.rate=c(1:20),
+                    id1=c(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
+                  id2=c(0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0),
+                  PRE5_id1=c(0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
+                  PRE5_id2=c(0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0),
+                  POST5_id1=c(0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0),
+                  POST5_id2=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0))
> df
   country year leader natural.death gdp.growth.rate id1 id2 PRE5_id1 PRE5_id2 POST5_id1 POST5_id2
1   Angola 1940  David             0               1   0   0        0        0        0        0
2   Angola 1941     NA            NA               2   0   0        1        0        0        0
3   Angola 1942     NA            NA               3   0   0        1        0        0        0
4   Angola 1943     NA            NA               4   0   0        1        0        0        0
5   Angola 1944  Henry             0               5   0   0        1        0        0        0
6   Angola 1945     NA            NA               6   0   0        1        0        0        0
7   Angola 1946    Tom             1               7   1   0        0        0        0        0
8   Angola 1947     NA            NA               8   0   0        0        0        1        0
9   Angola 1948  Chris             0               9   0   0        0        1        1        0
10  Angola 1949     NA            NA              10   0   0        0        1        1        0
11  Angola 1950     NA            NA              11   0   0        0        1        1        0
12  Angola 1951     NA            NA              12   0   0        0        1        1        0
13  Angola 1952     NA            NA              13   0   0        0        1        0        0
14  Angola 1953   Alia             1              14   0   1        0        0        0        0
15  Angola 1954     NA            NA              15   0   0        0        0        0        1
16  Angola 1955     NA            NA              16   0   0        0        0        0        1
17  Angola 1956     NA            NA              17   0   0        0        0        0        1
18  Angola 1957     NA            NA              18   0   0        0        0        0        1
19  Angola 1958     NA            NA              19   0   0        0        0        0        1
20  Angola 1959     NA            NA              20   0   0        0        0        0        0

如有任何帮助,我们将不胜感激。谢谢!

尝试下面的答案之一并将原始 df 修改为以下内容(见下文)后,我得到以下内容 output.df(见下文):

> df <- data.frame(country=c("Angola","Angola","Angola","Angola",
+                            "Angola","Angola","Angola","Angola",
+                            "Angola","Angola","US","US","US","US",
+                            "US","US","US","US","US","US"), 
+                  year=c(1940:1949,1940:1949), 
+                  leader = c("David", "NA", "NA", "NA","Henry","NA",
+                             "Tom","NA","Chris","NA","NA","NA","NA",
+                             "Alia","NA","NA","NA","NA","NA","NA"), 
+                  natural.death = c(0,NA,NA,NA,0,NA,1,NA,0,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA),gdp.growth.rate=c(1:20),
+                    id1=c(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
+                  id2=c(0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0))

> output.df
          country year leader natural.death gdp.growth.rate id1 id2 id1.PRE
Angola.1   Angola 1940  David             0               1   0   0       0
Angola.2   Angola 1941     NA            NA               2   0   0       1
Angola.3   Angola 1942     NA            NA               3   0   0       1
Angola.4   Angola 1943     NA            NA               4   0   0       1
Angola.5   Angola 1944  Henry             0               5   0   0       1
Angola.6   Angola 1945     NA            NA               6   0   0       1
Angola.7   Angola 1946    Tom             1               7   1   0       0
Angola.8   Angola 1947     NA            NA               8   0   0       0
Angola.9   Angola 1948  Chris             0               9   0   0       0
Angola.10  Angola 1949     NA            NA              10   0   0       0
US.1           US 1940     NA            NA              11   0   0       0
US.2           US 1941     NA            NA              12   0   0       0
US.3           US 1942     NA            NA              13   0   0       0
US.4           US 1943   Alia             1              14   0   1       0
US.5           US 1944     NA            NA              15   0   0       0
US.6           US 1945     NA            NA              16   0   0       0
US.7           US 1946     NA            NA              17   0   0       0
US.8           US 1947     NA            NA              18   0   0       0
US.9           US 1948     NA            NA              19   0   0       0
US.10          US 1949     NA            NA              20   0   0       0
          id1.POST id2.PRE id2.POST
Angola.1         0       0        0
Angola.2         0       0        1
Angola.3         0       0        1
Angola.4         0       0        1
Angola.5         0       0        1
Angola.6         0       0        1
Angola.7         0       0        0
Angola.8         1       0        0
Angola.9         1       0        0
Angola.10        1       0        0
US.1             0       1        0
US.2             1       1        0
US.3             1       1        0
US.4             1       0        0
US.5             1       0        1
US.6             1       0        1
US.7             0       0        1
US.8             0       0        1
US.9             0       0        1
US.10            0       0        0

一种使用基础 R 的方法。我们创建了一个函数 generate_dummy,其中 returns 每个 "id" 列包含 PRE 和 POST 数据的两列。

generate_dummy <- function(x) {
   inds <- which(x == 1)
   if(length(inds) == 1) {
     vec <- seq_along(x)
     data.frame(PRE = +(vec > (inds - 6) & vec < (inds)),
               POST = +(vec > (inds) & vec < (inds + 6)))
     }
     else  data.frame(PRE = rep(0, length(x)),POST = rep(0, length(x)))
}


#Columns which start with id
cols <- grep("^id", names(df), value = TRUE)

为了将其应用于每个国家/地区,我们按国家/地区拆分数据并对每个国家/地区应用 generate_dummy 函数并合并结果。

output <- cbind(df, do.call(rbind, lapply(split(df, df$country), function(x) 
                       do.call(cbind, lapply(x[cols], generate_dummy)))))
row.names(output) <- NULL  

output
#   country year leader natural.death gdp.growth.rate id1 id2 id1.PRE id1.POST id2.PRE id2.POST
#1   Angola 1940  David             0               1   0   0       0        0       0        0
#2   Angola 1941     NA            NA               2   0   0       1        0       0        0
#3   Angola 1942     NA            NA               3   0   0       1        0       0        0
#4   Angola 1943     NA            NA               4   0   0       1        0       0        0
#5   Angola 1944  Henry             0               5   0   0       1        0       0        0
#6   Angola 1945     NA            NA               6   0   0       1        0       0        0
#7   Angola 1946    Tom             1               7   1   0       0        0       0        0
#8   Angola 1947     NA            NA               8   0   0       0        1       0        0
#9   Angola 1948  Chris             0               9   0   0       0        1       1        0
#10  Angola 1949     NA            NA              10   0   0       0        1       1        0
#11  Angola 1950     NA            NA              11   0   0       0        1       1        0
#12  Angola 1951     NA            NA              12   0   0       0        1       1        0
#13  Angola 1952     NA            NA              13   0   0       0        0       1        0
#14  Angola 1953   Alia             1              14   0   1       0        0       0        0
#15  Angola 1954     NA            NA              15   0   0       0        0       0        1
#16  Angola 1955     NA            NA              16   0   0       0        0       0        1
#17  Angola 1956     NA            NA              17   0   0       0        0       0        1
#18  Angola 1957     NA            NA              18   0   0       0        0       0        1
#19  Angola 1958     NA            NA              19   0   0       0        0       0        1
#20  Angola 1959     NA            NA              20   0   0       0        0       0        0

数据

df <- data.frame(country = rep("Angola",length(20)), year=c(1940:1959), 
       leader = c("David", "NA", "NA", "NA","Henry","NA","Tom","NA","Chris","NA",
       "NA","NA","NA","Alia","NA","NA","NA","NA","NA","NA"), 
      natural.death = c(0,NA,NA,NA,0,NA,1,NA,0,NA,NA,NA,NA,1,NA,NA,NA,NA,NA,NA),
      gdp.growth.rate=c(1:20),
      id1=c(0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
      id2=c(0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0))