所以我的情况如下:我有一个大数据框,其中包含我应该在匹配分析中使用的数据。但是,我应该匹配由某些区域定义的子组内部。因为我不想为每个子组(太多)“手动”执行此操作,所以我想出了一种方法,将初始数据帧划分为包含每个独特处理区域和控制区域信息的子数据帧,并且将这些数据帧保存到列表中。在此之后,我使用 R 的 MatchIt 包中的 matchit 函数对列表中的数据帧进行了匹配。这是数据框列表外观的高度简化示例:
> list_df
$A
name treatment cov1 cov2 cov3 var
1 A 1 13.65933 200.5809 13 1000.1185
2 A 1 15.80334 233.8301 13 1010.1038
3 A 1 15.16098 215.1046 13 999.8548
4 A 1 16.45487 185.4957 13 997.5585
5 A 1 15.55230 193.5955 13 1001.2822
9 U 0 16.33895 175.6502 13 999.0682
10 U 0 18.05787 197.6041 13 1003.2781
11 U 0 14.29088 229.5446 13 1002.9567
12 U 0 16.32195 238.9975 13 998.9453
13 U 0 15.25240 217.5467 13 1004.0581
14 U 0 14.69154 219.9963 13 999.3270
15 U 0 14.88606 153.6038 15 989.6423
16 U 0 14.34472 212.5205 15 994.6094
17 U 0 14.66233 231.1179 15 999.7775
18 U 0 14.69155 240.4084 15 994.9280
19 U 0 15.63663 198.3323 10 1007.4225
20 U 0 15.19980 183.5846 10 997.6229
$B
name treatment cov1 cov2 cov3 var
6 B 1 15.66004 187.1542 15 1004.2311
7 B 1 13.89696 197.5548 15 995.6478
8 B 1 16.17403 204.9423 15 1001.5157
9 U 0 16.33895 175.6502 13 999.0682
10 U 0 18.05787 197.6041 13 1003.2781
11 U 0 14.29088 229.5446 13 1002.9567
12 U 0 16.32195 238.9975 13 998.9453
13 U 0 15.25240 217.5467 13 1004.0581
14 U 0 14.69154 219.9963 13 999.3270
15 U 0 14.88606 153.6038 15 989.6423
16 U 0 14.34472 212.5205 15 994.6094
17 U 0 14.66233 231.1179 15 999.7775
18 U 0 14.69155 240.4084 15 994.9280
19 U 0 15.63663 198.3323 10 1007.4225
20 U 0 15.19980 183.5846 10 997.6229
在真实数据中,我有七个协变量,其中两个使用精确方法匹配。
这里用于匹配结合 matchit(马氏距离)和 lapply 的代码:
library(MatchIt)
m_obj_Mah <- lapply(area_list,
function(x){
matchit(Treatment ~ Cov1 + Cov2 + Cov3 + Cov4 + Cov5,
data=x, method="nearest", exact = ~ Cov6 + Cov7, distance="mahalanobis")
}
)
在上面的代码中,一切正常。但是,当我尝试提取匹配的数据集时,出现错误:
m_data_Mah <- lapply(m_obj_Mah,
function(x) {match.data(x)})
eval 中的错误(object$call$data,envir = env):找不到对象“x”
这里最奇怪的是,我使用相同的方法对同一数据集中的卡尺进行最近邻倾向得分匹配,并且没有出现错误。该错误显然与使用 x 作为 lapply 中每个 df 的名称来定义函数有关,但我无法提出解决方案(以另一种方式循环遍历这些区域或以不同方式定义 lapply 中的 x) . 有什么建议么?
很抱歉我没有提供任何数据。生成一个真实的数据集会很复杂,我不能分享原始数据。如果绝对有必要,我可以尝试提出某种虚拟数据集。