R:组合来自 MatchIt 包的 "nearest neighborhood" 和 "exact" 匹配时出错
R: Error when combining "nearest neighborhood" and "exact" matching from MatchIt Package
我正在尝试 运行 倾向得分与最近邻方法匹配,而我需要一个变量的精确匹配,称为 "type"。我的数据如下所示:
> df
# A tibble: 20 × 6
symbol treat type market.cap market.to.book leverage
<fctr> <lgl> <dbl> <dbl> <dbl> <dbl>
1 AT_ABCB TRUE 1 228152.66 1.1929613 9.394726
2 AT_ACFC TRUE 1 162562.19 1.8101484 6.174758
3 AT_ACGL TRUE 4 4735844.75 1.1734933 3.434948
4 AT_ACNB FALSE 1 91063.20 1.0696958 10.241219
5 AT_AFSI FALSE 4 825553.85 1.9527673 3.257310
6 AT_AGII TRUE 4 1291845.73 0.9330774 3.870854
7 AT_AINV TRUE 2 1764811.40 0.9540821 1.948243
8 AT_AMNB TRUE 1 122196.43 1.2037753 6.489334
9 AT_AMPLQ FALSE 2 426403.00 1.8064556 2.081252
10 AT_AMRB TRUE 1 95820.71 1.5977307 6.329130
11 AT_AMSF TRUE 3 291789.63 1.4095641 3.839128
12 AT_AMTD TRUE 2 11929441.28 5.5359066 2.335973
13 AT_ANAT TRUE 4 3210435.20 0.8591439 5.587567
14 AT_ANCX FALSE 1 65479.64 1.1297189 9.575704
15 AT_AOREF FALSE 4 133379.89 0.5524693 5.639680
16 AT_ARCC FALSE 2 1063369.56 0.9455956 1.662850
17 AT_AROW TRUE 1 230742.30 1.8873699 7.329797
18 AT_ASFI TRUE 2 367991.92 1.5492114 1.897770
19 AT_ASRV TRUE 1 61463.53 0.6807045 14.029418
20 AT_ATAX FALSE 2 87023.72 1.3613197 2.160063
执行这段代码:
library(MatchIt)
match1 <- matchit(treat ~ market.cap + market.to.book + leverage + type,
method = "nearest", replace = TRUE, exact ="type",
data = df)
导致以下错误:
Error in Ops.data.frame(exact[itert, k], exact[clabels, k]) :
‘!=’ only defined for equally-sized data frames
当我删除 exact
参数时,代码工作正常。类似的代码也适用于 MatchIt
包提供的 lalonde
中的示例数据:
library(MatchIt)
match1 <- matchit(treat ~ age + educ + married, method = "nearest",
exact = "married", replace = TRUE, data = lalonde)
所以我猜测是数据本身导致了问题。这是重现我的原始数据的前 20 行的代码。 运行 上述与此示例数据匹配的代码会导致与原始数据相同的错误。
symbol <- c("AT_ABCB", "AT_ACFC", "AT_ACGL", "AT_ACNB", "AT_AFSI", "AT_AGII",
"AT_AINV", "AT_AMNB", "AT_AMPLQ", "AT_AMRB", "AT_AMSF", "AT_AMTD",
"AT_ANAT", "AT_ANCX", "AT_AOREF", "AT_ARCC", "AT_AROW", "AT_ASFI",
"AT_ASRV", "AT_ATAX")
type <- c(1, 1, 4, 1, 4, 4, 2, 1, 2, 1, 3, 2, 4, 1, 4, 2, 1, 2, 1, 2)
treat <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE,
TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE)
market.cap <- c(228152.66, 162562.19, 4735844.75, 91063.20, 825553.85, 1291845.73,
1764811.40, 122196.43, 426403.00, 95820.71, 291789.63, 11929441.28,
3210435.20, 65479.64, 133379.89, 1063369.56, 230742.30, 367991.92,
61463.53, 87023.72)
market.to.book <- c(1.1929613, 1.8101484, 1.1734933, 1.0696958, 1.9527673,
0.9330774, 0.9540821, 1.2037753, 1.8064556, 1.5977307,
1.4095641, 5.5359066, 0.8591439, 1.1297189, 0.5524693,
0.9455956, 1.8873699, 1.5492114, 0.6807045, 1.3613197)
leverage <- c(9.394726, 6.174758, 3.434948, 10.241219, 3.257310, 3.870854,
1.948243, 6.489334, 2.081252, 6.329130, 3.839128, 2.335973,
5.587567, 9.575704, 5.639680, 1.662850, 7.329797, 1.897770,
14.029418, 2.160063)
library(dplyr)
df <- tbl_df(data.frame(symbol, treat, type, market.cap,
market.to.book, leverage))
就这样:
df <- data.frame(symbol, treat, type, market.cap, market.to.book, leverage)
我正在尝试 运行 倾向得分与最近邻方法匹配,而我需要一个变量的精确匹配,称为 "type"。我的数据如下所示:
> df
# A tibble: 20 × 6
symbol treat type market.cap market.to.book leverage
<fctr> <lgl> <dbl> <dbl> <dbl> <dbl>
1 AT_ABCB TRUE 1 228152.66 1.1929613 9.394726
2 AT_ACFC TRUE 1 162562.19 1.8101484 6.174758
3 AT_ACGL TRUE 4 4735844.75 1.1734933 3.434948
4 AT_ACNB FALSE 1 91063.20 1.0696958 10.241219
5 AT_AFSI FALSE 4 825553.85 1.9527673 3.257310
6 AT_AGII TRUE 4 1291845.73 0.9330774 3.870854
7 AT_AINV TRUE 2 1764811.40 0.9540821 1.948243
8 AT_AMNB TRUE 1 122196.43 1.2037753 6.489334
9 AT_AMPLQ FALSE 2 426403.00 1.8064556 2.081252
10 AT_AMRB TRUE 1 95820.71 1.5977307 6.329130
11 AT_AMSF TRUE 3 291789.63 1.4095641 3.839128
12 AT_AMTD TRUE 2 11929441.28 5.5359066 2.335973
13 AT_ANAT TRUE 4 3210435.20 0.8591439 5.587567
14 AT_ANCX FALSE 1 65479.64 1.1297189 9.575704
15 AT_AOREF FALSE 4 133379.89 0.5524693 5.639680
16 AT_ARCC FALSE 2 1063369.56 0.9455956 1.662850
17 AT_AROW TRUE 1 230742.30 1.8873699 7.329797
18 AT_ASFI TRUE 2 367991.92 1.5492114 1.897770
19 AT_ASRV TRUE 1 61463.53 0.6807045 14.029418
20 AT_ATAX FALSE 2 87023.72 1.3613197 2.160063
执行这段代码:
library(MatchIt)
match1 <- matchit(treat ~ market.cap + market.to.book + leverage + type,
method = "nearest", replace = TRUE, exact ="type",
data = df)
导致以下错误:
Error in Ops.data.frame(exact[itert, k], exact[clabels, k]) :
‘!=’ only defined for equally-sized data frames
当我删除 exact
参数时,代码工作正常。类似的代码也适用于 MatchIt
包提供的 lalonde
中的示例数据:
library(MatchIt)
match1 <- matchit(treat ~ age + educ + married, method = "nearest",
exact = "married", replace = TRUE, data = lalonde)
所以我猜测是数据本身导致了问题。这是重现我的原始数据的前 20 行的代码。 运行 上述与此示例数据匹配的代码会导致与原始数据相同的错误。
symbol <- c("AT_ABCB", "AT_ACFC", "AT_ACGL", "AT_ACNB", "AT_AFSI", "AT_AGII",
"AT_AINV", "AT_AMNB", "AT_AMPLQ", "AT_AMRB", "AT_AMSF", "AT_AMTD",
"AT_ANAT", "AT_ANCX", "AT_AOREF", "AT_ARCC", "AT_AROW", "AT_ASFI",
"AT_ASRV", "AT_ATAX")
type <- c(1, 1, 4, 1, 4, 4, 2, 1, 2, 1, 3, 2, 4, 1, 4, 2, 1, 2, 1, 2)
treat <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE,
TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE)
market.cap <- c(228152.66, 162562.19, 4735844.75, 91063.20, 825553.85, 1291845.73,
1764811.40, 122196.43, 426403.00, 95820.71, 291789.63, 11929441.28,
3210435.20, 65479.64, 133379.89, 1063369.56, 230742.30, 367991.92,
61463.53, 87023.72)
market.to.book <- c(1.1929613, 1.8101484, 1.1734933, 1.0696958, 1.9527673,
0.9330774, 0.9540821, 1.2037753, 1.8064556, 1.5977307,
1.4095641, 5.5359066, 0.8591439, 1.1297189, 0.5524693,
0.9455956, 1.8873699, 1.5492114, 0.6807045, 1.3613197)
leverage <- c(9.394726, 6.174758, 3.434948, 10.241219, 3.257310, 3.870854,
1.948243, 6.489334, 2.081252, 6.329130, 3.839128, 2.335973,
5.587567, 9.575704, 5.639680, 1.662850, 7.329797, 1.897770,
14.029418, 2.160063)
library(dplyr)
df <- tbl_df(data.frame(symbol, treat, type, market.cap,
market.to.book, leverage))
就这样:
df <- data.frame(symbol, treat, type, market.cap, market.to.book, leverage)