为 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))
这是一个示例数据框,其中 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))